Skip to content

Latest commit

 

History

122 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Shrike Logo

Shrike

Selective file backup to Google Drive
macOS desktop app powered by Tauri v2 + Next.js + rsync

Version Platform Tests License

Shrike Preview


What is Shrike?

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:

  1. Drag files onto the window (or click + to browse)
  2. Hit Sync to back them up via rsync
  3. Google Drive for Desktop syncs the rest to the cloud

Features

  • 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 -avR keeps 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

Install

Download the latest .dmg from the Releases page, open it, and drag Shrike to Applications.

Requirements

Development

# 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 build

Webhook API

Trigger 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).

Architecture

Frontend (Next.js + shadcn/ui)
    |
    | Tauri IPC
    v
Backend (Rust)
    |
    |  sync pipeline: filelist -> validation -> rsync execution
    v
macOS rsync -> Google Drive (local mount)

Testing

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 lint

Project Structure

shrike/
β”œβ”€β”€ 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

License

MIT

About

πŸͺΆ A lightweight macOS menu bar utility that syncs files and folders to Google Drive using rsync

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages