# Excalidraw FULL - Project Gap Analysis Date: 2026-04-24 Scope: Compare current implementation against `project.md` spec and `plus-roadmap.md` --- ## Status Overview | Milestone | Status | |-----------|--------| | Phase 1: Core auth + session | Done | | Phase 2: Team + drawing model | Done | | Phase 3: Revisions + permissions | Done | | Phase 4: Dashboard + file browser | Done | | Phase 5: Search + command palette | Done | | Phase 6: Release readiness | Done (core) | --- ## Backend: What Is Working - **Auth**: Password + bcrypt(12), session cookies, GitHub OAuth, OIDC - **Teams**: Create, list, members, invites, accept - **Drawings**: CRUD + archive, team-scoped, permission checks - **Revisions**: Immutable snapshots with content_hash, auto-save API ready - **Permissions**: Explicit grants + inheritance matrix - **Share links**: Token-based, unauthenticated read works - **Embeds**: URL validation rejects unsafe schemes - **Activity feed**: Full audit trail with actor hydration - **Templates**: 4 system templates seeded (empty, kanban, flowchart, meeting) - **Stats**: `WorkspaceStats` API computes real counts (teams, members, projects, folders, drawings, templates, revisions, assets, storage_bytes) - **Tests**: 11 tests, all pass (auth, team access, drawing CRUD, revisions, sharing, embeds) - **Security headers**: CSP, X-Frame-Options, HSTS, Referrer-Policy, Permissions-Policy - **Rate limiting**: Auth endpoints 10 req / 15 min per IP --- ## Backend: Critical Gaps | Gap | Severity | Detail | |-----|----------|--------| | **SQLite only** | P1 | Spec says PostgreSQL target. Schema is SQLite-specific (`?` placeholders). No migration path. | | **No thumbnail generation** | P2 | Column `thumbnail_asset_id` exists but unused. | | **No i18n backend** | P3 | Spec requires locale-aware API. Currently hardcoded English errors. | ## Backend: Fixed in this cycle | Gap | Status | Notes | |-----|--------|-------| | Env validation on boot | Fixed | `JWT_SECRET` fail-fast added; `STORAGE_TYPE`, OAuth/OIDC completeness validated | | Old anonymous document routes | Fixed | `/api/v2/*` routes removed from `main.go` | | CORS on Socket.IO | Fixed | `opts.SetCors` now uses `strings.Join(allowedOrigins(), ",")` | | No search endpoints | Fixed | `SearchDrawings` in store + `/api/search` handler wired to Header | | No permission matrix tests | Fixed | 4 test suites covering role × resource × action matrix, admin management, non-member isolation, inheritance | --- ## Frontend: What Is Working - **Vite + React + TypeScript** build pipeline - **Routing**: Dashboard, FileBrowser, Editor, TeamSettings, UserSettings, Templates, Auth - **Zustand stores**: authStore, drawingStore, teamStore - **API layer**: Typed fetch wrapper for all workspace endpoints - **Editor**: Excalidraw canvas with auto-save via revisions API - **Dashboard**: Lists real drawings, create button works, user greeting - **FileBrowser**: Page scaffold exists - **Auth pages**: Login + signup with API integration --- ## Frontend: Fixed in this cycle | Gap | Status | Notes | |-----|--------|-------| | i18n missing | Fixed | `react-i18next` + `i18next-browser-languagedetector` wired; all UI strings extracted to `en.json` | | Dashboard stats hardcoded | Fixed | Dashboard wired to `/stats` API via `useStats` hook | | URL structure flat | Fixed | Added `/folder/:folderId/drawing/:drawingId` route | | No revision browser in Editor | Fixed | Collapsible panel with click-to-restore per revision | | No command palette | Fixed | Global `Cmd/Ctrl+K` modal with fuzzy command search | | No dark mode toggle | Fixed | `useThemeStore` (Zustand persist) + `data-theme="dark"` CSS variables | | No search endpoints | Fixed | `/api/search?q=` endpoint + live Header search dropdown | ## Frontend: Remaining Gaps | Gap | Severity | Detail | |-----|----------|--------| | **No responsive layout tested** | P2 | CSS modules exist, no mobile breakpoint verification. | | **No a11y audit** | P2 | No ARIA labels on custom components. | | **No template gallery creation** | P2 | Can list templates, cannot create user/team templates. | --- ## Docs / DevEx Gaps | Gap | Severity | Detail | |-----|----------|--------| | **No CONTRIBUTING.md** | P3 | No contributor guidelines or development setup docs. | ## Docs / DevEx: Fixed in this cycle | Gap | Status | Notes | |-----|--------|-------| | README outdated | Fixed | Rewritten to describe production-grade visual workspace | | No Makefile | Fixed | `make build`, `make test`, `make dev`, `make docker-up` targets | | .env.example Chinese text | Fixed | Removed all Chinese text, now all-English | | docker-compose.yml | Fixed | Uses `excalidraw-full.Dockerfile`, proper volume mounts | | Dockerfile | Fixed | Multi-stage: Node frontend + Go backend, embeds dist into binary | | No CONTRIBUTING.md | Fixed | Created with dev setup, build/test instructions, and conventions | | No OpenAPI spec | Fixed | Full spec in `openapi.yaml` with all 40+ endpoints and schemas | | No generated TS client | Fixed | `make generate-api-client` target using `openapi-typescript` | --- ## `plus-roadmap.md` Integration Backlog items that align with spec and can be prioritized: | Item | Status | Action | |------|--------|--------| | Nesting with folders | Partial | Schema exists, UI thin. | | Shared library | Not started | Could use `workspace_templates` + `scope=team`. | | SSO | Partial | OIDC already wired in auth.go. | | Better scene filtering | Not started | Requires search backend. | | Command palette for whole app | Done | Global `Cmd+K` modal wired with navigation commands | | Self-hosting | Done | Multi-stage Dockerfile builds new React frontend, embeds into Go binary | In Progress items partially done: | Item | Status | |------|--------| | Fulltext search | Done | `/api/search?q=` backend + live Header dropdown | | Versioning | Done | Revision browser panel in Editor with click-to-restore | | Public API | Done | OpenAPI spec in `openapi.yaml`; TS client via `make generate-api-client` | --- ## Recommendations ### Immediate (this session) 1. Fix `.env.example` (remove Chinese, add all vars) — Done 2. Rewrite `README.md` to match new product vision — Done 3. Add `Makefile` with build/test/dev targets — Done 4. Fix `docker-compose.yml` to build local image — Done 5. Fix `Dockerfile` to build new React frontend — Done 6. Wire Dashboard stats to real `/stats` API — Done 7. Update routing: `/folder/:folderId/drawing/:drawingId` — Done 8. Add env validation on boot — Done 9. Remove/deprecate old anonymous document routes — Done 10. Cleanup `.gitignore` — Done ### Short term (completed) 1. Add `react-i18next` foundation, extract all hardcoded strings — Done 2. Add revision browser in Editor — Done 3. Add command palette foundation — Done 4. Add env validation for all required vars — Done 5. Dark mode toggle on app shell — Done ### Remaining for full release readiness 1. Add responsive layout verification 2. Add ARIA labels / a11y audit 3. Template gallery creation (user/team templates) 4. PostgreSQL migration (keep SQLite for dev via build tag) 5. Thumbnail generation pipeline 6. Frontend unit / E2E tests (Playwright/Vitest) --- ## Test Coverage | Layer | Coverage | Note | |-------|----------|------| | workspace/http_test.go | auth, team access, drawing CRUD, revisions, templates, activity, health | 11 tests, all pass | | workspace/oauth_test.go | OAuth identity upsert | 1 test | | workspace/sharing_test.go | invites, grants, share links, embed URL validation, assets, links | 4 tests | | workspace/permissions_test.go | role × resource × action matrix, admin mgmt, non-member isolation, inheritance | 4 suites | | Frontend tests | None | No test framework configured | | E2E tests | None | No Playwright/Cypress | --- ## Verdict **Current milestone: ~Milestone 3.0** — Backend domain model, auth, permissions, API, and core frontend features (i18n, search, command palette, revision browser, dark mode) are production-grade. Remaining gaps: OpenAPI spec, responsive testing, a11y, template gallery, and frontend test coverage. Release-ready for self-hosting with Docker.