{"title":"Multitenancy & isolation","slug":"multi-tenancy","category":"concepts","summary":"Hur Synapse isolerar data mellan användare och minds — säkerhetsgränser förklarade.","audience":["human","llm"],"tags":["concept","multi-tenancy","security","isolation"],"difficulty":"intermediate","updated":"2026-06-27","word_count":505,"read_minutes":3,"lang":"sv","translated":true,"requested_lang":"sv","content_markdown":"\n# Multitenancy & isolation\n\nSynapse är multitenant: flera användare, var och en med flera minds, fullständigt\nisolerade från varandra. Den här sidan förklarar isolationsmodellen.\n\n## Klienthierarki\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## Isolationsnivåer\n\n### Nivå 1: Användarisolation\n\nVarje användarkonto är isolerat. Alice kan inte:\n\n- Se Bobs minds\n- Komma åt Bobs minnen (även med sin JWT)\n- Lista Bobs kontoinformation\n\nUpprätthålls av: `user_id`-kolumn på alla tabeller, JWT innehåller `user_id`,\nalla frågor filtrerar efter `user_id`.\n\n### Nivå 2: Mind-isolation\n\nInom en användare är varje mind isolerad. Mind A kan inte:\n\n- Se Mind B:s minnen\n- Komma åt Mind B:s uppgifter, chatt, skript\n\nUpprätthålls av: `mind_id`-kolumn på alla datatabeller, Mind Key innehåller\n`mind_id`, alla frågor filtrerar efter `mind_id`.\n\n> [!CRITICAL]\n> Mind Key-isolation är den primära säkerhetsgränsen. En läckt Mind Key ger\n> full åtkomst till den mindens data — men ENDAST den minden.\n\n## Autentiseringstoken\n\n| Token | Omfattning | Vad den kan komma åt |\n|-------|-------|-------------------|\n| Mind Key | Enskild mind | Endast den mindens data |\n| JWT | Användarkonto | Kontohantering (skapa/lista/ta bort minds) |\n| Computer Token | Enskild dator | Den datorns kommandon |\n\n## Åtkomst över mind-gränser\n\n### Inom samma användare\n\nAnvändaren kan komma åt alla sina minds via JWT (t.ex. `GET /minds` listar\nalla). Men för att läsa/skriva minnesdata behöver de specifik Mind Key.\n\n### Mellan användare\n\nAnvändare kan inte komma åt varandras data — OM INTE de uttryckligen delar en\nmind via 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\nEfter delning kan Bob komma åt Mind A via sin JWT (skrivskyddad om `role=read`).\n\n## Säkerhetsgränser\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## Vanliga multitenancy-mönster\n\n### Mönster 1: Enskild användare, enskild mind\n\nVanligast för enskilda LLM-agentanvändare.\n\n- 1 användarkonto\n- 1 mind\n- 1 Mind Key\n- Alla minnen i en omfattning\n\n### Mönster 2: Enskild användare, flera minds\n\nFör användare med flera kontexter (arbete, personligt, projekt).\n\n- 1 användarkonto\n- N minds (t.ex. \"work\", \"personal\", \"project-x\")\n- N Mind Keys\n- Varje LLM-session använder en Mind Key\n\n### Mönster 3: Team-delad mind\n\nFör team som samarbetar kring ett projekt.\n\n- 1 användare skapar minden (får Mind Key)\n- Skaparen delar med teammedlemmar via JWT\n- Alla teammedlemmar kommer åt via JWT (eller delad Mind Key)\n\n> [!WARNING]\n> Att dela en Mind Key ger full läs/skriv-åtkomst. För teamsamarbete,\n> föredra Sharing API (JWT-baserad) framom att dela Mind Keys direkt.\n\n### Mönster 4: SaaS-leverantör\n\nFör appar som bäddar in Synapse som sitt minneslager.\n\n- Varje kund = 1 användarkonto\n- Varje kundprojekt = 1 mind\n- Appen lagrar Mind Keys per kund/projekt\n- Full isolation mellan kunder\n\n## Verifiering av isolation\n\n### Test: Mind Key kan inte komma åt andra minds\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 inte läsa minnesdata direkt\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## Bästa praxis\n\n> [!TIP]\n> - **Använd en mind per projekt/kontext** — isolation är er vän\n> - **Dela aldrig Mind Keys** — använd Sharing API istället\n> - **Rotera Mind Keys** om komprometterade (ta bort mind, skapa ny)\n> - **Granska delade minds** — se över `GET /sharing` regelbundet\n> - **Använd JWT för mänskligt gränssnitt** — exponera aldrig Mind Keys för slutanvändare\n\n## Nästa steg\n\n- [Autentisering](/docs/getting-started/authentication)\n- [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt)\n- [Arkitektur](/docs/concepts/architecture)\n","content_html":"<h1>Multitenancy &amp; isolation</h1>\n<p>Synapse är multitenant: flera användare, var och en med flera minds, fullständigt\nisolerade från varandra. Den här sidan förklarar isolationsmodellen.</p>\n<h2>Klienthierarki</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>Isolationsnivåer</h2>\n<h3>Nivå 1: Användarisolation</h3>\n<p>Varje användarkonto är isolerat. Alice kan inte:</p>\n<ul>\n<li>Se Bobs minds</li>\n<li>Komma åt Bobs minnen (även med sin JWT)</li>\n<li>Lista Bobs kontoinformation</li>\n</ul>\n<p>Upprätthålls av: <code>user_id</code>-kolumn på alla tabeller, JWT innehåller <code>user_id</code>,\nalla frågor filtrerar efter <code>user_id</code>.</p>\n<h3>Nivå 2: Mind-isolation</h3>\n<p>Inom en användare är varje mind isolerad. Mind A kan inte:</p>\n<ul>\n<li>Se Mind B:s minnen</li>\n<li>Komma åt Mind B:s uppgifter, chatt, skript</li>\n</ul>\n<p>Upprätthålls av: <code>mind_id</code>-kolumn på alla datatabeller, Mind Key innehåller\n<code>mind_id</code>, alla frågor filtrerar efter <code>mind_id</code>.</p>\n<div class=\"callout callout-critical\">Mind Key-isolation är den primära säkerhetsgränsen. En läckt Mind Key ger\nfull åtkomst till den mindens data — men ENDAST den minden.</div><h2>Autentiseringstoken</h2>\n<table>\n<thead>\n<tr>\n<th>Token</th>\n<th>Omfattning</th>\n<th>Vad den kan komma åt</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key</td>\n<td>Enskild mind</td>\n<td>Endast den mindens data</td>\n</tr>\n<tr>\n<td>JWT</td>\n<td>Användarkonto</td>\n<td>Kontohantering (skapa/lista/ta bort minds)</td>\n</tr>\n<tr>\n<td>Computer Token</td>\n<td>Enskild dator</td>\n<td>Den datorns kommandon</td>\n</tr>\n</tbody></table>\n<h2>Åtkomst över mind-gränser</h2>\n<h3>Inom samma användare</h3>\n<p>Användaren kan komma åt alla sina minds via JWT (t.ex. <code>GET /minds</code> listar\nalla). Men för att läsa/skriva minnesdata behöver de specifik Mind Key.</p>\n<h3>Mellan användare</h3>\n<p>Användare kan inte komma åt varandras data — OM INTE de uttryckligen delar en\nmind via 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>Efter delning kan Bob komma åt Mind A via sin JWT (skrivskyddad om <code>role=read</code>).</p>\n<h2>Säkerhetsgränser</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>Vanliga multitenancy-mönster</h2>\n<h3>Mönster 1: Enskild användare, enskild mind</h3>\n<p>Vanligast för enskilda LLM-agentanvändare.</p>\n<ul>\n<li>1 användarkonto</li>\n<li>1 mind</li>\n<li>1 Mind Key</li>\n<li>Alla minnen i en omfattning</li>\n</ul>\n<h3>Mönster 2: Enskild användare, flera minds</h3>\n<p>För användare med flera kontexter (arbete, personligt, projekt).</p>\n<ul>\n<li>1 användarkonto</li>\n<li>N minds (t.ex. &quot;work&quot;, &quot;personal&quot;, &quot;project-x&quot;)</li>\n<li>N Mind Keys</li>\n<li>Varje LLM-session använder en Mind Key</li>\n</ul>\n<h3>Mönster 3: Team-delad mind</h3>\n<p>För team som samarbetar kring ett projekt.</p>\n<ul>\n<li>1 användare skapar minden (får Mind Key)</li>\n<li>Skaparen delar med teammedlemmar via JWT</li>\n<li>Alla teammedlemmar kommer åt via JWT (eller delad Mind Key)</li>\n</ul>\n<div class=\"callout callout-warn\">Att dela en Mind Key ger full läs/skriv-åtkomst. För teamsamarbete,\nföredra Sharing API (JWT-baserad) framom att dela Mind Keys direkt.</div><h3>Mönster 4: SaaS-leverantör</h3>\n<p>För appar som bäddar in Synapse som sitt minneslager.</p>\n<ul>\n<li>Varje kund = 1 användarkonto</li>\n<li>Varje kundprojekt = 1 mind</li>\n<li>Appen lagrar Mind Keys per kund/projekt</li>\n<li>Full isolation mellan kunder</li>\n</ul>\n<h2>Verifiering av isolation</h2>\n<h3>Test: Mind Key kan inte komma åt andra minds</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 inte läsa minnesdata direkt</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>Bästa praxis</h2>\n<div class=\"callout callout-ok\"></div><h2>Nästa steg</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Autentisering</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\">Arkitektur</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"]}