# Contributing to Excalidraw FULL ## Development Setup ### Prerequisites - Go 1.23+ - Node.js 20+ - npm or pnpm - Docker (optional, for containerized builds) ### Quick Start ```bash # 1. Clone and enter the repo git clone cd excalidraw-full # 2. Copy environment file cp .env.example .env # Edit .env and set JWT_SECRET (required) # 3. Install frontend dependencies and start dev servers cd frontend && npm ci # Terminal 1 — Go backend go run . # Terminal 2 — Vite frontend cd frontend && npm run dev # Or use Docker for a one-command setup: make docker-up ``` ### Build & Test ```bash # Build everything (frontend + Go binary) make build # Run all tests make test # Docker build make docker-up ``` ## Project Structure ``` . ├── main.go # Go server entrypoint ├── workspace/ # Core domain: models, store, HTTP handlers, tests │ ├── models.go │ ├── store.go │ ├── http.go │ └── *_test.go ├── middleware/ # Auth, security headers, rate limiting ├── frontend/ # React + Vite frontend │ ├── src/ │ │ ├── pages/ # Dashboard, Editor, Auth, Settings, etc. │ │ ├── components/ # Reusable UI (Button, Card, Input, etc.) │ │ ├── stores/ # Zustand state management │ │ ├── services/ # API client │ │ ├── i18n/ # Translation files │ │ └── styles/ # Global SCSS + CSS variables │ └── package.json ├── excalidraw-full.Dockerfile # Multi-stage production build ├── docker-compose.yml └── Makefile ``` ## Adding a New API Endpoint 1. Define the request/response structs in `workspace/models.go`. 2. Add the store method in `workspace/store.go`. 3. Add the HTTP handler in `workspace/http.go`. 4. Wire the route in `main.go` under the `/api` router. 5. Add tests in `workspace/http_test.go`. ## Frontend Conventions - **Styling**: SCSS modules + CSS custom properties (`variables.scss`). - **State**: Zustand with `persist` middleware for cross-session state. - **Icons**: Lucide React. - **i18n**: All user-facing strings must use `react-i18next` (`t('key')`). Add new keys to `frontend/src/i18n/locales/en.json`. ## Testing - **Backend**: `go test ./...` (all tests run against an in-memory SQLite database). - **Frontend**: `cd frontend && npm test` runs Vitest. Playwright E2E tests can be added with `npm init playwright@latest`. ## Code Style - Go: `gofmt` + standard library first. - TypeScript: Strict mode enabled. Prefer explicit types over `any`. ## Security - Never hardcode secrets. Use environment variables. - Auth changes must not weaken the permission matrix (see `workspace/permissions_test.go`). - CORS origins must be explicit — wildcard (`*`) with credentials is forbidden. ## Commit Messages Follow [Conventional Commits](https://www.conventionalcommits.org/): ``` feat: add fulltext search endpoints fix: correct CORS origin wildcard on Socket.IO docs: update README with Docker instructions ```