Quickstart
Run DocuStore locally and process your first document.
You need Docker with Compose v2, uv (Python 3.12+), and Node.js with pnpm.
1. Clone the Repository
git clone https://github.com/sidxz/docu-store.git
cd docu-store/services2. Configure Environment
Copy the example environment file and adjust settings:
cp .env.example .envKey settings to configure:
# LLM Provider (ollama, openai, anthropic, or gemini)
LLM_PROVIDER=ollama
LLM_BASE_URL=http://localhost:11434
# Embedding model (runs locally on CPU; see Integration → Embedding Models)
EMBEDDING_MODEL_NAME=ibm-granite/granite-embedding-english-r2
EMBEDDING_DEVICE=cpu
# Authorization (Duar); DUAR_IDP_AUDIENCE is required
DUAR_URL=http://localhost:9003
DUAR_SERVICE_KEY=your-service-key
DUAR_IDP_AUDIENCE=your-oauth-client-idSee Authentication for the Duar setup.
3. Start the Stack
Start the infrastructure (EventStoreDB, MongoDB, Qdrant, Temporal, Kafka, Langfuse, Umami):
make docker-upThe first startup takes a few minutes as Docker pulls images and initializes databases. make docker-up starts infrastructure only. Run the DocuStore processes on the host:
make dev-install
make run-all # API, read models, pipeline worker, Temporal workers, plugin consumerThen start the web portal in another terminal:
cd ../web
cp apps/portal/.env.example apps/portal/.env.local
pnpm install
pnpm dev # http://localhost:150004. Verify Services
Once running, verify the services are healthy:
- Portal: http://localhost:15000 — Web frontend
- API: http://localhost:8000/docs — FastAPI Swagger UI
- EventStoreDB: http://localhost:2114 — Admin dashboard
- Temporal: http://localhost:8233 — Workflow dashboard
- Qdrant: http://localhost:6333/dashboard — Vector DB dashboard
The dev compose file publishes EventStoreDB on host port 2114 and Temporal on 7234 (not the usual 2113/7233), so .env should use esdb://localhost:2114?tls=false and localhost:7234.
5. Upload Your First Document
Upload through the portal, or via the API. API calls need your IdP token plus a Duar authz token for the workspace. Mint one through the API (it holds the service key):
AUTHZ_TOKEN=$(curl -s -X POST http://localhost:8000/auth/mint \
-H "Content-Type: application/json" \
-d "{\"idp_token\": \"$IDP_TOKEN\", \"provider\": \"google\", \"workspace_id\": \"$WORKSPACE_ID\"}" \
| jq -r .authz_token)curl -X POST http://localhost:8000/artifacts/upload \
-H "Authorization: Bearer $IDP_TOKEN" \
-H "X-Authz-Token: $AUTHZ_TOKEN" \
-F "file=@/path/to/your/document.pdf" \
-F "artifact_type=RESEARCH_ARTICLE"DocuStore will automatically:
- Parse pages from the PDF
- Extract chemical compounds (OCSR)
- Run named entity recognition (NER)
- Generate page and document summaries
- Create text, summary, and SMILES embeddings
Monitor progress in the Temporal dashboard at http://localhost:8233.
6. Search Your Documents
Once processing completes, search via the API (same auth headers as above):
# Text search
curl -X POST http://localhost:8000/search/pages \
-H "Authorization: Bearer $IDP_TOKEN" \
-H "X-Authz-Token: $AUTHZ_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query_text": "kinase inhibitor"}'
# Hierarchical search (summaries + chunks)
curl -X POST http://localhost:8000/search/hierarchical \
-H "Authorization: Bearer $IDP_TOKEN" \
-H "X-Authz-Token: $AUTHZ_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query_text": "What compounds showed selectivity for CDK4?"}'Next Steps
- Configuration Reference — all environment variables
- Production Deployment — Docker Swarm setup
- Architecture Overview — understand the pipeline