nospeak is a decentralized Nostr chat client for secure, private messaging. It is easy to use but has state of the art end-to-end encryption without metadata leakage.
Use https://nospeak.chat or download the APK for Android
- Decentralized Chat: Uses Nostr relays without central servers
- Private Messaging: End-to-end encrypted conversations
- Encrypted Media Upload: Share images and videos in chat
- Responsive Design: Works seamlessly on desktop and mobile
- Rich Text: Support for markdown formatting and emojis
- Node.js 18+
- npm or yarn package manager
# Clone the repository git clone https://github.com/your-org/nospeak.git cd nospeak # Install dependencies npm install # Start development server npm run devsrc/ ├── lib/ │ ├── components/ # Svelte components │ ├── core/ # Core business logic │ ├── db/ # Database layer (Dexie) │ ├── stores/ # State management │ └── utils/ # Utility functions ├── routes/ # SvelteKit pages and API routes └── app.html # Main HTML template - ConnectionManager: Handles Nostr relay connections and subscriptions
- MessagingService: Manages message sending/receiving with encryption
- AuthService: Handles user authentication with Nostr keys
- ProfileService: Manages user profiles and metadata
- MessageRepository: Local database storage for messages
- SvelteKit: Modern web framework with SSR support
- TypeScript: Type-safe development
- Dexie: IndexedDB wrapper for local storage
- Nostr Tools: Nostr protocol implementation
- Tailwind CSS: Utility-first CSS framework
Create .env file for local development (restart the server to apply changes):
# Runtime-configurable defaults (served to clients via GET /api/runtime-config) # Relays MUST use wss:// and servers MUST use https:// NOSPEAK_DISCOVERY_RELAYS=wss://nostr.data.haus,wss://relay.damus.io,wss://nos.lol,wss://relay.primal.net,wss://purplepag.es NOSPEAK_DEFAULT_MESSAGING_RELAYS=wss://nostr.data.haus,wss://nos.lol,wss://relay.damus.io NOSPEAK_SEARCH_RELAY=wss://relay.nostr.band NOSPEAK_BLASTER_RELAY=wss://sendit.nosflare.com NOSPEAK_DEFAULT_BLOSSOM_SERVERS=https://blossom.data.haus,https://blossom.primal.net NOSPEAK_WEB_APP_BASE_URL=https://nospeak.chat NOSPEAK_ROBOHASH_BASE_URL=https://robohash.orgThe Node server reads these values from process.env at startup and serves the effective config to the web client via GET /api/runtime-config (same-origin). Update the environment values and recreate the container to apply changes.
services: nospeak: image: nospeak:latest environment: NOSPEAK_DISCOVERY_RELAYS: "wss://nostr.data.haus,wss://relay.damus.io,wss://nos.lol,wss://relay.primal.net,wss://purplepag.es" NOSPEAK_DEFAULT_MESSAGING_RELAYS: "wss://nostr.data.haus,wss://nos.lol,wss://relay.damus.io" NOSPEAK_SEARCH_RELAY: "wss://relay.nostr.band" NOSPEAK_BLASTER_RELAY: "wss://sendit.nosflare.com" NOSPEAK_DEFAULT_BLOSSOM_SERVERS: "https://blossom.data.haus,https://blossom.primal.net" NOSPEAK_WEB_APP_BASE_URL: "https://nospeak.chat" NOSPEAK_ROBOHASH_BASE_URL: "https://robohash.org"Apply changes:
docker compose up -d --force-recreateDefault relays are configured, but users can add custom relays in settings. The app automatically:
- Connects to multiple relays for redundancy
- Handles connection failures with retry logic
- Manages subscription optimization
- All messages are end-to-end encrypted using Nostr's NIP-44
- Private keys never leave the user's device
- Profile metadata is publicly shared as per Nostr protocol
- Local IndexedDB for message history and profiles
- No server-side storage of private data
Nospeak can be packaged as a native Android application using Capacitor.
- Node.js 18+
- Java 17 (for recent Android Gradle plugin versions)
- At least one Android emulator or physical device (Android 8.0 / API 26 or newer)
# Install dependencies npm install # Build web assets and sync to Android project npm run build:android # Build an unsigned APK cd android && ./gradlew clean :app:assembleDebugThe Capacitor configuration (capacitor.config.ts) is set to use the SvelteKit build/android directory as webDir, so the Android app loads the bundled nospeak UI from local assets.
# Build image docker build -t nospeak . # Run container docker run -p 5173:5173 nospeak# Build for production npm run build # Deploy build/ directory to your static host rsync -av build/ user@server:/var/www/nospeak/Nospeak Web implements the following NIPs (Nostr Implementation Proposals):
- NIP-01: Basic Nostr event and client protocol
- NIP-17: Encrypted direct messages and messaging relays
- NIP-19: bech32-encoded entities for keys and identifiers
- NIP-05: Mapping Nostr keys to DNS-based internet identifiers
- NIP-50: Search relays for contact discovery
- NIP-65: Relay list metadata for messaging/mailbox relays
- NIP-25: Reaction events for emoji responses on messages
- NIP-44: Encrypted payloads for direct messages
- NIP-59: Gift wrapper events for DM and media delivery
- NIP-98: HTTP-authenticated media uploads
- NIP-07: Browser extension signer integration
- NIP-55: Android native signer integration (Amber and similar)
GPL v3 License - see LICENSE file for details.