opencode-skills-collection 3.1.12 → 3.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (770) hide show
  1. package/README.md +4 -6
  2. package/bundled-skills/.antigravity-install-manifest.json +195 -1
  3. package/bundled-skills/ab-testing/SKILL.md +368 -0
  4. package/bundled-skills/ab-testing/evals/evals.json +105 -0
  5. package/bundled-skills/ab-testing/references/sample-size-guide.md +263 -0
  6. package/bundled-skills/ab-testing/references/test-templates.md +277 -0
  7. package/bundled-skills/accint-commitments/SKILL.md +32 -0
  8. package/bundled-skills/accint-frames/SKILL.md +35 -0
  9. package/bundled-skills/accint-solve/SKILL.md +22 -192
  10. package/bundled-skills/add-app-clip/SKILL.md +297 -0
  11. package/bundled-skills/add-app-clip/agents/openai.yaml +4 -0
  12. package/bundled-skills/add-app-clip/references/native-module.md +96 -0
  13. package/bundled-skills/agent-memory/SKILL.md +84 -0
  14. package/bundled-skills/alternatives-pages/README.md +46 -0
  15. package/bundled-skills/alternatives-pages/SKILL.md +376 -0
  16. package/bundled-skills/analytics/SKILL.md +324 -0
  17. package/bundled-skills/analytics/evals/evals.json +90 -0
  18. package/bundled-skills/analytics/references/event-library.md +260 -0
  19. package/bundled-skills/analytics/references/ga4-implementation.md +300 -0
  20. package/bundled-skills/analytics/references/gtm-implementation.md +390 -0
  21. package/bundled-skills/anti-deception/SKILL.md +50 -0
  22. package/bundled-skills/api-analyzer/SKILL.md +101 -0
  23. package/bundled-skills/api-and-interface-design/SKILL.md +307 -0
  24. package/bundled-skills/api-designer/SKILL.md +167 -0
  25. package/bundled-skills/api-integration/SKILL.md +175 -0
  26. package/bundled-skills/api-onboarding/README.md +47 -0
  27. package/bundled-skills/api-onboarding/SKILL.md +473 -0
  28. package/bundled-skills/api-sdk-generator/SKILL.md +223 -0
  29. package/bundled-skills/appium-skill/SKILL.md +317 -0
  30. package/bundled-skills/applicationinsights-web-ts/SKILL.md +477 -0
  31. package/bundled-skills/automated-triage/SKILL.md +189 -0
  32. package/bundled-skills/aws-agentic-ai/SKILL.md +141 -0
  33. package/bundled-skills/aws-cdk-development/SKILL.md +275 -0
  34. package/bundled-skills/aws-cost-operations/SKILL.md +273 -0
  35. package/bundled-skills/aws-mcp-setup/SKILL.md +192 -0
  36. package/bundled-skills/aws-serverless-eda/SKILL.md +394 -0
  37. package/bundled-skills/aws-sst-development/SKILL.md +175 -0
  38. package/bundled-skills/azure-ai-language-conversations-py/SKILL.md +112 -0
  39. package/bundled-skills/azure-servicebus-rust/SKILL.md +182 -0
  40. package/bundled-skills/azure-storage-queue-rust/SKILL.md +178 -0
  41. package/bundled-skills/baseline-ui/SKILL.md +15 -10
  42. package/bundled-skills/before-you-build/SKILL.md +111 -0
  43. package/bundled-skills/brooks-audit/SKILL.md +49 -0
  44. package/bundled-skills/brooks-audit/architecture-guide.md +195 -0
  45. package/bundled-skills/brooks-audit/onboarding-guide.md +89 -0
  46. package/bundled-skills/brooks-debt/SKILL.md +42 -0
  47. package/bundled-skills/brooks-debt/debt-guide.md +125 -0
  48. package/bundled-skills/brooks-harness/SKILL.md +139 -0
  49. package/bundled-skills/brooks-review/SKILL.md +42 -0
  50. package/bundled-skills/brooks-review/pr-review-guide.md +163 -0
  51. package/bundled-skills/brooks-sweep/SKILL.md +44 -0
  52. package/bundled-skills/brooks-sweep/sweep-guide.md +264 -0
  53. package/bundled-skills/brooks-test/SKILL.md +41 -0
  54. package/bundled-skills/brooks-test/test-guide.md +147 -0
  55. package/bundled-skills/bug-hunt-swarm/SKILL.md +189 -0
  56. package/bundled-skills/bug-hunt-swarm/agents/openai.yaml +4 -0
  57. package/bundled-skills/building-native-ui/SKILL.md +77 -18
  58. package/bundled-skills/building-native-ui/agents/openai.yaml +4 -0
  59. package/bundled-skills/building-native-ui/references/animations.md +220 -0
  60. package/bundled-skills/building-native-ui/references/controls.md +270 -0
  61. package/bundled-skills/building-native-ui/references/form-sheet.md +253 -0
  62. package/bundled-skills/building-native-ui/references/gradients.md +106 -0
  63. package/bundled-skills/building-native-ui/references/icons.md +213 -0
  64. package/bundled-skills/building-native-ui/references/media.md +198 -0
  65. package/bundled-skills/building-native-ui/references/route-structure.md +229 -0
  66. package/bundled-skills/building-native-ui/references/search.md +248 -0
  67. package/bundled-skills/building-native-ui/references/storage.md +121 -0
  68. package/bundled-skills/building-native-ui/references/tabs.md +433 -0
  69. package/bundled-skills/building-native-ui/references/toolbar-and-headers.md +284 -0
  70. package/bundled-skills/building-native-ui/references/visual-effects.md +197 -0
  71. package/bundled-skills/building-native-ui/references/webgpu-three.md +605 -0
  72. package/bundled-skills/building-native-ui/references/zoom-transitions.md +158 -0
  73. package/bundled-skills/changelog-updates/README.md +53 -0
  74. package/bundled-skills/changelog-updates/SKILL.md +552 -0
  75. package/bundled-skills/ci-cd-and-automation/SKILL.md +403 -0
  76. package/bundled-skills/claimable-postgres/SKILL.md +91 -59
  77. package/bundled-skills/co-marketing/SKILL.md +301 -0
  78. package/bundled-skills/co-marketing/evals/evals.json +84 -0
  79. package/bundled-skills/code-review-and-quality/SKILL.md +394 -0
  80. package/bundled-skills/code-showcase-core-components/SKILL.md +281 -0
  81. package/bundled-skills/code-showcase-react-ui-patterns/SKILL.md +306 -0
  82. package/bundled-skills/code-showcase-systematic-debugging/SKILL.md +167 -0
  83. package/bundled-skills/code-showcase-testing-patterns/SKILL.md +276 -0
  84. package/bundled-skills/code-simplification/SKILL.md +344 -0
  85. package/bundled-skills/community-building/README.md +102 -0
  86. package/bundled-skills/community-building/SKILL.md +415 -0
  87. package/bundled-skills/competitor-profiling/SKILL.md +427 -0
  88. package/bundled-skills/competitor-profiling/evals/evals.json +85 -0
  89. package/bundled-skills/competitor-profiling/references/templates.md +167 -0
  90. package/bundled-skills/competitor-profiling/references/tool-reference.md +179 -0
  91. package/bundled-skills/competitor-tracking/README.md +40 -0
  92. package/bundled-skills/competitor-tracking/SKILL.md +322 -0
  93. package/bundled-skills/context-engineering/SKILL.md +302 -0
  94. package/bundled-skills/cro/SKILL.md +202 -0
  95. package/bundled-skills/cro/evals/evals.json +111 -0
  96. package/bundled-skills/cro/references/experiments.md +248 -0
  97. package/bundled-skills/cro/references/form.md +422 -0
  98. package/bundled-skills/cron-doctor/scripts/cron-engine.js +10 -7
  99. package/bundled-skills/cucumber-skill/SKILL.md +235 -0
  100. package/bundled-skills/customer-research/SKILL.md +287 -0
  101. package/bundled-skills/customer-research/evals/evals.json +162 -0
  102. package/bundled-skills/customer-research/references/source-guides.md +401 -0
  103. package/bundled-skills/cypress-skill/SKILL.md +235 -0
  104. package/bundled-skills/debugging-and-error-recovery/SKILL.md +313 -0
  105. package/bundled-skills/debugging-code/SKILL.md +284 -0
  106. package/bundled-skills/debugging-code/references/advanced-techniques.md +50 -0
  107. package/bundled-skills/debugging-code/references/installing-debuggers.md +67 -0
  108. package/bundled-skills/debugging-code/scripts/install-dap.sh +87 -0
  109. package/bundled-skills/deprecation-and-migration/SKILL.md +219 -0
  110. package/bundled-skills/design-philosophy/SKILL.md +40 -0
  111. package/bundled-skills/design-philosophy/reference.md +19 -0
  112. package/bundled-skills/design-spatial/SKILL.md +271 -0
  113. package/bundled-skills/design-spatial/scripts/layout-audit.js +138 -0
  114. package/bundled-skills/design-system/SKILL.md +140 -0
  115. package/bundled-skills/design-system/references/motion-choreography.md +111 -0
  116. package/bundled-skills/design-thinking/SKILL.md +109 -0
  117. package/bundled-skills/design-ux/SKILL.md +75 -0
  118. package/bundled-skills/dev-to-hashnode/README.md +62 -0
  119. package/bundled-skills/dev-to-hashnode/SKILL.md +399 -0
  120. package/bundled-skills/developer-advocacy/README.md +102 -0
  121. package/bundled-skills/developer-advocacy/SKILL.md +423 -0
  122. package/bundled-skills/developer-audience-context/README.md +61 -0
  123. package/bundled-skills/developer-audience-context/SKILL.md +271 -0
  124. package/bundled-skills/developer-audience-context/references/example-apitest.md +175 -0
  125. package/bundled-skills/developer-audience-context/references/template.md +152 -0
  126. package/bundled-skills/developer-churn/README.md +80 -0
  127. package/bundled-skills/developer-churn/SKILL.md +652 -0
  128. package/bundled-skills/developer-listening/README.md +30 -0
  129. package/bundled-skills/developer-listening/SKILL.md +232 -0
  130. package/bundled-skills/developer-newsletter/README.md +84 -0
  131. package/bundled-skills/developer-newsletter/SKILL.md +376 -0
  132. package/bundled-skills/developer-onboarding/README.md +35 -0
  133. package/bundled-skills/developer-onboarding/SKILL.md +530 -0
  134. package/bundled-skills/developer-sandbox/README.md +47 -0
  135. package/bundled-skills/developer-sandbox/SKILL.md +504 -0
  136. package/bundled-skills/developer-seo/README.md +36 -0
  137. package/bundled-skills/developer-seo/SKILL.md +296 -0
  138. package/bundled-skills/developer-signup-flow/README.md +36 -0
  139. package/bundled-skills/developer-signup-flow/SKILL.md +397 -0
  140. package/bundled-skills/devrel-content/README.md +81 -0
  141. package/bundled-skills/devrel-content/SKILL.md +428 -0
  142. package/bundled-skills/dispatch/SKILL.md +130 -0
  143. package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
  144. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
  145. package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
  146. package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
  147. package/bundled-skills/docs/users/bundles.md +1 -1
  148. package/bundled-skills/docs/users/claude-code-skills.md +1 -1
  149. package/bundled-skills/docs/users/faq.md +1 -1
  150. package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
  151. package/bundled-skills/docs/users/getting-started.md +1 -1
  152. package/bundled-skills/docs/users/kiro-integration.md +1 -1
  153. package/bundled-skills/docs/users/usage.md +8 -8
  154. package/bundled-skills/docs/users/visual-guide.md +8 -8
  155. package/bundled-skills/docs-as-marketing/README.md +37 -0
  156. package/bundled-skills/docs-as-marketing/SKILL.md +398 -0
  157. package/bundled-skills/documentation-and-adrs/SKILL.md +291 -0
  158. package/bundled-skills/doubt-driven-development/SKILL.md +256 -0
  159. package/bundled-skills/eas-update-insights/SKILL.md +232 -0
  160. package/bundled-skills/eas-update-insights/agents/openai.yaml +4 -0
  161. package/bundled-skills/eas-update-insights/references/channel-insights-schema.md +47 -0
  162. package/bundled-skills/eas-update-insights/references/update-insights-schema.md +69 -0
  163. package/bundled-skills/expo-api-routes/SKILL.md +9 -5
  164. package/bundled-skills/expo-api-routes/agents/openai.yaml +4 -0
  165. package/bundled-skills/expo-brownfield/SKILL.md +71 -0
  166. package/bundled-skills/expo-brownfield/agents/openai.yaml +4 -0
  167. package/bundled-skills/expo-brownfield/references/brownfield-integrated.md +526 -0
  168. package/bundled-skills/expo-brownfield/references/brownfield-isolated.md +402 -0
  169. package/bundled-skills/expo-brownfield/references/comparison.md +63 -0
  170. package/bundled-skills/expo-brownfield/references/troubleshooting.md +88 -0
  171. package/bundled-skills/expo-cicd-workflows/SKILL.md +18 -16
  172. package/bundled-skills/expo-cicd-workflows/agents/openai.yaml +4 -0
  173. package/bundled-skills/expo-cicd-workflows/scripts/fetch.js +109 -0
  174. package/bundled-skills/expo-cicd-workflows/scripts/package.json +11 -0
  175. package/bundled-skills/expo-cicd-workflows/scripts/validate.js +84 -0
  176. package/bundled-skills/expo-deployment/SKILL.md +157 -53
  177. package/bundled-skills/expo-deployment/agents/openai.yaml +4 -0
  178. package/bundled-skills/expo-deployment/references/app-store-metadata.md +497 -0
  179. package/bundled-skills/expo-deployment/references/ios-app-store.md +371 -0
  180. package/bundled-skills/expo-deployment/references/play-store.md +246 -0
  181. package/bundled-skills/expo-deployment/references/testflight.md +58 -0
  182. package/bundled-skills/expo-deployment/references/workflows.md +160 -0
  183. package/bundled-skills/expo-dev-client/SKILL.md +25 -14
  184. package/bundled-skills/expo-dev-client/agents/openai.yaml +4 -0
  185. package/bundled-skills/expo-examples/SKILL.md +111 -0
  186. package/bundled-skills/expo-examples/references/catalog.md +105 -0
  187. package/bundled-skills/expo-module/SKILL.md +152 -0
  188. package/bundled-skills/expo-module/agents/openai.yaml +4 -0
  189. package/bundled-skills/expo-module/references/config-plugin.md +90 -0
  190. package/bundled-skills/expo-module/references/create-expo-module.md +206 -0
  191. package/bundled-skills/expo-module/references/lifecycle.md +127 -0
  192. package/bundled-skills/expo-module/references/module-config.md +48 -0
  193. package/bundled-skills/expo-module/references/native-module.md +286 -0
  194. package/bundled-skills/expo-module/references/native-view.md +171 -0
  195. package/bundled-skills/expo-observe/SKILL.md +44 -0
  196. package/bundled-skills/expo-observe/references/metrics.md +47 -0
  197. package/bundled-skills/expo-observe/references/queries.md +342 -0
  198. package/bundled-skills/expo-observe/references/setup.md +255 -0
  199. package/bundled-skills/expo-tailwind-setup/SKILL.md +13 -10
  200. package/bundled-skills/expo-tailwind-setup/agents/openai.yaml +4 -0
  201. package/bundled-skills/expo-ui/SKILL.md +61 -0
  202. package/bundled-skills/expo-ui/agents/openai.yaml +4 -0
  203. package/bundled-skills/expo-ui/references/drop-in-replacements.md +27 -0
  204. package/bundled-skills/expo-ui/references/jetpack-compose.md +73 -0
  205. package/bundled-skills/expo-ui/references/swift-ui.md +73 -0
  206. package/bundled-skills/expo-ui/references/universal.md +73 -0
  207. package/bundled-skills/expo-ui/scripts/list-components.js +193 -0
  208. package/bundled-skills/faf-context/SKILL.md +106 -0
  209. package/bundled-skills/faf-go/SKILL.md +336 -0
  210. package/bundled-skills/fixing-accessibility/SKILL.md +16 -5
  211. package/bundled-skills/fixing-metadata/SKILL.md +18 -8
  212. package/bundled-skills/fixing-motion-performance/SKILL.md +17 -6
  213. package/bundled-skills/formik-patterns/SKILL.md +379 -0
  214. package/bundled-skills/free-tier-strategy/README.md +39 -0
  215. package/bundled-skills/free-tier-strategy/SKILL.md +462 -0
  216. package/bundled-skills/frontend-architecture/SKILL.md +419 -0
  217. package/bundled-skills/frontend-data-contracts/SKILL.md +331 -0
  218. package/bundled-skills/frontend-observability/SKILL.md +434 -0
  219. package/bundled-skills/frontend-optimistic-mutations/SKILL.md +278 -0
  220. package/bundled-skills/frontend-seo/SKILL.md +710 -0
  221. package/bundled-skills/frontend-slides-frontend-slides/SKILL.md +397 -0
  222. package/bundled-skills/frontend-ui-engineering/SKILL.md +341 -0
  223. package/bundled-skills/gemini-api-dev/SKILL.md +96 -53
  224. package/bundled-skills/gemini-live-api-dev/SKILL.md +339 -0
  225. package/bundled-skills/gemini-omni-flash-api/SKILL.md +335 -0
  226. package/bundled-skills/gemini-omni-flash-api/scripts/upload_file.py +218 -0
  227. package/bundled-skills/gemini-omni-flash-api/scripts/video/generate_video.py +439 -0
  228. package/bundled-skills/gemini-omni-flash-api/scripts/video/inspect_video.py +197 -0
  229. package/bundled-skills/gemini-omni-flash-api/scripts/video/prep_video.py +255 -0
  230. package/bundled-skills/gh-image/SKILL.md +10 -2
  231. package/bundled-skills/git-workflow-and-versioning/SKILL.md +313 -0
  232. package/bundled-skills/github-presence/README.md +67 -0
  233. package/bundled-skills/github-presence/SKILL.md +484 -0
  234. package/bundled-skills/graphql-schema/SKILL.md +309 -0
  235. package/bundled-skills/hf-mcp/SKILL.md +195 -0
  236. package/bundled-skills/hf-mem/SKILL.md +92 -0
  237. package/bundled-skills/hugging-face-cli/SKILL.md +155 -115
  238. package/bundled-skills/hugging-face-community-evals/SKILL.md +14 -7
  239. package/bundled-skills/hugging-face-dataset-viewer/SKILL.md +30 -37
  240. package/bundled-skills/hugging-face-gradio/SKILL.md +14 -7
  241. package/bundled-skills/hugging-face-model-trainer/SKILL.md +42 -11
  242. package/bundled-skills/hugging-face-model-trainer/references/gguf_conversion.md +5 -0
  243. package/bundled-skills/hugging-face-model-trainer/scripts/convert_to_gguf.py +57 -51
  244. package/bundled-skills/hugging-face-model-trainer/scripts/hf_benchmarks.py +659 -0
  245. package/bundled-skills/hugging-face-paper-publisher/SKILL.md +13 -6
  246. package/bundled-skills/hugging-face-papers/SKILL.md +12 -5
  247. package/bundled-skills/hugging-face-trackio/SKILL.md +11 -5
  248. package/bundled-skills/hugging-face-vision-trainer/SKILL.md +11 -5
  249. package/bundled-skills/huggingface-best/SKILL.md +143 -0
  250. package/bundled-skills/huggingface-local-models/SKILL.md +130 -0
  251. package/bundled-skills/huggingface-local-models/references/hardware.md +38 -0
  252. package/bundled-skills/huggingface-local-models/references/hub-discovery.md +178 -0
  253. package/bundled-skills/huggingface-local-models/references/quantization.md +256 -0
  254. package/bundled-skills/huggingface-lora-space-builder/SKILL.md +409 -0
  255. package/bundled-skills/huggingface-lora-space-builder/references/adapting-to-the-lora.md +113 -0
  256. package/bundled-skills/huggingface-lora-space-builder/references/base-models/krea-2.md +63 -0
  257. package/bundled-skills/huggingface-lora-space-builder/references/base-models/ltx.md +205 -0
  258. package/bundled-skills/huggingface-lora-space-builder/references/base-models/qwen-image.md +144 -0
  259. package/bundled-skills/huggingface-lora-space-builder/references/creative-mode.md +262 -0
  260. package/bundled-skills/huggingface-lora-space-builder/references/tasks.md +124 -0
  261. package/bundled-skills/huggingface-lora-space-builder/references/zerogpu-and-publishing.md +194 -0
  262. package/bundled-skills/huggingface-spaces/SKILL.md +247 -0
  263. package/bundled-skills/huggingface-spaces/references/buckets.md +89 -0
  264. package/bundled-skills/huggingface-spaces/references/debugging.md +234 -0
  265. package/bundled-skills/huggingface-spaces/references/gradio.md +171 -0
  266. package/bundled-skills/huggingface-spaces/references/grants.md +56 -0
  267. package/bundled-skills/huggingface-spaces/references/inference-providers.md +85 -0
  268. package/bundled-skills/huggingface-spaces/references/known-errors.md +232 -0
  269. package/bundled-skills/huggingface-spaces/references/requirements.md +153 -0
  270. package/bundled-skills/huggingface-spaces/references/zerogpu.md +276 -0
  271. package/bundled-skills/huggingface-tool-builder/SKILL.md +137 -0
  272. package/bundled-skills/huggingface-tool-builder/references/baseline_hf_api.py +57 -0
  273. package/bundled-skills/huggingface-tool-builder/references/baseline_hf_api.sh +40 -0
  274. package/bundled-skills/huggingface-tool-builder/references/baseline_hf_api.tsx +57 -0
  275. package/bundled-skills/huggingface-tool-builder/references/find_models_by_paper.sh +230 -0
  276. package/bundled-skills/huggingface-tool-builder/references/hf_enrich_models.sh +96 -0
  277. package/bundled-skills/huggingface-tool-builder/references/hf_model_card_frontmatter.sh +188 -0
  278. package/bundled-skills/huggingface-tool-builder/references/hf_model_papers_auth.sh +171 -0
  279. package/bundled-skills/huggingface-zerogpu/SKILL.md +306 -0
  280. package/bundled-skills/huggingface-zerogpu/references/concurrency.md +79 -0
  281. package/bundled-skills/huggingface-zerogpu/references/cuda-and-deps.md +66 -0
  282. package/bundled-skills/huggingface-zerogpu/references/how-quota-works.md +74 -0
  283. package/bundled-skills/huggingface-zerogpu/references/how-zerogpu-works.md +50 -0
  284. package/bundled-skills/hugo-to-markdown/SKILL.md +201 -0
  285. package/bundled-skills/hugo-to-markdown/agents/openai.yaml +4 -0
  286. package/bundled-skills/hugo-to-markdown/references/conversion-workflow.md +143 -0
  287. package/bundled-skills/hugo-to-markdown/references/front-matter-and-content.md +145 -0
  288. package/bundled-skills/hugo-to-markdown/references/links-assets-and-validation.md +106 -0
  289. package/bundled-skills/hugo-to-markdown/references/shortcodes-and-render-hooks.md +281 -0
  290. package/bundled-skills/hugo-to-markdown/scripts/check_standard_markdown.py +70 -0
  291. package/bundled-skills/hugo-to-markdown/scripts/inventory_hugo_rules.py +188 -0
  292. package/bundled-skills/hyperexecute-skill/SKILL.md +65 -0
  293. package/bundled-skills/idea-refine/SKILL.md +195 -0
  294. package/bundled-skills/idea-refine/examples.md +238 -0
  295. package/bundled-skills/idea-refine/frameworks.md +99 -0
  296. package/bundled-skills/idea-refine/refinement-criteria.md +113 -0
  297. package/bundled-skills/idea-refine/scripts/idea-refine.sh +15 -0
  298. package/bundled-skills/implement/SKILL.md +32 -0
  299. package/bundled-skills/incremental-implementation/SKILL.md +262 -0
  300. package/bundled-skills/jest-skill/SKILL.md +182 -0
  301. package/bundled-skills/junit-5-skill/SKILL.md +236 -0
  302. package/bundled-skills/logic-diff/SKILL.md +50 -0
  303. package/bundled-skills/logic-diff/logic-diff-guide.md +75 -0
  304. package/bundled-skills/logic-explain/SKILL.md +50 -0
  305. package/bundled-skills/logic-explain/logic-explain-guide.md +74 -0
  306. package/bundled-skills/logic-fix-all/SKILL.md +87 -0
  307. package/bundled-skills/logic-fix-all/guide-phases-0-2-consent-scope-health.md +113 -0
  308. package/bundled-skills/logic-fix-all/guide-phases-3-5-review-locate-clarify.md +47 -0
  309. package/bundled-skills/logic-fix-all/guide-phases-6-9-fix-iterate-report.md +143 -0
  310. package/bundled-skills/logic-fix-all/logic-fix-all-guide.md +60 -0
  311. package/bundled-skills/logic-locate/SKILL.md +52 -0
  312. package/bundled-skills/logic-locate/logic-locate-guide.md +85 -0
  313. package/bundled-skills/logic-review/SKILL.md +100 -0
  314. package/bundled-skills/logic-review/logic-review-guide.md +296 -0
  315. package/bundled-skills/longbridge-content/SKILL.md +87 -0
  316. package/bundled-skills/longbridge-fundamentals/SKILL.md +134 -0
  317. package/bundled-skills/longbridge-market-data/SKILL.md +129 -0
  318. package/bundled-skills/loopy/SKILL.md +289 -0
  319. package/bundled-skills/loopy/agents/openai.yaml +4 -0
  320. package/bundled-skills/loopy/references/audit.md +61 -0
  321. package/bundled-skills/loopy/references/debrief.md +43 -0
  322. package/bundled-skills/loopy/references/discover.md +72 -0
  323. package/bundled-skills/loopy/references/publish.md +65 -0
  324. package/bundled-skills/loopy/references/run.md +73 -0
  325. package/bundled-skills/marketing-plan/SKILL.md +283 -0
  326. package/bundled-skills/marketing-plan/evals/evals.json +96 -0
  327. package/bundled-skills/marketing-plan/references/aarrr-framework.md +180 -0
  328. package/bundled-skills/marketing-plan/references/budget-planning.md +168 -0
  329. package/bundled-skills/marketing-plan/references/client-types.md +373 -0
  330. package/bundled-skills/marketing-plan/references/current-state-rubric.md +255 -0
  331. package/bundled-skills/marketing-plan/references/example-quietude.md +972 -0
  332. package/bundled-skills/marketing-plan/references/funding-stage-unlocks.md +230 -0
  333. package/bundled-skills/marketing-plan/references/growth-patterns.md +148 -0
  334. package/bundled-skills/marketing-plan/references/idea-cross-reference.md +265 -0
  335. package/bundled-skills/marketing-plan/references/measurement-framework.md +213 -0
  336. package/bundled-skills/marketing-plan/references/methodology.md +363 -0
  337. package/bundled-skills/marketing-plan/references/ops-stack-mapping.md +197 -0
  338. package/bundled-skills/marketing-plan/references/plan-template.md +494 -0
  339. package/bundled-skills/marketing-plan/references/team-and-agency-model.md +278 -0
  340. package/bundled-skills/mdpr-skill/SKILL.md +233 -0
  341. package/bundled-skills/monte-carlo-analyze-root-cause/SKILL.md +229 -0
  342. package/bundled-skills/monte-carlo-asset-health/SKILL.md +200 -0
  343. package/bundled-skills/monte-carlo-monitoring-advisor/SKILL.md +317 -0
  344. package/bundled-skills/monte-carlo-performance-diagnosis/SKILL.md +153 -0
  345. package/bundled-skills/monte-carlo-remediation/SKILL.md +359 -0
  346. package/bundled-skills/monte-carlo-storage-cost-analysis/SKILL.md +162 -0
  347. package/bundled-skills/native-data-fetching/SKILL.md +11 -8
  348. package/bundled-skills/native-data-fetching/agents/openai.yaml +4 -0
  349. package/bundled-skills/native-data-fetching/references/expo-router-loaders.md +341 -0
  350. package/bundled-skills/neon-ai-gateway/SKILL.md +237 -0
  351. package/bundled-skills/neon-functions/SKILL.md +465 -0
  352. package/bundled-skills/neon-functions/references/ai-sdk.md +139 -0
  353. package/bundled-skills/neon-functions/references/hono-websockets.md +145 -0
  354. package/bundled-skills/neon-functions/references/mastra-studio.md +132 -0
  355. package/bundled-skills/neon-functions/references/mcp.md +137 -0
  356. package/bundled-skills/neon-functions/references/sentry.md +131 -0
  357. package/bundled-skills/neon-functions/references/sse.md +143 -0
  358. package/bundled-skills/neon-object-storage/SKILL.md +200 -0
  359. package/bundled-skills/neon-postgres/SKILL.md +234 -469
  360. package/bundled-skills/neon-postgres-branches/SKILL.md +292 -0
  361. package/bundled-skills/neon-postgres-egress-optimizer/SKILL.md +256 -0
  362. package/bundled-skills/newman-cicd-integration/SKILL.md +330 -0
  363. package/bundled-skills/observability-and-instrumentation/SKILL.md +216 -0
  364. package/bundled-skills/odw/SKILL.md +57 -0
  365. package/bundled-skills/offers/SKILL.md +168 -0
  366. package/bundled-skills/offers/references/bonus-stacking.md +150 -0
  367. package/bundled-skills/offers/references/examples.md +215 -0
  368. package/bundled-skills/offers/references/guarantee-design.md +172 -0
  369. package/bundled-skills/offers/references/offer-anatomy.md +203 -0
  370. package/bundled-skills/offers/references/offer-formats.md +240 -0
  371. package/bundled-skills/offers/references/scarcity-urgency.md +175 -0
  372. package/bundled-skills/offers/references/value-equation.md +134 -0
  373. package/bundled-skills/onboarding/SKILL.md +235 -0
  374. package/bundled-skills/onboarding/evals/evals.json +92 -0
  375. package/bundled-skills/onboarding/references/experiments.md +258 -0
  376. package/bundled-skills/open-source-marketing/README.md +100 -0
  377. package/bundled-skills/open-source-marketing/SKILL.md +466 -0
  378. package/bundled-skills/openapi-spec-generator/SKILL.md +335 -0
  379. package/bundled-skills/performance-optimization/SKILL.md +363 -0
  380. package/bundled-skills/planning-and-task-breakdown/SKILL.md +240 -0
  381. package/bundled-skills/polis-protocol-a-self-optimizing-city-of-agents/SKILL.md +170 -0
  382. package/bundled-skills/postgresql-cli/SKILL.md +498 -0
  383. package/bundled-skills/postgresql-cli/references/cli-options-and-variables.md +444 -0
  384. package/bundled-skills/postgresql-cli/references/meta-commands-core.md +466 -0
  385. package/bundled-skills/postgresql-cli/references/meta-commands-formatting.md +154 -0
  386. package/bundled-skills/postgresql-cli/references/meta-commands-inspection.md +134 -0
  387. package/bundled-skills/postgresql-cli/references/tips-advanced.md +289 -0
  388. package/bundled-skills/postgresql-cli/references/tips-workflows.md +407 -0
  389. package/bundled-skills/postman-collection-generator/SKILL.md +184 -0
  390. package/bundled-skills/postman-newman-automation/SKILL.md +311 -0
  391. package/bundled-skills/postman-openapi-converter/SKILL.md +174 -0
  392. package/bundled-skills/power-user-cultivation/README.md +78 -0
  393. package/bundled-skills/power-user-cultivation/SKILL.md +598 -0
  394. package/bundled-skills/pricing/SKILL.md +246 -0
  395. package/bundled-skills/pricing/evals/evals.json +90 -0
  396. package/bundled-skills/pricing/references/research-methods.md +152 -0
  397. package/bundled-skills/pricing/references/tier-structure.md +232 -0
  398. package/bundled-skills/privacy-mask/SKILL.md +96 -0
  399. package/bundled-skills/product-marketing/SKILL.md +256 -0
  400. package/bundled-skills/product-marketing/evals/evals.json +85 -0
  401. package/bundled-skills/public-relations/SKILL.md +146 -0
  402. package/bundled-skills/public-relations/references/journalist-pitching.md +368 -0
  403. package/bundled-skills/public-relations/references/media-outlets.md +207 -0
  404. package/bundled-skills/public-relations/references/newsjacking.md +218 -0
  405. package/bundled-skills/public-relations/references/press-platforms.md +188 -0
  406. package/bundled-skills/puppeteer-skill/SKILL.md +143 -0
  407. package/bundled-skills/pytest-skill/SKILL.md +201 -0
  408. package/bundled-skills/rclone-cli/SKILL.md +351 -0
  409. package/bundled-skills/rclone-cli/references/bisync.md +2003 -0
  410. package/bundled-skills/rclone-cli/references/cache.md +726 -0
  411. package/bundled-skills/rclone-cli/references/chunker.md +484 -0
  412. package/bundled-skills/rclone-cli/references/combine.md +187 -0
  413. package/bundled-skills/rclone-cli/references/commands/rclone.md +1169 -0
  414. package/bundled-skills/rclone-cli/references/commands/rclone_about.md +89 -0
  415. package/bundled-skills/rclone-cli/references/commands/rclone_archive.md +49 -0
  416. package/bundled-skills/rclone-cli/references/commands/rclone_archive_create.md +97 -0
  417. package/bundled-skills/rclone-cli/references/commands/rclone_archive_extract.md +83 -0
  418. package/bundled-skills/rclone-cli/references/commands/rclone_archive_list.md +98 -0
  419. package/bundled-skills/rclone-cli/references/commands/rclone_authorize.md +53 -0
  420. package/bundled-skills/rclone-cli/references/commands/rclone_backend.md +82 -0
  421. package/bundled-skills/rclone-cli/references/commands/rclone_bisync.md +160 -0
  422. package/bundled-skills/rclone-cli/references/commands/rclone_cat.md +122 -0
  423. package/bundled-skills/rclone-cli/references/commands/rclone_check.md +134 -0
  424. package/bundled-skills/rclone-cli/references/commands/rclone_checksum.md +120 -0
  425. package/bundled-skills/rclone-cli/references/commands/rclone_cleanup.md +49 -0
  426. package/bundled-skills/rclone-cli/references/commands/rclone_completion.md +40 -0
  427. package/bundled-skills/rclone-cli/references/commands/rclone_completion_bash.md +70 -0
  428. package/bundled-skills/rclone-cli/references/commands/rclone_completion_fish.md +57 -0
  429. package/bundled-skills/rclone-cli/references/commands/rclone_completion_powershell.md +49 -0
  430. package/bundled-skills/rclone-cli/references/commands/rclone_completion_zsh.md +57 -0
  431. package/bundled-skills/rclone-cli/references/commands/rclone_config.md +56 -0
  432. package/bundled-skills/rclone-cli/references/commands/rclone_config_create.md +150 -0
  433. package/bundled-skills/rclone-cli/references/commands/rclone_config_delete.md +33 -0
  434. package/bundled-skills/rclone-cli/references/commands/rclone_config_disconnect.md +40 -0
  435. package/bundled-skills/rclone-cli/references/commands/rclone_config_dump.md +33 -0
  436. package/bundled-skills/rclone-cli/references/commands/rclone_config_edit.md +39 -0
  437. package/bundled-skills/rclone-cli/references/commands/rclone_config_encryption.md +36 -0
  438. package/bundled-skills/rclone-cli/references/commands/rclone_config_encryption_check.md +43 -0
  439. package/bundled-skills/rclone-cli/references/commands/rclone_config_encryption_remove.md +44 -0
  440. package/bundled-skills/rclone-cli/references/commands/rclone_config_encryption_set.md +54 -0
  441. package/bundled-skills/rclone-cli/references/commands/rclone_config_file.md +33 -0
  442. package/bundled-skills/rclone-cli/references/commands/rclone_config_password.md +49 -0
  443. package/bundled-skills/rclone-cli/references/commands/rclone_config_paths.md +33 -0
  444. package/bundled-skills/rclone-cli/references/commands/rclone_config_providers.md +33 -0
  445. package/bundled-skills/rclone-cli/references/commands/rclone_config_reconnect.md +40 -0
  446. package/bundled-skills/rclone-cli/references/commands/rclone_config_redacted.md +45 -0
  447. package/bundled-skills/rclone-cli/references/commands/rclone_config_show.md +33 -0
  448. package/bundled-skills/rclone-cli/references/commands/rclone_config_string.md +57 -0
  449. package/bundled-skills/rclone-cli/references/commands/rclone_config_touch.md +33 -0
  450. package/bundled-skills/rclone-cli/references/commands/rclone_config_update.md +150 -0
  451. package/bundled-skills/rclone-cli/references/commands/rclone_config_userinfo.md +38 -0
  452. package/bundled-skills/rclone-cli/references/commands/rclone_convmv.md +440 -0
  453. package/bundled-skills/rclone-cli/references/commands/rclone_copy.md +258 -0
  454. package/bundled-skills/rclone-cli/references/commands/rclone_copyto.md +219 -0
  455. package/bundled-skills/rclone-cli/references/commands/rclone_copyurl.md +91 -0
  456. package/bundled-skills/rclone-cli/references/commands/rclone_cryptcheck.md +141 -0
  457. package/bundled-skills/rclone-cli/references/commands/rclone_cryptdecode.md +51 -0
  458. package/bundled-skills/rclone-cli/references/commands/rclone_dedupe.md +166 -0
  459. package/bundled-skills/rclone-cli/references/commands/rclone_delete.md +117 -0
  460. package/bundled-skills/rclone-cli/references/commands/rclone_deletefile.md +50 -0
  461. package/bundled-skills/rclone-cli/references/commands/rclone_gendocs.md +39 -0
  462. package/bundled-skills/rclone-cli/references/commands/rclone_gitannex.md +113 -0
  463. package/bundled-skills/rclone-cli/references/commands/rclone_hashsum.md +120 -0
  464. package/bundled-skills/rclone-cli/references/commands/rclone_link.md +60 -0
  465. package/bundled-skills/rclone-cli/references/commands/rclone_listremotes.md +55 -0
  466. package/bundled-skills/rclone-cli/references/commands/rclone_ls.md +114 -0
  467. package/bundled-skills/rclone-cli/references/commands/rclone_lsd.md +127 -0
  468. package/bundled-skills/rclone-cli/references/commands/rclone_lsf.md +241 -0
  469. package/bundled-skills/rclone-cli/references/commands/rclone_lsjson.md +195 -0
  470. package/bundled-skills/rclone-cli/references/commands/rclone_lsl.md +115 -0
  471. package/bundled-skills/rclone-cli/references/commands/rclone_md5sum.md +96 -0
  472. package/bundled-skills/rclone-cli/references/commands/rclone_mkdir.md +43 -0
  473. package/bundled-skills/rclone-cli/references/commands/rclone_mount.md +1105 -0
  474. package/bundled-skills/rclone-cli/references/commands/rclone_move.md +223 -0
  475. package/bundled-skills/rclone-cli/references/commands/rclone_moveto.md +218 -0
  476. package/bundled-skills/rclone-cli/references/commands/rclone_ncdu.md +140 -0
  477. package/bundled-skills/rclone-cli/references/commands/rclone_nfsmount.md +1111 -0
  478. package/bundled-skills/rclone-cli/references/commands/rclone_obscure.md +60 -0
  479. package/bundled-skills/rclone-cli/references/commands/rclone_purge.md +58 -0
  480. package/bundled-skills/rclone-cli/references/commands/rclone_rc.md +111 -0
  481. package/bundled-skills/rclone-cli/references/commands/rclone_rcat.md +79 -0
  482. package/bundled-skills/rclone-cli/references/commands/rclone_rcd.md +219 -0
  483. package/bundled-skills/rclone-cli/references/commands/rclone_rmdir.md +52 -0
  484. package/bundled-skills/rclone-cli/references/commands/rclone_rmdirs.md +66 -0
  485. package/bundled-skills/rclone-cli/references/commands/rclone_selfupdate.md +91 -0
  486. package/bundled-skills/rclone-cli/references/commands/rclone_serve.md +61 -0
  487. package/bundled-skills/rclone-cli/references/commands/rclone_serve_dlna.md +619 -0
  488. package/bundled-skills/rclone-cli/references/commands/rclone_serve_docker.md +653 -0
  489. package/bundled-skills/rclone-cli/references/commands/rclone_serve_ftp.md +698 -0
  490. package/bundled-skills/rclone-cli/references/commands/rclone_serve_http.md +837 -0
  491. package/bundled-skills/rclone-cli/references/commands/rclone_serve_nfs.md +670 -0
  492. package/bundled-skills/rclone-cli/references/commands/rclone_serve_restic.md +246 -0
  493. package/bundled-skills/rclone-cli/references/commands/rclone_serve_s3.md +867 -0
  494. package/bundled-skills/rclone-cli/references/commands/rclone_serve_sftp.md +745 -0
  495. package/bundled-skills/rclone-cli/references/commands/rclone_serve_webdav.md +896 -0
  496. package/bundled-skills/rclone-cli/references/commands/rclone_settier.md +63 -0
  497. package/bundled-skills/rclone-cli/references/commands/rclone_sha1sum.md +99 -0
  498. package/bundled-skills/rclone-cli/references/commands/rclone_size.md +94 -0
  499. package/bundled-skills/rclone-cli/references/commands/rclone_sync.md +252 -0
  500. package/bundled-skills/rclone-cli/references/commands/rclone_test.md +51 -0
  501. package/bundled-skills/rclone-cli/references/commands/rclone_test_changenotify.md +34 -0
  502. package/bundled-skills/rclone-cli/references/commands/rclone_test_histogram.md +41 -0
  503. package/bundled-skills/rclone-cli/references/commands/rclone_test_info.md +51 -0
  504. package/bundled-skills/rclone-cli/references/commands/rclone_test_makefile.md +39 -0
  505. package/bundled-skills/rclone-cli/references/commands/rclone_test_makefiles.md +47 -0
  506. package/bundled-skills/rclone-cli/references/commands/rclone_test_memory.md +33 -0
  507. package/bundled-skills/rclone-cli/references/commands/rclone_test_speed.md +66 -0
  508. package/bundled-skills/rclone-cli/references/commands/rclone_touch.md +110 -0
  509. package/bundled-skills/rclone-cli/references/commands/rclone_tree.md +121 -0
  510. package/bundled-skills/rclone-cli/references/commands/rclone_version.md +83 -0
  511. package/bundled-skills/rclone-cli/references/crypt.md +844 -0
  512. package/bundled-skills/rclone-cli/references/docker.md +615 -0
  513. package/bundled-skills/rclone-cli/references/faq.md +364 -0
  514. package/bundled-skills/rclone-cli/references/filtering.md +991 -0
  515. package/bundled-skills/rclone-cli/references/flags.md +1221 -0
  516. package/bundled-skills/rclone-cli/references/hasher.md +383 -0
  517. package/bundled-skills/rclone-cli/references/install.md +686 -0
  518. package/bundled-skills/rclone-cli/references/overview.md +620 -0
  519. package/bundled-skills/rclone-cli/references/providers/alias.md +141 -0
  520. package/bundled-skills/rclone-cli/references/providers/archive.md +287 -0
  521. package/bundled-skills/rclone-cli/references/providers/azureblob.md +1140 -0
  522. package/bundled-skills/rclone-cli/references/providers/azurefiles.md +834 -0
  523. package/bundled-skills/rclone-cli/references/providers/b2.md +879 -0
  524. package/bundled-skills/rclone-cli/references/providers/box.md +573 -0
  525. package/bundled-skills/rclone-cli/references/providers/cloudinary.md +259 -0
  526. package/bundled-skills/rclone-cli/references/providers/compress.md +222 -0
  527. package/bundled-skills/rclone-cli/references/providers/drime.md +319 -0
  528. package/bundled-skills/rclone-cli/references/providers/drive.md +2032 -0
  529. package/bundled-skills/rclone-cli/references/providers/dropbox.md +661 -0
  530. package/bundled-skills/rclone-cli/references/providers/fichier.md +230 -0
  531. package/bundled-skills/rclone-cli/references/providers/filefabric.md +298 -0
  532. package/bundled-skills/rclone-cli/references/providers/filelu.md +256 -0
  533. package/bundled-skills/rclone-cli/references/providers/filen.md +243 -0
  534. package/bundled-skills/rclone-cli/references/providers/filescom.md +209 -0
  535. package/bundled-skills/rclone-cli/references/providers/ftp.md +621 -0
  536. package/bundled-skills/rclone-cli/references/providers/gofile.md +274 -0
  537. package/bundled-skills/rclone-cli/references/providers/googlecloudstorage.md +846 -0
  538. package/bundled-skills/rclone-cli/references/providers/googlephotos.md +676 -0
  539. package/bundled-skills/rclone-cli/references/providers/hdfs.md +263 -0
  540. package/bundled-skills/rclone-cli/references/providers/hidrive.md +487 -0
  541. package/bundled-skills/rclone-cli/references/providers/http.md +323 -0
  542. package/bundled-skills/rclone-cli/references/providers/iclouddrive.md +212 -0
  543. package/bundled-skills/rclone-cli/references/providers/internetarchive.md +355 -0
  544. package/bundled-skills/rclone-cli/references/providers/internxt.md +189 -0
  545. package/bundled-skills/rclone-cli/references/providers/jottacloud.md +604 -0
  546. package/bundled-skills/rclone-cli/references/providers/koofr.md +395 -0
  547. package/bundled-skills/rclone-cli/references/providers/linkbox.md +117 -0
  548. package/bundled-skills/rclone-cli/references/providers/local.md +749 -0
  549. package/bundled-skills/rclone-cli/references/providers/mailru.md +470 -0
  550. package/bundled-skills/rclone-cli/references/providers/mega.md +361 -0
  551. package/bundled-skills/rclone-cli/references/providers/memory.md +109 -0
  552. package/bundled-skills/rclone-cli/references/providers/netstorage.md +371 -0
  553. package/bundled-skills/rclone-cli/references/providers/onedrive.md +1322 -0
  554. package/bundled-skills/rclone-cli/references/providers/opendrive.md +222 -0
  555. package/bundled-skills/rclone-cli/references/providers/oracleobjectstorage/_index.md +932 -0
  556. package/bundled-skills/rclone-cli/references/providers/oracleobjectstorage/tutorial_mount.md +503 -0
  557. package/bundled-skills/rclone-cli/references/providers/pcloud.md +373 -0
  558. package/bundled-skills/rclone-cli/references/providers/pikpak.md +373 -0
  559. package/bundled-skills/rclone-cli/references/providers/pixeldrain.md +182 -0
  560. package/bundled-skills/rclone-cli/references/providers/premiumizeme.md +253 -0
  561. package/bundled-skills/rclone-cli/references/providers/protondrive.md +397 -0
  562. package/bundled-skills/rclone-cli/references/providers/putio.md +246 -0
  563. package/bundled-skills/rclone-cli/references/providers/qingstor.md +346 -0
  564. package/bundled-skills/rclone-cli/references/providers/quatrix.md +295 -0
  565. package/bundled-skills/rclone-cli/references/providers/s3.md +9687 -0
  566. package/bundled-skills/rclone-cli/references/providers/seafile.md +432 -0
  567. package/bundled-skills/rclone-cli/references/providers/sftp.md +1277 -0
  568. package/bundled-skills/rclone-cli/references/providers/shade.md +267 -0
  569. package/bundled-skills/rclone-cli/references/providers/sharefile.md +357 -0
  570. package/bundled-skills/rclone-cli/references/providers/sia.md +223 -0
  571. package/bundled-skills/rclone-cli/references/providers/smb.md +309 -0
  572. package/bundled-skills/rclone-cli/references/providers/storj.md +503 -0
  573. package/bundled-skills/rclone-cli/references/providers/sugarsync.md +305 -0
  574. package/bundled-skills/rclone-cli/references/providers/swift.md +744 -0
  575. package/bundled-skills/rclone-cli/references/providers/ulozto.md +283 -0
  576. package/bundled-skills/rclone-cli/references/providers/webdav.md +565 -0
  577. package/bundled-skills/rclone-cli/references/providers/yandex.md +283 -0
  578. package/bundled-skills/rclone-cli/references/providers/zoho.md +305 -0
  579. package/bundled-skills/rclone-cli/references/rc.md +2725 -0
  580. package/bundled-skills/rclone-cli/references/union.md +336 -0
  581. package/bundled-skills/rclone-cli/references/usage.md +3555 -0
  582. package/bundled-skills/rclone-cli/scripts/install.sh +204 -0
  583. package/bundled-skills/redis-cli/SKILL.md +392 -0
  584. package/bundled-skills/redis-cli/references/advanced-features.md +338 -0
  585. package/bundled-skills/redis-cli/references/connection-and-options.md +258 -0
  586. package/bundled-skills/redis-cli/references/data-query-commands.md +417 -0
  587. package/bundled-skills/redis-cli/references/inspection-and-monitoring.md +309 -0
  588. package/bundled-skills/redis-cli/references/key-management.md +252 -0
  589. package/bundled-skills/redis-cli/references/module-data-types.md +429 -0
  590. package/bundled-skills/redis-cli/references/server-administration.md +366 -0
  591. package/bundled-skills/repo-maintainer/SKILL.md +480 -0
  592. package/bundled-skills/resolving-merge-conflicts/SKILL.md +32 -0
  593. package/bundled-skills/review-and-simplify-changes/SKILL.md +202 -0
  594. package/bundled-skills/review-swarm/SKILL.md +185 -0
  595. package/bundled-skills/review-swarm/agents/openai.yaml +4 -0
  596. package/bundled-skills/riffkit/SKILL.md +122 -0
  597. package/bundled-skills/robot-framework-skill/SKILL.md +153 -0
  598. package/bundled-skills/sdk-dx/README.md +39 -0
  599. package/bundled-skills/sdk-dx/SKILL.md +541 -0
  600. package/bundled-skills/security-and-hardening/SKILL.md +474 -0
  601. package/bundled-skills/selenium-skill/SKILL.md +258 -0
  602. package/bundled-skills/shipping-and-launch/SKILL.md +323 -0
  603. package/bundled-skills/smartui-skill/SKILL.md +149 -0
  604. package/bundled-skills/source-driven-development/SKILL.md +207 -0
  605. package/bundled-skills/spec-driven-development/SKILL.md +217 -0
  606. package/bundled-skills/sql-sentinel/SKILL.md +12 -3
  607. package/bundled-skills/styleseed-design-review/SKILL.md +126 -0
  608. package/bundled-skills/supabase/CHANGELOG.md +35 -0
  609. package/bundled-skills/supabase/SKILL.md +149 -0
  610. package/bundled-skills/supabase/assets/feedback-issue-template.md +17 -0
  611. package/bundled-skills/supabase/references/skill-feedback.md +17 -0
  612. package/bundled-skills/supabase-postgres-best-practices/CHANGELOG.md +29 -0
  613. package/bundled-skills/supabase-postgres-best-practices/SKILL.md +74 -0
  614. package/bundled-skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
  615. package/bundled-skills/supabase-postgres-best-practices/references/_sections.md +39 -0
  616. package/bundled-skills/supabase-postgres-best-practices/references/_template.md +34 -0
  617. package/bundled-skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  618. package/bundled-skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  619. package/bundled-skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  620. package/bundled-skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  621. package/bundled-skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  622. package/bundled-skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  623. package/bundled-skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  624. package/bundled-skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  625. package/bundled-skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  626. package/bundled-skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  627. package/bundled-skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  628. package/bundled-skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  629. package/bundled-skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  630. package/bundled-skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  631. package/bundled-skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  632. package/bundled-skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  633. package/bundled-skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  634. package/bundled-skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  635. package/bundled-skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  636. package/bundled-skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  637. package/bundled-skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  638. package/bundled-skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  639. package/bundled-skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  640. package/bundled-skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  641. package/bundled-skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  642. package/bundled-skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  643. package/bundled-skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  644. package/bundled-skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  645. package/bundled-skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  646. package/bundled-skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  647. package/bundled-skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
  648. package/bundled-skills/swiftui-expert-skill/SKILL.md +175 -242
  649. package/bundled-skills/swiftui-expert-skill/references/accessibility-patterns.md +215 -0
  650. package/bundled-skills/swiftui-expert-skill/references/animation-advanced.md +428 -0
  651. package/bundled-skills/swiftui-expert-skill/references/animation-basics.md +284 -0
  652. package/bundled-skills/swiftui-expert-skill/references/animation-transitions.md +326 -0
  653. package/bundled-skills/swiftui-expert-skill/references/charts-accessibility.md +135 -0
  654. package/bundled-skills/swiftui-expert-skill/references/charts.md +602 -0
  655. package/bundled-skills/swiftui-expert-skill/references/focus-patterns.md +299 -0
  656. package/bundled-skills/swiftui-expert-skill/references/image-optimization.md +203 -0
  657. package/bundled-skills/swiftui-expert-skill/references/latest-apis.md +528 -0
  658. package/bundled-skills/swiftui-expert-skill/references/layout-best-practices.md +266 -0
  659. package/bundled-skills/swiftui-expert-skill/references/liquid-glass.md +423 -0
  660. package/bundled-skills/swiftui-expert-skill/references/list-patterns.md +467 -0
  661. package/bundled-skills/swiftui-expert-skill/references/localization.md +194 -0
  662. package/bundled-skills/swiftui-expert-skill/references/macos-scenes.md +318 -0
  663. package/bundled-skills/swiftui-expert-skill/references/macos-views.md +357 -0
  664. package/bundled-skills/swiftui-expert-skill/references/macos-window-styling.md +303 -0
  665. package/bundled-skills/swiftui-expert-skill/references/performance-patterns.md +417 -0
  666. package/bundled-skills/swiftui-expert-skill/references/previews.md +313 -0
  667. package/bundled-skills/swiftui-expert-skill/references/scroll-patterns.md +293 -0
  668. package/bundled-skills/swiftui-expert-skill/references/sheet-navigation-patterns.md +363 -0
  669. package/bundled-skills/swiftui-expert-skill/references/soft-deprecation.md +39 -0
  670. package/bundled-skills/swiftui-expert-skill/references/state-management.md +492 -0
  671. package/bundled-skills/swiftui-expert-skill/references/text-patterns.md +34 -0
  672. package/bundled-skills/swiftui-expert-skill/references/trace-analysis.md +295 -0
  673. package/bundled-skills/swiftui-expert-skill/references/trace-recording.md +134 -0
  674. package/bundled-skills/swiftui-expert-skill/references/view-structure.md +854 -0
  675. package/bundled-skills/swiftui-expert-skill/scripts/analyze_trace.py +301 -0
  676. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/__init__.py +1 -0
  677. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/causes.py +187 -0
  678. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/correlate.py +179 -0
  679. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/events.py +291 -0
  680. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/hangs.py +108 -0
  681. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/hitches.py +145 -0
  682. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/summary.py +243 -0
  683. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/swiftui.py +195 -0
  684. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/time_profiler.py +135 -0
  685. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/xctrace.py +117 -0
  686. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/xml_utils.py +224 -0
  687. package/bundled-skills/swiftui-expert-skill/scripts/record_trace.py +252 -0
  688. package/bundled-skills/technical-tutorials/README.md +90 -0
  689. package/bundled-skills/technical-tutorials/SKILL.md +581 -0
  690. package/bundled-skills/test-framework-migration-skill/SKILL.md +122 -0
  691. package/bundled-skills/testng-skill/SKILL.md +163 -0
  692. package/bundled-skills/train-sentence-transformers/SKILL.md +118 -0
  693. package/bundled-skills/train-sentence-transformers/references/base_model_selection.md +79 -0
  694. package/bundled-skills/train-sentence-transformers/references/dataset_formats.md +128 -0
  695. package/bundled-skills/train-sentence-transformers/references/evaluators_cross_encoder.md +116 -0
  696. package/bundled-skills/train-sentence-transformers/references/evaluators_sentence_transformer.md +151 -0
  697. package/bundled-skills/train-sentence-transformers/references/evaluators_sparse_encoder.md +121 -0
  698. package/bundled-skills/train-sentence-transformers/references/hardware_guide.md +105 -0
  699. package/bundled-skills/train-sentence-transformers/references/hf_jobs_execution.md +173 -0
  700. package/bundled-skills/train-sentence-transformers/references/losses_cross_encoder.md +137 -0
  701. package/bundled-skills/train-sentence-transformers/references/losses_sentence_transformer.md +246 -0
  702. package/bundled-skills/train-sentence-transformers/references/losses_sparse_encoder.md +106 -0
  703. package/bundled-skills/train-sentence-transformers/references/model_architectures.md +178 -0
  704. package/bundled-skills/train-sentence-transformers/references/prompts_and_instructions.md +160 -0
  705. package/bundled-skills/train-sentence-transformers/references/training_args.md +269 -0
  706. package/bundled-skills/train-sentence-transformers/references/troubleshooting.md +225 -0
  707. package/bundled-skills/train-sentence-transformers/scripts/mine_hard_negatives.py +199 -0
  708. package/bundled-skills/train-sentence-transformers/scripts/train_cross_encoder_distillation_example.py +254 -0
  709. package/bundled-skills/train-sentence-transformers/scripts/train_cross_encoder_example.py +253 -0
  710. package/bundled-skills/train-sentence-transformers/scripts/train_cross_encoder_listwise_example.py +282 -0
  711. package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_distillation_example.py +303 -0
  712. package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_example.py +227 -0
  713. package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_make_multilingual_example.py +308 -0
  714. package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_matryoshka_example.py +212 -0
  715. package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_multi_dataset_example.py +258 -0
  716. package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_static_embedding_example.py +273 -0
  717. package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_with_lora_example.py +275 -0
  718. package/bundled-skills/train-sentence-transformers/scripts/train_sparse_encoder_distillation_example.py +262 -0
  719. package/bundled-skills/train-sentence-transformers/scripts/train_sparse_encoder_example.py +237 -0
  720. package/bundled-skills/transformers-js/SKILL.md +83 -29
  721. package/bundled-skills/transformers-js/references/CONFIGURATION.md +55 -7
  722. package/bundled-skills/transformers-js/references/EXAMPLES.md +98 -83
  723. package/bundled-skills/transformers-js/references/MODEL_REGISTRY.md +197 -0
  724. package/bundled-skills/transformers-js/references/PIPELINE_OPTIONS.md +31 -19
  725. package/bundled-skills/transformers-js/references/TEXT_GENERATION.md +18 -18
  726. package/bundled-skills/trl-training/SKILL.md +327 -0
  727. package/bundled-skills/tune-monitor/SKILL.md +268 -0
  728. package/bundled-skills/ui-a11y/SKILL.md +76 -68
  729. package/bundled-skills/ui-component/SKILL.md +54 -82
  730. package/bundled-skills/ui-lint/SKILL.md +111 -0
  731. package/bundled-skills/ui-motion/SKILL.md +181 -0
  732. package/bundled-skills/ui-page/SKILL.md +80 -90
  733. package/bundled-skills/ui-pattern/SKILL.md +50 -68
  734. package/bundled-skills/ui-review/SKILL.md +95 -77
  735. package/bundled-skills/ui-score/SKILL.md +145 -0
  736. package/bundled-skills/ui-setup/SKILL.md +196 -88
  737. package/bundled-skills/ui-skills-root/SKILL.md +72 -0
  738. package/bundled-skills/ui-tokens/SKILL.md +44 -52
  739. package/bundled-skills/ui-update/SKILL.md +167 -0
  740. package/bundled-skills/unslop-commit/SKILL.md +113 -0
  741. package/bundled-skills/unslop-file/SKILL.md +157 -0
  742. package/bundled-skills/unslop-review/SKILL.md +102 -0
  743. package/bundled-skills/update-swiftui-apis/SKILL.md +120 -0
  744. package/bundled-skills/update-swiftui-apis/references/scan-manifest.md +230 -0
  745. package/bundled-skills/upgrading-expo/SKILL.md +107 -82
  746. package/bundled-skills/upgrading-expo/agents/openai.yaml +4 -0
  747. package/bundled-skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
  748. package/bundled-skills/upgrading-expo/references/expo-av-to-video.md +160 -0
  749. package/bundled-skills/upgrading-expo/references/native-tabs.md +124 -0
  750. package/bundled-skills/upgrading-expo/references/new-architecture.md +79 -0
  751. package/bundled-skills/upgrading-expo/references/react-19.md +79 -0
  752. package/bundled-skills/upgrading-expo/references/react-compiler.md +59 -0
  753. package/bundled-skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
  754. package/bundled-skills/usage-based-pricing/README.md +40 -0
  755. package/bundled-skills/usage-based-pricing/SKILL.md +547 -0
  756. package/bundled-skills/use-dom/SKILL.md +428 -0
  757. package/bundled-skills/use-dom/agents/openai.yaml +4 -0
  758. package/bundled-skills/ux-audit/SKILL.md +112 -44
  759. package/bundled-skills/ux-copy/SKILL.md +105 -73
  760. package/bundled-skills/ux-feedback/SKILL.md +106 -58
  761. package/bundled-skills/ux-flow/SKILL.md +51 -50
  762. package/bundled-skills/vitest-skill/SKILL.md +165 -0
  763. package/bundled-skills/weaviate/references/environment_requirements.md +4 -1
  764. package/bundled-skills/weaviate/scripts/weaviate_conn.py +51 -17
  765. package/bundled-skills/webdriverio-skill/SKILL.md +157 -0
  766. package/bundled-skills/wjttc-builder/SKILL.md +355 -0
  767. package/bundled-skills/wjttc-tester/SKILL.md +190 -0
  768. package/bundled-skills/youtube-notetaker/scripts/serve.py +20 -11
  769. package/package.json +1 -1
  770. package/skills_index.json +4404 -146
