This commit addresses all identified issues in channel management: 1. **Fix timeline cleanup on channel removal** (channels.rs:97-123) - remove_channel() now properly unsubscribes from timeline - Prevents memory leaks from orphaned timeline subscriptions - Ensures proper cleanup when deleting channels 2. **Add bounds checking on deserialization** (storage/channels.rs:138-158) - Validates selected index after loading channels from disk - Prevents out-of-bounds panics if saved state is corrupted - Handles edge case of empty channel lists gracefully 3. **Implement channel deletion UI** (channel_sidebar.rs:19-25, 273-287) - Added DeleteChannel action to sidebar - Right-click context menu shows "Delete Channel" option - Only allows deletion if more than one channel exists - Properly cleans up timeline and saves state after deletion 4. **Implement channel editing UI** (channel_dialog.rs:5-44, channel_sidebar.rs:19-25) - Added EditChannel action and editing_index field to dialog - open_for_edit() method pre-fills dialog with existing data - Dialog title changes to "Edit Channel" in edit mode - Button changes from "Create" to "Save" when editing - Context menu shows "Edit Channel" option 5. **Add channel editing logic** (channels.rs:99-132, app.rs:476-524) - edit_channel() method updates channel data - Unsubscribes from old timeline if hashtags changed - Re-subscribes to new timeline with updated hashtags - Properly updates router with new timeline kind 6. **Auto-select newly created channels** (channels.rs:93-97) - add_channel() now automatically selects the new channel - Improves UX by immediately showing the channel user just created - Eliminates confusion about which channel is active 7. **Optimize storage saves** (app.rs:1290-1296) - Removed automatic save on every channel selection - Channel selection state will be saved on app close instead - Prevents excessive disk I/O from rapid channel switching - Saves only on create, edit, and delete operations All changes tested and build succeeds without errors.
Notedeck
A modern, multiplatform Nostr client built with Rust. Notedeck provides a feature-rich experience for interacting with the Nostr protocol on both desktop and Android platforms.
✨ Features
- Multi-column Layout: TweetDeck-style interface for viewing different Nostr content
- Dave AI Assistant: AI-powered assistant that can search and analyze Nostr content
- Profile Management: View and edit Nostr profiles
- Media Support: View and upload images with GIF support
- Lightning Integration: Zap (tip) content creators with Bitcoin Lightning
- Cross-platform: Works on desktop (Linux, macOS, Windows) and Android
📱 Mobile Support
Notedeck runs smoothly on Android devices with a responsive interface:
🏗️ Project Structure
notedeck
├── crates
│ ├── notedeck - Core library with shared functionality
│ ├── notedeck_chrome - UI container and navigation framework
│ ├── notedeck_columns - TweetDeck-style column interface
│ ├── notedeck_dave - AI assistant for Nostr
│ ├── notedeck_ui - Shared UI components
│ └── tokenator - String token parsing library
🚀 Getting Started
Desktop
To run on desktop platforms:
# Development build
cargo run -- --debug
# Release build
cargo run --release
Android
For Android devices:
# Install required target
rustup target add aarch64-linux-android
# Build and install on connected device
cargo apk run --release -p notedeck_chrome
Android Emulator
- Install Android Studio
- Open 'Device Manager' and create a device with API level
34and ABIarm64-v8a - Start the emulator
- Run:
cargo apk run --release -p notedeck_chrome
🧪 Development
Android Configuration
Customize Android views for testing:
- Copy
example-android-config.jsontoandroid-config.json - Run
make push-android-configto deploy to your device
Setting Up Developer Environment
./scripts/dev_setup.sh
This adds pre-commit hooks for proper code formatting.
📚 Documentation
Detailed developer documentation is available in each crate:
🔄 Release Status
Notedeck is currently in BETA status. For the latest changes, see the CHANGELOG.
Future
Notedeck allows for app development built on top of the performant, built specifically for nostr database nostrdb. An example app written on notedeck is Dave
Building on notedeck dev documentation is also on the roadmap.
🤝 Contributing
Developers
Contributions are welcome! Please check the developer documentation and follow these guidelines:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Translators
Help us bring Notedeck to non-English speakers!
Request to join the Notedeck translations team through Crowdin.
If you do not have a Crowdin account, sign up for one. If you do not see your language, please request it in Crowdin.
🔒 Security
For security issues, please refer to our Security Policy.
📄 License
This project is licensed under the GPL - see license information in individual crates.
👥 Authors
- William Casarin jb55@jb55.com
- kernelkind kernelkind@gmail.com
- And contributors

