{"id":28960437,"url":"https://github.com/fmstrat/sxncd","last_synced_at":"2025-06-24T01:13:28.199Z","repository":{"id":279699502,"uuid":"939040454","full_name":"Fmstrat/SxncD","owner":"Fmstrat","description":"An Open Source Synchronization Server for use with any apps that that support a standard file import/export.","archived":false,"fork":false,"pushed_at":"2025-02-26T22:50:52.000Z","size":240,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-26T23:28:43.419Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Fmstrat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","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}},"created_at":"2025-02-25T22:32:27.000Z","updated_at":"2025-02-26T22:50:55.000Z","dependencies_parsed_at":"2025-02-26T23:48:00.655Z","dependency_job_id":null,"html_url":"https://github.com/Fmstrat/SxncD","commit_stats":null,"previous_names":["fmstrat/sxncd"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Fmstrat/SxncD","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fmstrat%2FSxncD","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fmstrat%2FSxncD/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fmstrat%2FSxncD/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fmstrat%2FSxncD/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Fmstrat","download_url":"https://codeload.github.com/Fmstrat/SxncD/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fmstrat%2FSxncD/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261584268,"owners_count":23180680,"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","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":"2025-06-24T01:13:27.532Z","updated_at":"2025-06-24T01:13:28.186Z","avatar_url":"https://github.com/Fmstrat.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./assets/logo.svg\" width=\"600\"\u003e\n\u003c/p\u003e\n\u003cbr\u003e\n\n# SxncD\n\nAn Open Source Synchronization Server for use with any apps that that support a standard file import/export.\n\n\u003ctable cellpadding=\"10\" cellspacing=\"0\" border=\"0\" width=\"100%\"\u003e\n    \u003ctr\u003e\n        \u003ctd align=\"right\"\u003e\n            \u003cimg src=\"./assets/login.png\" width=\"300\"\u003e\n        \u003c/td\u003e\n        \u003ctd align=\"left\"\u003e\n            \u003cimg src=\"./assets/dashboard.png\" width=\"300\"\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n## Supported apps\n\n\u003ctable cellpadding=\"10\" cellspacing=\"0\" border=\"0\"\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"./assets/apps/obtainium.svg\" width=\"100\"\u003e\u003c/td\u003e\u003ctd\u003eObtainium\u003cbr\u003e(In development)\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"./assets/apps/thunder.svg\" width=\"100\"\u003e\u003c/td\u003e\u003ctd\u003eThunder for Lemmy\u003cbr\u003e(In development)\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003cbr\u003e\u003cbr\u003e\n\n\n\n## Supported authentication providers\n\n\u003ctable cellpadding=\"10\" cellspacing=\"0\" border=\"0\"\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"./assets/auth/openid.svg\" width=\"100\"\u003e\u003c/td\u003e\u003ctd\u003eOpenID Connect\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"./assets/auth/github.svg\" width=\"100\"\u003e\u003c/td\u003e\u003ctd\u003eGitHub\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"./assets/auth/google.svg\" width=\"100\"\u003e\u003c/td\u003e\u003ctd\u003eGoogle\u003c/td\u003e\n    \u003ctd colspan=2\u003e\u0026nbsp;\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003cbr\u003e\u003cbr\u003e\n\n## Running SxncD\n\nSxncD was built to run in Docker using the `nowsci/sxncd` docker image. A sample [Docker Compose](./docker-compose.yml) file is provided.\n\n## Integrating SxncD with your app\nSxncD is built in a modular way to support easy integration into existing mobile and desktop applications.\n\n### Adding apps to the SxncD server\nAdding your app to SxncD is easy, simply copy an existing configuration from the [app modules](./src/modules/app) folder and edit for your application before submitting a PR.\n\n### Syncing app data with SxncD\nIf your application is developed in Flutter, we offer a library to make things easy:\n- [Flutter library](https://github.com/Fmstrat/SxncD-flutter)\n\nIf your application is built in another language, or for desktop, the API endpoint can be used in any standard HTTP client. The data object for a `POST` exists as:\n```\n{\n  \"deviceName\": \"My Device\",              // String | The name of the device\n  \"savedTs\": \"1900-01-01T00:00:00.000Z\",  // String | The timestamp of when the settings were last saved on the device\n  \"settings\": \"...\"                       // String | The actual settings\n}\n```\n\nFor example:\n\n```bash\ncurl -X POST http://\u003curl\u003e/api/v1/sync/update \\\n    -H \"Authorization: \u003capi key\u003e\" \\\n    -H \"Content-Type: application/json\" \\\n    -d '{\n        \"deviceName\": \"My Device\",\n        \"savedTs\": \"1900-01-01T00:00:00.000Z\",\n        \"settings\": { \"settings\": true }\n    }'\n```\n\nKeep in mind the `settings` field can be any format of string or JSON, meaning you can E2E encrypt settings and store them as Base64 as long as you also decrypt when receiving updates:\n\n```bash\ncurl -X POST http://\u003curl\u003e/api/v1/sync/update \\\n    -H \"Authorization: \u003capi key\u003e\" \\\n    -H \"Content-Type: application/json\" \\\n    -d '{\n        \"deviceName\": \"My Device\",\n        \"savedTs\": \"1900-01-01T00:00:00.000Z\",\n        \"settings\": \"eyAic2V0dGluZ...\"\n    }'\n```\n\n#### API responses\nThe JSON return object from the API is structured as follows:\n```\n{\n  \"success\": true,      // boolean       | true/false\n  \"data\": \"...\",        // String|Object | The settings data being returned\n  \"action\": \"created\",  // String        | created       | A new settings entry was created.\n                        //               | none          | The server-side data and device data are already up to date.\n                        //               | existingNewer | The server-side data is newer than what was sent by the device.\n                        //               | incomingNewer | The devices data is newer than the server-side data, so the\n                        //                                 server has stored this new data.\n  \"error\": \"...\"        // String        | If success is false, the reason why\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffmstrat%2Fsxncd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffmstrat%2Fsxncd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffmstrat%2Fsxncd/lists"}