@@ -0,0 +1,2003 @@
1
+ ---
2
+ title: "Bisync"
3
+ description: "Bidirectional cloud sync solution in rclone"
4
+ versionIntroduced: "v1.58"
5
+ ---
6
+
7
+ > **Official documentation:** [https://rclone.org/bisync/](https://rclone.org/bisync/)
8
+ ## Bisync
9
+
10
+ `bisync` is considered an **advanced command**, so use with care.
11
+ Make sure you have read and understood the entire
12
+ [manual](https://rclone.org/bisync) (especially the [Limitations](#limitations)
13
+ section) before using, or data loss can result. Questions can be asked in the
14
+ [Rclone Forum](https://forum.rclone.org/).
15
+
16
+ ## Getting started {#getting-started}
17
+
18
+ - [Install rclone](/install/) and setup your remotes.
19
+ - Bisync will create its working directory at `~/.cache/rclone/bisync` on
20
+ Linux, `/Users/yourusername/Library/Caches/rclone/bisync` on Mac, or
21
+ `C:\Users\MyLogin\AppData\Local\rclone\bisync` on Windows. Make sure that this
22
+ location is writable.
23
+ - Run bisync with the `--resync` flag, specifying the paths
24
+ to the local and remote sync directory roots.
25
+ - For successive sync runs, leave off the `--resync` flag. (**Important!**)
26
+ - Consider using a [filters file](#filtering) for excluding
27
+ unnecessary files and directories from the sync.
28
+ - Consider setting up the [--check-access](#check-access) feature
29
+ for safety.
30
+ - On Linux or Mac, consider setting up a [crontab entry](#cron). bisync can
31
+ safely run in concurrent cron jobs thanks to lock files it maintains.
32
+
33
+ For example, your first command might look like this:
34
+
35
+ ```console
36
+ rclone bisync remote1:path1 remote2:path2 --create-empty-src-dirs --compare size,modtime,checksum --slow-hash-sync-only --resilient -MvP --drive-skip-gdocs --fix-case --resync --dry-run
37
+ ```
38
+
39
+ If all looks good, run it again without `--dry-run`.
40
+ After that, remove `--resync` as well.
41
+
42
+ Here is a typical run log (with timestamps removed for clarity):
43
+
44
+ ```console
45
+ rclone bisync /testdir/path1/ /testdir/path2/ --verbose
46
+ INFO : Synching Path1 "/testdir/path1/" with Path2 "/testdir/path2/"
47
+ INFO : Path1 checking for diffs
48
+ INFO : - Path1 File is new - file11.txt
49
+ INFO : - Path1 File is newer - file2.txt
50
+ INFO : - Path1 File is newer - file5.txt
51
+ INFO : - Path1 File is newer - file7.txt
52
+ INFO : - Path1 File was deleted - file4.txt
53
+ INFO : - Path1 File was deleted - file6.txt
54
+ INFO : - Path1 File was deleted - file8.txt
55
+ INFO : Path1: 7 changes: 1 new, 3 newer, 0 older, 3 deleted
56
+ INFO : Path2 checking for diffs
57
+ INFO : - Path2 File is new - file10.txt
58
+ INFO : - Path2 File is newer - file1.txt
59
+ INFO : - Path2 File is newer - file5.txt
60
+ INFO : - Path2 File is newer - file6.txt
61
+ INFO : - Path2 File was deleted - file3.txt
62
+ INFO : - Path2 File was deleted - file7.txt
63
+ INFO : - Path2 File was deleted - file8.txt
64
+ INFO : Path2: 7 changes: 1 new, 3 newer, 0 older, 3 deleted
65
+ INFO : Applying changes
66
+ INFO : - Path1 Queue copy to Path2 - /testdir/path2/file11.txt
67
+ INFO : - Path1 Queue copy to Path2 - /testdir/path2/file2.txt
68
+ INFO : - Path2 Queue delete - /testdir/path2/file4.txt
69
+ NOTICE: - WARNING New or changed in both paths - file5.txt
70
+ NOTICE: - Path1 Renaming Path1 copy - /testdir/path1/file5.txt..path1
71
+ NOTICE: - Path1 Queue copy to Path2 - /testdir/path2/file5.txt..path1
72
+ NOTICE: - Path2 Renaming Path2 copy - /testdir/path2/file5.txt..path2
73
+ NOTICE: - Path2 Queue copy to Path1 - /testdir/path1/file5.txt..path2
74
+ INFO : - Path2 Queue copy to Path1 - /testdir/path1/file6.txt
75
+ INFO : - Path1 Queue copy to Path2 - /testdir/path2/file7.txt
76
+ INFO : - Path2 Queue copy to Path1 - /testdir/path1/file1.txt
77
+ INFO : - Path2 Queue copy to Path1 - /testdir/path1/file10.txt
78
+ INFO : - Path1 Queue delete - /testdir/path1/file3.txt
79
+ INFO : - Path2 Do queued copies to - Path1
80
+ INFO : - Path1 Do queued copies to - Path2
81
+ INFO : - Do queued deletes on - Path1
82
+ INFO : - Do queued deletes on - Path2
83
+ INFO : Updating listings
84
+ INFO : Validating listings for Path1 "/testdir/path1/" vs Path2 "/testdir/path2/"
85
+ INFO : Bisync successful
86
+ ```
87
+
88
+ ## Command line syntax
89
+
90
+ ```console
91
+ $ rclone bisync --help
92
+ Usage:
93
+ rclone bisync remote1:path1 remote2:path2 [flags]
94
+
95
+ Positional arguments:
96
+ Path1, Path2 Local path, or remote storage with ':' plus optional path.
97
+ Type 'rclone listremotes' for list of configured remotes.
98
+
99
+ Optional Flags:
100
+ --backup-dir1 string --backup-dir for Path1. Must be a non-overlapping path on the same remote.
101
+ --backup-dir2 string --backup-dir for Path2. Must be a non-overlapping path on the same remote.
102
+ --check-access Ensure expected RCLONE_TEST files are found on both Path1 and Path2 filesystems, else abort.
103
+ --check-filename string Filename for --check-access (default: RCLONE_TEST)
104
+ --check-sync string Controls comparison of final listings: true|false|only (default: true) (default "true")
105
+ --compare string Comma-separated list of bisync-specific compare options ex. 'size,modtime,checksum' (default: 'size,modtime')
106
+ --conflict-loser ConflictLoserAction Action to take on the loser of a sync conflict (when there is a winner) or on both files (when there is no winner): , num, pathname, delete (default: num)
107
+ --conflict-resolve string Automatically resolve conflicts by preferring the version that is: none, path1, path2, newer, older, larger, smaller (default: none) (default "none")
108
+ --conflict-suffix string Suffix to use when renaming a --conflict-loser. Can be either one string or two comma-separated strings to assign different suffixes to Path1/Path2. (default: 'conflict')
109
+ --create-empty-src-dirs Sync creation and deletion of empty directories. (Not compatible with --remove-empty-dirs)
110
+ --download-hash Compute hash by downloading when otherwise unavailable. (warning: may be slow and use lots of data!)
111
+ --filters-file string Read filtering patterns from a file
112
+ --force Bypass --max-delete safety check and run the sync. Consider using with --verbose
113
+ -h, --help help for bisync
114
+ --ignore-listing-checksum Do not use checksums for listings (add --ignore-checksum to additionally skip post-copy checksum checks)
115
+ --max-lock Duration Consider lock files older than this to be expired (default: 0 (never expire)) (minimum: 2m) (default 0s)
116
+ --no-cleanup Retain working files (useful for troubleshooting and testing).
117
+ --no-slow-hash Ignore listing checksums only on backends where they are slow
118
+ --recover Automatically recover from interruptions without requiring --resync.
119
+ --remove-empty-dirs Remove ALL empty directories at the final cleanup step.
120
+ --resilient Allow future runs to retry after certain less-serious errors, instead of requiring --resync.
121
+ -1, --resync Performs the resync run. Equivalent to --resync-mode path1. Consider using --verbose or --dry-run first.
122
+ --resync-mode string During resync, prefer the version that is: path1, path2, newer, older, larger, smaller (default: path1 if --resync, otherwise none for no resync.) (default "none")
123
+ --retries int Retry operations this many times if they fail (requires --resilient). (default 3)
124
+ --retries-sleep Duration Interval between retrying operations if they fail, e.g. 500ms, 60s, 5m (0 to disable) (default 0s)
125
+ --slow-hash-sync-only Ignore slow checksums for listings and deltas, but still consider them during sync calls.
126
+ --workdir string Use custom working dir - useful for testing. (default: {WORKDIR})
127
+ --max-delete PERCENT Safety check on maximum percentage of deleted files allowed. If exceeded, the bisync run will abort. (default: 50%)
128
+ -n, --dry-run Go through the motions - No files are copied/deleted.
129
+ -v, --verbose Increases logging verbosity. May be specified more than once for more details.
130
+ ```
131
+
132
+ Arbitrary rclone flags may be specified on the
133
+ [bisync command line](/commands/rclone_bisync/), for example
134
+ `rclone bisync ./testdir/path1/ gdrive:testdir/path2/ --drive-skip-gdocs -v -v
135
+ --timeout 10s`
136
+ Note that interactions of various rclone flags with bisync process flow
137
+ has not been fully tested yet.
138
+
139
+ ### Paths
140
+
141
+ Path1 and Path2 arguments may be references to any mix of local directory
142
+ paths (absolute or relative), UNC paths (`//server/share/path`),
143
+ Windows drive paths (with a drive letter and `:`) or configured
144
+ [remotes](/docs/#syntax-of-remote-paths) with optional subdirectory paths.
145
+ Cloud references are distinguished by having a `:` in the argument
146
+ (see [Windows support](#windows) below).
147
+
148
+ Path1 and Path2 are treated equally, in that neither has priority for file
149
+ changes (except during [`--resync`](#resync)), and access efficiency does not
150
+ change whether a remote is on Path1 or Path2.
151
+
152
+ The listings in bisync working directory (default: `~/.cache/rclone/bisync`)
153
+ are named based on the Path1 and Path2 arguments so that separate syncs
154
+ to individual directories within the tree may be set up, e.g.:
155
+ `path_to_local_tree..dropbox_subdir.lst`.
156
+
157
+ Any empty directories after the sync on both the Path1 and Path2 filesystems are
158
+ not deleted by default, unless `--create-empty-src-dirs` is specified. If the
159
+ `--remove-empty-dirs` flag is specified, then both paths will have ALL empty
160
+ directories purged as the last step in the process.
161
+
162
+ ## Command-line flags
163
+
164
+ ### --resync
165
+
166
+ This will effectively make both Path1 and Path2 filesystems contain a matching
167
+ superset of all files. By default, Path2 files that do not exist in Path1 will
168
+ be copied to Path1, and the process will then copy the Path1 tree to Path2.
169
+
170
+ The `--resync` sequence is roughly equivalent to the following
171
+ (but see [`--resync-mode`](#resync-mode) for other options):
172
+
173
+ ```console
174
+ rclone copy Path2 Path1 --ignore-existing [--create-empty-src-dirs]
175
+ rclone copy Path1 Path2 [--create-empty-src-dirs]
176
+ ```
177
+
178
+ The base directories on both Path1 and Path2 filesystems must exist
179
+ or bisync will fail. This is required for safety - that bisync can verify
180
+ that both paths are valid.
181
+
182
+ When using `--resync`, a newer version of a file on the Path2 filesystem
183
+ will (by default) be overwritten by the Path1 filesystem version.
184
+ (Note that this is [NOT entirely symmetrical](https://github.com/rclone/rclone/issues/5681#issuecomment-938761815),
185
+ and more symmetrical options can be specified with the
186
+ [`--resync-mode`](#resync-mode) flag.)
187
+ Carefully evaluate deltas using [--dry-run](/flags/#non-backend-flags).
188
+
189
+ For a resync run, one of the paths may be empty (no files in the path tree).
190
+ The resync run should result in files on both paths, else a normal non-resync
191
+ run will fail.
192
+
193
+ For a non-resync run, either path being empty (no files in the tree) fails with
194
+ `Empty current PathN listing. Cannot sync to an empty directory: X.pathN.lst`
195
+ This is a safety check that an unexpected empty path does not result in
196
+ deleting **everything** in the other path.
197
+
198
+ Note that `--resync` implies `--resync-mode path1` unless a different
199
+ [`--resync-mode`](#resync-mode) is explicitly specified.
200
+ It is not necessary to use both the `--resync` and `--resync-mode` flags --
201
+ either one is sufficient without the other.
202
+
203
+ **Note:** `--resync` (including `--resync-mode`) should only be used under three
204
+ specific (rare) circumstances:
205
+
206
+ 1. It is your *first* bisync run (between these two paths)
207
+ 2. You've just made changes to your bisync settings (such as editing the
208
+ contents of your `--filters-file`)
209
+ 3. There was an error on the prior run, and as a result, bisync now requires
210
+ `--resync` to recover
211
+
212
+ The rest of the time, you should *omit* `--resync`. The reason is because `--resync`
213
+ will only *copy* (not *sync*) each side to the other. Therefore, if you included
214
+ `--resync` for every bisync run, it would never be possible to delete a file -- the
215
+ deleted file would always keep reappearing at the end of every run (because it's
216
+ being copied from the other side where it still exists). Similarly, renaming a
217
+ file would always result in a duplicate copy (both old and new name) on both
218
+ sides.
219
+
220
+ If you find that frequent interruptions from #3 are an issue, rather than
221
+ automatically running `--resync`, the recommended alternative is to use the
222
+ [`--resilient`](#resilient), [`--recover`](#recover), and
223
+ [`--conflict-resolve`](#conflict-resolve) flags, (along with [Graceful
224
+ Shutdown](#graceful-shutdown) mode, when needed) for a very robust
225
+ "set-it-and-forget-it" bisync setup that can automatically bounce back from
226
+ almost any interruption it might encounter. Consider adding something like the
227
+ following:
228
+
229
+ ```text
230
+ --resilient --recover --max-lock 2m --conflict-resolve newer
231
+ ```
232
+
233
+ ### --resync-mode CHOICE {#resync-mode}
234
+
235
+ In the event that a file differs on both sides during a `--resync`,
236
+ `--resync-mode` controls which version will overwrite the other. The supported
237
+ options are similar to [`--conflict-resolve`](#conflict-resolve). For all of
238
+ the following options, the version that is kept is referred to as the "winner",
239
+ and the version that is overwritten (deleted) is referred to as the "loser".
240
+ The options are named after the "winner":
241
+
242
+ - `path1` - (the default) - the version from Path1 is unconditionally
243
+ considered the winner (regardless of `modtime` and `size`, if any). This can be
244
+ useful if one side is more trusted or up-to-date than the other, at the time of
245
+ the `--resync`.
246
+ - `path2` - same as `path1`, except the path2 version is considered the winner.
247
+ - `newer` - the newer file (by `modtime`) is considered the winner, regardless
248
+ of which side it came from. This may result in having a mix of some winners
249
+ from Path1, and some winners from Path2. (The implementation is analogous to
250
+ running `rclone copy --update` in both directions.)
251
+ - `older` - same as `newer`, except the older file is considered the winner,
252
+ and the newer file is considered the loser.
253
+ - `larger` - the larger file (by `size`) is considered the winner (regardless
254
+ of `modtime`, if any). This can be a useful option for remotes without
255
+ `modtime` support, or with the kinds of files (such as logs) that tend to grow
256
+ but not shrink, over time.
257
+ - `smaller` - the smaller file (by `size`) is considered the winner (regardless
258
+ of `modtime`, if any).
259
+
260
+ For all of the above options, note the following:
261
+
262
+ - If either of the underlying remotes lacks support for the chosen method, it
263
+ will be ignored and will fall back to the default of `path1`. (For example, if
264
+ `--resync-mode newer` is set, but one of the paths uses a remote that doesn't
265
+ support `modtime`.)
266
+ - If a winner can't be determined because the chosen method's attribute is
267
+ missing or equal, it will be ignored, and bisync will instead try to determine
268
+ whether the files differ by looking at the other `--compare` methods in effect.
269
+ (For example, if `--resync-mode newer` is set, but the Path1 and Path2 modtimes
270
+ are identical, bisync will compare the sizes.) If bisync concludes that they
271
+ differ, preference is given to whichever is the "source" at that moment. (In
272
+ practice, this gives a slight advantage to Path2, as the 2to1 copy comes before
273
+ the 1to2 copy.) If the files *do not* differ, nothing is copied (as both sides
274
+ are already correct).
275
+ - These options apply only to files that exist on both sides (with the same
276
+ name and relative path). Files that exist *only* on one side and not the other
277
+ are *always* copied to the other, during `--resync` (this is one of the main
278
+ differences between resync and non-resync runs.).
279
+ - `--conflict-resolve`, `--conflict-loser`, and `--conflict-suffix` do not
280
+ apply during `--resync`, and unlike these flags, nothing is renamed during
281
+ `--resync`. When a file differs on both sides during `--resync`, one version
282
+ always overwrites the other (much like in `rclone copy`.) (Consider using
283
+ [`--backup-dir`](#backup-dir1-and-backup-dir2) to retain a backup of the losing
284
+ version.)
285
+ - Unlike for `--conflict-resolve`, `--resync-mode none` is not a valid option
286
+ (or rather, it will be interpreted as "no resync", unless `--resync` has also
287
+ been specified, in which case it will be ignored.)
288
+ - Winners and losers are decided at the individual file-level only (there is
289
+ not currently an option to pick an entire winning directory atomically,
290
+ although the `path1` and `path2` options typically produce a similar result.)
291
+ - To maintain backward-compatibility, the `--resync` flag implies
292
+ `--resync-mode path1` unless a different `--resync-mode` is explicitly
293
+ specified. Similarly, all `--resync-mode` options (except `none`) imply
294
+ `--resync`, so it is not necessary to use both the `--resync` and
295
+ `--resync-mode` flags simultaneously -- either one is sufficient without the
296
+ other.
297
+
298
+ ### --check-access
299
+
300
+ Access check files are an additional safety measure against data loss.
301
+ bisync will ensure it can find matching `RCLONE_TEST` files in the same places
302
+ in the Path1 and Path2 filesystems.
303
+ `RCLONE_TEST` files are not generated automatically.
304
+ For `--check-access` to succeed, you must first either:
305
+ **A)** Place one or more `RCLONE_TEST` files in both systems, or
306
+ **B)** Set `--check-filename` to a filename already in use in various locations
307
+ throughout your sync'd fileset. Recommended methods for **A)** include:
308
+
309
+ - `rclone touch Path1/RCLONE_TEST` (create a new file)
310
+ - `rclone copyto Path1/RCLONE_TEST Path2/RCLONE_TEST` (copy an existing file)
311
+ - `rclone copy Path1/RCLONE_TEST Path2/RCLONE_TEST --include "RCLONE_TEST"`
312
+ (copy multiple files at once, recursively)
313
+ - create the files manually (outside of rclone)
314
+ - run `bisync` once *without* `--check-access` to set matching files on both filesystems
315
+ will also work, but is not preferred, due to potential for user error
316
+ (you are temporarily disabling the safety feature).
317
+
318
+ Note that `--check-access` is still enforced on `--resync`, so `bisync --resync --check-access`
319
+ will not work as a method of initially setting the files
320
+ (this is to ensure that bisync can't
321
+ [inadvertently circumvent its own safety switch](https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=3.%20%2D%2Dcheck%2Daccess%20doesn%27t%20always%20fail%20when%20it%20should).)
322
+
323
+ Time stamps and file contents for `RCLONE_TEST` files are not important, just
324
+ the names and locations. If you have symbolic links in your sync tree it is
325
+ recommended to place `RCLONE_TEST` files in the linked-to directory tree to
326
+ protect against bisync assuming a bunch of deleted files if the linked-to tree
327
+ should not be accessible. See also the [--check-filename](--check-filename) flag.
328
+
329
+ ### --check-filename
330
+
331
+ Name of the file(s) used in access health validation.
332
+ The default `--check-filename` is `RCLONE_TEST`.
333
+ One or more files having this filename must exist, synchronized between your
334
+ source and destination filesets, in order for `--check-access` to succeed.
335
+ See [--check-access](#check-access) for additional details.
336
+
337
+ ### --compare
338
+
339
+ As of `v1.66`, bisync fully supports comparing based on any combination of
340
+ size, modtime, and checksum (lifting the prior restriction on backends without
341
+ modtime support.)
342
+
343
+ By default (without the `--compare` flag), bisync inherits the same comparison
344
+ options as `sync`
345
+ (that is: `size` and `modtime` by default, unless modified with flags such as
346
+ [`--checksum`](/docs/#c-checksum) or [`--size-only`](/docs/#size-only).)
347
+
348
+ If the `--compare` flag is set, it will override these defaults. This can be
349
+ useful if you wish to compare based on combinations not currently supported in
350
+ `sync`, such as comparing all three of `size` AND `modtime` AND `checksum`
351
+ simultaneously (or just `modtime` AND `checksum`).
352
+
353
+ `--compare` takes a comma-separated list, with the currently supported values
354
+ being `size`, `modtime`, and `checksum`. For example, if you want to compare
355
+ size and checksum, but not modtime, you would do:
356
+
357
+ ```text
358
+ --compare size,checksum
359
+ ```
360
+
361
+ Or if you want to compare all three:
362
+
363
+ ```text
364
+ --compare size,modtime,checksum
365
+ ```
366
+
367
+ `--compare` overrides any conflicting flags. For example, if you set the
368
+ conflicting flags `--compare checksum --size-only`, `--size-only` will be
369
+ ignored, and bisync will compare checksum and not size. To avoid confusion, it
370
+ is recommended to use *either* `--compare` or the normal `sync` flags, but not
371
+ both.
372
+
373
+ If `--compare` includes `checksum` and both remotes support checksums but have
374
+ no hash types in common with each other, checksums will be considered *only*
375
+ for comparisons within the same side (to determine what has changed since the
376
+ prior sync), but not for comparisons against the opposite side. If one side
377
+ supports checksums and the other does not, checksums will only be considered on
378
+ the side that supports them.
379
+
380
+ When comparing with `checksum` and/or `size` without `modtime`, bisync cannot
381
+ determine whether a file is `newer` or `older` -- only whether it is `changed`
382
+ or `unchanged`. (If it is `changed` on both sides, bisync still does the
383
+ standard equality-check to avoid declaring a sync conflict unless it absolutely
384
+ has to.)
385
+
386
+ It is recommended to do a `--resync` when changing `--compare` settings, as
387
+ otherwise your prior listing files may not contain the attributes you wish to
388
+ compare (for example, they will not have stored checksums if you were not
389
+ previously comparing checksums.)
390
+
391
+ ### --ignore-listing-checksum
392
+
393
+ When `--checksum` or `--compare checksum` is set, bisync will retrieve (or
394
+ generate) checksums (for backends that support them) when creating the listings
395
+ for both paths, and store the checksums in the listing files.
396
+ `--ignore-listing-checksum` will disable this behavior, which may speed things
397
+ up considerably, especially on backends (such as [local](/local/)) where hashes
398
+ must be computed on the fly instead of retrieved. Please note the following:
399
+
400
+ - As of `v1.66`, `--ignore-listing-checksum` is now automatically set when
401
+ neither `--checksum` nor `--compare checksum` are in use (as the checksums
402
+ would not be used for anything.)
403
+ - `--ignore-listing-checksum` is NOT the same as
404
+ [`--ignore-checksum`](/docs/#ignore-checksum),
405
+ and you may wish to use one or the other, or both. In a nutshell:
406
+ `--ignore-listing-checksum` controls whether checksums are considered when
407
+ scanning for diffs,
408
+ while `--ignore-checksum` controls whether checksums are considered during the
409
+ copy/sync operations that follow,
410
+ if there ARE diffs.
411
+ - Unless `--ignore-listing-checksum` is passed, bisync currently computes
412
+ hashes for one path
413
+ *even when there's no common hash with the other path*
414
+ (for example, a [crypt](/crypt/#modification-times-and-hashes) remote.)
415
+ This can still be beneficial, as the hashes will still be used to detect
416
+ changes within the same side
417
+ (if `--checksum` or `--compare checksum` is set), even if they can't be used to
418
+ compare against the opposite side.
419
+ - If you wish to ignore listing checksums *only* on remotes where they are slow
420
+ to compute, consider using
421
+ [`--no-slow-hash`](#no-slow-hash) (or
422
+ [`--slow-hash-sync-only`](#slow-hash-sync-only)) instead of
423
+ `--ignore-listing-checksum`.
424
+ - If `--ignore-listing-checksum` is used simultaneously with `--compare
425
+ checksum` (or `--checksum`), checksums will be ignored for bisync deltas,
426
+ but still considered during the sync operations that follow (if deltas are
427
+ detected based on modtime and/or size.)
428
+
429
+ ### --no-slow-hash
430
+
431
+ On some remotes (notably `local`), checksums can dramatically slow down a bisync
432
+ run, because hashes cannot be stored and need to be computed in real-time when
433
+ they are requested. On other remotes (such as `drive`), they add practically no
434
+ time at all. The `--no-slow-hash` flag will automatically skip checksums on remotes
435
+ where they are slow, while still comparing them on others (assuming
436
+ [`--compare`](#compare) includes `checksum`.) This can be useful when one of your
437
+ bisync paths is slow but you still want to check checksums on the other, for a
438
+ more robust sync.
439
+
440
+ ### --slow-hash-sync-only
441
+
442
+ Same as [`--no-slow-hash`](#no-slow-hash), except slow hashes are still
443
+ considered during sync calls. They are still NOT considered for determining
444
+ deltas, nor or they included in listings. They are also skipped during
445
+ `--resync`. The main use case for this flag is when you have a large number of
446
+ files, but relatively few of them change from run to run -- so you don't want
447
+ to check your entire tree every time (it would take too long), but you still
448
+ want to consider checksums for the smaller group of files for which a `modtime`
449
+ or `size` change was detected. Keep in mind that this speed savings comes with
450
+ a safety trade-off: if a file's content were to change without a change to its
451
+ `modtime` or `size`, bisync would not detect it, and it would not be synced.
452
+
453
+ `--slow-hash-sync-only` is only useful if both remotes share a common hash
454
+ type (if they don't, bisync will automatically fall back to `--no-slow-hash`.)
455
+ Both `--no-slow-hash` and `--slow-hash-sync-only` have no effect without
456
+ `--compare checksum` (or `--checksum`).
457
+
458
+ ### --download-hash
459
+
460
+ If `--download-hash` is set, bisync will use best efforts to obtain an MD5
461
+ checksum by downloading and computing on-the-fly, when checksums are not
462
+ otherwise available (for example, a remote that doesn't support them.) Note
463
+ that since rclone has to download the entire file, this may dramatically slow
464
+ down your bisync runs, and is also likely to use a lot of data, so it is
465
+ probably not practical for bisync paths with a large total file size. However,
466
+ it can be a good option for syncing small-but-important files with maximum
467
+ accuracy (for example, a source code repo on a `crypt` remote.) An additional
468
+ advantage over methods like [`cryptcheck`](/commands/rclone_cryptcheck/) is
469
+ that the original file is not required for comparison (for example,
470
+ `--download-hash` can be used to bisync two different crypt remotes with
471
+ different passwords.)
472
+
473
+ When `--download-hash` is set, bisync still looks for more efficient checksums
474
+ first, and falls back to downloading only when none are found. It takes
475
+ priority over conflicting flags such as `--no-slow-hash`. `--download-hash` is
476
+ not suitable for [Google Docs](#gdocs) and other files of unknown size, as
477
+ their checksums would change from run to run (due to small variances in the
478
+ internals of the generated export file.) Therefore, bisync automatically skips
479
+ `--download-hash` for files with a size less than 0.
480
+
481
+ See also: [`Hasher`](https://rclone.org/hasher/) backend,
482
+ [`cryptcheck`](/commands/rclone_cryptcheck/) command, [`rclone check
483
+ --download`](/commands/rclone_check/) option,
484
+ [`md5sum`](/commands/rclone_md5sum/) command
485
+
486
+ ### --max-delete
487
+
488
+ As a safety check, if greater than the `--max-delete` percent of files were
489
+ deleted on either the Path1 or Path2 filesystem, then bisync will abort with
490
+ a warning message, without making any changes.
491
+ The default `--max-delete` is `50%`.
492
+ One way to trigger this limit is to rename a directory that contains more
493
+ than half of your files. This will appear to bisync as a bunch of deleted
494
+ files and a bunch of new files.
495
+ This safety check is intended to block bisync from deleting all of the
496
+ files on both filesystems due to a temporary network access issue, or if
497
+ the user had inadvertently deleted the files on one side or the other.
498
+ To force the sync, either set a different delete percentage limit,
499
+ e.g. `--max-delete 75` (allows up to 75% deletion), or use `--force`
500
+ to bypass the check.
501
+
502
+ Also see the [all files changed](#all-files-changed) check.
503
+
504
+ ### --filters-file {#filters-file}
505
+
506
+ By using rclone filter features you can exclude file types or directory
507
+ sub-trees from the sync.
508
+ See the [bisync filters](#filtering) section and generic
509
+ [--filter-from](/filtering/#filter-from-read-filtering-patterns-from-a-file)
510
+ documentation.
511
+ An [example filters file](#example-filters-file) contains filters for
512
+ non-allowed files for syncing with Dropbox.
513
+
514
+ If you make changes to your filters file then bisync requires a run
515
+ with `--resync`. This is a safety feature, which prevents existing files
516
+ on the Path1 and/or Path2 side from seeming to disappear from view
517
+ (since they are excluded in the new listings), which would fool bisync
518
+ into seeing them as deleted (as compared to the prior run listings),
519
+ and then bisync would proceed to delete them for real.
520
+
521
+ To block this from happening, bisync calculates an MD5 hash of the filters file
522
+ and stores the hash in a `.md5` file in the same place as your filters file.
523
+ On the next run with `--filters-file` set, bisync re-calculates the MD5 hash
524
+ of the current filters file and compares it to the hash stored in the `.md5` file.
525
+ If they don't match, the run aborts with a critical error and thus forces you
526
+ to do a `--resync`, likely avoiding a disaster.
527
+
528
+ ### --conflict-resolve CHOICE {#conflict-resolve}
529
+
530
+ In bisync, a "conflict" is a file that is *new* or *changed* on *both sides*
531
+ (relative to the prior run) AND is *not currently identical* on both sides.
532
+ `--conflict-resolve` controls how bisync handles such a scenario. The currently
533
+ supported options are:
534
+
535
+ - `none` - (the default) - do not attempt to pick a winner, keep and rename
536
+ both files according to [`--conflict-loser`](#conflict-loser) and
537
+ [`--conflict-suffix`](#conflict-suffix) settings. For example, with the default
538
+ settings, `file.txt` on Path1 is renamed `file.txt.conflict1` and `file.txt` on
539
+ Path2 is renamed `file.txt.conflict2`. Both are copied to the opposite path
540
+ during the run, so both sides end up with a copy of both files. (As `none` is
541
+ the default, it is not necessary to specify `--conflict-resolve none` -- you
542
+ can just omit the flag.)
543
+ - `newer` - the newer file (by `modtime`) is considered the winner and is
544
+ copied without renaming. The older file (the "loser") is handled according to
545
+ `--conflict-loser` and `--conflict-suffix` settings (either renamed or
546
+ deleted.) For example, if `file.txt` on Path1 is newer than `file.txt` on
547
+ Path2, the result on both sides (with other default settings) will be `file.txt`
548
+ (winner from Path1) and `file.txt.conflict1` (loser from Path2).
549
+ - `older` - same as `newer`, except the older file is considered the winner,
550
+ and the newer file is considered the loser.
551
+ - `larger` - the larger file (by `size`) is considered the winner (regardless
552
+ of `modtime`, if any).
553
+ - `smaller` - the smaller file (by `size`) is considered the winner (regardless
554
+ of `modtime`, if any).
555
+ - `path1` - the version from Path1 is unconditionally considered the winner
556
+ (regardless of `modtime` and `size`, if any). This can be useful if one side is
557
+ usually more trusted or up-to-date than the other.
558
+ - `path2` - same as `path1`, except the path2 version is considered the
559
+ winner.
560
+
561
+ For all of the above options, note the following:
562
+
563
+ - If either of the underlying remotes lacks support for the chosen method, it
564
+ will be ignored and fall back to `none`. (For example, if `--conflict-resolve
565
+ newer` is set, but one of the paths uses a remote that doesn't support
566
+ `modtime`.)
567
+ - If a winner can't be determined because the chosen method's attribute is
568
+ missing or equal, it will be ignored and fall back to `none`. (For example, if
569
+ `--conflict-resolve newer` is set, but the Path1 and Path2 modtimes are
570
+ identical, even if the sizes may differ.)
571
+ - If the file's content is currently identical on both sides, it is not
572
+ considered a "conflict", even if new or changed on both sides since the prior
573
+ sync. (For example, if you made a change on one side and then synced it to the
574
+ other side by other means.) Therefore, none of the conflict resolution flags
575
+ apply in this scenario.
576
+ - The conflict resolution flags do not apply during a `--resync`, as there is
577
+ no "prior run" to speak of (but see [`--resync-mode`](#resync-mode) for similar
578
+ options.)
579
+
580
+ ### --conflict-loser CHOICE {#conflict-loser}
581
+
582
+ `--conflict-loser` determines what happens to the "loser" of a sync conflict
583
+ (when [`--conflict-resolve`](#conflict-resolve) determines a winner) or to both
584
+ files (when there is no winner.) The currently supported options are:
585
+
586
+ - `num` - (the default) - auto-number the conflicts by automatically appending
587
+ the next available number to the `--conflict-suffix`, in chronological order.
588
+ For example, with the default settings, the first conflict for `file.txt` will
589
+ be renamed `file.txt.conflict1`. If `file.txt.conflict1` already exists,
590
+ `file.txt.conflict2` will be used instead (etc., up to a maximum of
591
+ 9223372036854775807 conflicts.)
592
+ - `pathname` - rename the conflicts according to which side they came from,
593
+ which was the default behavior prior to `v1.66`. For example, with
594
+ `--conflict-suffix path`, `file.txt` from Path1 will be renamed
595
+ `file.txt.path1`, and `file.txt` from Path2 will be renamed `file.txt.path2`.
596
+ If two non-identical suffixes are provided (ex. `--conflict-suffix
597
+ cloud,local`), the trailing digit is omitted. Importantly, note that with
598
+ `pathname`, there is no auto-numbering beyond `2`, so if `file.txt.path2`
599
+ somehow already exists, it will be overwritten. Using a dynamic date variable
600
+ in your `--conflict-suffix` (see below) is one possible way to avoid this. Note
601
+ also that conflicts-of-conflicts are possible, if the original conflict is not
602
+ manually resolved -- for example, if for some reason you edited
603
+ `file.txt.path1` on both sides, and those edits were different, the result
604
+ would be `file.txt.path1.path1` and `file.txt.path1.path2` (in addition to
605
+ `file.txt.path2`.)
606
+ - `delete` - keep the winner only and delete the loser, instead of renaming it.
607
+ If a winner cannot be determined (see `--conflict-resolve` for details on how
608
+ this could happen), `delete` is ignored and the default `num` is used instead
609
+ (i.e. both versions are kept and renamed, and neither is deleted.) `delete` is
610
+ inherently the most destructive option, so use it only with care.
611
+
612
+ For all of the above options, note that if a winner cannot be determined (see
613
+ `--conflict-resolve` for details on how this could happen), or if
614
+ `--conflict-resolve` is not in use, *both* files will be renamed.
615
+
616
+ ### --conflict-suffix STRING[,STRING] {#conflict-suffix}
617
+
618
+ `--conflict-suffix` controls the suffix that is appended when bisync renames a
619
+ [`--conflict-loser`](#conflict-loser) (default: `conflict`).
620
+ `--conflict-suffix` will accept either one string or two comma-separated
621
+ strings to assign different suffixes to Path1 vs. Path2. This may be helpful
622
+ later in identifying the source of the conflict. (For example,
623
+ `--conflict-suffix dropboxconflict,laptopconflict`)
624
+
625
+ With `--conflict-loser num`, a number is always appended to the suffix. With
626
+ `--conflict-loser pathname`, a number is appended only when one suffix is
627
+ specified (or when two identical suffixes are specified.) i.e. with
628
+ `--conflict-loser pathname`, all of the following would produce exactly the
629
+ same result:
630
+
631
+ ```text
632
+ --conflict-suffix path
633
+ --conflict-suffix path,path
634
+ --conflict-suffix path1,path2
635
+ ```
636
+
637
+ Suffixes may be as short as 1 character. By default, the suffix is appended
638
+ after any other extensions (ex. `file.jpg.conflict1`), however, this can be
639
+ changed with the [`--suffix-keep-extension`](/docs/#suffix-keep-extension) flag
640
+ (i.e. to instead result in `file.conflict1.jpg`).
641
+
642
+ `--conflict-suffix` supports several *dynamic date variables* when enclosed in
643
+ curly braces as globs. This can be helpful to track the date and/or time that
644
+ each conflict was handled by bisync. For example:
645
+
646
+ ```text
647
+ --conflict-suffix {DateOnly}-conflict
648
+ // result: myfile.txt.2006-01-02-conflict1
649
+ ```
650
+
651
+ All of the formats described [here (go Time.Layout
652
+ constants)](https://pkg.go.dev/time#pkg-constants) and [here (go Time.Format
653
+ examples)](https://pkg.go.dev/time#example-Time.Format) are supported, but take
654
+ care to ensure that your chosen format does not use any characters that are
655
+ illegal on your remotes (for example, macOS does not allow colons in filenames,
656
+ and slashes are also best avoided as they are often interpreted as directory
657
+ separators.) To address this particular issue, an additional `{MacFriendlyTime}`
658
+ (or just `{mac}`) option is supported, which results in `2006-01-02 0304PM`.
659
+
660
+ Note that `--conflict-suffix` is entirely separate from rclone's main
661
+ [`--sufix`](/docs/#suffix-string) flag. This is intentional, as users may wish
662
+ to use both flags simultaneously, if also using
663
+ [`--backup-dir`](#backup-dir1-and-backup-dir2).
664
+
665
+ Finally, note that the default in bisync prior to `v1.66` was to rename
666
+ conflicts with `..path1` and `..path2` (with two periods, and `path` instead of
667
+ `conflict`.) Bisync now defaults to a single dot instead of a double dot, but
668
+ additional dots can be added by including them in the specified suffix string.
669
+ For example, for behavior equivalent to the previous default, use:
670
+
671
+ ```text
672
+ [--conflict-resolve none] --conflict-loser pathname --conflict-suffix .path
673
+ ```
674
+
675
+ ### --check-sync
676
+
677
+ Enabled by default, the check-sync function checks that all of the same
678
+ files exist in both the Path1 and Path2 history listings. This *check-sync*
679
+ integrity check is performed at the end of the sync run by default.
680
+ Any untrapped failing copy/deletes between the two paths might result
681
+ in differences between the two listings and in the untracked file content
682
+ differences between the two paths. A resync run would correct the error.
683
+
684
+ Note that the default-enabled integrity check locally executes a load of both
685
+ the final Path1 and Path2 listings, and thus adds to the run time of a sync.
686
+ Using `--check-sync=false` will disable it and may significantly reduce the
687
+ sync run times for very large numbers of files.
688
+
689
+ The check may be run manually with `--check-sync=only`. It runs only the
690
+ integrity check and terminates without actually syncing.
691
+
692
+ Note that currently, `--check-sync` **only checks listing snapshots and NOT the
693
+ actual files on the remotes.** Note also that the listing snapshots will not
694
+ know about any changes that happened during or after the latest bisync run, as
695
+ those will be discovered on the next run. Therefore, while listings should
696
+ always match *each other* at the end of a bisync run, it is *expected* that
697
+ they will not match the underlying remotes, nor will the remotes match each
698
+ other, if there were changes during or after the run. This is normal, and any
699
+ differences will be detected and synced on the next run.
700
+
701
+ For a robust integrity check of the current state of the remotes (as opposed to
702
+ just their listing snapshots), consider using [`check`](commands/rclone_check/)
703
+ (or [`cryptcheck`](/commands/rclone_cryptcheck/), if at least one path is a
704
+ `crypt` remote) instead of `--check-sync`, keeping in mind that differences are
705
+ expected if files changed during or after your last bisync run.
706
+
707
+ For example, a possible sequence could look like this:
708
+
709
+ 1. Normally scheduled bisync run:
710
+
711
+ ```console
712
+ rclone bisync Path1 Path2 -MPc --check-access --max-delete 10 --filters-file /path/to/filters.txt -v --no-cleanup --ignore-listing-checksum --disable ListR --checkers=16 --drive-pacer-min-sleep=10ms --create-empty-src-dirs --resilient
713
+ ```
714
+
715
+ 2. Periodic independent integrity check (perhaps scheduled nightly or weekly):
716
+
717
+ ```console
718
+ rclone check -MvPc Path1 Path2 --filter-from /path/to/filters.txt
719
+ ```
720
+
721
+ 3. If diffs are found, you have some choices to correct them.
722
+ If one side is more up-to-date and you want to make the other side match it,
723
+ you could run:
724
+
725
+ ```console
726
+ rclone sync Path1 Path2 --filter-from /path/to/filters.txt --create-empty-src-dirs -MPc -v
727
+ ```
728
+
729
+ (or switch Path1 and Path2 to make Path2 the source-of-truth)
730
+
731
+ Or, if neither side is totally up-to-date, you could run a `--resync` to bring them
732
+ back into agreement (but remember that this could cause deleted files to
733
+ re-appear.)
734
+
735
+ *Note also that `rclone check` does not currently include empty directories,
736
+ so if you want to know if any empty directories are out of sync,
737
+ consider alternatively running the above `rclone sync` command with `--dry-run` added.
738
+
739
+ See also: [Concurrent modifications](#concurrent-modifications), [`--resilient`](#resilient)
740
+
741
+ ### --resilient
742
+
743
+ By default, most errors or interruptions will cause bisync to abort and
744
+ require [`--resync`](#resync) to recover. This is a safety feature, to prevent
745
+ bisync from running again until a user checks things out. However, in some
746
+ cases, bisync can go too far and enforce a lockout when one isn't actually
747
+ necessary, like for certain less-serious errors that might resolve themselves
748
+ on the next run. When `--resilient` is specified, bisync tries its best to
749
+ recover and self-correct, and only requires `--resync` as a last resort when a
750
+ human's involvement is absolutely necessary. The intended use case is for
751
+ running bisync as a background process (such as via scheduled [cron](#cron)).
752
+
753
+ When using `--resilient` mode, bisync will still report the error and abort,
754
+ however it will not lock out future runs -- allowing the possibility of
755
+ retrying at the next normally scheduled time, without requiring a `--resync`
756
+ first. Examples of such retryable errors include access test failures, missing
757
+ listing files, and filter change detections. These safety features will still
758
+ prevent the *current* run from proceeding -- the difference is that if
759
+ conditions have improved by the time of the *next* run, that next run will be
760
+ allowed to proceed. Certain more serious errors will still enforce a
761
+ `--resync` lockout, even in `--resilient` mode, to prevent data loss.
762
+
763
+ Behavior of `--resilient` may change in a future version. (See also:
764
+ [`--recover`](#recover), [`--max-lock`](#max-lock), [Graceful
765
+ Shutdown](#graceful-shutdown))
766
+
767
+ ### --recover
768
+
769
+ If `--recover` is set, in the event of a sudden interruption or other
770
+ un-graceful shutdown, bisync will attempt to automatically recover on the next
771
+ run, instead of requiring `--resync`. Bisync is able to recover robustly by
772
+ keeping one "backup" listing at all times, representing the state of both paths
773
+ after the last known successful sync. Bisync can then compare the current state
774
+ with this snapshot to determine which changes it needs to retry. Changes that
775
+ were synced after this snapshot (during the run that was later interrupted)
776
+ will appear to bisync as if they are "new or changed on both sides", but in
777
+ most cases this is not a problem, as bisync will simply do its usual "equality
778
+ check" and learn that no action needs to be taken on these files, since they
779
+ are already identical on both sides.
780
+
781
+ In the rare event that a file is synced successfully during a run that later
782
+ aborts, and then that same file changes AGAIN before the next run, bisync will
783
+ think it is a sync conflict, and handle it accordingly. (From bisync's
784
+ perspective, the file has changed on both sides since the last trusted sync,
785
+ and the files on either side are not currently identical.) Therefore,
786
+ `--recover` carries with it a slightly increased chance of having conflicts --
787
+ though in practice this is pretty rare, as the conditions required to cause it
788
+ are quite specific. This risk can be reduced by using bisync's ["Graceful
789
+ Shutdown"](#graceful-shutdown) mode (triggered by sending `SIGINT` or
790
+ `Ctrl+C`), when you have the choice, instead of forcing a sudden termination.
791
+
792
+ `--recover` and `--resilient` are similar, but distinct -- the main difference
793
+ is that `--resilient` is about *retrying*, while `--recover` is about
794
+ *recovering*. Most users will probably want both. `--resilient` allows retrying
795
+ when bisync has chosen to abort itself due to safety features such as failing
796
+ `--check-access` or detecting a filter change. `--resilient` does not cover
797
+ external interruptions such as a user shutting down their computer in the
798
+ middle of a sync -- that is what `--recover` is for.
799
+
800
+ ### --max-lock
801
+
802
+ Bisync uses [lock files](#lock-file) as a safety feature to prevent
803
+ interference from other bisync runs while it is running. Bisync normally
804
+ removes these lock files at the end of a run, but if bisync is abruptly
805
+ interrupted, these files will be left behind. By default, they will lock out
806
+ all future runs, until the user has a chance to manually check things out and
807
+ remove the lock. As an alternative, `--max-lock` can be used to make them
808
+ automatically expire after a certain period of time, so that future runs are
809
+ not locked out forever, and auto-recovery is possible. `--max-lock` can be any
810
+ duration `2m` or greater (or `0` to disable). If set, lock files older than
811
+ this will be considered "expired", and future runs will be allowed to disregard
812
+ them and proceed. (Note that the `--max-lock` duration must be set by the
813
+ process that left the lock file -- not the later one interpreting it.)
814
+
815
+ If set, bisync will also "renew" these lock files every `--max-lock minus one
816
+ minute` throughout a run, for extra safety. (For example, with `--max-lock 5m`,
817
+ bisync would renew the lock file (for another 5 minutes) every 4 minutes until
818
+ the run has completed.) In other words, it should not be possible for a lock
819
+ file to pass its expiration time while the process that created it is still
820
+ running -- and you can therefore be reasonably sure that any *expired* lock
821
+ file you may find was left there by an interrupted run, not one that is still
822
+ running and just taking awhile.
823
+
824
+ If a lock file exists but its contents are unreadable (for example, due to an
825
+ incomplete write or disk error), it is treated as expired when `--max-lock` is
826
+ set to a value greater than `0`. If `--max-lock` is `0` or not set, an
827
+ unreadable lock file will produce an error and block future runs until removed
828
+ manually.
829
+
830
+ If `--max-lock` is `0` or not set, the default is that lock files will never
831
+ expire, and will block future runs (of these same two bisync paths)
832
+ indefinitely.
833
+
834
+ For maximum resilience from disruptions, consider setting a relatively short
835
+ duration like `--max-lock 2m` along with [`--resilient`](#resilient) and
836
+ [`--recover`](#recover), and a relatively frequent [cron schedule](#cron). The
837
+ result will be a very robust "set-it-and-forget-it" bisync run that can
838
+ automatically bounce back from almost any interruption it might encounter,
839
+ without requiring the user to get involved and run a `--resync`. (See also:
840
+ [Graceful Shutdown](#graceful-shutdown) mode)
841
+
842
+ ### --backup-dir1 and --backup-dir2
843
+
844
+ As of `v1.66`, [`--backup-dir`](/docs/#backup-dir-string) is supported in bisync.
845
+ Because `--backup-dir` must be a non-overlapping path on the same remote,
846
+ Bisync has introduced new `--backup-dir1` and `--backup-dir2` flags to support
847
+ separate backup-dirs for `Path1` and `Path2` (bisyncing between different
848
+ remotes with `--backup-dir` would not otherwise be possible.) `--backup-dir1`
849
+ and `--backup-dir2` can use different remotes from each other, but
850
+ `--backup-dir1` must use the same remote as `Path1`, and `--backup-dir2` must
851
+ use the same remote as `Path2`. Each backup directory must not overlap its
852
+ respective bisync Path without being excluded by a filter rule.
853
+
854
+ The standard `--backup-dir` will also work, if both paths use the same remote
855
+ (but note that deleted files from both paths would be mixed together in the
856
+ same dir). If either `--backup-dir1` and `--backup-dir2` are set, they will
857
+ override `--backup-dir`.
858
+
859
+ Example:
860
+
861
+ ```console
862
+ rclone bisync /Users/someuser/some/local/path/Bisync gdrive:Bisync --backup-dir1 /Users/someuser/some/local/path/BackupDir --backup-dir2 gdrive:BackupDir --suffix -2023-08-26 --suffix-keep-extension --check-access --max-delete 10 --filters-file /Users/someuser/some/local/path/bisync_filters.txt --no-cleanup --ignore-listing-checksum --checkers=16 --drive-pacer-min-sleep=10ms --create-empty-src-dirs --resilient -MvP --drive-skip-gdocs --fix-case
863
+ ```
864
+
865
+ In this example, if the user deletes a file in
866
+ `/Users/someuser/some/local/path/Bisync`, bisync will propagate the delete to
867
+ the other side by moving the corresponding file from `gdrive:Bisync` to
868
+ `gdrive:BackupDir`. If the user deletes a file from `gdrive:Bisync`, bisync
869
+ moves it from `/Users/someuser/some/local/path/Bisync` to
870
+ `/Users/someuser/some/local/path/BackupDir`.
871
+
872
+ In the event of a [rename due to a sync conflict](#conflict-loser), the
873
+ rename is not considered a delete, unless a previous conflict with the same
874
+ name already exists and would get overwritten.
875
+
876
+ See also: [`--suffix`](/docs/#suffix-string),
877
+ [`--suffix-keep-extension`](/docs/#suffix-keep-extension)
878
+
879
+ ## Operation
880
+
881
+ ### Runtime flow details
882
+
883
+ bisync retains the listings of the `Path1` and `Path2` filesystems
884
+ from the prior run.
885
+ On each successive run it will:
886
+
887
+ - list files on `path1` and `path2`, and check for changes on each side.
888
+ Changes include `New`, `Newer`, `Older`, and `Deleted` files.
889
+ - Propagate changes on `path1` to `path2`, and vice-versa.
890
+
891
+ ### Safety measures
892
+
893
+ - Lock file prevents multiple simultaneous runs when taking a while.
894
+ This can be particularly useful if bisync is run by cron scheduler.
895
+ - Handle change conflicts non-destructively by creating
896
+ `.conflict1`, `.conflict2`, etc. file versions, according to
897
+ [`--conflict-resolve`](#conflict-resolve), [`--conflict-loser`](#conflict-loser),
898
+ and [`--conflict-suffix`](#conflict-suffix) settings.
899
+ - File system access health check using `RCLONE_TEST` files
900
+ (see the `--check-access` flag).
901
+ - Abort on excessive deletes - protects against a failed listing
902
+ being interpreted as all the files were deleted.
903
+ See the `--max-delete` and `--force` flags.
904
+ - If something evil happens, bisync goes into a safe state to block
905
+ damage by later runs. (See [Error Handling](#error-handling))
906
+
907
+ ### Normal sync checks
908
+
909
+ Type | Description | Result | Implementation
910
+ --------------|-----------------------------------------------|--------------------------|-----------------------------
911
+ Path2 new | File is new on Path2, does not exist on Path1 | Path2 version survives | `rclone copy` Path2 to Path1
912
+ Path2 newer | File is newer on Path2, unchanged on Path1 | Path2 version survives | `rclone copy` Path2 to Path1
913
+ Path2 deleted | File is deleted on Path2, unchanged on Path1 | File is deleted | `rclone delete` Path1
914
+ Path1 new | File is new on Path1, does not exist on Path2 | Path1 version survives | `rclone copy` Path1 to Path2
915
+ Path1 newer | File is newer on Path1, unchanged on Path2 | Path1 version survives | `rclone copy` Path1 to Path2
916
+ Path1 older | File is older on Path1, unchanged on Path2 | *Path1 version survives* | `rclone copy` Path1 to Path2
917
+ Path2 older | File is older on Path2, unchanged on Path1 | *Path2 version survives* | `rclone copy` Path2 to Path1
918
+ Path1 deleted | File no longer exists on Path1 | File is deleted | `rclone delete` Path2
919
+
920
+ ### Unusual sync checks
921
+
922
+ Type | Description | Result | Implementation
923
+ --------------------------------|---------------------------------------|------------------------------------|-----------------------
924
+ Path1 new/changed AND Path2 new/changed AND Path1 == Path2 | File is new/changed on Path1 AND new/changed on Path2 AND Path1 version is currently identical to Path2 | No change | None
925
+ Path1 new AND Path2 new | File is new on Path1 AND new on Path2 (and Path1 version is NOT identical to Path2) | Conflicts handled according to [`--conflict-resolve`](#conflict-resolve) & [`--conflict-loser`](#conflict-loser) settings | default: `rclone copy` renamed `Path2.conflict2` file to Path1, `rclone copy` renamed `Path1.conflict1` file to Path2
926
+ Path2 newer AND Path1 changed | File is newer on Path2 AND also changed (newer/older/size) on Path1 (and Path1 version is NOT identical to Path2) | Conflicts handled according to [`--conflict-resolve`](#conflict-resolve) & [`--conflict-loser`](#conflict-loser) settings | default: `rclone copy` renamed `Path2.conflict2` file to Path1, `rclone copy` renamed `Path1.conflict1` file to Path2
927
+ Path2 newer AND Path1 deleted | File is newer on Path2 AND also deleted on Path1 | Path2 version survives | `rclone copy` Path2 to Path1
928
+ Path2 deleted AND Path1 changed | File is deleted on Path2 AND changed (newer/older/size) on Path1 | Path1 version survives |`rclone copy` Path1 to Path2
929
+ Path1 deleted AND Path2 changed | File is deleted on Path1 AND changed (newer/older/size) on Path2 | Path2 version survives | `rclone copy` Path2 to Path1
930
+
931
+ As of `rclone v1.64`, bisync is now better at detecting *false positive* sync
932
+ conflicts, which would previously have resulted in unnecessary renames and
933
+ duplicates. Now, when bisync comes to a file that it wants to rename (because it
934
+ is new/changed on both sides), it first checks whether the Path1 and Path2
935
+ versions are currently *identical* (using the same underlying function as
936
+ [`check`](commands/rclone_check/).) If bisync concludes that the files are
937
+ identical, it will skip them and move on. Otherwise, it will create renamed
938
+ duplicates, as before. This behavior also [improves the experience of renaming
939
+ directories](https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=Renamed%20directories),
940
+ as a `--resync` is no longer required, so long as the same change has been made
941
+ on both sides.
942
+
943
+ ### All files changed check {#all-files-changed}
944
+
945
+ If *all* prior existing files on either of the filesystems have changed
946
+ (e.g. timestamps have changed due to changing the system's timezone)
947
+ then bisync will abort without making any changes.
948
+ Any new files are not considered for this check. You could use `--force`
949
+ to force the sync (whichever side has the changed timestamp files wins).
950
+ Alternately, a `--resync` may be used (Path1 versions will be pushed
951
+ to Path2). Consider the situation carefully and perhaps use `--dry-run`
952
+ before you commit to the changes.
953
+
954
+ ### Modification times
955
+
956
+ By default, bisync compares files by modification time and size.
957
+ If you or your application should change the content of a file
958
+ without changing the modification time and size, then bisync will *not*
959
+ notice the change, and thus will not copy it to the other side.
960
+ As an alternative, consider comparing by checksum (if your remotes support it).
961
+ See [`--compare`](#compare) for details.
962
+
963
+ ### Error handling {#error-handling}
964
+
965
+ Certain bisync critical errors, such as file copy/move failing, will result in
966
+ a bisync lockout of following runs. The lockout is asserted because the sync
967
+ status and history of the Path1 and Path2 filesystems cannot be trusted,
968
+ so it is safer to block any further changes until someone checks things out.
969
+ The recovery is to do a `--resync` again.
970
+
971
+ It is recommended to use `--resync --dry-run --verbose` initially and
972
+ *carefully* review what changes will be made before running the `--resync`
973
+ without `--dry-run`.
974
+
975
+ Most of these events come up due to an error status from an internal call.
976
+ On such a critical error the `{...}.path1.lst` and `{...}.path2.lst`
977
+ listing files are renamed to extension `.lst-err`, which blocks any future
978
+ bisync runs (since the normal `.lst` files are not found).
979
+ Bisync keeps them under `bisync` subdirectory of the rclone cache directory,
980
+ typically at `${HOME}/.cache/rclone/bisync/` on Linux.
981
+
982
+ Some errors are considered temporary and re-running the bisync is not blocked.
983
+ The *critical return* blocks further bisync runs.
984
+
985
+ See also: [`--resilient`](#resilient), [`--recover`](#recover),
986
+ [`--max-lock`](#max-lock), [Graceful Shutdown](#graceful-shutdown)
987
+
988
+ ### Lock file
989
+
990
+ When bisync is running, a lock file is created in the bisync working directory,
991
+ typically at `~/.cache/rclone/bisync/PATH1..PATH2.lck` on Linux.
992
+ If bisync should crash or hang, the lock file will remain in place and block
993
+ any further runs of bisync *for the same paths*.
994
+ Delete the lock file as part of debugging the situation.
995
+ The lock file effectively blocks follow-on (e.g., scheduled by *cron*) runs
996
+ when the prior invocation is taking a long time.
997
+ The lock file contains *PID* of the blocking process, which may help in debug.
998
+ Lock files can be set to automatically expire after a certain amount of time,
999
+ using the [`--max-lock`](#max-lock) flag.
1000
+
1001
+ **Note**
1002
+ that while concurrent bisync runs are allowed, *be very cautious*
1003
+ that there is no overlap in the trees being synched between concurrent runs,
1004
+ lest there be replicated files, deleted files and general mayhem.
1005
+
1006
+ ### Exit codes
1007
+
1008
+ `rclone bisync` returns the following codes to calling program:
1009
+
1010
+ - `0` on a successful run,
1011
+ - `1` for a non-critical failing run (a rerun may be successful),
1012
+ - `2` on syntax or usage error,
1013
+ - `7` for a critically aborted run (requires a `--resync` to recover).
1014
+
1015
+ See also the section about [exit codes](/docs/#exit-code) in main docs.
1016
+
1017
+ ### Graceful Shutdown
1018
+
1019
+ Bisync has a "Graceful Shutdown" mode which is activated by sending `SIGINT` or
1020
+ pressing `Ctrl+C` during a run. Once triggered, bisync will use best efforts to
1021
+ exit cleanly before the timer runs out. If bisync is in the middle of
1022
+ transferring files, it will attempt to cleanly empty its queue by finishing
1023
+ what it has started but not taking more. If it cannot do so within 30 seconds,
1024
+ it will cancel the in-progress transfers at that point and then give itself a
1025
+ maximum of 60 seconds to wrap up, save its state for next time, and exit. With
1026
+ the `-vP` flags you will see constant status updates and a final confirmation
1027
+ of whether or not the graceful shutdown was successful.
1028
+
1029
+ At any point during the "Graceful Shutdown" sequence, a second `SIGINT` or
1030
+ `Ctrl+C` will trigger an immediate, un-graceful exit, which will leave things
1031
+ in a messier state. Usually a robust recovery will still be possible if using
1032
+ [`--recover`](#recover) mode, otherwise you will need to do a `--resync`.
1033
+
1034
+ If you plan to use Graceful Shutdown mode, it is recommended to use
1035
+ [`--resilient`](#resilient) and [`--recover`](#recover), and it is important to
1036
+ NOT use [`--inplace`](/docs/#inplace), otherwise you risk leaving
1037
+ partially-written files on one side, which may be confused for real files on
1038
+ the next run. Note also that in the event of an abrupt interruption, a [lock
1039
+ file](#lock-file) will be left behind to block concurrent runs. You will need
1040
+ to delete it before you can proceed with the next run (or wait for it to
1041
+ expire on its own, if using `--max-lock`.)
1042
+
1043
+ ## Limitations
1044
+
1045
+ ### Supported backends
1046
+
1047
+ Bisync is integration-tested against all rclone backends to verify compatibility.
1048
+ Most backends (including all backends not listed below) are deemed fully
1049
+ supported with no known issues. Occasionally, however, these tests reveal issues
1050
+ with particular backends, usually related to a provider-specific limitation
1051
+ beyond rclone's control (for example, disallowed special characters and filename
1052
+ encodings.)
1053
+
1054
+ The following backends have known issues that need more investigation:
1055
+
1056
+ <!--- start list_failures - DO NOT EDIT THIS SECTION - use make commanddocs --->
1057
+ - `TestDropbox` (`dropbox`)
1058
+ - [`TestBisyncRemoteRemote/normalization`](https://pub.rclone.org/integration-tests/current/dropbox-cmd.bisync-TestDropbox-1.txt)
1059
+ - `TestSeafile` (`seafile`)
1060
+ - [`TestBisyncLocalRemote/volatile`](https://pub.rclone.org/integration-tests/current/seafile-cmd.bisync-TestSeafile-1.txt)
1061
+ - `TestSeafileV6` (`seafile`)
1062
+ - [`TestBisyncLocalRemote/volatile`](https://pub.rclone.org/integration-tests/current/seafile-cmd.bisync-TestSeafileV6-1.txt)
1063
+ - Updated: 2026-01-30-010015
1064
+ <!--- end list_failures - DO NOT EDIT THIS SECTION - use make commanddocs --->
1065
+
1066
+ The following backends either have not been tested recently or have known issues
1067
+ that are deemed unfixable for the time being:
1068
+
1069
+ <!--- start list_ignores - DO NOT EDIT THIS SECTION - use make commanddocs --->
1070
+ - `TestArchive` (`archive`)
1071
+ - `TestCache` (`cache`)
1072
+ - `TestDrime` (`drime`)
1073
+ - `TestFileLu` (`filelu`)
1074
+ - `TestFilesCom` (`filescom`)
1075
+ - `TestImageKit` (`imagekit`)
1076
+ - `TestJottacloud` (`jottacloud`)
1077
+ - `TestLinkbox` (`linkbox`)
1078
+ - `TestMailru` (`mailru`)
1079
+ - `TestMega` (`mega`)
1080
+ - `TestOpenDrive` (`opendrive`)
1081
+ - `TestOracleObjectStorage` (`oracleobjectstorage`)
1082
+ - `TestPikPak` (`pikpak`)
1083
+ - `TestPixeldrain` (`pixeldrain`)
1084
+ - `TestProtonDrive` (`protondrive`)
1085
+ - `TestPutio` (`putio`)
1086
+ - `TestQuatrix` (`quatrix`)
1087
+ - `TestS3GCS` (`s3`)
1088
+ - `TestBisyncRemoteRemote/extended_filenames`
1089
+ - `TestS3Rclone` (`s3`)
1090
+ - `TestSFTPRsyncNet` (`sftp`)
1091
+ - `TestStorj` (`storj`)
1092
+ - `TestWebdavInfiniteScale` (`webdav`)
1093
+ - `TestWebdavNextcloud` (`webdav`)
1094
+ - `TestWebdavOwncloud` (`webdav`)
1095
+ - `TestnStorage` (`netstorage`)
1096
+ <!--- end list_ignores - DO NOT EDIT THIS SECTION - use make commanddocs --->
1097
+ ([more info](https://github.com/rclone/rclone/blob/master/fstest/test_all/config.yaml))
1098
+
1099
+ The above lists are updated for each stable release of rclone. For test results
1100
+ updated nightly based on the latest beta, visit rclone's [integration test
1101
+ status page](https://pub.rclone.org/integration-tests/current/).
1102
+
1103
+ Early beta versions of `rclone bisync` required both underlying backends to support
1104
+ modification times, and refused to run otherwise.
1105
+ This limitation has been lifted as of `v1.66`, as bisync now supports comparing
1106
+ checksum and/or size instead of (or in addition to) modtime.
1107
+ See [`--compare`](#compare) for details.
1108
+
1109
+ ### Concurrent modifications
1110
+
1111
+ When using **Local, FTP or SFTP** remotes with [`--inplace`](/docs/#inplace),
1112
+ rclone does not create *temporary* files at the destination when copying, and
1113
+ thus if the connection is lost the created file may be corrupt, which will
1114
+ likely propagate back to the original path on the next sync, resulting in data
1115
+ loss. It is therefore recommended to *omit* `--inplace`.
1116
+
1117
+ Files that **change during** a bisync run may result in data loss. Prior to
1118
+ `rclone v1.66`, this was commonly seen in highly dynamic environments, where the
1119
+ filesystem was getting hammered by running processes during the sync. As of
1120
+ `rclone v1.66`, bisync was redesigned to use a "snapshot" model, greatly
1121
+ reducing the risks from changes during a sync. Changes that are not detected
1122
+ during the current sync will now be detected during the following sync, and will
1123
+ no longer cause the entire run to throw a critical error. There is additionally
1124
+ a mechanism to mark files as needing to be internally rechecked next time, for
1125
+ added safety. It should therefore no longer be necessary to sync only at quiet
1126
+ times -- however, note that an error can still occur if a file happens to change
1127
+ at the exact moment it's being read/written by bisync (same as would happen in
1128
+ `rclone sync`.) (See also: [`--ignore-checksum`](https://rclone.org/docs/#ignore-checksum),
1129
+ [`--local-no-check-updated`](https://rclone.org/local/#local-no-check-updated))
1130
+
1131
+ ### Empty directories
1132
+
1133
+ By default, new/deleted empty directories on one path are *not* propagated to
1134
+ the other side. This is because bisync (and rclone) natively works on files, not
1135
+ directories. However, this can be changed with the `--create-empty-src-dirs` flag,
1136
+ which works in much the same way as in [`sync`](/commands/rclone_sync/) and
1137
+ [`copy`](/commands/rclone_copy/). When used, empty directories created or
1138
+ deleted on one side will also be created or deleted on the other side. The
1139
+ following should be noted:
1140
+
1141
+ - `--create-empty-src-dirs` is not compatible with `--remove-empty-dirs`.
1142
+ Use only one or the other (or neither).
1143
+ - It is not recommended to switch back and forth between `--create-empty-src-dirs`
1144
+ and the default (no `--create-empty-src-dirs`) without running `-- resync`. This
1145
+ is because it may appear as though all directories (not just the empty ones) were
1146
+ created/deleted, when actually you've just toggled between making them
1147
+ visible/invisible to bisync. It looks scarier than it is, but it's still
1148
+ probably best to stick to one or the other, and use `--resync` when you need to
1149
+ switch.
1150
+
1151
+ ### Renamed directories
1152
+
1153
+ By default, renaming a folder on the Path1 side results in deleting all files on
1154
+ the Path2 side and then copying all files again from Path1 to Path2.
1155
+ Bisync sees this as all files in the old directory name as deleted and all
1156
+ files in the new directory name as new.
1157
+
1158
+ A recommended solution is to use [`--track-renames`](/docs/#track-renames),
1159
+ which is now supported in bisync as of `rclone v1.66`.
1160
+ Note that `--track-renames` is not available during `--resync`,
1161
+ as `--resync` does not delete anything (`--track-renames` only supports `sync`,
1162
+ not `copy`.)
1163
+
1164
+ Otherwise, the most effective and efficient method of renaming a directory
1165
+ is to rename it to the same name on both sides. (As of `rclone v1.64`,
1166
+ a `--resync` is no longer required after doing so, as bisync will automatically
1167
+ detect that Path1 and Path2 are in agreement.)
1168
+
1169
+ ### `--fast-list` used by default
1170
+
1171
+ Unlike most other rclone commands, bisync uses [`--fast-list`](/docs/#fast-list)
1172
+ by default, for backends that support it. In many cases this is desirable, however,
1173
+ there are some scenarios in which bisync could be faster *without* `--fast-list`,
1174
+ and there is also a [known issue concerning Google Drive users with many empty directories](https://github.com/rclone/rclone/commit/cbf3d4356135814921382dd3285d859d15d0aa77).
1175
+ For now, the recommended way to avoid using `--fast-list` is to add `--disable ListR`
1176
+ to all bisync commands. The default behavior may change in a future version.
1177
+
1178
+ ### Case (and unicode) sensitivity {#case-sensitivity}
1179
+
1180
+ As of `v1.66`, case and unicode form differences no longer cause critical errors,
1181
+ and normalization (when comparing between filesystems) is handled according to
1182
+ the same flags and defaults as `rclone sync`. See the following options (all of
1183
+ which are supported by bisync) to control this behavior more granularly:
1184
+
1185
+ - [`--fix-case`](/docs/#fix-case)
1186
+ - [`--ignore-case-sync`](/docs/#ignore-case-sync)
1187
+ - [`--no-unicode-normalization`](/docs/#no-unicode-normalization)
1188
+ - [`--local-unicode-normalization`](/local/#local-unicode-normalization) and
1189
+ [`--local-case-sensitive`](/local/#local-case-sensitive) (caution: these are
1190
+ normally not what you want.)
1191
+
1192
+ Note that in the (probably rare) event that `--fix-case` is used AND a file is
1193
+ new/changed on both sides AND the checksums match AND the filename case does not
1194
+ match, the Path1 filename is considered the winner, for the purposes of
1195
+ `--fix-case` (Path2 will be renamed to match it).
1196
+
1197
+ ## Windows support {#windows}
1198
+
1199
+ Bisync has been tested on Windows 8.1, Windows 10 Pro 64-bit and on Windows
1200
+ GitHub runners.
1201
+
1202
+ Drive letters are allowed, including drive letters mapped to network drives
1203
+ (`rclone bisync J:\localsync GDrive:`).
1204
+ If a drive letter is omitted, the shell current drive is the default.
1205
+ Drive letters are a single character follows by `:`, so cloud names
1206
+ must be more than one character long.
1207
+
1208
+ Absolute paths (with or without a drive letter), and relative paths
1209
+ (with or without a drive letter) are supported.
1210
+
1211
+ Working directory is created at `C:\Users\MyLogin\AppData\Local\rclone\bisync`.
1212
+
1213
+ Note that bisync output may show a mix of forward `/` and back `\` slashes.
1214
+
1215
+ Be careful of case independent directory and file naming on Windows
1216
+ vs. case dependent Linux
1217
+
1218
+ ## Filtering {#filtering}
1219
+
1220
+ See [filtering documentation](/filtering/)
1221
+ for how filter rules are written and interpreted.
1222
+
1223
+ Bisync's [`--filters-file`](#filters-file) flag slightly extends the rclone's
1224
+ [--filter-from](/filtering/#filter-from-read-filtering-patterns-from-a-file)
1225
+ filtering mechanism.
1226
+ For a given bisync run you may provide *only one* `--filters-file`.
1227
+ The `--include*`, `--exclude*`, and `--filter` flags are also supported.
1228
+
1229
+ ### How to filter directories
1230
+
1231
+ Filtering portions of the directory tree is a critical feature for syncing.
1232
+
1233
+ Examples of directory trees (always beneath the Path1/Path2 root level)
1234
+ you may want to exclude from your sync:
1235
+
1236
+ - Directory trees containing only software build intermediate files.
1237
+ - Directory trees containing application temporary files and data
1238
+ such as the Windows `C:\Users\MyLogin\AppData\` tree.
1239
+ - Directory trees containing files that are large, less important,
1240
+ or are getting thrashed continuously by ongoing processes.
1241
+
1242
+ On the other hand, there may be only select directories that you
1243
+ actually want to sync, and exclude all others. See the
1244
+ [Example include-style filters for Windows user directories](#include-filters)
1245
+ below.
1246
+
1247
+ ### Filters file writing guidelines
1248
+
1249
+ 1. Begin with excluding directory trees:
1250
+ - e.g. `- /AppData/`
1251
+ - `**` on the end is not necessary. Once a given directory level
1252
+ is excluded then everything beneath it won't be looked at by rclone.
1253
+ - Exclude such directories that are unneeded, are big, dynamically thrashed,
1254
+ or where there may be access permission issues.
1255
+ - Excluding such dirs first will make rclone operations (much) faster.
1256
+ - Specific files may also be excluded, as with the Dropbox exclusions
1257
+ example below.
1258
+ 2. Decide if it's easier (or cleaner) to:
1259
+ - Include select directories and therefore *exclude everything else* -- or --
1260
+ - Exclude select directories and therefore *include everything else*
1261
+ 3. Include select directories:
1262
+ - Add lines like: `+ /Documents/PersonalFiles/**` to select which
1263
+ directories to include in the sync.
1264
+ - `**` on the end specifies to include the full depth of the specified tree.
1265
+ - With Include-style filters, files at the Path1/Path2 root are not included.
1266
+ They may be included with `+ /*`.
1267
+ - Place RCLONE_TEST files within these included directory trees.
1268
+ They will only be looked for in these directory trees.
1269
+ - Finish by excluding everything else by adding `- **` at the end
1270
+ of the filters file.
1271
+ - Disregard step 4.
1272
+ 4. Exclude select directories:
1273
+ - Add more lines like in step 1.
1274
+ For example: `-/Desktop/tempfiles/`, or `- /testdir/`.
1275
+ Again, a `**` on the end is not necessary.
1276
+ - Do *not* add a `- **` in the file. Without this line, everything
1277
+ will be included that has not been explicitly excluded.
1278
+ - Disregard step 3.
1279
+
1280
+ A few rules for the syntax of a filter file expanding on
1281
+ [filtering documentation](/filtering/):
1282
+
1283
+ - Lines may start with spaces and tabs - rclone strips leading whitespace.
1284
+ - If the first non-whitespace character is a `#` then the line is a comment
1285
+ and will be ignored.
1286
+ - Blank lines are ignored.
1287
+ - The first non-whitespace character on a filter line must be a `+` or `-`.
1288
+ - Exactly 1 space is allowed between the `+/-` and the path term.
1289
+ - Only forward slashes (`/`) are used in path terms, even on Windows.
1290
+ - The rest of the line is taken as the path term.
1291
+ Trailing whitespace is taken literally, and probably is an error.
1292
+
1293
+ ### Example include-style filters for Windows user directories {#include-filters}
1294
+
1295
+ This Windows *include-style* example is based on the sync root (Path1)
1296
+ set to `C:\Users\MyLogin`. The strategy is to select specific directories
1297
+ to be synched with a network drive (Path2).
1298
+
1299
+ - `- /AppData/` excludes an entire tree of Windows stored stuff
1300
+ that need not be synched.
1301
+ In my case, AppData has >11 GB of stuff I don't care about, and there are
1302
+ some subdirectories beneath AppData that are not accessible to my
1303
+ user login, resulting in bisync critical aborts.
1304
+ - Windows creates cache files starting with both upper and
1305
+ lowercase `NTUSER` at `C:\Users\MyLogin`. These files may be dynamic,
1306
+ locked, and are generally *don't care*.
1307
+ - There are just a few directories with *my* data that I do want synched,
1308
+ in the form of `+ /<path>`. By selecting only the directory trees I
1309
+ want to avoid the dozen plus directories that various apps make
1310
+ at `C:\Users\MyLogin\Documents`.
1311
+ - Include files in the root of the sync point, `C:\Users\MyLogin`,
1312
+ by adding the `+ /*` line.
1313
+ - This is an Include-style filters file, therefore it ends with `- **`
1314
+ which excludes everything not explicitly included.
1315
+
1316
+ ```text
1317
+ - /AppData/
1318
+ - NTUSER*
1319
+ - ntuser*
1320
+ + /Documents/Family/**
1321
+ + /Documents/Sketchup/**
1322
+ + /Documents/Microcapture_Photo/**
1323
+ + /Documents/Microcapture_Video/**
1324
+ + /Desktop/**
1325
+ + /Pictures/**
1326
+ + /*
1327
+ - **
1328
+ ```
1329
+
1330
+ Note also that Windows implements several "library" links such as
1331
+ `C:\Users\MyLogin\My Documents\My Music` pointing to `C:\Users\MyLogin\Music`.
1332
+ rclone sees these as links, so you must add `--links` to the
1333
+ bisync command line if you which to follow these links. I find that I get
1334
+ permission errors in trying to follow the links, so I don't include the
1335
+ rclone `--links` flag, but then you get lots of `Can't follow symlink…`
1336
+ noise from rclone about not following the links. This noise can be
1337
+ quashed by adding `--quiet` to the bisync command line.
1338
+
1339
+ ## Example exclude-style filters files for use with Dropbox {#exclude-filters}
1340
+
1341
+ - Dropbox disallows syncing the listed temporary and configuration/data files.
1342
+ The `- <filename>` filters exclude these files where ever they may occur
1343
+ in the sync tree. Consider adding similar exclusions for file types
1344
+ you don't need to sync, such as core dump and software build files.
1345
+ - bisync testing creates `/testdir/` at the top level of the sync tree,
1346
+ and usually deletes the tree after the test. If a normal sync should run
1347
+ while the `/testdir/` tree exists the `--check-access` phase may fail
1348
+ due to unbalanced RCLONE_TEST files.
1349
+ The `- /testdir/` filter blocks this tree from being synched.
1350
+ You don't need this exclusion if you are not doing bisync development testing.
1351
+ - Everything else beneath the Path1/Path2 root will be synched.
1352
+ - RCLONE_TEST files may be placed anywhere within the tree, including the root.
1353
+
1354
+ ### Example filters file for Dropbox {#example-filters-file}
1355
+
1356
+ ```text
1357
+ # Filter file for use with bisync
1358
+ # See https://rclone.org/filtering/ for filtering rules
1359
+ # NOTICE: If you make changes to this file you MUST do a --resync run.
1360
+ # Run with --dry-run to see what changes will be made.
1361
+
1362
+ # Dropbox won't sync some files so filter them away here.
1363
+ # See https://help.dropbox.com/installs-integrations/sync-uploads/files-not-syncing
1364
+ - .dropbox.attr
1365
+ - ~*.tmp
1366
+ - ~$*
1367
+ - .~*
1368
+ - desktop.ini
1369
+ - .dropbox
1370
+
1371
+ # Used for bisync testing, so excluded from normal runs
1372
+ - /testdir/
1373
+
1374
+ # Other example filters
1375
+ #- /TiBU/
1376
+ #- /Photos/
1377
+ ```
1378
+
1379
+ ### How --check-access handles filters
1380
+
1381
+ At the start of a bisync run, listings are gathered for Path1 and Path2
1382
+ while using the user's `--filters-file`. During the check access phase,
1383
+ bisync scans these listings for `RCLONE_TEST` files.
1384
+ Any `RCLONE_TEST` files hidden by the `--filters-file` are *not* in the
1385
+ listings and thus not checked during the check access phase.
1386
+
1387
+ ## Troubleshooting {#troubleshooting}
1388
+
1389
+ ### Reading bisync logs
1390
+
1391
+ Here are two normal runs. The first one has a newer file on the remote.
1392
+ The second has no deltas between local and remote.
1393
+
1394
+ ```text
1395
+ 2021/05/16 00:24:38 INFO : Synching Path1 "/path/to/local/tree/" with Path2 "dropbox:/"
1396
+ 2021/05/16 00:24:38 INFO : Path1 checking for diffs
1397
+ 2021/05/16 00:24:38 INFO : - Path1 File is new - file.txt
1398
+ 2021/05/16 00:24:38 INFO : Path1: 1 changes: 1 new, 0 newer, 0 older, 0 deleted
1399
+ 2021/05/16 00:24:38 INFO : Path2 checking for diffs
1400
+ 2021/05/16 00:24:38 INFO : Applying changes
1401
+ 2021/05/16 00:24:38 INFO : - Path1 Queue copy to Path2 - dropbox:/file.txt
1402
+ 2021/05/16 00:24:38 INFO : - Path1 Do queued copies to - Path2
1403
+ 2021/05/16 00:24:38 INFO : Updating listings
1404
+ 2021/05/16 00:24:38 INFO : Validating listings for Path1 "/path/to/local/tree/" vs Path2 "dropbox:/"
1405
+ 2021/05/16 00:24:38 INFO : Bisync successful
1406
+
1407
+ 2021/05/16 00:36:52 INFO : Synching Path1 "/path/to/local/tree/" with Path2 "dropbox:/"
1408
+ 2021/05/16 00:36:52 INFO : Path1 checking for diffs
1409
+ 2021/05/16 00:36:52 INFO : Path2 checking for diffs
1410
+ 2021/05/16 00:36:52 INFO : No changes found
1411
+ 2021/05/16 00:36:52 INFO : Updating listings
1412
+ 2021/05/16 00:36:52 INFO : Validating listings for Path1 "/path/to/local/tree/" vs Path2 "dropbox:/"
1413
+ 2021/05/16 00:36:52 INFO : Bisync successful
1414
+ ```
1415
+
1416
+ ### Dry run oddity
1417
+
1418
+ The `--dry-run` messages may indicate that it would try to delete some files.
1419
+ For example, if a file is new on Path2 and does not exist on Path1 then
1420
+ it would normally be copied to Path1, but with `--dry-run` enabled those
1421
+ copies don't happen, which leads to the attempted delete on Path2,
1422
+ blocked again by --dry-run: `... Not deleting as --dry-run`.
1423
+
1424
+ This whole confusing situation is an artifact of the `--dry-run` flag.
1425
+ Scrutinize the proposed deletes carefully, and if the files would have been
1426
+ copied to Path1 then the threatened deletes on Path2 may be disregarded.
1427
+
1428
+ ### Retries
1429
+
1430
+ Rclone has built-in retries. If you run with `--verbose` you'll see
1431
+ error and retry messages such as shown below. This is usually not a bug.
1432
+ If at the end of the run, you see `Bisync successful` and not
1433
+ `Bisync critical error` or `Bisync aborted` then the run was successful,
1434
+ and you can ignore the error messages.
1435
+
1436
+ The following run shows an intermittent fail. Lines *5* and *6* are
1437
+ low-level messages. Line *6* is a bubbled-up *warning* message, conveying
1438
+ the error. Rclone normally retries failing commands, so there may be
1439
+ numerous such messages in the log.
1440
+
1441
+ Since there are no final error/warning messages on line *7*, rclone has
1442
+ recovered from failure after a retry, and the overall sync was successful.
1443
+
1444
+ ```text
1445
+ 1: 2021/05/14 00:44:12 INFO : Synching Path1 "/path/to/local/tree" with Path2 "dropbox:"
1446
+ 2: 2021/05/14 00:44:12 INFO : Path1 checking for diffs
1447
+ 3: 2021/05/14 00:44:12 INFO : Path2 checking for diffs
1448
+ 4: 2021/05/14 00:44:12 INFO : Path2: 113 changes: 22 new, 0 newer, 0 older, 91 deleted
1449
+ 5: 2021/05/14 00:44:12 ERROR : /path/to/local/tree/objects/af: error listing: unexpected end of JSON input
1450
+ 6: 2021/05/14 00:44:12 NOTICE: WARNING listing try 1 failed. - dropbox:
1451
+ 7: 2021/05/14 00:44:12 INFO : Bisync successful
1452
+ ```
1453
+
1454
+ This log shows a *Critical failure* which requires a `--resync` to recover from.
1455
+ See the [Runtime Error Handling](#error-handling) section.
1456
+
1457
+ ```text
1458
+ 2021/05/12 00:49:40 INFO : Google drive root '': Waiting for checks to finish
1459
+ 2021/05/12 00:49:40 INFO : Google drive root '': Waiting for transfers to finish
1460
+ 2021/05/12 00:49:40 INFO : Google drive root '': not deleting files as there were IO errors
1461
+ 2021/05/12 00:49:40 ERROR : Attempt 3/3 failed with 3 errors and: not deleting files as there were IO errors
1462
+ 2021/05/12 00:49:40 ERROR : Failed to sync: not deleting files as there were IO errors
1463
+ 2021/05/12 00:49:40 NOTICE: WARNING rclone sync try 3 failed. - /path/to/local/tree/
1464
+ 2021/05/12 00:49:40 ERROR : Bisync aborted. Must run --resync to recover.
1465
+ ```
1466
+
1467
+ ### Denied downloads of "infected" or "abusive" files
1468
+
1469
+ Google Drive has a filter for certain file types (`.exe`, `.apk`, et cetera)
1470
+ that by default cannot be copied from Google Drive to the local filesystem.
1471
+ If you are having problems, run with `--verbose` to see specifically which
1472
+ files are generating complaints. If the error is
1473
+ `This file has been identified as malware or spam and cannot be downloaded`,
1474
+ consider using the flag
1475
+ [--drive-acknowledge-abuse](/drive/#drive-acknowledge-abuse).
1476
+
1477
+ ### Google Docs (and other files of unknown size) {#gdocs}
1478
+
1479
+ As of `v1.66`, [Google Docs](/drive/#import-export-of-google-documents)
1480
+ (including Google Sheets, Slides, etc.) are now supported in bisync, subject to
1481
+ the same options, defaults, and limitations as in `rclone sync`. When bisyncing
1482
+ drive with non-drive backends, the drive -> non-drive direction is controlled
1483
+ by [`--drive-export-formats`](/drive/#drive-export-formats) (default
1484
+ `"docx,xlsx,pptx,svg"`) and the non-drive -> drive direction is controlled by
1485
+ [`--drive-import-formats`](/drive/#drive-import-formats) (default none.)
1486
+
1487
+ For example, with the default export/import formats, a Google Sheet on the
1488
+ drive side will be synced to an `.xlsx` file on the non-drive side. In the
1489
+ reverse direction, `.xlsx` files with filenames that match an existing Google
1490
+ Sheet will be synced to that Google Sheet, while `.xlsx` files that do NOT
1491
+ match an existing Google Sheet will be copied to drive as normal `.xlsx` files
1492
+ (without conversion to Sheets, although the Google Drive web browser UI may
1493
+ still give you the option to open it as one.)
1494
+
1495
+ If `--drive-import-formats` is set (it's not, by default), then all of the
1496
+ specified formats will be converted to Google Docs, if there is no existing
1497
+ Google Doc with a matching name. Caution: such conversion can be quite lossy,
1498
+ and in most cases it's probably not what you want!
1499
+
1500
+ To bisync Google Docs as URL shortcut links (in a manner similar to "Drive for
1501
+ Desktop"), use: `--drive-export-formats url` (or
1502
+ [alternatives](https://rclone.org/drive/#exportformats:~:text=available%20Google%20Documents.-,Extension,macOS,-Standard%20options).)
1503
+
1504
+ Note that these link files cannot be edited on the non-drive side -- you will
1505
+ get errors if you try to sync an edited link file back to drive. They CAN be
1506
+ deleted (it will result in deleting the corresponding Google Doc.) If you
1507
+ create a `.url` file on the non-drive side that does not match an existing
1508
+ Google Doc, bisyncing it will just result in copying the literal `.url` file
1509
+ over to drive (no Google Doc will be created.) So, as a general rule of thumb,
1510
+ think of them as read-only placeholders on the non-drive side, and make all
1511
+ your changes on the drive side.
1512
+
1513
+ Likewise, even with other export-formats, it is best to only move/rename Google
1514
+ Docs on the drive side. This is because otherwise, bisync will interpret this
1515
+ as a file deleted and another created, and accordingly, it will delete the
1516
+ Google Doc and create a new file at the new path. (Whether or not that new file
1517
+ is a Google Doc depends on `--drive-import-formats`.)
1518
+
1519
+ Lastly, take note that all Google Docs on the drive side have a size of `-1`
1520
+ and no checksum. Therefore, they cannot be reliably synced with the
1521
+ `--checksum` or `--size-only` flags. (To be exact: they will still get
1522
+ created/deleted, and bisync's delta engine will notice changes and queue them
1523
+ for syncing, but the underlying sync function will consider them identical and
1524
+ skip them.) To work around this, use the default (modtime and size) instead of
1525
+ `--checksum` or `--size-only`.
1526
+
1527
+ To ignore Google Docs entirely, use
1528
+ [`--drive-skip-gdocs`](/drive/#drive-skip-gdocs).
1529
+
1530
+ ## Usage examples
1531
+
1532
+ ### Cron {#cron}
1533
+
1534
+ Rclone does not yet have a built-in capability to monitor the local file
1535
+ system for changes and must be blindly run periodically.
1536
+ On Windows this can be done using a *Task Scheduler*,
1537
+ on Linux you can use *Cron* which is described below.
1538
+
1539
+ The 1st example runs a sync every 5 minutes between a local directory
1540
+ and an OwnCloud server, with output logged to a runlog file:
1541
+
1542
+ ```text
1543
+ # Minute (0-59)
1544
+ # Hour (0-23)
1545
+ # Day of Month (1-31)
1546
+ # Month (1-12 or Jan-Dec)
1547
+ # Day of Week (0-6 or Sun-Sat)
1548
+ # Command
1549
+ */5 * * * * /path/to/rclone bisync /local/files MyCloud: --check-access --filters-file /path/to/bysync-filters.txt --log-file /path/to//bisync.log
1550
+ ```
1551
+
1552
+ See [crontab syntax](https://www.man7.org/linux/man-pages/man1/crontab.1p.html#INPUT_FILES)
1553
+ for the details of crontab time interval expressions.
1554
+
1555
+ If you run `rclone bisync` as a cron job, redirect stdout/stderr to a file.
1556
+ The 2nd example runs a sync to Dropbox every hour and logs all stdout (via the `>>`)
1557
+ and stderr (via `2>&1`) to a log file.
1558
+
1559
+ ```text
1560
+ 0 * * * * /path/to/rclone bisync /path/to/local/dropbox Dropbox: --check-access --filters-file /home/user/filters.txt >> /path/to/logs/dropbox-run.log 2>&1
1561
+ ```
1562
+
1563
+ ### Sharing an encrypted folder tree between hosts
1564
+
1565
+ bisync can keep a local folder in sync with a cloud service,
1566
+ but what if you have some highly sensitive files to be synched?
1567
+
1568
+ Usage of a cloud service is for exchanging both routine and sensitive
1569
+ personal files between one's home network, one's personal notebook when on the
1570
+ road, and with one's work computer. The routine data is not sensitive.
1571
+ For the sensitive data, configure an rclone [crypt remote](/crypt/) to point to
1572
+ a subdirectory within the local disk tree that is bisync'd to Dropbox,
1573
+ and then set up an bisync for this local crypt directory to a directory
1574
+ outside of the main sync tree.
1575
+
1576
+ ### Linux server setup
1577
+
1578
+ - `/path/to/DBoxroot` is the root of my local sync tree.
1579
+ There are numerous subdirectories.
1580
+ - `/path/to/DBoxroot/crypt` is the root subdirectory for files
1581
+ that are encrypted. This local directory target is setup as an
1582
+ rclone crypt remote named `Dropcrypt:`.
1583
+ See [rclone.conf](#rclone-conf-snippet) snippet below.
1584
+ - `/path/to/my/unencrypted/files` is the root of my sensitive
1585
+ files - not encrypted, not within the tree synched to Dropbox.
1586
+ - To sync my local unencrypted files with the encrypted Dropbox versions
1587
+ I manually run `bisync /path/to/my/unencrypted/files DropCrypt:`.
1588
+ This step could be bundled into a script to run before and after
1589
+ the full Dropbox tree sync in the last step,
1590
+ thus actively keeping the sensitive files in sync.
1591
+ - `bisync /path/to/DBoxroot Dropbox:` runs periodically via cron,
1592
+ keeping my full local sync tree in sync with Dropbox.
1593
+
1594
+ ### Windows notebook setup
1595
+
1596
+ - The Dropbox client runs keeping the local tree `C:\Users\MyLogin\Dropbox`
1597
+ always in sync with Dropbox. I could have used `rclone bisync` instead.
1598
+ - A separate directory tree at `C:\Users\MyLogin\Documents\DropLocal`
1599
+ hosts the tree of unencrypted files/folders.
1600
+ - To sync my local unencrypted files with the encrypted
1601
+ Dropbox versions I manually run the following command:
1602
+ `rclone bisync C:\Users\MyLogin\Documents\DropLocal Dropcrypt:`.
1603
+ - The Dropbox client then syncs the changes with Dropbox.
1604
+
1605
+ ### rclone.conf snippet {#rclone-conf-snippet}
1606
+
1607
+ ```ini
1608
+ [Dropbox]
1609
+ type = dropbox
1610
+ ...
1611
+
1612
+ [Dropcrypt]
1613
+ type = crypt
1614
+ remote = /path/to/DBoxroot/crypt # on the Linux server
1615
+ remote = C:\Users\MyLogin\Dropbox\crypt # on the Windows notebook
1616
+ filename_encryption = standard
1617
+ directory_name_encryption = true
1618
+ password = ...
1619
+ ...
1620
+ ```
1621
+
1622
+ ## Testing {#testing}
1623
+
1624
+ You should read this section only if you are developing for rclone.
1625
+ You need to have rclone source code locally to work with bisync tests.
1626
+
1627
+ Bisync has a dedicated test framework implemented in the `bisync_test.go`
1628
+ file located in the rclone source tree. The test suite is based on the
1629
+ `go test` command. Series of tests are stored in subdirectories below the
1630
+ `cmd/bisync/testdata` directory. Individual tests can be invoked by their
1631
+ directory name, e.g.
1632
+ `go test . -case basic -remote local -remote2 gdrive: -v`
1633
+
1634
+ Tests will make a temporary folder on remote and purge it afterwards.
1635
+ If during test run there are intermittent errors and rclone retries,
1636
+ these errors will be captured and flagged as invalid MISCOMPAREs.
1637
+ Rerunning the test will let it pass. Consider such failures as noise.
1638
+
1639
+ ### Test command syntax
1640
+
1641
+ ```text
1642
+ usage: go test ./cmd/bisync [options...]
1643
+
1644
+ Options:
1645
+ -case NAME Name(s) of the test case(s) to run. Multiple names should
1646
+ be separated by commas. You can remove the `test_` prefix
1647
+ and replace `_` by `-` in test name for convenience.
1648
+ If not `all`, the name(s) should map to a directory under
1649
+ `./cmd/bisync/testdata`.
1650
+ Use `all` to run all tests (default: all)
1651
+ -remote PATH1 `local` or name of cloud service with `:` (default: local)
1652
+ -remote2 PATH2 `local` or name of cloud service with `:` (default: local)
1653
+ -no-compare Disable comparing test results with the golden directory
1654
+ (default: compare)
1655
+ -no-cleanup Disable cleanup of Path1 and Path2 testdirs.
1656
+ Useful for troubleshooting. (default: cleanup)
1657
+ -golden Store results in the golden directory (default: false)
1658
+ This flag can be used with multiple tests.
1659
+ -debug Print debug messages
1660
+ -stop-at NUM Stop test after given step number. (default: run to the end)
1661
+ Implies `-no-compare` and `-no-cleanup`, if the test really
1662
+ ends prematurely. Only meaningful for a single test case.
1663
+ -refresh-times Force refreshing the target modtime, useful for Dropbox
1664
+ (default: false)
1665
+ -verbose Run tests verbosely
1666
+ ```
1667
+
1668
+ Note: unlike rclone flags which must be prefixed by double dash (`--`), the
1669
+ test command flags can be equally prefixed by a single `-` or double dash.
1670
+
1671
+ ### Running tests
1672
+
1673
+ - `go test . -case basic -remote local -remote2 local`
1674
+ runs the `test_basic` test case using only the local filesystem,
1675
+ syncing one local directory with another local directory.
1676
+ Test script output is to the console, while commands within scenario.txt
1677
+ have their output sent to the `.../workdir/test.log` file,
1678
+ which is finally compared to the golden copy.
1679
+ - The first argument after `go test` should be a relative name of the
1680
+ directory containing bisync source code. If you run tests right from there,
1681
+ the argument will be `.` (current directory) as in most examples below.
1682
+ If you run bisync tests from the rclone source directory, the command
1683
+ should be `go test ./cmd/bisync ...`.
1684
+ - The test engine will mangle rclone output to ensure comparability
1685
+ with golden listings and logs.
1686
+ - Test scenarios are located in `./cmd/bisync/testdata`. The test `-case`
1687
+ argument should match the full name of a subdirectory under that
1688
+ directory. Every test subdirectory name on disk must start with `test_`,
1689
+ this prefix can be omitted on command line for brevity. Also, underscores
1690
+ in the name can be replaced by dashes for convenience.
1691
+ - `go test . -remote local -remote2 local -case all` runs all tests.
1692
+ - Path1 and Path2 may either be the keyword `local`
1693
+ or may be names of configured cloud services.
1694
+ `go test . -remote gdrive: -remote2 dropbox: -case basic`
1695
+ will run the test between these two services, without transferring
1696
+ any files to the local filesystem.
1697
+ - Test run stdout and stderr console output may be directed to a file, e.g.
1698
+ `go test . -remote gdrive: -remote2 local -case all > runlog.txt 2>&1`
1699
+
1700
+ ### Test execution flow
1701
+
1702
+ 1. The base setup in the `initial` directory of the testcase is applied
1703
+ on the Path1 and Path2 filesystems (via rclone copy the initial directory
1704
+ to Path1, then rclone sync Path1 to Path2).
1705
+ 2. The commands in the scenario.txt file are applied, with output directed
1706
+ to the `test.log` file in the test working directory.
1707
+ Typically, the first actual command in the `scenario.txt` file is
1708
+ to do a `--resync`, which establishes the baseline
1709
+ `{...}.path1.lst` and `{...}.path2.lst` files in the test working
1710
+ directory (`.../workdir/` relative to the temporary test directory).
1711
+ Various commands and listing snapshots are done within the test.
1712
+ 3. Finally, the contents of the test working directory are compared
1713
+ to the contents of the testcase's golden directory.
1714
+
1715
+ ### Notes about testing
1716
+
1717
+ - Test cases are in individual directories beneath `./cmd/bisync/testdata`.
1718
+ A command line reference to a test is understood to reference a directory
1719
+ beneath `testdata`. For example,
1720
+ `go test ./cmd/bisync -case dry-run -remote gdrive: -remote2 local`
1721
+ refers to the test case in `./cmd/bisync/testdata/test_dry_run`.
1722
+ - The test working directory is located at `.../workdir` relative to a
1723
+ temporary test directory, usually under `/tmp` on Linux.
1724
+ - The local test sync tree is created at a temporary directory named
1725
+ like `bisync.XXX` under system temporary directory.
1726
+ - The remote test sync tree is located at a temporary directory
1727
+ under `<remote:>/bisync.XXX/`.
1728
+ - `path1` and/or `path2` subdirectories are created in a temporary
1729
+ directory under the respective local or cloud test remote.
1730
+ - By default, the Path1 and Path2 test dirs and workdir will be deleted
1731
+ after each test run. The `-no-cleanup` flag disables purging these
1732
+ directories when validating and debugging a given test.
1733
+ These directories will be flushed before running another test,
1734
+ independent of the `-no-cleanup` usage.
1735
+ - You will likely want to add `- /testdir/` to your normal
1736
+ bisync `--filters-file` so that normal syncs do not attempt to sync
1737
+ the test temporary directories, which may have `RCLONE_TEST` miscompares
1738
+ in some testcases which would otherwise trip the `--check-access` system.
1739
+ The `--check-access` mechanism is hard-coded to ignore `RCLONE_TEST`
1740
+ files beneath `bisync/testdata`, so the test cases may reside on the
1741
+ synched tree even if there are check file mismatches in the test tree.
1742
+ - Some Dropbox tests can fail, notably printing the following message:
1743
+ `src and dst identical but can't set mod time without deleting and re-uploading`
1744
+ This is expected and happens due to the way Dropbox handles modification times.
1745
+ You should use the `-refresh-times` test flag to make up for this.
1746
+ - If Dropbox tests hit request limit for you and print error message
1747
+ `too_many_requests/...: Too many requests or write operations.`
1748
+ then follow the
1749
+ [Dropbox App ID instructions](/dropbox/#get-your-own-dropbox-app-id).
1750
+
1751
+ ### Updating golden results
1752
+
1753
+ Sometimes even a slight change in the bisync source can cause little changes
1754
+ spread around many log files. Updating them manually would be a nightmare.
1755
+
1756
+ The `-golden` flag will store the `test.log` and `*.lst` listings from each
1757
+ test case into respective golden directories. Golden results will
1758
+ automatically contain generic strings instead of local or cloud paths which
1759
+ means that they should match when run with a different cloud service.
1760
+
1761
+ Your normal workflow might be as follows:
1762
+
1763
+ 1. Git-clone the rclone sources locally
1764
+ 2. Modify bisync source and check that it builds
1765
+ 3. Run the whole test suite `go test ./cmd/bisync -remote local`
1766
+ 4. If some tests show log difference, recheck them individually, e.g.:
1767
+ `go test ./cmd/bisync -remote local -case basic`
1768
+ 5. If you are convinced with the difference, goldenize all tests at once:
1769
+ `go test ./cmd/bisync -remote local -golden`
1770
+ 6. Use word diff: `git diff --word-diff ./cmd/bisync/testdata/`.
1771
+ Please note that normal line-level diff is generally useless here.
1772
+ 7. Check the difference *carefully*!
1773
+ 8. Commit the change (`git commit`) *only* if you are sure.
1774
+ If unsure, save your code changes then wipe the log diffs from git:
1775
+ `git reset [--hard]`.
1776
+
1777
+ ### Structure of test scenarios
1778
+
1779
+ - `<testname>/initial/` contains a tree of files that will be set
1780
+ as the initial condition on both Path1 and Path2 testdirs.
1781
+ - `<testname>/modfiles/` contains files that will be used to
1782
+ modify the Path1 and/or Path2 filesystems.
1783
+ - `<testname>/golden/` contains the expected content of the test
1784
+ working directory (`workdir`) at the completion of the testcase.
1785
+ - `<testname>/scenario.txt` contains the body of the test, in the form of
1786
+ various commands to modify files, run bisync, and snapshot listings.
1787
+ Output from these commands is captured to `.../workdir/test.log`
1788
+ for comparison to the golden files.
1789
+
1790
+ ### Supported test commands
1791
+
1792
+ - `test <some message>`
1793
+ Print the line to the console and to the `test.log`:
1794
+ `test sync is working correctly with options x, y, z`
1795
+ - `copy-listings <prefix>`
1796
+ Save a copy of all `.lst` listings in the test working directory
1797
+ with the specified prefix:
1798
+ `save-listings exclude-pass-run`
1799
+ - `move-listings <prefix>`
1800
+ Similar to `copy-listings` but removes the source
1801
+ - `purge-children <dir>`
1802
+ This will delete all child files and purge all child subdirs under given
1803
+ directory but keep the parent intact. This behavior is important for tests
1804
+ with Google Drive because removing and re-creating the parent would change
1805
+ its ID.
1806
+ - `delete-file <file>`
1807
+ Delete a single file.
1808
+ - `delete-glob <dir> <pattern>`
1809
+ Delete a group of files located one level deep in the given directory
1810
+ with names matching a given glob pattern.
1811
+ - `touch-glob YYYY-MM-DD <dir> <pattern>`
1812
+ Change modification time on a group of files.
1813
+ - `touch-copy YYYY-MM-DD <source-file> <dest-dir>`
1814
+ Change file modification time then copy it to destination.
1815
+ - `copy-file <source-file> <dest-dir>`
1816
+ Copy a single file to given directory.
1817
+ - `copy-as <source-file> <dest-file>`
1818
+ Similar to above but destination must include both directory
1819
+ and the new file name at destination.
1820
+ - `copy-dir <src> <dst>` and `sync-dir <src> <dst>`
1821
+ Copy/sync a directory. Equivalent of `rclone copy` and `rclone sync`.
1822
+ - `list-dirs <dir>`
1823
+ Equivalent to `rclone lsf -R --dirs-only <dir>`
1824
+ - `bisync [options]`
1825
+ Runs bisync against `-remote` and `-remote2`.
1826
+
1827
+ ### Supported substitution terms
1828
+
1829
+ - `{testdir/}` - the root dir of the testcase
1830
+ - `{datadir/}` - the `modfiles` dir under the testcase root
1831
+ - `{workdir/}` - the temporary test working directory
1832
+ - `{path1/}` - the root of the Path1 test directory tree
1833
+ - `{path2/}` - the root of the Path2 test directory tree
1834
+ - `{session}` - base name of the test listings
1835
+ - `{/}` - OS-specific path separator
1836
+ - `{spc}`, `{tab}`, `{eol}` - whitespace
1837
+ - `{chr:HH}` - raw byte with given hexadecimal code
1838
+
1839
+ Substitution results of the terms named like `{dir/}` will end with
1840
+ `/` (or backslash on Windows), so it is not necessary to include
1841
+ slash in the usage, for example `delete-file {path1/}file1.txt`.
1842
+
1843
+ ## Benchmarks
1844
+
1845
+ *This section is work in progress.*
1846
+
1847
+ Here are a few data points for scale, execution times, and memory usage.
1848
+
1849
+ The first set of data was taken between a local disk to Dropbox.
1850
+ The [speedtest.net](https://speedtest.net) download speed was ~170 Mbps,
1851
+ and upload speed was ~10 Mbps. 500 files (~9.5 MB each) had been already
1852
+ synched. 50 files were added in a new directory, each ~9.5 MB, ~475 MB total.
1853
+
1854
+ Change | Operations and times | Overall run time
1855
+ --------------------------------------|--------------------------------------------------------|------------------
1856
+ 500 files synched (nothing to move) | 1x listings for Path1 & Path2 | 1.5 sec
1857
+ 500 files synched with --check-access | 1x listings for Path1 & Path2 | 1.5 sec
1858
+ 50 new files on remote | Queued 50 copies down: 27 sec | 29 sec
1859
+ Moved local dir | Queued 50 copies up: 410 sec, 50 deletes up: 9 sec | 421 sec
1860
+ Moved remote dir | Queued 50 copies down: 31 sec, 50 deletes down: <1 sec | 33 sec
1861
+ Delete local dir | Queued 50 deletes up: 9 sec | 13 sec
1862
+
1863
+ This next data is from a user's application. They had ~400GB of data
1864
+ over 1.96 million files being sync'ed between a Windows local disk and some
1865
+ remote cloud. The file full path length was on average 35 characters
1866
+ (which factors into load time and RAM required).
1867
+
1868
+ - Loading the prior listing into memory (1.96 million files, listing file
1869
+ size 140 MB) took ~30 sec and occupied about 1 GB of RAM.
1870
+ - Getting a fresh listing of the local file system (producing the
1871
+ 140 MB output file) took about XXX sec.
1872
+ - Getting a fresh listing of the remote file system (producing the 140 MB
1873
+ output file) took about XXX sec. The network download speed was measured
1874
+ at XXX Mb/s.
1875
+ - Once the prior and current Path1 and Path2 listings were loaded (a total
1876
+ of four to be loaded, two at a time), determining the deltas was pretty
1877
+ quick (a few seconds for this test case), and the transfer time for any
1878
+ files to be copied was dominated by the network bandwidth.
1879
+
1880
+ ## References
1881
+
1882
+ rclone's bisync implementation was derived from
1883
+ the [rclonesync-V2](https://github.com/cjnaz/rclonesync-V2) project,
1884
+ including documentation and test mechanisms,
1885
+ with [@cjnaz](https://github.com/cjnaz)'s full support and encouragement.
1886
+
1887
+ `rclone bisync` is similar in nature to a range of other projects:
1888
+
1889
+ - [unison](https://github.com/bcpierce00/unison)
1890
+ - [syncthing](https://github.com/syncthing/syncthing)
1891
+ - [cjnaz/rclonesync](https://github.com/cjnaz/rclonesync-V2)
1892
+ - [ConorWilliams/rsinc](https://github.com/ConorWilliams/rsinc)
1893
+ - [jwink3101/syncrclone](https://github.com/Jwink3101/syncrclone)
1894
+ - [DavideRossi/upback](https://github.com/DavideRossi/upback)
1895
+
1896
+ Bisync adopts the differential synchronization technique, which is
1897
+ based on keeping history of changes performed by both synchronizing sides.
1898
+ See the *Dual Shadow Method* section in
1899
+ [Neil Fraser's article](https://neil.fraser.name/writing/sync/).
1900
+
1901
+ Also note a number of academic publications by
1902
+ [Benjamin Pierce](http://www.cis.upenn.edu/%7Ebcpierce/papers/index.shtml#File%20Synchronization)
1903
+ about *Unison* and synchronization in general.
1904
+
1905
+ ## Changelog
1906
+
1907
+ ### `v1.74`
1908
+
1909
+ - Added several missing `rc` parameters.
1910
+ - Optional `rc` parameters are now truly optional.
1911
+ - `rc` output now provides more structured information.
1912
+
1913
+ ### `v1.71`
1914
+
1915
+ - `bisync` is now officially released from beta.
1916
+
1917
+ - Fixed an issue causing hash type to be set incorrectly if `path2` had slow
1918
+ hashes and `--no-slow-hash` or `--slow-hash-sync-only` was in use.
1919
+
1920
+ - Fixed an issue causing errors when running concurrent bisync runs through the `rc`.
1921
+
1922
+ ### `v1.69.1`
1923
+
1924
+ - Fixed an issue causing listings to not capture concurrent modifications under
1925
+ certain conditions
1926
+
1927
+ ### `v1.68`
1928
+
1929
+ - Fixed an issue affecting backends that round modtimes to a lower precision.
1930
+
1931
+ ### `v1.67`
1932
+
1933
+ - Added integration tests against all backends.
1934
+
1935
+ ### `v1.66`
1936
+
1937
+ - Copies and deletes are now handled in one operation instead of two
1938
+
1939
+ - `--track-renames` and `--backup-dir` are now supported
1940
+ - Partial uploads known issue on `local`/`ftp`/`sftp` has been resolved (unless
1941
+ using `--inplace`)
1942
+ - Final listings are now generated from sync results, to avoid needing to re-list
1943
+ - Bisync is now much more resilient to changes that happen during a bisync run,
1944
+ and far less prone to critical errors / undetected changes
1945
+ - Bisync is now capable of rolling a file listing back in cases of uncertainty,
1946
+ essentially marking the file as needing to be rechecked next time.
1947
+ - A few basic terminal colors are now supported, controllable with
1948
+ [`--color`](/docs/#color) (`AUTO`|`NEVER`|`ALWAYS`)
1949
+ - Initial listing snapshots of Path1 and Path2 are now generated concurrently,
1950
+ using the same "march" infrastructure as `check` and `sync`,
1951
+ for performance improvements and less
1952
+ [risk of error](https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=4.%20Listings%20should%20alternate%20between%20paths%20to%20minimize%20errors).
1953
+ - Fixed handling of unicode normalization and case insensitivity, support for
1954
+ [`--fix-case`](/docs/#fix-case), [`--ignore-case-sync`](/docs/#ignore-case-sync),
1955
+ [`--no-unicode-normalization`](/docs/#no-unicode-normalization)
1956
+ - `--resync` is now much more efficient (especially for users of `--create-empty-src-dirs`)
1957
+ - Google Docs (and other files of unknown size) are now supported (with the same
1958
+ options as in `sync`)
1959
+ - Equality checks before a sync conflict rename now fall back to `cryptcheck`
1960
+ (when possible) or `--download`,
1961
+ instead of of `--size-only`, when `check` is not available.
1962
+ - Bisync no longer fails to find the correct listing file when configs are
1963
+ overridden with backend-specific flags.
1964
+ - Bisync now fully supports comparing based on any combination of size, modtime,
1965
+ and checksum, lifting the prior restriction on backends without modtime support.
1966
+ - Bisync now supports a "Graceful Shutdown" mode to cleanly cancel a run early
1967
+ without requiring `--resync`.
1968
+ - New `--recover` flag allows robust recovery in the event of interruptions,
1969
+ without requiring `--resync`.
1970
+ - A new `--max-lock` setting allows lock files to automatically renew and expire,
1971
+ for better automatic recovery when a run is interrupted.
1972
+ - Bisync now supports auto-resolving sync conflicts and customizing rename
1973
+ behavior with new [`--conflict-resolve`](#conflict-resolve),
1974
+ [`--conflict-loser`](#conflict-loser), and
1975
+ [`--conflict-suffix`](#conflict-suffix) flags.
1976
+ - A new [`--resync-mode`](#resync-mode) flag allows more control over which
1977
+ version of a file gets kept during a `--resync`.
1978
+ - Bisync now supports [`--retries`](/docs/#retries-int) and [`--retries-sleep`](/docs/#retries-sleep-time)
1979
+ (when [`--resilient`](#resilient) is set.)
1980
+
1981
+ ### `v1.64`
1982
+
1983
+ - Fixed an [issue](https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=1.%20Dry%20runs%20are%20not%20completely%20dry)
1984
+ causing dry runs to inadvertently commit filter changes
1985
+
1986
+ - Fixed an [issue](https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=2.%20%2D%2Dresync%20deletes%20data%2C%20contrary%20to%20docs)
1987
+ causing `--resync` to erroneously delete empty folders and duplicate files
1988
+ unique to Path2
1989
+ - `--check-access` is now enforced during `--resync`, preventing data loss in
1990
+ [certain user error scenarios](https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=%2D%2Dcheck%2Daccess%20doesn%27t%20always%20fail%20when%20it%20should)
1991
+ - Fixed an [issue](https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=5.%20Bisync%20reads%20files%20in%20excluded%20directories%20during%20delete%20operations)
1992
+ causing bisync to consider more files than necessary due to overbroad filters
1993
+ during delete operations
1994
+ - [Improved detection of false positive change conflicts](https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=1.%20Identical%20files%20should%20be%20left%20alone%2C%20even%20if%20new/newer/changed%20on%20both%20sides)
1995
+ (identical files are now left alone instead of renamed)
1996
+ - Added [support for `--create-empty-src-dirs`](https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=3.%20Bisync%20should%20create/delete%20empty%20directories%20as%20sync%20does%2C%20when%20%2D%2Dcreate%2Dempty%2Dsrc%2Ddirs%20is%20passed)
1997
+ - Added experimental `--resilient` mode to allow
1998
+ [recovery from self-correctable errors](https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=2.%20Bisync%20should%20be%20more%20resilient%20to%20self%2Dcorrectable%20errors)
1999
+ - Added [new `--ignore-listing-checksum` flag](https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=6.%20%2D%2Dignore%2Dchecksum%20should%20be%20split%20into%20two%20flags%20for%20separate%20purposes)
2000
+ to distinguish from `--ignore-checksum`
2001
+ - [Performance improvements](https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=6.%20Deletes%20take%20several%20times%20longer%20than%20copies)
2002
+ for large remotes
2003
+ - Documentation and testing improvements