import { useState } from 'react'; import { useSeoMeta } from '@unhead/react'; import { Link } from 'react-router-dom'; import { Layout } from '@/components/Layout'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogTitle } from '@/components/ui/dialog'; import { useCurrentUser } from '@/hooks/useCurrentUser'; import { useCashu } from '@/hooks/wallet/useCashu'; import { useLocalStorage } from '@/hooks/useLocalStorage'; import { LoginArea } from '@/components/auth/LoginArea'; import { WalletModal } from '@/components/WalletModal'; import { RelayEducation } from '@/components/onboarding/RelayEducation'; import { useToast } from '@/hooks/useToast'; import { cn } from '@/lib/utils'; import { CheckCircle2, Globe, Shield, Zap, MapPin, Calendar, GraduationCap, AlertCircle, ExternalLink, Wallet, ChevronDown, Nut, BookOpen, ShoppingBag, Package, Key, MessageCircle, Lock, Users, Download } from 'lucide-react'; import { FounderFollow } from '@/components/FounderFollow'; // ─── Accordion FAQ ──────────────────────────────────────────────────────────── function FAQ({ q, a }: { q: string; a: React.ReactNode }) { const [open, setOpen] = useState(false); return ( ); } // ─── Collapsible section ────────────────────────────────────────────────────── // Keeps heavier, optional content (Nostr explainer, FAQ) tucked away by default // so the page feels light on arrival — tap to expand. Reduces first-glance // cognitive load without removing anything. function CollapsibleSection({ title, icon, defaultOpen = false, children, }: { title: string; icon?: React.ReactNode; defaultOpen?: boolean; children: React.ReactNode; }) { const [open, setOpen] = useState(defaultOpen); return (
Save your login — do this now
Your recovery code is the only way back into your account. No email, no password reset.
A decentralized skate community. No company owns it. No algorithm buries your spots. No ban hammer. Just skaters.
{/* Feature pills */}Create your free account
No email. No password. Own your identity forever.
You're in! Account created ✓
Your identity is yours — stored in your key, not on our servers.
Login saved — your account is safe to recover.
{body}
{label}
{desc}
The protocol that powers SkateSpots
Nostr is an open protocol — like email, but for social apps. Your account is a cryptographic key pair that you own. No single company controls your account or your data — you choose which relays store it, and you can even run your own. Your identity works across every Nostr app.
Zaps are Bitcoin tips you send directly to a skater who dropped a sick spot, filmed a banger clip, or ran a great session. No platform fee. No middleman. 100% goes to them.
Receive Lightning payments right in the app. No setup.
{hasCashu && cashuBalance > 0 ? (Have Alby, Mutiny, or another wallet? Connect it via NWC.
{user ? (💡 $5 of Bitcoin = hundreds of zaps to spread across the community
nsec is your private key — it's the only proof you own your account. Unlike passwords, there is no "forgot my password". If you lose your nsec, your account is gone forever. When you create an account, download your backup immediately and store it somewhere safe (password manager, written down offline).>}
/>
On desktop: Alby or nos2x browser extensions.
On Android: Amber (best experience with the native app).
On iOS: Nostore or paste your nsec directly (less secure).
You can also log in by pasting your nsec directly — but using a signer extension is safer.
DM the SkateSpots team directly on Nostr, or reach out to our beta coordinator:
Stop scrolling. Get the app. Find a spot. Skate it.
SkateSpots is under active development. You may hit rough edges — that's on us, not you. Report bugs, suggest features, tell us what sucks.
Beta Coordinator
cordn.net → message us
DM on Nostr
npub1yrnuj…
Found a bug? We fix it same day. Your reports make the app better for every skater.