Table of Contents
Frequent Wi-Fi and Bluetooth disconnections, accompanied by the annoying ticking sound of USB devices disconnecting and reconnecting, can be incredibly frustrating—especially when the root cause is hard to pinpoint. To address this, I developed and open-sourced a lightweight troubleshooting and real-time tracking tool using Cursor. For more details, check out the GitHub repository.
Features
| Module | Description |
|---|---|
| Hardware monitoring | Real-time USB / Bluetooth disconnect and transient events via WM_DEVICECHANGE (configurable threshold) |
| Bluetooth diagnostics | WMI polling of bthserv and PnP devices; tray alerts on failure |
| BSOD tracing | Minidump scan plus Event Log BugCheck analysis |
| One-click repair | Restarts bthserv / Audiosrv and scans USB selective suspend settings |
| System tray | Close to tray; icon reflects status (normal / warning / alert) |
| Notifications | Native Windows toasts when the window is hidden |
| History | Persistent event log with JSON / CSV export |
| Port manager | Scan local listeners, flag dev leftovers and reserved ranges, release safe processes |
| Localization | 29 display languages, including tray menu strings |
Requirements
- Windows 10 / 11 (x64)
- WebView2 Runtime
- One-click repair works best when run as administrator (right-click → Run as administrator)
Installation
From Releases (recommended)
Download the latest build from Releases:
ZeroTick_*_x64-setup.exe— NSIS installerZeroTick_*_x64_en-US.msi— MSI package
After installation, ZeroTick stays in the system tray by default.
Pushing to
mainwith a newpackage.jsonversion triggers GitHub Actions to tagv*and upload installers. See Contributing → Release.
Build from source
Prerequisites: Rust 1.82+ · Node.js 18+
git clone https://github.com/ichenh/zerotick.git
cd zerotick
npm install
npm run tauri build
Installers are written to:
src-tauri\target\release\bundle\nsis\
src-tauri\target\release\bundle\msi\
If icons are missing, generate them from
app-icon.png:npm run ensure-iconsornpm run tauri icon app-icon.pngCommit
app-icon.pngorsrc-tauri/icons/before publishing — CI requires them to build installers.
Usage
- Launch — ZeroTick runs in the system tray; the main window starts hidden
- Open the app — Left-click the tray icon, or right-click → Open Dashboard
- Overview — Live USB / Bluetooth timeline; transient disconnects are highlighted
- Diagnostics — Check Bluetooth, scan for BSOD dumps, run one-click repair
- Ports — Scan local usage and release node / vite dev leftovers
- Settings — Thresholds, history limits, display language, notifications, start at sign-in
- Quit — Right-click tray → Quit ZeroTick
Data directory
User data is stored under %APPDATA%\com.zerotick.desktop\:
| File | Purpose |
|---|---|
settings.json | User preferences |
device_history.json | Device event history |
zerotick_debug.log | Debug log |
Performance
Target idle usage is about 0% CPU:
- Hardware monitoring uses a Win32 message pump (event-driven, no polling loop)
- Bluetooth WMI polls every 60s by default and only notifies on state changes
- BSOD analysis runs once at startup
Adjust the Bluetooth poll interval in Settings (15–300 seconds).
Development
npm install
npm run tauri dev # dev mode (runs prepare-dev automatically)
npm run build # frontend only
cargo test --manifest-path src-tauri/Cargo.toml
Dev server port: 55555 (see vite.config.js, tauri.conf.json, src-tauri/src/ports.rs).
Project layout
zerotick/
├── index.html
├── src/ # Vite + Vanilla JS frontend
│ ├── main.js
│ ├── i18n.js
│ ├── locales/
│ └── styles.css
├── src-tauri/ # Rust / Tauri backend
│ ├── src/
│ │ ├── monitor.rs
│ │ ├── bluetooth.rs
│ │ ├── bsod.rs
│ │ ├── repair.rs
│ │ ├── ports.rs
│ │ ├── settings.rs
│ │ ├── i18n.rs
│ │ └── tray.rs
│ └── locales/tray.json
├── scripts/
├── CHANGELOG.md
├── CONTRIBUTING.md
└── LICENSE
Agent conventions: AGENTS.md
License
MIT © ZeroTick Contributors