Version 2.0 - Native macOS tools for working with Apple Notes - sync, backup, and automatic version history.
Build from source required - macOS Full Disk Access requires apps to be code-signed. The build script automatically creates a local signing certificate for you.
A beautiful SwiftUI app combining sync and version history.
- Dashboard with stats at a glance
- Browse all tracked notes
- Drag & drop import/export
- Control the Pickle daemon
- Full Disk Access onboarding
Bidirectional sync between Apple Notes and markdown files.
cider pull ~/notes --recursive # Export notes to markdown
cider push ~/notes/doc.md # Upload to Apple Notes
cider sync ~/notes # Bidirectional syncAutomatic version history with background daemon.
pickle install # Install background daemon
pickle history "My Note" # View version history
pickle diff 1 2 # Compare versions
pickle restore 5 # Restore to version- macOS 13.0 (Ventura) or later
- Xcode Command Line Tools (
xcode-select --install) - Full Disk Access permission
# Clone the repository
git clone https://github.com/damienheiser/pickle-cider
cd pickle-cider
# Build and install everything
./Scripts/build-all.shThis script will:
- Build all three executables (cider, pickle, PickleCider)
- Auto-create a local signing certificate if needed
- Sign all binaries properly
- Install the app to
/Applications/Pickle Cider.app - Install CLI tools to
/usr/local/bin/ - Install and start the Pickle daemon for automatic version tracking
After running, you just need to grant Full Disk Access (see below).
# Clone and build
git clone https://github.com/damienheiser/pickle-cider
cd pickle-cider
# Build release binaries
swift build -c release
# Create signing certificate (if you don't have one)
./Scripts/create-signing-cert.sh
# Sign binaries
CERT="Pickle Cider Development" # or your certificate name
codesign --force --sign "$CERT" .build/release/cider
codesign --force --sign "$CERT" .build/release/pickle
codesign --force --sign "$CERT" .build/release/PickleCider
# Install
sudo cp .build/release/cider .build/release/pickle /usr/local/bin/After installation, you must grant Full Disk Access to the components you want to use:
- Open System Settings β Privacy & Security β Full Disk Access
- Click + and add
/Applications/Pickle Cider.app - Quit and reopen the app (required for changes to take effect)
The daemon runs in the background and needs its own FDA permission:
- In Full Disk Access, click +
- Press
Cmd+Shift+Gand enter:/Applications/Pickle Cider.app/Contents/MacOS/pickle - Click Add, then restart the daemon:
pickle stop && pickle start
If using cider or pickle from Terminal:
- Add Terminal.app (or your terminal app) to Full Disk Access
- Restart your terminal
Launch from Applications. The app will guide you through granting permissions on first launch.
# Initialize Cider sync
cider init
# Export all notes to markdown
cider pull ~/Documents/notes --recursive
# Upload files to Apple Notes
cider push ~/Documents/notes/my-note.md
# Bidirectional sync
cider sync ~/Documents/notes --folder "My Synced Notes"
# Install Pickle daemon for automatic versioning
pickle install --interval 30
# Check status
pickle status
# View version history
pickle history "My Important Note"
# Compare versions
pickle diff 1 2
# Restore to previous version
pickle restore 5
# Export versions
pickle export "My Note" ~/exports --format md| Command | Description |
|---|---|
cider init |
Initialize sync state database |
cider pull <dir> |
Export Apple Notes to markdown files |
cider push <path> |
Upload files to Apple Notes |
cider sync <dir> |
Bidirectional sync |
cider status |
Show sync status |
--folder <name> Target Apple Notes folder (default: "Cider Sync")
--format <md|txt> Output format (default: md)
--recursive Process subdirectories
--dry-run Preview without making changes
--force Overwrite conflicts
--verbose Verbose output
| Command | Description |
|---|---|
pickle install |
Install launchd daemon |
pickle uninstall |
Remove daemon |
pickle start |
Start daemon |
pickle stop |
Stop daemon |
pickle status |
Show daemon status and statistics |
pickle history <note> |
Show version history |
pickle diff <v1> <v2> |
Compare versions |
pickle restore <id> |
Restore to version |
pickle export <note> <dir> |
Export versions to files |
--interval <seconds> Check interval for daemon (default: 30)
--max-versions <n> Max versions per note (default: 100)
--limit <n> Limit results
--format <md|txt|json> Export format
--verbose Verbose output
| Tool | Location | Purpose |
|---|---|---|
| Cider | ~/.cider/state.db |
Sync state tracking |
| Pickle | ~/.pickle/versions.db |
Version metadata |
| Pickle | ~/.pickle/versions/ |
Version content (gzipped JSON) |
| Pickle | ~/.pickle/logs/ |
Daemon logs |
- Reading Notes: Direct SQLite access to Apple Notes database
- Writing Notes: AppleScript via NSAppleScript (preserves iCloud sync)
- Content Format: Notes are stored as gzip-compressed protobuf
- Change Detection: Polling-based (SQLite WAL makes file watching unreliable)
- Password-protected notes cannot be accessed (skipped with warning)
- Attachments are referenced but not synced
- Requires Full Disk Access for database read access
Full Disk Access not granted or not applied yet.
- Check System Settings β Privacy & Security β Full Disk Access
- Ensure Pickle Cider and/or Terminal are listed and enabled
- Quit and reopen the app (macOS caches permissions)
The app must be properly signed. Build with Xcode or sign manually with your development certificate.
# Check if daemon is installed
launchctl list | grep pickle
# View daemon logs
cat ~/.pickle/logs/stdout.log
cat ~/.pickle/logs/stderr.log
# Reinstall daemon
pickle uninstall
pickle installMIT License - see LICENSE
Built with:
Inspired by: