Sasquatch: teach him all the new features + fix zap comment

- Expand AI system prompt with full feature map: Lab (coaches/filmers/
  photographers/editors/builders + individual vs collective), Crews (map-anchored,
  how they differ from the Lab), Stash, Tours, Shops, Gear Swap, Rider Card
- Document money layer interconnections: wallet rails (Cashu/NWC/WebLN), zap
  fallback order, nutzaps (NIP-61, receiving), CLINK/noffer, Geyser supporters
- Instruct Sasquatch that Crews/Stash/Wallet/Tours/Shops have no live search tool
  and must be answered from knowledge (prevents bogus tool calls)
- Add ~15 new STATIC_FAQ offline answers (crews, stash, builder, nutzap, clink,
  noffer, tours, shops, sell gear, supporters)
- Add Crews page guide context + crew jokes; refresh Lab suggestions
- Fix leftover "Zapped with Engorile!" default comment → SkateSpots branding

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
This commit is contained in:
shakespeare.diy 2026-07-24 14:12:30 +07:00
parent 28f4ef8c34
commit ed27f719fa
3 changed files with 81 additions and 17 deletions

View file

@ -159,6 +159,7 @@ Example: {"tool":"find_events","args":{"city":"Bangkok"}}
### find_coaches ### find_coaches
Args: role?("coach"|"filmer"|"editor"|"any"), skills?(string[]), location?(string), limit?(number) Args: role?("coach"|"filmer"|"editor"|"any"), skills?(string[]), location?(string), limit?(number)
- Covers all The Lab service providers: coaches, filmers, photographers, editors, and ramp/park builders
- location searches name, bio, city tag — use the CITY name not country name for best results - location searches name, bio, city tag — use the CITY name not country name for best results
- "coaches in Thailand" → use location:"Bangkok" (main city) - "coaches in Thailand" → use location:"Bangkok" (main city)
- "coaches in Bangkok" → use location:"Bangkok" - "coaches in Bangkok" → use location:"Bangkok"
@ -182,19 +183,32 @@ Example: {"tool":"get_weather","args":{"city":"Barcelona"}}
## Rules ## Rules
1. Data questions (spots/events/coaches/gear/stats) → ALWAYS use a tool, never guess 1. Data questions (spots/events/coaches/gear/stats) → ALWAYS use a tool, never guess
2. Tool call = ONE JSON object on its own line, nothing else before or after 2. Tool call = ONE JSON object on its own line, nothing else before or after
3. App/protocol questions → answer directly 3. App/protocol/how-to questions → answer directly (no tool). Crews, Stash, Wallet, Tours, Shops, Supporters have NO live search tool — answer these from the App facts below and point users to the right page.
4. Be concise, skater-friendly 4. Be concise, skater-friendly
5. Never invent spot names, event dates, or user data 5. Never invent spot names, event dates, or user data
6. 0 results = honest "none listed yet" + encourage adding content 6. 0 results = honest "none listed yet" + encourage adding content
## App facts ## App facts (features & how they connect)
- Nostr = decentralized, cryptographic keys = your identity - Nostr = decentralized protocol; your cryptographic keys ARE your identity — one login works everywhere, nobody can ban you
- Zaps = instant Bitcoin Lightning tips - Map (the homepage) = discover spots, shops, gear, tours, events and crews worldwide. Toggle layers via the Layers control. Add a spot with the + button.
- NWC = Nostr Wallet Connect for Lightning wallets - The Lab = hire skate-scene pros: Coaches, Filmers, Photographers, Video Editors, and ramp/park/DIY Builders. Providers can be an individual OR a collective (crew/studio) — collective members confirm with their own key (green = confirmed, amber = pending).
- Cashu = offline ecash wallet built in - Crews = your map-anchored skate family (who you skate with, NOT for hire). A crew has home turf on the map (teal pins), home spots, members, vibes and a manifesto. Create one at /crews → "Start a Crew". Crews reuse the same member-confirmation trust as Lab collectives.
- The Lab = find coaches, filmers, video editors - Events = find/join skate events & comps (map layer + Events page)
- Tours = guided local/national/world skate tours
- Skate Shops = local shops on the map
- Gear Swap / Marketplace = buy & sell used gear (NIP-99 listings), can be pinned to a spot on the map
- My Stash = your PRIVATE, encrypted gear inventory (NIP-44). Track decks/trucks/wheels/shoes, storage location, condition, rarity, price. Only you can read it unless you mark items public.
- Rider Card = your skate ID / park access card
- Trust scores (0-100, powered by Relatr) filter bots/spam across the app
## Money & wallet (all interconnected)
- Wallet page = one place for it all. Three rails, auto-detected: Cashu (built-in ecash), NWC (connect Alby/Minibits/Zeus/Coinos), and WebLN (browser extension).
- Zaps = instant Bitcoin Lightning tips on any content (⚡). Zapping auto-picks your best rail: NWC → WebLN → Cashu balance → manual QR. Works from spots, profiles, crews, Lab profiles, events.
- Cashu = built-in ecash wallet, private and works offline at the skatepark. Pay zaps straight from your Cashu balance.
- Nutzaps (NIP-61) = ecash tips sent over Nostr; you can set up nutzap RECEIVING in the wallet (sending full nutzaps is rolling out — use Lightning zaps for now).
- CLINK (noffer) = an optional reusable Nostr-native payment code a shop/crew/Lab pro can add so you can pay them without a Lightning address. Shows a "Pay via CLINK" button.
- goskatespots.nostr1.com = primary community relay - goskatespots.nostr1.com = primary community relay
- 100% free, no ads, no tracking 🛹`; - 100% free, no ads, no tracking, community-funded via Geyser (see Supporters). 🛹`;
// ─── Detect if a question needs live CVM data ───────────────────────────────── // ─── Detect if a question needs live CVM data ─────────────────────────────────
@ -222,9 +236,22 @@ const STATIC_FAQ: Record<string, string> = {
'how to login': "Two ways:\n1. **Browser extension** (Desktop): Install Alby or nos2x, then click 'Log in'\n2. **New user**: Click 'Sign up' to generate keys. Download your nsec (secret key) and SAVE IT — this is your account forever!", 'how to login': "Two ways:\n1. **Browser extension** (Desktop): Install Alby or nos2x, then click 'Log in'\n2. **New user**: Click 'Sign up' to generate keys. Download your nsec (secret key) and SAVE IT — this is your account forever!",
'what is cashu': "Built-in Bitcoin wallet! Cashu ecash tokens backed by Lightning — works offline at skate spots, privacy-focused (mints can't track payments). Go to Wallet in Settings to use it. 🥜", 'what is cashu': "Built-in Bitcoin wallet! Cashu ecash tokens backed by Lightning — works offline at skate spots, privacy-focused (mints can't track payments). Go to Wallet in Settings to use it. 🥜",
'what is nwc': "Nostr Wallet Connect — like USB-C for Lightning wallets. Connect Alby, Minibits, Zeus, or Coinos once, and zap with one click forever. Encrypted, you control spending limits. 🔌⚡", 'what is nwc': "Nostr Wallet Connect — like USB-C for Lightning wallets. Connect Alby, Minibits, Zeus, or Coinos once, and zap with one click forever. Encrypted, you control spending limits. 🔌⚡",
'is it free': "100% free. No ads, no subscriptions, no corporate BS. Built by skaters for skaters. You can earn Bitcoin through community zaps for contributing quality spots. 🛹", 'is it free': "100% free. No ads, no subscriptions, no corporate BS. Built by skaters for skaters. Community-funded via Geyser — check the Supporters page. You can also earn Bitcoin through community zaps for contributing quality spots. 🛹",
'what can i do': "Discover spots worldwide, connect with coaches & filmers in The Lab, join events, sell/buy gear, earn sats for contributions, zap creators, check spot weather, and build the decentralized skate community!", 'what can i do': "Discover spots worldwide on the map, hire pros in The Lab (coaches, filmers, photographers, editors, ramp builders), roll with a crew, join events, take tours, buy/sell gear, track your private Stash, zap creators, check spot weather, and build the decentralized skate community!",
'what is the lab': "The Lab is where skaters level up! Marketplace for coaching and filming services. Find coaches to learn tricks, filmers to capture sessions, video editors. All on Nostr — real skaters, no fake accounts. 🎓", 'what is the lab': "The Lab is where you hire skate-scene pros: Coaches, Filmers, Photographers, Video Editors, and ramp/park/DIY Builders. Each can be a solo person or a collective (crew/studio) — members confirm with their own keys so it's legit. All on Nostr, no fake accounts. 🎓",
'what is a crew': "Crews are your map-anchored skate family — who you skate WITH, not who you hire. Each crew has home turf on the map (teal pins), home spots, members, vibes and a manifesto. Members confirm from their own key. Start one at Crews → 'Start a Crew'. 🤘",
'what are crews': "Crews are your map-anchored skate family — who you skate WITH, not who you hire. Each crew has home turf on the map (teal pins), home spots, members and a manifesto. Members confirm from their own key. Head to the Crews tab to start or join one! 🤘",
'how to start a crew': "Go to the Crews tab → 'Start a Crew'. Name it, drop your home turf on the map, add vibes (or your own custom #hashtag), link your home spots, and add members by npub. Each member confirms from their own key so the roster is legit. 🤘",
'what is my stash': "My Stash is your PRIVATE, encrypted gear locker (NIP-44 encryption). Track your decks, trucks, wheels, shoes — with storage location, condition, rarity and price. Only YOU can read it unless you mark items public. Great for insurance or planning a swap. 🎒",
'what is stash': "My Stash is your PRIVATE, encrypted gear inventory. Log everything you own — condition, where it's stored, value — all encrypted so only you can see it. Mark items public if you want to sell or show them off. 🎒",
'what is a builder': "Builders are ramp/park/DIY crews in The Lab you can hire to build transitions, bowls, rails, or a whole park. They list what they build, materials, project scale, and can be licensed/insured. Often collectives — and they can link the spots they've built to the map. 🏗️",
'what is a nutzap': "Nutzaps (NIP-61) are ecash tips sent over Nostr — private Cashu tokens zapped straight to someone. You can set up nutzap RECEIVING in the Wallet. (Sending full nutzaps is rolling out — for now use Lightning zaps.) 🥜⚡",
'what is clink': "CLINK is a Nostr-native payment code (an 'noffer'). Shops, crews, and Lab pros can add one so you can pay them without needing a Lightning address — you'll see a 'Pay via CLINK' button with a QR. Scan it with a CLINK wallet like ShockWallet. 🔗⚡",
'what is noffer': "An noffer is a CLINK payment code — a reusable, Nostr-native way to get paid without a web server or Lightning address. Add yours on your shop/crew/Lab profile and people can pay you directly. 🔗",
'what are tours': "Tours are guided skate trips — local sessions, national road trips, or world destruction tours. Find them on the map or the Tours section, meet up, and skate new terrain with locals. 🗺️🛹",
'what is a shop': "Skate Shops are local shops listed on the map. Discover and support real brick-and-mortar (or online) skate shops in your area — some even accept Bitcoin. 🏪",
'how to sell gear': "Head to Gear Swap / Marketplace and create a listing (NIP-99). Add photos, price in sats, condition, and optionally pin it to a spot so it shows on the map. Buyers zap or message you directly. 🛹💸",
'supporters': "SkateSpots is community-funded via Geyser (Bitcoin Lightning crowdfunding) — no ads, no investors, no data selling. Check the Supporters page to chip in and keep the streets free. ❤️⚡",
'trust score': "Trust scores (0-100) powered by Relatr. Analyzes your Nostr network: followers, activity, engagement, zaps. Higher = more trusted. Helps filter bots and spam. Check any profile to see their score. 🛡️", 'trust score': "Trust scores (0-100) powered by Relatr. Analyzes your Nostr network: followers, activity, engagement, zaps. Higher = more trusted. Helps filter bots and spam. Check any profile to see their score. 🛡️",
'what relay': "SkateSpots uses: 🛹 goskatespots.nostr1.com (primary, allowlisted for quality) + relay.ditto.pub (global) + purplepag.es (profile aggregator). Your data is replicated across all of them for redundancy.", 'what relay': "SkateSpots uses: 🛹 goskatespots.nostr1.com (primary, allowlisted for quality) + relay.ditto.pub (global) + purplepag.es (profile aggregator). Your data is replicated across all of them for redundancy.",
}; };
@ -605,10 +632,10 @@ Instructions:
suggestedQuestions: [ suggestedQuestions: [
'Find spots near me', 'Find spots near me',
'Any upcoming events?', 'Any upcoming events?',
'What is Nostr?', 'What are crews?',
'How do zaps work?', 'How do zaps work?',
'What is My Stash?', 'What is My Stash?',
'How to add a spot?', 'What is the Lab?',
], ],
enableChat: true, enableChat: true,
}; };

