| Crates.io | pubky-messenger |
| lib.rs | pubky-messenger |
| version | 0.1.0 |
| created_at | 2025-06-18 01:15:08.211544+00 |
| updated_at | 2025-06-18 01:15:08.211544+00 |
| description | A Rust library for private messaging using Pubky |
| homepage | |
| repository | https://github.com/coreyphillips/pubky-messenger |
| max_upload_size | |
| id | 1716443 |
| size | 138,576 |
A Rust library for secure private messaging using the Pubky protocol. This library provides end-to-end encrypted messaging capabilities with authentication via pkarr recovery files.
Add this to your Cargo.toml:
[dependencies]
pubky-messenger = "0.1.0"
use pubky_messenger::{PrivateMessengerClient, PublicKey};
use anyhow::Result;
#[tokio::main]
async fn main() -> Result<()> {
// Load recovery file
let recovery_file = std::fs::read("recovery.pkarr")?;
// Create client
let client = PrivateMessengerClient::from_recovery_file(&recovery_file, "your_passphrase")?;
// Sign in
client.sign_in().await?;
// Send a message
let recipient = PublicKey::try_from("recipient_public_key_here")?;
let message_id = client.send_message(&recipient, "Hello, world!").await?;
println!("Message sent with ID: {}", message_id);
// Get messages
let messages = client.get_messages(&recipient).await?;
for msg in messages {
println!("{}: {}", msg.sender, msg.content);
}
Ok(())
}
If you already have a keypair, you can create the client directly:
use pkarr::Keypair;
use pubky_messenger::PrivateMessengerClient;
let keypair = Keypair::random();
let client = PrivateMessengerClient::new(keypair)?;
// Get your own profile
if let Some(profile) = client.get_own_profile().await? {
println!("Name: {}", profile.name);
println!("Bio: {:?}", profile.bio);
}
// Get followed users
let followed = client.get_followed_users().await?;
for user in followed {
println!("{}: {}", user.pubky, user.name.unwrap_or_default());
}
PrivateMessengerClientThe main client for interacting with the Pubky messaging system.
new(keypair: Keypair) -> Result<Self> - Create a new client from a keypairfrom_recovery_file(bytes: &[u8], passphrase: &str) -> Result<Self> - Create from recovery filesign_in(&self) -> Result<Session> - Sign in to the homeserversend_message(&self, recipient: &PublicKey, content: &str) -> Result<String> - Send encrypted messageget_messages(&self, other: &PublicKey) -> Result<Vec<DecryptedMessage>> - Get conversation messagesget_own_profile(&self) -> Result<Option<PubkyProfile>> - Get user's profileget_followed_users(&self) -> Result<Vec<FollowedUser>> - Get followed userspublic_key(&self) -> PublicKey - Get the client's public keypublic_key_string(&self) -> String - Get public key as stringDecryptedMessage - A decrypted message with sender, content, timestamp, and verification statusPubkyProfile - User profile information (name, bio, image, status)FollowedUser - Information about a followed userAll methods return Result<T> where the error type is anyhow::Error. This provides flexible error handling with context. Common error scenarios include:
Example error handling:
match client.send_message(&recipient, "Hello").await {
Ok(message_id) => println!("Message sent: {}", message_id),
Err(e) => eprintln!("Failed to send message: {}", e),
}
Check the examples/ directory for more detailed examples:
# Run the basic usage example
cargo run --example basic_usage -- path/to/recovery.pkarr [optional_recipient_pubky]
This example demonstrates:
# Send a message to a specific pubky
cargo run --example send_message -- path/to/recovery.pkarr recipient_pubky "Your message here"
# Example:
cargo run --example send_message -- recovery.pkarr pk:q9x5sfjbpajdebk45b9jashgb86iem7rnwpmu16px3ens63xzwro "Hello there!"
This example:
# Read all messages from a conversation with a specific pubky
cargo run --example read_messages -- path/to/recovery.pkarr peer_pubky
# Example:
cargo run --example read_messages -- recovery.pkarr pk:q9x5sfjbpajdebk45b9jashgb86iem7rnwpmu16px3ens63xzwro
This example:
# Start an interactive chat session with a specific pubky
cargo run --example conversation -- path/to/recovery.pkarr peer_pubky
# Example:
cargo run --example conversation -- recovery.pkarr pk:q9x5sfjbpajdebk45b9jashgb86iem7rnwpmu16px3ens63xzwro
This example provides a real-time chat experience:
Features:
This library implements end-to-end encryption using:
Messages are encrypted with a shared secret derived from the sender and recipient's keypairs.
MIT