SSD Nodes Learn 🎉 VPS vanaf $5.50/mnd
Gidsen Matt ConnorDoor Matt Connor · Bijgewerkt 2026-08-13

Hoe werkt offline agentgeheugen met Compartment?

Ontdek hoe Compartment agentgeheugen lokaal versleutelt zonder netwerkverbinding. Wij analyseren het dreigingsmodel, de risico's bij sleutelverlies en de werking van versie 4.6.0.

Wat Compartment anders doet

Compartment is een geheugenopslag voor agents die elk record versleuteld bewaart op de machine waar het is aangemaakt en nooit communiceert met een netwerkservice. Twee keuzes onderscheiden het van de rest van het veld voor agentgeheugen. De kluis is één verzegeld bestand dat alleen door uw wachtwoordzin wordt geopend, en de embedding-stap wordt lokaal uitgevoerd, waardoor de tekst van een geheugen nooit ergens naartoe wordt gestuurd om te worden omgezet in een vector. Versie 4.6.0 werd gepubliceerd op 10 augustus 2026, de licentie is Apache-2.0 en het wordt geïnstalleerd via PyPI.

Dat is een bewering over het dreigingsmodel, dus deze handleiding behandelt het als zodanig. Versleuteling in rust (encryption at rest) plus een offline ontwerp beschermen een specifieke lijst met zaken. Ze laten andere zaken open, en dat gat is waar de problemen van dag twee zich bevinden.

Deze handleiding volgt de eigen documentatie en release notes van het project, gelezen op 11 augustus 2026. Compartment levert een desktopapplicatie, een menubalkitem op macOS en een pictogram in het systeemvak op Windows, naast de command line tool, en een prompt voor een wachtwoordzin kan niet worden aangestuurd vanuit een geautomatiseerde container. Beschouw wat volgt als gedocumenteerd gedrag, niet als gedrag dat hier is gemeten. Voer het uit op een reservemachine voordat u het toevertrouwt met echte gegevens.

Wat encryptie in rust daadwerkelijk beschermt

De kluis is verzegeld met XChaCha20-Poly1305, een AEAD-cijfer (authenticated encryption with associated data), en de keyslots die de hoofdsleutel bevatten zijn ingepakt met Argon2id, een wachtwoord-hashingfunctie die is ontworpen om traag te zijn en veel geheugen te vereisen. Hieruit volgen twee zaken. Een kopie van het bestand op een gestolen schijf, in een oude back-up of bijgevoegd bij een supportticket, is niets meer dan een reeks bytes. Bovendien zorgt een enkele omgeklapte bit ervoor dat de authenticatie faalt bij het openen van het bestand, waardoor corruptie resulteert in een duidelijke foutmelding in plaats van een onjuist antwoord.

De embedding-vectoren zijn eveneens versleuteld, wat belangrijker is dan het lijkt. Een embedding is geen hash. Onderzoek naar embedding-inversie heeft aangetoond dat leesbare fragmenten van de oorspronkelijke tekst kunnen worden hersteld uit enkel de vector. Een vectorindex in platte tekst naast een versleutelde database laten staan, komt daarom bijna overeen met de database open laten staan. Compartment schrijft geen index in platte tekst naar de schijf.

Verwijderen is daadwerkelijk verwijderen. Elk record heeft zijn eigen sleutel en compartment forget --shred vernietigt die sleutel, waardoor de achtergebleven ciphertext door niemand kan worden ontsleuteld, ook niet door uzelf. Vergelijk dit met een rij die uit een databasebestand wordt verwijderd; deze blijft meestal leesbaar in vrije pagina's totdat deze door iets anders wordt overschreven.

Offline werken is de andere helft. Er wordt niets geüpload, dus er is geen leveranciersaccount dat uw herinneringen beheert en geen API-sleutel die deze kan laten uitlekken.

Wat Compartment niet beschermt

De claim stopt bij de grens van de kluis, en die grens ligt dichterbij dan men denkt.

De agent leest platte tekst. Recall ontsleutelt een geheugen en overhandigt de tekst aan de agent. Als die agent een gehost model is, reist het geheugen mee naar de modelprovider in de volgende prompt, precies zoals al het andere in het contextvenster. Versleuteling in rust beschermt het bestand. Het beschermt niet de opvraging. De regels in geheimen buiten AI-agents houden versoepelen dus niet omdat de opslag versleuteld is: een wachtwoord dat is opgeslagen als geheugen, is een wachtwoord dat u automatisch in een prompt laat plakken.

Een ontgrendelde kluis op een draaiende machine staat open. De beveiligingsnotities van het project vermelden dit expliciet. Terwijl de kluis ontgrendeld is, bevinden de hoofdsleutel en de werkset zich in het RAM-geheugen. Python kan niet garanderen dat een buffer wordt gewist, en swap of een slaapstandbestand kan dat geheugen naar de schijf schrijven. Malware die onder uw gebruiker draait, hoeft de cijfercode nooit te kraken, omdat deze de reeds ontgrendelde kluis kan bevragen.

De identiteit van de aanroeper is declaratief. Naamruimten kunnen per aanroeper worden beperkt, maar de naam van de aanroeper is afkomstig van het hostproces. Een host die liegt over zijn naam, ontvangt dus de rechten die hij claimt. Naamruimtemachtigingen zijn een organisatorische maatregel, geen beveiligingsgrens tegen een kwaadwillend lokaal programma.

Versnippering bereikt geen kopieën. forget --shred vernietigt de sleutel in het huidige bestand. Een back-up die vóór de versnippering is gemaakt, bevat dat record nog steeds en opent nog steeds met de wachtwoordzin van die dag.

Een zwakke wachtwoordzin beëindigt de discussie. Argon2id maakt elke gok kostbaar. Het beschermt echter geen wachtwoordzin die in een woordenlijst voorkomt.

Compartment installeren vanaf een vastgezette release

Compartment vereist Python 3.11 of nieuwer. Het project ontwikkelt zich snel, met dertig versies op PyPI op 10 augustus 2026. Zet daarom de versie vast in plaats van de versie te gebruiken die op de dag van installatie actueel is.

python3 --version
pip install "compartment==4.6.0"
compartment --version
compartment init

compartment --version hoort de versie te tonen die u heeft vastgezet. Als de shell compartment: command not found antwoordt, staat de installatiemap niet in uw PATH. Op de meeste systemen is die map ~/.local/bin. pipx install compartment==4.6.0 en uv tool install compartment==4.6.0 voorkomen dit door hun eigen paden te beheren.

compartment init vraagt tweemaal om een wachtwoordzin en toont geen tekens tijdens het typen. Die wachtwoordzin is de enige sleutel. Het project genereert geen wachtwoord en geen herstelzin; dit is een bewuste keuze. Er zijn geen inloggegevens die de software beheert waar u zelf geen controle over heeft.

Controleer het resultaat voordat u er iets op aansluit.

compartment status

Een gezonde kluis meldt dat deze ontgrendeld is. Als de status vergrendeld is, voer dan compartment unlock uit en voer de wachtwoordzin in. Een herstart vergrendelt de kluis opnieuw, omdat de inloggegevens die de kluis openhouden afhankelijk zijn van een geheim dat per boot wordt gegenereerd. Op macOS zorgt compartment unlock --keychain ervoor dat de kluis een herstart overleeft door die inloggegevens op te slaan in de systeem-keychain.

Waar de data daadwerkelijk staat

De standaard vault is ~/.compartment/memory.vault. Wijs naar een andere locatie met --vault PATH bij elk commando, of met de omgevingsvariabele COMPARTMENT_VAULT.

