# 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. ```bash 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 ```text 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 from `package.json`; releases go through Zapstore. - **Community relay** `wss://relay.skate-spots.org` (Newlay + Caddy) also serves Blossom at `blossom.skate-spots.org`. - **Push** (`push.skate-spots.org`), **AI proxy** (`ai.skate-spots.org`) and **CVM** run separately; see `AGENTS.md`. ## Documentation - [`AGENTS.md`](AGENTS.md) — operational memory: commands, services, gotchas and current state. - [`NIP.md`](NIP.md) — every custom/adopted Nostr kind and schema. - [`ESCROW.md`](ESCROW.md) — Cashu escrow design and device checklist. - [`GROUP_MESSAGING.md`](GROUP_MESSAGING.md) — DM/crew chat decisions. - [`TRUST_SCORE.md`](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.”