MCPcopy Index your code
hub / github.com/0xtlt/nostr_rust

github.com/0xtlt/nostr_rust @0.20.3

Chat with this repo
repository ↗ · DeepWiki ↗ · release 0.20.3 ↗ · + Follow
101 symbols 193 edges 18 files 58 documented · 57%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

nostr_rust

crates.io Documentation MIT/Apache-2 licensed CI Issues

An ergonomic, Nostr API Client for Rust.

Example

[dependencies]
nostr_rust = "*"

And then the code:

```rust,norun use std::{ str::FromStr, sync::{Arc, Mutex}, thread, };

use nostr_rust::{nostr_client::Client, req::ReqFilter, Identity, Message, events::extract_events_ws, utils::parse_content_tags};

fn handle_message(relay_url: &String, message: &Message) -> Result<(), String> { println!("Received message from {}: {:?}", relay_url, message);

let events = extract_events_ws(message);
println!("Events: {:?}", events);

Ok(())

}

fn main() { let my_identity = Identity::from_str("your private key as hex string") .unwrap();

let nostr_client = Arc::new(Mutex::new(
    Client::new(vec!["wss://relay.nostr.info"]).unwrap(),
));

// Run a new thread to handle messages
let nostr_clone = nostr_client.clone();
let handle_thread = thread::spawn(move || {
    println!("Listening...");
    let events = nostr_clone.lock().unwrap().next_data().unwrap();

    for (relay_url, message) in events.iter() {
        handle_message(relay_url, message).unwrap();
    }
});

// Change metadata
nostr_client
    .lock()
    .unwrap()
    .set_metadata(
        &my_identity,
        Some("Rust Nostr Client test account"),
        Some("Hello Nostr! #5"),
        None,
        None,
        0,
    )
    .unwrap();

// Subscribe to my last text note
let subscription_id = nostr_client
    .lock()
    .unwrap()
    .subscribe(vec![ReqFilter {
        ids: None,
        authors: Some(vec![
            "884704bd421721e292edbff42eb77547fe115c6ff9825b08fc366be4cd69e9f6".to_string(),
        ]),
        kinds: None,
        e: None,
        p: None,
        since: None,
        until: None,
        limit: Some(1),
    }])
    .unwrap();

// Unsubscribe
nostr_client
    .lock()
    .unwrap()
    .unsubscribe(&subscription_id)
    .unwrap();

// You can use the parse content tags method to get the content and the tags from a string
// let tags = parse_content_tags("hello #world", vec![], Some(nostr_rust::DEFAULT_HASHTAG), true, true);
// assert_eq!(tags.content, "hello #world");
//  assert_eq!(tags.tags, vec![vec!["t", "world"]]);

// Publish a text note
nostr_client
    .lock()
    .unwrap()
    .publish_text_note(&my_identity, "Hello Nostr! :)", &[], 0)
    .unwrap();

// Publish a proof of work text note with a difficulty target of 15
nostr_client
    .lock()
    .unwrap()
    .publish_text_note(&my_identity, "Hello Nostr! :)", &[], 15)
    .unwrap();

// Wait for the thread to finish
handle_thread.join().unwrap();

}

Async feature

If you want to use the async version of the client, you can enable the async feature:

[dependencies]
nostr_rust = { version = "*", features = ["async"] }

NIPs Supported

NIP Supported Client Version Description
01 0.1.0 Basic protocol flow description
02 0.3.0 Contact List and Petnames
03 Not supported OpenTimestamps Attestations for Events
04 0.6.0 Encrypted Direct Message
05 0.15.0 Mapping Nostr keys to DNS-based internet identifiers
06 Not supported Basic key derivation from mnemonic seed phrase
07 Not concerned Not supported window.nostr capability for web browsers
08 Not concerned Not supported Handling Mentions
09 0.5.0 Event Deletion
10 Not concerned Not supported Conventions for clients' use of e and p tags in text events.
11 0.9.0 Relay Information Document
12 Not supported Generic Tag Queries
13 0.8.0 Proof of Work
14 Not concerned Not supported Subject tag in text events.
15 Not supported End of Stored Events Notice
16 0.13.0 Event Treatment
22 Not supported Event created_at Limits
25 0.4.0 Reactions
28 Not supported Public Chat

License

Licensed under MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)

Core symbols most depended-on inside this repo

auto_bech32_to_hex
called by 22
src/bech32.rs
get_timestamp
called by 20
src/utils.rs
to_event
called by 19
src/events.rs
publish_event
called by 16
src/nostr_client.rs
send_message
called by 10
src/websocket.rs
from_hb_to_hex
called by 6
src/bech32.rs
get_content
called by 4
src/events.rs
get_events_of
called by 4
src/nostr_client.rs

Shape

Method 54
Function 21
Enum 14
Class 12

Languages

Rust100%

Modules by API surface

src/nostr_client.rs14 symbols
src/events.rs11 symbols
src/nips/nip4.rs9 symbols
src/req.rs6 symbols
src/nips/nip16.rs6 symbols
src/nips/nip1.rs6 symbols
src/bech32.rs6 symbols
src/websocket.rs5 symbols
src/nips/nip5.rs5 symbols
src/nips/nip25.rs5 symbols
src/nips/nip2.rs5 symbols
src/keys.rs5 symbols

For agents

$ claude mcp add nostr_rust \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact