- {/* Header */}
-
-
- Explore
-
-
- Discover the latest text notes and profiles from the Nostr
-
-
+ useSeoMeta({
+ title: 'Discover · Nostr OS',
+ description: 'Explore notes and profiles through the Nostr network.',
+ });
+
+ return (
+
+
+
+ Public network scan
+ Follow the live signal.
+ A quiet window into the notes and profiles moving through your configured Nostr relays.
+
- {/* Tabs */}
-
+
Notes ({data?.textNotes?.length || 0})
@@ -184,7 +186,6 @@ export function Explore() {
- {/* Text Notes Tab */}
{isLoading && }
@@ -213,7 +214,6 @@ export function Explore() {
))}
- {/* Profiles Tab */}
{isLoading && (
@@ -265,6 +265,6 @@ export function Explore() {
-
+
);
}
diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx
index fb16a26..b998b5f 100644
--- a/src/pages/Index.tsx
+++ b/src/pages/Index.tsx
@@ -1,241 +1,87 @@
import { useSeoMeta } from '@unhead/react';
+import { ArrowUpRight, Boxes, Copy, Fingerprint, Network, Orbit, Sparkles, Terminal, Waves } from 'lucide-react';
+import { Link } from 'react-router-dom';
import { useState } from 'react';
-import { Button } from '@/components/ui/button';
-import { Card, CardContent } from '@/components/ui/card';
-import { CheckCircle2, Copy, Server, Gift, Users, Globe } from 'lucide-react';
+import { OsShell } from '@/components/navigation/OsShell';
import { useToast } from '@/hooks/useToast';
-import { LoginArea } from '@/components/auth/LoginArea';
+import { useCurrentUser } from '@/hooks/useCurrentUser';
+
+const workspaces = [
+ { title: 'Discover', detail: 'Live notes & people', path: '/explore', icon: Orbit, tone: 'from-cyan-400/20 to-blue-500/5', index: '01' },
+ { title: 'Activity', detail: 'Your Nostr footprint', path: '/dashboard', icon: Waves, tone: 'from-amber-300/20 to-orange-500/5', index: '02' },
+ { title: 'Studio', detail: 'Browse your events', path: '/dashboard/events', icon: Sparkles, tone: 'from-fuchsia-400/20 to-violet-500/5', index: '03' },
+ { title: 'Archive', detail: 'Export your follows', path: '/dashboard/export', icon: Boxes, tone: 'from-emerald-300/20 to-teal-500/5', index: '04' },
+];
const Index = () => {
const [copied, setCopied] = useState(false);
const { toast } = useToast();
+ const { user } = useCurrentUser();
const relayUrl = 'wss://relay.layer.systems';
useSeoMeta({
- title: 'LAYER.systems - Public Nostr Relay',
- description: 'A fast, reliable, and open Nostr relay serving the decentralized social network.',
+ title: 'Nostr OS · Layer Systems',
+ description: 'A beautiful operating system for your Nostr identity.',
});
- const copyToClipboard = async () => {
+ const copyRelay = async () => {
try {
await navigator.clipboard.writeText(relayUrl);
setCopied(true);
- toast({
- title: 'Copied!',
- description: 'Relay URL copied to clipboard',
- });
- setTimeout(() => setCopied(false), 2000);
+ window.setTimeout(() => setCopied(false), 1600);
+ toast({ title: 'Relay address copied', description: 'Paste it into any Nostr client.' });
} catch {
- toast({
- title: 'Failed to copy',
- description: 'Please copy the URL manually',
- variant: 'destructive',
- });
+ toast({ title: 'Could not copy relay address', description: relayUrl, variant: 'destructive' });
}
};
- const features = [
- {
- icon: Gift,
- title: 'Free',
- description: 'No cost to use - accessible for everyone',
- },
- {
- icon: Users,
- title: 'Community driven',
- description: 'Built and maintained by the Nostr community',
- },
- {
- icon: Globe,
- title: 'Global Network',
- description: 'Part of the decentralized Nostr ecosystem',
- },
- {
- icon: Server,
- title: 'Open Access',
- description: 'Free to use for all Nostr clients',
- },
- ];
-
return (
-
- {/* Header */}
-
-
- {/* Hero Section */}
-
- {/* Animated Background Elements */}
-
-
-
- {/* Status Badge */}
- {/*
*/}
-
- {/* Main Heading */}
-
-
-
- LAYER.systems
-
-
-
- Your gateway to the decentralized social network
-
-
- A fast, reliable, and open Nostr relay connecting you to the future of social media
-
-
-
- {/* Relay URL Card */}
-
-
-
-
-
-
-
Relay URL
-
- {relayUrl}
-
-
-
- {copied ? (
- <>
-
- Copied
- >
- ) : (
- <>
-
- Copy
- >
- )}
-
-
-
- Add this URL to your Nostr client to connect to LAYER.systems
-
-
-
-
-
-
- {/* Features Grid */}
-
-
Why Choose LAYER.systems?
-
- {features.map((feature, index) => (
-
-
-
-
-
-
-
{feature.title}
-
{feature.description}
-
-
-
- ))}
+
+
+
+
+
+
+
+ Personal signal online
+
+
One place for the network that belongs to you.
+
A calm control surface for your Nostr identity: discover public conversations, inspect your signal, and keep your network portable.
+
+
+ {user ? 'Open my activity' : 'Enter discover'}
+
+
+
Network routes
+
-
-
-
- {/* How to Connect Section */}
-
-
-
Getting Started
-
-
-
-
-
-
- 1
-
-
-
Choose Your Client
-
- Pick a Nostr client like Damus, Amethyst, Snort, or any other compatible application
-
-
-
-
-
- 2
-
-
-
Add the Relay
-
- In your client settings, add {relayUrl} to your relay list
-
-
-
-
-
- 3
-
-
-
Start Connecting
-
- You're all set! Start posting, following, and connecting with the Nostr network
-
-
-
-
-
-
+
+
Identity
+
{user ? 'Signer connected' : 'Your Nostr key is waiting'}
+
{user ? `${user.pubkey.slice(0, 12)}…${user.pubkey.slice(-8)}` : 'Use a signer extension or nsec login to begin.'}
+
Your identity never leaves your signer
-
+
- {/* Footer */}
-
+
);
}