import { useSeoMeta } from '@unhead/react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Smartphone, Shield, ExternalLink, Star, CheckCircle2, Info, Apple, Chrome } from 'lucide-react'; // Platform detection const isAndroid = typeof navigator !== 'undefined' && /Android/i.test(navigator.userAgent); const isIOS = typeof navigator !== 'undefined' && /iPhone|iPad|iPod/i.test(navigator.userAgent); const isMobile = isAndroid || isIOS; interface SignerApp { name: string; description: string; features: string[]; url: string; recommended?: boolean; platforms: ('android' | 'ios' | 'web' | 'desktop')[]; protocol?: string; } const androidSigners: SignerApp[] = [ { name: 'Amber', description: 'Native Android signer focused on security and ease of use. The best choice for Android users.', features: ['Native app', 'Multiple key support', 'Event signing', 'Secure key storage'], url: 'https://github.com/greenart7c3/Amber', recommended: true, platforms: ['android'], protocol: 'NIP-55', }, { name: 'Nsec.app', description: 'Cross-platform remote signer that acts as a secure vault for your keys.', features: ['Remote signing', 'Works with any client', 'Cross-device sync'], url: 'https://nsec.app', platforms: ['android', 'ios', 'web'], protocol: 'NIP-46', }, { name: 'Nostria Signer', description: 'Remote signer app with keys stored in secure device storage.', features: ['Secure storage', 'Remote signing', 'Multi-key support'], url: 'https://nostria.app', platforms: ['android', 'ios'], protocol: 'NIP-46', }, { name: 'Nowser', description: 'Multi-auth signer supporting both browser extension and remote signing protocols.', features: ['NIP-07 support', 'NIP-46 support', 'Flexible signing'], url: 'https://nowser.app', platforms: ['android', 'ios'], protocol: 'NIP-07 / NIP-46', }, ]; const iosSigners: SignerApp[] = [ { name: 'Nsec.app', description: 'The best option for iOS. Use it as a remote signer with any Nostr client.', features: ['Remote signing', 'Works with any client', 'Cross-device sync'], url: 'https://nsec.app', recommended: true, platforms: ['android', 'ios', 'web'], protocol: 'NIP-46', }, { name: 'Nowser (TestFlight)', description: 'iOS signer available via TestFlight with signing capabilities similar to Android.', features: ['NIP-07 support', 'NIP-46 support', 'Native iOS app'], url: 'https://testflight.apple.com/join/nowser', platforms: ['ios'], protocol: 'NIP-07 / NIP-46', }, { name: 'Nostria Signer', description: 'Remote signer with secure key storage on your device.', features: ['Secure storage', 'Remote signing', 'Multi-key support'], url: 'https://nostria.app', platforms: ['android', 'ios'], protocol: 'NIP-46', }, ]; const browserSigners: SignerApp[] = [ { name: 'nos2x', description: 'Simple and reliable browser extension for signing Nostr events.', features: ['Lightweight', 'Easy to use', 'Chrome/Brave/Edge support'], url: 'https://chrome.google.com/webstore/detail/nos2x/kpgefcfmnafjgpblomihpgmejjdanjjp', recommended: true, platforms: ['web'], protocol: 'NIP-07', }, { name: 'Alby', description: 'Bitcoin Lightning wallet with built-in Nostr key management and WebLN.', features: ['Lightning payments', 'Nostr signing', 'WebLN support', 'NWC support'], url: 'https://getalby.com', platforms: ['web', 'desktop'], protocol: 'NIP-07', }, { name: 'Flamingo', description: 'Nostr-focused browser extension with clean interface.', features: ['Nostr signing', 'Clean UI', 'Privacy-focused'], url: 'https://www.flamingowallet.com', platforms: ['web'], protocol: 'NIP-07', }, { name: 'Kiwi Browser + Extension', description: 'On Android/GrapheneOS, use Kiwi Browser to load nos2x or Alby extensions.', features: ['Extension support on mobile', 'Full browser experience', 'Works on GrapheneOS'], url: 'https://kiwibrowser.com', platforms: ['android'], protocol: 'NIP-07', }, ]; function SignerCard({ signer }: { signer: SignerApp }) { return (
{signer.name} {signer.recommended && ( Recommended )} {signer.protocol && ( {signer.protocol} )}
{signer.description}
{signer.features.map((feature) => ( {feature} ))}
); } function PlatformSection({ icon: Icon, title, description, signers, highlighted, }: { icon: React.ComponentType<{ className?: string }>; title: string; description: string; signers: SignerApp[]; highlighted?: boolean; }) { return (

{title}

{highlighted && ( Your Platform )}

{description}

{signers.map((signer) => ( ))}
); } export default function SignersPage() { useSeoMeta({ title: 'Signer Apps - Secure Your Nostr Keys | SkateSpots', description: 'Learn about signer apps that keep your Nostr keys secure. Find the best option for Android, iOS, or desktop browsers.', }); // Determine platform order - show user's platform first const platformOrder = isAndroid ? ['android', 'ios', 'browser'] as const : isIOS ? ['ios', 'android', 'browser'] as const : ['browser', 'android', 'ios'] as const; return ( <>
{/* Hero Section */}
Security Guide

Protect Your{' '} Nostr Keys

Signer apps keep your private keys secure by signing events without exposing them. Instead of pasting your key into every app, let a signer handle it safely.

Why use a signer? Your Nostr private key is like a password that can never be changed. A signer app keeps it safe while letting you use any Nostr app.
{/* Signer Sections */}
{platformOrder.map((platform, index) => { if (platform === 'android') { return ( ); } if (platform === 'ios') { return ( ); } return ( ); })} {/* Protocol Info */}

Understanding Protocols

NIP-07 Browser extension standard. The extension injects signing capabilities into web apps. Used by Alby, nos2x, Flamingo, and similar extensions. NIP-46 Remote signing protocol ("bunker"). Your signer app approves requests from other apps without sharing your keys. Used by Nsec.app, Nostria, and Nowser. NIP-55 Android-specific signer protocol. Native apps can request signatures from Amber without exposing keys. The most seamless Android experience. Which to choose? Android: Amber (NIP-55) for native apps
iOS: Nsec.app (NIP-46) for best compatibility
Desktop: Alby, nos2x, or Flamingo (NIP-07)
); }