View file

@ -428,7 +428,7 @@ export function ZapDialog({ target, children, className }: ZapDialogProps) {
useEffect(() => { useEffect(() => {
if (target) { if (target) {
setComment('Zapped with Engorile!'); setComment('Zapped on SkateSpots! 🛹');
} }
}, [target]); }, [target]);

View file

@ -33,6 +33,16 @@ const MAP_JOKES = [
"Why do sasquatches love maps? Because X marks the spot... and we ALWAYS find it! ❌" "Why do sasquatches love maps? Because X marks the spot... and we ALWAYS find it! ❌"
]; ];
// Crew jokes — for the Crews page
const CREW_JOKES = [
"Why did the crew skate together? Because a board shared is a board doubled! 🤘",
"What do you call a sasquatch's skate crew? The Bigfoot Brigade — we leave big tracks! 🦧",
"A crew is like grip tape — sticks together and keeps everyone from slipping. 🛹",
"Why did the crew claim a home spot? So the locals always know where to drop in! 📍",
"What's better than landing a trick? Landing it with your crew watching. 🎥",
"Crews don't gatekeep spots — they open gates. Come roll with one! 🤘",
];
// Get a random joke from a specific category // Get a random joke from a specific category
function getRandomJoke(jokes: string[]): string { function getRandomJoke(jokes: string[]): string {
return jokes[Math.floor(Math.random() * jokes.length)]; return jokes[Math.floor(Math.random() * jokes.length)];
@ -135,12 +145,12 @@ export function useSasquatchGuide() {
suggestedQuestions: [ suggestedQuestions: [
'Find coaches', 'Find coaches',
'Find filmers', 'Find filmers',
'Find photographers',
'Find video editors', 'Find video editors',
'Find street coaches', 'Find a ramp builder',
'What is The Lab?', 'What is The Lab?',
'What is a builder?',
'How to offer coaching?', 'How to offer coaching?',
'How much does coaching cost?',
'Can I message coaches?',
], ],
action: user ? undefined : { action: user ? undefined : {
label: 'Login to Offer Services', label: 'Login to Offer Services',
@ -154,6 +164,33 @@ export function useSasquatchGuide() {
}; };
} }
// Show on the Crews page
else if (location.pathname === '/crews') {
const joke = getRandomJoke(CREW_JOKES);
message = {
id: 'crews-guide',
title: 'Crews 🤘',
message: `Crews are your map-anchored skate family — the people you skate WITH, not who you hire. Every crew has home turf on the map, home spots, members and a manifesto. Members confirm from their own keys, so the roster's legit. Start your own or find your people!\n\n${joke}`,
context: undefined,
suggestedQuestions: [
'What are crews?',
'How to start a crew?',
'How is a crew different from The Lab?',
'How do members confirm?',
'What is Nostr?',
'How do zaps work?',
],
action: user ? undefined : {
label: 'Login to Start a Crew',
onClick: () => {
window.location.href = '/onboarding';
},
},
enableChat: true,
autoShow: false,
};
}
// /map: never auto-show — user opens Sasquatch by tapping the floating bubble // /map: never auto-show — user opens Sasquatch by tapping the floating bubble
// The map guide context + jokes are still available in the generic fallback inside SasquatchGuide // The map guide context + jokes are still available in the generic fallback inside SasquatchGuide
else if (location.pathname === '/map') { else if (location.pathname === '/map') {