Core Principles
The mindset shift required for great Nostr UX.
Principle 1: User-First Design
The Challenge: Protocol capabilities vs. user needs
Nostr’s powerful protocol makes many features technically possible. However, exposing all capabilities to users can create friction:
- Showing relay selection to new users
- Requiring users to understand NIPs
- Displaying technical error messages (“relay wss://… closed connection”)
- Adding features simply because “the protocol supports it”
Result: Complex interfaces that can overwhelm new users.
The Principle:
Prioritize user experience over technical capabilities. Ship working experiences, then add features.
What This Means:
- Hide protocol complexity from users by default
- Use plain language, not technical jargon
- Auto-select good defaults instead of forcing configuration
- Expose advanced protocol features only to users who need them
Examples:
❌ Protocol-First Approach:
- Show relay configuration during onboarding
- Require users to understand “Kind 0 metadata events”
- Display raw NIP numbers in UI (“Enable NIP-46 signers”)
✅ UX-First Approach:
- Auto-select reliable relays, hide configuration in settings
- Just show “Edit Profile” (users don’t need to know about Kind 0)
- Say “Use separate app for keys” (users don’t need to know about NIP-46)
Principle 2: Ship Small, Validate Fast
The Problem: “We’ll fix UX after we add more features”
Developers build feature after feature without validating if they’re solving real problems. Result: Feature bloat, complex UIs, bugs in core interactions.
The Principle:
Validate core interactions work before adding new features.
What This Means:
- Start with minimal feature set that delivers value
- Measure if core interactions are reliable (posting, replying, loading feeds)
- Validate features solve real problems before building them
- Add features one at a time, measuring impact
Examples:
❌ Feature-First Approach:
- Build 20 features in alpha release
- Add zaps, communities, long-form, DMs, marketplace all at once
- Ship without measuring which features actually get used
✅ Validation-First Approach:
- Launch with: post, reply, follow, feed
- Measure: Do posts succeed? Do replies appear? Do feeds load?
- Fix reliability issues before adding zaps
- Add one new feature, measure adoption, validate it works, then add next
The 80/20 Rule:
- 20% of features deliver 80% of value (posting, replying, following, feeds)
- Focus on making that 20% bulletproof before adding the other 80%
Principle 3: Optimize for New Users, Not Power Users
The Problem: “Power users will configure it themselves”
Nostr apps often optimize for power users who understand relays, NIPs, and signers. Result: New users are overwhelmed and abandon before reaching value.
The Principle:
If new users don’t stick around, you’ll never get power users.
What This Means:
- Onboarding must work for people who’ve never heard of Nostr
- Default configuration should be excellent (not just “configurable”)
- Advanced features should be hidden until needed (progressive complexity)
- Measure new user retention, not power user happiness
Examples:
❌ Power-User-First Approach:
- Expose relay configuration during onboarding
- Require understanding of public/private keys
- Show all features in settings (100+ options)
✅ New-User-First Approach:
- Auto-select relays, let power users change later
- Use metaphors (“Username” instead of “Public Key”)
- Show 5 essential settings, hide advanced features in “Advanced” section
Progressive Complexity:
- Start simple (5 settings)
- Add complexity as users gain experience (show “Advanced” after 7 days)
- Let power users opt-in to advanced features (don’t force on everyone)
Principle 4: Perceived Performance > Actual Performance
The Problem: Waiting for relay responses before showing UI updates
Developers wait for relay confirmations before updating the UI. Result: Apps feel slow and unresponsive, even when relays are fast.
The Principle:
Users care about how fast your app feels, not how fast your relays respond.
What This Means:
- Use optimistic UI (show updates immediately, sync in background)
- Show skeleton screens while loading (don’t show blank white screens)
- Cache aggressively (show stale data while fetching fresh data)
- Lazy load non-critical content (load images after text)
Examples:
❌ Actual-Performance Approach:
- Wait for relay confirmation before showing like
- Show blank screen while feed loads
- Load all images before rendering feed
✅ Perceived-Performance Approach:
- Show like immediately, sync in background
- Show skeleton screens + cached posts while fetching
- Render text immediately, lazy load images
The 100ms Rule:
- If an action takes >100ms, show loading indicator
- If it takes >1s, show progress or skeleton
- If it takes >3s, explain what’s happening
Principle 5: Reliability Over Features
The Problem: “It works on my machine”
Developers ship features without validating they work reliably across different relays, network conditions, and devices. Result: Posts disappear, replies don’t show up, follows get lost.
The Principle:
Users need core interactions to work 99% of the time, not 100 cool features that work 80% of the time.
What This Means:
- Measure action success rates (did this post succeed?)
- Write to multiple relays for redundancy
- Verify writes succeeded before confirming to user
- Test on slow networks and unreliable relays
- Monitor error rates in production
Examples:
❌ Feature-First Approach:
- Ship posting without retry logic
- Write to one relay, assume it worked
- No error handling for network failures
✅ Reliability-First Approach:
- Write to 3+ relays with retry logic
- Verify at least 2 writes succeeded
- Show clear error messages on failure
- Let users retry failed actions
The Reliability Hierarchy:
- Posting & replying must work 99%+ of the time (make this bulletproof)
- Following & feeds must work 95%+ of the time (very important)
- Notifications should work 90%+ of the time (important)
- Advanced features can work 80%+ of the time (less critical)
Principle 6: Default to Simplicity
The Problem: “Users might want to configure this”
Developers add configuration options instead of making good default decisions. Result: Overwhelming settings screens, decision fatigue, abandonment.
The Principle:
Make excellent defaults. Add configuration only when validated that users need it.
What This Means:
- Choose the best option by default (don’t force users to choose)
- Reduce settings to the minimum (5 core settings, hide the rest)
- Only add configuration when users ask for it (not preemptively)
- Test defaults with real users (validate they work)
Examples:
❌ Configuration-First Approach:
- 100+ settings in preferences
- Require relay selection during onboarding
- Ask users to configure every aspect of the app
✅ Simplicity-First Approach:
- 5 essential settings visible (theme, notifications, privacy, account, about)
- Auto-select relays (let power users configure later)
- Hide advanced settings until users need them
The Configuration Test:
- For each setting, ask: “What % of users will change this?”
- If <10%: Remove it or use the best default
- If <30%: Hide in “Advanced” section
- If >30%: Keep visible
Principle 7: Evidence-Based Design
The Problem: “I think users would like this”
Decisions based on hunches instead of evidence. Result: Features that don’t solve real problems, wasted development time, poor retention.
The Principle:
Validate with evidence, not hunches. Use research, data, and user feedback.
What This Means:
- Study what works in mainstream apps (competitive analysis)
- Read academic research on social UX (evidence-based design)
- Talk to actual users (user interviews, feedback)
- Measure everything (analytics, success rates, retention)
- A/B test when uncertain (data over opinions)
Sources of Evidence:
- Quantitative data - Retention, DAU, success rates, usage patterns
- Qualitative feedback - User complaints, support tickets, interviews
- Academic research - HCI papers, published studies
- Competitive analysis - What works in TikTok, Instagram, Bluesky
- A/B tests - Test two approaches, measure which works better
Examples:
❌ Hunch-Based Design:
- “I think users want relay configuration”
- “It seems like a good feature”
- “The protocol supports it so we should add it”
✅ Evidence-Based Design:
- “Retention data shows 80% abandon during 15-min onboarding” → Simplify onboarding
- “Research shows ’try before you buy’ reduces friction” → Add guest browse mode
- “User complaints mention ‘posts disappearing’” → Fix write verification
Applying These Principles
When making any decision:
- Does this make the core experience simpler? (Simplicity)
- Have we validated users need this? (Evidence-based)
- Does this help new users or just power users? (New user focus)
- Are we exposing protocol complexity? (UX over purity)
- Can we measure if it’s working? (Validation)
- Is the core experience reliable? (Reliability over features)
If you can’t confidently answer these questions, reconsider the feature.
Summary
The 7 Core Principles:
- User-First Design - Prioritize user experience over technical capabilities
- Ship Small, Validate Fast - Validate core interactions before adding features
- Optimize for New Users - If new users don’t stick, you’ll never get power users
- Perceived Performance > Actual Performance - Feel fast even when slow
- Reliability Over Features - Core interactions must work 99% of the time
- Default to Simplicity - Make excellent defaults, add configuration only when needed
- Evidence-Based Design - Validate with data, not hunches
Remember: Great UX is the gateway to the protocol’s power. Ship working experiences, then add features.