← Back to Skills Marketplace
jiangsier-xyz

Sync Notes

by jiangsier-xyz · GitHub ↗ · v1.0.0 · MIT-0
cross-platform ⚠ suspicious
101
Downloads
0
Stars
0
Active Installs
1
Versions
Install in OpenClaw
/install sync-notes
Description
Sync the local Obsidian vault with a Cloudflare R2 bucket using rclone (S3 + crypt). Triggered by `/sync-notes`. Defaults to bidirectional sync; understands...
README (SKILL.md)

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:

  1. Empty → run bisync (default bidirectional sync).
  2. Contains a recognised keyword:
    • setup, 配置, wizardsetup
    • init, 初始化, baselineinit
    • status, 状态, 信息status
  3. 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>'.
  4. Mentions upload intent (上传, , push, upload, send):
    • Same as above with sync.sh upload '\x3Cglob>'.
  5. 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 welcome becomes **welcome** (matches anywhere in path).
  • A directory name like ideas becomes ideas/**.
  • 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, run sync.sh download '\x3Cglob>' --dry-run first.

Workflow contract

  1. First run ever: the script refuses bisync until a baseline exists. Tell the user to run /sync-notes init after confirming both sides are in the desired starting state.
  2. Backups: before any write-side operation (bisync, download, init), the local notes directory is mirrored to backups/latest/ (single rolling copy, previous one is replaced).
  3. 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.
  4. Logs: every invocation appends to logs/sync.log and emits a per-run file logs/\x3CUTC-timestamp>.log for 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/.env and remove from any visible context.
  • Never invoke rclone with --config pointing somewhere outside this skill.
  • Never run bisync if status reports unresolved conflicts; ask first.
  • When download/upload glob match count is ambiguous, run with --dry-run first 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/ to backups/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
Usage Guidance
Install only if you are comfortable giving it access to your notes folder and an R2 bucket. Add your own .gitignore exclusions before running setup, use a narrowly scoped R2 token, verify the initial bisync baseline carefully, and keep an independent backup of important notes.
Capability Tags
cryptocan-make-purchases
Capability Assessment
Purpose & Capability
The rclone/Cloudflare R2 functionality matches the stated purpose, but the default command is bidirectional sync and can propagate edits or deletions across local notes and the remote bucket.
Instruction Scope
The skill says it should only activate for messages starting with /sync-notes and asks for clarification on unknown requests, but a bare /sync-notes triggers a real write-capable bisync operation.
Install Mechanism
No installer or remote download flow is present; the included bash scripts rely on existing bash and rclone binaries.
Credentials
Access to CLOUD_NOTES_PATH and Cloudflare R2 credentials is proportionate for syncing an Obsidian vault, but those are sensitive local and account resources.
Persistence & Privilege
The skill persists R2 credentials, rclone crypt settings, logs, bisync state, and plaintext local backups; the documentation says these generated sensitive files are gitignored, but the provided file manifest does not include a .gitignore.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install sync-notes
  3. After installation, invoke the skill by name or use /sync-notes
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.0.0
Initial release of sync-notes skill: securely sync your Obsidian vault with Cloudflare R2 via rclone. - Triggered by `/sync-notes`, with support for setup, init, status, upload/download (via glob), and bidirectional sync. - Natural language commands (English/Chinese) are parsed for intuitive uploads and downloads. - Built-in safeguards: encrypted storage, pre-sync backups, explicit conflict handling. - Logs every sync; maintains single rolling backup. - Requires `rclone`, `bash`, and the `CLOUD_NOTES_PATH` environment variable. - Interactive setup wizard guides through first-time configuration.
Metadata
Slug sync-notes
Version 1.0.0
License MIT-0
All-time Installs 0
Active Installs 0
Total Versions 1
Frequently Asked Questions

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.

💬 Comments