SkateSpots - local-first skating map, crews, events and marketplace
Find a file
SkateSpots 3051858de7 contents(admin): tidy the review queue + add gallery screenshots
- Review queue: past verdicts (e.g. the 13 hidden labels from an Aug/Sep cleanup
  sweep) are correct but noisy — they buried the items that still need a
  decision. They are now COLLAPSED behind a 'Show actioned (N)' toggle, with the
  verdicts untouched (still hidden) and 'Undo all N' still available. Verified:
  the Spots tab renders 0 hidden cards by default with the toggle + Undo all.
- public/images/screenshots/{map,spot,marketplace}.png (1280x800, quantised) for
  the app-listing gallery.
2026-09-28 11:08:31 +07:00
.agents/skills New project created with Shakespeare 2026-06-15 19:49:07 +07:00
.github feat: update zapstore.yaml for local publish workflow with nostr git 2026-06-18 19:57:07 +07:00
.nsite Import files from skate-spots project 2026-06-15 20:04:15 +07:00
.vscode Import files from skate-spots project 2026-06-15 20:04:15 +07:00
android-templates Citrine: allow loopback ws:// in WebView so the local relay connects (1.3.5) 2026-09-09 10:47:39 +07:00
cvm-server chore(cvm): use only the community relay for data queries 2026-09-27 12:07:58 +07:00
eslint-rules Import files from skate-spots project 2026-06-15 20:04:15 +07:00
netlify/functions fix(mobile-ux): Mints in the nav, instant directions, no stray signer prompt 2026-09-27 15:54:29 +07:00
public contents(admin): tidy the review queue + add gallery screenshots 2026-09-28 11:08:31 +07:00
scripts feat(spots): honest quality signals, photo required, off-topic reports, admin review queue 2026-09-27 23:41:49 +07:00
skills Import files from skate-spots project 2026-06-15 20:04:15 +07:00
src contents(admin): tidy the review queue + add gallery screenshots 2026-09-28 11:08:31 +07:00
.gitignore fix(nav,amber,reputation,routing): header crowding, no read-state popups, anti-collusion rep, instant directions 2026-09-27 16:42:39 +07:00
.gitlab-ci.yml New project created with Shakespeare 2026-06-15 19:49:07 +07:00
.mcp.json security: verify Amber signatures + pin MCP server versions 2026-09-24 19:20:47 +07:00
.npmrc Add .npmrc: map @jsr scope to JSR registry + legacy-peer-deps 2026-07-24 21:26:54 +07:00
AGENTS.md contents(about): rework the Credits list 2026-09-28 10:31:43 +07:00
BOUNTY-SYSTEM-PLAN.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
BUDGET_IMPLEMENTATION.md Add tour countdown badges + fix/standardize NIP-05 provider prompts 2026-09-09 22:31:44 +07:00
capacitor.config.ts Security polish (audit F5-F6): disable broad allowMixedContent on Android (loopback cleartext stays via network_security_config); document CVM client's intentional fixed data-relay set + IP-disclosure privacy note 2026-09-24 18:15:19 +07:00
components.json Import files from skate-spots project 2026-06-15 20:04:15 +07:00
CONTEXTVM_INTEGRATION.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
DEPLOYMENT_COMPARISON.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
EMERGENCY_FIX.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
ESCROW.md docs(escrow): exact Android test-build steps for on-device verification 2026-09-26 23:19:47 +07:00
eslint.config.js feat(cvm-server): load protection + type-check it in the gate 2026-09-27 11:36:20 +07:00
FINAL_POLISH_BREAKDOWN.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
FINAL_SCOPE.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
FIXES_BREAKDOWN.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
FOLLOW_MANAGEMENT_BRIEFING.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
GROUP_MESSAGING.md docs: group messaging — what ships (NIP-17) and the upgrade paths (Marmot/Concord/Cordn) 2026-09-26 19:56:58 +07:00
HOW_TO_ENABLE_RELATR.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
IMPLEMENTATION_COMPLETE.md Bump version to 1.4.4 (package.json is source of truth for Android version) 2026-09-09 19:34:30 +07:00
IMPLEMENTATION_PLAN.md Add tour countdown badges + fix/standardize NIP-05 provider prompts 2026-09-09 22:31:44 +07:00
index.html Fix ESLint gate: scope ignores to app source (exclude android/.agents/cvm-server/public html/scripts), add index.html title, downgrade unused-vars & no-explicit-any to warnings, fix real lint errors (SkateGlobe unused-expr, EventsPage prefer-const, LicensePage Infinity shadow, useless-escape in SasquatchGuide/RiderCardPage, stale eslint-disable directives) 2026-09-03 21:30:56 +07:00
INTEGRATION_BRIEFING.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
LIVE_MUSIC_PROPOSAL.md feat(settings,map,docs): polish Relays UI, drop desktop Near Me, remove NoGood Radio 2026-09-26 23:37:32 +07:00
LOGO_USAGE.md Bump version to 1.4.4 (package.json is source of truth for Android version) 2026-09-09 19:34:30 +07:00
MCP_SERVER_SPEC.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
netlify.toml feat(sasquatch): server-side AI proxy (no key in the client bundle) 2026-09-27 12:24:46 +07:00
NIP-06-IMPLEMENTATION.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
NIP.md fix(nav,amber,reputation,routing): header crowding, no read-state popups, anti-collusion rep, instant directions 2026-09-27 16:42:39 +07:00
opencode.json New project created with Shakespeare 2026-06-15 19:49:07 +07:00
package-lock.json chore: sync package-lock to 1.5.4 2026-09-27 20:47:21 +07:00
package.json release: v1.5.4 2026-09-27 20:43:16 +07:00
postcss.config.js Import files from skate-spots project 2026-06-15 20:04:15 +07:00
README.md feat(settings,map,docs): polish Relays UI, drop desktop Near Me, remove NoGood Radio 2026-09-26 23:37:32 +07:00
RELATR_INTEGRATION.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
RELAY_FIX.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
RELAY_SETUP.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
release-notes.txt feat(moderation): report inbox, bulk undo, crews + Lab in the queue 2026-09-28 10:20:54 +07:00
SECURITY.md Docs + a11y: document Cashu wallet seed storage/backup as tracked accepted-risk in SECURITY.md (F1 follow-up); add skip-to-content link and main landmark id (UX U4) 2026-09-24 18:22:30 +07:00
SHOP_VERIFICATION_ANALYSIS.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
stack.json Import files from skate-spots project 2026-06-15 20:04:15 +07:00
tailwind.config.ts Citrine: native cleartext config, default-pool write wiring, polished UI (1.3.1) 2026-09-08 19:11:51 +07:00
tsconfig.json Import files from skate-spots project 2026-06-15 20:04:15 +07:00
UX_AUDIT.md docs: UI/UX audit + fix backlog (60 findings across all areas) 2026-09-26 17:40:25 +07:00
vite.config.ts feat(mints): Cashu mint directory (MintRadar) + same-origin proxy 2026-09-26 21:20:19 +07:00
WEATHER_FEATURE.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
ZAP_INTEGRATION_PROPOSAL.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
ZAP_QUICK_WINS.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
ZAP_SIMPLE_PLAN.md Import files from skate-spots project 2026-06-15 20:04:15 +07:00
ZAPSTORE.md SECURITY: remove committed nsec from ZAPSTORE.md 2026-07-25 13:31:09 +07:00
zapstore.yaml Set zapstore.yaml repository to browsable nostrhub.io source URL so Zapstore renders a Source link 2026-09-14 10:25:49 +07:00

