A lightweight Windows system tray todo app. Click the tray icon to open a compact popup — add tasks, check them off, and stay focused.
- Left-click — show the window (anchored bottom-right, above the taskbar); click again to hide it
- Right-click — context menu with Quit
- Click outside the window — auto-hides
- × button — hides the window (app keeps running in the tray)
- ⚙ button — opens the settings panel
- H / M / L buttons — select priority (High / Medium / Low) before adding a task
- Press Enter to add
- Todos are sorted automatically: High → Medium → Low
- Click a task title — enters edit mode
- Rename the task, change notes, and change priority with the H / M / L buttons
- Click outside or Enter in the title field (moves focus to notes) — saves changes
- Escape — cancels and reverts all changes
- Click the circle on a task — marks it done; it moves to the "Recently done" section at the bottom
- Click the checkmark on a recently done task — restores it to the active list
- » button on a task — opens the postpone picker
- Choose a preset (Tomorrow, 3 days, Next week, 2 weeks, Month) or Custom… to pick any date and time
- Postponed tasks appear in the Future tab and return to Tasks automatically when the time is reached
- ↩ button in the Future tab — moves a task back to the active list immediately
- The History tab shows all completed tasks with their completion timestamp
- Tasks that have notes show a dot indicator — click the item to expand and read the notes
- Start with Windows — toggle to launch TodoTray automatically at login
- Recently done — choose how many completed tasks (0–20) are shown at the bottom of the Tasks tab
- Todos are persisted to
%APPDATA%\com.fasterisk.todotray\todos.json - Settings are persisted to
%APPDATA%\com.fasterisk.todotray\settings.json
todotray/
├── src/ # React frontend (Vite + TypeScript)
│ ├── App.tsx # Main UI — todo list, tabs, settings panel
│ ├── App.css # Dark theme styles
│ ├── useTodos.ts # Todo state management + persistence hook
│ ├── useSettings.ts # App settings hook (persisted separately)
│ ├── types.ts # Todo and Priority type definitions
│ ├── index.css # Global styles and CSS variables
│ └── main.tsx # React entry point
├── src-tauri/ # Rust / Tauri backend
│ ├── src/
│ │ ├── lib.rs # Tray icon, window toggle, autostart commands
│ │ └── main.rs # Binary entry point
│ ├── icons/ # App icons + NSIS installer images
│ ├── capabilities/
│ │ └── default.json # Frontend permission grants
│ ├── Cargo.toml
│ ├── build.rs
│ └── tauri.conf.json # App config: window, bundle, installer
├── index.html
├── package.json
├── vite.config.ts
└── tsconfig.json
Only needed once. Run these if not already installed:
winget install OpenJS.NodeJS.LTS
winget install Rustlang.Rustup
winget install Microsoft.VisualStudio.2022.BuildTools
After installing Build Tools, open the Visual Studio Installer, select Visual Studio Build Tools 2022 → Modify, and enable the Desktop development with C++ workload. This provides the MSVC compiler and linker that Rust requires on Windows — the full Visual Studio IDE is not needed.
WebView2 is also required and ships with Windows 11.
Quit the installed app first (right-click tray icon → Quit), then start the dev server with hot reload:
npx tauri dev
The window starts hidden — left-click the tray icon to open it.
Both the dev build and the installed app share the same data files under
%APPDATA%\com.fasterisk.todotray\. Do not run both at the same time.
npx tauri build
This produces an NSIS installer at:
src-tauri/target/release/bundle/nsis/TodoTray_<version>_x64-setup.exe
Run the installer to install the app for the current user (no admin rights required). A Start Menu shortcut is created automatically.
-
Bump the version in three places:
src-tauri/tauri.conf.json"version": "0.2.0"
src-tauri/Cargo.tomlversion = "0.2.0"
package.json"version": "0.2.0"
-
Build the installer:
npx tauri build -
Run the new
TodoTray_0.2.0_x64-setup.exe— NSIS detects the existing installation and upgrades it in-place. No uninstall step needed.