Data Flow
Detailed sequence diagrams showing how data flows through Rephole.
Repository Ingestion Flowβ
When you submit a repository for ingestion:
ββββββββββ βββββββββββββ βββββββββββββββ ββββββββββ
β Client ββββββΆβ API ServerββββββΆβ Redis Queue ββββββΆβ Worker β
ββββββββββ βββββββββββββ βββββββββββββββ ββββββ¬ββββ
β
βΌ
ββββββββββββββ ββββββββββββββ βββββββββββββββββββββββββ
β PostgreSQL βββββββ ChromaDB βββββββ Clone β Parse β Embedβ
ββββββββββββββ ββββββββββββββ βββββββββββββββββββββββββ
Step by Stepβ
- Client sends
POST /ingestions/repository - API Server validates request and creates job
- Redis Queue stores job for processing
- API Server returns
jobIdimmediately - Worker picks up job from queue
- Worker clones repository to local storage
- Worker parses code files using Tree-sitter
- Worker generates embeddings via OpenAI API
- Worker stores vectors in ChromaDB
- Worker stores file content in PostgreSQL
- Worker marks job complete in Redis
Semantic Search Flowβ
When you perform a search:
ββββββββββ βββββββββββββ ββββββββββββββ
β Client ββββββΆβ API ServerββββββΆβ OpenAI API β
ββββββββββ βββββββββββββ βββββββ¬βββββββ
β β
βββββββββββββββββββββ
β (embedding)
βΌ
βββββββββββββ
β ChromaDB β
βββββββ¬ββββββ
β (child chunk IDs)
βΌ
ββββββββββββββ
β PostgreSQL β
βββββββ¬βββββββ
β (parent content)
βΌ
βββββββββββββ
β Response β
βββββββββββββ
Step by Stepβ
- Client sends
POST /queries/searchwith prompt - API Server sends prompt to OpenAI for embedding
- OpenAI returns 1536-dimensional vector
- API Server queries ChromaDB for similar child chunks
- ChromaDB returns matching chunk IDs (k Γ 3)
- API Server groups chunks by parent document
- API Server fetches parent content from PostgreSQL
- API Server formats and returns results to client
Data Storageβ
ChromaDB (Vectors)β
Collection: rephole-collection
βββ Document ID: chunk-001
β βββ Vector: [0.123, -0.456, ...] (1536 dims)
β βββ Metadata: {parent_id, file_path, repo_id}
βββ Document ID: chunk-002
β βββ ...
PostgreSQL (Content)β
Table: files
βββ id: ulid
βββ repo_id: string
βββ path: string
βββ content: text (full file)
βββ created_at: timestamp
βββ updated_at: timestamp
Queue Structureβ
BullMQ Jobβ
{
"name": "repo-ingestion",
"data": {
"repoUrl": "https://github.com/...",
"ref": "main",
"token": "...",
"userId": "...",
"repoId": "..."
},
"opts": {
"attempts": 3,
"backoff": {
"type": "exponential",
"delay": 1000
}
}
}