192
crates/notedeck/DEVELOPER.md
Normal file
192
crates/notedeck/DEVELOPER.md
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
# Notedeck Developer Documentation
|
||||||
|
|
||||||
|
This document provides technical details and guidance for developers working with the Notedeck crate.
|
||||||
|
|
||||||
|
## Architecture Overview
|
||||||
|
|
||||||
|
Notedeck is built around a modular architecture that separates concerns into distinct components:
|
||||||
|
|
||||||
|
### Core Components
|
||||||
|
|
||||||
|
1. **App Framework (`app.rs`)**
|
||||||
|
- `Notedeck` - The main application framework that ties everything together
|
||||||
|
- `App` - The trait that specific applications must implement
|
||||||
|
|
||||||
|
2. **Data Layer**
|
||||||
|
- `Ndb` - NostrDB database for efficient storage and querying
|
||||||
|
- `NoteCache` - In-memory cache for expensive-to-compute note data like nip10 structure
|
||||||
|
- `Images` - Image and GIF cache management
|
||||||
|
|
||||||
|
3. **Network Layer**
|
||||||
|
- `RelayPool` - Manages connections to Nostr relays
|
||||||
|
- `UnknownIds` - Tracks and resolves unknown profiles and notes
|
||||||
|
|
||||||
|
4. **User Accounts**
|
||||||
|
- `Accounts` - Manages user keypairs and account information
|
||||||
|
- `AccountStorage` - Handles persistent storage of account data
|
||||||
|
|
||||||
|
5. **Wallet Integration**
|
||||||
|
- `Wallet` - Lightning wallet integration
|
||||||
|
- `Zaps` - Handles Nostr zap functionality
|
||||||
|
|
||||||
|
6. **UI Components**
|
||||||
|
- `NotedeckTextStyle` - Text styling utilities
|
||||||
|
- `ColorTheme` - Theme management
|
||||||
|
- Various UI helpers
|
||||||
|
|
||||||
|
## Key Concepts
|
||||||
|
|
||||||
|
### Note Context and Actions
|
||||||
|
|
||||||
|
Notes have associated context and actions that define how users can interact with them:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub enum NoteAction {
|
||||||
|
Reply(NoteId), // Reply to a note
|
||||||
|
Quote(NoteId), // Quote a note
|
||||||
|
Hashtag(String), // Click on a hashtag
|
||||||
|
Profile(Pubkey), // View a profile
|
||||||
|
Note(NoteId), // View a note
|
||||||
|
Context(ContextSelection), // Context menu options
|
||||||
|
Zap(ZapAction), // Zap (tip) interaction
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Relay Management
|
||||||
|
|
||||||
|
Notedeck handles relays through the `RelaySpec` structure, which implements NIP-65 functionality for marking relays as read or write.
|
||||||
|
|
||||||
|
### Filtering and Subscriptions
|
||||||
|
|
||||||
|
The `FilterState` enum manages the state of subscriptions to Nostr relays:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub enum FilterState {
|
||||||
|
NeedsRemote(Vec<Filter>),
|
||||||
|
FetchingRemote(UnifiedSubscription),
|
||||||
|
GotRemote(Subscription),
|
||||||
|
Ready(Vec<Filter>),
|
||||||
|
Broken(FilterError),
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development Workflow
|
||||||
|
|
||||||
|
### Setting Up Your Environment
|
||||||
|
|
||||||
|
1. Clone the repository
|
||||||
|
2. Build with `cargo build`
|
||||||
|
3. Test with `cargo test`
|
||||||
|
|
||||||
|
### Creating a New Notedeck App
|
||||||
|
|
||||||
|
1. Import the notedeck crate
|
||||||
|
2. Implement the `App` trait
|
||||||
|
3. Use the `Notedeck` struct as your application framework
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use notedeck::{App, Notedeck, AppContext};
|
||||||
|
|
||||||
|
struct MyNostrApp {
|
||||||
|
// Your app-specific state
|
||||||
|
}
|
||||||
|
|
||||||
|
impl App for MyNostrApp {
|
||||||
|
fn update(&mut self, ctx: &mut AppContext<'_>, ui: &mut egui::Ui) {
|
||||||
|
// Your app's UI and logic here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let notedeck = Notedeck::new(...).app(MyNostrApp { /* ... */ });
|
||||||
|
// Run your app
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Working with Notes
|
||||||
|
|
||||||
|
Notes are the core data structure in Nostr. Here's how to work with them:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// Get a note by ID
|
||||||
|
let txn = Transaction::new(&ndb).expect("txn");
|
||||||
|
if let Ok(note) = ndb.get_note_by_id(&txn, note_id.bytes()) {
|
||||||
|
// Process the note
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a cached note
|
||||||
|
let cached_note = note_cache.cached_note_or_insert(note_key, ¬e);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Adding Account Management
|
||||||
|
|
||||||
|
Account management is handled through the `Accounts` struct:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// Add a new account
|
||||||
|
let action = accounts.add_account(keypair);
|
||||||
|
action.process_action(&mut unknown_ids, &ndb, &txn);
|
||||||
|
|
||||||
|
// Get the current account
|
||||||
|
if let Some(account) = accounts.get_selected_account() {
|
||||||
|
// Use the account
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Topics
|
||||||
|
|
||||||
|
### Zaps Implementation
|
||||||
|
|
||||||
|
Notedeck implements the zap (tipping) functionality according to the Nostr protocol:
|
||||||
|
|
||||||
|
1. Creates a zap request note (kind 9734)
|
||||||
|
2. Fetches a Lightning invoice via LNURL or LUD-16
|
||||||
|
3. Pays the invoice using a connected wallet
|
||||||
|
4. Tracks the zap state
|
||||||
|
|
||||||
|
### Image Caching
|
||||||
|
|
||||||
|
The image caching system efficiently manages images and animated GIFs:
|
||||||
|
|
||||||
|
1. Downloads images from URLs
|
||||||
|
2. Stores them in a local cache
|
||||||
|
3. Handles conversion between formats
|
||||||
|
4. Manages memory usage
|
||||||
|
|
||||||
|
### Persistent Storage
|
||||||
|
|
||||||
|
Notedeck provides several persistence mechanisms:
|
||||||
|
|
||||||
|
- `AccountStorage` - For user accounts
|
||||||
|
- `TimedSerializer` - For settings that need to be saved after a delay
|
||||||
|
- Various handlers for specific settings (zoom, theme, app size)
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
1. **Relay Connection Issues**
|
||||||
|
- Check network connectivity
|
||||||
|
- Verify relay URLs are correct
|
||||||
|
- Look for relay debug messages
|
||||||
|
|
||||||
|
2. **Database Errors**
|
||||||
|
- Ensure the database path is writable
|
||||||
|
- Check for database corruption
|
||||||
|
- Increase map size if needed
|
||||||
|
|
||||||
|
3. **Performance Issues**
|
||||||
|
- Monitor the frame history
|
||||||
|
- Check for large image caches
|
||||||
|
- Consider reducing the number of active subscriptions
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
When contributing to Notedeck:
|
||||||
|
|
||||||
|
1. Follow the existing code style
|
||||||
|
2. Add tests for new functionality
|
||||||
|
3. Update documentation as needed
|
||||||
|
4. Keep performance in mind, especially for mobile targets
|
||||||
30
crates/notedeck/README.md
Normal file
30
crates/notedeck/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Notedeck
|
||||||
|
|
||||||
|
Notedeck is a shared Rust library that provides the core functionality for building Nostr client applications. It serves as the foundation for various Notedeck applications like notedeck_chrome, notedeck_columns, and notedeck_dave.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The Notedeck crate implements common data types, utilities, and logic used across all Notedeck applications. It provides a unified interface for interacting with the Nostr protocol, managing accounts, handling note data, and rendering UI components.
|
||||||
|
|
||||||
|
Key features include:
|
||||||
|
|
||||||
|
- **Nostr Protocol Integration**: Connect to relays, subscribe to events, publish notes
|
||||||
|
- **Account Management**: Handle user accounts, keypairs, and profiles
|
||||||
|
- **Note Handling**: Cache and process notes efficiently
|
||||||
|
- **UI Components**: Common UI elements and styles
|
||||||
|
- **Image Caching**: Efficient image and GIF caching system
|
||||||
|
- **Wallet Integration**: Lightning wallet support with zaps functionality
|
||||||
|
- **Theme Support**: Customizable themes and styles
|
||||||
|
- **Storage**: Persistent storage for settings and data
|
||||||
|
|
||||||
|
## Applications
|
||||||
|
|
||||||
|
This crate serves as the foundation for several Notedeck applications:
|
||||||
|
|
||||||
|
- **notedeck_chrome** - The browser chrome, manages a toolbar for switching between different clients
|
||||||
|
- **notedeck_columns** - A column-based Nostr client interface
|
||||||
|
- **notedeck_dave** - A nostr ai assistant
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
GPLv2
|
||||||
Reference in New Issue
Block a user