{"id":13832773,"url":"https://github.com/keystr/keystr-rs","last_synced_at":"2025-07-09T19:31:11.356Z","repository":{"id":138648472,"uuid":"599045529","full_name":"keystr/keystr-rs","owner":"keystr","description":"Nostr Keystore","archived":false,"fork":false,"pushed_at":"2023-06-15T20:49:22.000Z","size":284,"stargazers_count":36,"open_issues_count":1,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-02-17T05:34:15.421Z","etag":null,"topics":["nip-26","nip-46","nostr","rust"],"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/keystr.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,"governance":null,"roadmap":null,"authors":null}},"created_at":"2023-02-08T10:40:28.000Z","updated_at":"2024-02-09T10:32:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"68503bb5-5d39-48f5-b557-420656bda1ee","html_url":"https://github.com/keystr/keystr-rs","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/keystr%2Fkeystr-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/keystr%2Fkeystr-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/keystr%2Fkeystr-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/keystr%2Fkeystr-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/keystr","download_url":"https://codeload.github.com/keystr/keystr-rs/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225581833,"owners_count":17491794,"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":["nip-26","nip-46","nostr","rust"],"created_at":"2024-08-04T11:00:30.373Z","updated_at":"2024-11-20T15:31:04.583Z","avatar_url":"https://github.com/keystr.png","language":"Rust","funding_links":[],"categories":["Install from Source","Tools"],"sub_categories":["Nostr","Client reviews and/or comparisons"],"readme":"# **Keystr**: Nostr Keystore\n\nAn application for managing Nostr keys.\nWritten in Rust, with simple UI (Iced).\n\n## Features\n\n- Safekeeping of keys:\n  - Import of keys (secret or public)\n  - Save/Load keys (encrypted with password)\n- Delegations (NIP-26): Create delegation\n- Signer (NIP-46 Nostr Connect) support:\n  - connect to a client (handle internal requests (describe, get_public_key))\n  - handling incoming sign_event and delegate requests, requiring user confirmation (via a popup)\n\n\n## Screenshot\n\n\u003cimg src=\"media/screenshot-01-deleg.png\" align=\"center\" title=\"screenshot delegation\" border=\"1\"\u003e\n\n## Roadmap\n\n- Android app\n- Profile metadata (show, edit)\n- FROST support\n\n## Building and Running\n\n- Prerequisite: `rust`, v \u003e= 1.67\n\n- Simply run:  `cargo run`\n\n## User Guide\n\nShort description of available functionalities.\n\n### Key Management\n\n**Keys Overview**\n\nA Nostr identity should be set in the app, that is, a pair of keys: a secret key and corresponding public key.\nIt is possible to provide only pubkey, in this case signing will not work.\n\nIt is possible that no key is set (e.g. after first startup or after clearing the keys).\n\nIf an password-encrypted key is loaded from storage, but password is not provided, singing will not work.\n\n**Importing Keys**\n\n- Generate new key pair\n- Import a private key (nsec or hex string)\n- Import a public key (npub or hex string)\n\n**Saving/Loading Keys**\n\nSecret key can be persisted to disk, in encrypted form.\nEncryption can optionally use a password.\n\nFiles are stored in local data directory, under `~/.local/share/keystr` in Unix.\n\nWhen an encrypted password is loaded, it becomes usable only once it is unlocked, using the password used during encryption. (Note: Unlock can happen later after load.)\n\n**Security Setting**\n\nThere is a general security setting controlling the security of secret key storage, with following options:\n- Never persist security key\n- Persist but only with a password-enhanced encryption (The password is needed every time the key is loaded)\n- Persist encrypted, with or without a password\n\n### NIP-26 Delegations\n\nIt is possible to create a NIP-26 Delegation, to empower a delegatee identity to be able to post events in the name of the loaded identity.\n\nTypical flow, assuming the a key pair is loaded:\n\n- Enter (paste) the npub of the delegatee (typically taken from another Nostr client app)\n- Optionally set time range, this can be done using a number of days from now (or using absolute unix timestamps)\n- Optionally enter an event type restriction, e.g. 'kind=1'\n- Create the delegation. The resulting delegation tag should be copied to the other client app.\n\n### NIP-46 Nostr Connect a.k.a Signer\n\nKeystr can act as a Signer, and sign event for a client.\n\n- Initiate a connection in the client app (to obtain a nostrconnect URI)\n- Enter the nostrconnect URI string in Keystr, connect\n- Keystr will connect to the relay and listen for signer requests\n- For incoming Signing requests it shows a popup for the user, to review and acknowledge (sign) it\n\n### NIP-46 + NIP-26 Signer and Delegation combined\n\nKeystr as a Signer can sign a delegation, simplifying the communication to get the delegation tag to the app.\n\n- Initiate a connection in the client app (to obtain a nostrconnect URI)\n- Enter the nostrconnect URI string in Keystr, connect\n- From the client app request a delegation (recommended to limit validity to short period, and the kinds to the ones used by the app)\n- In Keystr review the request, confirm\n- Delegation tag is automatically sent to the client app, the client app can post using it right away\n- Later the app can re-request the delegation as the current one expires (may not need to reconnect)\n\n\n## Running Tests\n\n- `cargo tests`\n\n## Contributing\n\nCreate an issue, PR, or discussion.\n\n## License: MIT\n\n## Contact\n\nNostr: optout@nostrplebs.com  `nostr:npub1kxgpwh80gp79j0chc925srk6rghw0akggduwau8fwdflslh9jvqqd3lecx`\n\n## References\n\n- Status:\n  - NIP-26 Delegations Status  https://hackmd.io/fskWGX_XRxG45fMrub8OiA?view\n  - NIP-26 Status: https://nip26.lol\n- Specs:\n  - NIP-26 Delegations Spec https://github.com/nostr-protocol/nips/blob/master/26.md\n  - NIP-46 Delegations Spec https://github.com/nostr-protocol/nips/blob/master/46.md\n- Tools, clients:\n  - Rust-nostr lib  https://github.com/rust-nostr/nostr\n  - Nostr Connect demo  https://github.com/catenocrypt/nostr-connect-demo\n  - NostrTool, key generation and delegation playground  https://github.com/kdmukai/nostrtool\n- General Nostr links:\n  - Nostr Protocol definition  https://github.com/nostr-protocol/nostr  protocol\n  - Nostr projects  https://github.com/aljazceru/awesome-nostr\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkeystr%2Fkeystr-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkeystr%2Fkeystr-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkeystr%2Fkeystr-rs/lists"}