Documentation Index
Fetch the complete documentation index at: https://grantmaster.dev/llms.txt
Use this file to discover all available pages before exploring further.
Engineering reference: For service contracts, EventBus events, and data-layer details see src/features/documents/documents.md.
Documents
Overview
Document Brain is an organization-wide intelligent document management system for NGOs and grant-dependent entities. It provides centralized document library management with folder hierarchies, AI-powered classification, version history tracking, approval workflows, and extraction of metadata (deadlines, budgets, contacts, compliance rules) from documents.
Key capabilities:
- Drag-and-drop file upload with automatic AI classification
- Folder hierarchy with system (by-funder, by-project, templates, compliance) and custom folders
- Status-based approval workflow: Draft → Pending Review → Approved/Rejected/Archived
- Version history timeline with audit trail
- Template library for common NGO documents
- Metadata extraction: deadlines, budget items, contacts, compliance rules
- Real-time subscriptions for documents and folders
- Recommendation engine for document gaps and suggestions
Data Model
Firestore Collections
| Collection | Document Type | Description |
|---|
document-library | LibraryDocument | Core documents stored by organization; includes metadata, classification, approval status, version history |
document-folders | DocumentFolder | Folder hierarchy with parent references, system folder keys, document counts, permissions |
Key TypeScript Types
LibraryDocument (from documents-brain.schema)
id, organizationId, title, description, fileSize, mimeType, filePath (Storage reference)
folderId? - Parent folder reference
documentType - Extended taxonomy (grant_agreement, invoice, progress_report, etc.; 40+ types)
sensitivity - public | internal | confidential | restricted
status - draft | pending_review | approved | rejected | archived | superseded
classification - AI-extracted tags, compliance areas (governance, financial, personnel, etc.)
approvalHistory[] - ApprovalAction records with userId, timestamp, status transitions
currentReviewerId?, reviewRequestedAt? - Approval workflow state
versions[] - DocumentVersion objects (uploadedBy, uploadedAt, checksum, fileSize, reason)
usageRecords[] - UsageRecord objects for citation/provenance tracking (viewedAt, downloadedAt, citedInDocId)
extractedMetadata? - ExtractedDeadline, ExtractedBudgetItem, ExtractedContact, ExtractedComplianceRule
createdBy, updatedBy + timestamps
DocumentFolder (hierarchy)
id, organizationId, parentId? - null = root
name, type - “system” | “custom”
systemFolderKey? - One of: by-funder, by-project, templates, compliance, policies, archive, uncategorized
documentCount - Running count of documents in folder
createdBy, timestamps
DocumentTemplate
id, organizationId, category - org_description, budget, narrative, theory_of_change, policy, etc.
name, description, content (template text or Markdown)
tags[], createdBy, timestamps
ApprovalAction
id, actionType - “submitted” | “approved” | “rejected” | “restored”
fromStatus, toStatus - Status transitions
userId, userName, timestamp
notes? - Reason for approval/rejection
DocumentVersion
id, uploadedBy, uploadedAt, checksum, fileSize, reason?
UsageRecord
viewedAt?, downloadedAt?, citedInDocId?
Key Behaviors
Upload & Classification
- User selects file and metadata (title, description, sensitivity, tags, optional folder)
- File uploaded to Firebase Storage with progress tracking
- DocumentBrainService creates document record with status=“draft”
- AI classification service (Gemini) extracts tags, compliance areas, deadlines, budgets, contacts if enabled
- DOCUMENT_UPLOADED event emitted (INFO severity, persisted)
- Document available for review by authorized users
Approval Workflow
Draft State (Initial)
- Document editable by creator
- Can update metadata (title, description, tags)
- Can submit for review
Pending Review
- Assigned to reviewer (currentReviewerId)
- Reviewer can approve or reject
- DOCUMENT_REVIEW_REQUESTED event emitted (INFO)
Approved
- Document locked, read-only
- Available for organization-wide use
- Citation/provenance tracked in usageRecords
- DOCUMENT_APPROVED event emitted (HIGH severity, persisted)
Rejected
- Returns to draft or archived
- Reason and reviewer feedback captured in approvalHistory
- Can resubmit
- DOCUMENT_REJECTED event emitted (HIGH severity)
Archived/Superseded
- Marked obsolete; hidden from default views
- Retained for audit trail
Folder Management
- System folders auto-created on organization init
- Custom folder hierarchy with drag-drop move support
- Parent folder permissions inherited by child documents
- documentCount auto-incremented on upload, decremented on delete
- Breadcrumb navigation for folder traversal
Version History
- New version created when document reuploaded (e.g., amended grant)
- Previous versions retained in versions[] array with upload metadata
- Checksum prevents identical file duplicates
- Version reason stored for audit trail (e.g., “Corrected typo”, “Updated budget”)
- Genkit-powered extraction of deadlines, budget items, contacts, compliance rules from uploaded documents
- RecommendationEngine analyzes document gaps (missing compliance docs, templates needed)
- GapAnalysisWidget displays recommended actions
- Suggestions contextual to organization’s active grants and projects
Service Contract
| Service | Owns | Key Methods |
|---|
| DocumentBrainService | Document CRUD, lifecycle, approval workflows | uploadDocument, deleteDocument, moveToFolder, updateDocumentMetadata, submitForReview, approveDocument, rejectDocument, listDocuments(organizationId, folderId?, filters?), subscribeToFolder(orgId, folderId, onDocumentsUpdate) |
| DocumentFolderService | Folder hierarchy, tree operations, path resolution | createFolder(request, orgId, userId), deleteFolder(folderId, force), updateFolder(folderId, { name }), moveFolder({ folderId, newParentId }), listFolders(orgId, parentId?), getFolderTree(orgId), getBreadcrumbs(folderId, orgId), subscribeToFolders(orgId, parentId, onFoldersUpdate) |
| DocumentClassificationService | AI classification and metadata extraction | classifyDocument(documentId, orgId), confirmClassification(documentId, classification, orgId) |
| RecommendationEngine | Gap analysis and suggestions | analyzeGaps(organizationId): GapAnalysisResult, getRecommendations(context): DocumentRecommendation[] |
All service methods return ServiceResult<T> with .success, .data, .error fields.
Events
Emitted
| Event | Trigger | Severity | Persisted |
|---|
| DOCUMENT_UPLOADED | File uploaded, document created | INFO | Yes |
| DOCUMENT_REVIEW_REQUESTED | submitForReview() called | INFO | Yes |
| DOCUMENT_APPROVED | approveDocument() called | HIGH | Yes |
| DOCUMENT_REJECTED | rejectDocument() called | HIGH | Yes |
| DOCUMENT_VERSION_CREATED | New version uploaded | INFO | No |
| DOCUMENT_CLASSIFIED | AI classification completed | INFO | No |
| DOCUMENT_DEADLINE_EXTRACTED | Deadline metadata extracted from doc | INFO | No |
All document events include documentId, documentTitle, organizationId, userId, timestamp, and relevant contextual payload (reviewer info, reason for rejection, extracted metadata).
Consumed
None explicitly. Document Brain does not subscribe to or react on system events; it is a primary event emitter.
Dependencies
- Firebase: Firestore (document-library, document-folders collections), Cloud Storage (file storage), Auth (user context)
- React Query: For server state management via tRPC queries
- Genkit/Gemini API: AI classification and metadata extraction
- EventBus: Centralized event emission for cross-feature coordination
- BaseService: Audit logging (AuditAction), service patterns
- TenantContext: Multi-org isolation via organizationId
- UserContext: Current user profile for audit trail
File Structure
src/features/documents/
├── DocumentBrainContext.tsx # React context + provider (state management via reducer)
├── contracts.ts # Type re-exports from documents-brain.schema
├── index.ts # Public API barrel export
│
├── components/
│ ├── DocumentBrowser.tsx # Main library UI (grid/list view, filters, sort)
│ ├── DocumentCard.tsx # Document grid/list item
│ ├── FolderCard.tsx # Folder representation
│ ├── DocumentDetailPanel.tsx # Read-only detail sidebar
│ ├── UploadDropzone.tsx # Basic drag-drop upload
│ ├── SmartUploadDropzone.tsx # Enhanced upload with classification preview
│ ├── CreateFolderDialog.tsx # New folder creation
│ ├── ClassificationConfirmModal.tsx # AI classification review before apply
│ ├── GapAnalysisWidget.tsx # Gap analysis + recommendations
│ ├── OrganizationDocumentsTab.tsx # Library tab in org settings
│ ├── MyDocumentsTab.tsx # Personal document vault tab
│ ├── PersonalDocumentVault.tsx # User's personal docs (separate org context)
│ ├── PersonalDocumentCard.tsx # Personal doc item
│ ├── PersonalUploadDialog.tsx # Personal doc upload
│ └── document-shared.ts # Shared component utilities
│
├── pages/
│ └── DocumentBrainPage.tsx # Full page layout (sidebar nav, main browser)
│
├── services/
│ ├── DocumentBrainService.ts # Document CRUD, lifecycle (extends BaseService)
│ ├── DocumentFolderService.ts # Folder operations (extends BaseService)
│ ├── DocumentClassificationService.ts # AI classification via Genkit
│ ├── RecommendationEngine.ts # Gap analysis algorithm
│ ├── documentBrainApproval.ts # Approval workflow functions (submitForReview, approve, reject)
│ ├── documentBrainMutations.ts # Upload, delete, move mutations
│ └── documentBrainQueries.ts # Firestore read queries
│
├── document-brain/
│ ├── state.ts # DocumentBrainState, reducer, initial state
│ ├── useDocumentBrainInitialLoad.ts # Initial data load hook
│ └── [composition hooks] # useDocumentBrainLoader, useDocumentBrainDocumentActions, etc.
│
├── hooks/
│ └── useDocumentBrainPageState.ts # Computed state for page (filters, selection, UI)
│
└── __tests__/
└── DocumentBrainContext.test.ts # Context + reducer tests
Composition Pattern: DocumentBrainContext exports multiple specialized hooks (useDocumentBrainLoader, useDocumentBrainDocumentActions, useDocumentBrainFolderActions, useDocumentBrainNavigation, useDocumentBrainSelection, useDocumentBrainFilters, useDocumentBrainUI) that are composed into the main useDocumentBrain() hook for clean separation of concerns.