{"id":21829779,"url":"https://github.com/0xtlt/safer-nostr","last_synced_at":"2025-04-14T06:09:20.975Z","repository":{"id":136125299,"uuid":"582719991","full_name":"0xtlt/safer-nostr","owner":"0xtlt","description":"Safer Nostr is a service that helps protect users by loading sensitive information (IP leak) and using AI to prevent inappropriate images from being uploaded. It also offers image optimization and storage options. It has configurable privacy and storage settings, as well as custom cache expiration.","archived":false,"fork":false,"pushed_at":"2022-12-31T12:28:04.000Z","size":203,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-14T06:09:17.299Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","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/0xtlt.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2022-12-27T17:17:29.000Z","updated_at":"2023-02-10T09:54:56.000Z","dependencies_parsed_at":null,"dependency_job_id":"16bf391e-2491-4a28-8ef9-af59d3a4f2e5","html_url":"https://github.com/0xtlt/safer-nostr","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xtlt%2Fsafer-nostr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xtlt%2Fsafer-nostr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xtlt%2Fsafer-nostr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xtlt%2Fsafer-nostr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/0xtlt","download_url":"https://codeload.github.com/0xtlt/safer-nostr/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248830395,"owners_count":21168272,"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":"2024-11-27T18:29:11.419Z","updated_at":"2025-04-14T06:09:20.963Z","avatar_url":"https://github.com/0xtlt.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# safer-nostr\n\nSafer Nostr is a service that helps protect users by loading sensitive information (IP leak) and using AI to prevent inappropriate images from being uploaded. It also offers image optimization and storage options. It has configurable privacy and storage settings, as well as custom cache expiration.\n\n## Key features\n\n- [x] Load NIP-05\n- [x] Load website preview\n- Cache texts\n  - [x] Cache in Redis\n  - [x] Cache in RAM\n- [x] Load and optimize Medias\n  - [x] Store in Redis\n  - [x] Store in RAM\n  - [ ] Store in S3\n  - [ ] Store in local disk\n  - [ ] Artificial intelligence checks for inappropriate images\n  - [ ] Artificial intelligence checks for inappropriate gifs\n  - [ ] Artificial intelligence checks for inappropriate videos\n- Formats\n  - [x] JPG\n  - [x] PNG\n  - [x] GIF\n  - [ ] MP4\n  - [x] WEBP\n- [x] Configurable settings\n  - [x] Private or public mode\n  - [x] Private mode: Public key verification\n  - [x] Private mode: Password verification\n  - [x] RAM or Redis storage options\n  - [x] Custom cache expiration time\n  - [ ] Bitcoin or Lightning Bitcoin payment 1 time or recurrent to be in the allowlist\n\n## API's\n\n### For server that requires authentication with public key\n\nYou can only make one authenticated request with the same signature.\n\n| Parameter | Type | Description | Example | Is required? |\n| --- | --- | --- | --- | --- |\n| pubkey | string | Your public key | `884704bd421721e292edbff42eb77547fe115c6ff9825b08fc366be4cd69e9f6` | yes |\n| uniq | string | a unique (random) string | `20` | yes |\n| time | number | Unix timestamp (UTC-0) | `1600000000` | yes |\n| sig | string | Signature of: `sha256(string: \"{pubkey}:{time}:{uniq}\"\")` | `0ae1feeb6fb36f3f5f5d3f001b06a5f6d01c999d7a74b9227012cdac0587f1ef7b9ed4b5e16afd3f1f502266f0b3b2ed21906554d6e4ffba43de2bb99d061694` | yes |\n| sig | string | pubkey | `884704bd421721e292edbff42eb77547fe115c6ff9825b08fc366be4cd69e9f6` | yes |\n\n### For server that requires authentication with password\n\n| Parameter | Type | Description | Example | Is required? |\n| --- | --- | --- | --- | --- |\n| pass | string | Your password | `helloworld` | yes |\n\n### GET /is_good\n\nCheck if the server is ok with your password / sig / nothing\n\n```ts\ntype IsGoodResponse = \"Yes!\" | \"Access Denied\";\n```\n\n### GET /nip05\n\nExample without Authentification required: `https://example.com/nip05?nip05=_@nostr.0xtlt.dev`\nExample with password Authentification required: `https://example.com/nip05?nip05=_@nostr.0xtlt.dev\u0026pass=helloworld`\nExample with pubkey Authentification required: `https://example.com/nip05?nip05=_@nostr.0xtlt.dev\u0026pubkey=884704bd421721e292edbff42eb77547fe115c6ff9825b08fc366be4cd69e9f6\u0026uniq=20\u0026time=1600000000\u0026sig=0ae1feeb6fb36f3f5f5d3f001b06a5f6d01c999d7a74b9227012cdac0587f1ef7b9ed4b5e16afd3f1f502266f0b3b2ed21906554d6e4ffba43de2bb99d061694`\n\n| Parameter | Type | Description | Example | Is required? |\n| --- | --- | --- | --- | --- |\n| nip05 | string | NIP-05 to load | `_@nostr.0xtlt.dev` | yes |\n\nResponse type:\n\n```ts\ntype NIP05Response = {\n  status: \"error\";\n  message: string;\n} | {\n  pubkey: string;\n  status: \"success\";\n  updated_at: number;\n}\n```\n\n### GET /image_proxy\n\nExample without Authentification required: `https://example.com/image_proxy?url=https://example.com/image.png\u0026width=800\u0026ratio=16:9`\nExample with Authentification required: `https://example.com/image_proxy?url=https://example.com/image.png\u0026width=800\u0026ratio=16:9\u0026pubkey=884704bd421721e292edbff42eb77547fe115c6ff9825b08fc366be4cd69e9f6\u0026uniq=20\u0026time=1600000000\u0026sig=0ae1feeb6fb36f3f5f5d3f001b06a5f6d01c999d7a74b9227012cdac0587f1ef7b9ed4b5e16afd3f1f502266f0b3b2ed21906554d6e4ffba43de2bb99d061694`\n\n| Parameter | Type | Description | Example | Is required? |\n| --- | --- | --- | --- | --- |\n| url | string | URL of the image to load | `https://example.com/image.png` | yes |\n| width | number | Width of the image | `100` | no |\n| height | number | Height of the image | `100` | no |\n| ratio | string | Ratio of the image | `1:1` | no |\n\nResponse type: An image\n\n### GET /website_preview\n\nExample without Authentification required: `https://example.com/website_preview?url=https://example.com`\nExample with Authentification required: `https://example.com/website_preview?url=https://example.com\u0026pubkey=884704bd421721e292edbff42eb77547fe115c6ff9825b08fc366be4cd69e9f6\u0026uniq=20\u0026time=1600000000\u0026sig=0ae1feeb6fb36f3f5f5d3f001b06a5f6d01c999d7a74b9227012cdac0587f1ef7b9ed4b5e16afd3f1f502266f0b3b2ed21906554d6e4ffba43de2bb99d061694`\n\n| Parameter | Type | Description | Example | Is required? |\n| --- | --- | --- | --- | --- |\n| url | string | URL of the website to load | `https://example.com` | yes |\n\nResponse type:\n\n```ts\ntype WebsitePreviewResponse = {\n  title: string;\n  description: string;\n  image: string;\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0xtlt%2Fsafer-nostr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F0xtlt%2Fsafer-nostr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0xtlt%2Fsafer-nostr/lists"}