The bakery I work at tracks its QA paperwork — SOPs, cleaning checklists, training records — the way a lot of small operations do: shared folders and whoever remembers to update the file. Versions go stale, nobody's sure which copy is current, and there's no record of who changed what. DocVault is my attempt to actually fix that: a tool for a real problem I sit next to every shift, not a tutorial project.
Architecture
Three services, wired together with Docker Compose:
| Service | Role |
|---|---|
frontend |
React + TypeScript, built with Vite, served by Nginx |
backend |
Node.js API — documents, versions, users, notifications |
postgres |
PostgreSQL 16, holds document, version, and user records |
The backend waits on Postgres's own health check before it starts, uploaded files persist in a named Docker volume, and storage is designed to be pluggable — a STORAGE_DRIVER setting switches between the local filesystem, for running on one box, and S3, for a proper deployment, without the rest of the app needing to know which one it's talking to. Email alerts are SMTP-configurable, and a cron schedule controls how often the service checks for documents due for review.
The frontend
This part is real and running: a sidebar-routed React app with four screens — a document library, a per-document detail view with version history, a drag-and-drop upload flow (react-dropzone), and user management — talking to a REST API over Axios. The API client already defines the full contract the backend needs to satisfy: list and fetch documents, upload a new document or a new version of an existing one, download a specific version, and manage per-document notification rules.
Where it actually stands
I want to be direct about this one, since it isn't finished the way the other two projects are. The frontend and the Docker Compose architecture are built and match the design above, but the Node.js API that implements it is still on my machine, not yet pushed. The repository right now shows the real frontend and the real orchestration config, next to an empty backend/ folder. I'd rather say that plainly than have this read like the whole thing is live when it isn't.
What's next
- Push the backend and get
docker compose upactually building all three services end to end. - Wire up role-based access for the two roles this was designed around — QA admin and read-only staff — so the permission model is enforced in code, not just assumed by the UI.
- Deploy it self-hosted, the way it's meant to run: on an EC2 instance or on-prem at the bakery, which is where it would actually get used.
The repository is public: karan-sohi/DocVault.