SkateSpots - Decentralized Skate Map & Community

Edit with Shakespeare

A decentralized skateboarding community platform built on Nostr. Discover skate spots, find coaches, join events, and connect with skaters worldwide.

🌐 Live App

  • Deployed URL: https://skate-spots.org
  • Nostr Git: nostr://npub1yrnuj56rnen08zp2h9h7p74ghgjx6ma39spmpj6w9hzxywutevsst7k5cx/git.shakespeare.diy/SkateSpots

✨ Features

  • 🗺️ Interactive Skate Map - Discover skate spots worldwide with geolocation
  • 🛹 Spot Database - Browse, create, and review skate parks and street spots
  • 📅 Events Calendar - Find and create skateboarding events and competitions
  • 👨‍🏫 The Lab - Connect with coaches, filmers, and video editors in your area
  • 🎬 Video Editors - Find editors who list their software, hardware, and portfolio
  • 🛍️ Skate Shops - Discover local skate shops and support the community
  • 🔄 Buy/Sell Gear - Marketplace for used skate gear (NIP-99 classified listings)
  • 🎒 My Stash - Private encrypted gear inventory with location tracking
  • ⚡ Lightning Zaps - Send Bitcoin tips to content creators
  • 🌤️ Weather Integration - Check conditions before you skate
  • 🔐 Nostr Authentication - Decentralized login with your Nostr keys
  • 📱 PWA Support - Install as a native app on any device
  • ❤️ Supporters - Community funding via Angor (decentralized Bitcoin crowdfunding)

🛠️ Technology Stack

  • React 18 - Modern UI with hooks and concurrent rendering
  • Nostr Protocol - Decentralized data storage and communication
  • TailwindCSS 3 - Utility-first CSS framework
  • Vite - Lightning-fast build tool and dev server
  • shadcn/ui - Beautiful, accessible UI components
  • Nostrify - Nostr framework for web applications
  • TanStack Query - Data fetching and caching
  • OpenStreetMap - Interactive maps
  • TypeScript - Type-safe development

🚀 Getting Started

Prerequisites

  • Node.js 18+
  • npm or yarn

Installation

# Clone the repository
git clone nostr://npub1yrnuj56rnen08zp2h9h7p74ghgjx6ma39spmpj6w9hzxywutevsst7k5cx/git.shakespeare.diy/SkateSpots

# Install dependencies
npm install

# Start development server
npm run dev

Building

# Build for production
npm run build

# Run tests
npm test

🌍 Deployment

The app is configured for deployment via:

  • Shakespeare Deploy - Nostr-native deployment (configured)
  • Netlify - Static site hosting
  • Vercel - Edge deployment
  • nsite - Nostr-native sites

