Overview
Argument Cartographer uses Firebase Firestore as its primary database, chosen for rapid development, built-in security, real-time capabilities, and managed scaling. The data model follows a strict user-ownership pattern for privacy and security.Security Model: All user data is isolated under
/users/{userId} paths with declarative Firestore Security Rules preventing cross-user access.Data Architecture
Collection Structure
Root Collections
- /users
- /radarTopics
Purpose: User profile documentsPath: Access Control:
/users/{userId}Schema:- Read: Owner only
- Write: Owner only
- List: Disabled (prevents user enumeration)
Subcollections
- argumentMaps
- sources
Purpose: User’s saved argument analysesPath: Indexes:
/users/{userId}/argumentMaps/{mapId}Schema:(userId, createdAt DESC)- For history queries
- Read: Owner only
- Write: Owner only
- List: Owner can list their own
Nested Data Structures
ArgumentNode
argumentMaps.blueprint
Why not separate collection?
- Tight coupling with analysis
- Always fetched together
- Simpler queries
- Atomic updates
DetectedFallacy
argumentMaps.fallacies
Tweet
argumentMaps.tweets
Firestore Security Rules
Declarative access control enforced at the database level.Core Rules File
Security Principles
1
Default Deny
All operations denied unless explicitly allowed
2
Path-Based Authorization
Ownership determined by
{userId} in path - fast, secure3
No Public Data
User data never readable by other users
4
Immutable IDs
User IDs and document IDs cannot be changed after creation
5
No Cross-User Queries
Impossible to query other users’ data even with malicious client
Query Patterns
User’s Analysis History
(userId, createdAt DESC)
Radar Topic Feed
(archived, categories, updatedAt DESC)
Real-Time Listeners (Future)
Data Lifecycle
Creation Flow
1
User Submits Analysis
Client sends request via Server Action
2
Server Processes
Genkit flow generates complete analysis
3
Firestore Write
Server Action saves to
/users/{userId}/argumentMaps/{autoId}4
Return to Client
Document ID and data returned to client for display
Update Flow (Future)
Re-analyze existing topic with fresh data:Deletion Policy
- User-Initiated
- Auto-Expiration (Future)
Users can delete their analyses:Cascade: Sources are NOT deleted (may be reused)
Performance Optimization
Indexing Strategy
Required Composite Indexes:-
User Analysis History
- Collection:
argumentMaps(collection group) - Fields:
userId ASC, createdAt DESC - Query: User history sorted by recency
- Collection:
-
Radar Feed Filtering
- Collection:
radarTopics - Fields:
archived ASC, categories ASC, updatedAt DESC - Query: Active topics by category
- Collection:
-
Featured Topics
- Collection:
radarTopics - Fields:
featured ASC, credibilityScore DESC - Query: Top featured topics
- Collection:
Denormalization
Pattern: DuplicateuserId in subcollection documents
Benefit: Enables collection group queries without joins
Batch Operations
Update multiple documents atomically:Cost Optimization
Read Costs
Firestore Pricing (as of 2024):- Reads: $0.06 per 100K
- Writes: $0.18 per 100K
- Deletes: $0.02 per 100K
- Pagination: Limit queries to 20-50 results
- Client Caching: Cache data in React state/localStorage
- Selective Fetching: Only fetch what’s displayed
- Real-Time Sparingly: Use snapshots only when necessary
Write Costs
Expensive operations:- Creating analyses (inevitable)
- Updating Radar topics (batched)
- Logging (minimize production logs)
Next Steps
External Integrations
How external APIs interact with the data layer
AI Orchestration
How AI generates the data stored in Firestore
Installation
Set up Firebase for your own instance
Configuration
Configure Firestore and security rules
