Skip to content

nocoo/shrike

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

122 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

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

License

Stars

Watchers

Forks

Contributors