Countdown badges (upcoming tours): - New getCountdown() in TourCard: "In 3 days" / "Tomorrow" / "In 2 weeks" / "Happening now" (pulsing) based on start/end dates, category-tinted - Shown on both compact and full TourCard, and in the TourDetailPage schedule card NIP-05 provider fix (removes obsolete nip05.social): - New single source of truth src/lib/nip05Providers.ts with working, curated providers: nostrcheck.me + nostr.directory (free), Nostr Plebs + nostr.band (paid) - New reusable Nip05Required component (full-page "gate" + inline "banner" variants) listing those providers and deep-linking to /settings?section=nip05 - Wired into CreateTourPage (gate), CreateListingPage (banner) and all four Become* pages (Coach/Filmer/Photographer/Builder) for a consistent prompt - SettingsPage NIP-05 screen now reads from the shared provider list - Updated internal planning docs to match Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
11 KiB
Implementation Plan - SkateSpots Refinements
Date: December 30, 2025
Status: Planning Phase
🐛 CRITICAL FIXES (Priority 1)
1. Fix Signup Key Generation Error
Priority: CRITICAL
Effort: 30-45 minutes
Budget: $3-5
Issue: Error when generating secret key during signup
Root Cause: Need to investigate console error - likely issue with nip19.decode or toast usage
Steps:
- Check SignupDialog.tsx for error in key generation
- Test nip19.decode with generated nsec
- Fix toast.toast() vs toast() usage inconsistency
- Add error boundary and better error handling
- Test complete signup flow end-to-end
Files: src/components/auth/SignupDialog.tsx
🎨 UI/UX IMPROVEMENTS (Priority 2)
2. Consistent UI Framing Across All Devices
Priority: HIGH
Effort: 2-3 hours
Budget: $10-15
Issues:
- Inconsistent padding/margins on mobile vs desktop
- Some elements not properly responsive
- Headers need consistent sizing
- Cards need consistent spacing
Steps:
- Audit all pages for responsive issues
- Standardize container padding (px-4 on mobile, px-6 on desktop)
- Fix header sizing (ensure readable on all devices)
- Ensure cards have consistent max-width and centering
- Test on mobile (375px), tablet (768px), desktop (1920px)
- Fix bottom navigation spacing on notched devices
- Ensure forms are usable on small screens
Files: All page components, Layout.tsx, index.css
3. Day/Night Theme with Actual Contrast
Priority: HIGH
Effort: 1-2 hours
Budget: $5-10
Issue: Currently forced to dark mode, no real light theme option
Steps:
- Create proper light theme CSS variables
- Light theme: White background with neon accents
- Keep neon effects but adjust for light bg (darker neons, subtle glows)
- Ensure text remains readable in both modes
- Update ThemeToggle to actually switch themes
- Test all pages in both light and dark mode
- Ensure minimum 4.5:1 contrast ratio (WCAG AA)
Design:
- Light Mode: White bg (#ffffff), dark neon colors, subtle shadows
- Dark Mode: Black bg (#000000), bright neons, glows (current)
Files: src/index.css, src/components/ThemeToggle.tsx
4. Login Required Notices
Priority: MEDIUM
Effort: 1 hour
Budget: $5
Issue: Features requiring login should show notice before user tries to use them
Steps:
- Add "Login required" badges to event cards if logged out
- Add notice on map page: "Login to add spots/shops"
- Add notice on events page: "Login to create events"
- Add notice on coaches page: "Login to become a coach"
- Style with yellow neon theme
- Make notices dismissible or subtle (not intrusive)
Files: EventsPage.tsx, MapPage.tsx, CoachesPage.tsx, event cards
🔗 LINK & NAVIGATION FIXES (Priority 2)
5. Add Links to Onboarding from Signup
Priority: MEDIUM
Effort: 15 minutes
Budget: $1-2
Steps:
- Add button in SignupDialog welcome step
- "Need help? View our onboarding guide" with link
- Style as secondary/outline button
Files: src/components/auth/SignupDialog.tsx
6. Add nos2x Link to Onboarding
Priority: LOW
Effort: 5 minutes
Budget: $1
Steps:
- Add nos2x to extension list in OnboardingPage
- Format:
{ label: 'nos2x', url: 'https://github.com/fiatjaf/nos2x', note: 'Minimalist Nostr extension.' }
Files: src/pages/OnboardingPage.tsx
7. Add Hyperlinks to Mobile Wallets
Priority: LOW
Effort: 10 minutes
Budget: $1
Steps:
- Find wallet list in OnboardingPage
- Add URLs to all wallets (Wallet of Satoshi, Blink, Zeus, Phoenix, Coinos)
- Make names clickable links
Files: src/pages/OnboardingPage.tsx
8. Fix Plebeian Market Links
Priority: MEDIUM
Effort: 15 minutes
Budget: $1-2
Issue: Multiple confusing links, should have one clear CTA
Steps:
- Remove "Browse Marketplace" internal link
- Keep only "Visit Plebeian Market" external link
- Update OnboardingPage to match
- Link directly to https://plebeian.market
Files: src/pages/MarketplacePage.tsx, src/pages/OnboardingPage.tsx
9. Add OpenStreetMap Credit
Priority: LOW
Effort: 10 minutes
Budget: $1
Steps:
- Add small text overlay on map: "Map data © OpenStreetMap contributors"
- Position in bottom-left corner
- Style: small, gray text with link
- Or add to footer when map is visible
Files: src/components/SpotMap.tsx
⚙️ FEATURE ENHANCEMENTS (Priority 3)
10. NIP-05 Provider Options in Settings
Priority: MEDIUM
Effort: 1-1.5 hours
Budget: $5-8
Steps:
- Create NIP-05 section in SettingsPage
- List 4 providers:
- Free: nostrcheck.me, nostr.directory
- Paid: Nostr Plebs, nostr.band
- Add links and brief descriptions
- Show current NIP-05 if set
- Add "Test your NIP-05" button
- Style with neon theme
Providers to Include (single source of truth: src/lib/nip05Providers.ts):
- nostrcheck.me (Free)
- nostr.directory (Free)
- Nostr Plebs (Paid)
- nostr.band (Paid)
Files: src/pages/SettingsPage.tsx
11. Contact Info for Private/Ask Locals Spots
Priority: MEDIUM
Effort: 45 minutes
Budget: $4-5
Steps:
- Add contactInfo field to CreateSpotPage
- Show only when accessType is 'private' or 'locals'
- Input field: "Contact info (phone, social, etc.)"
- Save as 'contact' tag
- Display on SpotDetailPage for private/locals spots
- Only show to logged-in users
Files: src/pages/CreateSpotPage.tsx, src/pages/SpotDetailPage.tsx, src/lib/types.ts
12. Coach Contact Details & Rating System
Priority: HIGH
Effort: 3-4 hours
Budget: $15-20
Complex Feature - Multiple Parts:
Part A: Contact Information (1 hour, $5)
- Add contactInfo field to BecomeCoachPage
- Save as 'contact' tag
- Show only to verified users (has NIP-05)
- Display with lock icon: "Contact info visible to verified users only"
Part B: Rating System (2-3 hours, $10-15)
- Create new kind for coach reviews (use nostr_generate_kind)
- Create ReviewDialog component
- Add 1-5 star rating
- Add text review
- Parse and display reviews on CoachDetailPage
- Calculate average rating
- Show "X reviews" count
- Only verified users can leave reviews
New Event Kind Needed:
{
"kind": <generated>,
"content": "review text",
"tags": [
["a", "35001:coach-pubkey:identifier"],
["rating", "1-5"],
["t", "coach-review"]
]
}
Files: Multiple - BecomeCoachPage.tsx, CoachDetailPage.tsx, new components, types.ts
13. Shop Ownership Claiming
Priority: MEDIUM
Effort: 1.5-2 hours
Budget: $8-10
Steps:
- Create ClaimShopDialog component
- Add 'claimed_by' tag functionality
- Require NIP-05 to claim
- Show "Claimed by [name]" badge on shops
- Allow original poster OR claimer to edit
- Add verification checkmark for claimed shops
- Handle claim conflicts (first claim wins)
Technical:
- Add
claimedByto SkateSpot interface - Parse 'claimed_by' tag
- Create claim event (adds tag to existing shop)
- Update parseSkateSpot to handle claimed shops
Files: src/pages/SpotDetailPage.tsx, src/lib/types.ts, new ClaimShopDialog component
14. Hide Events from Logged-Out Users
Priority: LOW
Effort: 30 minutes
Budget: $2-3
Issue: Only logged-in users should see event listings
Steps:
- Update EventsPage to check if user is logged in
- Show "Login to view events" message if logged out
- Update homepage to hide event section if logged out
- Add login prompt where events would show
Files: src/pages/EventsPage.tsx, src/pages/Index.tsx
15. Update Homepage Tagline Explanation
Priority: LOW
Effort: 15 minutes
Budget: $1-2
Current: "Find Spots • Create Events • Learn • Shop • Contribute • Get Rewarded"
Update To: Add subtitle explaining the real-world focus:
"The magic happens IRL - SkateSpots helps you find it, connect with it, and support it"
Or similar messaging emphasizing that the app enhances real skateboarding culture.
Files: src/pages/Index.tsx
📊 TOTAL BREAKDOWN
By Priority:
| Priority | Features | Effort | Budget |
|---|---|---|---|
| CRITICAL | Signup Fix | 45 min | $3-5 |
| HIGH | UI Consistency + Theme + Coach Rating | 6-9 hours | $30-45 |
| MEDIUM | Contact Info + Claiming + Links + NIP-05 | 4-5 hours | $20-25 |
| LOW | Minor additions | 1-2 hours | $5-10 |
TOTAL ESTIMATE:
- Time: 12-16 hours
- Budget: $58-85
- Complexity: Medium-High (coach rating system most complex)
🎯 RECOMMENDED IMPLEMENTATION ORDER
Phase 1: Critical Fixes (1 hour, $5-8)
- ✅ Fix signup key generation error
- ✅ Fix Plebeian Market links
- ✅ Add onboarding link to signup
Phase 2: UI Polish (4-5 hours, $20-25)
- ✅ Consistent UI framing across devices
- ✅ Day/night theme with contrast
- ✅ Login required notices
Phase 3: Enhanced Features (5-7 hours, $25-35)
- ✅ Contact info for spots (private/locals)
- ✅ NIP-05 providers in settings
- ✅ Coach contact details (verified only)
- ✅ Shop claiming enhancement
Phase 4: Advanced Features (2-3 hours, $10-15)
- ✅ Coach rating system
- ✅ Hide events from logged-out users
Phase 5: Polish (1 hour, $3-7)
- ✅ Add all missing links (nos2x, wallets, OpenStreetMap)
- ✅ Update homepage messaging
- ✅ Final testing across devices
💡 NOTES & CONSIDERATIONS
Coach Rating System Complexity:
- Requires new Nostr event kind (needs generation)
- Needs validation to prevent spam
- Aggregation logic for average ratings
- UI for displaying ratings and reviews
- Review submission dialog
- Most complex feature in this list
Alternative to Coach Ratings:
- Use existing NIP-25 reactions (simpler)
- Use comments only (no star ratings)
- Link to external review system
- Recommended: Start with comments, add ratings later
Shop Claiming:
- First claim wins approach (simple)
- Or allow dispute resolution (complex)
- Recommended: Simple first claim + manual dispute
Contact Info Security:
- Only show to verified users (has NIP-05)
- Prevents spam and abuse
- Builds trust in community
🚀 IMMEDIATE ACTIONS
Start with these 3 critical fixes (can be done in 1 hour):
- Fix signup error - Test and debug key generation
- Fix Plebeian links - Single clear CTA
- Add onboarding link - Help new users
Then we can tackle the larger UI and feature work.
Would you like me to start with Phase 1 (critical fixes)?
📋 DETAILED TASK CHECKLIST
- Fix signup key generation error (CRITICAL)
- Consistent UI framing across devices
- Day/night theme with real contrast
- Login required notices throughout app
- Onboarding link in signup dialog
- nos2x link in onboarding extensions
- Hyperlinks for all mobile wallets
- Fix Plebeian Market links (single CTA)
- NIP-05 providers section in settings (4 options)
- Contact info for private/ask locals spots
- Coach contact details (verified users only)
- Coach rating/review system
- Shop claiming with ownership field
- Hide events from logged-out users
- OpenStreetMap credit on map
- Update homepage tagline explanation
Total Tasks: 16
Estimated Time: 12-16 hours
Estimated Budget: $58-85