{"id":13547831,"url":"https://github.com/cupcakearmy/cryptgeon","last_synced_at":"2025-10-19T18:43:14.774Z","repository":{"id":38329970,"uuid":"363384419","full_name":"cupcakearmy/cryptgeon","owner":"cupcakearmy","description":"cryptgeon is a secure, open source note / file sharing service inspired by PrivNote written in rust \u0026 svelte.","archived":false,"fork":false,"pushed_at":"2025-04-04T20:54:49.000Z","size":1546,"stargazers_count":976,"open_issues_count":18,"forks_count":102,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-05-09T07:43:38.606Z","etag":null,"topics":["file-sharing","note-sharing","private-notes","privnote","secure-notes"],"latest_commit_sha":null,"homepage":"https://cryptgeon.org/","language":"Svelte","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/cupcakearmy.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"cupcakearmy","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2021-05-01T10:39:06.000Z","updated_at":"2025-05-08T01:23:22.000Z","dependencies_parsed_at":"2024-02-09T14:51:46.949Z","dependency_job_id":"e3581df9-8654-4243-8d89-de3ed394ebf7","html_url":"https://github.com/cupcakearmy/cryptgeon","commit_stats":{"total_commits":328,"total_committers":18,"mean_commits":18.22222222222222,"dds":"0.11280487804878048","last_synced_commit":"70481341b9a666d6413a23940312820be968d210"},"previous_names":[],"tags_count":54,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cupcakearmy%2Fcryptgeon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cupcakearmy%2Fcryptgeon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cupcakearmy%2Fcryptgeon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cupcakearmy%2Fcryptgeon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cupcakearmy","download_url":"https://codeload.github.com/cupcakearmy/cryptgeon/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254149787,"owners_count":22022849,"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":["file-sharing","note-sharing","private-notes","privnote","secure-notes"],"created_at":"2024-08-01T12:01:01.660Z","updated_at":"2025-10-19T18:43:09.742Z","avatar_url":"https://github.com/cupcakearmy.png","language":"Svelte","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./design/Github.png\" alt=\"logo\"\u003e\n\u003c/p\u003e\n\n\u003ca href=\"https://discord.gg/nuby6RnxZt\"\u003e\n  \u003cimg alt=\"discord\" src=\"https://img.shields.io/discord/252403122348097536?style=for-the-badge\" /\u003e\n  \u003cimg alt=\"docker pulls\" src=\"https://img.shields.io/docker/pulls/cupcakearmy/cryptgeon?style=for-the-badge\" /\u003e\n  \u003cimg alt=\"Docker image size badge\" src=\"https://img.shields.io/docker/image-size/cupcakearmy/cryptgeon?style=for-the-badge\" /\u003e\n  \u003cimg alt=\"Latest version\" src=\"https://img.shields.io/github/v/release/cupcakearmy/cryptgeon?style=for-the-badge\" /\u003e\n\u003c/a\u003e\n\n\u003cbr/\u003e\u003cbr/\u003e\n\u003ca href=\"https://www.producthunt.com/posts/cryptgeon?utm_source=badge-featured\u0026utm_medium=badge\u0026utm_souce=badge-cryptgeon\" target=\"_blank\"\u003e\u003cimg src=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=295189\u0026theme=light\" alt=\"Cryptgeon - Securely share self-destructing notes | Product Hunt\" height=\"50\" /\u003e\u003c/a\u003e\n\u003ca href=\"\"\u003e\u003cimg src=\"./.github/lokalise.png\" height=\"50\"\u003e\n\u003ca title=\"Install cryptgeon Raycast Extension\" href=\"https://www.raycast.com/cupcakearmy/cryptgeon\"\u003e\u003cimg src=\"https://www.raycast.com/cupcakearmy/cryptgeon/install_button@2x.png?v=1.1\" height=\"64\" alt=\"\" style=\"height: 64px;\"\u003e\u003c/a\u003e\n\u003cbr/\u003e\u003cbr/\u003e\n\nEN | [简体中文](README_zh-CN.md) | [ES](README_ES.md)\n\n## About?\n\n_cryptgeon_ is a secure, open source sharing note or file service inspired by [_PrivNote_](https://privnote.com).\nIt includes a server, a web page and a CLI client.\n\n\u003e 🌍 If you want to translate the project feel free to reach out to me.\n\u003e\n\u003e Thanks to [Lokalise](https://lokalise.com/) for providing free access to their platform.\n\n## Live Service / Demo\n\n### Web\n\nCheck out the live service / demo and see for yourself [cryptgeon.org](https://cryptgeon.org)\n\n### CLI\n\n```\nnpx cryptgeon send text \"This is a secret note\"\n```\n\nFor more documentation about the CLI see the [readme](./packages/cli/README.md).\n\n### Raycast Extension\n\nThere is an [official Raycast extension](https://www.raycast.com/cupcakearmy/cryptgeon).\n\n\u003ca title=\"Install cryptgeon Raycast Extension\" href=\"https://www.raycast.com/cupcakearmy/cryptgeon\"\u003e\u003cimg src=\"https://www.raycast.com/cupcakearmy/cryptgeon/install_button@2x.png?v=1.1\" height=\"64\" alt=\"\" style=\"height: 64px;\"\u003e\u003c/a\u003e\n\n## Features\n\n- send text or files\n- server cannot decrypt contents due to client side encryption\n- view or time constraints\n- in memory, no persistence\n- obligatory dark mode support\n\n## How does it work?\n\neach note has a generated \u003ccode\u003eid (256bit)\u003c/code\u003e and \u003ccode\u003ekey 256(bit)\u003c/code\u003e. The\n\u003ccode\u003eid\u003c/code\u003e\nis used to save \u0026 retrieve the note. the note is then encrypted with aes in gcm mode on the\nclient side with the \u003ccode\u003ekey\u003c/code\u003e and then sent to the server. data is stored in memory and\nnever persisted to disk. the server never sees the encryption key and cannot decrypt the contents\nof the notes even if it tried to.\n\n\u003e View counts are guaranteed with one running instance of cryptgeon. Multiple instances connected to the same Redis instance can run into race conditions, where a note might be retrieved more than the view count allows.\n\n## Screenshot\n\n![screenshot](./design/Screens.png)\n\n## Environment Variables\n\n| Variable                | Default          | Description                                                                                                                                                                                                   |\n| ----------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `REDIS`                 | `redis://redis/` | Redis URL to connect to. [According to format](https://docs.rs/redis/latest/redis/#connection-parameters)                                                                                                     |\n| `SIZE_LIMIT`            | `1 KiB`          | Max size for body. Accepted values according to [byte-unit](https://docs.rs/byte-unit/). \u003cbr\u003e `512 MiB` is the maximum allowed. \u003cbr\u003e The frontend will show that number including the ~35% encoding overhead. |\n| `MAX_VIEWS`             | `100`            | Maximal number of views.                                                                                                                                                                                      |\n| `MAX_EXPIRATION`        | `360`            | Maximal expiration in minutes.                                                                                                                                                                                |\n| `ALLOW_ADVANCED`        | `true`           | Allow custom configuration. If set to `false` all notes will be one view only.                                                                                                                                |\n| `ALLOW_FILES`           | `true`           | Allow uploading files. If set to `false`, users will only be allowed to create text notes.                                                                                                                    |\n| `ID_LENGTH`             | `32`             | Set the size of the note `id` in bytes. By default this is `32` bytes. This is useful for reducing link size. _This setting does not affect encryption strength_.                                             |\n| `VERBOSITY`             | `warn`           | Verbosity level for the backend. [Possible values](https://docs.rs/env_logger/latest/env_logger/#enabling-logging) are: `error`, `warn`, `info`, `debug`, `trace`                                             |\n| `THEME_IMAGE`           | `\"\"`             | Custom image for replacing the logo. Must be publicly reachable                                                                                                                                               |\n| `THEME_TEXT`            | `\"\"`             | Custom text for replacing the description below the logo                                                                                                                                                      |\n| `THEME_PAGE_TITLE`      | `\"\"`             | Custom text the page title                                                                                                                                                                                    |\n| `THEME_FAVICON`         | `\"\"`             | Custom url for the favicon. Must be publicly reachable                                                                                                                                                        |\n| `THEME_NEW_NOTE_NOTICE` | `true`           | Show the message about how notes are stored in the memory and may be evicted after creating a new note. Defaults to `true`.                                                                                   |\n| `IMPRINT_URL`           | `\"\"`             | Custom url for an Imprint hosted somewhere else. Must be publicly reachable. Takes precedence above `IMPRINT_HTML`.                                                                                           |\n| `IMPRINT_HTML`          | `\"\"`             | Alternative to `IMPRINT_URL`, this can be used to specify the HTML code to show on `/imprint`. Only `IMPRINT_HTML` or `IMPRINT_URL` should be specified, not both.                                            |\n## Deployment\n\n\u003e ℹ️ `https` is required otherwise browsers will not support the cryptographic functions.\n\n\u003e ℹ️ There is a health endpoint available at `/api/health/`. It returns either 200 or 503.\n\n### Docker\n\nDocker is the easiest way. There is the [official image here](https://hub.docker.com/r/cupcakearmy/cryptgeon).\n\n```yaml\n# docker-compose.yml\n\nversion: '3.8'\n\nservices:\n  redis:\n    image: redis:7-alpine\n    # This is required to stay in RAM only.\n    command: redis-server --save \"\" --appendonly no\n    # Set a size limit. See link below on how to customise.\n    # https://redis.io/docs/latest/operate/rs/databases/memory-performance/eviction-policy/\n    # --maxmemory 1gb --maxmemory-policy allkeys-lrulpine\n    # This prevents the creation of an anonymous volume.\n    tmpfs:\n      - /data\n\n  app:\n    image: cupcakearmy/cryptgeon:latest\n    depends_on:\n      - redis\n    environment:\n      # Size limit for a single note.\n      SIZE_LIMIT: 4 MiB\n    ports:\n      - 80:8000\n\n    # Optional health checks\n    # healthcheck:\n    #   test: [\"CMD\", \"curl\", \"--fail\", \"http://127.0.0.1:8000/api/live/\"]\n    #   interval: 1m\n    #   timeout: 3s\n    #   retries: 2\n    #   start_period: 5s\n```\n\n### NGINX Proxy\n\nSee the [examples/nginx](https://github.com/cupcakearmy/cryptgeon/tree/main/examples/nginx) folder. There an example with a simple proxy, and one with https. You need to specify the server names and certificates.\n\n### Traefik 2\n\nSee the [examples/traefik](https://github.com/cupcakearmy/cryptgeon/tree/main/examples/traefik) folder.\n\n### Scratch\n\nSee the [examples/scratch](https://github.com/cupcakearmy/cryptgeon/tree/main/examples/scratch) folder. There you'll find a guide how to setup a server and install cryptgeon from scratch.\n\n### Synology\n\nThere is a [guide](https://mariushosting.com/how-to-install-cryptgeon-on-your-synology-nas/) you can follow.\n\n### YouTube Guides\n\n- English by [Webnestify](https://www.youtube.com/watch?v=XAyD42I7wyI)\n- English by [DB Tech](https://www.youtube.com/watch?v=S0jx7wpOfNM) [Previous Video](https://www.youtube.com/watch?v=JhpIatD06vE)\n- German by [ApfelCast](https://www.youtube.com/watch?v=84ZMbE9AkHg)\n\n### Written Guides\n\n- French by [zarevskaya](https://belginux.com/installer-cryptgeon-avec-docker/)\n- Italian by [@nicfab](https://notes.nicfab.eu/it/posts/cryptgeon/)\n- English by [@nicfab](https://notes.nicfab.eu/en/posts/cryptgeon/)\n\n## Development\n\n**Requirements**\n\n- `pnpm`: `\u003e=9`\n- `node`: `\u003e=22`\n- `rust`: edition `2021`\n\n**Install**\n\n```bash\npnpm install\n\n# Also you need cargo watch if you don't already have it installed.\n# https://lib.rs/crates/cargo-watch\ncargo install cargo-watch\n```\n\n**Run**\n\nMake sure you have docker running.\n\n```bash\npnpm run dev\n```\n\nRunning `pnpm run dev` in the root folder will start the following things:\n\n- redis docker container\n- rust backend\n- client\n- cli\n\nYou can see the app under [localhost:3000](http://localhost:3000).\n\n\u003e There is a Postman collection with some example requests [available in the repo](./Cryptgeon.postman_collection.json)\n\n### Tests\n\nTests are end to end tests written with Playwright.\n\n```sh\npnpm run test:prepare\n\n# Use the test or test:local script. The local version only runs in one browser for quicker development.\npnpm run test:local\n```\n\n## Security\n\nPlease refer to the security section [here](./SECURITY.md).\n\n---\n\n_Attributions_\n\n- Test data:\n  - Text for tests [Nietzsche Ipsum](https://nietzsche-ipsum.com/)\n  - [AES Paper](https://www.cs.miami.edu/home/burt/learning/Csc688.012/rijndael/rijndael_doc_V2.pdf)\n  - [Unsplash Pictures](https://unsplash.com/)\n- Loading animation by [Nikhil Krishnan](https://codepen.io/nikhil8krishnan/pen/rVoXJa)\n- Icons made by \u003ca href=\"https://www.freepik.com\" title=\"Freepik\"\u003efreepik\u003c/a\u003e from \u003ca href=\"https://www.flaticon.com/\" title=\"Flaticon\"\u003ewww.flaticon.com\u003c/a\u003e\n","funding_links":["https://github.com/sponsors/cupcakearmy"],"categories":["Svelte"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcupcakearmy%2Fcryptgeon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcupcakearmy%2Fcryptgeon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcupcakearmy%2Fcryptgeon/lists"}