SkateSpots - local-first skating map, crews, events and marketplace
| .agents/skills | ||
| .githooks | ||
| .github | ||
| .nsite | ||
| .vscode | ||
| ai-proxy | ||
| android-templates | ||
| cvm-server | ||
| distribution | ||
| eslint-rules | ||
| fastlane/metadata/android/en-US | ||
| netlify/functions | ||
| packages | ||
| public | ||
| push-service | ||
| scripts | ||
| skills | ||
| src | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| .mcp.json | ||
| .npmrc | ||
| .nvmrc | ||
| AGENTS.md | ||
| BOUNTY-SYSTEM-PLAN.md | ||
| BUDGET_IMPLEMENTATION.md | ||
| capacitor.config.ts | ||
| components.json | ||
| CONTEXTVM_INTEGRATION.md | ||
| CORDN_UX_AUDIT.md | ||
| CREW_CHAT_AUDIT.md | ||
| DEPLOYMENT_COMPARISON.md | ||
| EMERGENCY_FIX.md | ||
| ESCROW.md | ||
| eslint.config.js | ||
| FINAL_POLISH_BREAKDOWN.md | ||
| FINAL_SCOPE.md | ||
| FIXES_BREAKDOWN.md | ||
| FOLLOW_MANAGEMENT_BRIEFING.md | ||
| GROUP_MESSAGING.md | ||
| HOW_TO_ENABLE_RELATR.md | ||
| IMPLEMENTATION_COMPLETE.md | ||
| IMPLEMENTATION_PLAN.md | ||
| index.html | ||
| INTEGRATION_BRIEFING.md | ||
| LICENSE | ||
| LIVE_MUSIC_PROPOSAL.md | ||
| LOGO_USAGE.md | ||
| MARKETPLACE_FLOW_AUDIT.md | ||
| MCP_SERVER_SPEC.md | ||
| netlify.toml | ||
| NIP-06-IMPLEMENTATION.md | ||
| NIP.md | ||
| opencode.json | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.js | ||
| README.md | ||
| RELATR_INTEGRATION.md | ||
| RELAY_FIX.md | ||
| RELAY_SETUP.md | ||
| release-notes.txt | ||
| SECURITY.md | ||
| SHOP_VERIFICATION_ANALYSIS.md | ||
| stack.json | ||
| tailwind.config.ts | ||
| TRUST_SCORE.md | ||
| tsconfig.json | ||
| UX_AUDIT.md | ||
| UX_AUDIT_2026-10-09.md | ||
| vite.config.ts | ||
| WEATHER_FEATURE.md | ||
| ZAP_INTEGRATION_PROPOSAL.md | ||
| ZAP_QUICK_WINS.md | ||
| ZAP_SIMPLE_PLAN.md | ||
| ZAPSTORE.md | ||
| zapstore.yaml | ||
SkateSpots
A local-first skateboarding community app on Nostr: map spots, join crews, find events and coaches, trade gear, and talk privately without a central account.
- Live: https://skate-spots.org
- Android: Zapstore / APK (
org.skatespots.app) - Source:
nostr://npub1yrnuj56rnen08zp2h9h7p74ghgjx6ma39spmpj6w9hzxywutevsst7k5cx/git.shakespeare.diy/SkateSpots - License: AGPL-3.0-only
Principles
- Your keys, your identity. No custodial accounts, no uploaded private keys, no Bitcoin custody.
- Local-first. Public data is cached on-device; private messages are decrypted on-device.
- Self-hosted where it matters. Community relay, Blossom media, push, AI and CVM services run on our own infrastructure.
- No tracking, ads or analytics. No third-party scripts, no behavioural profiles, no selling data.
- Forkable by design. Open protocol, open source, ordinary Nostr events.
Features
- Map & spots — street, park, transition and plaza pins; photos, conditions, comments and directions.
- Crews — public crews, membership, roles, events, a crew feed and invites.
- Private chat — NIP-17 DMs and crew chat; MLS end-to-end encrypted crew chat via Cordn (reactions, replies, read receipts, device linking).
- The Lab — coaches, filmers, editors, photographers, builders, artists and other skate crafts.
- Marketplace — NIP-99 listings, offers, barter, reputation and Lightning/cashu payments.
- Events & tours — calendar events, RSVPs, event updates and spot tours.
- Stash — encrypted private gear inventory with public want/showcase listings.
- Translation — on-device message translation for every app language; message text never leaves the device.
- Newsletter & community — weekly drops, an in-app mailbox and a public Cordn community room.
- Notifications — in-app bell, Web Push, and local Android notifications; no FCM/Google dependency.
Stack
React 18 · TypeScript · Vite · Tailwind CSS · shadcn/ui · TanStack Query · Nostrify · Leaflet/OpenStreetMap · Capacitor (Android) · Cashu/NWC · ONNX Runtime Web (translation).
Quick start
Requires Node 22 (see .nvmrc) and npm.
npm ci
npm run dev # http://localhost:8080
npm test # typecheck + lint + i18n + unit tests + web build
Useful scripts:
| Command | What it does |
|---|---|
npm run build |
Production web build (dist/) |
npm run android:build |
Signed release APK |
npm run android:init / android:sync |
Generate/sync the Capacitor Android project |
npm run translation:matrix |
Browser translation matrix runner (downloads the model) |
npm run newsletter:weekly |
Generate the weekly newsletter draft |
scripts/release.sh patch --yes |
Test, build APK, publish to Zapstore, commit and tag |
Repository map
src/
components/ shared UI, map, crews, auth, wallet
pages/ route pages
hooks/ Nostr queries, live data, wallet
lib/ protocol helpers, Cordn/MLS, translation, storage
i18n/ 24 lazy-loaded dictionaries
workers/ on-device translation worker
scripts/ release, deploy, ops, newsletter, watchers
public/ icons, images, ONNX Runtime WASM
netlify/ NIP-05 and AI proxy functions
cvm-server/ ContextVM MCP server (external host)
push-service/ Web Push / native-poll service
packages/ local Capacitor plugins
Releases & infrastructure
- Web is deployed by
scripts/auto-deploy.sh(systemd timer) after the full preflight and production smoke test. - Android is built with
npm run android:build; versioning comes frompackage.json; releases go through Zapstore. - Community relay
wss://relay.skate-spots.org(Newlay + Caddy) also serves Blossom atblossom.skate-spots.org. - Push (
push.skate-spots.org), AI proxy (ai.skate-spots.org) and CVM run separately; seeAGENTS.md.
Documentation
AGENTS.md— operational memory: commands, services, gotchas and current state.NIP.md— every custom/adopted Nostr kind and schema.ESCROW.md— Cashu escrow design and device checklist.GROUP_MESSAGING.md— DM/crew chat decisions.TRUST_SCORE.md— trust/reputation model.
Credits
Nostr · Cordn (crew chat) · Cashu · NWC · Amber · BTCMap · Angor · Zapstore · ContextVM · OpenStreetMap. Built by skaters, for skaters.
Support the project through the app’s Supporters page or Angor. No VC, no token, no sponsored placements sold as “community.”