Odysync is a complete Rust rewrite of the original Python updater, built with a strict safety policy engine, a CLI, and a Tauri v2 + React desktop GUI. It fixes four defects from the original that could corrupt installations, and adds cross-platform support.
odysync scan
odysync apply --yes
odysync daemon --interval 60 |
cd apps/gui
npm install
npx tauri dev |
| Metric | Value |
|---|---|
| Language | Rust + TypeScript |
| Crates | 5 |
| Unit Tests | 439 |
| Backends | 6 (winget, msstore, Windows Drivers, Homebrew, apt, Flatpak) |
| Binary Size | ~1 MB (CLI) |
| Platforms | Windows, macOS, Linux |
| GUI Framework | Tauri v2 + React 19 |
| License | MIT |
Rust ████████████████████████████████████████████████████ 68.4%
TypeScript ██████████████████████ 21.2%
CSS ████ 4.8%
HTML ██ 2.1%
Other ████ 3.5%
The original Python updater had four defects that could corrupt installations:
| # | Defect | Fix in v2 |
|---|---|---|
| 1 | Upgraded packages with Unknown installed versions, causing sidegrades/downgrades |
Policy engine refuses unknown versions by default |
| 2 | Compared versions as strings (1.10 < 1.9) |
Proper semver ordering via odysync-core |
| 3 | On failed upgrade, fell back to reinstalling from scratch, wiping state | No reinstall fallback; convergence verified post-apply |
| 4 | Installed third-party PowerShell module from PSGallery as Admin | Built-in Windows Update Agent COM API, no third-party deps |
- Six backends: winget, Microsoft Store, Windows Drivers (COM API), Homebrew, apt, Flatpak
- Safety policy: stable-only by default, semver version comparison, holds/pins, exclusions, elevation rules
- Verification: installer digest verification and signature checking (
odysync-verifycrate) - Restore points: system restore point before applying (Windows)
- Maintenance: temp cleanup, recycle bin, DISM/SFC, startup programs
- Scheduling: Task Scheduler (Windows), launchd (macOS), systemd (Linux)
- Diagnostics: zip bundle for troubleshooting
- GUI: Tauri v2 + React + TypeScript + TailwindCSS desktop app with dark/light mode
- Daemon: background scan mode with system tray icon
- Cross-platform: Windows, macOS, and Linux from a single codebase
odysync-core Policy engine, version algebra, planner, runner, config
|
odysync-verify Installer digest and signature verification
|
odysync-backends winget, msstore, Windows drivers, homebrew, apt, flatpak
|
+-- odysync-cli The `odysync` command-line tool
|
+-- odysync-gui Tauri v2 + React desktop app
Every safety decision lives in odysync-core. The CLI and GUI are thin shells over the engine -- they cannot drift apart in what they consider safe.
See ARCHITECTURE.md for details.
# Scan for available updates
odysync scan
# Apply all safe updates
odysync apply --yes
# Hold a package (prevent updates)
odysync hold Mozilla.Firefox
# Schedule daily scans
odysync schedule --daily --time 09:00
# Run maintenance
odysync maintain --action temp-cleanup
# Background daemon
odysync daemon --interval 60
# Create diagnostics bundle
odysync diagnostics --out bundle.zipcd apps/gui
npm install
npx tauri dev# CLI only
cargo build --release -p odysync-cli
# GUI (requires Node.js 20+)
cd apps/gui && npm install
npx tauri build
# Run tests
cargo test --workspace --lib
# Lint
cargo clippy --workspace --all-targets
cargo fmt --all -- --check| Layer | Technology |
|---|---|
| Core Engine | Rust, tokio, serde, clap |
| Windows APIs | windows crate (COM, Update Agent, Restore Points) |
| GUI Framework | Tauri v2 |
| Frontend | React 19, TypeScript 6 |
| Styling | TailwindCSS 3 |
| Icons | Lucide React |
| Build Tool | Vite 8 |
| CI/CD | GitHub Actions |
| Security | cargo-audit, cargo-deny, CycloneDX SBOM |
- Policy engine refuses downgrades, same-version reinstalls, and pre-releases by default
- Store apps refused while elevated (cannot update from elevated context)
- Driver updates refused without elevation
cargo-auditandcargo-denyrun on every CI build- CycloneDX SBOM generated per build
- SHA-256 checksums published for every release artifact
MIT
v1 profiles map to v2 config profiles entries. Holds and pins use the same backend:id syntax. The config file lives at:
| Platform | Path |
|---|---|
| Windows | %APPDATA%\Odysync\config.json |
| macOS | ~/Library/Application Support/Odysync/config.json |
| Linux | ~/.config/odysync/config.json |