Dat ene bestand is de volledige opslag. Het opent met een header die de formaatversie en de Argon2id-keyslots bevat, gevolgd door de versleutelde payload en daarna journal-items die worden toegevoegd naarmate er nieuwe herinneringen binnenkomen. Elk journal-item wordt omlijst door de lengte en een CRC (cyclic redundancy check) van die lengte, zodat een schrijfoperatie die door een crash wordt onderbroken, wordt herkend als een afgebroken item in plaats van als data wordt gelezen. Compaction serialiseert de vault, schrijft een tijdelijk bestand, voert een fsync uit en hernoemt het vervolgens naar de juiste locatie, wat betekent dat een lezer nooit een half geschreven vault ziet.

Het nuttige gevolg: een back-upscript kopieert exact één pad. Het onhandige gevolg: u kunt er niet in zoeken met grep en u kunt het niet repareren in een teksteditor. Als u herinneringen wilt die u kunt lezen met cat en kunt committen naar git, dan zijn Memmy's eenvoudige lokale geheugenbestanden de tegenovergestelde afweging. Beide zijn redelijk, afhankelijk van of u meer vreest voor een gestolen laptop of voor een tool die defect raakt.

compartment uninstall verwijdert de software en behoudt de vault. Gebruik --purge alleen als u dit echt bedoelt.

Integratie in een agent

Eén commando koppelt een ondersteunde client.

compartment integrate --list
compartment integrate claude

Voor Claude Code, dat een MCP-serverentry (model context protocol) en een PostToolUse-hook in ~/.claude/settings.json schrijft, eerst een back-up van het bestand maakt, een /compartmentalize-skill onder ~/.claude/skills/ installeert en een beheerd blok toevoegt aan ~/.claude/CLAUDE.md om de agent te instrueren dat Compartment het op bestanden gebaseerde geheugen vervangt, bevestigt u beide helften:

compartment hook status
compartment recent

Om de server handmatig te registreren:

claude mcp add --scope user compartment -- \
    compartment --vault ~/.compartment/memory.vault --caller claude-code serve

Elke andere MCP-compatibele host gebruikt dezelfde server met een eigen aanroepersnaam.

{ "mcpServers": { "compartment": {
    "command": "compartment",
    "args": ["--vault", "/path/to/memory.vault",
             "--caller", "your-agent-name", "serve"] } } }

Geef elke host een unieke --caller-waarde. Dit is het label dat in het auditlogboek wordt vastgelegd en de sleutel waaronder namespace-rechten worden verleend; een gedeelde naam maakt beide onbruikbaar.

Als Claude Code al feiten naar zijn eigen geheugenbestanden heeft geschreven, toont compartment import-claude --dry-run wat er verplaatst zou worden voordat er daadwerkelijk actie wordt ondernomen. Lees eerst wat Claude Code in zijn geheugenbestanden bewaart, omdat het importeren van een jaar aan notities in een nieuwe vault de manier is waarop een geheugenopslag volloopt met zaken die niemand wilde behouden.

Hoe snel is een lokale vault

Dit zijn de cijfers die het project publiceert voor een vault van persoonlijke omvang. Ze zijn afkomstig uit de documentatie van het project zelf, niet uit een test die hier is uitgevoerd.

ChartCompartment published local latency, milliseconds
The data behind this chart
[
  {
    "label": "Store one memory, end to end",
    "latency_ms": 40
  },
  {
    "label": "Embed one memory, bundled model",
    "latency_ms": 25
  },
  {
    "label": "Hybrid search, median",
    "latency_ms": 11.6
  },
  {
    "label": "Vector search at 20k records, p95",
    "latency_ms": 0.68
  }
]

Het opslaan van één geheugen wordt genoteerd op 40 ms, en een vectorzoekopdracht in twintigduizend records op 0.68 ms voor het 95e percentiel. Het argument van het project om geheugen lokaal te houden is rekenkundig: een enkele netwerk-round-trip naar een gehoste geheugen-API kost vaak meer dan de 11.6 ms mediaan van een volledige hybride zoekopdracht hier.

