diff --git a/src/AppRouter.tsx b/src/AppRouter.tsx index f87f1c5..48045a3 100644 --- a/src/AppRouter.tsx +++ b/src/AppRouter.tsx @@ -56,6 +56,7 @@ const SignersPage = lazy(() => import("./pages/SignersPage")); const StashPage = lazy(() => import("./pages/StashPage")); const NIP19Page = lazy(() => import("./pages/NIP19Page").then(m => ({ default: m.NIP19Page }))); const LicensePage = lazy(() => import("./pages/LicensePage")); +const PrivacyPage = lazy(() => import("./pages/PrivacyPage")); const SupportersPage = lazy(() => import("./pages/SupportersPage")); const RiderCardPage = lazy(() => import("./pages/RiderCardPage")); const AmberCallbackPage = lazy(() => import("./pages/AmberCallbackPage")); @@ -140,6 +141,7 @@ export function AppRouter() { {/* Info pages */} } /> } /> + } /> } /> {/* Amber NIP-55 callback โ€” Amber redirects here after signing/login */} } /> diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 5c5573f..e4567a2 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -882,6 +882,12 @@ export function Layout({ children, noPadding }: LayoutProps) { > License + + Privacy + = { 'hey': "Hey skater! ๐Ÿค™ Ask me about spots near you, upcoming events, coaches, or anything SkateSpots.", 'who are you': "I'm The Sasquatch ๐Ÿฆง โ€” the AI guide for SkateSpots. I can find skate spots worldwide, look up events, coaches, filmers, and gear listings. All powered by live Nostr data. Ask away!", 'what can you do': "I can find skate spots by city or country, look up upcoming events, find coaches and filmers in The Lab, search gear listings, and answer questions about how the app works. Try: 'spots in Bangkok' or 'find a coach'! ๐Ÿ›น", - 'what is nostr': "Nostr is a simple, open protocol for decentralized social networks. Think Twitter but no one can ban you. You use cryptographic keys instead of usernames โ€” one account works everywhere across all Nostr apps! ๐Ÿ”‘", + 'what is nostr': "Nostr is a simple, open protocol for decentralized social networks. Think Twitter, but no single company controls it โ€” you use cryptographic keys instead of usernames, choose which relays store your data (or run your own), and one account works across every Nostr app! ๐Ÿ”‘", + // โ”€โ”€ Privacy โ€” answered locally so it's always accurate โ”€โ”€ + 'is this private': "Here's the honest rundown ๐Ÿ›ก๏ธ\n\nโ€ข Your **GPS location stays on your device** โ€” 'Near Me' just centers the map. It's never sent to us or published.\nโ€ข **Spots you add are public** (that's the point of a shared map) โ€” so don't drop a pin on your own front door.\nโ€ข **DMs & crew chats are end-to-end encrypted** โ€” only members can read them.\nโ€ข Like any website, servers you connect to (map tiles, relays) can see your **IP**. Want to hide that too? Use a VPN or Tor.\n\nFull details on the [Privacy page](/privacy). ๐Ÿ›น", + 'privacy': "Quick version ๐Ÿ›ก๏ธ: your GPS never leaves your device, spots you publish are public by design, and DMs/crew chats are end-to-end encrypted. Servers can still see your IP (normal for any website) โ€” a VPN or Tor hides that if you want. Full breakdown on the [Privacy page](/privacy).", + 'am i tracked': "SkateSpots doesn't track you โ€” no ads, no analytics profiling, no data selling, and there's no SkateSpots server collecting your location. Your GPS stays on your device. The one thing servers see (map tiles, relays) is your **IP** โ€” same as any website. Use a VPN or Tor to hide that. More on the [Privacy page](/privacy). ๐Ÿ›ก๏ธ", + 'do you track': "Nope โ€” no tracking, no ads, no data harvesting. Your GPS stays on your device and there's no central server logging you. Servers you connect to can see your IP (like any site); a VPN/Tor hides that. See the [Privacy page](/privacy). ๐Ÿ›น", + 'vpn': "Totally optional, but solid if you want extra privacy ๐Ÿ›ก๏ธ. A VPN hides your **IP** (rough location) from the servers SkateSpots talks to โ€” map tiles, relays, etc. Pick a no-logs provider you trust (e.g. Mullvad); avoid sketchy free ones.\n\nHeads up: a VPN does **not** hide the spots you publish (those are public), and don't turn on browser GPS if you're trying to stay anonymous. Full details on the [Privacy page](/privacy).", + 'tor': "Tor Browser gives you the strongest IP privacy โ€” it routes you through several relays so servers can't see your real IP ๐Ÿง…. Trade-off: it's slower, and maps + some Nostr relays may lag or block Tor exits. Great for the extra-cautious.\n\nRemember: Tor hides your IP, not the spots you publish, and don't enable browser GPS if anonymity is the goal. More on the [Privacy page](/privacy).", + 'hide my ip': "Two free options ๐Ÿ›ก๏ธ: a **reputable VPN** (easy, fast โ€” hides your IP behind their servers) or **Tor Browser** (max privacy, slower). Either one stops the servers SkateSpots connects to from seeing your real IP. Note they don't hide spots you publish. See the [Privacy page](/privacy).", + 'is my location': "Your location is safe ๐Ÿ“ โ€” 'Near Me' reads your GPS on your device only, to center the map and sort nearby spots. It's never published to Nostr, never sent to us, never shared. Only spots you deliberately add are public. Details on the [Privacy page](/privacy).", 'what are zaps': "Zaps are instant Bitcoin Lightning tips sent over Nostr! Click โšก on any content, send sats directly to the creator's wallet. Like hitting 'like' but with real money. Instant, peer-to-peer, no middlemen. โšก", '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. ๐Ÿฅœ", diff --git a/src/pages/OnboardingPage.tsx b/src/pages/OnboardingPage.tsx index f625ae7..8e87ae0 100644 --- a/src/pages/OnboardingPage.tsx +++ b/src/pages/OnboardingPage.tsx @@ -281,6 +281,17 @@ export default function OnboardingPage() { Deep dive: How Nostr works + + {/* Calm, optional privacy note โ€” links to the full Privacy page */} +

+ + Privacy tip: your GPS never leaves your device. Servers you connect to (like map tiles) + can still see your IP โ€” if you want to hide that too, a VPN or Tor works. Totally optional.{' '} + + Read our privacy page + + . +

{/* โ”€โ”€ Wallet (optional) โ”€โ”€ */} diff --git a/src/pages/PrivacyPage.tsx b/src/pages/PrivacyPage.tsx new file mode 100644 index 0000000..2bd4bfb --- /dev/null +++ b/src/pages/PrivacyPage.tsx @@ -0,0 +1,229 @@ +import { useSeoMeta } from '@unhead/react'; +import { Layout } from '@/components/Layout'; +import { Link } from 'react-router-dom'; +import { + Shield, + MapPin, + Globe, + Eye, + Lock, + Wifi, + Key, + CheckCircle2, + AlertTriangle, +} from 'lucide-react'; + +// โ”€โ”€โ”€ Small building blocks โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +function Section({ + icon: Icon, + color, + title, + children, +}: { + icon: React.ComponentType<{ className?: string }>; + color: string; + title: string; + children: React.ReactNode; +}) { + return ( +
+
+
+ +
+

{title}

+
+
{children}
+
+ ); +} + +function GoodPoint({ children }: { children: React.ReactNode }) { + return ( +
+ + {children} +
+ ); +} + +function Caveat({ children }: { children: React.ReactNode }) { + return ( +
+ + {children} +
+ ); +} + +export default function PrivacyPage() { + useSeoMeta({ + title: 'Privacy โ€” SkateSpots', + description: + 'How SkateSpots handles your data: your GPS stays on your device, spots you publish are public, and how to hide your IP with a VPN or Tor if you want to.', + }); + + return ( + +
+ {/* Hero */} +
+
+ +
+

+ Your + Privacy +

+

+ No tracking, no ads, no data selling. Here's exactly what stays on your device, + what's public, and how to lock things down further if you want to. +

+
+ +
+ {/* Location stays local */} +
+

+ When you tap "Near Me," your GPS location is + read on your device and used only to center the map and sort nearby spots. +

+ It is never published to Nostr. + It is never sent to SkateSpots โ€” there is no SkateSpots server collecting it. + It is never shared with any third party. + + On the native app we use your phone's own location system directly and skip Google + Play Services โ€” so it works on de-Googled phones (GrapheneOS, /e/OS) and Google + never sees it. + +

+ Weather is off by default. When you turn it on, it looks up conditions for the + spot's public location โ€” not yours. +

+
+ + {/* Public by design */} +
+

+ SkateSpots is a shared map, so some things are meant to be seen by everyone. When you + choose to publish them, these are public on the Nostr network: +

+ + Spots you add โ€” including their coordinates. + If you add a spot at your exact location, that location becomes public. Think before + you drop a pin on your own driveway. + + Reviews, comments, and your public profile (name, picture). + Who you follow, and public reactions/zaps. +

+ A VPN or Tor does not hide the content of what you publish โ€” a spot's + coordinates are public regardless. Privacy tools hide your network identity (your IP), + not the things you choose to post. +

+
+ + {/* Encrypted */} +
+ Direct messages and crew chats are end-to-end encrypted (NIP-17). Only the participants can read them. + My Stash โ€” your private gear inventory โ€” is encrypted to your own key. + Crew-only members can choose to be visible only to their crew-mates. +
+ + {/* IP / network */} +
+

+ Like every website, the servers SkateSpots talks to can see your{' '} + IP address (a rough indicator of your region). + This is normal for any web or map app and isn't unique to us. Those servers are: +

+
    +
  • Map tiles (OpenStreetMap) โ€” sees your IP and which area of the map you look at.
  • +
  • Nostr relays โ€” see your IP when the app reads/publishes.
  • +
  • Weather (Open-Meteo, opt-in) and image uploads (Blossom), when you use them.
  • +
+

+ None of these receive your GPS location โ€” but they do see your IP. If you'd rather hide + that too, read the next part. +

+
+ + {/* VPN / Tor */} +
+

+ For most skaters this isn't necessary โ€” but if you want to hide your IP and rough + location from the servers above, you have two free options: +

+
+
+

๐Ÿ›ก๏ธ A reputable VPN

+

+ Hides your IP behind the VPN's servers. Easy, fast, works everywhere. Pick a + no-logs provider you trust (e.g. Mullvad). Avoid sketchy "free" VPNs. +

+
+
+

๐Ÿง… Tor Browser

+

+ Free, maximum IP privacy, routes through multiple relays. Slower โ€” maps and some + Nostr relays may lag or block Tor exit nodes. Great for the extra-cautious. +

+
+
+
+

+ Read this so you're not fooled +

+ + A VPN/Tor hides your IP โ€” not the spots you + publish. A pin at your home is public whether or not you use a VPN. + + + Don't enable "Near Me" / browser GPS if your + goal is to stay anonymous โ€” precise GPS overrides any IP hiding. + + + No tool makes you fully "anonymous." These reduce what servers can infer about your + network location โ€” that's it. + +
+
+ + {/* Keys */} +
+

+ Your account is a cryptographic key pair that you own. The safest way to log in is a{' '} + signer (Alby, nos2x, or Amber on Android) so + your secret key never gets pasted into the app. +

+ + If you paste your nsec{' '} + directly, it's stored in your browser. Use a signer extension instead when you can, and + keep your nsec backup somewhere safe offline. + +
+ + {/* Footer */} +
+

+ Questions? Ask{' '} + The Sasquatch in-app, or read the{' '} + + getting started guide + + {' '}ยท{' '} + + About + +

+
+
+
+
+ ); +}