An unofficial multi-board manager for Excalidraw - manage multiple drawing boards without losing access to old ones.
- Multiple Boards: Create, rename, duplicate, and delete drawing boards
- Auto-Save: Your drawings are automatically saved locally
- Cross-Platform: Works on Windows, macOS, and Linux
Before building, ensure you have the following installed:
- Rust: Install from rustup.rs
- Node.js: Version 24+ from nodejs.org
- Visual Studio Build Tools: Install "Desktop development with C++" workload from Visual Studio Installer
The project includes helper scripts that set up the Visual Studio environment automatically:
# Install dependencies first
pnpm install
# Run in development mode
pnpm tauri dev# Build for production
pnpm tauri build
# Build MSIX
pnpm tauri:windows:build --arch "x64,arm64" --runner pnpmFor deterministic system-test runs, you can enable test mode:
TAURI_TEST_MODE=1enables deterministic import/export paths and test data isolation.TAURI_TEST_RUN_ID(optional) isolates each run into its own data subdirectory.TAURI_TEST_EXPORT_PATHandTAURI_TEST_IMPORT_PATH(optional) override deterministic file paths.
Windows PowerShell example:
$env:TAURI_TEST_MODE = "1"
$env:TAURI_TEST_RUN_ID = "local-smoke"
pnpm tauri devThe system tests live in a self-contained project under e2e/ with their
own package.json and lockfile, following the
official Tauri WebDriver example.
Run the system suite from the repository root:
pnpm test:systemThis installs the e2e dependencies (if needed) and runs the suite. You can
also run it directly inside the project:
pnpm --dir e2e install
pnpm --dir e2e testThe WebdriverIO config builds the Tauri debug binary automatically
(tauri build --debug --no-bundle) before starting the tests, and by default
each run uses an isolated data folder that is cleaned up when the suite
finishes.
Prerequisites:
- Install
tauri-driver:cargo install tauri-driver --locked - On Windows, ensure a matching
msedgedriveris onPATH(in CI this is installed viamsedgedriver-tool) - On Linux, install
webkit2gtk-driverand run underxvfb(see the CI workflow)
In CI, the system tests run on a matrix of ubuntu-latest and windows-latest.
The Linux run (Tauri's canonical WebDriver path) is the authoritative, blocking
check. The Windows run is kept for diagnostics but is non-blocking, because
creating a WebView2 WebDriver session hangs on the GitHub-hosted Windows image
even when msedgedriver matches the WebView2 Runtime (the suite passes locally
on Windows).
Useful env overrides:
TAURI_TEST_RUN_ID: isolate each run's app data folderTAURI_TEST_DATA_ROOT: custom root folder for system-test dataTAURI_TEST_KEEP_DATA=1: keep run data after test completion (no cleanup)TAURI_TEST_EXPORT_PATH/TAURI_TEST_IMPORT_PATH: deterministic transfer file paths
Current automated scenarios (e2e/specs/system.e2e.mjs):
- Smoke flow (create board + open/close settings)
- Board lifecycle (create, rename, duplicate)
- Board persistence across app restart (
browser.reloadSession) - Settings persistence across app restart (
browser.reloadSession)
Board Management: The app stores board metadata and data in your system's app data directory
ExcaStoneBoard/
├── src/ # React frontend
│ ├── components/ # UI components
│ ├── hooks/ # React hooks
│ └── types/ # TypeScript types
├── src-tauri/ # Rust backend
│ ├── src/ # Rust source code
│ └── tauri.conf.json # Tauri configuration
└── README.md