Troubleshooting
A symptom-first guide. Each section walks from "what you're seeing" to the most likely cause and how to confirm it.
For per-error details, also see Error codes. For the full troubleshooting flow chart, the Quickstart and the Architecture overview are useful reference companions.
Install and startup
The container exits immediately after docker run
- Check the container logs first:
docker logs curiosity. - A missing or unwritable storage path is the most common cause. Confirm the directory you mounted exists on the host and is writable by the user the container runs as:
docker run --rm -v ~/curiosity/storage:/data alpine ls -la /data
- If the logs say "license required", set
MSK_LICENSE(orMSK_LICENSE_FILE). - If the logs say "port already in use", another process is bound to
8080. Map a different host port with-p 127.0.0.1:9000:8080. ===
The UI loads but I can't sign in as admin/admin
- You probably set
MSK_ADMIN_PASSWORDon first boot. The password is whatever value you provided in that variable. - If you don't remember it, you can reset it: stop the container, restart it with a new
MSK_ADMIN_PASSWORD, sign in, then rotate the password in the UI. The variable is read on every boot for the bootstrap account. - If SSO is configured and
adminis disabled, sign in via your IdP instead. ===
The UI is reachable on localhost but not from elsewhere on the network
- Local installations on this site bind the container port to
127.0.0.1intentionally. Remove the loopback prefix when you want network reachability — but only after completing the security baseline:
-p 0.0.0.0:8080:8080
- Or, better, put the workspace behind a reverse proxy that terminates TLS. ===
Restarting the container loses my data
- Your volume is not mounted, or
MSK_GRAPH_STORAGEpoints outside the mount. - Confirm the mount:
docker inspect curiosityand look atMounts. - Confirm the env var:
docker exec curiosity env | grep MSK_GRAPH_STORAGE. - If both look right, the workspace is writing to the persisted path;
docker volume lsand the host directory should both grow over time. ===
Ingestion and graph
The connector reports success but I see no data in the UI
- The connector probably didn't call
await graph.CommitPendingAsync()at the end. - The connector might have committed to a different workspace — verify the
baseUrlandapiTokenmatch the workspace you're inspecting. - Look at Settings → Tasks for an error on the most recent run. ===
I'm getting duplicate nodes
- Almost always a key problem. Confirm each node type has a stable
[Key]from the source and that you're not regenerating it (e.g., from a randomly ordered list). - Look at the Graph Model → keys section.
- Quick check in the Shell:
return Q().StartAt("Ticket").Where(n => n.GetString("Id") == "T-9182").Take(5).Emit("N");
Should return one node, not many.
Edges are missing between nodes I just ingested
- Both endpoint nodes must exist before you create the edge. If you call
graph.Link(a, b, ...)before eitheraorbis committed, the edge is queued against a placeholder. - Verify with
Q().StartAt("Ticket", "T-1").Out().Emit("N")and compare to what you expected. ===
schema_conflict on commit
- You changed a key field's type or removed it. The graph cannot rewrite identity in place. See Upgrades and migrations for the migration pattern. ===
Search and embeddings
Search returns nothing for terms that are clearly in the data
- The field is not indexed. Open Settings → Search → Indexes and confirm the field appears under the right node type.
- The field is indexed but the workspace hasn't reindexed since the field was added. Trigger Settings → Maintenance → Rebuild indexes.
- Permissions are filtering everything out. Sign in as
adminand re-run — if results appear, you have a ReBAC problem, not a search problem. See Access Control Model. ===
Vector search returns nothing
- The embedding provider isn't configured or is failing. Open Settings → AI Settings and check the provider status banner.
- The embeddings have not been generated yet for older content. Trigger Rebuild embeddings under Settings → Maintenance.
- The chunking is set too small or too large. See Vector Search. ===
Hybrid search underperforms pure text search
- The field weights and similarity cutoff need tuning. Walk the Ranking Tuning workflow with a golden query set.
- For short identifier searches (ticket IDs, SKUs), reduce the vector contribution or fall back to text-only. ===
Custom endpoints and AI tools
My endpoint won't save (compile error)
- The error is shown in the endpoint editor's status bar. Common offenders: missing
usingdirectives, typos in node/edge names, mismatched types inBody.FromJson<T>(). - The previous successful version of the endpoint stays live until the new one compiles, so user traffic isn't affected. ===
My endpoint returns 403 for some users
- The endpoint is running
CreateSearchAsync(admin context) instead ofCreateSearchAsUserAsync(..., CurrentUser, ...). Switch to the user-context variant. - The user really doesn't have access. Verify their team membership and the ACLs on the affected nodes. ===
The AI assistant doesn't call my tool
- Check the
[Tool("...")]description: it should clearly state when the LLM should pick this tool. Vague descriptions don't get selected. - The tool may be present but disabled for this chat. Look under the chat's tool list.
- If multiple tools cover the same intent, the LLM may be picking a different one. Make the descriptions more specific. ===
Authentication and SSO
SSO redirect loops or "invalid redirect URI"
- The redirect URI registered with your IdP must exactly match
{public-workspace-url}/api/{provider}sso/completed-login-attempt. Check for trailing slashes,httpvshttps, and theMSK_PUBLIC_ADDRESSsetting. - Verify with
curl -I https://workspace.example.com/api/microsoftsso/get-login-url— a working setup returns a 200 with a JSON body containing the IdP URL. ===
All my tokens stopped working after a restart
MSK_JWT_KEYwas missing or different, and the workspace generated a new key on startup. SetMSK_JWT_KEY(orMSK_JWT_KEY_FILE) explicitly so the key is stable across restarts. ===
Operations
Indexing is slow / the workspace appears unresponsive during large imports
- Move the index rebuild to off-hours and watch progress under Settings → Monitoring.
- Increase the container's CPU and memory limits. The graph engine is memory-resident; more RAM directly improves traversal latency. See Performance Tuning.
- Run incremental ingestion instead of full refreshes. See Ingestion Pipelines. ===
Disk usage is growing faster than expected
- The journal directory grows during bursts of writes and trims afterward. If it doesn't trim, increase your sample window before assuming a leak.
- Backups in
MSK_GRAPH_BACKUP_FOLDERrotate based on retention settings — confirm the retention policy isn't disabled. - Logs at
MSK_LOG_PATHwithMSK_LOG_LEVEL=Debugcan fill a disk quickly. Reset toInformationonce you've finished diagnosing. ===
Still stuck?
- Capture the
traceIdfrom the error response (or from the server logs) and include it in any support request. - For private support, open an issue at github.com/curiosity-ai/workspace.
- For community discussion, GitHub Discussions.