A Tinder-like profile discovery app for the Nostr protocol, built with Flutter. Swipe through profiles, follow interesting people, and connect with the decentralized social network.
- Swipeable Interface: Browse profiles with an intuitive card-swiping interface
- Smart Buffering: Pre-fetches profiles for seamless browsing
- Quality Filtering: Only shows profiles with valid images and content
- Pull to Refresh: Easily refresh the profile feed
- Flexible Login: Support for both nsec and hex private keys
- Key Generation: Create new Nostr identities in-app
- Secure Storage: Keys are encrypted and stored securely
- Guest Mode: Browse profiles without logging in
- Follow/Unfollow: Build your network with instant UI feedback
- Profile Views: See detailed profiles with bio, website, and verification status
- Recent Posts: View formatted notes with rich content support
- Direct Messaging: Send encrypted messages using NIP-44 standard
- @Mentions: Properly formatted and clickable user mentions
- Media Display: Inline images with full-screen viewer
- Link Detection: Automatic URL formatting and click handling
- Share Notes: Share posts via system share sheet or copy links
- Discarded Profiles: Track and restore profiles you've passed on
- Dark Mode: Toggle between light and dark themes
- Profile Management: View your public key and manage authentication
- Flutter SDK (3.32.0 or higher)
- Dart SDK (3.8.0 or higher)
- iOS: Xcode 14+ and iOS 12+
- Android: Android Studio and SDK 21+
- Web: Chrome or any modern browser
-
Clone the repository
git clone https://github.com/Chardot/nostrface.git cd nostrface -
Install dependencies
flutter pub get
-
Run the app
For iOS:
flutter run -d ios
For Android:
flutter run -d android
For Web:
flutter run -d chrome
-
iOS
flutter build ios --release
Then open
ios/Runner.xcworkspacein Xcode to archive and distribute. -
Android
flutter build apk --release # or for app bundle: flutter build appbundle --release -
Web
flutter build web --release
The build output will be in
build/web/
nostrface/
├── lib/
│ ├── main.dart # App entry point
│ ├── core/ # Core functionality
│ │ ├── models/ # Data models
│ │ ├── services/ # Business logic
│ │ ├── providers/ # State management
│ │ └── utils/ # Utilities
│ ├── features/ # Feature modules
│ │ ├── auth/ # Authentication
│ │ ├── profile_discovery/# Main swipe interface
│ │ ├── profile_view/ # Profile details
│ │ ├── direct_messages/ # Messaging
│ │ └── settings/ # App settings
│ └── shared/ # Shared widgets
├── test/ # Unit tests
└── integration_test/ # Integration tests
- State Management: Riverpod
- Navigation: GoRouter
- Local Storage: Hive & Flutter Secure Storage
- Networking: WebSocket for Nostr relays
- UI Components: Material Design 3
- Image Loading: CachedNetworkImage
# Run unit tests
flutter test
# Run with coverage
flutter test --coverageNostrFace implements several Nostr Improvement Proposals (NIPs):
- NIP-01: Basic protocol and event format
- NIP-04: Encrypted Direct Messages (legacy support)
- NIP-44: Modern encrypted messaging
- NIP-05: DNS-based verification
- NIP-19: Bech32-encoded entities (npub, nsec, note, nprofile)
- Fork the repository
- Create your 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
This project is licensed under the MIT License - see the LICENSE file for details.
- Built for the Nostr community
- Inspired by Tinder's UX for social discovery
- Uses the nostr Dart package
For questions or support, please open an issue on GitHub.
Note: This app connects to the Nostr network via the wss://relay.nos.social relay.