{"id":42535723,"url":"https://github.com/contentstack/datasync-manager","last_synced_at":"2026-01-28T17:00:49.551Z","repository":{"id":34361967,"uuid":"163827365","full_name":"contentstack/datasync-manager","owner":"contentstack","description":"The primary module of Contentstack DataSync that syncs Contentstack data with your server.","archived":false,"fork":false,"pushed_at":"2026-01-02T06:23:17.000Z","size":23093,"stargazers_count":5,"open_issues_count":4,"forks_count":6,"subscribers_count":17,"default_branch":"master","last_synced_at":"2026-01-02T15:52:46.362Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/contentstack.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":"CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-01-02T10:32:56.000Z","updated_at":"2025-12-08T11:37:58.000Z","dependencies_parsed_at":"2023-02-13T20:31:12.435Z","dependency_job_id":"d7603aa8-e3f8-4367-a0da-f11196489406","html_url":"https://github.com/contentstack/datasync-manager","commit_stats":{"total_commits":197,"total_committers":20,"mean_commits":9.85,"dds":0.5736040609137056,"last_synced_commit":"52582258c3b2dfe76f2ef5a6aba7dff771853ded"},"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/contentstack/datasync-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/contentstack%2Fdatasync-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/contentstack%2Fdatasync-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/contentstack%2Fdatasync-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/contentstack%2Fdatasync-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/contentstack","download_url":"https://codeload.github.com/contentstack/datasync-manager/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/contentstack%2Fdatasync-manager/sbom","scorecard":{"id":303472,"data":{"date":"2025-08-11","repo":{"name":"github.com/contentstack/datasync-manager","commit":"2b76a91a9ca116538a4415bbb1641e42180b3f1f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":7.2,"checks":[{"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":"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":"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":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"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":"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":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","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":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:24","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:25","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/issues-jira.yml:1","Warn: no topLevel permission defined: .github/workflows/policy-scan.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/sca-scan.yml:1","Warn: no topLevel permission defined: .github/workflows/secrets-scan.yml: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":"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/codeql-analysis.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/codeql-analysis.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/issues-jira.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/issues-jira.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/issues-jira.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/issues-jira.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/policy-scan.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/policy-scan.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/policy-scan.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/policy-scan.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sca-scan.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/sca-scan.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/sca-scan.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/sca-scan.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/secrets-scan.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/contentstack/datasync-manager/secrets-scan.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/release.yml:57","Warn: downloadThenRun not pinned by hash: .github/workflows/secrets-scan.yml:29","Info:   0 out of  10 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   6 third-party GitHubAction dependencies pinned","Info:   0 out of   1 npmCommand dependencies pinned","Info:   0 out of   1 downloadThenRun 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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: 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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","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"}},{"name":"SAST","score":10,"reason":"SAST tool detected","details":["Info: SAST configuration detected: CodeQL","Info: SAST configuration detected: Snyk","Info: all commits (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":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T21:21:59.424Z","repository_id":34361967,"created_at":"2025-08-17T21:21:59.425Z","updated_at":"2025-08-17T21:21:59.425Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28847053,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T15:15:36.453Z","status":"ssl_error","status_checked_at":"2026-01-28T15:15:13.020Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2026-01-28T17:00:26.892Z","updated_at":"2026-01-28T17:00:49.538Z","avatar_url":"https://github.com/contentstack.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Contentstack](https://www.contentstack.com/docs/static/images/contentstack.png)](https://www.contentstack.com/)\n\nContentstack is a headless CMS with an API-first approach. It is a CMS that developers can use to build powerful cross-platform applications in their favorite languages. Build your application frontend, and Contentstack will take care of the rest. [Read More](https://www.contentstack.com/).\n\n## Contentstack DataSync Manager\n\nContentstack DataSync lets you sync your Contentstack data with your database, enabling you to save data locally and serve content directly from your database. It is a combination of four powerful modules that is [DataSync Webhook Listener](https://github.com/contentstack/webhook-listener), [DataSync Manager](https://github.com/contentstack/datasync-manager), [DataSync Asset Store Filesystem](https://github.com/contentstack/datasync-asset-store-filesystem), DataSync Content Store — [Filesystem](https://github.com/contentstack/datasync-content-store-filesystem) and [MongoDB](https://github.com/contentstack/datasync-content-store-filesystem).\n\nThe DataSync Manager is one of the four important components of Contentstack DataSync. When any publish, unpublish, or delete operations are performed on assets or content, the DataSync Manager fetches the data and sends it to Content Store. It uses Contentstack's Sync APIs to sync data from Contentstack with your preferred database — Filesystem and MongoDB in our case.\n\n### Prerequisite\n- nodejs v20+\n\n### Usage\n\nThis is how DataSync Manager works with DataSync boilerplate:\n\n```js\nconst assetStore = require('@contentstack/datasync-asset-store-filesystem')\nconst contentStore = require('@contentstack/datasync-content-store-filesystem')\nconst listener = require('@contentstack/webhook-listener')\nconst syncManager = require('@contentstack/datasync-manager') // \u003c--\nconst config = require('./config')\n\n// Set asset, content store, listener and config to Datasync Manager\nsyncManager.setAssetStore(assetStore)\nsyncManager.setContentStore(contentStore)\nsyncManager.setListener(listener)\nsyncManager.setConfig(config)\n\n// start DataSync manager\nsyncManager.start()\n  .then(() =\u003e {\n    console.log('Contentstack sync started successfully!')\n  })\n  .catch(console.error)\n```\nYou can replace [@contentstack/datasync-content-store-filesystem](https://www.npmjs.com/package/@contentstack/datasync-content-store-filesystem) used above, with [@contentstack/datasync-content-store-mongodb](https://www.npmjs.com/package/@contentstack/datasync-content-store-mongodb) and switch content store databases.\n\n### Configuration\n\n- Here's a list of contentstack's configuration keys\n\n| Key Name | Default | Description |\n| :--- |:---:| :---|\n| apiKey | | **Required**. Your stack's API key |\n| deliveryToken | | **Required**. Your environment's delivery token |\n| sync_token | | Token from where you'd like to start the process |\n| pagination_token | | Token from where you'd like to start the process |\n| MAX_RETRY_LIMIT | 6 | Number of times the API call would retry, if the server fails |\n\n- Here's a list of configuration keys for contentstack datasync-manager:\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eProperty\u003c/th\u003e\n      \u003cth\u003eDefault\u003c/th\u003e\n      \u003cth\u003eDescription\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ecooloff\u003c/td\u003e\n      \u003ctd\u003e3000\u003c/td\u003e\n      \u003ctd\u003eNumber of \u003ccode\u003ems\u003c/code\u003e the app would wait before making a subsequent \u003ccode\u003eSync API\u003c/code\u003e request\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eenableAssetReferences\u003c/td\u003e\n      \u003ctd\u003etrue\u003c/td\u003e\n      \u003ctd\u003eThis is not implemented, you can help: \u003ca href=\"https://github.com/contentstack/datasync-manager/issues/33\" target=\"_blank\"\u003e#33\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eenableContentReferences\u003c/td\u003e\n      \u003ctd\u003etrue\u003c/td\u003e\n      \u003ctd\u003eThis is not implemented, you can help: \u003ca href=\"https://github.com/contentstack/datasync-manager/issues/34\" target=\"_blank\"\u003e#34\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003elimit\u003c/td\u003e\n      \u003ctd\u003e100\u003c/td\u003e\n      \u003ctd\u003eNumber of items fetched in each \u003ccode\u003eSync API\u003c/code\u003e request made.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003emaxsize\u003c/td\u003e\n      \u003ctd\u003e2097152\u003c/td\u003e\n      \u003ctd\u003eMaximum file size of files (ex: .ledger file)\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003equeue.pause_threshold\u003c/td\u003e\n      \u003ctd\u003e\n        10000\n      \u003c/td\u003e\n      \u003ctd\u003eThe min-max internal queue size of contentstack-sync-manager. The DataSync manager would pause making \u003ccode\u003eSync API\u003c/code\u003e requests once the internal queue size exceeds \u003ccode\u003epause_threshold\u003c/code\u003e count.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003equeue.resume_threshold\u003c/td\u003e\n      \u003ctd\u003e\n        5000\n      \u003c/td\u003e\n      \u003ctd\u003eThe min-max internal queue size of contentstack-sync-manager. The DataSync manager will resume \u003ccode\u003eSync API\u003c/code\u003e requests once the queue size goes below \u003ccode\u003eresume_threshold\u003c/code\u003e count.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003esaveFilteredItems\u003c/td\u003e\n      \u003ctd\u003e\n        true\n      \u003c/td\u003e\n      \u003ctd\u003e\n        When enabled, the app will log items that have been filtered out. Items can be filtered out due to the following:\n        \u003cul\u003e\n          \u003cli\u003eMissing required keys\u003c/li\u003e\n          \u003cli\u003eLanguage filters applied via config\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003efilters\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cul\u003e\n          \u003cli\u003econtent_type_uid\u003c/li\u003e\n          \u003cli\u003elocale\u003c/li\u003e\n          \u003cli\u003eaction\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        Filters allow you to narrow down the items that'd be returned by the SYNC API response.\n        Ex:\n        \u003ccode\u003e{filters: {content_type_uid: ['blogs']}, locale: ['en-us'], action: ['publish']}\u003c/code\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\nAnd here's an example to get you started:\n```js\n{\n  // exmaple to override default values\n  contentstack: {\n      apiKey: '',\n      deliveryToken: '',\n      sync_token: '',\n      MAX_RETRY_LIMIT: 5\n    }\n  },\n  syncManager: {\n      cooloff: 2000,\n      limit: 80,\n      filters: {\n        content_type_uid: ['blogs'],\n        locale: ['es-es', 'en-us'],\n        action: ['publish', 'unpublish']\n      }\n    }\n  }\n}\n```\n\n### Environment Variables\n\nThe following environment variables can be used to customize the behavior of Contentstack DataSync Manager:\n\n| Variable      | Description                                                                 | Default                |\n|--------------|-----------------------------------------------------------------------------|------------------------|\n| `TOKEN_PATH` | Path to the directory where token/checkpoint/ledger files are stored.        | Project root directory |\n| `PLUGIN_PATH`| Path to the directory where plugins are loaded from.                         | Project root directory |\n| `NODE_ENV`   | Node.js environment (affects config/environment selection).                  | `development`          |\n| `SYNC_ENV`   | Overrides the environment used for sync operations.                         | Value of `NODE_ENV`    |\n| `KILLDURATION`| Time (in ms) before the process is forcefully killed (overrides config).    | Value from config      |\n\n**Note:**\n- `TOKEN_PATH` is especially useful for storing token data in a custom directory (e.g., for selective re-syncing based on timestamps).\n- If a relative path is provided, it is resolved from the project root.\n- These variables can be set in your shell or in your process manager configuration.\n\n### Further Reading\n\n- [Getting started with Contentstack DataSync](https://www.contentstack.com/docs/guide/synchronization/contentstack-datasync)\n- [Contentstack DataSync](https://www.contentstack.com/docs/guide/synchronization/contentstack-datasync/configuration-files-for-contentstack-datasync) doc lists the configuration for different modules\n\n\n### Support and Feature requests\n\nIf you have any issues working with the library, please file an issue here at Github.\nYou can send us an e-mail at support@contentstack.com if you have any support or feature requests. Our support team is available 24/7 on the intercom. You can always get in touch and give us an opportunity to serve you better!\n\n\n### Licence\n\nThis repository is published under the [MIT](LICENSE) license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcontentstack%2Fdatasync-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcontentstack%2Fdatasync-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcontentstack%2Fdatasync-manager/lists"}