# DocuVault

## What This Is

DocuVault is a self-hosted, multi-user SaaS document management platform. Users upload documents (PDF, DOCX, images, text), which are automatically text-extracted and classified by AI into user-defined topics. Each user has isolated, quota-enforced storage, can organize documents in folders, connect external cloud storage backends (OneDrive, Google Drive, Nextcloud, etc.), and share documents with other users by handle. A privacy-first admin model gives administrators platform control without any access to user document content.

## Core Value

Every user's documents — and the credentials they use to store them — are inaccessible to everyone except that user, while the platform scales horizontally and supports pluggable storage backends.

## Requirements

### Validated

*Capabilities already shipping in the codebase:*

- ✓ Document upload and text extraction (PDF, DOCX, image, plain text) — existing
- ✓ AI-based topic classification via configurable provider — existing
- ✓ Multiple AI provider support (Anthropic, OpenAI, Ollama, LMStudio) — existing
- ✓ Topic CRUD management — existing
- ✓ System prompt configuration — existing
- ✓ Docker containerization (Compose) — existing

### Active

**Users & Auth**
- [ ] User can register with email and password (enforced strength: length, complexity, breach check)
- [ ] User can log in and maintain session via JWT
- [ ] User can enable TOTP authenticator app for 2FA
- [ ] Admin can create, deactivate, and reset passwords for user accounts
- [ ] Admin cannot access any user's documents or cloud storage credentials

**Storage & Quotas**
- [ ] Each user has an isolated storage area with a 100 MB free-tier quota
- [ ] Quota usage is tracked and enforced; uploads exceeding quota are rejected with a clear error
- [ ] Admin can adjust individual user storage quotas
- [ ] Platform migrates from flat-file JSON + filesystem to PostgreSQL + MinIO (S3-compatible)

**Folder Structure**
- [ ] User can create, rename, and delete folders to organize documents
- [ ] Document organization is preserved on move/rename (no auto-rearrangement by AI)
- [ ] A "Shared with me" folder appears automatically when another user shares a document

**Document Sharing**
- [ ] User can share a document (or folder) with another user by their unique handle
- [ ] Shared access is view-only by default; owner controls permission level
- [ ] Revoking share removes access immediately; shared copy is not duplicated in recipient's quota

**Cloud Storage Integration**
- [ ] User can connect an external cloud storage backend (OneDrive, Google Drive, Nextcloud; extensible)
- [ ] Local storage and cloud storage coexist; user selects their default storage destination
- [ ] Cloud storage credentials are encrypted at rest and never readable by admins
- [ ] Documents stored in cloud backend are accessed via the app without being re-copied to local storage

**AI Configuration (Admin-controlled)**
- [ ] Admin can assign an AI provider and model per user or per group
- [ ] System-wide default AI provider and model set by admin
- [ ] Users cannot change their own AI provider or model
- [ ] Per-user topic overrides on top of system default topics

**Audit Logging**
- [ ] Audit log captures: logins, failed logins, uploads, deletes, sharing events, quota changes
- [ ] Audit log records metadata only — no document content
- [ ] Admin can view and filter audit logs

**Scalability**
- [ ] Backend stateless — multiple instances can run behind a load balancer
- [ ] All state in PostgreSQL and MinIO (no local file locks, no per-instance JSON)

### Out of Scope

- Subscription billing / payment processing — future milestone (quotas designed to plug in)
- SSO (Microsoft, Google, Apple) — future; auth layer designed for extension
- Keycloak / SAML / OAuth enterprise federation — future
- Group admin roles — future; groups table will be seeded in schema
- Document annotation or in-app editing — not planned
- Mobile app — not planned
- Public document sharing (unauthenticated link) — not planned for v1

## Context

- **Existing codebase**: Functional single-user document scanner (FastAPI + Vue 3, Docker Compose). AI provider abstraction already in place — cloud storage will follow the same adapter pattern.
- **Brownfield migration**: Flat-file JSON persistence and per-process file locks must be replaced with PostgreSQL + MinIO before multi-user isolation is safe.
- **Privacy constraint**: SaaS model with strict admin/user data separation. Admin role is a platform operator, not a content viewer. Cloud credentials must be encrypted server-side; the encryption key must not be readable by admin queries.
- **Free tier baseline**: 100 MB per user. Quota model should be designed so future subscription tiers can expand it without schema changes.
- **Cloud storage**: Follows same provider/adapter pattern as existing AI providers. Each cloud integration is an adapter implementing a common StorageBackend interface.

## Constraints

- **Tech stack**: FastAPI (Python) + Vue 3 — keep existing stack, extend it
- **Database**: PostgreSQL (replaces flat-file JSON)
- **Object storage**: MinIO (S3-compatible, Docker-native) — replaces local filesystem for documents
- **Auth**: bcrypt passwords, JWT sessions, TOTP 2FA (PyOTP / similar)
- **Cloud credentials**: Encrypted at rest (Fernet symmetric encryption or PostgreSQL pgcrypto) — key in env var, never in DB
- **Scalability target**: Horizontal (multiple backend containers) — no file-system-level coordination
- **Deployment**: Docker Compose (must remain the primary deployment target)

## Key Decisions

| Decision | Rationale | Outcome |
|---|---|---|
| PostgreSQL + MinIO over flat files | Multi-user quotas + horizontal scaling require shared, consistent state | Replacing JSON + filesystem |
| Cloud storage adapter pattern | Mirrors existing AI provider pattern — consistent, extensible | New `storage/` module analogous to `ai/` |
| Privacy-first admin model | SaaS legal/trust requirement — admins must not be able to access user data | Admin queries exclude document content; cloud creds encrypted with user-scoped key |
| Admin controls AI config, not users | Prevents cost overruns and model misuse; future group-admin delegation designed in | AI provider assignment stored per-user in DB, configurable by admin |
| 100 MB free tier | Baseline for subscription model; quota table has a `limit_bytes` column admin can override | Quota enforced at upload time |
| TOTP 2FA before SSO | State-of-the-art security without third-party dependency; SSO added when subscription model lands | TOTP via authenticator app (RFC 6238) |

## Evolution

This document evolves at phase transitions and milestone boundaries.

**After each phase transition** (via `/gsd-transition`):
1. Requirements invalidated? → Move to Out of Scope with reason
2. Requirements validated? → Move to Validated with phase reference
3. New requirements emerged? → Add to Active
4. Decisions to log? → Add to Key Decisions
5. "What This Is" still accurate? → Update if drifted

**After each milestone** (via `/gsd:complete-milestone`):
1. Full review of all sections
2. Core Value check — still the right priority?
3. Audit Out of Scope — reasons still valid?
4. Update Context with current state

---
*Last updated: 2026-05-21 after initialization*
