browser-signer-proxy
Proxy to use Nostr Browser signer (NIP-07) in native applications.
This is a re-implementation of nostr-browser-signer-proxy
using the smol async runtime instead of tokio.
Description
This crate provides a local HTTP proxy that communicates with a NIP-07 browser extension (e.g., Alby, nos2x) running in a browser tab. Native applications can use this proxy to request public keys, sign events, and perform NIP-04/NIP-44 encryption/decryption through the browser extension.
The HTTP server is implemented with a minimal, dependency-free approach using smol::net::TcpListener
and manual HTTP/1.1 parsing — avoiding heavy HTTP framework dependencies entirely.
Usage
use browser_signer_proxy::prelude::*;
async fn example() -> Result<(), Error> {
// Create the proxy with default options (localhost:7400)
let proxy = BrowserSignerProxy::new(BrowserSignerProxyOptions::default());
// Open the proxy URL in a browser
webbrowser::open(&proxy.url())?;
// Start the proxy server
proxy.start().await?;
// Use it as an async Nostr signer
let public_key = proxy.get_public_key_async().await?;
println!("Connected with public key: {public_key}");
Ok(())
}
Differences from the tokio-based version
| Feature | tokio (original) | smol (this crate) |
|---|---|---|
| Async runtime | tokio |
smol |
| HTTP server | hyper |
smol::net::TcpListener + manual HTTP/1.1 |
| Mutex | tokio::sync::Mutex |
smol::lock::Mutex |
| Shutdown signal | tokio::sync::Notify |
event_listener::Event |
| Request-response channel | tokio::sync::oneshot |
smol::channel::bounded(1) |
| Timeout | tokio::time::timeout |
smol::future::or + smol::Timer |
| Task spawning | tokio::spawn |
smol::spawn |
License
This project is distributed under the MIT software license.