Deploy command:

npm run deploy

📱 PWA Installation

SkateSpots works as a Progressive Web App (PWA) and can be installed on:

  • Desktop: Chrome, Edge, Safari - Look for install icon in address bar
  • Android: Chrome - "Add to Home Screen" from menu
  • iOS: Safari - "Add to Home Screen" from share menu

🔌 Nostr Integration

Custom Event Kinds

This app uses custom Nostr event kinds defined in NIP.md:

Kind Type Description
30017 Addressable Skate Shops (NIP-15 Stall)
30402 Addressable Gear Listings (NIP-99 Classified)
30818 Addressable Skate Spots
30823 Addressable Skate Tours
31923 Addressable Skate Events (NIP-52 Calendar)
35001 Addressable Skate Coaches
35002 Addressable Skate Filmers / Photographers
35003 Addressable Skate Video Editors

Relay Configuration

Default relay: wss://goskatespots.nostr1.com

Users can manage relays in Settings following NIP-65.

🎒 My Stash

The Stash is a private, encrypted gear inventory (NIP-51 kind 30001). Users can track their equipment with:

  • Categories: Decks, trucks, wheels, bearings, shoes, apparel, protective gear, and more
  • Storage locations: Home, car, backpack, wardrobe, van, skatepark, friend's, parents', warehouse, storage unit, sponsor, or other
  • Condition rating (1–5 stars), rarity tier, and optional price
  • Visibility control: Private (encrypted), friends-only, or public
  • Filter & search by category, storage location, or keyword

🧪 The Lab

The Lab connects skaters with service providers in three categories:

  • Coaches - Skateboarding instructors with skill specializations
  • Filmers - Videographers and photographers with equipment/style details
  • Video Editors - Editors who list their software (Premiere, DaVinci, After Effects, etc.), hardware setup, portfolio, and contact details

📦 Dependencies Overview

Core Dependencies

  • @nostrify/nostrify - Nostr protocol implementation
  • @nostrify/react - React integration for Nostr
  • react & react-dom - UI framework
  • react-router-dom - Client-side routing
  • @tanstack/react-query - Data fetching and state
  • nostr-tools - Nostr utilities and cryptography

UI & Styling

  • tailwindcss - Utility-first CSS
  • @radix-ui/* - Accessible UI primitives
  • lucide-react - Icon library
  • class-variance-authority - Component variants
  • tailwind-merge - Class name merging

Maps & Location

  • OpenStreetMap - Interactive maps
  • ngeohash - Geohash encoding/decoding

Bitcoin & Lightning

  • @getalby/sdk - Alby wallet integration
  • @cashu/cashu-ts - Cashu ecash protocol
  • npubcash-sdk - npub.cash integration
  • bitcoinjs-lib - Bitcoin utilities
  • @noble/curves & @noble/hashes - Cryptography

Media & Streaming

  • hls.js - HLS streaming support
  • qrcode - QR code generation
  • html5-qrcode - QR code scanning

Utilities

  • date-fns - Date formatting
  • zod - Schema validation
  • react-hook-form - Form handling
  • buffer - Node.js buffer polyfill
  • idb & dexie - IndexedDB wrappers

🏗️ Project Structure

/src
├── components/     # React components
│   ├── ui/        # shadcn/ui components (48+)
│   ├── auth/      # Authentication components
│   └── ...        # Feature components
├── hooks/         # Custom React hooks
├── pages/         # Route pages
├── lib/           # Utilities and helpers
├── contexts/      # React context providers
└── test/          # Testing utilities

/public
├── images/        # Static images and icons
├── manifest.webmanifest
└── robots.txt

/skills            # Implementation guides for features

🧪 Testing

# Run all tests (TypeScript, ESLint, Vitest, Build)
npm test

# Type checking only
npx tsc --noEmit

# Linting only
npx eslint

🤝 Contributing

This is a Nostr-based open source project. Contributions are welcome!

  1. Fork/clone the repository via Shakespeare or git
  2. Create your feature branch
  3. Make your changes
  4. Run tests (npm test)
  5. Commit your changes
  6. Push and create a pull request

📄 License

YOU ARE FREE TO SKATEBOARD

This project is open. Share it, fork it, build on it, skate it. The streets belong to everyone. So does this code. Just keep skating and don't be a kook.

Copyright © 2025–∞ SkateSpots contributors & the community

See /license in the app for the full license page.

❤️ Support the Project

SkateSpots is 100% free, open-source, and community-funded. No ads, no data selling, no investors.

🙏 Credits

  • Built with: MKStack - Nostr client framework
  • Vibed with: Shakespeare - AI-powered development
  • Powered by: Nostr - Decentralized protocol
  • Funded by: Angor - Decentralized Bitcoin crowdfunding

📞 Support

For issues or questions:

  • Open an issue on the repository
  • Contact via Nostr: npub1yrnuj56rnen08zp2h9h7p74ghgjx6ma39spmpj6w9hzxywutevsst7k5cx

Made with ❤️ for the skateboarding community