Overview
What SliceSeeker is and how the pieces fit together
SliceSeeker is a self-hostable internal tool for semantic video search. Other backend services call Phase 2 (search-api / search-client) to seek and search video slices. Operators use the admin UI. There is no built-in login — see Deploy for the network-trust model.
You upload media, index it in the background, then query by natural language. Postgres (pgvector) stores embeddings; object storage holds the source files.
This is early software (v0.1). Four indexing paths work end-to-end today: three independent modalities plus a hybrid pipeline that segments once and fuses video, speech, and vision with weighted RRF at search time.
Intended use
| Surface | Who uses it | Role |
|---|---|---|
| search-api | Your backend services | Primary product surface: seek / search slices via HTTP or search-client |
| Admin UI | Human operators | Upload, process, search, and cost views |
What you get
| Capability | What it does |
|---|---|
| Upload | Resumable tus uploads into S3-compatible storage |
| Multimodal | Split video into ~15s chunks, embed each chunk, search by meaning |
| Speech | Extract audio, transcribe with Whisper, embed segments, search spoken content |
| Vision | Sample still frames on an interval, embed images, search what's on screen |
| Hybrid | One shared segment grid → per-clip video/speech/vision embeds → weighted RRF search |
| Admin UI | Operator console for upload, process, search, and cost views |
| Search API | Read-only Phase 2 HTTP API + typed search-client SDK |
Two phases
Indexing and search deploy as separate phases. They share a database schema but never call each other.
Phase 1 (write) → Postgres + Valkey + S3 + tusd
Phase 2 (read) → Postgres + embedding provider| Phase | Role | Services |
|---|---|---|
| 1: Indexing | Upload, process, admin UI | indexer-api, indexer-worker, admin-ui, tusd |
| 2: Search | Vector retrieval only | search-api |
Phase 2 can run alone once Phase 1 has written data. Point DATABASE_URL at that database. An empty DB returns empty results.