Files
DocNest/README.md
2025-12-29 16:29:24 -08:00

242 lines
6.1 KiB
Markdown

# Real-Time Collaboration Platform
A full-stack real-time collaborative application supporting both text editing and Kanban boards, built with React and Go. The system uses Yjs CRDTs for conflict-free synchronization and WebSockets for real-time updates.
## Features
- **Collaborative Text Editor**: Real-time document editing with TipTap editor
- **Collaborative Kanban Boards**: Drag-and-drop task management
- **Real-Time Synchronization**: Instant updates across all connected clients
- **Offline Support**: IndexedDB persistence for offline editing
- **User Presence**: See who's currently editing with live cursors and awareness
## Tech Stack
### Frontend
- React 19 + TypeScript
- Vite (build tool)
- TipTap (collaborative rich text editor)
- Yjs (CRDT for conflict-free replication)
- y-websocket (WebSocket sync provider)
- y-indexeddb (offline persistence)
### Backend
- Go 1.25
- Gin (web framework)
- Gorilla WebSocket
- PostgreSQL 16 (document storage)
- Redis 7 (future use)
### Infrastructure
- Docker Compose
- PostgreSQL
- Redis
## Getting Started
### Prerequisites
- Node.js 18+ and npm
- Go 1.25+
- Docker and Docker Compose
### Installation
1. **Clone the repository**
```bash
git clone <your-repo-url>
cd realtime-collab
```
2. **Set up environment variables**
Create backend environment file:
```bash
cp backend/.env.example backend/.env
# Edit backend/.env with your configuration
```
Create frontend environment file:
```bash
cp frontend/.env.example frontend/.env
# Edit frontend/.env with your configuration (optional for local development)
```
Create root environment file for Docker:
```bash
cp .env.example .env
# Edit .env with your Docker database credentials
```
3. **Start the infrastructure**
```bash
docker-compose up -d
```
This will start PostgreSQL and Redis containers.
4. **Install and run the backend**
```bash
cd backend
go mod download
go run cmd/server/main.go
```
The backend server will start on `http://localhost:8080`
5. **Install and run the frontend**
```bash
cd frontend
npm install
npm run dev
```
The frontend will start on `http://localhost:5173`
6. **Access the application**
Open your browser and navigate to `http://localhost:5173`
## Environment Variables
### Backend (backend/.env)
```env
PORT=8080
DATABASE_URL=postgres://user:password@localhost:5432/collaboration?sslmode=disable
REDIS_URL=redis://localhost:6379
ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000
```
### Frontend (frontend/.env)
```env
VITE_API_URL=http://localhost:8080/api
VITE_WS_URL=ws://localhost:8080/ws
```
### Docker Compose (.env)
```env
POSTGRES_USER=collab
POSTGRES_PASSWORD=your_secure_password_here
POSTGRES_DB=collaboration
```
## Architecture
### Real-Time Collaboration Flow
1. Client connects to WebSocket endpoint `/ws/:documentId`
2. WebSocket handler creates a client and registers it with the Hub
3. Hub manages rooms (one room per document)
4. Yjs generates binary updates on document changes
5. Client sends updates to WebSocket
6. Hub broadcasts updates to all clients in the same room
7. Yjs applies updates and merges changes automatically (CRDT)
8. IndexedDB persists state locally for offline support
### API Endpoints
#### REST API
- `GET /api/documents` - List all documents
- `POST /api/documents` - Create a new document
- `GET /api/documents/:id` - Get document metadata
- `GET /api/documents/:id/state` - Get document Yjs state
- `PUT /api/documents/:id/state` - Update document Yjs state
- `DELETE /api/documents/:id` - Delete a document
#### WebSocket
- `GET /ws/:roomId` - WebSocket connection for real-time sync
#### Health Check
- `GET /health` - Server health status
## Project Structure
```
realtime-collab/
├── backend/
│ ├── cmd/server/ # Application entry point
│ ├── internal/
│ │ ├── handlers/ # HTTP/WebSocket handlers
│ │ ├── hub/ # WebSocket hub (room management)
│ │ ├── models/ # Domain models
│ │ └── store/ # Database layer
│ └── scripts/ # Database initialization scripts
├── frontend/
│ ├── src/
│ │ ├── api/ # REST API client
│ │ ├── components/ # React components
│ │ ├── lib/ # Yjs integration
│ │ ├── pages/ # Page components
│ │ └── hooks/ # Custom React hooks
│ └── public/ # Static assets
└── docker-compose.yml # Infrastructure setup
```
## Development
### Backend Commands
```bash
cd backend
go run cmd/server/main.go # Run development server
go build -o server cmd/server/main.go # Build binary
go fmt ./... # Format code
```
### Frontend Commands
```bash
cd frontend
npm run dev # Start dev server
npm run build # Production build
npm run preview # Preview production build
npm run lint # Run ESLint
```
### Database
The database schema is automatically initialized on first run using `backend/scripts/init.sql`.
To reset the database:
```bash
docker-compose down -v
docker-compose up -d
```
## How It Works
### Conflict-Free Replication (CRDT)
The application uses Yjs, a CRDT implementation, which allows:
- Multiple users to edit simultaneously without conflicts
- Automatic merging of concurrent changes
- Offline editing with eventual consistency
- No need for operational transformation or locking
### WebSocket Broadcasting
The backend acts as a message broker:
1. Receives binary Yjs updates from clients
2. Broadcasts updates to all clients in the same room
3. Does not interpret or modify the updates
4. Yjs handles all conflict resolution on the client side
## Contributing
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## License
This project is licensed under the MIT License.
## Acknowledgments
- [Yjs](https://github.com/yjs/yjs) - CRDT framework
- [TipTap](https://tiptap.dev/) - Rich text editor
- [Gin](https://gin-gonic.com/) - Go web framework