diff --git a/src/app/demo/page.tsx b/src/app/demo/page.tsx
new file mode 100644
index 0000000..734bd82
--- /dev/null
+++ b/src/app/demo/page.tsx
@@ -0,0 +1,481 @@
+import Link from 'next/link'
+import type { Metadata } from 'next'
+
+export const metadata: Metadata = {
+ title: 'rMaps Demo - CCC Camp 2026',
+ description: 'See how rMaps helps you find your friends at events. A demo showcasing real-time location sharing, event maps, and privacy-first friend finding at CCC Camp 2026.',
+ openGraph: {
+ title: 'rMaps Demo - CCC Camp 2026',
+ description: 'Privacy-first real-time location sharing for events. Find your crew at CCC Camp 2026.',
+ url: 'https://rmaps.online/demo',
+ siteName: 'rMaps',
+ type: 'website',
+ },
+}
+
+/* ─── Mock Data ─────────────────────────────────────────────── */
+
+const friends = [
+ {
+ name: 'Mika',
+ emoji: '🦊',
+ color: '#10b981',
+ status: 'At Main Stage',
+ lastSeen: '1 min ago',
+ x: 520,
+ y: 155,
+ online: true,
+ },
+ {
+ name: 'Zara',
+ emoji: '🐙',
+ color: '#6366f1',
+ status: 'Heading to Food Court',
+ lastSeen: '3 min ago',
+ x: 340,
+ y: 260,
+ online: true,
+ },
+ {
+ name: 'Leo',
+ emoji: '🐻',
+ color: '#f59e0b',
+ status: 'In Tent',
+ lastSeen: '12 min ago',
+ x: 160,
+ y: 310,
+ online: false,
+ },
+ {
+ name: 'Ren',
+ emoji: '🦉',
+ color: '#ef4444',
+ status: 'At Workshop Hall',
+ lastSeen: '2 min ago',
+ x: 640,
+ y: 290,
+ online: true,
+ },
+ {
+ name: 'Juno',
+ emoji: '🐧',
+ color: '#ec4899',
+ status: 'Getting coffee',
+ lastSeen: '5 min ago',
+ x: 400,
+ y: 180,
+ online: true,
+ },
+ {
+ name: 'Kai',
+ emoji: '🐝',
+ color: '#06b6d4',
+ status: 'At Soldering Village',
+ lastSeen: '8 min ago',
+ x: 280,
+ y: 130,
+ online: true,
+ },
+]
+
+const statusOptions = [
+ 'At Main Stage',
+ 'Heading to Food Court',
+ 'In Tent',
+ 'At Workshop Hall',
+ 'Getting coffee',
+ 'At Soldering Village',
+ 'Exploring',
+ 'At the Lake',
+ 'On my way!',
+]
+
+/* ─── SVG Camp Map ─────────────────────────────────────────── */
+
+function CampMap() {
+ return (
+
+
+ {/* Background terrain */}
+
+
+ {/* Grass / ground patches */}
+
+
+
+ {/* Paths - main walkways */}
+
+
+
+
+
+ {/* ── Area: Main Stage (top right) ── */}
+
+
+ STAGE
+ Main Stage
+
+ {/* ── Area: Food Court (center-left) ── */}
+
+ {/* Food stall icons */}
+
+
+
+
+
+
+ Food Court
+
+ {/* ── Area: Workshops (right) ── */}
+
+
+
+
+
+ Workshops
+
+ {/* ── Area: Camping (bottom-left) ── */}
+
+ {/* Tent icons */}
+
+
+
+
+ Camping
+
+ {/* ── Area: Soldering Village (top-left) ── */}
+
+
+
+ Soldering Village
+
+ {/* ── Area: Info / Coffee (center) ── */}
+
+ ☕
+ INFO
+
+ {/* ── Entrance marker ── */}
+
+ ENTER
+
+ {/* ── Trees / decoration ── */}
+
+
+
+
+
+
+ {/* ── Friend markers ── */}
+ {friends.map((f) => (
+
+ {/* Pulse ring for online friends */}
+ {f.online && (
+
+
+
+
+ )}
+ {/* Dot */}
+
+ {/* Emoji */}
+ {f.emoji}
+ {/* Name label */}
+
+ {f.name}
+
+ ))}
+
+
+ {/* Map legend */}
+
+
+ Stage
+
+
+ Food
+
+
+ Workshops
+
+
+ Camping
+
+
+
+ {/* Simulated live badge */}
+
+
+ Live
+
+
+ )
+}
+
+/* ─── Friend List Panel ────────────────────────────────────── */
+
+function FriendListPanel() {
+ return (
+
+
+
+ 👥
+ Friends in Room
+
+
{friends.filter((f) => f.online).length}/{friends.length} online
+
+
+ {friends.map((f) => (
+
+ {/* Avatar */}
+
+ {f.emoji}
+
+
+ {/* Info */}
+
+
+ {f.name}
+
+
+
{f.status}
+
+
+ {/* Last seen */}
+
{f.lastSeen}
+
+ ))}
+
+
+ {/* Status selector preview */}
+
+
Your status:
+
+ {statusOptions.slice(0, 5).map((s) => (
+
+ {s}
+
+ ))}
+
+ +{statusOptions.length - 5} more
+
+
+
+
+ )
+}
+
+/* ─── Page ──────────────────────────────────────────────────── */
+
+export default function DemoPage() {
+ return (
+
+ {/* Nav */}
+
+
+
+
+
+ rM
+
+
rMaps
+
+
/
+
Demo
+
+
+ Create Your Map
+
+
+
+
+ {/* Hero / Event Header */}
+
+
+
+
+ Live Demo
+
+
+ CCC Camp 2026
+
+
+ Find your friends across the campground in real time
+
+
+ 📍 Ziegeleipark Mildenberg
+ 📅 Aug 2026
+ 👥 6 friends connected
+
+
+ {/* Member avatars */}
+
+ {friends.map((f) => (
+
+ {f.emoji}
+
+ ))}
+
6 friends
+
+
+
+
+ {/* Intro text */}
+
+
+ This demo shows how rMaps works at a
+ real event. See your friends on the camp map, check their status, and find each other without
+ sharing your location with any central server.
+
+
+
+ {/* Main Demo Content */}
+
+
+ {/* Map - takes 2 columns */}
+
+
+
+
+ 🗺️
+ Camp Map
+
+
+ Last updated 2 min ago
+
+
+
+
+
+
+
+
+ {/* Friend List - 1 column */}
+
+
+
+
+
+
+ {/* How It Works (brief) */}
+
+ How rMaps Works at Events
+
+
+
+ 📱
+
+
Open & Share
+
+ Create a map room and share the link with your crew. No app install needed.
+
+
+
+
+ 📍
+
+
See Everyone
+
+ Friends appear on the map in real time. Set your status so everyone knows where you are.
+
+
+
+
+ 🔒
+
+
Stay Private
+
+ Only people in your room see your location. Go invisible anytime. No tracking.
+
+
+
+
+
+ {/* Bottom CTA */}
+
+
+
Ready to Find Your Friends?
+
+ Create a map room for your next event. Share the link, and never lose your crew in the crowd again.
+
+
+ Create Your Map
+
+
+
+
+ {/* Footer */}
+
+
+ )
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index c604721..d5be12c 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -2,6 +2,7 @@
import { useState, useEffect } from 'react';
import { useRouter } from 'next/navigation';
+import Link from 'next/link';
import { nanoid } from 'nanoid';
import { AuthButton } from '@/components/AuthButton';
import { useAuthStore } from '@/stores/auth';
@@ -99,165 +100,324 @@ export default function HomePage() {
};
return (
-
-
- {/* Logo/Title */}
-
-
- r Maps
-
-
Find your friends at events
-
-
+
+ {/* ── Hero Section ─────────────────────────────────────────── */}
+
+ {/* Subtle background grid */}
+
- {/* Quick Rejoin Card - show when user has saved info and last room */}
- {isLoaded && name && lastRoom && (
-
-
Welcome back, {name}!
-
+ {/* Logo */}
+
+
+ {/* Headline */}
+
+ Find Your Friends, Anywhere
+
+
+ Privacy-first real-time location sharing for events, festivals, and camps.
+ See where your crew is without trusting a central server.
+
+
+ {/* CTA buttons */}
+
+
-
{emoji}
-
Rejoin /{lastRoom}
-
-
- Or create/join a different room below
+ Try the Demo
+
+
+ Get Started
+
+
+
+
+ No app install. No sign-up required to join a room.
+
+
+
+
+ {/* ── Feature Cards ────────────────────────────────────────── */}
+
+
+ {/* Real-time GPS */}
+
+
+
Real-time GPS
+
+ Share your live location with friends. See everyone on the map updating in real time as you move.
- )}
- {/* Main Card */}
-
- {/* User Setup */}
-
-
Your Profile
-
-
- Your Name
- setName(e.target.value)}
- placeholder="Enter your name"
- className="input w-full"
- maxLength={20}
- />
-
-
-
-
Your Avatar
-
- {EMOJI_OPTIONS.map((e) => (
- setEmoji(e)}
- className={`w-10 h-10 rounded-lg text-xl flex items-center justify-center transition-all ${
- emoji === e
- ? 'bg-rmaps-primary scale-110'
- : 'bg-white/10 hover:bg-white/20'
- }`}
- >
- {e}
-
- ))}
-
+ {/* Event Maps */}
+
+
+
Event Maps
+
+ Navigate festivals, camps, and conferences. Custom maps with labeled stages, food courts, and meeting points.
+
-
-
- {/* Create Room */}
- {!isCreating ? (
-
-
setIsCreating(true)}
- className="btn-primary w-full text-lg py-3"
- disabled={!name.trim() || !isAuthenticated}
- title={!isAuthenticated ? 'Sign in with EncryptID to create rooms' : ''}
- >
- {isAuthenticated ? 'Create New Map' : 'Sign in to Create Map'}
-
-
-
or
-
- {/* Join Room */}
-
- setJoinSlug(e.target.value)}
- placeholder="Enter room name or code"
- className="input w-full"
- />
-
- Join Existing Map
-
-
+ {/* Privacy First */}
+
+
- ) : (
-
-
-
- Room Name (optional)
-
-
- setRoomName(e.target.value)}
- placeholder="e.g., 39c3-crew"
- className="input flex-1"
- maxLength={20}
- />
- .rmaps.online
-
-
- Leave blank for a random code
-
-
+
Privacy First
+
+ Zero-knowledge architecture. You control who sees you. Go invisible anytime. No tracking, no data collection.
+
+
+
+
-
- setIsCreating(false)}
- className="btn-ghost flex-1"
- >
- Cancel
-
-
- Create Map
-
-
+ {/* ── How It Works ─────────────────────────────────────────── */}
+
+ How It Works
+
+ {/* Step 1 */}
+
+
+ 1
- )}
+
Create a Map Room
+
+ Sign in and create a room for your event. Get a shareable link like rmaps.online/ccc-camp
+
+
+
+ {/* Step 2 */}
+
+
+ 2
+
+
Share with Friends
+
+ Send the link to your crew. They join instantly from any device -- no app download, no account needed.
+
+
+
+ {/* Step 3 */}
+
+
+ 3
+
+
Find Each Other
+
+ See everyone on the map in real time. Set your status, share meeting points, and never lose your friends again.
+
+
- {/* Footer */}
-
-
Privacy-first location sharing
-
- Built for{' '}
+ {/* Connector lines (decorative) */}
+
+
+
+ {/* ── Get Started (existing login/room interface) ──────────── */}
+
+
+
+ {/* Section heading */}
+
+
Get Started
+
Create or join a map room
+
+
+
+ {/* Quick Rejoin Card - show when user has saved info and last room */}
+ {isLoaded && name && lastRoom && (
+
+
Welcome back, {name}!
+
+ {emoji}
+ Rejoin /{lastRoom}
+
+
+ Or create/join a different room below
+
+
+ )}
+
+ {/* Main Card */}
+
+ {/* User Setup */}
+
+
Your Profile
+
+
+ Your Name
+ setName(e.target.value)}
+ placeholder="Enter your name"
+ className="input w-full"
+ maxLength={20}
+ />
+
+
+
+
Your Avatar
+
+ {EMOJI_OPTIONS.map((e) => (
+ setEmoji(e)}
+ className={`w-10 h-10 rounded-lg text-xl flex items-center justify-center transition-all ${
+ emoji === e
+ ? 'bg-rmaps-primary scale-110'
+ : 'bg-white/10 hover:bg-white/20'
+ }`}
+ >
+ {e}
+
+ ))}
+
+
+
+
+
+
+ {/* Create Room */}
+ {!isCreating ? (
+
+
setIsCreating(true)}
+ className="btn-primary w-full text-lg py-3"
+ disabled={!name.trim() || !isAuthenticated}
+ title={!isAuthenticated ? 'Sign in with EncryptID to create rooms' : ''}
+ >
+ {isAuthenticated ? 'Create New Map' : 'Sign in to Create Map'}
+
+
+
or
+
+ {/* Join Room */}
+
+ setJoinSlug(e.target.value)}
+ placeholder="Enter room name or code"
+ className="input w-full"
+ />
+
+ Join Existing Map
+
+
+
+ ) : (
+
+
+
+ Room Name (optional)
+
+
+ setRoomName(e.target.value)}
+ placeholder="e.g., 39c3-crew"
+ className="input flex-1"
+ maxLength={20}
+ />
+ .rmaps.online
+
+
+ Leave blank for a random code
+
+
+
+
+ setIsCreating(false)}
+ className="btn-ghost flex-1"
+ >
+ Cancel
+
+
+ Create Map
+
+
+
+ )}
+
+
+
+
+
+ {/* ── Ecosystem Footer ─────────────────────────────────────── */}
+
-
+
+
);
}