"rsync for cloud storage" - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files
This report summarizes scanner evidence for rclone/rclone, a Go project with 60,661 GitHub stars. SynthScan examined 461,131 lines of code across 2100 source files, recording 426 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 1.2 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 385 finding(s).
Are imports declared and package/API names verified? 27 finding(s).
Are wrappers, guards, and repeated structures necessary? 15 finding(s).
Which changes need focused human review? 426 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 426 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .markdownlint.yml | 41 | # Markdown files we must use whatever works in the final HTML generated docs. | COMMENT |
| LOW | cmd/archive/extract/extract.go | 201 | COMMENT | |
| LOW | cmd/gitannex/e2e_test.go | 101 | configDir string | COMMENT |
| LOW | cmd/gitannex/gitannex.go | 1 | // Package gitannex provides the "gitannex" command, which enables [git-annex] | COMMENT |
| LOW | cmd/gitannex/configparse.go | 81 | // validateRemoteName validates the "rcloneremotename" config that we receive | COMMENT |
| LOW | cmd/gitannex/gitannex_test.go | 1121 | remoteItem := fstest.NewItem("KeyAbsolute", "HELLO", item.ModTime) | COMMENT |
| LOW | cmd/cmount/fs.go | 221 | } | COMMENT |
| LOW | cmd/cmount/mount_unsupported.go | 1 | //go:build !((linux && cgo && cmount) || (darwin && cgo && cmount) || (freebsd && cgo && cmount) || (openbsd && cgo && c | COMMENT |
| LOW | cmd/cmount/mountpoint_windows.go | 21 | COMMENT | |
| LOW | cmd/bisync/bisync_test.go | 141 | // Test case `dry-run` produced log mismatches due to non-deterministic | COMMENT |
| LOW | …d/bisync/testdata/test_createemptysrcdirs/scenario.txt | 1 | test createemptysrcdirs | COMMENT |
| LOW | cmd/bisync/testdata/test_dry_run/scenario.txt | 1 | test dry-run | COMMENT |
| LOW | …ck_access_filters/golden/include-other-filtersfile.txt | 1 | # INCLUDE OTHER Filters file for Check Access filtering testing | COMMENT |
| LOW | …_access_filters/modfiles/include-other-filtersfile.txt | 1 | # INCLUDE OTHER Filters file for Check Access filtering testing | COMMENT |
| LOW | cmd/bisync/testdata/test_compare_all/scenario.txt | 1 | test changes compare-all | COMMENT |
| LOW | cmd/bisync/testdata/test_backupdir/scenario.txt | 1 | test backupdir | COMMENT |
| LOW | cmd/bisync/testdata/test_nomodtime/scenario.txt | 1 | test changes | COMMENT |
| LOW | cmd/bisync/testdata/test_changes/scenario.txt | 1 | test changes | COMMENT |
| LOW | cmd/bisync/testdata/test_resync/scenario.txt | 1 | test resync | COMMENT |
| LOW | …d/bisync/testdata/test_filtersfile_checks/scenario.txt | 1 | test filtersfile-checks | COMMENT |
| LOW | cmd/bisync/testdata/test_ext_paths/scenario.txt | 1 | test extended-char-paths | COMMENT |
| LOW | …d/bisync/testdata/test_extended_filenames/scenario.txt | 1 | test extended-filenames | COMMENT |
| LOW | cmd/version/version_test.go | 41 | // This causes rclone to exit and the tests to stop! | COMMENT |
| LOW | cmd/mount2/file.go | 21 | // InodeEmbedder level, for example, one can implement NodeReader | COMMENT |
| LOW | cmd/mount2/mount_unsupported.go | 1 | //go:build !linux && (!darwin || !amd64) | COMMENT |
| LOW | cmd/mount2/node.go | 61 | // // lookup a Dir given a path | COMMENT |
| LOW | cmd/mount2/node.go | 161 | fuseFlags |= fuse.FOPEN_DIRECT_IO | COMMENT |
| LOW | cmd/mount2/node.go | 181 | // returned to the kernel, the kernel can issue further operations, | COMMENT |
| LOW | cmd/mount2/node.go | 281 | // | COMMENT |
| LOW | cmd/mount2/mount.go | 41 | /* | COMMENT |
| LOW | cmd/mount2/mount.go | 61 | // | COMMENT |
| LOW | cmd/mount2/mount.go | 81 | // | COMMENT |
| LOW | cmd/mount2/mount.go | 161 | COMMENT | |
| LOW | cmd/mount2/mount.go | 201 | // ClientInodes: false, | COMMENT |
| LOW | cmd/mount/handle.go | 61 | // opened file due to dup(), dup2() or fork() calls. It is not | COMMENT |
| LOW | cmd/mount/mount_unsupported.go | 1 | //go:build !linux | COMMENT |
| LOW | cmd/genautocomplete/genautocomplete_powershell.go | 21 | COMMENT | |
| LOW | cmd/serve/s3/server.go | 161 | return w.etagHashType | COMMENT |
| LOW | cmd/serve/s3/multipart.go | 1 | // Multipart upload support for serve s3. | COMMENT |
| LOW | cmd/serve/s3/multipart.go | 241 | } | COMMENT |
| LOW | cmd/serve/s3/multipart.go | 501 | // turnBuffer means buffer the part until the stream reaches it; its | COMMENT |
| LOW | cmd/serve/s3/multipart.go | 521 | // until it is the next part. Reserved bytes are returned | COMMENT |
| LOW | cmd/serve/s3/multipart.go | 1121 | } | COMMENT |
| LOW | cmd/serve/s3/utils.go | 101 | return "" | COMMENT |
| LOW | cmd/serve/s3/s3tests/run.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | cmd/serve/docker/options.go | 21 | // It is usually named "remote" in documentation but can be aliased as | COMMENT |
| LOW | cmd/serve/docker/docker_test.go | 401 | time.Sleep(tempDelay) | COMMENT |
| LOW | cmd/serve/proxy/proxy.go | 501 | // secret, it cannot authenticate the client itself. | COMMENT |
| LOW | cmd/serve/nfs/handler.go | 61 | // path.Clean is used to normalise it and to neutralise any ".." segments, | COMMENT |
| LOW | cmd/serve/sftp/handler.go | 221 | // FIXME | COMMENT |
| LOW | cmd/serve/webdav/webdav.go | 221 | COMMENT | |
| LOW | vfs/write.go | 121 | fh.mu.Lock() | COMMENT |
| LOW | vfs/write.go | 261 | // being ended normally, so the partially written file is discarded | COMMENT |
| LOW | vfs/write.go | 281 | fh.mu.Lock() | COMMENT |
| LOW | vfs/dir.go | 601 | fs.Debugf(d.path, "Removed virtual directory entry %v: %q", virtualState, name) | COMMENT |
| LOW | vfs/dir.go | 661 | // Create a new manageVirtuals and purge the d.virtuals of any entries which can | COMMENT |
| LOW | vfs/make_open_tests.go | 1 | // This makes the open test suite. It tries to open a file (existing | COMMENT |
| LOW | vfs/dir_handle.go | 41 | } | COMMENT |
| LOW | vfs/dir_handle.go | 81 | // Readdirnames reads and returns a slice of names from the directory f. | COMMENT |
| LOW | vfs/vfs.go | 1 | // Package vfs provides a virtual filing system layer over rclone's | COMMENT |
| 280 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/content/shade.md | 73 | api_key> [YOUR_API_KEY] | CODE |
| HIGH | docs/content/shade.md | 84 | - api_key: [YOUR_API_KEY] | CODE |
| HIGH | docs/content/quatrix.md | 46 | api_key> your_api_key | CODE |
| HIGH | docs/content/quatrix.md | 53 | - api_key: your_api_key | CODE |
| HIGH⚡ | docs/content/quatrix.md | 113 | - api_key: your_api_key | CODE |
| HIGH⚡ | docs/content/quatrix.md | 118 | Enter a string value. Press Enter for the default (your_api_key) | CODE |
| HIGH⚡ | docs/content/quatrix.md | 128 | - api_key: your_api_key | CODE |
| HIGH | docs/content/s3.md | 5150 | access_key_id> YOUR_API_KEY | CODE |
| HIGH | docs/content/s3.md | 5177 | - access_key_id: YOUR_API_KEY | CODE |
| HIGH | docs/content/s3.md | 5193 | access_key_id = YOUR_API_KEY | CODE |
| HIGH | docs/content/storj.md | 209 | api_key> your-api-key-for-your-storj-project | CODE |
| HIGH | docs/content/storj.md | 218 | - api_key: your-api-key-for-your-storj-project | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/internxt/internxt.go | 1109 | // Step 1: If file exists, rename to backup (preserves old file during upload) | COMMENT |
| LOW | backend/internxt/internxt.go | 1205 | // Step 3: Upload succeeded - delete the backup file | COMMENT |
| LOW⚡ | backend/iclouddrive/api/session.go | 223 | // Step 1: Initialize the auth session | COMMENT |
| LOW⚡ | backend/iclouddrive/api/session.go | 228 | // Step 2: Federate (submit account name) | COMMENT |
| LOW⚡ | backend/iclouddrive/api/session.go | 233 | // Step 3: SRP init - send client public value A, get salt + B | COMMENT |
| LOW⚡ | backend/iclouddrive/api/session.go | 255 | // Step 4: Derive password key and process the SRP challenge | COMMENT |
| LOW⚡ | backend/iclouddrive/api/session.go | 264 | // Step 5: Complete - send M1, M2 proofs | COMMENT |
| LOW | backend/hidrive/helpers.go | 578 | // NOTE: This method uses updateFileChunked and may create sparse files, | COMMENT |
| LOW | backend/hidrive/helpers.go | 613 | // NOTE: This method uses patchFile and may create sparse files, | COMMENT |
| LOW⚡ | backend/filelu/filelu.go | 349 | // Step 1: Check if folder is empty | COMMENT |
| LOW⚡ | backend/filelu/filelu.go | 358 | // Step 2: Delete the folder | COMMENT |
| LOW | docs/content/oracleobjectstorage/tutorial_mount.md | 18 | ## Step 1 : Install Rclone | COMMENT |
| LOW | docs/content/oracleobjectstorage/tutorial_mount.md | 55 | ## Step 2: Setup Rclone Configuration file | COMMENT |
| LOW | docs/content/oracleobjectstorage/tutorial_mount.md | 123 | ## Step 3: Setup Dynamic Group and Add IAM Policy | COMMENT |
| LOW | docs/content/oracleobjectstorage/tutorial_mount.md | 159 | ## Step 4: Setup Mount Folders | COMMENT |
| LOW | docs/content/oracleobjectstorage/tutorial_mount.md | 193 | ## Step 5: Identify Rclone mount CLI configuration settings to use | COMMENT |
| LOW | docs/content/oracleobjectstorage/tutorial_mount.md | 287 | ## Step 6: Mounting Options, Use Any one option | COMMENT |
| LOW | docs/content/oracleobjectstorage/tutorial_mount.md | 343 | ## Step 7: Optional: Mount Nanny, for resiliency, recover from process crash | COMMENT |
| LOW | docs/content/oracleobjectstorage/tutorial_mount.md | 391 | ## Step 8: Optional: Setup NFS server to access the mount points of rclone | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | cmd/test/info/internal/build_csv/main.go | 123 | fs.Fatal(nil, fmt.Sprint("Error writing csv:", err)) | CODE |
| MEDIUM⚡ | cmd/test/info/internal/build_csv/main.go | 132 | fs.Fatal(nil, fmt.Sprint("Error writing csv:", err)) | CODE |
| MEDIUM⚡ | cmd/test/info/internal/build_csv/main.go | 134 | fs.Fatal(nil, fmt.Sprint("Error writing csv:", err)) | CODE |
| LOW | cmd/serve/s3/s3tests/rclone_shim.py | 57 | except Exception as e: | CODE |
| LOW | bin/make_backend_docs.py | 73 | except Exception as e: | CODE |
| LOW | bin/make_backend_docs.py | 82 | except Exception as e: | CODE |
| LOW | bin/check_autogenerated_edits.py | 44 | except Exception: | CODE |
| MEDIUM | bin/manage_backends.py | 183 | print(f"Error running rclone: {e.stderr}") | CODE |
| MEDIUM | bin/manage_backends.py | 186 | print("Error: 'rclone' command not found in PATH.") | CODE |
| MEDIUM | bin/manage_backends.py | 243 | print(f"Error: {filepath} not found.") | CODE |
| MEDIUM | bin/manage_backends.py | 250 | print(f"Error: [{filepath}] 'remote' field is missing or empty. Cannot fetch features.") | CODE |
| MEDIUM | bin/manage_backends.py | 292 | print("Error: No files specified.") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/internxt/internxt.go | 1109 | // Step 1: If file exists, rename to backup (preserves old file during upload) | COMMENT |
| LOW | backend/internxt/internxt.go | 1205 | // Step 3: Upload succeeded - delete the backup file | COMMENT |
| LOW | backend/cache/cache.go | 1296 | // we need to check if the directory exists in the temp fs | COMMENT |
| LOW⚡ | backend/iclouddrive/api/session.go | 223 | // Step 1: Initialize the auth session | COMMENT |
| LOW⚡ | backend/iclouddrive/api/session.go | 228 | // Step 2: Federate (submit account name) | COMMENT |
| LOW⚡ | backend/iclouddrive/api/session.go | 233 | // Step 3: SRP init - send client public value A, get salt + B | COMMENT |
| LOW⚡ | backend/iclouddrive/api/session.go | 255 | // Step 4: Derive password key and process the SRP challenge | COMMENT |
| LOW⚡ | backend/iclouddrive/api/session.go | 264 | // Step 5: Complete - send M1, M2 proofs | COMMENT |
| LOW⚡ | backend/filelu/filelu.go | 349 | // Step 1: Check if folder is empty | COMMENT |
| LOW⚡ | backend/filelu/filelu.go | 358 | // Step 2: Delete the folder | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/s3/gen_setfrom.go | 40 | // are frequently present in auto-generated code for cloud storage | COMMENT |
| HIGH | lib/structs/structs.go | 18 | // are frequently present in auto-generated code for cloud storage | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/onedrive/metadata.go | 53 | Example: "John Doe", | CODE |
| LOW | backend/onedrive/metadata.go | 76 | Example: "John Doe", | CODE |
| LOW | backend/onedrive/metadata.md | 71 | "displayName": "John Doe", | CODE |
| LOW | backend/onedrive/metadata_test.go | 104 | "id": "user@example.com" | CODE |
| LOW | backend/dropbox/dropbox_internal_test.go | 358 | Lorem ipsum __dolor__ sit amet | CODE |
| LOW | backend/dropbox/dropbox_internal_test.go | 393 | "Lorem ipsum", | CODE |
| LOW | backend/drive/metadata.go | 56 | Example: "user@example.com", | CODE |
| LOW | backend/drive/drive_internal_test.go | 443 | "Lorem ipsum dolor sit amet, consectetur", | CODE |
| LOW | backend/drive/drive_internal_test.go | 443 | "Lorem ipsum dolor sit amet, consectetur", | CODE |
| LOW | docs/content/onedrive.md | 993 | "displayName": "John Doe", | CODE |
| LOW | fs/fspath/path_test.go | 44 | {"user@example.com", nil, "user@example.com"}, | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | cmd/serve/s3/s3tests/rclone_shim.py | 36 | except ClientError: | CODE |
| HIGH | bin/config.py | 88 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | cmd/bisync/checkfn.go | 27 | // It is more robust and accurate than Check because | COMMENT |
| MEDIUM | lib/oauthutil/oauthutil.go | 141 | // SharedOptions are shared between backends the utilize an OAuth flow | COMMENT |
| MEDIUM | fs/fshttp/http.go | 67 | // This function is designed as a robust replacement for tls.X509KeyPair, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cmd/serve/s3/s3tests/report.py | 74 | CODE | |
| LOW | bin/make_backend_docs.py | 33 | CODE | |
| LOW | bin/config.py | 60 | CODE | |
| LOW | bin/check_autogenerated_edits.py | 73 | CODE | |
| LOW | bin/decrypt_names.py | 21 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/content/install.sh | 12 | #when adding a tool to the list make sure to also add its corresponding command further in the script | COMMENT |
| LOW | contrib/docker/docker-compose.webdav-server.yml | 26 | # make sure to make rclone listen on 0.0.0.0. | COMMENT |
| LOW | lib/pacer/tokens.go | 22 | // Get gets a token from the pool - don't forget to return it with Put | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bin/make_backend_docs.py | 8 | CODE | |
| LOW | librclone/python/test_rclone.py | 7 | CODE | |
| LOW | librclone/python/test_rclone.py | 9 | CODE | |
| LOW | librclone/python/rclone.py | 22 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/iclouddrive/api/drive.go | 531 | // TODO: implement multipart upload | COMMENT |
| LOW | backend/mailru/mailru.go | 979 | // TODO: implement recursion and ListR | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bin/manage_backends.py | 164 | def get_backend_name_from_file(filepath): | CODE |