Zero is a tray-first desktop utility collection built with Tauri 2, React, and TypeScript. Each tool is designed as a plugin so the app can grow into a larger toolbox without turning the main window into a crowded control panel.
- Zero Snap with macOS window targeting, adjustable selection dimensions and corner radius, annotations, copy, save, and pin; Windows uses its system screenshot tool.
- Global screenshot shortcut:
CommandOrControl+Shift+A. - Zero Awake to keep the screen and system awake.
- Zero Paper with Bing daily wallpaper history, cache-first loading, save-to-Downloads, and one-click desktop apply.
- Zero Launch for fuzzy application/system-setting search, app launch/focus, and a reusable Option + Space (macOS) / Ctrl + Alt + Space (Windows) window on macOS and Windows.
- Separate tray, main, preferences, and about windows, with login autostart and configurable global shortcuts.
- Tool visibility preferences so users can choose which plugins appear in the main tool list.
- Language preference with system default, Chinese, and English.
- About and Exit actions in a compact bottom system section.
- MVP plugin host: GitHub Releases
.zpluginpackages, hostedmarket.json, local package validation/install, permission review, enable/disable/uninstall, and bundled restore. - Zero File with offline PDF-to-DOCX and macOS 11+ DOCX-to-PDF implementations. The signed engine package is still a release candidate; see the development and release boundary.
- Tauri 2
- Rust 2021
- React 19
- TypeScript
- Vite
- pnpm
- Node.js 22.13+ on the 22.x line, or Node.js 24+ (Vite 7 and PDF.js 6 requirements; CI uses Node 24)
- pnpm 10.33.0 (pinned in
package.json) - Rust via
rustup - Platform build tools:
- macOS: Xcode Command Line Tools
- Windows: Visual Studio Build Tools and WebView2
- Linux: WebKitGTK and app indicator dependencies required by Tauri
Install dependencies:
pnpm installRun the frontend only:
pnpm devRun the desktop app:
pnpm tauri devTo exercise the Zero File source engine in a debug build:
ZERO_FILE_ENGINE_DEV_ASSETS=1 pnpm tauri devThe flag enables a debug-only source fallback. It does not approve or install a signed engine package, and it has no effect in release builds.
Build the frontend:
pnpm buildCheck the Rust side:
cd src-tauri
cargo check
cargo testBuild the desktop app:
pnpm tauri buildThe independent product website lives in website/. Start it with pnpm --dir website install --frozen-lockfile and pnpm --dir website dev; build static output with pnpm --dir website build. See website maintenance for bilingual content, verified release catalogs, browser checks and preview settings.
src/
main.tsx Lazy routing by Tauri window label
App.tsx Tray, main, preferences, and about shells
appShell/
bundledPluginModules.ts Only bundled-plugin composition registry
core/
pluginHost/ Registry, market, Extension API bridge, and host UI
preferences/ Global preferences, About, storage, and host i18n
windowing/ Surface activity and lifecycle hooks
plugins/
caffeine/ Self-contained Zero Awake module
bingWallpaper/ Self-contained Zero Paper module
quickLauncher/ Self-contained Zero Launch module
screenshot/ Self-contained Zero Snap module
file/ Zero File UI, contracts, and offline engine
src-tauri/
src/
bundled_plugins.rs Trusted native plugin composition
commands/ Thin Tauri IPC handlers grouped by plugin
services/ Plugin business logic and host coordinators
plugins/ Third-party package registry/runtime host
capabilities/ Tauri permission capabilities
tests/
unit/ Pure core, plugin, service, app-shell, and brand tests
integration/ Extension host, source-boundary, and shell contracts
Each bundled plugin owns a typed plugin.tsx descriptor, its manifest and presentation metadata, plugin-local translations, UI surfaces, and domain code. src/appShell/bundledPluginModules.ts is the only frontend file that registers all bundled descriptors; plugins never import peer plugins, and host core never imports concrete plugin implementations.
Bundled plugins are trusted, build-time modules because their native Rust commands and state are compiled into Zero and explicitly registered in src-tauri/src/bundled_plugins.rs. Installed third-party .zplugin packages remain runtime-pluggable only through validated manifests, approved permissions, isolated WebView surfaces, and the versioned Extension API Bridge. Zero does not dynamically load third-party Rust code.
zero.paper is the third bundled tool. It reads up to 10 records from Bing's zh-CN daily image feed, shows a validated cached snapshot immediately, and refreshes metadata and missing images in Rust. The card supports older/newer navigation, a separate Downloads action, and applying the selected image as the desktop wallpaper. Clicking the preview is equivalent to Apply.
The cache lives at ~/.zero/data/wallpaper/. index.json and image files are written through plugin-scoped, staged replacement; the service retains at most 10 indexed entries and removes only obsolete files that an earlier index owned. Unknown files are not deleted. A failed refresh leaves usable cached records visible with stale/error state.
The bundled manifest requests network, storage.plugin, and system.wallpaper. The WebView does not fetch Bing or receive unrestricted filesystem access: Rust restricts requests to bounded HTTPS Bing endpoints, validates image content, resolves paths inside the wallpaper root, and passes only one selected preview back as a bounded data URL.
Desktop wallpaper apply uses the replaceable WallpaperSetter adapter around wallpaper 3.2. macOS and Windows are supported by the adapter. Linux support depends on the detected desktop environment and its required desktop command; unsupported or missing backends return a structured error while browse/download remain available. Mobile wallpaper apply is not part of this release.
This bundled plugin uses the existing webview runtime and React renderer. It intentionally does not introduce a plugin.wasm or WASI runtime.
zero.launch is the fourth bundled tool. The main plugin panel and the floating launcher window share one React view and one Rust-owned index. Press Option + Space (macOS) / Ctrl + Alt + Space (Windows), type an English/Chinese name, full pinyin, initials, acronym, or bundled alias such as wx/ps, then use ArrowUp/ArrowDown and Enter. Press the same Launch shortcut again, Escape, or move focus away to hide only the floating window; Zero keeps running.
Rust scans macOS application bundles in /Applications, ~/Applications, /System/Applications, and /System/Applications/Utilities; Windows scans machine/user Start Menu Programs .lnk and .exe entries. Running applications are focused when the OS provides a reliable identity; otherwise the validated indexed entry is launched. Common system settings are host-maintained catalog records mapped privately to x-apple.systempreferences: or ms-settings: destinations. Linux and mobile return explicit unsupported state in this release.
The versioned local data is stored under ~/.zero/data/quick-launcher/: apps_cache.json contains rebuildable application metadata, usage.json contains bounded success-only counts and last-used timestamps, and icons are lazy/rebuildable. Raw queries are never persisted or uploaded. Startup uses the cache immediately, refreshes in the background, and coalesces application-directory changes.
The manifest requests system.apps.read, system.apps.execute, system.window.focus, and system.settings.open. Bundled Tauri commands and approved Extension Bridge methods resolve only host-issued itemId values; callers cannot submit arbitrary paths, Bundle IDs, command lines, shortcut targets, or URIs. Like the other bundled tools, Zero Launch uses the existing React webview renderer and intentionally does not add plugin.wasm/WASI.
The first plugin market is repository-based, not server-backed:
- plugin authors publish a
.zpluginZIP archive in their own GitHub Releases; - Zero reads a hosted static
market.json; - install extracts packages under
~/.zero/plugins/<plugin>/<version>/; manifest.jsonrequiresname,version,author,main, andpermissions;- permissions are reviewed before install and enforced by a host-mediated Extension API bridge.
Zero keeps com.watson.ztool as its immutable Tauri bundle identifier so an existing installation upgrades in place and retains operating-system permissions, autostart registration, and WebView storage. This identifier is a compatibility value, not the current product name.
On startup, Zero copies missing data from ~/.ztool into ~/.zero, normalizes the four known first-party plugin IDs, and leaves the legacy directory untouched for rollback. Canonical ~/.zero data wins when both locations contain the same unit. Frontend preferences follow the same rule: zero.preferences.v1 wins, otherwise ztool.preferences.v1 is read and copied forward without deleting the legacy key. Extension API v1 continues to accept engines.ztool, while current manifests use engines.zero.
Developer docs:
- Project overview, platform boundaries, and verification snapshot
- Maintainer and agent instructions
- Compact project memory
- OpenSpec project context
- MVP protocol
- Developer guide
- GitHub Releases publishing guide
- Zero File offline engine and release guide
- Minimal example plugin
Validate an unpacked plugin directory:
node scripts/validate-plugin-package.mjs examples/plugins/minimal-view-command-settingThe test scripts compile the TypeScript fixtures first, replacing the clean temporary output at /private/tmp/zero-tests, and then recursively discover every nested *.test.mjs file exactly once.
Run a focused level while iterating:
pnpm test:unit
pnpm test:integrationRun the complete recursive suite and production checks before pushing:
pnpm test
pnpm build
cd src-tauri
cargo fmt --check
cargo check --locked
cargo test --locked
cargo test --release --test quick_launcher_benchmark -- --ignored --nocapturenode_modules, frontend build output, and Rust/Tauri build output are intentionally ignored.- The login autostart preference uses the official Tauri autostart plugin.
- Zero Snap's macOS editor implements selection, annotations, geometry controls, copy/save, and pin. Real multi-display, clipboard, window lifecycle, and packaged-app evidence must be tracked separately from automated checks.
After the packaged release app starts, it creates Zero Snap, Zero Awake, Zero Paper, Zero Launch, and Zero File entries in ~/Applications/Zero Tools/ on macOS and the current user's Start Menu/Programs/Zero Tools/ on Windows. Zero itself remains the installed Zero.app / installer Start Menu entry. Open any tool entry to launch or activate the same Zero instance and select that tool in the main window. Hidden or disabled tools are not enabled automatically.
Alfred, Spotlight, Raycast, and Windows Search use their own index and search scope; allow time for indexing and include the user Applications folder in the launcher's search scope. These are standard application entries, with no Alfred workflow or paid feature required. Moving Zero requires opening it once to update entry paths. Quit and uninstall Zero, then remove only its owned Zero Tools folder to remove these entries.
Raw development builds do not install persistent entries. Packaged macOS debug smoke can set ZERO_DESKTOP_ENTRIES_TEST_ROOT to an isolated temporary Applications directory. Generated wrappers forward to Zero; they are not independent signed distribution packages.
See v0.1.0 packaging for core (no bundled tools) and standard (Awake, Paper, Snap, Launch), local commands, GitHub Actions artifact downloads and size/checksum reports. Both trial profiles exclude File.