Dart Nostr Development Kit (NDK)

Build Status Coverage Pub License

NDK (Nostr Development Kit) is a Dart library that enhances the Nostr development experience.
NDK supplies you with high-level usecases like lists or metadata while still allowing you to use low-level queries enhanced with inbox/outbox (gossip) by default.
Our Target is to make it easy to build constrained Nostr clients, particularly for mobile devices.

Apps using NDK

➑️ Getting Started πŸ”—

Changelog πŸ”—


Core Features

Network & Data Management

  • Automatic relay discovery using inbox/outbox (gossip) model for optimal relay selection
  • Flexible data fetching with query (one-time) and subscription (real-time) modes
  • Smart caching to reduce network bandwidth and improve performance
  • Concurrent event streaming from both cache and network
  • Request coverage control to specify desired relay coverage per request

Account & Authentication

  • Multiple signer support: Built-in (BIP-340), Amber, NIP-07 (web), and NIP-46 (remote signing/bunkers)
  • Account management with state tracking and multiple account support
  • Relay authentication (NIP-42) for private relay access

High-Level Use Cases

  • Metadata management: Query and update user profiles with automatic caching
  • Contact lists: Follow/unfollow users and manage contact lists
  • NIP-51 lists: Public and private relay sets, mute lists, and custom lists
  • Gift wrap (NIP-59): Encrypted, metadata-obscured messaging
  • Zaps (NIP-57): Lightning payments on Nostr
  • Nostr Wallet Connect (NIP-47): Integrate Lightning wallets
  • Domain verification (NIP-05): Verify and cache Nostr addresses
  • File management: Upload, download, and delete files using Blossom servers
  • Connectivity: Get notified about connection issues
  • Proof of Work (NIP-13): Create and verify PoW events

Developer Experience

  • Pluggable architecture: Bring your own cache, verifier, or signer, replace any component
  • Multiple database options: In-memory, Isar, ObjectBox, Sembast
  • Event verification: BIP-340 or Rust-based (recommended for performance)
  • Comprehensive logging with configurable log levels and outputs
  • Clean architecture for maintainability and extensibility

not Included

  • ready to use feeds, you have to build them on your own (🚫 not planned)
  • create && manage keypairs. You have to provide them (🚫 not planned)
  • threading, you can do this on your own if you move ndk or only the event_verifier into its own thread (πŸ”œ planned)
  • support for request overrides (you have to close and reopen requests) (🚫 not planned)

Libraries

