Selective file backup to Google Drive
macOS desktop app powered by Tauri v2 + Next.js + rsync
Shrike is a lightweight macOS app that lets you pick specific files and folders to back up to Google Drive. No full-disk sync, no bloated cloud clients -- just rsync the things you care about.
How it works:
- Drag files onto the window (or click + to browse)
- Hit Sync to back them up via rsync
- Google Drive for Desktop syncs the rest to the cloud
- Drag & drop -- drop files and folders directly onto the window
- Native file picker -- click + to browse via macOS dialog
- Quick Add wizard -- scan and batch-add coding agent configs (.claude, .cursor, .aider, etc.)
- Incremental sync -- rsync only transfers what changed
- Full path preservation --
rsync -avRkeeps your directory structure intact - Dark mode -- auto-detect system preference, or manually choose light/dark
- i18n -- English and Chinese UI, auto-detect or manually set
- Webhook trigger -- automate backups via
POST http://localhost:7015/sync - Dock & menu bar control -- hide from Dock and/or menu bar as needed
- Launch at login -- optional autostart on macOS login
- Per-device subfolder -- separate backup directories via machine name setting
Download the latest .dmg from the Releases page, open it, and drag Shrike to Applications.
- macOS (with built-in
rsync/openrsync) - Google Drive for Desktop installed and signed in
# Clone
git clone https://github.com/nocoo/shrike.git
cd shrike
# Install dependencies (requires Bun + Rust)
bun install
# Run in dev mode
bun run tauri dev
# Build for release
bun run tauri buildTrigger syncs programmatically from scripts, cron jobs, or automation tools:
# Trigger a sync
curl -X POST http://localhost:7015/sync \
-H "Authorization: Bearer <your-token>"
# Check status
curl http://localhost:7015/status \
-H "Authorization: Bearer <your-token>"The token is auto-generated on first launch. Find it in Settings (gear icon).
Frontend (Next.js + shadcn/ui)
|
| Tauri IPC
v
Backend (Rust)
|
| sync pipeline: filelist -> validation -> rsync execution
v
macOS rsync -> Google Drive (local mount)
268 automated tests across three layers:
| Layer | Tool | Count |
|---|---|---|
| Rust UT | cargo test |
109 |
| Rust E2E | cargo test --tests |
12 |
| TS UT/Component | vitest |
147 |
# Run everything
bun run test:all
# Just Rust
bun run test:rs
# Just frontend
bun run test
# Lint (clippy + eslint)
bun run lintshrike/
βββ src/ # Next.js frontend
β βββ components/ # UI components (shadcn/ui based)
β βββ hooks/ # Custom React hooks
β βββ lib/ # Types, utils, i18n, Tauri command wrappers
β βββ test/ # Test utilities (renderWithLocale)
βββ src-tauri/
β βββ src/
β β βββ sync/ # Three-layer sync pipeline
β β β βββ filelist.rs # Generate --files-from temp file
β β β βββ validation.rs # Validate paths and destination
β β β βββ executor.rs # Build args, run rsync, parse output
β β βββ commands.rs # Tauri IPC commands
β β βββ webhook.rs # Axum HTTP server
β β βββ types.rs # Shared data types
β β βββ error.rs # Error definitions
β βββ tests/ # E2E integration tests
βββ CHANGELOG.md