Twee ontwerpdetails verklaren de zoekcijfers. Onder de twintigduizend records vergelijkt Compartment de query met elke vector, waardoor de recall per definitie exact is in plaats van benaderend. Boven dat aantal schakelt het over naar HNSW (hierarchical navigable small world), een benaderende index die een kleine hoeveelheid recall inruilt voor snelheid. De vault registreert ook de SHA-256 hash van het embedding-model en weigert te openen onder een ander model, omdat vectoren van twee verschillende modellen vergeleken kunnen worden zonder dat er fouten optreden, terwijl de resulterende scores betekenisloos zijn.

Backups, en de kopie die u volgend jaar nog kunt openen

Een vergrendelde kluis is één draagbaar bestand; het verplaatsen ervan is dus een kwestie van kopiëren.

compartment lock
scp ~/.compartment/memory.vault other-machine:
compartment --vault memory.vault unlock

Vergrendel de kluis eerst. Kopiëren terwijl de agent schrijft, kan ertoe leiden dat een journaalitem halverwege wordt onderschept. Hoewel de CRC-framing een lezer in staat stelt dat laatste fragment over te slaan, is de informatie daarin verloren gegaan. compartment lock --sign verzegelt het bestand met een Ed25519-manifest, zodat de ontvangende machine kan verifiëren of de kopie intact is aangekomen zonder dat de wachtwoordzin nodig is.

Omdat het bestand al verzegeld is, is standaard cloudopslag een acceptabele locatie. Dit is het punt waarop encryptie-at-rest zich direct terugbetaalt: de back-upbestemming ziet nooit een geheugen.

Twee waarschuwingen. Shredding bereikt geen back-ups; een record dat u vandaag cryptografisch hebt vernietigd, blijft leesbaar in de kopie van vorige week voor iedereen die over de wachtwoordzin van vorige week beschikt. En compartment export --plaintext schrijft de volledige kluis ongecodeerd weg; dit is het juiste hulpmiddel voor migratie naar een ander systeem, maar het verkeerde bestand om achter te laten in ~/Downloads.

Houd weinig kopieën bij en voorzie ze van een datum. Een geheugenopslag wordt een risico zodra niemand deze opschoont; dit is het argument in waarom verouderde agentgeheugens ongemerkt het ophalen van gegevens vergiftigen.

Sleutelbeheer, rotatie en de tweede factor

compartment rekey
compartment 2fa enable
compartment 2fa status

rekey wijzigt de wachtwoordzin door de hoofdsleutel opnieuw te versleutelen in de keyslot van het huidige bestand. Oude kopieën behouden de oude wachtwoordzin, omdat die bytes werden verzegeld vóór de wijziging en er geen proces is dat deze achteraf aanpast. Roteer ook de kopieën, of accepteer dat een ingetrokken wachtwoordzin nog steeds toegang geeft tot bepaalde bestanden.

2fa enable voegt een sleutelbestand toe als tweede factor, gecombineerd met de wachtwoordzin tijdens de sleutelafleiding, waardoor beide nodig zijn om de kluis te openen. Dit verdubbelt ook het aantal zaken dat u kunt verliezen. Bewaar het sleutelbestand niet op de machine waar de kluis op staat.

Voor scripts en CI (continuous integration) kan de wachtwoordzin worden aangeleverd via de omgevingsvariabele COMPARTMENT_PASSPHRASE, en unlock --passphrase-stdin leest deze uit een pipe. Geef de voorkeur aan de pipe. Een omgevingsvariabele is leesbaar voor andere processen van dezelfde gebruiker en belandt vaak in job-logs.

De audit-geschiedenis is hash-geketend en compartment audit verify doorloopt deze en rapporteert de eerste verbroken schakel. Voer dit uit na elk herstel, omdat op dat moment een stilletjes afgekapt bestand aan het licht komt.

Wat gebeurt er als u de passphrase verliest

Er gebeurt niets, en dat is inherent aan het ontwerp. Er is geen reset, geen herstelzin en geen adres om naartoe te schrijven, omdat er buiten uw geheugen en uw optionele keyfile geen kopie van de sleutel bestaat. De vault blijft een bestand met willekeurig ogende bytes.

