{"id":13439871,"url":"https://github.com/replicatedhq/local-volume-provider","last_synced_at":"2025-10-13T17:08:17.918Z","repository":{"id":37889538,"uuid":"387616142","full_name":"replicatedhq/local-volume-provider","owner":"replicatedhq","description":"A Velero plugin for backup/restore directly to Kubernetes volumes.","archived":false,"fork":false,"pushed_at":"2025-09-19T19:04:41.000Z","size":235,"stargazers_count":42,"open_issues_count":12,"forks_count":9,"subscribers_count":17,"default_branch":"main","last_synced_at":"2025-09-19T21:45:03.759Z","etag":null,"topics":["kubernetes","velero","velero-plugin"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/replicatedhq.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-07-19T23:13:28.000Z","updated_at":"2025-09-19T19:04:43.000Z","dependencies_parsed_at":"2023-01-31T07:00:57.765Z","dependency_job_id":"bf297295-b3e9-4128-b879-f57af30c82e6","html_url":"https://github.com/replicatedhq/local-volume-provider","commit_stats":null,"previous_names":[],"tags_count":36,"template":false,"template_full_name":null,"purl":"pkg:github/replicatedhq/local-volume-provider","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/replicatedhq%2Flocal-volume-provider","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/replicatedhq%2Flocal-volume-provider/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/replicatedhq%2Flocal-volume-provider/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/replicatedhq%2Flocal-volume-provider/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/replicatedhq","download_url":"https://codeload.github.com/replicatedhq/local-volume-provider/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/replicatedhq%2Flocal-volume-provider/sbom","scorecard":{"id":374003,"data":{"date":"2025-08-11","repo":{"name":"github.com/replicatedhq/local-volume-provider","commit":"44a92a203d8972b9cf0169571c7a360e439e3cbc"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.4,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/automated-prs-manager.yaml:1","Warn: no topLevel permission defined: .github/workflows/build-and-test.yaml:1","Warn: no topLevel permission defined: .github/workflows/daily-scan.yaml:1","Warn: no topLevel permission defined: .github/workflows/deploy.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automated-prs-manager.yaml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/automated-prs-manager.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automated-prs-manager.yaml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/automated-prs-manager.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yaml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/build-and-test.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yaml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/build-and-test.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yaml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/build-and-test.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/daily-scan.yaml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/daily-scan.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/daily-scan.yaml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/daily-scan.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/daily-scan.yaml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/daily-scan.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/daily-scan.yaml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/daily-scan.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/daily-scan.yaml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/daily-scan.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/daily-scan.yaml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/daily-scan.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/daily-scan.yaml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/daily-scan.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/deploy.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yaml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/replicatedhq/local-volume-provider/deploy.yaml/main?enable=pin","Warn: containerImage not pinned by hash: deploy/Dockerfile:1","Warn: containerImage not pinned by hash: deploy/Dockerfile:15","Warn: containerImage not pinned by hash: deploy/Dockerfile:27: pin your Docker image by updating debian:bullseye-slim to debian:bullseye-slim@sha256:849d9d34d5fe0bf88b5fb3d09eb9684909ac4210488b52f4f7bbe683eedcb851","Info:   0 out of  11 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned","Info:   0 out of   3 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2025-3845 / GHSA-qx2q-88mx-vhg7","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw","Warn: Project is vulnerable to: GO-2025-3488 / GHSA-6v2p-p543-phr9"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: non-200 OK status code: 504 Gateway Timeout body: \"{\\\"message\\\": \\\"We couldn't respond to your request in time. Sorry about that. Please try resubmitting your request and contact us if the problem persists.\\\"}\\r\\n\"","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-18T13:44:15.039Z","repository_id":37889538,"created_at":"2025-08-18T13:44:15.039Z","updated_at":"2025-08-18T13:44:15.039Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279016277,"owners_count":26085827,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-13T02:00:06.723Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kubernetes","velero","velero-plugin"],"created_at":"2024-07-31T03:01:17.791Z","updated_at":"2025-10-13T17:08:17.893Z","avatar_url":"https://github.com/replicatedhq.png","language":"Go","funding_links":[],"categories":["HarmonyOS"],"sub_categories":["Windows Manager"],"readme":"# local-volume-provider\n\n`local-volume-provider` is a Velero plugin to enable storage directly to native Kubernetes' volume types instead of using Object or Blob storage APIs. \nIt also supports volume snapshots with Restic. It is designed to service small and air-gapped clusters that may not have access directly to Object Storage APIs like S3.\n\nThe plugin leverages the existing Velero service account credentials to mount volumes directly to the velero/node-agent pods. \nThis plugin is also heavily based off of [Velero's example plugin](https://github.com/vmware-tanzu/velero-plugin-example).\n\n⚠️ **Cautions**\n1. Hostpath volumes are not designed to work on multi-node clusters unless the underlying host mounts point to shared storage. \nVolume snapshots performed in this configuration without shared storage can result in fragmented backups.\n1. Customized deployments of Velero (RBAC, container names), may not be supported.\n1. When BackupStorageLocations are removed, they are NOT cleaned up from the Velero and Node Agent pods.\n1. This plugin relies on a sidecar container at runtime to provide signed-url access to storage data.\n\n## Compatibility\n\nBelow is a listing of plugin versions and respective Velero versions that are compatible.\n\n| Plugin Version | Velero Version          |\n|----------------|-------------------------|\n| v0.5.x         | v1.10.x                 |\n| v0.4.x         | v1.6.x - v1.9.x         |\n\n## Deploying the plugin\n\nTo deploy the plugin image to a Velero server:\n\n1. Make sure Velero is installed, optionally with Node Agent/Restic if Volume Snapshots are needed.\n1. (For NFS or HostPath volumes) Prepare the volume target.\n    1. The source directory **must already exist** prior to creating the BackupStorageLocation\n    1. The directory must have write permissions that are either writable by the Velero container by default, which runs as non-root, or to the same Uid/Gid as the plugin configuration. \n    See the Customization section below for how to configuration these settings.\n1. Make sure the plugin images are pushed to a registry that is accessible to your cluster's nodes.\nThere are two images required for the plugin:\n    1. replicated/local-volume-provider:v0.3.3\n2. Run `velero plugin add replicated/local-volume-provider:v0.3.3`.\nThis will re-deploy Velero with the plugin installed.\n3. Create a BackupStorageLocation according to the schemas below.\nThe plugin will attach the volume to Velero (and Node Agent/Restic if available)\nIt will also add a fileserver sidecar to the Velero pod if not already present. \nThis is used to server assets like backup logs directly to consumers of the Velero api (e.g. the Velero CLI uses these logs to print backup status info)\n\n### Customization\n\nYou can configure certain aspects of plugin behavior by customizing the following ConfigMap spec and adding to the Velero namespace. \nIt is based on the [Velero Plugin Configuration scheme](https://velero.io/docs/v1.6/custom-plugins/).\n\n```yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: local-volume-provider-config\n  namespace: velero\n  labels:\n    velero.io/plugin-config: \"\"\n    replicated.com/nfs: ObjectStore\n    replicated.com/hostpath: ObjectStore\ndata:\n  # Useful for local development\n  fileserverImage: ttl.sh/\u003cyour user\u003e/local-volume-provider:12h\n  # Helps to lock down file permissions to known users/groups on the target volume\n  securityContextRunAsUser: \"1001\"\n  securityContextRunAsGroup: \"1001\"\n  securityContextFsGroup: \"1001\"\n  # If provided, will clean up all other volumes on the Velero and Node Agent pods\n  preserveVolumes: \"my-bucket,my-other-bucket\"\n```\n\n## Removing the plugin\n\nThe plugin can be removed with `velero plugin remove replicated/local-volume-provider:v0.3.3`.\nThis does not detach/delete any volumes that were used during operation.\nThese can be removed manually using `kubectl edit` or by re-deploying velero (`velero uninstall` and `velero install ...`)\n\n## Usage Examples\n\n### HostPath\n\n```yaml\napiVersion: velero.io/v1\nkind: BackupStorageLocation\nmetadata:\n  name: default\n  namespace: velero\nspec:\n  backupSyncPeriod: 2m0s\n  provider: replicated.com/hostpath\n  objectStorage:\n    # This corresponds to a unique volume name\n    bucket: hostPath-snapshots\n  config:\n    # This path must exist on the host and be writable outside the group\n    path: /tmp/snapshots\n    # Must be provided if you're using Restic; [default mount] + [bucket] + [prefix] + \"restic\"\n    resticRepoPrefix: /var/velero-local-volume-provider/hostpath-snapshots/restic\n```\n\n### NFS\n\n```yaml\napiVersion: velero.io/v1\nkind: BackupStorageLocation\nmetadata:\n  name: default\n  namespace: velero\nspec:\n  backupSyncPeriod: 2m0s\n  provider: replicated.com/nfs\n  objectStorage:\n    # This corresponds to a unique volume name\n    bucket: nfs-snapshots\n  config:\n    # Path and server on share\n    path: /tmp/nfs-snapshots\n    server: 1.2.3.4\n    # Must be provided if you're using Restic; [default mount] + [bucket] + [prefix] + \"restic\"\n    resticRepoPrefix: /var/velero-local-volume-provider/nfs-snapshots/restic\n```\n\n\n## Building \u0026 Testing the Plugin\n\n**NOTE**\n\u003e You can't test the PVC object storage plugin on clusters without ReadWriteMany (RWX) storage providers. This means NO K3S, Codeserver or Codespaces.\n\nTo build the plugin and fileserver, run\n\n```bash\n$ make plugin\n$ make fileserver\n```\n\nTo build the combined image, run\n\n```bash\n$ make container\n```\n\nThis builds an image tagged as `replicated/local-volume-provider:main`. If you want to specify a different name or version/tag, run:\n\n```bash\n$ IMAGE=your-repo/your-name VERSION=your-version-tag make container \n```\n\nTo build a temporary image for testing, run\n\n```bash\n$ make ttl.sh\n```\n\nThis builds an image tagged as `ttl.sh/\u003cunix user\u003e/local-volume-provider:12h`.\n\nMake sure the plugin will be configured to use the correct security context and development images by applying the optional [ConfigMap](https://raw.githubusercontent.com/replicatedhq/local-volume-provider/main/examples/pluginConfigMap.yaml) (edit this configmap first with your username):\n\n### Velero Install Option 1\n\n1. Install Velero without the plugin (useful for testing the `velero` install/remove plugin commands):\n\n**Velero 1.10+**\n\n```bash\nvelero install --use-node-agent --uploader-type=restic --use-volume-snapshots=false --namespace velero --no-default-backup-location --no-secret\n```\n\n**Velero 1.6-1.9**\n\n```bash\nvelero install --use-restic --use-volume-snapshots=false --namespace velero --no-default-backup-location --no-secret\n```\n\n2. Add the plugin\n\n```bash\nvelero plugin add ttl.sh/\u003cuser\u003e/local-volume-provider:12h\n```\n\n3. Create the default BackupStorageLocation (assuming Hostpath here)\n```\nkubectl apply -f examples/hostPath.yaml \n```\n**OR**, with Velero v1.7.1+\n```bash\nvelero backup-location create default --default --bucket my-hostpath-snaps --provider replicated.com/hostpath --config path=/tmp/my-host-path-to-snaps,resticRepoPrefix=/var/velero-local-volume-provider/my-hostpath-snaps/restic\n```\n\n### Velero Install Option 2\n\nInstall Velero with the plugin configured to host path by default:\n\n**Velero 1.10+**\n\n```bash\nvelero install --use-node-agent --uploader-type=restic --use-volume-snapshots=false --namespace velero --provider replicated.com/hostpath --plugins ttl.sh/\u003cusername\u003e/local-volume-provider:12h --bucket my-hostpath-snaps --backup-location-config path=/tmp/my-host-path-to-snaps,resticRepoPrefix=/var/velero-local-volume-provider/my-hostpath-snaps/restic --no-secret \n```\n\n**Velero 1.6-1.9**\n\n```bash\nvelero install --use-restic --use-volume-snapshots=false --namespace velero --provider replicated.com/hostpath --plugins ttl.sh/\u003cusername\u003e/local-volume-provider:12h --bucket my-hostpath-snaps --backup-location-config path=/tmp/my-host-path-to-snaps,resticRepoPrefix=/var/velero-local-volume-provider/my-hostpath-snaps/restic --no-secret \n```\n\n### Velero Install Option 3\n\n**NOTE**: Works with Velero v1.7.1+ only\n\nTo update a BackupStorageLocation (BSL) in an existing cluster with Velero, you must first delete the BSL and re-create as follows (assuming you are using the BSL created by default):\n```bash\nvelero plugin add ttl.sh/\u003cuser\u003e/local-volume-provider:12h\nvelero backup-location delete default --confirm\nvelero backup-location create default --default --bucket my-hostpath-snaps --provider replicated.com/hostpath --config path=/tmp/my-host-path-to-snaps,resticRepoPrefix=/var/velero-local-volume-provider/my-hostpath-snaps/restic\n```\n\n# Troubleshooting\n\n1. The Velero pod is stuck initializing: \n    1. Verify the volume exists on the host. Create if it doesn't and delete the Velero pod.\n1. [HostPath Only] The Velero pod is running, but the backupstorage location is unavailable.\n    1. Verify the path on the host is writable by the Velero pod. The Velero pod runs as user `nobody`.\n1. Backups are partially failing and you're using Restic.\n    1. Make sure you have defined `resticRepoPrefix` in you BackupStorageLocation Config. It should point to the `restic` directory mountpoint in the Velero container\n    1. **Velero 1.10+**: Delete your Backup Repo CR `kubectl -n velero delete backuprepositories.velero.io default-default-\u003cID\u003e` to have this regenerated.\n    1. **Velero 1.6-1.9**: Delete your Restic Repo CR `kubectl -n velero delete resticrepositories.velero.io default-default-\u003cID\u003e` to have this regenerated.\n\n# Future\n- [ ] TESTING!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freplicatedhq%2Flocal-volume-provider","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Freplicatedhq%2Flocal-volume-provider","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freplicatedhq%2Flocal-volume-provider/lists"}