Upload, store, and manage files with object storage, versioned metadata, and a real-time activity feed so every collaborator's view stays in sync.
▶ Try the live demo — runs right in your browser, no setup.
- ☁️ Drag-and-drop uploads streamed to S3-compatible object storage (MinIO locally, AWS S3 in prod)
- 🗂️ Automatic versioning — re-uploading a filename replaces the object and bumps v2, v3, …
- 🔎 Server-side filename search (
GET /api/files?q=) with debounced UI + storage-used meter - 🗃️ File metadata (name, size, type, owner, version) in PostgreSQL via TypeORM
- 🔴 Live collaboration — uploads/deletes broadcast over WebSockets and update every open tab instantly
- ⬇️ Streamed downloads straight from object storage
| Tier | Tech |
|---|---|
| Frontend | React + Vite, socket.io-client |
| API | NestJS (REST + WebSocket gateway) |
| Metadata | PostgreSQL (TypeORM) |
| Objects | MinIO (S3-compatible) via @aws-sdk/client-s3 |
| Runtime | Docker Compose |
docker compose up --build| Service | URL |
|---|---|
| App | http://localhost:5173 |
| API | http://localhost:3000/api/files |
| MinIO console | http://localhost:9001 (minioadmin / minioadmin) |
Upload a file, then open the app in a second tab — you'll see the file and the activity feed update live via WebSockets.
# API (needs Postgres + MinIO running — e.g. from the compose file)
cd api && npm install && npm run start:dev
# Web (Vite proxies /api and /socket.io to :3000)
cd web && npm install && npm run dev| Method | Route | Description |
|---|---|---|
GET |
/api/files |
list files (newest first) |
POST |
/api/files |
multipart upload (file field) |
GET |
/api/files/:id/download |
stream download |
DELETE |
/api/files/:id |
delete object + metadata |
WebSocket events: file:created, file:deleted.
MIT © Wassim Jebali