A free, open-source desktop application for managing and editing local Excalidraw files. Built with Tauri for a native desktop experience while maintaining the familiar Excalidraw interface. See 中文说明 for Chinese users.
- 📁 Local File Management: Browse and organize your Excalidraw files directly from your filesystem
- 🎨 Full Excalidraw Editor: Complete drawing and diagramming capabilities with the official Excalidraw editor
- 💾 Auto-Save: Never lose your work with automatic saving every 30 seconds
- 📑 Tab System: Open multiple files as tabs for quick switching between drawings
- 🎯 Presentation Mode: Present your drawings with a built-in laser pointer (F5)
- 🌲 Tree View Navigation: Hierarchical file browser for better organization
- 🎭 Native Menus: Platform-specific menus with keyboard shortcuts (toggleable)
- 🌓 Theme Support: Light, dark, and system theme options with full dark mode UI
- 🖥️ Chromeless Mode: Hide title bar and menus for a distraction-free experience
- 🔒 Security First: Path validation and content sanitization for safe file operations
Download the latest version from the Releases page.
- macOS Apple Silicon: download
ExcaliApp-<version>-macos-arm64.dmg, open it, then drag ExcaliApp into Applications. - Linux x86_64: download
ExcaliApp-<version>-linux-x86_64.AppImage, make it executable, then run it:
chmod +x ExcaliApp-*-linux-x86_64.AppImage
./ExcaliApp-*-linux-x86_64.AppImagemacOS builds currently target Apple Silicon only.
# Clone the repository
git clone https://github.com/tyrchen/excaliapp.git
cd excaliapp
# Install dependencies
npm ci
# Development mode with hot reload
npm run tauri dev
# Build for production
npm run tauri buildThe built application will be in src-tauri/target/release/bundle/
-
Launch the Application: Open ExcaliApp from your applications folder or run the executable
-
Select a Directory:
- On first launch, you'll be prompted to select a folder containing your Excalidraw files
- The app remembers your last selected directory for future sessions
- Use
File > Open Directory(Ctrl/Cmd+O) to change directories anytime
-
Create or Edit Files:
- Click "New File" or use
File > New File(Ctrl/Cmd+N) to create a new drawing - Click any file in the sidebar to open it as a tab
- Your changes are automatically saved every 30 seconds
- Click "New File" or use
-
Navigate Between Files:
- Use the tree view sidebar to browse your file structure
- Open files appear as tabs above the editor
- Click tabs or use Ctrl+Tab to switch between open drawings
-
Present Your Drawings:
- Press F5 to enter presentation mode
- All editing UI is hidden, leaving only your drawing and tabs
- A laser pointer follows your cursor for highlighting content
- Press Escape or F5 again to exit
| Action | macOS |
|---|---|
| New File | Cmd+N |
| Open Directory | Cmd+O |
| Save | Cmd+S |
| Save As | Cmd+Shift+S |
| Toggle Sidebar | Cmd+B |
| Close Tab | Cmd+W |
| Next Tab | Cmd+Tab |
| Previous Tab | Cmd+Shift+Tab |
| Presentation Mode | F5 |
| Exit Presentation | Escape |
| Toggle Title Bar & Menu | Cmd+Shift+D |
| Quit | Cmd+Q |
- Create: Click "New File" button or use menu/shortcut
- Rename: Right-click on a file and select "Rename"
- Delete: Right-click on a file and select "Delete"
- Auto-save: Files are automatically saved every 30 seconds and when switching between files
ExcaliApp includes a presentation mode designed for teaching and presenting diagrams:
- Enter: Press F5 to activate presentation mode
- Laser Pointer: A red laser pointer dot follows your cursor with a fading trail, perfect for highlighting elements during presentations
- Tab Navigation: Tabs remain visible so you can switch between drawings during your presentation
- Clean UI: All editing toolbars, sidebar, and menus are hidden for a distraction-free view
- Exit: Press Escape or F5 again to return to editing
For tiling window managers (Hyprland, i3, Sway) or users who prefer a minimal UI:
- Press Cmd+Shift+D to toggle the title bar and native menus
- This preference persists across sessions
- All functionality remains accessible via keyboard shortcuts
graph TB
subgraph "Frontend (Web Technologies)"
UI[React UI]
EX[Excalidraw Editor]
SM[State Management]
UI --> EX
UI --> SM
end
subgraph "Tauri Bridge"
IPC[IPC Commands]
EV[Event System]
end
subgraph "Backend (Rust)"
FM[File Manager]
SEC[Security Layer]
PREF[Preferences Store]
MENU[Native Menu]
FS[File System]
FM --> SEC
FM --> FS
end
UI <--> IPC
SM <--> IPC
IPC <--> FM
IPC <--> PREF
EV --> UI
FS --> EV
MENU --> IPC
sequenceDiagram
participant User
participant UI as React UI
participant IPC as Tauri IPC
participant Rust as Rust Backend
participant FS as File System
User->>UI: Select file from sidebar
UI->>IPC: invoke('read_file', {path})
IPC->>Rust: read_file command
Rust->>Rust: Validate path security
Rust->>FS: Read file content
FS-->>Rust: File data
Rust->>Rust: Validate JSON content
Rust-->>IPC: Return content
IPC-->>UI: File content
UI->>UI: Load in Excalidraw editor
User->>UI: Edit drawing
UI->>UI: Auto-save timer (30s)
UI->>IPC: invoke('save_file', {path, content})
IPC->>Rust: save_file command
Rust->>Rust: Validate path & content
Rust->>FS: Write file
FS-->>Rust: Success
Rust-->>IPC: Success response
IPC-->>UI: Save confirmed
UI->>UI: Update status
- Desktop Framework: Tauri 2.x - Rust-based framework for building native desktop apps
- Frontend Framework: React 19 with TypeScript
- Drawing Engine: @excalidraw/excalidraw
- Build Tool: Vite
- UI Components: shadcn/ui with Tailwind CSS
- State Management: Zustand with persistent preferences
- Path Traversal Protection: All file paths are validated and canonicalized
- File Type Validation: Only
.excalidrawfiles can be read/written - Content Validation: JSON structure is validated before saving
- Sandboxed File Access: Tauri's security model restricts file system access
excaliapp/
├── src/ # React frontend
│ ├── components/ # React components
│ │ ├── Sidebar.tsx # File browser sidebar
│ │ ├── TreeView.tsx # Hierarchical file tree
│ │ ├── TabBar.tsx # Tab bar for open files
│ │ ├── LaserPointer.tsx # Presentation laser pointer
│ │ └── ExcalidrawEditor.tsx # Editor wrapper
│ ├── hooks/ # Custom React hooks
│ ├── lib/ # Utilities
│ └── App.tsx # Main application
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── main.rs # Entry point
│ │ ├── lib.rs # Core logic & commands
│ │ ├── menu.rs # Native menu setup
│ │ └── security.rs # Security validations
│ └── tauri.conf.json # Tauri configuration
└── package.json # Node dependencies
# Start development server
npm run dev
# Run Tauri in development mode
npm run tauri dev
# Build for production
npm run tauri build
# Type checking
npm run type-check
# Format code
npm run formatContributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
MIT License - see LICENSE file for details
- Excalidraw for the amazing drawing engine
- Tauri for the desktop framework
- The open-source community for continuous inspiration
