Small Windows utilities for daily desktop flow.
TrayBits is a home for focused Windows tools that live quietly in the tray or near the desktop and fix small workflow problems without becoming a heavy control center.
The project is inspired by the practical shape of Microsoft PowerToys: a suite of independent utilities, each useful on its own, with shared release, documentation, and maintenance conventions over time.
TrayBits now has an initial Tauri 2 + Rust + SolidJS prototype.
It includes:
- A PowerToys-style main window with a left sidebar for utilities.
- A transparent, frameless, always-on-top toast overlay window.
- Rust commands that emit demo toast events into the SolidJS overlay.
- A tray icon menu for opening the app and triggering a demo toast.
- Persisted settings for startup, process priority, close behavior, and tray icon visibility.
- A Windows Caps Lock hook that can switch to the next installed input language.
- A Windows notification listener status panel that documents the native spike needed for real notification capture.
The toast overlay is intentionally separate from the main app window. This keeps desktop toast rendering close to Sonner-style web UI while letting Rust own the native Windows integration.
TrayBits starts as an umbrella for these existing or planned modules:
| Module | Purpose | Reference source |
|---|---|---|
| Persistent Notifications | Keep Windows notifications visible as desktop cards until dismissed or handled. | G:\NakornCode\git\toastdeck |
| Eye Rest Reminder | Show periodic 20-20-20 reminders for long desktop sessions. | Planned / to be located |
| Caps Lock Language Switch | Use Caps Lock as a quick input-language switch while preserving clear lock behavior. | G:\Freespace\capslang-windows |
The first goal is not to merge code blindly. TrayBits should prove the Tauri shape first, then decide case by case whether each tool should be ported, wrapped, or kept separate.
Names inside TrayBits should describe the behavior directly. Branded names from the standalone tools are reference names only, not product-facing module names.
SolidJS UI
- PowerToys-style settings shell
- Sonner-style toast overlay
Tauri bridge
- commands from UI to Rust
- events from Rust to overlay window
- tray lifecycle
Rust Windows core
- future notification listener
- Caps Lock hook and input-language switching
- future 20-20-20 scheduler
- persisted app settings
Real Windows notification capture should use
Windows.UI.Notifications.Management.UserNotificationListener through Rust's
Windows bindings. It requires a packaged app identity, a notification listener
capability, and explicit user permission.
- Small tools first.
- Native-feeling Windows behavior.
- Tray/background behavior should be predictable.
- No unnecessary cloud dependency.
- No broad system tweaks unless the user explicitly enables them.
- Prefer durable fixes over one-off scripts.
- Keep each utility understandable and independently testable.
This repository is an early prototype. The UI shell, demo overlay, persisted settings, and Caps Lock language-switch hook compile. Real Windows notification capture is not implemented yet.
Expected next steps:
- Prove real
UserNotificationListeneraccess from a packaged Tauri app. - Exercise the Caps Lock language-switch hook on a multi-language Windows machine and tighten edge cases.
- Port the 20-20-20 reminder timer into the Rust core.
- Decide whether the standalone notification and Caps Lock tools are ported into this repo or kept as reference implementations.
Install dependencies:
pnpm installRun frontend build:
pnpm buildRun Rust check:
cargo check --manifest-path .\src-tauri\Cargo.tomlBuild the Tauri desktop app without bundling installers:
pnpm tauri build --no-bundleThe no-bundle executable is written to:
src-tauri\target\release\traybits.exe
Primary workspace on this PC:
G:\NakornCode\git\traybits
Related local projects:
G:\NakornCode\git\toastdeck
G:\Freespace\capslang-windows
Use PowerShell on Windows by default.
Before moving code into this repository, inspect the existing tool's README, AGENTS.md, scripts, installer files, and release workflow. Preserve working behavior first, then simplify once the boundary is clear.