config/blossom_config
config/bootstrap_relays
config/broadcast_defaults
config/logger_defaults
config/metadata_defaults
config/nip_05_defaults
config/relay_defaults
config/request_defaults
config/rx_defaults
config/user_relay_list_defaults
data_layer/data_sources/http_request
data_layer/data_sources/websocket
data_layer/data_sources/websocket_client
data_layer/models/nip_05_model
data_layer/repositories/blossom/blossom_impl
data_layer/repositories/cache_manager/mem_cache_manager
data_layer/repositories/lnurl_http_impl
data_layer/repositories/nip_05_http_impl
data_layer/repositories/nostr_transport/websocket_client_nostr_transport
data_layer/repositories/nostr_transport/websocket_client_nostr_transport_factory
data_layer/repositories/nostr_transport/websocket_nostr_transport
data_layer/repositories/nostr_transport/websocket_nostr_transport_factory
data_layer/repositories/signers/bip340_event_signer
data_layer/repositories/signers/nip46_event_signer
data_layer/repositories/verifiers/bip340_event_verifier
domain_layer/entities/account
domain_layer/entities/blossom_blobs
domain_layer/entities/broadcast_response
domain_layer/entities/broadcast_state
domain_layer/entities/connection_source
domain_layer/entities/contact_list
domain_layer/entities/event_filter
domain_layer/entities/filter
domain_layer/entities/global_state
domain_layer/entities/jit_engine_relay_connectivity_data
domain_layer/entities/metadata
domain_layer/entities/ndk_file
domain_layer/entities/ndk_request
domain_layer/entities/nip_01_event
domain_layer/entities/nip_05
domain_layer/entities/nip_51_list
domain_layer/entities/nip_65
domain_layer/entities/pubkey_mapping
domain_layer/entities/read_write
domain_layer/entities/read_write_marker
domain_layer/entities/relay
domain_layer/entities/relay_connectivity
domain_layer/entities/relay_info
domain_layer/entities/relay_set
domain_layer/entities/relay_stats
domain_layer/entities/request_response
domain_layer/entities/request_state
domain_layer/entities/tuple
domain_layer/entities/user_relay_list
domain_layer/repositories/blossom
domain_layer/repositories/cache_manager
domain_layer/repositories/event_signer
domain_layer/repositories/event_verifier
domain_layer/repositories/lnurl_transport
domain_layer/repositories/nip_05_repo
domain_layer/repositories/nostr_transport
domain_layer/usecases/accounts/accounts
domain_layer/usecases/broadcast/broadcast
domain_layer/usecases/bunkers/bunkers
domain_layer/usecases/bunkers/models/bunker_connection
domain_layer/usecases/bunkers/models/bunker_request
domain_layer/usecases/bunkers/models/nostr_connect
domain_layer/usecases/cache_read/cache_read
domain_layer/usecases/cache_write/cache_write
domain_layer/usecases/connectivity/connectivity
domain_layer/usecases/engines/network_engine
domain_layer/usecases/files/blossom
domain_layer/usecases/files/blossom_user_server_list
domain_layer/usecases/files/files
domain_layer/usecases/follows/follows
domain_layer/usecases/gift_wrap/gift_wrap
domain_layer/usecases/jit_engine/jit_engine
domain_layer/usecases/jit_engine/relay_jit_broadcast_strategies/relay_jit_broadcast_all
domain_layer/usecases/jit_engine/relay_jit_broadcast_strategies/relay_jit_broadcast_other_read
domain_layer/usecases/jit_engine/relay_jit_broadcast_strategies/relay_jit_broadcast_own
domain_layer/usecases/jit_engine/relay_jit_broadcast_strategies/relay_jit_broadcast_specific
domain_layer/usecases/jit_engine/relay_jit_request_strategies/relay_jit_blast_all_strategy
domain_layer/usecases/jit_engine/relay_jit_request_strategies/relay_jit_pubkey_strategy
domain_layer/usecases/jit_engine/relay_jit_request_strategies/relay_jit_specific_strategy
domain_layer/usecases/jit_engine/relay_jit_request_strategies/relay_jit_strategies_shared
domain_layer/usecases/lists/lists
domain_layer/usecases/lnurl/lnurl
domain_layer/usecases/lnurl/lnurl_response
domain_layer/usecases/metadatas/metadatas
domain_layer/usecases/nip05/verify_nip_05
domain_layer/usecases/nip42/auth_event
domain_layer/usecases/nwc/consts/bitcoin_network
domain_layer/usecases/nwc/consts/budget_renewal_period
domain_layer/usecases/nwc/consts/error_code
domain_layer/usecases/nwc/consts/nwc_kind
domain_layer/usecases/nwc/consts/nwc_method
domain_layer/usecases/nwc/consts/transaction_type
domain_layer/usecases/nwc/nostr_wallet_connect_uri
domain_layer/usecases/nwc/nwc
domain_layer/usecases/nwc/nwc_connection
domain_layer/usecases/nwc/nwc_notification
domain_layer/usecases/nwc/requests/cancel_hold_invoice
domain_layer/usecases/nwc/requests/get_balance
domain_layer/usecases/nwc/requests/get_budget
domain_layer/usecases/nwc/requests/get_info
domain_layer/usecases/nwc/requests/list_transactions
domain_layer/usecases/nwc/requests/lookup_invoice
domain_layer/usecases/nwc/requests/make_hold_invoice
domain_layer/usecases/nwc/requests/make_invoice
domain_layer/usecases/nwc/requests/multi_pay_invoice
domain_layer/usecases/nwc/requests/multi_pay_keysend
domain_layer/usecases/nwc/requests/nwc_request
domain_layer/usecases/nwc/requests/pay_invoice
domain_layer/usecases/nwc/requests/pay_keysend
domain_layer/usecases/nwc/requests/settle_hold_invoice
domain_layer/usecases/nwc/responses/get_balance_response
domain_layer/usecases/nwc/responses/get_budget_response
domain_layer/usecases/nwc/responses/get_info_response
domain_layer/usecases/nwc/responses/list_transactions_response
domain_layer/usecases/nwc/responses/lookup_invoice_response
domain_layer/usecases/nwc/responses/make_invoice_response
domain_layer/usecases/nwc/responses/nwc_response
domain_layer/usecases/nwc/responses/pay_invoice_response
domain_layer/usecases/nwc/tlv_record
domain_layer/usecases/relay_manager
domain_layer/usecases/relay_sets/relay_sets
domain_layer/usecases/relay_sets_engine
domain_layer/usecases/requests/concurrency_check
domain_layer/usecases/requests/requests
domain_layer/usecases/requests/verify_event_stream
domain_layer/usecases/stream_response_cleaner/stream_response_cleaner
domain_layer/usecases/user_relay_lists/user_relay_lists
domain_layer/usecases/zaps/invoice_response
domain_layer/usecases/zaps/zap_receipt
domain_layer/usecases/zaps/zap_request
domain_layer/usecases/zaps/zaps
entities
exports all entities, intended usage: import 'package:ndk/entities.dart' as ndk_entities;
ndk
presentation_layer/init
presentation_layer/ndk
presentation_layer/ndk_config
shared/bloom_filter/bloom_filter
shared/bloom_filter/bloom_filter_prehash
shared/event_filters/nip51_mute_event_filter
shared/event_filters/tag_count_event_filter
shared/helpers/list_casting
shared/helpers/relay_helper
shared/logger/console_output
shared/logger/log_color
shared/logger/log_event
shared/logger/log_level
shared/logger/log_output
shared/logger/logger
shared/logger/ndk_logger
shared/net/user_agent
shared/net/user_agent_io
shared/net/user_agent_stub
shared/nips/nip01/bip340
shared/nips/nip01/client_msg
shared/nips/nip01/helpers
shared/nips/nip01/key_pair
shared/nips/nip04/nip04
shared/nips/nip09/deletion
shared/nips/nip13/nip13
shared/nips/nip19/hrps
shared/nips/nip19/nip19
shared/nips/nip25/reactions
shared/nips/nip44/nip44
shared/nips/nip44/utils
shared/nips/nip50/nip50
shared/nips/nip65/relay_ranking