Sync Notes
/install sync-notes
sync-notes Skill
Sync the local notes directory ($CLOUD_NOTES_PATH) with a Cloudflare R2 bucket through an
end-to-end encrypted rclone crypt remote. The skill is a thin orchestrator over a single bash
entry point at scripts/sync.sh; the LLM's job is to translate the user's natural-language intent
into the right subcommand.
Trigger
Activate only when the user message starts with /sync-notes (with or without trailing
arguments). Examples:
| User message | Intent | Action |
|---|---|---|
/sync-notes |
full bidirectional sync | sync.sh bisync |
/sync-notes setup |
run the configuration wizard | sync.sh setup |
/sync-notes init |
establish the bisync baseline (first run only) | sync.sh init |
/sync-notes status |
show config + last-sync info | sync.sh status |
/sync-notes 下载 welcome |
download files matching welcome |
sync.sh download '**welcome**' |
/sync-notes upload daily/*.md |
upload glob | sync.sh upload 'daily/*.md' |
/sync-notes 把 ideas 目录拉下来 |
download a directory | sync.sh download 'ideas/**' |
How to interpret natural language
After stripping the /sync-notes prefix, classify the remainder:
- Empty → run
bisync(default bidirectional sync). - Contains a recognised keyword:
setup,配置,wizard→setupinit,初始化,baseline→initstatus,状态,信息→status
- Mentions download intent (
下载,拉,pull,download,get,取回):- Extract the target token(s) and convert to a glob (see "Glob rules" below).
- Run
sync.sh download '\x3Cglob>'.
- Mentions upload intent (
上传,推,push,upload,send):- Same as above with
sync.sh upload '\x3Cglob>'.
- Same as above with
- Otherwise: ask the user to clarify; do not guess.
Glob rules
Globs are passed verbatim to rclone as --include filters and apply to plain (decrypted) paths.
- A bare keyword such as
welcomebecomes**welcome**(matches anywhere in path). - A directory name like
ideasbecomesideas/**. - Paths already containing wildcards (
*,?,[) are passed through unchanged. - Filenames without extension default to matching
\x3Cname>and\x3Cname>.md; combine with**if unsure. When in doubt, runsync.sh download '\x3Cglob>' --dry-runfirst.
Workflow contract
- First run ever: the script refuses
bisyncuntil a baseline exists. Tell the user to run/sync-notes initafter confirming both sides are in the desired starting state. - Backups: before any write-side operation (
bisync,download,init), the local notes directory is mirrored tobackups/latest/(single rolling copy, previous one is replaced). - Conflicts: bisync runs with conflict markers. After every run the script scans for
*.conflict*files; if any are found the script exits non-zero and lists them. Surface this list to the user verbatim and ask which side to keep—do not auto-resolve. - Logs: every invocation appends to
logs/sync.logand emits a per-run filelogs/\x3CUTC-timestamp>.logfor the rclone output.
Filesystem layout
skills/sync-notes/
├── SKILL.md # this file
├── README.md # short user-facing notes (optional)
├── config/
│ ├── rclone.conf # active rclone config (created by setup, gitignored)
│ ├── rclone.conf.example # template
│ ├── .env # non-rclone settings (created by setup, gitignored)
│ └── .env.example # template
├── scripts/
│ ├── sync.sh # main entry point (dispatcher)
│ └── setup.sh # interactive configuration wizard
├── state/
│ └── bisync/ # rclone bisync workdir (listings + lockfiles)
├── logs/ # rolling logs
├── backups/
│ └── latest/ # most recent local snapshot (single copy)
└── .gitignore
scripts/sync.sh derives every path from its own location ($(dirname "$0")/..); no absolute
paths are hard-coded.
Required environment
| Variable | Purpose | Required |
|---|---|---|
CLOUD_NOTES_PATH |
absolute path of the local notes directory | ✅ |
The script aborts early with a clear message if CLOUD_NOTES_PATH is unset, missing, or not a
directory.
Configuration files
config/rclone.conf
Native rclone format with two remotes:
[r2-raw]
type = s3
provider = Cloudflare
access_key_id = \x3CACCESS_KEY_ID>
secret_access_key = \x3CSECRET_ACCESS_KEY>
endpoint = https://\x3CACCOUNT_ID>.r2.cloudflarestorage.com
acl = private
[notes]
type = crypt
remote = r2-raw:\x3CBUCKET>/\x3COPTIONAL_PREFIX>
filename_encryption = standard
directory_name_encryption = true
password = \x3COBSCURED>
password2 = \x3COBSCURED>
config/.env
Non-rclone settings consumed by sync.sh:
# Name of the crypt remote in rclone.conf
RCLONE_REMOTE=notes
# Number of local backup snapshots to retain
BACKUP_KEEP=1
# Extra rclone flags (optional)
RCLONE_EXTRA_FLAGS="--transfers=4 --checkers=8"
.example versions ship with the skill; the wizard fills in the real values.
Subcommands implemented by sync.sh
| Subcommand | Behaviour |
|---|---|
setup |
Run setup.sh; collects R2 creds + crypt password(s); writes rclone.conf and .env with chmod 600. Idempotent: confirms before overwriting. |
init |
First-time baseline: rclone bisync --resync. Refuses to run if a baseline already exists unless --force is passed. |
bisync (default) |
rclone bisync $LOCAL notes: with conflict reporting. Backs up first. |
download \x3Cglob> |
rclone copy notes: $LOCAL --include '\x3Cglob>'. Backs up first. Defaults to --dry-run only when the user said "试" / "dry"; otherwise runs for real. |
upload \x3Cglob> |
rclone copy $LOCAL notes: --include '\x3Cglob>'. No local backup needed; remote is authoritative. |
status |
Prints config validity, last-sync timestamp, conflict files (if any), backup state. |
Safety rules for the LLM
- Never write secrets into chat. If the user pastes secrets, immediately move them into
config/rclone.conf/config/.envand remove from any visible context. - Never invoke
rclonewith--configpointing somewhere outside this skill. - Never run
bisyncifstatusreports unresolved conflicts; ask first. - When
download/uploadglob match count is ambiguous, run with--dry-runfirst and show the list of matches. - Backups are single-copy; if you are about to do something risky (large delete, schema change),
copy
backups/latest/tobackups/manual-\x3CUTC>/manually before proceeding and tell the user.
First-time onboarding (what to tell the user)
1. /sync-notes setup # fill in R2 + crypt creds
2. export CLOUD_NOTES_PATH=... # point at the local notes dir
3. /sync-notes init # establish the bisync baseline
4. /sync-notes # routine bidirectional sync
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install sync-notes - After installation, invoke the skill by name or use
/sync-notes - Provide required inputs per the skill's parameter spec and get structured output
What is Sync Notes?
Sync the local Obsidian vault with a Cloudflare R2 bucket using rclone (S3 + crypt). Triggered by `/sync-notes`. Defaults to bidirectional sync; understands... It is an AI Agent Skill for Claude Code / OpenClaw, with 101 downloads so far.
How do I install Sync Notes?
Run "/install sync-notes" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is Sync Notes free?
Yes, Sync Notes is completely free, licensed under MIT-0. You can download, install and use it at no cost.
Which platforms does Sync Notes support?
Sync Notes is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).
Who created Sync Notes?
It is built and maintained by jiangsier-xyz (@jiangsier-xyz); the current version is v1.0.0.