- Settings -> Relays: rewritten with sectioned cards (NIP-65 / DM inbox / Local / Blocked), inline clickable Read/Write chips (no more Edit popover), tone-coded sections with icons + counts + help text, cleaner add rows and empty state. - Map: removed the desktop 'Near Me' button (mobile floating control remains). - Removed NoGood Radio everywhere: deleted NOGOOD_RADIO_PROPOSAL.md and RADIO_PLAYER_GUIDE.md, dropped the README feature line, scrubbed 'DJ NoGood' examples from LIVE_MUSIC_PROPOSAL.md. Gate: 101 tests, 0 errors/warnings, boot smoke green.
258 lines
8.4 KiB
Markdown
258 lines
8.4 KiB
Markdown
# SkateSpots - Decentralized Skate Map & Community
|
||
|
||
[](https://shakespeare.diy/clone?url=nostr%3A%2F%2Fnpub1yrnuj56rnen08zp2h9h7p74ghgjx6ma39spmpj6w9hzxywutevsst7k5cx%2Fgit.shakespeare.diy%2FSkateSpots)
|
||
|
||
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
|
||
|
||
```bash
|
||
# Clone the repository
|
||
git clone nostr://npub1yrnuj56rnen08zp2h9h7p74ghgjx6ma39spmpj6w9hzxywutevsst7k5cx/git.shakespeare.diy/SkateSpots
|
||
|
||
# Install dependencies
|
||
npm install
|
||
|
||
# Start development server
|
||
npm run dev
|
||
```
|
||
|
||
### Building
|
||
|
||
```bash
|
||
# 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:
|
||
```bash
|
||
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
|
||
|
||
```bash
|
||
# 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.
|
||
|
||
- **Angor**: https://angor.io/project/angor1qtunna00uqyx52rr0nvqa059z2gknhrmn7urd6z
|
||
- **Supporters page**: https://skate-spots.org/supporters
|
||
|
||
## 🙏 Credits
|
||
|
||
- **Built with**: [MKStack](https://soapbox.pub/mkstack) - Nostr client framework
|
||
- **Vibed with**: [Shakespeare](https://shakespeare.diy) - AI-powered development
|
||
- **Powered by**: [Nostr](https://nostr.com) - Decentralized protocol
|
||
- **Funded by**: [Angor](https://angor.io/project/angor1qtunna00uqyx52rr0nvqa059z2gknhrmn7urd6z) - Decentralized Bitcoin crowdfunding
|
||
|
||
## 🔗 Links
|
||
|
||
- [Live App](https://skate-spots.org)
|
||
- [Supporters](https://skate-spots.org/supporters)
|
||
- [Nostr Git Repository](nostr://npub1yrnuj56rnen08zp2h9h7p74ghgjx6ma39spmpj6w9hzxywutevsst7k5cx/git.shakespeare.diy/SkateSpots)
|
||
- [Edit with Shakespeare](https://shakespeare.diy/clone?url=nostr%3A%2F%2Fnpub1yrnuj56rnen08zp2h9h7p74ghgjx6ma39spmpj6w9hzxywutevsst7k5cx%2Fgit.shakespeare.diy%2FSkateSpots)
|
||
|
||
## 📞 Support
|
||
|
||
For issues or questions:
|
||
- Open an issue on the repository
|
||
- Contact via Nostr: npub1yrnuj56rnen08zp2h9h7p74ghgjx6ma39spmpj6w9hzxywutevsst7k5cx
|
||
|
||
---
|
||
|
||
Made with ❤️ for the skateboarding community
|