Het herstelplan is daarom geen plan voor de vault. Het is een plan voor de passphrase. Sla deze op in een wachtwoordmanager op de dag dat u compartment init uitvoert. Test het vervolgens: vergrendel de vault, ontgrendel deze met alleen de gegevens die u heeft opgeschreven, en laat pas daarna een agent de vault vullen zodra dat werkt.

Compartment of een memory server

Compartment is ontworpen voor gebruik op één machine. Delen betekent het kopiëren van het vergrendelde bestand, of het exporteren en importeren ervan. Er is geen ondersteuning voor gelijktijdige schrijfacties; als een laptop en een workstation naar hetzelfde bestand verwijzen, zullen ze elkaars wijzigingen overschrijven.

Wanneer meerdere machines tegelijkertijd toegang nodig hebben tot hetzelfde geheugen, is er sprake van een servervraagstuk. Een zelfgehoste Mem0 memory server op een VPS biedt hiervoor de oplossing: één endpoint, meerdere clients en geheugen dat blijft bestaan nadat de laptop is afgesloten. De kosten hiervan moeten helder worden benoemd. Die server draait een proces dat de opgeslagen gegevens kan lezen; uw dreigingsmodel omvat nu dus de VPS en iedereen die toegang heeft tot de API ervan.

Maak uw keuze op basis van het risico dat u daadwerkelijk wilt beperken. Als u bang bent voor een gestolen laptop of een leverancier die uw notities leest, is de versleutelde lokale vault de veiligere optie. Als het probleem is dat een agent alles vergeet zodra u van machine wisselt, dan is de server de juiste keuze.

FAQ

Wat beschermt de encryptie van Compartment precies?

Het beschermt het bestand. De vault is verzegeld met XChaCha20-Poly1305, de keyslots zijn ingepakt met Argon2id en de embedding-vectoren zijn eveneens versleuteld. Hierdoor bevat een gestolen schijf of een oude back-up enkel onleesbare bytes. Het beschermt geen ontgrendelde vault op een actieve machine, omdat de hoofdsleutel in het RAM-geheugen staat zolang de vault open is. Het reguleert bovendien niet wat een agent doet met een herinnering nadat deze als platte tekst is opgehaald.

Blijven mijn herinneringen privé voor mijn modelprovider als Compartment offline is?

Alleen totdat ze worden opgevraagd. Het opslaan en doorzoeken gebeurt zonder netwerkverbinding en het embedding-model draait lokaal, dus er verlaat niets de machine tijdens het schrijven. Bij het lezen ontvangt de agent platte tekst. Als die agent een gehost model is, komt de herinnering in de prompt terecht en wordt deze, net als de rest van het contextvenster, naar de provider verzonden. Sla nooit inloggegevens op als herinnering.

Wat gebeurt er als ik mijn Compartment-wachtwoordzin verlies?

De vault is onherstelbaar, en dat is met opzet. Compartment genereert geen seed of herstelzin en bewaart geen inloggegevens die u zelf niet heeft, dus er valt niets te resetten. Sla de wachtwoordzin op in een wachtwoordbeheerder, bewaar eventuele 2FA-sleutelbestanden op een andere machine dan de machine waarop de vault staat, en controleer of u een kopie kunt ontgrendelen voordat u belangrijke gegevens in de vault plaatst.

Kunnen twee machines één Compartment-vault delen?

Niet tegelijkertijd. Een vergrendelde vault is één enkel draagbaar bestand. De gedocumenteerde werkwijze is om de vault te vergrendelen, te kopiëren en vervolgens op de andere machine te ontgrendelen met --vault. Er is geen gelijktijdige toegang mogelijk; als twee machines naar hetzelfde bestand schrijven, gaan er herinneringen verloren. Gebruik een memory server als u die functionaliteit nodig heeft.

#agent-memory#compartment#encryption#offline#privacy