A modern, desktop todo application built with React, TypeScript, Tailwind CSS, and Tauri.
- ✅ Clean, modern UI with light/dark theme support
- ✅ Task management with priorities and due dates
- ✅ Dashboard view for today's tasks
- ✅ Recurring tasks - daily, weekly, monthly patterns
- ✅ Search, filter, and sort - find tasks quickly
- ✅ SQLite database persistence
- ✅ Task attachments - attach files to tasks
- ✅ Projects/categories - organize tasks by project
- ✅ System notifications - reminders for due tasks
- ✅ System tray - quick access menu
- ✅ Auto-start option - launch on system boot
- ✅ Backup & restore - timestamped database backups
- ✅ Import/Export - JSON data portability
- ✅ Accessible components with keyboard navigation
- ✅ Smooth animations with Framer Motion
- ✅ Micro-interactions and hover effects
- ✅ Empty state illustrations
- ✅ Offline support with local persistence
- Frontend: React 18 + TypeScript
- Build Tool: Vite
- Styling: Tailwind CSS
- UI Components: Radix UI primitives
- State Management: Zustand
- Routing: React Router
- Animations: Framer Motion
- Desktop: Tauri
- Testing: Vitest
- Linting/Formatting: ESLint + Prettier
- Node.js 18+ and npm
- Rust (for Tauri) - Install Rust
- For Windows: Microsoft C++ Build Tools
After installing Rust, you need to add Cargo to your PATH:
Option 1: Windows GUI (Recommended)
- Press
Win + X→ Select "System" - Click "Environment Variables"
- Under "User variables", select "Path" → Click "Edit"
- Click "New" → Add:
C:\Users\YOUR_USERNAME\.cargo\bin - Click "OK" on all dialogs
- Restart PowerShell for changes to take effect
Option 2: PowerShell (Permanent)
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";$env:USERPROFILE\.cargo\bin", "User")Then restart PowerShell.
Verify installation:
cargo --versionIf you still get "program not found" errors:
The project includes wrapper scripts (run-tauri-dev.cmd and run-tauri-build.cmd) that automatically add Cargo to PATH before running Tauri commands. These are used by the npm scripts automatically.
The app includes placeholder icons. To create custom branded icons:
Generate icons in the following sizes:
- Windows: 32x32, 128x128, 256x256 (ICO format)
- macOS: 128x128, 256x256, 512x512, 1024x1024 (ICNS format)
- Linux: 32x32, 128x128, 256x256, 512x512 (PNG format)
- Create a source icon (1024x1024 PNG with transparency)
- Save it as
app-icon.pngin the project root - Run the icon generator:
npm run tauri icon app-icon.pngThis will automatically generate all required icon formats and place them in src-tauri/icons/.
Alternatively, manually create and place icons in src-tauri/icons/:
icon.ico(Windows)icon.icns(macOS)icon.png,128x128.png,128x128@2x.png, etc. (Linux)
The tauri.conf.json file references these icons and they'll be bundled with your app builds.
npm installWeb only (Vite dev server):
npm run devOpens at http://localhost:5173
Desktop app (Tauri):
npm run tauri:devThis will start the Vite dev server and launch the Tauri desktop app.
Web build:
npm run buildDesktop app build:
npm run tauri:buildNote: For cross-platform builds (e.g., building Windows app on macOS or Linux), you may need to:
- Install cross-compilation toolchains
- Use GitHub Actions or similar CI/CD
- Or build on the target platform directly
The built app will be in src-tauri/target/release/
npm run lint # Run ESLint
npm run format # Format code with Prettier
npm run format:check # Check formatting without fixing
npm run test # Run tests with Vitest
npm run test:ui # Run tests with UI/
├── src/
│ ├── api/ # Tauri API adapter
│ ├── components/ # Reusable UI components
│ ├── pages/ # Page components
│ ├── store/ # Zustand state management
│ ├── utils/ # Utility functions and hooks
│ ├── App.tsx # Main app component with routing
│ └── main.tsx # Entry point
├── src-tauri/
│ ├── src/
│ │ ├── main.rs # Tauri setup, tray, command registration
│ │ ├── db.rs # Database connection & migrations
│ │ ├── commands.rs # Task/project/backup/import/export commands
│ │ ├── notifications.rs # Notification helpers
│ │ └── attachments.rs # File copy helper
│ └── migrations/ # SQL migration files
├── package.json
└── README.md
✅ SQLite database with migrations ✅ Task CRUD via Tauri commands ✅ Project management ✅ Subtasks support ✅ File attachments ✅ System notifications ✅ System tray with quick actions ✅ Auto-start toggle (setting stored, OS implementation pending) ✅ Backup/restore functionality ✅ Import/export JSON ✅ Settings page with all controls
The SQLite database and all app data are stored in your OS-specific app data directory:
- Windows:
%APPDATA%\com.todoapp.dev\ - macOS:
~/Library/Application Support/com.todoapp.dev/ - Linux:
~/.local/share/com.todoapp.dev/
Files:
todo.db- Main SQLite databasebackups/- Timestamped database backupsattachments/- Task attachment files
Create Backup:
- Go to Settings page
- Click "Create Backup"
- A timestamped copy of your database will be saved in the
backups/folder
Restore Backup:
- Go to Settings page
- Click "Restore from Backup"
- Select a
.dbfile from the backups folder - Confirm the restore (this replaces your current database)
- Restart the app to see restored data
Note: The app creates a backup of your current database before restoring, saved as todo.db.bak.
Export Data:
- Go to Settings page
- Click "Export Data (JSON)"
- Choose a location to save the JSON file
- The export includes: tasks, projects, subtasks, attachments metadata, and settings
Import Data:
- Go to Settings page
- Click "Import Data (JSON)"
- Select a previously exported JSON file
- Confirm the import (merges or replaces existing data by ID)
- The app will reload to show imported data
Import Format:
{
"tasks": [...],
"projects": [...],
"subtasks": [...],
"attachments": [...],
"settings": {...},
"exported_at": 1234567890
}Database not found or corrupted:
- The app will automatically create a new database on first run
- If you see errors, delete the
todo.dbfile and restart the app - Your data will be reset, but you can restore from a backup if available
Migrations fail:
- Check that
src-tauri/migrations/folder exists with SQL files - In development, migrations are read from
src-tauri/migrations/ - In production, they should be bundled with the app
- Check Settings to ensure notifications are enabled
- On Windows/macOS, verify system notification permissions
- Notifications check for due tasks on app startup and when tasks are updated
- On Linux, ensure your desktop environment supports system trays
- The tray icon appears in your system's notification area
- Right-click the icon to access the menu
- Verify the app has write permissions to the app data directory
- Check disk space availability
- Attachments are stored in
attachments/{task_id}/subdirectories
- Tauri logs: Check the console output when running
npm run tauri:dev - Database errors: Displayed in the app UI and console
- File operation errors: Check browser console for frontend errors
App won't start:
- Ensure Rust toolchain is installed:
rustc --version - Run
npm installto ensure dependencies are installed - Check that port 5173 is available for the dev server
Build fails:
- On Windows: Install Microsoft C++ Build Tools
- Ensure all Rust dependencies compile:
cd src-tauri && cargo build - Check
tauri.conf.jsonfor correct paths
Data not persisting:
- Verify the app data directory is writable
- Check that migrations ran successfully (should happen automatically)
- Look for database file in app data directory
The app includes:
- Keyboard navigation support
- ARIA labels and roles
- Focus management in modals
- Semantic HTML structure
- High contrast support (via theme)
To test your app in development mode:
npm run tauri:devTo create optimized production builds for distribution:
npm run tauri:buildThis command will:
- Build the optimized React frontend (
npm run build) - Compile the Rust backend with optimizations
- Create platform-specific installers
After building, find your installers in:
- Windows:
src-tauri/target/release/bundle/msi/(.msi installer) - macOS:
src-tauri/target/release/bundle/dmg/(.dmg installer) - Linux:
src-tauri/target/release/bundle/deb/or/appimage/(.deb or .AppImage)
The build process is configured in src-tauri/tauri.conf.json:
- App name and version: Update
package.productNameandpackage.version - Bundle identifier: Update
tauri.bundle.identifier(e.g.,com.yourcompany.todoapp) - App icons: Located in
src-tauri/icons/ - Permissions: Configure in
tauri.allowlist
Tauri builds are platform-specific by default. To build for multiple platforms:
Option 1: Build on Target Platform
- Windows: Build on Windows machine
- macOS: Build on macOS machine (requires Xcode Command Line Tools)
- Linux: Build on Linux machine
Option 2: Use GitHub Actions Set up GitHub Actions workflows to build on all platforms automatically. See Tauri's GitHub Actions guide.
For production releases, consider code signing:
Windows:
- Requires a code signing certificate (.pfx)
- Set environment variables:
TAURI_PRIVATE_KEYandTAURI_KEY_PASSWORD - Update
tauri.conf.jsonwith certificate details
macOS:
- Requires Apple Developer account
- Use
codesigntool or configure in Xcode - Notarize your app for Gatekeeper
Linux:
- Code signing is optional but recommended
- Can use GPG keys for package signing
To enable automatic updates in future releases:
- Set up a release server or use GitHub Releases
- Configure
tauri.updaterintauri.conf.json - Implement update checking in your app
For now, users can manually download new versions from your releases page.
Direct Distribution:
- Host installers on your website or file sharing service
- Users download and install manually
GitHub Releases:
- Create a new release on GitHub
- Upload the generated installers as release assets
- Users download from the Releases page
App Stores (requires additional setup):
- Microsoft Store: Submit the .msix bundle
- Mac App Store: Submit through App Store Connect
- Linux Repositories: Submit to distro-specific repositories
- Windows: Windows 10 or later (64-bit)
- macOS: macOS 10.15 (Catalina) or later
- Linux: Modern distributions with GTK 3.0+
This is a personal project, but suggestions and improvements are welcome!
MIT