System Architecture - Unified Space & Project

This document provides a comprehensive architectural overview of the unified space and project management system for AppFlowy. The system introduces a hierarchical space model with integrated project management capabilities.

Executive Summary

The unified space and project management system transforms AppFlowy's document organization by introducing:

  • Hierarchical space containers for documents and projects
  • Fine-grained role-based permissions at the space level
  • Integrated project management with kanban boards
  • Real-time collaboration with member management

System Architecture Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                               AppFlowy Architecture                             β”‚
β”‚                                                                                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Frontend (Web) β”‚    β”‚     Backend     β”‚    β”‚      Database Layer       β”‚    β”‚
β”‚  β”‚                 β”‚    β”‚                 β”‚    β”‚                           β”‚    β”‚
β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚    β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚    β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚    β”‚
β”‚  β”‚ β”‚Space Managerβ”‚ │◄──── β”‚Space API    β”‚ │◄──── β”‚ af_space_members    β”‚   β”‚    β”‚
β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚    β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚    β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚    β”‚
β”‚  β”‚                 β”‚    β”‚                 β”‚    β”‚                           β”‚    β”‚
β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚    β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚    β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚    β”‚
β”‚  β”‚ β”‚Project View β”‚ │◄──── β”‚Project API  β”‚ │◄──── β”‚ af_project_metadata β”‚   β”‚    β”‚
β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚    β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚    β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚    β”‚
β”‚  β”‚                 β”‚    β”‚                 β”‚    β”‚                           β”‚    β”‚
β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚    β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚    β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚    β”‚
β”‚  β”‚ β”‚Member Panel β”‚ │◄──── β”‚Permission   β”‚ │◄──── β”‚ af_space_invitationsβ”‚   β”‚    β”‚
β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚    β”‚ β”‚Service      β”‚ β”‚    β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚    β”‚
β”‚  β”‚                 β”‚    β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚    β”‚                           β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚                     Collaborative Layer                                 β”‚    β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚    β”‚
β”‚  β”‚  β”‚Y.js Docs    β”‚  β”‚WebSocket    β”‚  β”‚Redis Cache  β”‚  β”‚Access Controlβ”‚    β”‚    β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          

Data Model Architecture

Core Entities

Entity Purpose Key Relationships Status
af_space_members Member roles and permissions for spaces β†’ af_workspace, af_user βœ… Implemented
af_space_invitations Pending invitations to join spaces β†’ af_workspace, af_user βœ… Implemented
af_project_metadata Project-specific settings and stats β†’ af_workspace βœ… Implemented
af_project_tasks Tasks with document integration β†’ af_project_metadata, af_user βœ… Implemented

Permission Model

Owner Role

  • All content permissions
  • Full member management
  • Space settings & deletion
  • Project: All task permissions

Admin Role

  • All content permissions
  • Member & role management
  • Space settings (no deletion)
  • Project: All task permissions

Editor Role

  • View, edit, create content
  • View members only
  • Project: Create & assign tasks
  • View reports

Viewer Role

  • View content only
  • View members only
  • Project: View reports only
  • No editing capabilities

API Architecture

RESTful Endpoints

POST
/api/spaces/{space_id}/members/invite

Invite new members to a space with specified role

GET
/api/spaces/{space_id}/members

List all space members with roles and user profiles

PUT
/api/spaces/{space_id}/members/{member_uid}

Update member role or permissions

DELETE
/api/spaces/{space_id}/members/{member_uid}

Remove member from space

GET
/api/spaces/{space_id}/permissions/{permission}

Check if user has specific permission in space

POST
/api/space-invitations/{token}/accept

Accept space invitation using invitation token

Technology Stack

Backend

Rust + Actix Web
PostgreSQL
SQLx ORM

Frontend

React + TypeScript
Tailwind CSS
React Query

Collaboration

Y.js Documents
WebSocket
Redis Cache

Database

PostgreSQL 15+
JSONB for settings
UUID primary keys

Implementation Phases

Phase 1: Backend Foundation

Status: βœ… Completed

Deliverables:

  • βœ… Database schema with migrations
  • βœ… Space member API endpoints
  • βœ… Permission system with role-based access
  • βœ… Integration with existing workspace system
  • βœ… PostgreSQL functions for permission checking

Technical Implementation:

  • Created comprehensive database tables (af_space_members, af_space_invitations, af_project_metadata)
  • Implemented full REST API in Rust with proper error handling
  • Built permission service with caching and context awareness
  • Added proper indexes and constraints for performance

Phase 2: Frontend Space Management

Status: βœ… Completed

Delivered Components:

  • βœ… Space settings UI with member management panel
  • βœ… Member invitation flow with role selection
  • βœ… Real-time member list with role editing
  • βœ… Permission-based UI visibility controls
  • βœ… Integration with existing workspace UI

Technical Implementation:

  • React components for member management
  • TypeScript interfaces matching backend API
  • React Query for API state management
  • Tailwind CSS for responsive design

Phase 3: Project Space Implementation

Status: βœ… Completed

Delivered Features:

  • βœ… Project space type with kanban board
  • βœ… Task management with drag & drop
  • βœ… Task-to-document linking
  • βœ… Project dashboard with analytics
  • βœ… Project templates

Technical Components:

  • Kanban board using @dnd-kit library
  • Task persistence with database integration
  • Real-time updates with Y.js
  • Project analytics dashboard

Phase 4: Integration & Migration

Status: βœ… Completed

Delivered Capabilities:

  • βœ… Migration tools for existing workspaces
  • βœ… Space search and discovery
  • βœ… Cross-space navigation
  • βœ… Space templates and presets
  • βœ… Space usage analytics

Migration Strategy:

  • Automatic migration for existing pages to spaces
  • Permission mapping from workspace to space level
  • Backward compatibility maintained
  • Progressive rollout capability

Key Technical Decisions

Architecture Patterns

  • Event-Driven Updates: Using WebSocket for real-time member changes
  • Permission Caching: Redis cache for permission checks
  • Optimistic UI: Frontend updates before server confirmation
  • Database Transactions: Ensuring data consistency for space operations

Security Considerations

  • Token-Based Invitations: Secure invitation links with expiration
  • Row-Level Security: PostgreSQL RLS for data isolation
  • Permission Inheritance: Space permissions cascade to content
  • Audit Logging: All permission changes are logged

Performance Optimizations

  • Lazy Loading: Load space members on demand
  • Batch Operations: Bulk invite and permission updates
  • Index Strategy: Optimized indexes for permission queries
  • Connection Pooling: Efficient database connection management

Future Enhancements

Planned Features

  • External Sharing: Share spaces with external users
  • Space Analytics: Advanced usage and activity metrics
  • Custom Roles: Define custom permission sets
  • Space Archiving: Archive inactive spaces
  • API Access: Third-party integration support

Monitoring & Metrics

Key Performance Indicators

  • Space creation rate
  • Member invitation acceptance rate
  • Average members per space
  • Permission check latency
  • API response times

Health Metrics

  • Database connection pool usage
  • Redis cache hit rate
  • WebSocket connection stability
  • Error rates by endpoint