# ExcaliDash Developer Guide ## What is ExcaliDash? ExcaliDash is a full-stack dashboard application for managing and organizing [Excalidraw](https://excalidraw.com) drawings. It provides a interface for creating, organizing, and collaborating on diagrams with features like collections, real-time collaboration, file import/export, and bulk operations. ## Project Overview ### Core Features - **Drawing Management**: Create, edit, and organize Excalidraw drawings - **Collections**: Organize drawings into folders/categories - **Real-time Collaboration**: Multiple users can edit drawings simultaneously - **Import/Export**: Support for .excalidraw and .json file formats - **Bulk Operations**: Multi-select drawings for delete, duplicate, and move operations - **Search & Sort**: Find drawings by name with sorting by name, created date, or modified date - **Trash System**: Soft delete with permanent delete option - **Drag & Drop**: Intuitive file dragging and drawing reordering - **Dark/Light Theme**: Automatic theme detection with manual toggle ### Tech Stack **Frontend:** - React 18 + TypeScript - Vite (build tool) - Tailwind CSS (styling) - Excalidraw (drawing canvas) - Socket.io Client (real-time features) - React Router (navigation) - Lucide React (icons) **Backend:** - Node.js + Express - TypeScript - Prisma ORM - SQLite database - Socket.io (real-time server) **Infrastructure:** - Docker (containerization) - Docker Compose (multi-container orchestration) ## Project Structure ``` ExcaliDash/ ├── README.md # Project overview ├── AGENTS.md # This file - developer guide ├── DOCKER.md # Docker documentation ├── .gitignore # Git ignore rules ├── .dockerignore # Docker ignore rules ├── docker-compose.yml # Production Docker setup ├── docker-compose.prod.yml # Additional production config ├── publish-docker.sh # Docker deployment script │ ├── backend/ # Node.js/Express backend │ ├── src/ │ │ ├── index.ts # Main server file │ │ └── generated/ # Prisma generated client │ ├── prisma/ │ │ ├── schema.prisma # Database schema │ │ ├── migrations/ # Database migrations │ │ └── dev.db # SQLite database (development) │ ├── package.json # Backend dependencies │ ├── Dockerfile # Backend container config │ ├── .env.example # Environment variables template │ └── docker-entrypoint.sh # Container startup script │ └── frontend/ # React frontend application ├── src/ │ ├── components/ # Reusable UI components │ ├── pages/ # Route components │ ├── hooks/ # Custom React hooks │ ├── context/ # React context providers │ ├── types/ # TypeScript type definitions │ ├── utils/ # Utility functions │ ├── api/ # API client functions │ └── assets/ # Static assets ├── public/ # Public assets ├── package.json # Frontend dependencies ├── Dockerfile # Frontend container config ├── vite.config.ts # Vite configuration ├── tailwind.config.js # Tailwind CSS configuration └── nginx.conf # Nginx configuration for production ``` ## Getting Started ### Prerequisites - Node.js 18+ and npm - Docker and Docker Compose (for containerized development) - Git ### Development Setup #### Option 1: Local Development (Recommended) 1. **Install Backend Dependencies** ```bash cd backend npm install ``` 2. **Install Frontend Dependencies** ```bash cd ../frontend npm install ``` 3. **Setup Environment Variables** ```bash cd ../backend cp .env.example .env # Edit .env if needed ``` 4. **Initialize Database** ```bash npx prisma generate npx prisma db push ``` 5. **Start Backend Development Server** ```bash cd backend npm run dev # Server runs on http://localhost:8000 ``` 6. **Start Frontend Development Server** (in a new terminal) ```bash cd frontend npm run dev # Frontend runs on http://localhost:5173 ``` ### Environment Variables **Backend (.env):** ```bash DATABASE_URL="file:./prisma/dev.db" PORT=8000 NODE_ENV=development ``` **Frontend (.env.example):** ```bash VITE_API_URL=http://localhost:8000 ``` ## Making Changes ### Development Workflow 1. **Create a Feature Branch** ```bash git checkout -b feature/your-feature-name ``` 2. **Make Your Changes** - Follow the existing code style and patterns - Add TypeScript types for new features - Update database schema if needed (see Database section) 3. **Test Your Changes** - Test both locally and with Docker - Check that existing functionality still works 4. **Commit and Push** ```bash git add . git commit -m "feat: add your feature description" git push origin feature/your-feature-name ``` ### Code Style and Standards - **TypeScript**: Use strict TypeScript typing - **Component Structure**: Follow the existing component patterns in `frontend/src/components/` - **API Design**: RESTful endpoints in `backend/src/index.ts` - **Database**: Use Prisma migrations for schema changes - **Styling**: Tailwind CSS classes with the existing design system ### File Organization Guidelines - **Frontend Components**: Keep related components together - **Custom Hooks**: Place in `frontend/src/hooks/` - **Utilities**: Place in `frontend/src/utils/` - **API Routes**: Add to `backend/src/index.ts` - **Database Models**: Update `backend/prisma/schema.prisma` ## Database ### Schema Overview The application uses two main models: **Collection:** - `id` (String, UUID) - Primary key - `name` (String) - Collection name - `drawings` (Relation) - Related drawings - `createdAt`, `updatedAt` (DateTime) - Timestamps **Drawing:** - `id` (String, UUID) - Primary key - `name` (String) - Drawing name - `elements` (String, JSON) - Excalidraw elements - `appState` (String, JSON) - Excalidraw application state - `files` (String, JSON) - Associated files - `preview` (String, SVG) - Thumbnail preview - `version` (Int) - Version number for conflict detection - `collectionId` (String, nullable) - Foreign key to Collection - `createdAt`, `updatedAt` (DateTime) - Timestamps ### Making Database Changes 1. **Modify the Schema** Edit `backend/prisma/schema.prisma` 2. **Create a Migration** ```bash cd backend npx prisma migrate dev --name your_migration_name ``` 3. **Update TypeScript Types** ```bash npx prisma generate ``` 4. **Test the Changes** ```bash npx prisma db push # Apply to development database ``` ### Database Commands ```bash # Generate Prisma client npx prisma generate # Create and apply migration npx prisma migrate dev --name migration_name # Reset database (development only) npx prisma migrate reset # View database in Prisma Studio npx prisma studio # Deploy migrations to production npx prisma migrate deploy ``` ## API Documentation ### Base URL - Development: `http://localhost:8000` - Production: Configured via environment variables ### Endpoints #### Drawings - `GET /drawings` - List drawings (supports search and collection filtering) - `GET /drawings/:id` - Get single drawing - `POST /drawings` - Create new drawing - `PUT /drawings/:id` - Update drawing - `DELETE /drawings/:id` - Delete drawing permanently - `POST /drawings/:id/duplicate` - Duplicate drawing #### Collections - `GET /collections` - List all collections - `POST /collections` - Create new collection - `PUT /collections/:id` - Update collection - `DELETE /collections/:id` - Delete collection (moves drawings to unorganized) #### System - `GET /health` - Health check endpoint ### Real-time Events (Socket.io) #### Client → Server - `join-room` - Join drawing room for collaboration - `cursor-move` - Broadcast cursor position - `element-update` - Broadcast drawing changes - `user-activity` - Update user active status #### Server → Client - `presence-update` - User presence in room - `cursor-move` - Other user's cursor position - `element-update` - Other user's drawing changes ### Environment Setup **Production Environment Variables:** - `DATABASE_URL` - SQLite database path - `PORT` - Backend server port - `NODE_ENV` - Set to "production" ## Troubleshooting ### Common Issues 1. **Database Connection Error** - Check that the database file exists in `backend/prisma/dev.db` - Ensure proper permissions on the database file - Verify DATABASE_URL in .env 2. **Prisma Client Issues** - Run `npx prisma generate` to regenerate client - Clear `node_modules` and reinstall dependencies 3. **Port Already in Use** - Change PORT in backend/.env - Update frontend API URL accordingly 4. **Docker Build Failures** - Check Dockerfile syntax - Ensure all dependencies are listed in package.json - Verify build context in docker-compose.yml 5. **Frontend Not Loading** - Check browser console for errors - Verify API_URL in frontend environment - Check network connectivity to backend ## Architecture Details ### Frontend Architecture The frontend follows a component-based architecture with: - **Pages**: Route-level components (`src/pages/`) - **Components**: Reusable UI components (`src/components/`) - **Hooks**: Custom React hooks for state management (`src/hooks/`) - **Context**: Global state providers (`src/context/`) - **Utils**: Utility functions (`src/utils/`) Key patterns: - State management using React hooks and context - API calls centralized in `src/api/` - TypeScript for type safety throughout - Tailwind CSS for styling with custom design tokens ### Backend Architecture The backend follows a traditional MVC pattern: - **Routes**: API endpoints in `src/index.ts` - **Models**: Prisma schema definitions - **Services**: Business logic (can be extracted to separate files) - **Middleware**: CORS, JSON parsing, etc. Real-time features: - Socket.io for WebSocket connections - Room-based collaboration - Presence tracking - Cursor position broadcasting ### Data Flow 1. **Drawing Creation**: Frontend → API → Database 2. **Real-time Updates**: Frontend → Socket.io → Other Frontends 3. **Data Persistence**: Regular API calls for saving state 4. **File Management**: Frontend → API → Database (as JSON) ## Contributing ### Pull Request Process 1. **Ensure all tests pass** 2. **Update documentation** if needed 3. **Add commit messages** following conventional commits 4. **Request review** from maintainers ### Commit Message Format ``` type(scope): description feat(auth): add user authentication fix(editor): resolve drawing save issue docs(api): update endpoint documentation ``` Types: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore` ## Resources - [Excalidraw Documentation](https://docs.excalidraw.com/) - [Prisma Documentation](https://www.prisma.io/docs/) - [React Documentation](https://react.dev/) - [Socket.io Documentation](https://socket.io/docs/) - [Tailwind CSS Documentation](https://tailwindcss.com/docs) - [Vite Documentation](https://vitejs.dev/guide/) _This documentation is maintained alongside the codebase. Please update it when making significant architectural changes._