29 KiB
Excalidraw FULL Overhaul Plan
Version: 0.1
Owner: TDvorak
Goal: Turn excalidraw-full from a simple self-hosted drawing app into a secure, production-grade visual workspace with native file management, teams, permissions, templates, collaboration, and linkable canvases.
1. Product Direction
Core positioning
This should stop behaving like a hacked-together Excalidraw wrapper and become a real product:
- visual canvas first
- self-hosted by default
- backend-owned persistence only
- team collaboration native
- file/folder/project management built in
- secure sharing and permissioning
- activity history and auditability
- templates and structured productivity tools
- rich linking between canvases, folders, files, and embedded content
Product statement
A self-hosted visual workspace for drawing, planning, mapping, charting, and lightweight product/project management, built around a fast collaborative canvas.
What stays
- the canvas remains the main experience
- freeform drawing remains central
- collaborative creativity stays frictionless
What changes
- storage becomes backend-only
- browser/local save paths are removed
- every drawing becomes a first-class resource with URL, metadata, permissions, history, and relationships
- dashboard/file management becomes a first-class part of the app
- auth and team management become native
- sharing becomes structured instead of ad hoc
- security is treated seriously instead of as an afterthought
2. Main Problems To Fix
2.1 Product issues
- mixed product identity
- references to external branded variants and unrelated links
- non-native save flows
- weak drawing organization
- poor URL/resource model for drawings
- unclear collaboration model
- limited permissions
- no true teams/projects/folders
- no serious templates system
- weak metadata and linking
2.2 Technical issues
- likely weak separation between frontend canvas state and persistent backend state
- likely overreliance on client-side assumptions
- unclear access control boundaries
- probably inconsistent resource ownership logic
- potential unsafe file handling
- likely weak validation for embeds and URL inputs
- probably no proper audit/history model
- likely incomplete internationalization foundation
- likely brittle auth/session implementation
2.3 Security issues
These are the areas that must be assumed risky until proven otherwise:
- weak or inconsistent auth flows
- insecure session/JWT handling
- poor authorization checks at API layer
- unrestricted or unsafe file uploads
- weak sharing token design
- missing CSRF protection where relevant
- XSS risk through embeds, markdown-like fields, titles, comments, link previews
- SSRF risk from arbitrary embed or remote fetch features
- path traversal risk if saving to local files
- privilege escalation through team/folder/drawing permission inheritance bugs
- missing audit trails
- insecure defaults
- insufficient rate limiting and abuse controls
3. Product Scope for the Overhaul
3.1 Must-have v2 scope
- remove all Chinese text and hardcoded language strings
- full i18n support
- remove all Excalidraw+ references and branding leaks
- new canonical URL model for drawings
- backend-only persistence
- dashboard
- folders/files/projects
- shareable resources with permission settings
- team support
- invites
- auth methods: GitHub + email/password + invitations
- activity history
- templates
- robust embed system
- better collaboration model
- stats and management layer
- security hardening across the stack
3.2 Nice-to-have after stabilization
- comments
- mentions
- notifications
- presence indicators
- approval/review flows
- version compare/diff
- drawing backlinks and graph view
- per-team branding
- API/webhooks
- import/export pipelines
- AI-assisted template generation
- analytics dashboard per team/project
4. Product Architecture Direction
4.1 High-level architecture
Split the system into clean domains:
web-app- dashboard
- auth UI
- drawing UI
- file/folder management
- sharing/admin settings
api- auth/session
- drawings
- folders/projects
- permissions
- templates
- embeds
- activity/history
- collaboration metadata
realtime- presence
- cursors
- live collaboration events
storage- local filesystem-backed asset storage
- snapshots
- thumbnails
- exports
db- relational data source for all metadata and permissions
4.2 Recommended stack direction
If the current project stack is messy, do not keep bad patterns just because they already exist.
Recommended direction:
- frontend: keep current UI stack if stable enough, but clean the app architecture hard
- backend: typed API with explicit validation
- database: PostgreSQL
- file storage: local filesystem on server, managed only through backend
- auth: session-based auth preferred over raw JWT-in-browser-only flows
- realtime: WebSocket layer or equivalent event transport
- queue/background jobs:
- thumbnail generation
- cleanup
- activity aggregation
- notifications later
4.3 Why PostgreSQL over SQLite
If this is meant to become team software, SQLite is the wrong long-term default.
Use PostgreSQL because:
- safer concurrency model
- better indexing
- row-level locking semantics
- more robust migrations
- future analytics and activity history become sane
- better for teams, sharing, revisions, permissions, and audit events
SQLite can remain for dev only if needed.
5. New Domain Model
5.1 Core entities
- User
- AuthIdentity
- Session
- Team
- TeamMembership
- Invite
- Project
- Folder
- Drawing
- DrawingRevision
- DrawingAsset
- Template
- ShareLink
- PermissionGrant
- ActivityEvent
- Comment
- Embed
- LinkReference
- Tag
5.2 Entity overview
User
Represents a human account.
Fields:
- id
- name
- username
- avatar_url
- status
- locale
- timezone
- created_at
- updated_at
AuthIdentity
Supports multiple auth providers.
Fields:
- id
- user_id
- provider (
github,password, later others) - provider_user_id
- password_hash_nullable
- email_verified_at
- created_at
Team
Organization/group boundary for collaboration.
Fields:
- id
- name
- slug
- owner_user_id
- plan_type
- created_at
- updated_at
TeamMembership
Fields:
- id
- team_id
- user_id
- role (
owner,admin,editor,viewer,billingmaybe later) - joined_at
Project
Optional top-level workspace grouping under a team.
Fields:
- id
- team_id
- name
- slug
- description
- created_by
- created_at
- updated_at
Folder
Hierarchical grouping unit.
Fields:
- id
- team_id
- project_id_nullable
- parent_folder_id_nullable
- name
- slug
- path_cache
- visibility
- created_by
- created_at
- updated_at
Drawing
The primary first-class canvas resource.
Fields:
- id (UUID)
- team_id
- folder_id_nullable
- project_id_nullable
- slug_nullable
- title
- description
- owner_user_id
- latest_revision_id
- visibility (
private,team,restricted,public-link) - is_archived
- thumbnail_asset_id_nullable
- created_at
- updated_at
- deleted_at_nullable
DrawingRevision
Immutable version history.
Fields:
- id
- drawing_id
- revision_number
- snapshot_path
- snapshot_size
- content_hash
- created_by
- created_at
- change_summary_nullable
DrawingAsset
Stored files attached to drawings.
Fields:
- id
- drawing_id
- kind (
image,export,attachment,thumbnail) - path
- mime_type
- size
- width_nullable
- height_nullable
- uploaded_by
- created_at
Template
Reusable starter resource.
Fields:
- id
- team_id_nullable
- scope (
system,team,personal) - type (
todo,kanban,brainstorm,flowchart,meeting-notes,architecture, etc.) - name
- description
- snapshot_path
- metadata_json
- created_by
- created_at
- updated_at
ShareLink
Controlled external access.
Fields:
- id
- resource_type (
drawing,folder, maybeproject) - resource_id
- token_hash
- permission (
view,comment,edit) - expires_at_nullable
- password_hash_nullable
- created_by
- revoked_at_nullable
- created_at
PermissionGrant
Explicit resource permissions.
Fields:
- id
- resource_type
- resource_id
- subject_type (
user,team,link) - subject_id
- permission (
view,comment,edit,manage,share,invite) - inherited_from_nullable
- created_at
ActivityEvent
Audit/history.
Fields:
- id
- actor_user_id_nullable
- team_id_nullable
- resource_type
- resource_id
- event_type
- metadata_json
- created_at
Embed
Metadata for external embedded content.
Fields:
- id
- drawing_id
- source_url
- canonical_url
- provider
- embed_type
- title_nullable
- preview_asset_id_nullable
- safe_embed_html_nullable
- created_by
- created_at
LinkReference
Cross-resource linking.
Fields:
- id
- source_resource_type
- source_resource_id
- target_resource_type
- target_resource_id
- label_nullable
- created_by
- created_at
6. Routing and URL Model
6.1 New canonical routes
Use human-usable and system-stable URLs.
Examples:
/drawing/:drawingId/d/:drawingId/team/:teamSlug/folder/:folderPath/team/:teamSlug/project/:projectSlug/team/:teamSlug/drawing/:drawingId/shared/:shareToken
Recommended primary route:
/drawing/:drawingId
Optional SEO/friendly variant:
/drawing/:drawingId-:slug
Important rule:
- ID is canonical
- slug is cosmetic
- route resolution must never break if title changes
6.2 Folder routes
For nested folders:
/team/:teamSlug/f/:folderPath
Need a path resolver that maps slug chains to folder IDs safely.
6.3 Link stability rules
- drawing links never change because title changed
- folder/project slugs may redirect if renamed
- shared links are token-based and revocable
- public access must never expose internal numeric IDs
7. Storage Model
7.1 Storage strategy
Remove browser/local persistence options from the product UI.
Only support:
- backend-managed canonical storage
- explicit export/import as secondary operations
7.2 What should be stored server-side
- drawing document snapshots
- revisions
- thumbnails
- exports
- uploaded assets
- template snapshots
- embed preview metadata
- activity metadata
- optional collaboration event logs if needed
7.3 Filesystem layout
Do not dump random files in flat folders. That becomes garbage fast.
Example:
/data/users/...only if truly needed/data/teams/{team_id}/drawings/{drawing_id}/revisions/{revision_id}.json/data/teams/{team_id}/drawings/{drawing_id}/assets/{asset_id}/data/teams/{team_id}/drawings/{drawing_id}/thumbnails/{asset_id}.webp/data/templates/{template_id}/snapshot.json
7.4 Storage rules
- all file reads/writes only through backend service
- never trust user-provided path names
- generate internal storage paths server-side
- validate MIME type and content
- enforce size limits
- generate safe filenames
- store original metadata separately from path
8. Auth and Identity
8.1 Required auth methods
- GitHub OAuth
- email/password
- invite-based onboarding
8.2 Recommended auth model
Use secure server-side sessions with httpOnly cookies where possible.
Avoid:
- spraying long-lived bearer tokens around the browser
- mixing weak custom auth with OAuth hacks
8.3 Required features
- email verification for password accounts
- password reset
- invite acceptance
- linking multiple auth methods to one account
- team invites
- session revocation
- device/session management
8.4 Security requirements
- Argon2id or bcrypt with sane parameters for passwords
- short-lived session tokens with rotation
- secure cookie flags
- CSRF protection for cookie-authenticated mutations
- brute-force protection
- rate limiting for login, reset, invite endpoints
9. Authorization Model
9.1 Permission goals
Permissions must be explicit and predictable, not “hope the frontend hides the button”.
9.2 Resource scopes
Permissions should exist at:
- team
- project
- folder
- drawing
- share link
9.3 Role model
Baseline team roles:
- owner
- admin
- editor
- viewer
Resource-level permissions:
- view
- comment
- edit
- manage
- share
- invite
9.4 Inheritance
Suggested inheritance:
- team permissions flow down by default
- project/folder can narrow or extend access
- drawing can override within allowed rules
Need deterministic permission resolution:
- deny if user suspended / revoked
- team membership baseline
- resource-specific grants
- inherited grants
- share-link constraints
- owner/admin override
9.5 Important warning
Permission inheritance bugs will become one of the nastiest classes of bugs in this product. This needs a formal permission resolver with tests, not scattered if statements all over controllers.
10. Collaboration Model
10.1 Realtime collaboration goals
- live cursors
- live drawing edits
- live presence
- optional user attribution
- conflict-safe persistence
10.2 Session model
When user opens drawing:
- authenticate
- authorize access
- join collaboration room bound to drawing ID
- sync latest revision
- stream operations
- periodically snapshot
10.3 Save strategy
Do not save entire document blindly on every tiny event forever.
Recommended:
- live ops in memory/realtime layer
- debounced autosave snapshots
- explicit revision checkpoints
- durable revision creation on important events
10.4 Collaboration metadata
Track:
- who joined
- who modified
- when saved
- current editors
- last activity time
11. Dashboard and File Management
11.1 Dashboard goals
This is one of the most important additions. Without this, it still feels like a toy.
Dashboard should include:
- recent drawings
- recent activity
- favorites
- team overview
- storage usage
- template shortcuts
- folder tree
- owned/shared drawings
- drafts / archived drawings
- collaboration summaries
11.2 File/folder management
Folders must support:
- nested structure
- move
- rename
- archive
- share
- permission management
- folder link
- filter/sort/search
- bulk actions
11.3 Drawing management
Each drawing should support:
- title
- description
- thumbnail
- tags
- owner
- folder
- project
- permissions
- history
- duplicate
- move
- archive
- export
- share
11.4 Search
Must support:
- drawing title
- description
- folder name
- template name
- tags
- maybe content metadata later
12. Templates System
12.1 Template goals
Templates should feel native, not like random example files.
12.2 Template categories
- ToDo board
- Kanban
- Meeting notes
- Brainstorm
- User journey
- Mind map
- Architecture diagram
- Flowchart
- Product roadmap
- Incident response
- Retrospective
- Weekly planning
- Wireframe starter
- Empty structured grid
- Markdown notes block layout
12.3 Template behavior
User can:
- create drawing from template
- save current drawing as template
- browse team templates
- browse system templates
- clone/edit own templates
12.4 Structured widgets
To support your vision, templates should also bring semi-structured content primitives:
- kanban columns
- checklist blocks
- sticky notes
- markdown text areas
- roadmap lanes
- swimlanes
- basic tables
- quick forms
- voting dots
These can start as smart grouped elements, then become richer later.
13. Linking and Knowledge Graph
13.1 Required linking capabilities
Users should be able to:
- link drawing to drawing
- link drawing to folder
- link drawing to project
- link drawing to embed
- add references/backlinks
13.2 Example features
- “related drawings”
- “linked from”
- “linked resources”
- graph view later
- open related drawing from side panel
13.3 Use cases
- architecture diagram linked to implementation board
- task board linked to planning board
- team folder linked to standard template
- roadmap drawing linked to release notes resources
14. Embeds
14.1 Vision
Embeds should work broadly, but not recklessly.
14.2 Hard truth
“Embed any website” is where people accidentally build an SSRF machine, an XSS mess, and a clickjacking liability.
So the design needs two layers:
Safe embed modes
- URL card preview
- iframe embed where target allows framing
- provider-native embed adapters
- screenshot/preview service later if needed
14.3 Initial embed support
Support:
- generic link cards
- iframe embeds for sites that allow it
- provider adapters for known sites
- fallback to link preview if framing blocked
14.4 Security rules for embeds
- sanitize all URLs
- allow only
httpandhttps - block localhost/internal/private IP resolution
- never fetch arbitrary remote URLs server-side without SSRF protections
- sandbox iframes aggressively
- set referrer policy
- disallow dangerous protocols
- strip unsafe HTML
- never trust embed provider content
15. Activity History and Audit
15.1 Goals
Need both user-facing history and admin-grade audit.
15.2 User-facing activity examples
- created drawing
- renamed drawing
- moved drawing
- updated permissions
- shared folder
- joined team
- applied template
- inserted embed
- restored revision
15.3 Audit events
Log:
- login success/failure
- invite sent/accepted/revoked
- role changes
- share link created/revoked
- permission changes
- deletion/archive/restore
- export events if relevant
- admin actions
15.4 Revision history
Need:
- revision list
- restore revision
- compare metadata between revisions
- who changed it
- optional change summary
16. Internationalization
16.1 Goals
- remove all Chinese strings
- no hardcoded text
- proper locale files
- scalable translation workflow
16.2 Requirements
- use message keys everywhere
- locale files per language
- lazy load locales if needed
- support fallback locale
- allow user locale preference
- make date/time/number formatting locale-aware
16.3 Initial languages
- English
- Czech
- maybe Chinese removed initially, re-added only if intentionally translated later
16.4 Important rule
Do not do a dumb search-and-replace translation pass. That always rots. Build proper i18n infrastructure first.
17. Branding and Product Cleanup
17.1 Remove all references to Excalidraw+
- remove links
- remove branding leaks
- remove upsell references
- replace with your own product identity
17.2 Product naming
Decide whether this remains “Excalidraw FULL” internally or becomes a distinct product brand. It should become its own thing if you are serious.
17.3 Visual identity
Need a consistent design system for:
- dashboard
- workspace shell
- folder/file browser
- sharing dialogs
- team management
- analytics widgets
18. Frontend Overhaul
18.1 App shell
Create a proper app shell:
- left nav
- workspace header
- folder/project sidebar
- activity drawer
- detail panel
- command palette
18.2 Main UX sections
- dashboard
- team/project browser
- drawing editor
- templates browser
- settings
- admin/security
- activity/history
- shared resources
18.3 UI/UX requirements
- clean information hierarchy
- not bloated
- drawing remains center stage
- fast loading
- keyboard friendly
- responsive
- accessible
18.4 Critical UX decisions
Do not turn the canvas into a crowded Frankenstein UI. Everything extra must be layered around the canvas, not dumped on top of it.
19. Backend Overhaul
19.1 API domains
Split APIs into modules:
- auth
- users
- teams
- invites
- folders
- drawings
- revisions
- assets
- templates
- permissions
- shares
- activity
- embeds
- admin
19.2 API requirements
- strict input validation
- centralized auth middleware
- centralized permission checks
- typed responses
- consistent error model
- idempotent safe endpoints where needed
- pagination
- sorting/filtering
- audit hooks
19.3 Drawing save API
Need explicit endpoints for:
- create drawing
- load drawing
- autosave drawing
- create revision
- duplicate drawing
- move drawing
- archive/restore drawing
- export drawing
- list drawing history
- restore revision
20. Security Hardening Plan
20.1 Authentication security
- secure password hashing
- secure cookie sessions
- session rotation
- revoke sessions on password reset
- OAuth state validation
- PKCE where applicable
- email verification
- brute-force rate limits
20.2 Authorization security
- centralized permission engine
- no frontend-only authorization assumptions
- every read/write route checks access
- resource ownership checks tested
- no trust in client-submitted team/resource identifiers
20.3 Input validation
Validate:
- titles
- descriptions
- slugs
- URLs
- embed data
- invite payloads
- file metadata
- search params
- filter/sort fields
20.4 XSS protection
- sanitize rich text / markdown-like fields
- escape user-generated content everywhere
- sanitize embeds
- CSP policy
- avoid unsafe HTML rendering
- no blind
dangerouslySetInnerHTMLstyle hacks unless strictly sanitized
20.5 SSRF protection
Critical for embed/link preview systems:
- block private ranges
- block localhost
- block internal metadata endpoints
- DNS rebinding protections where possible
- allowlist protocols
- restrict outbound fetch behavior
20.6 File security
- MIME sniffing and validation
- size limits
- image processing safety
- random internal filenames
- path traversal prevention
- virus scanning optional later
- never execute uploaded content
20.7 CSRF/CORS
- proper CORS policy
- CSRF protection for session-auth mutations
- no wildcard origin nonsense in production
- cookie same-site settings reviewed
20.8 Secrets
- env validation on boot
- no secrets in frontend bundles
- secret rotation process
- secure default config
20.9 Abuse controls
- rate limiting
- invite abuse limits
- share link generation limits
- export abuse limits
- suspicious activity logs
20.10 Audit and observability
- auth audit logs
- security event logs
- failed permission attempts
- structured logs
- error monitoring
- health endpoints
21. Testing Strategy
21.1 Required test layers
- unit tests
- integration tests
- permission matrix tests
- realtime collaboration tests
- e2e tests
- security-focused regression tests
21.2 Must-test areas
- auth flows
- invite flows
- permission inheritance
- share links
- drawing load/save/revision restore
- folder move logic
- team membership changes
- embed sanitization
- file upload validation
- activity logging
21.3 Non-negotiable
Permission matrix tests are mandatory. Without them, this product will leak access sooner or later.
22. Migration Plan
22.1 Phase 0 - Discovery
Goals:
- inspect current codebase
- map architecture
- identify auth/storage/canvas boundaries
- inventory routes and DB models
- document current security risks
- define what gets kept vs replaced
Deliverables:
- system audit
- security audit
- code map
- backlog
- target architecture spec
22.2 Phase 1 - Stabilization
Goals:
- remove dead/bad features
- remove broken save modes
- remove branding leaks
- add env validation
- patch obvious auth/security issues
- add logging
- add test harness
- install i18n foundation
Deliverables:
- stable baseline branch
- CI
- test runner
- basic locale system
- cleaned product copy
22.3 Phase 2 - Data and storage refactor
Goals:
- move to PostgreSQL
- define canonical entities
- backend-owned drawing persistence
- revision model
- asset model
- folder/project model
Deliverables:
- migrations
- new storage adapter
- drawing resource APIs
- filesystem layout
- migration scripts if old data exists
22.4 Phase 3 - Auth and permissions rebuild
Goals:
- proper user accounts
- GitHub + password auth
- invites
- teams
- role model
- permission engine
Deliverables:
- sessions
- auth identity tables
- invite workflow
- team membership APIs
- permission resolver
- tests
22.5 Phase 4 - URL and routing overhaul
Goals:
- drawing URLs
- folder routes
- resource pages
- stable canonical links
Deliverables:
- new router
- route guards
- redirects from old links
- shared/public route flow
22.6 Phase 5 - Dashboard and file management
Goals:
- dashboard shell
- folder tree
- project/folder pages
- drawing management
- search/filter/sort
Deliverables:
- dashboard UI
- recent activity widgets
- file browser
- management actions
22.7 Phase 6 - Collaboration and history
Goals:
- improve live collaboration
- revision history
- activity events
- restore flows
- who-changed-what metadata
Deliverables:
- collaboration room model
- activity feed
- revision browser
- restore action
22.8 Phase 7 - Templates and linking
Goals:
- built-in templates
- user/team templates
- linking between resources
- related content panel
Deliverables:
- template manager
- template gallery
- reference system
- linked resources UI
22.9 Phase 8 - Embeds
Goals:
- safe generic embeds
- provider adapters
- link cards
- sandboxed iframe handling
Deliverables:
- embed service
- preview metadata
- URL validation pipeline
- provider registry
22.10 Phase 9 - Polish and launch hardening
Goals:
- performance pass
- accessibility
- security review
- docs
- deployment scripts
- admin settings
- observability
Deliverables:
- production checklist
- deployment guide
- admin guide
- release candidate
23. Suggested Milestones
Milestone 1 - Secure foundation
Scope:
- code audit
- remove branding leaks
- i18n setup
- env validation
- auth/session cleanup
- logging
- test infra
Milestone 2 - Real resource model
Scope:
- Postgres
- drawings/folders/projects
- backend-only saving
- canonical URLs
- revisions
Milestone 3 - Teams and permissions
Scope:
- users
- teams
- invites
- role model
- access engine
- sharing
Milestone 4 - Dashboard productization
Scope:
- dashboard
- search
- browser
- stats
- management UI
Milestone 5 - Power features
Scope:
- templates
- linking
- history
- embeds
- richer collaboration
24. Engineering Backlog by Priority
P0 - Critical
- full codebase audit
- remove all local/browser save modes from UI and backend
- define canonical drawing resource API
- implement secure auth/session model
- centralized authorization checks
- migrate to Postgres
- add revision storage
- canonical drawing route
- remove product branding leaks
- i18n base
- file storage security hardening
- permission tests
- env validation
- security headers and CSP
- basic audit logs
P1 - High
- dashboard
- folders/projects
- team model
- invites
- share links
- activity feed
- template system
- search/filter/sort
- thumbnails
- collaborative metadata
P2 - Medium
- advanced embeds
- related resources
- graph/backlinks
- comments
- notifications
- export workflows
- analytics widgets
P3 - Later
- admin analytics
- webhooks
- API tokens
- external integrations
- advanced diff tools
- AI helpers
25. Risks
25.1 Biggest technical risks
- current codebase may be architecturally messy
- hard to untangle canvas state from persistence
- permission inheritance complexity
- realtime sync edge cases
- embed security
- migration from current storage model
- UI bloat if dashboard and canvas are not separated properly
25.2 Biggest product risks
- trying to make it Notion, Miro, Jira, and Excalidraw all at once
- overbuilding before stabilizing fundamentals
- killing the simplicity that makes drawing tools good
25.3 How to avoid product failure
Keep the center of gravity clear:
- this is a canvas-first collaboration and planning platform
- not a generic everything app
- structure should support the canvas, not replace it
26. Recommended Delivery Approach
26.1 Build order
Do not start with templates or embeds. That is how teams waste weeks on shiny nonsense.
Correct order:
- audit and stabilize
- auth and permissions
- storage and data model
- canonical URLs
- dashboard and file management
- revisions/activity
- templates
- embeds
- polish
26.2 Repo strategy
Use a serious branch structure:
mainstabilizationauth-permissionsstorage-refactordashboardtemplatesembeds
26.3 Documentation requirements
Maintain:
- architecture.md
- auth.md
- permissions.md
- storage.md
- api.md
- deployment.md
- security.md
- i18n.md
27. Definition of Done
A release is not done because the UI looks better. It is done when all of this is true:
- every drawing has a canonical backend-backed URL
- no browser/local save mode remains in the product flow
- all major actions are permission-checked server-side
- auth supports GitHub, password, invites
- users can organize drawings into folders/projects
- teams and sharing work predictably
- history and revisions exist
- templates exist
- embeds are safe
- i18n is in place
- branding is cleaned
- tests cover auth, permissions, storage, sharing, and revisions
- deployment is documented
- logs and health checks exist
- obvious security holes are closed
28. Final Recommendation
This should be treated as a product rewrite in layers, not a casual cleanup.
Do not try to patch every issue inside the current structure forever. If the current foundation is weak, carve out stable domains and replace the bad guts deliberately.
The smartest path is:
- preserve the canvas experience
- replace the weak product shell around it
- build a serious backend ownership model
- formalize permissions early
- keep the UX clean and sharp
- resist feature creep until the foundation is hard
If done right, this stops being “better self-hosted Excalidraw” and becomes a genuinely useful visual workspace product.