{"id":21441905,"url":"https://github.com/httpjamesm/horizon-send","last_synced_at":"2025-07-14T17:32:24.292Z","repository":{"id":65566027,"uuid":"580167297","full_name":"httpjamesm/horizon-send","owner":"httpjamesm","description":"End-to-end encrypted file sharing.","archived":false,"fork":false,"pushed_at":"2023-10-30T00:15:16.000Z","size":1948,"stargazers_count":14,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2023-10-31T00:33:25.633Z","etag":null,"topics":["anonymous","encryption","file-sharing","privacy","xchacha20","xchacha20-poly1305"],"latest_commit_sha":null,"homepage":"https://send.hrzn.cool","language":"Svelte","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/httpjamesm.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}},"created_at":"2022-12-19T22:10:00.000Z","updated_at":"2023-10-31T00:33:25.634Z","dependencies_parsed_at":"2023-02-16T01:45:22.699Z","dependency_job_id":null,"html_url":"https://github.com/httpjamesm/horizon-send","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/httpjamesm%2Fhorizon-send","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/httpjamesm%2Fhorizon-send/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/httpjamesm%2Fhorizon-send/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/httpjamesm%2Fhorizon-send/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/httpjamesm","download_url":"https://codeload.github.com/httpjamesm/horizon-send/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225990490,"owners_count":17556153,"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":["anonymous","encryption","file-sharing","privacy","xchacha20","xchacha20-poly1305"],"created_at":"2024-11-23T01:44:34.499Z","updated_at":"2024-11-23T01:44:34.950Z","avatar_url":"https://github.com/httpjamesm.png","language":"Svelte","funding_links":[],"categories":[],"sub_categories":[],"readme":"# horizon-send\n\nHorizon Send is a secure file sharing service that uses zero-knowledge end-to-end encryption to protect your files.\n\n## Encryption\n\nHorizon Send uses `libsodium-wrappers` to encrypt files and associated metadata with AEAD XChaCha20-Poly1305 secret stream.\n\n### Flow\n\n1. Bob selects a file in the menu.\n2. Client grabs all the data about the file, such as contents, file name and mime-type.\n3. Client generates a random XChaCha20 secret stream key.\n4. Client hashes key with Argon2id13 with a cryptographically random salt.\n5. Client encrypts file data and metadata with the key.\n6. Client uploads the encrypted file and metadata to the server with the Argon2id13 hashed key for server-side validation.\n7. Client converts the key and salt to base64 and appends it to the download endpoint via URL fragment (which the browser does not send to the server).\n8. Bob copies the URL and sends it to Alice.\n9. Alice visits the URL and clicks \"Download\".\n10. Client grabs the key and salt from the URL fragment.\n11. Client hashes the key with Argon2id13 with the salt.\n12. Client requests the encrypted file and metadata from the server by passing along the hashed key.\n13. Client decrypts the file and metadata with the key.\n14. Client saves the file to disk.\n\n## Development\n\n\nOnce you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:\n\n```bash\nnpm run dev\n\n# or start the server and open the app in a new browser tab\nnpm run dev -- --open\n```\n\n### Building\n\nTo create a production version of your app:\n\n```bash\nnpm run build\n```\n\nYou can preview the production build with `npm run preview`.\n\n\u003e To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhttpjamesm%2Fhorizon-send","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhttpjamesm%2Fhorizon-send","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhttpjamesm%2Fhorizon-send/lists"}