{"id":18913353,"url":"https://github.com/erlang-punch/nostr","last_synced_at":"2025-04-15T08:30:47.998Z","repository":{"id":90026368,"uuid":"596889017","full_name":"erlang-punch/nostr","owner":"erlang-punch","description":"A pure Erlang implementation of the nostr protocol","archived":false,"fork":false,"pushed_at":"2023-11-28T18:15:21.000Z","size":3490,"stargazers_count":18,"open_issues_count":7,"forks_count":5,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-28T18:50:39.177Z","etag":null,"topics":["client","distributed","erlang","implementation","library","minimalist","nip","nostr","otp","protocol","relay","server"],"latest_commit_sha":null,"homepage":"https://github.com/erlang-punch/nostr","language":"Erlang","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/erlang-punch.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}},"created_at":"2023-02-03T06:27:30.000Z","updated_at":"2025-03-01T00:41:06.000Z","dependencies_parsed_at":"2023-05-02T14:16:24.868Z","dependency_job_id":"bfdbb7cd-32d1-4c9a-bef2-88e14481b5e9","html_url":"https://github.com/erlang-punch/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/erlang-punch%2Fnostr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erlang-punch%2Fnostr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erlang-punch%2Fnostr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erlang-punch%2Fnostr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/erlang-punch","download_url":"https://codeload.github.com/erlang-punch/nostr/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249035286,"owners_count":21202047,"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":["client","distributed","erlang","implementation","library","minimalist","nip","nostr","otp","protocol","relay","server"],"created_at":"2024-11-08T10:06:50.441Z","updated_at":"2025-04-15T08:30:47.509Z","avatar_url":"https://github.com/erlang-punch.png","language":"Erlang","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nostr\n\n![Erlang Punch Nostr License](https://img.shields.io/github/license/erlang-punch/nostr)\n![Erlang Punch Nostr Top Language](https://img.shields.io/github/languages/top/erlang-punch/nostr)\n![Erlang Punch Nostr Workflow Status (main branch)](https://img.shields.io/github/actions/workflow/status/erlang-punch/nostr/test.yaml?branch=main)\n![Erlang Punch Nostr Last Commit](https://img.shields.io/github/last-commit/erlang-punch/nostr)\n![Erlang Punch Nostr Code Size (bytes)](https://img.shields.io/github/languages/code-size/erlang-punch/nostr)\n![Erlang Punch Nostr Repository File Count](https://img.shields.io/github/directory-file-count/erlang-punch/nostr)\n![Erlang Punch Nostr Repository Size](https://img.shields.io/github/repo-size/erlang-punch/nostr)\n\nAn implementation of nostr in pure Erlang using OTP stack with minimal\ndependencies. Here the list of features offered by this application:\n\n - [ ] A library defined in module `nostrlib`\n\n - [ ] A client defined in module `nostr_client`\n\n - [ ] A relay defined in module `nostr_relay`\n\n - [ ] A common interface called `nostr` to play with previously\n       defined modules.\n\n## Disclamer\n\nThis project is in active development and cannot provide a stable\napplication. This application should be used only for test at the\nmoment.\n\n## NIP Support\n\nHere the list of currently supported\n[nips](https://github.com/nostr-protocol/nips):\n\n - [x] [nip/01: Basic protocol flow description](https://github.com/nostr-protocol/nips/blob/master/01.md)\n - [ ] [nip/02: Contact List and Petnames](https://github.com/nostr-protocol/nips/blob/master/02.md)\n - [ ] [nip/03: OpenTimestamps Attestations for Events](https://github.com/nostr-protocol/nips/blob/master/03.md)\n - [ ] [nip/04: Encrypted Direct Message](https://github.com/nostr-protocol/nips/blob/master/04.md)\n - [ ] [nip/05: Mapping Nostr keys to DNS-based internet identifiers](https://github.com/nostr-protocol/nips/blob/master/05.md)\n - [ ] [nip/06: Basic key derivation from mnemonic seed phrase](https://github.com/nostr-protocol/nips/blob/master/06.md)\n - [ ] [nip/07: `window.nostr` capability for web browsers](https://github.com/nostr-protocol/nips/blob/master/07.md)\n - [ ] [nip/08: Handling Mentions](https://github.com/nostr-protocol/nips/blob/master/08.md)\n - [ ] [nip/09: Event Deletion](https://github.com/nostr-protocol/nips/blob/master/09.md)\n - [ ] [nip/10: On \"e\" and \"p\" tags in Text Events (kind 1)](https://github.com/nostr-protocol/nips/blob/master/10.md)\n - [ ] [nip/11: Relay Information Document](https://github.com/nostr-protocol/nips/blob/master/11.md)\n - [ ] [nip/12: Generic Tag Queries](https://github.com/nostr-protocol/nips/blob/master/12.md)\n - [ ] [nip/13: Proof of Work](https://github.com/nostr-protocol/nips/blob/master/13.md)\n - [ ] [nip/14: Subject tag in Text events](https://github.com/nostr-protocol/nips/blob/master/14.md)\n - [ ] [nip/15: End of Stored Events Notice](https://github.com/nostr-protocol/nips/blob/master/15.md)\n - [ ] [nip/16: Event Treatment](https://github.com/nostr-protocol/nips/blob/master/16.md)\n - [ ] [nip/18: Reposts](https://github.com/nostr-protocol/nips/blob/master/18.md)\n - [ ] [nip/19: bech32-encoded entities](https://github.com/nostr-protocol/nips/blob/master/19.md)\n - [ ] [nip/20: Command Results](https://github.com/nostr-protocol/nips/blob/master/20.md)\n - [ ] [nip/21: URL scheme](https://github.com/nostr-protocol/nips/blob/master/21.md)\n - [ ] [nip/22: Event `created_at` Limits](https://github.com/nostr-protocol/nips/blob/master/22.md)\n - [ ] [nip/23: Long-form Content](https://github.com/nostr-protocol/nips/blob/master/23.md)\n - [ ] [nip/25: Reactions](https://github.com/nostr-protocol/nips/blob/master/25.md)\n - [ ] [nip/26: Delegated Event Signing](https://github.com/nostr-protocol/nips/blob/master/26.md)\n - [ ] [nip/27: Text Note References](https://github.com/nostr-protocol/nips/blob/master/27.md)\n - [ ] [nip/28: Public Chat](https://github.com/nostr-protocol/nips/blob/master/28.md)\n - [ ] [nip/30: Custom Emoji](https://github.com/nostr-protocol/nips/blob/master/30.md)\n - [ ] [nip/31: Dealing with unknown event kinds](https://github.com/nostr-protocol/nips/blob/master/31.md)\n - [ ] [nip/32: Labeling](https://github.com/nostr-protocol/nips/blob/master/32.md)\n - [ ] [nip/33: Parameterized Replaceable Events](https://github.com/nostr-protocol/nips/blob/master/33.md)\n - [ ] [nip/36: Sensitive Content/Content Warning](https://github.com/nostr-protocol/nips/blob/master/36.md)\n - [ ] [nip/38: User Statuses](https://github.com/nostr-protocol/nips/blob/master/38.md)\n - [ ] [nip/39: External Identities in Profiles](https://github.com/nostr-protocol/nips/blob/master/39.md)\n - [ ] [nip/40: Expiration Timestamp](https://github.com/nostr-protocol/nips/blob/master/40.md)\n - [ ] [nip/42: Authentication of clients to relays](https://github.com/nostr-protocol/nips/blob/master/42.md)\n - [ ] [nip/45: Event Counts](https://github.com/nostr-protocol/nips/blob/master/45.md)\n - [ ] [nip/46: Nostr Connect](https://github.com/nostr-protocol/nips/blob/master/46.md)\n - [ ] [nip/47: Nostr Wallet Connect](https://github.com/nostr-protocol/nips/blob/master/47.md)\n - [ ] [nip/48: Proxy Tags](https://github.com/nostr-protocol/nips/blob/master/48.md)\n - [ ] [nip/50: Search Capability](https://github.com/nostr-protocol/nips/blob/master/50.md)\n - [ ] [nip/51: Lists](https://github.com/nostr-protocol/nips/blob/master/51.md)\n - [ ] [nip/52: Calendar Events](https://github.com/nostr-protocol/nips/blob/master/52.md)\n - [ ] [nip/53: Live Activities](https://github.com/nostr-protocol/nips/blob/master/53.md)\n - [ ] [nip/56: Reporting](https://github.com/nostr-protocol/nips/blob/master/56.md)\n - [ ] [nip/57: Lightning Zaps](https://github.com/nostr-protocol/nips/blob/master/57.md)\n - [ ] [nip/58: Badges](https://github.com/nostr-protocol/nips/blob/master/58.md)\n - [ ] [nip/65: Relay List Metadata](https://github.com/nostr-protocol/nips/blob/master/65.md)\n - [ ] [nip/78: Arbitrary custom app data](https://github.com/nostr-protocol/nips/blob/master/78.md)\n - [ ] [nip/89: Recommended Application Handlers](https://github.com/nostr-protocol/nips/blob/master/89.md)\n - [ ] [nip/94: File Metadata](https://github.com/nostr-protocol/nips/blob/master/94.md)\n - [ ] [nip/98: HTTP Auth](https://github.com/nostr-protocol/nips/blob/master/98.md)\n\n## Other Implementation (required by nostr)\n\n - [x] [BIP-0340: Schnorr Signatures for secp256k1](https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki)\n - [x] [BIP-0173: Base32 address format for native v0-16 witness outputs](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki)\n - [x] [BIP-0350: Bech32m format for v1+ witness addresses](https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki)\n\n## Build\n\nThe code can be compiled using\n[`rebar3`](https://github.com/erlang/rebar3) Erlang project manager.\n\n    $ rebar3 compile\n\n## Test\n\nThe current implementation is tested using\n[`eunit`](https://www.erlang.org/doc/apps/eunit/chapter.html) and\n[`common_test`](https://www.erlang.org/doc/apps/common_test/basics_chapter.html)\nboth directly integrated with all default Erlang/OTP\nrelease. [`cover`](https://www.erlang.org/doc/man/cover.html) is\nenabled by default to have an idea of the coverage of the test. An\nalias called `check` has been created to help using these tools.\n\n    $ rebar3 check\n\n## Documentation\n\nA developer documentation is provided using\n[`edoc`](https://www.erlang.org/doc/apps/edoc/chapter.html) and can be\ngenerated on demand (automatically created if using rebar3 `check`\nalias).\n\n    $ rebar3 edoc\n\nThis project has been created to explain how to create an Erlang/OTP\nfrom scratch using only a release and few dependencies. The design\nchoices for the infrastructure, data-structures and algorithms can be\nfound in in [notes](notes) directory. Those notes can be exported in\nhtml, epub, pdf or plaintext using `make`.\n\n    $ make\n\nThe documents will be generated in `_build/notes` directory.\n\n## Development\n\nFor the developers, this project is using\n[`asdf`](https://asdf-vm.com/). The tools used are listed in\n`.tool-versions` file. To bootstrap your system, install `asdf` and\njust execute this command in the repository:\n\n    $ git clone https://github.com/erlang-punch/nostr\n    $ cd nostr\n    $ asdf install\n\n## Usage\n\nThis project is a work in progress, and no usages are currently\ndisplayed here.\n\n# References and Resources\n\n - [Erlang Punch Nostr Project](https://github.com/erlang-punch/nostr)\n - [Erlang Punch Nostr Youtube Playlist](https://www.youtube.com/watch?v=4wMedr4k8zM\u0026list=PL_1kmBlWRPQmC4hs5EK35-mxkSTITxpS6)\n - [Erlang Punch Nostr Twitch Channel](https://www.twitch.tv/erlangpunch)\n - [Official Nostr Website](https://nostr.com/)\n - [Main Nostr Open Relay](https://nostr.ch/)\n - [Official Nostr Statistics](https://nostr.watch/)\n - [Official Nostr Github Repository](https://github.com/nostr-protocol/)\n - [Official Nostr Github Repository (nips)](https://github.com/nostr-protocol/nips/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferlang-punch%2Fnostr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ferlang-punch%2Fnostr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferlang-punch%2Fnostr/lists"}