{"title":"Multi-tenancy & isolatie","slug":"multi-tenancy","category":"concepts","summary":"Hoe Synapse data isoleert tussen gebruikers en minds — uitleg van beveiligingsgrenzen.","audience":["human","llm"],"tags":["concept","multi-tenancy","security","isolation"],"difficulty":"intermediate","updated":"2026-06-27","word_count":504,"read_minutes":3,"lang":"nl","translated":true,"requested_lang":"nl","content_markdown":"\n# Multi-tenancy & isolatie\n\nSynapse is multi-tenant: meerdere gebruikers, elk met meerdere minds, volledig\ngeïsoleerd van elkaar. Deze pagina legt het isolatiemodel uit.\n\n## Tenant-hiërarchie\n\n```\nSynapse Instance\n  │\n  ├── User Account 1 (email: alice@example.com)\n  │   ├── Mind A (Mind Key mk_aaa...)\n  │   │   ├── Memories (only accessible via mk_aaa...)\n  │   │   ├── Tasks\n  │   │   └── Chat\n  │   └── Mind B (Mind Key mk_bbb...)\n  │       └── ... (isolated from Mind A)\n  │\n  ├── User Account 2 (email: bob@example.com)\n  │   └── Mind C (Mind Key mk_ccc...)\n  │       └── ... (isolated from Alice's minds)\n  │\n  └── ... (more users)\n```\n\n## Isolatieniveaus\n\n### Niveau 1: Gebruikersisolatie\n\nElk gebruikersaccount is geïsoleerd. Alice kan niet:\n\n- Bobs minds zien\n- Bobs herinneringen benaderen (zelfs met haar JWT)\n- Bobs accountinformatie tonen\n\nAfgedwongen door: `user_id`-kolom op alle tabellen, JWT bevat `user_id`, alle\nquery's filteren op `user_id`.\n\n### Niveau 2: Mind-isolatie\n\nBinnen een gebruiker is elke mind geïsoleerd. Mind A kan niet:\n\n- Mind B's herinneringen zien\n- Mind B's taken, chat of scripts benaderen\n\nAfgedwongen door: `mind_id`-kolom op alle datatabellen, Mind Key bevat `mind_id`,\nalle query's filteren op `mind_id`.\n\n> [!CRITICAL]\n> Mind Key-isolatie is de primaire beveiligingsgrens. Een gelekte Mind Key\n> verleent volledige toegang tot die mind's data — maar ALLÉÉN die mind.\n\n## Authenticatie-tokens\n\n| Token | Bereik | Wat het kan benaderen |\n|-------|--------|-----------------------|\n| Mind Key | Eén mind | Alleen die mind's data |\n| JWT | Gebruikersaccount | Accountbeheer (minds aanmaken/tonen/verwijderen) |\n| Computer Token | Eén computer | Die computer's commando's |\n\n## Cross-mind-toegang\n\n### Binnen dezelfde gebruiker\n\nGebruikers kunnen al hun minds benaderen via JWT (bijv. `GET /minds` toont allemaal).\nMaar om memory-data te lezen/schrijven, hebben ze de specifieke Mind Key nodig.\n\n### Tussen gebruikers\n\nGebruikers kunnen elkaars data niet benaderen — TENZIJ ze expliciet een mind delen\nvia de Sharing-API:\n\n```bash\n# Alice shares Mind A with Bob\ncurl -X POST https://synapse.schaefer.zone/sharing \\\n  -H \"Authorization: Bearer ALICE_JWT\" \\\n  -d '{\"mind_id\": \"m_aaa\", \"email\": \"bob@example.com\", \"role\": \"read\"}'\n```\n\nNa het delen kan Bob Mind A benaderen via zijn JWT (alleen-lezen als `role=read`).\n\n## Beveiligingsgrenzen\n\n```\n┌─────────────────────────────────────────────────┐\n│              Synapse Instance                    │\n│  ┌─────────────────────────────────────────┐    │\n│  │         User Account Boundary           │    │\n│  │  ┌──────────────┐  ┌──────────────┐    │    │\n│  │  │  Mind Bound. │  │  Mind Bound. │    │    │\n│  │  │  (Mind Key)  │  │  (Mind Key)  │    │    │\n│  │  │              │  │              │    │    │\n│  │  │  Memories    │  │  Memories    │    │    │\n│  │  │  Tasks       │  │  Tasks       │    │    │\n│  │  │  Chat        │  │  Chat        │    │    │\n│  │  │  Scripts     │  │  Scripts     │    │    │\n│  │  └──────────────┘  └──────────────┘    │    │\n│  └─────────────────────────────────────────┘    │\n└─────────────────────────────────────────────────┘\n```\n\n## Veelvoorkomende multi-tenant-patronen\n\n### Patroon 1: Eén gebruiker, één mind\n\nMeest voorkomend voor individuele LLM-agent-gebruikers.\n\n- 1 gebruikersaccount\n- 1 mind\n- 1 Mind Key\n- Alle herinneringen in één scope\n\n### Patroon 2: Eén gebruiker, meerdere minds\n\nVoor gebruikers met meerdere contexten (werk, persoonlijk, projecten).\n\n- 1 gebruikersaccount\n- N minds (bijv. \"work\", \"personal\", \"project-x\")\n- N Mind Keys\n- Elke LLM-sessie gebruikt één Mind Key\n\n### Patroon 3: Team-gedeelde mind\n\nVoor teams die samenwerken aan een project.\n\n- 1 gebruiker maakt de mind aan (krijgt Mind Key)\n- Maker deelt met teamleden via JWT\n- Alle teamleden benaderen via JWT (of gedeelde Mind Key)\n\n> [!WARNING]\n> Het delen van een Mind Key geeft volledige lees/schrijftoegang. Voor teamsamenwerking\n> geeft u de voorkeur aan de Sharing-API (JWT-gebaseerd) boven het direct delen van Mind Keys.\n\n### Patroon 4: SaaS-provider\n\nVoor apps die Synapse insluiten als hun memory-laag.\n\n- Elke klant = 1 gebruikersaccount\n- Elk klantenproject = 1 mind\n- App slaat Mind Keys op per klant/project\n- Volledige isolatie tussen klanten\n\n## Isolatieverificatie\n\n### Test: Mind Key kan andere minds niet benaderen\n\n```bash\n# Mind A's key cannot read Mind B's memories\ncurl -H \"Authorization: Bearer mk_aaa...\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=test\"\n# Returns only Mind A's memories\n\ncurl -H \"Authorization: Bearer mk_bbb...\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=test\"\n# Returns only Mind B's memories (different results)\n```\n\n### Test: JWT kan geen memory-data direct lezen\n\n```bash\n# JWT can list minds\ncurl -H \"Authorization: Bearer YOUR_JWT\" \\\n     https://synapse.schaefer.zone/minds\n# Returns: list of minds\n\n# JWT CANNOT read memories (need Mind Key)\ncurl -H \"Authorization: Bearer YOUR_JWT\" \\\n     https://synapse.schaefer.zone/memory/recall\n# Returns: 401 Unauthorized\n```\n\n## Best practices\n\n> [!TIP]\n> - **Gebruik één mind per project/context** — isolatie is uw vriend\n> - **Deel nooit Mind Keys** — gebruik de Sharing-API in plaats daarvan\n> - **Roteer Mind Keys** indien gecompromitteerd (verwijder mind, maak nieuwe aan)\n> - **Controleer gedeelde minds** — bekijk periodiek `GET /sharing`\n> - **Gebruik JWT voor human-UI** — stel Mind Keys nooit bloot aan eindgebruikers\n\n## Volgende stappen\n\n- [Authenticatie](/docs/getting-started/authentication)\n- [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt)\n- [Architectuur](/docs/concepts/architecture)\n","content_html":"<h1>Multi-tenancy &amp; isolatie</h1>\n<p>Synapse is multi-tenant: meerdere gebruikers, elk met meerdere minds, volledig\ngeïsoleerd van elkaar. Deze pagina legt het isolatiemodel uit.</p>\n<h2>Tenant-hiërarchie</h2>\n<pre><code class=\"hljs language-plaintext\">Synapse Instance\n  │\n  ├── User Account 1 (email: alice@example.com)\n  │   ├── Mind A (Mind Key mk_aaa...)\n  │   │   ├── Memories (only accessible via mk_aaa...)\n  │   │   ├── Tasks\n  │   │   └── Chat\n  │   └── Mind B (Mind Key mk_bbb...)\n  │       └── ... (isolated from Mind A)\n  │\n  ├── User Account 2 (email: bob@example.com)\n  │   └── Mind C (Mind Key mk_ccc...)\n  │       └── ... (isolated from Alice&#x27;s minds)\n  │\n  └── ... (more users)</code></pre><h2>Isolatieniveaus</h2>\n<h3>Niveau 1: Gebruikersisolatie</h3>\n<p>Elk gebruikersaccount is geïsoleerd. Alice kan niet:</p>\n<ul>\n<li>Bobs minds zien</li>\n<li>Bobs herinneringen benaderen (zelfs met haar JWT)</li>\n<li>Bobs accountinformatie tonen</li>\n</ul>\n<p>Afgedwongen door: <code>user_id</code>-kolom op alle tabellen, JWT bevat <code>user_id</code>, alle\nquery&#39;s filteren op <code>user_id</code>.</p>\n<h3>Niveau 2: Mind-isolatie</h3>\n<p>Binnen een gebruiker is elke mind geïsoleerd. Mind A kan niet:</p>\n<ul>\n<li>Mind B&#39;s herinneringen zien</li>\n<li>Mind B&#39;s taken, chat of scripts benaderen</li>\n</ul>\n<p>Afgedwongen door: <code>mind_id</code>-kolom op alle datatabellen, Mind Key bevat <code>mind_id</code>,\nalle query&#39;s filteren op <code>mind_id</code>.</p>\n<div class=\"callout callout-critical\">Mind Key-isolatie is de primaire beveiligingsgrens. Een gelekte Mind Key\nverleent volledige toegang tot die mind's data — maar ALLÉÉN die mind.</div><h2>Authenticatie-tokens</h2>\n<table>\n<thead>\n<tr>\n<th>Token</th>\n<th>Bereik</th>\n<th>Wat het kan benaderen</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key</td>\n<td>Eén mind</td>\n<td>Alleen die mind&#39;s data</td>\n</tr>\n<tr>\n<td>JWT</td>\n<td>Gebruikersaccount</td>\n<td>Accountbeheer (minds aanmaken/tonen/verwijderen)</td>\n</tr>\n<tr>\n<td>Computer Token</td>\n<td>Eén computer</td>\n<td>Die computer&#39;s commando&#39;s</td>\n</tr>\n</tbody></table>\n<h2>Cross-mind-toegang</h2>\n<h3>Binnen dezelfde gebruiker</h3>\n<p>Gebruikers kunnen al hun minds benaderen via JWT (bijv. <code>GET /minds</code> toont allemaal).\nMaar om memory-data te lezen/schrijven, hebben ze de specifieke Mind Key nodig.</p>\n<h3>Tussen gebruikers</h3>\n<p>Gebruikers kunnen elkaars data niet benaderen — TENZIJ ze expliciet een mind delen\nvia de Sharing-API:</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Alice shares Mind A with Bob</span>\ncurl -X POST https://synapse.schaefer.zone/sharing \\\n  -H <span class=\"hljs-string\">&quot;Authorization: Bearer ALICE_JWT&quot;</span> \\\n  -d <span class=\"hljs-string\">&#x27;{&quot;mind_id&quot;: &quot;m_aaa&quot;, &quot;email&quot;: &quot;bob@example.com&quot;, &quot;role&quot;: &quot;read&quot;}&#x27;</span></code></pre><p>Na het delen kan Bob Mind A benaderen via zijn JWT (alleen-lezen als <code>role=read</code>).</p>\n<h2>Beveiligingsgrenzen</h2>\n<pre><code class=\"hljs language-plaintext\">┌─────────────────────────────────────────────────┐\n│              Synapse Instance                    │\n│  ┌─────────────────────────────────────────┐    │\n│  │         User Account Boundary           │    │\n│  │  ┌──────────────┐  ┌──────────────┐    │    │\n│  │  │  Mind Bound. │  │  Mind Bound. │    │    │\n│  │  │  (Mind Key)  │  │  (Mind Key)  │    │    │\n│  │  │              │  │              │    │    │\n│  │  │  Memories    │  │  Memories    │    │    │\n│  │  │  Tasks       │  │  Tasks       │    │    │\n│  │  │  Chat        │  │  Chat        │    │    │\n│  │  │  Scripts     │  │  Scripts     │    │    │\n│  │  └──────────────┘  └──────────────┘    │    │\n│  └─────────────────────────────────────────┘    │\n└─────────────────────────────────────────────────┘</code></pre><h2>Veelvoorkomende multi-tenant-patronen</h2>\n<h3>Patroon 1: Eén gebruiker, één mind</h3>\n<p>Meest voorkomend voor individuele LLM-agent-gebruikers.</p>\n<ul>\n<li>1 gebruikersaccount</li>\n<li>1 mind</li>\n<li>1 Mind Key</li>\n<li>Alle herinneringen in één scope</li>\n</ul>\n<h3>Patroon 2: Eén gebruiker, meerdere minds</h3>\n<p>Voor gebruikers met meerdere contexten (werk, persoonlijk, projecten).</p>\n<ul>\n<li>1 gebruikersaccount</li>\n<li>N minds (bijv. &quot;work&quot;, &quot;personal&quot;, &quot;project-x&quot;)</li>\n<li>N Mind Keys</li>\n<li>Elke LLM-sessie gebruikt één Mind Key</li>\n</ul>\n<h3>Patroon 3: Team-gedeelde mind</h3>\n<p>Voor teams die samenwerken aan een project.</p>\n<ul>\n<li>1 gebruiker maakt de mind aan (krijgt Mind Key)</li>\n<li>Maker deelt met teamleden via JWT</li>\n<li>Alle teamleden benaderen via JWT (of gedeelde Mind Key)</li>\n</ul>\n<div class=\"callout callout-warn\">Het delen van een Mind Key geeft volledige lees/schrijftoegang. Voor teamsamenwerking\ngeeft u de voorkeur aan de Sharing-API (JWT-gebaseerd) boven het direct delen van Mind Keys.</div><h3>Patroon 4: SaaS-provider</h3>\n<p>Voor apps die Synapse insluiten als hun memory-laag.</p>\n<ul>\n<li>Elke klant = 1 gebruikersaccount</li>\n<li>Elk klantenproject = 1 mind</li>\n<li>App slaat Mind Keys op per klant/project</li>\n<li>Volledige isolatie tussen klanten</li>\n</ul>\n<h2>Isolatieverificatie</h2>\n<h3>Test: Mind Key kan andere minds niet benaderen</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Mind A&#x27;s key cannot read Mind B&#x27;s memories</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer mk_aaa...&quot;</span> \\\n     <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/search?q=test&quot;</span>\n<span class=\"hljs-comment\"># Returns only Mind A&#x27;s memories</span>\n\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer mk_bbb...&quot;</span> \\\n     <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/search?q=test&quot;</span>\n<span class=\"hljs-comment\"># Returns only Mind B&#x27;s memories (different results)</span></code></pre><h3>Test: JWT kan geen memory-data direct lezen</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># JWT can list minds</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_JWT&quot;</span> \\\n     https://synapse.schaefer.zone/minds\n<span class=\"hljs-comment\"># Returns: list of minds</span>\n\n<span class=\"hljs-comment\"># JWT CANNOT read memories (need Mind Key)</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_JWT&quot;</span> \\\n     https://synapse.schaefer.zone/memory/recall\n<span class=\"hljs-comment\"># Returns: 401 Unauthorized</span></code></pre><h2>Best practices</h2>\n<div class=\"callout callout-ok\"></div><h2>Volgende stappen</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Authenticatie</a></li>\n<li><a href=\"/docs/getting-started/mind-key-vs-jwt\">Mind Key vs JWT</a></li>\n<li><a href=\"/docs/concepts/architecture\">Architectuur</a></li>\n</ul>\n","urls":{"html":"/docs/concepts/multi-tenancy","text":"/docs/concepts/multi-tenancy?format=text","json":"/docs/concepts/multi-tenancy?format=json","llm":"/docs/concepts/multi-tenancy?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}