DB Schema
Hierarchy
User
Namespace (user or org)
└── Space
├── Node (materialized paths tree)
├── Episode
│ ├── LogEntry / LogChunk / LogMetadata
│ ├── Track[] (scalars, tensors; episode-scoped)
│ ├── TextTrack[]
│ ├── LabelTrack[]
│ ├── Audio[]
│ └── Parameters / ParameterEntry
├── Video[] ← links to BSS; has folderId → Node
├── Audio[] ← space-level; has folderId → Node
├── Track[] ← space-level (generated, not episode-scoped)
├── TextTrack[] ← has folderId → Node
├── LabelTrack[] ← has folderId → Node
├── Dataset
│ └── Collection[]
├── Collection[] (standalone)
└── EmbeddingJob[]Node Hierarchy (Folder Tree)
Uses MongoDB's recommended Materialized Paths pattern. Only folders live in the Node collection — files (Video, Audio, etc.) reference their parent folder via folderId.
Path convention:
| Example | path | name |
|---|---|---|
| Root-level folder | "," | "camera" |
| Depth 1 | ",camera," | "front" |
| Depth 2 | ",camera,front," | "rgb" |
Operations:
| Operation | Query | Write cost |
|---|---|---|
Browse children of /camera | findMany({ path: ",camera," }) | — |
All descendants of /camera | findMany({ path: /^,camera,/ }) | — |
| Rename | update self + $replaceAll on descendants | O(F) folders |
| Move | same pattern | O(F) folders |
| Delete | soft-delete self + descendants | O(F) folders |
Files are NOT updated during folder operations — they just hold a folderId pointer.
S3 Path Convention (BSS)
All binary data flows through BSS to S3:
{owner}/{project}/
staging/{hash} # Raw uploaded files (flat staging pool)
videos/{videoId}/
meta.json # Video metadata
stream/{hash}.m3u8 # HLS playlists
tracks/
labels/{labelId}/meta.json
text/{textTrackId}/meta.json
audio/{audioId}/meta.json
chunks/
{hash}.ts # Global chunk pool (content-addressed, deduped)Track/log S3 paths (dreamlake-server managed):
{nameprojectSlug}/{projectSlug}/
episodes/{episodeId}/
logs/chunk-{n:05d}.jsonl.gz
tracks/{trackKind}/{trackId}/
tracks/{trackKind}/{trackId}/ ← space-level
datasets/{datasetId}/