Getting started
Goal: a running deployment, one ingested document, and a first honest query — in one sitting.
Managed-cloud humans can run remember login --token-host <url> instead of
pasting a long-lived secret; self-host Compose still uses the local API URL
below.
Choose a path
| Path | When |
|---|---|
| Docker Compose (recommended first) | You want the full stack: Postgres, MinIO, API, workers |
| Python client wheel | You already have a remote deployment API URL |
| Library / server extras | You are embedding or operating the engine in process |
This page uses Compose. Full operator detail: Self-host deployment.
Prerequisites
- Docker Engine with Compose v2
- An OpenRouter API key (or equivalent model seats) for extraction and embeddings
- ~10 minutes for first boot + smoke ingest
1. Start the stack
git clone https://github.com/writeitai/remember-stack.git
cd remember-stack
cp .env.example .env
# Set OpenRouter (or configured provider) credentials in .env
docker compose up --build --detach --waitThe Compose file can also pull the public ghcr.io/writeitai/remember-stack:0.13.0 image. Use --build when you want to run local source; use --no-build --pull always when you want the released image.
Health:
curl --fail http://localhost:8000/healthz
curl --fail http://localhost:8000/operationsYou should see the four assured operations: resolve_entity,
testimony_context, fact_context, and answer_context.
2. Ingest a document
The fresh self-host profile ships a Markdown conversion route. Other MIME types need additional conversion routes registered on the deployment (the engine design supports them; the smoke profile does not auto-route PDF/audio/video).
printf '# Hello\n\nAlice is the CFO of Acme as of 2024.\n' > /tmp/remember-smoke.md
curl --fail \
-H 'content-type: application/octet-stream' \
--data-binary @/tmp/remember-smoke.md \
'http://localhost:8000/ingest?filename=remember-smoke.md&mime=text%2Fmarkdown'The response names deployment_id, doc_id, and version_id. Save the version id for readiness.
What just happened (short form):
- Bytes stored immutably (E0)
- Markdown + structure derived
- Chunks packed deterministically (E1)
- Claims extracted and grounded (E2)
- Entities resolved; facts adjudicated (E3)
- Search indexes updated (P1)
Detail: Ingestion.
3. Wait until the version is ready
Prefer the machine-verifiable readiness endpoint over shelling into Postgres:
# replace VERSION_ID with the ingest response version_id
curl --fail -X POST http://localhost:8000/readiness \
-H 'content-type: application/json' \
-d '{"version_ids":["VERSION_ID"],"require":{"pipeline":true,"p1":true,"live_graph":true,"p3":false}}'All four capability keys are mandatory. Ordinary recall requires the pipeline, P1, and live graph; require P3 only when the caller needs the published corpus filesystem.
Human fallback if you need stage detail:
docker compose exec postgres psql -U rememberstack -d rememberstack -c \
"SELECT stage, status FROM processing_state ORDER BY enqueued_at"4. Publish P3 (when you need the corpus filesystem)
The graph is already live in PostgreSQL. P3 remains a whole-corpus build:
docker compose --profile operations run --rm projections5. First retrieval — four assured ops
Argument names match the operation registry and API reference.
Resolve an entity
curl --fail -X POST http://localhost:8000/operations/resolve_entity \
-H 'content-type: application/json' \
-d '{"name":"Alice"}'Query-time resolve is exact-name (T0) in the current surface: ambiguity among exact aliases is returned as ranked candidates, never guessed away. Fuzzy/phonetic/embedding tiers run on the write-time resolution cascade, not this hot path.
Evidence context for a question
curl --fail -X POST http://localhost:8000/operations/testimony_context \
-H 'content-type: application/json' \
-d '{"query":"Who is the CFO of Acme?"}'Returns evidence grain (claims + chunks) — testimony, not the adjudicated verdict alone.
Current-fact context
curl --fail -X POST http://localhost:8000/operations/fact_context \
-H 'content-type: application/json' \
-d '{"query":"Who is the CFO of Acme?","time":{"mode":"current"}}'Returns fact grain with live testimony under a hard evidence budget. Use
at, overlap, or history time mode when the question is about past
world-valid state; omit entity_ids for deployment-wide retrieval or pass
confirmed IDs to start the default one-hop entity-neighborhood recipe.
Current/at calls walk every relation by default—including other:*—then
search relation and observation text inside the capped ID union. Optional
predicate narrows to that exact stored relation name; hops accepts 1–2.
Both authority views
curl --fail -X POST http://localhost:8000/operations/answer_context \
-H 'content-type: application/json' \
-d '{"query":"Who is the CFO of Acme?"}'Returns ContextBundle/v1 with the complete evidence-grain response under
testimony and the complete fact-grain response under facts. The two are not
flattened or re-ranked together.
What to read on the envelope first
Single-grain Envelope answers are flat:
{
"grain": "fact",
"temporal_scope": {
"mode": "current",
"evaluated_at": "…",
"believed_at": "…",
"identity_regime": "current"
},
"facts": [{ "fact_id": "…", "kind": "relation", "label": "…", "evidence_count": 1, "support": "current" }],
"fact_evidence": [{ "fact_kind": "relation", "fact_id": "…", "claim_id": "…", "stance": "supports" }],
"evidence": [{ "claim_id": "…", "claim_text": "…", "is_current_testimony": true }],
"freshness": { "pg_live_ts": "…", "p1_written_inline": true },
"dropped_by_hydration": 0,
"negative": null
}Agent checklist:
- Read
grain - If
negativeis set — branch onkind(unknown_entity|known_empty|boundary) - Prefer
facts+fact_evidencefor present-tense belief - Drill
evidence/ sources before irreversible action - For
ContextBundle/v1, inspecttestimonyandfactsas separate complete envelopes
Full contract: Response envelope.
6. Open query (optional, powerful)
curl --fail http://localhost:8000/query/spaceExample — current facts only:
curl --fail -X POST http://localhost:8000/query/sql \
-H 'content-type: application/json' \
-d '{"sql":"SELECT fact_kind, fact_id, predicate FROM facts_current LIMIT 20"}'Wrong pattern: filtering claims_live validity windows to answer “what is true now.” Claim windows are asserted testimony, not system belief. Start from facts_current. See Open query space.
7. Agent path
Surfaces available immediately without mounts: API / CLI / MCP (same four assured ops + open query).
Mounts (P3 corpus tree, artifacts, raw, Plane K checkout) are published through the library mount APIs for a deployment — not a separate Compose service in the smoke profile. When your harness can mount:
- Obtain
PublishedMountsfrom the self-host mount publisher for this deployment. - Render/publish the consumption
SKILL.mdviaConsumptionSkillSurface. - Prefer filesystem for navigate/read/grep; use MCP/API for search/graph/time-travel.
Details: Mounts and skill.
Install without Compose
Client (remote deployment):
pip install rememberstack
# or: uv add rememberstackNamed install surfaces (see package extras):
pip install 'rememberstack[server]'
pip install 'rememberstack[connectors-watched-directory]'
pip install 'rememberstack[k]'Next
- Concepts — claim vs fact vs grain
- Ingestion — full write path
- Retrieval — full read path
- Deployment — Compose lifecycle and projections
- Configuration — env, model seats, budgets
- Troubleshooting — stuck work and empty retrieval