{"id":22419673,"url":"https://github.com/sentclose/sentc-docs","last_synced_at":"2026-03-01T02:33:53.167Z","repository":{"id":166600574,"uuid":"642105716","full_name":"sentclose/sentc-docs","owner":"sentclose","description":null,"archived":false,"fork":false,"pushed_at":"2025-05-15T15:25:28.000Z","size":556,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-15T16:38:54.003Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sentclose.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2023-05-17T20:47:24.000Z","updated_at":"2025-05-15T15:25:36.000Z","dependencies_parsed_at":null,"dependency_job_id":"b7d52fc0-a8e0-4258-be1f-0ac8fd6628c2","html_url":"https://github.com/sentclose/sentc-docs","commit_stats":null,"previous_names":["sentclose/sentc-docs"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sentclose/sentc-docs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sentclose%2Fsentc-docs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sentclose%2Fsentc-docs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sentclose%2Fsentc-docs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sentclose%2Fsentc-docs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sentclose","download_url":"https://codeload.github.com/sentclose/sentc-docs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sentclose%2Fsentc-docs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29959149,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T01:47:18.291Z","status":"online","status_checked_at":"2026-03-01T02:00:07.437Z","response_time":124,"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":[],"created_at":"2024-12-05T16:16:28.420Z","updated_at":"2026-03-01T02:33:53.130Z","avatar_url":"https://github.com/sentclose.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sentc documentation\n\n\u003cbr\u003e\n\nFor Javascript\n\nEasy to install:\n\n\u003ccode-group\u003e\n\u003ccode-group-item title=\"NPM\" active\u003e\n\n```bash\nnpm install @sentclose/sentc\n```\n\u003c/code-group-item\u003e\n\n\u003ccode-group-item title=\"YARN\"\u003e\n\n```bash\nyarn add @sentclose/sentc\n```\n\u003c/code-group-item\u003e\n\n\u003c/code-group\u003e\n\nEasy to use, installed or in the browser:\n\n\u003ccode-group\u003e\n\u003ccode-group-item title=\"JS\" active\u003e\n\n```js\nimport Sentc from \"@sentclose/sentc\";\n\n//init the javascript client\nawait Sentc.init({\n    app_token: \"5zMb6zs3dEM62n+FxjBilFPp+j9e7YUFA+7pi6Hi\"  // \u003c-- your app token\n});\n\n//register a user\nawait Sentc.register(\"username\", \"password\");\n\n//login a user\nconst user = await Sentc.login(\"username\", \"password\");\n\n//create a group\nconst group_id = await user.createGroup();\n\n//load a group. returned a group obj for every user.\nconst group = await user.getGroup(group_id);\n\n//encrypt a string for the group\nconst encrypted_string = await group.encryptString(\"hello there!\");\n\n//now every user in the group can decrypt the string\nconst decrypted_string = await group.decryptString(encrypted_string);\n\t\t\t\nconsole.log(decrypted_string);  //hello there!\n```\n\u003c/code-group-item\u003e\n\n\u003ccode-group-item title=\"Browser\"\u003e\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n    \u003ctitle\u003eSentc example\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003cscript src=\"https://cdn.jsdelivr.net/npm/@sentclose/sentc/dist/sentc.min.js\"\u003e\u003c/script\u003e\n\n    \u003cscript\u003e\n        //init the wasm\n        const sentc = window.Sentc.default;\n\n        async function run() {\n            //use your public token as the app token.\n            // if a user is already logged in, this function will return the logged-in user\n            await sentc.init({\n                app_token: \"5zMb6zs3dEM62n+FxjBilFPp+j9e7YUFA+7pi6Hi\"\n            });\n\t\t\t\n            //now you are ready to go\n            //register a user:\n            await sentc.register(\"username\", \"password\");\n\t\t\t\n            //log in a user\n            const user = await sentc.login(\"username\", \"password\");\n\t\t\t\n            //create a group\n            const group_id = await user.createGroup();\n\t\t\t\n            //load a group. returned a group obj for every user.\n            const group = await user.getGroup(group_id);\n\t\t\t\n            //encrypt a string for the group\n            const encrypted_string = await group.encryptString(\"hello there!\");\n\t\t\t\n            //now every user in the group can decrypt the string\n            const decrypted_string = await group.decryptString(encrypted_string);\n\t\t\t\n            console.log(decrypted_string);  //hello there!\n        }\n\t\t\n        run();\n    \u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\u003c/code-group-item\u003e\n\n\u003c/code-group\u003e\n\nFor Flutter\n\nEasy to install:\n\n```bash\nflutter pub add sentc\n```\n\nEasy to use:\n\n```dart\ndemo() async {\n  //init the client\n  await Sentc.init(appToken: \"5zMb6zs3dEM62n+FxjBilFPp+j9e7YUFA+7pi6Hi\");\n\n  //register a user\n  await Sentc.register(\"userIdentifier\", \"password\");\n\n  //log in a user\n  final user = await Sentc.login(\"userIdentifier\", \"password\");\n\n  //create a group\n  final groupId = await user.createGroup();\n\n  //load a group. returned a group obj for every user.\n  final group = await user.getGroup(groupId);\n\n  //invite another user to the group. Not here in the example because we only got one user so far\n  // await group.inviteAuto(\"other user id\");\n\n  //encrypt a string for the group\n  final encrypted = await group.encryptString(\"hello there!\");\n\n  //now every user in the group can decrypt the string\n  final decrypted = await group.decryptString(encrypted);\n\n  print(decrypted); //hello there!\n\n  //delete a group\n  await group.deleteGroup();\n\n  //delete a user\n  await user.deleteUser(\"password\");\n}\n```\n\n## Limitations\n\nThe protocol is designed for async long-running communication between groups.\n- A group member should be able to decrypt the whole communication even if they joined years after the beginning.\n- Group member should get decrypt all messages even if they were offline for years.\n\nThe both requirements make perfect forward secrecy impossible. See more [at the Protocol](/protocol/) how we solved it.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsentclose%2Fsentc-docs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsentclose%2Fsentc-docs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsentclose%2Fsentc-docs/lists"}