docs: add notedeck_columns readme
Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
194
crates/notedeck_columns/DEVELOPER.md
Normal file
194
crates/notedeck_columns/DEVELOPER.md
Normal file
@@ -0,0 +1,194 @@
|
||||
# NoteDeck Columns - Developer Guide
|
||||
|
||||
This document provides detailed information for developers who want to contribute to or understand the NoteDeck Columns codebase.
|
||||
|
||||
## Project Structure
|
||||
|
||||
The NoteDeck Columns codebase is organized as follows:
|
||||
|
||||
```
|
||||
notedeck_columns
|
||||
├── src
|
||||
│ ├── ui # UI components and views
|
||||
│ │ ├── note # Note-related UI components (posts, replies, quotes)
|
||||
│ │ ├── column # Column UI components
|
||||
│ │ ├── search # Search functionality
|
||||
│ │ ├── profile # Profile views and editing
|
||||
│ │ └── ...
|
||||
│ ├── timeline # Timeline data structures and logic
|
||||
│ ├── storage # Persistence mechanisms
|
||||
│ ├── accounts # Account management
|
||||
│ ├── decks # Deck management
|
||||
│ ├── app.rs # Main application logic
|
||||
│ ├── app_creation.rs # Application initialization
|
||||
│ ├── route.rs # Routing system
|
||||
│ ├── nav.rs # Navigation logic
|
||||
│ └── ...
|
||||
```
|
||||
|
||||
## Development Setup
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Rust toolchain (latest stable recommended)
|
||||
- [nostrdb](https://github.com/damus-io/nostrdb) and its dependencies
|
||||
- egui and eframe
|
||||
|
||||
### Building the Project
|
||||
|
||||
1. Clone the repository:
|
||||
```bash
|
||||
git clone https://github.com/damus-io/notedeck
|
||||
cd notedeck
|
||||
```
|
||||
|
||||
2. Build the project:
|
||||
```bash
|
||||
cargo build --release
|
||||
```
|
||||
|
||||
3. Run the application:
|
||||
```bash
|
||||
cargo run --release
|
||||
```
|
||||
|
||||
### Development Mode
|
||||
|
||||
For development, you might want to run with debug symbols:
|
||||
|
||||
```bash
|
||||
cargo run
|
||||
```
|
||||
|
||||
## Core Concepts
|
||||
|
||||
### Decks and Columns
|
||||
|
||||
- **Deck**: A collection of columns that a user can switch between
|
||||
- **Column**: A view into a specific type of Nostr content (timeline, profile, etc.)
|
||||
|
||||
### Timelines
|
||||
|
||||
Timelines are a fundamental concept in NoteDeck Columns:
|
||||
|
||||
- `Timeline`: Represents a stream of notes with filters and subscriptions
|
||||
- `TimelineKind`: Defines the type of timeline (Universe, Profile, Notifications, etc.)
|
||||
- `TimelineTab`: Filtered views of a timeline (e.g., Notes only vs. Notes & Replies)
|
||||
- `TimelineCache`: Caches timeline data for efficient access
|
||||
|
||||
### Navigation and Routing
|
||||
|
||||
- `Route`: Represents application navigation targets
|
||||
- `Router`: Manages the navigation stack for each column
|
||||
- `NavTitle`: Renders the title bar for navigation
|
||||
- `RenderNavAction`: Actions resulting from navigation events
|
||||
|
||||
### UI Components
|
||||
|
||||
The UI is built with egui and organized into components:
|
||||
|
||||
- `PostView`, `PostReplyView`, `QuoteRepostView`: Note creation UI
|
||||
- `NoteView`: Displays Nostr notes
|
||||
- `ProfileView`: Displays and edits profiles
|
||||
- `TimelineView`: Renders timelines in columns
|
||||
- `DesktopSidePanel`: Side navigation panel
|
||||
|
||||
## Key Implementation Details
|
||||
|
||||
### Subscriptions and Realtime Updates
|
||||
|
||||
NoteDeck Columns manages Nostr subscriptions and relay connections to provide realtime updates:
|
||||
|
||||
- `MultiSubscriber`: Handles subscriptions to multiple relays
|
||||
- `Subscriptions`: Tracks application-wide subscriptions
|
||||
- `RelayPool`: Manages relay connections
|
||||
|
||||
### Data Flow
|
||||
|
||||
1. User actions create routes or trigger navigation
|
||||
2. Routes are mapped to timeline kinds or other UI views
|
||||
3. Timelines query nostrdb for notes matching their filters
|
||||
4. UI components render the note data
|
||||
5. Subscriptions keep the data updated in realtime
|
||||
|
||||
### State Management
|
||||
|
||||
State is managed at different levels:
|
||||
|
||||
- `Damus`: Contains global application state
|
||||
- `DecksCache`: Holds deck and column configurations
|
||||
- `TimelineCache`: Caches timeline data
|
||||
- Various component-specific state structures
|
||||
|
||||
## Testing
|
||||
|
||||
Run the test suite:
|
||||
|
||||
```bash
|
||||
cargo test
|
||||
```
|
||||
|
||||
The codebase includes unit tests for critical components.
|
||||
|
||||
## Common Tasks
|
||||
|
||||
### Adding a New Column Type
|
||||
|
||||
1. Add a new variant to `TimelineKind` enum in `timeline/kind.rs`
|
||||
2. Implement the necessary filter logic
|
||||
3. Update the serialization and parsing methods
|
||||
4. Add UI support in the AddColumn view
|
||||
|
||||
### Adding UI Components
|
||||
|
||||
1. Create a new Rust file in the appropriate ui directory
|
||||
2. Implement the component using egui
|
||||
3. Connect it to the routing system if needed
|
||||
|
||||
### Implementing New Features
|
||||
|
||||
When implementing new features:
|
||||
|
||||
1. Start by understanding the relevant parts of the codebase
|
||||
2. Look for similar implementations as reference
|
||||
3. Follow the existing patterns for state management and UI components
|
||||
4. Add appropriate tests
|
||||
5. Update documentation
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
- **Render Issues**: Check the egui-related code for layout problems
|
||||
- **Data Freshness**: Verify subscription and filter setup
|
||||
- **Performance**: Look for inefficient queries or rendering
|
||||
|
||||
### Debugging
|
||||
|
||||
- Use `tracing` macros (`debug!`, `info!`, `error!`) for logging
|
||||
- Run with `RUST_LOG=debug` for verbose output
|
||||
- Use `cargo expand` to inspect macro expansion
|
||||
|
||||
## Architecture Decisions
|
||||
|
||||
### Why egui?
|
||||
|
||||
egui was chosen for its immediate mode rendering approach and Rust integration, making it well-suited for a responsive multi-column UI.
|
||||
|
||||
### Why nostrdb?
|
||||
|
||||
nostrdb provides high-performance local storage and querying for Nostr events, which is essential for a responsive client.
|
||||
|
||||
### Timeline-centric Design
|
||||
|
||||
The codebase is structured around timelines because they provide a natural abstraction for the different types of Nostr content views needed in a column-based interface.
|
||||
|
||||
## Contributing
|
||||
|
||||
1. Fork the repository
|
||||
2. Create a feature branch: `git checkout -b feature/my-feature`
|
||||
3. Make your changes
|
||||
4. Run tests: `cargo test`
|
||||
5. Submit a pull request
|
||||
|
||||
Please follow the existing code style and patterns.
|
||||
53
crates/notedeck_columns/README.md
Normal file
53
crates/notedeck_columns/README.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# NoteDeck Columns
|
||||
|
||||
A TweetDeck-style multi-column interface for Nostr built with Rust and egui.
|
||||
|
||||
## Overview
|
||||
|
||||
NoteDeck Columns is a specialized UI component of the NoteDeck Nostr client that provides a TweetDeck-inspired multi-column layout for browsing Nostr content. It allows users to create customizable "decks" with multiple columns, each showing different types of Nostr content (home timeline, notifications, hashtags, profiles, etc.).
|
||||
|
||||
## Features
|
||||
|
||||
- **Multi-column layout**: View different Nostr content types side by side
|
||||
- **Customizable decks**: Create and customize multiple decks for different use cases
|
||||
- **Column types**:
|
||||
- Universe (global feed)
|
||||
- Contact lists (follows)
|
||||
- Profiles
|
||||
- Notifications
|
||||
- Hashtags
|
||||
- Threads
|
||||
- Search results
|
||||
- Algorithmic feeds (e.g., last notes per pubkey)
|
||||
- **Interactions**: Post, reply, quote, and zap notes
|
||||
- **Media support**: View and upload images
|
||||
- **Multiple accounts**: Switch between multiple Nostr accounts
|
||||
|
||||
## Getting Started
|
||||
|
||||
NoteDeck Columns is part of the larger NoteDeck ecosystem. To use it:
|
||||
|
||||
1. Clone the NoteDeck repository
|
||||
2. Build the project with Cargo
|
||||
3. Run NoteDeck and select the Columns interface
|
||||
|
||||
See the [DEVELOPER.md](DEVELOPER.md) file for detailed setup instructions.
|
||||
|
||||
## Architecture
|
||||
|
||||
NoteDeck Columns is built using:
|
||||
|
||||
- **Rust**: For performance and type safety
|
||||
- **egui**: For the UI rendering
|
||||
- **nostrdb**: For Nostr data storage and retrieval
|
||||
- **enostr**: For Nostr protocol communication
|
||||
|
||||
The codebase is organized around the concept of timelines, views, and decks, with a column-based UI architecture.
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are welcome! Please see [DEVELOPER.md](DEVELOPER.md) for information on how to set up your development environment and contribute to the project.
|
||||
|
||||
## License
|
||||
|
||||
NoteDeck Columns is licensed under the [GPL v3](LICENSE).
|
||||
Reference in New Issue
Block a user