mirror of
https://github.com/layer-systems/website.git
synced 2026-06-17 01:58:30 +02:00
Add Terms and Privacy pages and update routing in AppRouter
This commit is contained in:
@@ -4,6 +4,8 @@ import { ScrollToTop } from "./components/ScrollToTop";
|
||||
import Index from "./pages/Index";
|
||||
import { Explore } from "./pages/Explore";
|
||||
import { NIP19Page } from "./pages/NIP19Page";
|
||||
import { Terms } from "./pages/Terms";
|
||||
import { Privacy } from "./pages/Privacy";
|
||||
import NotFound from "./pages/NotFound";
|
||||
|
||||
export function AppRouter() {
|
||||
@@ -13,6 +15,8 @@ export function AppRouter() {
|
||||
<Routes>
|
||||
<Route path="/" element={<Index />} />
|
||||
<Route path="/explore" element={<Explore />} />
|
||||
<Route path="/terms" element={<Terms />} />
|
||||
<Route path="/privacy" element={<Privacy />} />
|
||||
{/* NIP-19 route for npub1, note1, naddr1, nevent1, nprofile1 */}
|
||||
<Route path="/:nip19" element={<NIP19Page />} />
|
||||
{/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */}
|
||||
|
||||
@@ -208,9 +208,19 @@ const Index = () => {
|
||||
<p className="text-sm text-muted-foreground">
|
||||
© {new Date().getFullYear()} LAYER.systems. Powered by Nostr.
|
||||
</p>
|
||||
<div className="flex items-center gap-2 text-sm text-muted-foreground">
|
||||
<Server className="w-4 h-4" />
|
||||
<span>Open and free for all</span>
|
||||
<div className="flex items-center gap-4">
|
||||
<div className="flex items-center gap-2 text-sm text-muted-foreground">
|
||||
<Server className="w-4 h-4" />
|
||||
<span>Open and free for all</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-4 text-sm">
|
||||
<a href="/terms" className="text-muted-foreground hover:text-foreground transition-colors">
|
||||
Terms
|
||||
</a>
|
||||
<a href="/privacy" className="text-muted-foreground hover:text-foreground transition-colors">
|
||||
Privacy
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
278
src/pages/Privacy.tsx
Normal file
278
src/pages/Privacy.tsx
Normal file
@@ -0,0 +1,278 @@
|
||||
import { useSeoMeta } from '@unhead/react';
|
||||
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
|
||||
import { Shield } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
export function Privacy() {
|
||||
useSeoMeta({
|
||||
title: 'Privacy Policy - LAYER.systems',
|
||||
description: 'Privacy Policy for LAYER.systems Nostr relay',
|
||||
});
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-gradient-to-br from-background via-background to-muted/20">
|
||||
{/* Header */}
|
||||
<header className="border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
|
||||
<div className="container mx-auto px-4 py-4">
|
||||
<Link to="/" className="inline-flex items-center gap-2 text-xl font-bold hover:opacity-80 transition-opacity">
|
||||
<Shield className="h-6 w-6" />
|
||||
<span>LAYER.systems</span>
|
||||
</Link>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
{/* Main Content */}
|
||||
<main className="container mx-auto px-4 py-12 max-w-4xl">
|
||||
<div className="space-y-8">
|
||||
{/* Hero Section */}
|
||||
<div className="text-center space-y-4 pb-8">
|
||||
<div className="inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 mb-4">
|
||||
<Shield className="h-8 w-8 text-primary" />
|
||||
</div>
|
||||
<h1 className="text-4xl font-bold tracking-tight">Privacy Policy</h1>
|
||||
<p className="text-muted-foreground text-lg">
|
||||
Last updated: December 27, 2025
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Introduction */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>Introduction</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
LAYER.systems is committed to protecting your privacy. This Privacy Policy explains how we collect, use, and safeguard information when you use our Nostr relay service.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Information We Collect */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>1. Information We Collect</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<h3 className="text-lg font-semibold mt-4">Nostr Events</h3>
|
||||
<p>
|
||||
As a Nostr relay, we receive and store events published to our service. These events are public by design and include:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Event content and metadata</li>
|
||||
<li>Public keys (npub) of event authors</li>
|
||||
<li>Timestamps and event signatures</li>
|
||||
<li>Tags and references to other events or users</li>
|
||||
</ul>
|
||||
|
||||
<h3 className="text-lg font-semibold mt-4">Technical Information</h3>
|
||||
<p>
|
||||
When you connect to our relay, we may collect:
|
||||
</p>
|
||||
<ul>
|
||||
<li>IP addresses for security and rate limiting purposes</li>
|
||||
<li>Connection timestamps</li>
|
||||
<li>WebSocket connection metadata</li>
|
||||
<li>Request patterns and usage statistics</li>
|
||||
</ul>
|
||||
|
||||
<h3 className="text-lg font-semibold mt-4">Website Analytics</h3>
|
||||
<p>
|
||||
Our website may use analytics tools to understand how users interact with our service. This may include:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Page views and navigation patterns</li>
|
||||
<li>Browser type and device information</li>
|
||||
<li>Referrer information</li>
|
||||
</ul>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* How We Use Information */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>2. How We Use Information</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
We use collected information to:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Provide and maintain the relay service</li>
|
||||
<li>Improve service performance and reliability</li>
|
||||
<li>Prevent abuse, spam, and malicious activity</li>
|
||||
<li>Comply with legal obligations</li>
|
||||
<li>Analyze usage patterns to improve the service</li>
|
||||
</ul>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Data Storage and Security */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>3. Data Storage and Security</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
<strong>Public Data:</strong> Events published to our relay are public and may be replicated by other relays in the Nostr network. Once published, events cannot be guaranteed to be deleted from all relays.
|
||||
</p>
|
||||
<p>
|
||||
<strong>Security Measures:</strong> We implement reasonable security measures to protect our infrastructure, including:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Encrypted connections (WSS/TLS)</li>
|
||||
<li>Rate limiting and abuse prevention</li>
|
||||
<li>Regular security audits</li>
|
||||
<li>Secure server configuration</li>
|
||||
</ul>
|
||||
<p>
|
||||
However, no method of transmission over the internet is 100% secure, and we cannot guarantee absolute security.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Data Retention */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>4. Data Retention</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
We retain Nostr events according to our relay policies, which may vary based on:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Event kind and type</li>
|
||||
<li>Storage capacity and resource constraints</li>
|
||||
<li>Content moderation decisions</li>
|
||||
<li>Legal requirements</li>
|
||||
</ul>
|
||||
<p>
|
||||
Technical logs (IP addresses, connection data) are typically retained for 30-90 days for security and operational purposes.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Third-Party Services */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>5. Third-Party Services</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
Our service may interact with third-party services, including:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Other Nostr relays in the network</li>
|
||||
<li>Content delivery networks (CDNs)</li>
|
||||
<li>Analytics providers</li>
|
||||
<li>Infrastructure providers</li>
|
||||
</ul>
|
||||
<p>
|
||||
These third parties have their own privacy policies, and we encourage you to review them.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Your Rights */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>6. Your Rights and Choices</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
<strong>Content Control:</strong> You control the events you publish. Use deletion events (kind 5) to request deletion of your content, though we cannot guarantee deletion from all relays in the network.
|
||||
</p>
|
||||
<p>
|
||||
<strong>Pseudonymity:</strong> Nostr uses public key cryptography. Your public key (npub) serves as your identity, and you can generate new keys at any time to maintain pseudonymity.
|
||||
</p>
|
||||
<p>
|
||||
<strong>Data Access:</strong> All events published to our relay are publicly queryable through standard Nostr protocols.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Cookies and Tracking */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>7. Cookies and Tracking</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
Our website uses local storage and may use cookies to:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Store user preferences (theme, settings)</li>
|
||||
<li>Maintain login sessions</li>
|
||||
<li>Remember relay configurations</li>
|
||||
</ul>
|
||||
<p>
|
||||
You can control cookies through your browser settings. Disabling cookies may affect some functionality.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Children's Privacy */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>8. Children's Privacy</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
Our service is not directed to children under 13 years of age. We do not knowingly collect personal information from children under 13. If you believe a child has provided us with personal information, please contact us.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* International Users */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>9. International Users</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
LAYER.systems may be accessed from anywhere in the world. By using our service, you consent to the transfer of your information to our servers, which may be located in different jurisdictions.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Changes to Privacy Policy */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>10. Changes to This Privacy Policy</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
We may update this Privacy Policy from time to time. Changes will be posted on this page with an updated revision date. Your continued use of the service after changes constitutes acceptance of the updated policy.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Contact */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>11. Contact Us</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
If you have questions or concerns about this Privacy Policy or our privacy practices, please contact us through the Nostr protocol or via our website.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
{/* Footer Navigation */}
|
||||
<div className="mt-12 pt-8 border-t text-center space-y-4">
|
||||
<div className="flex justify-center gap-6 text-sm">
|
||||
<Link to="/" className="text-muted-foreground hover:text-foreground transition-colors">
|
||||
Home
|
||||
</Link>
|
||||
<Link to="/terms" className="text-muted-foreground hover:text-foreground transition-colors">
|
||||
Terms of Service
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default Privacy;
|
||||
214
src/pages/Terms.tsx
Normal file
214
src/pages/Terms.tsx
Normal file
@@ -0,0 +1,214 @@
|
||||
import { useSeoMeta } from '@unhead/react';
|
||||
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
|
||||
import { ScrollText } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
export function Terms() {
|
||||
useSeoMeta({
|
||||
title: 'Terms of Service - LAYER.systems',
|
||||
description: 'Terms of Service for LAYER.systems Nostr relay',
|
||||
});
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-gradient-to-br from-background via-background to-muted/20">
|
||||
{/* Header */}
|
||||
<header className="border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
|
||||
<div className="container mx-auto px-4 py-4">
|
||||
<Link to="/" className="inline-flex items-center gap-2 text-xl font-bold hover:opacity-80 transition-opacity">
|
||||
<ScrollText className="h-6 w-6" />
|
||||
<span>LAYER.systems</span>
|
||||
</Link>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
{/* Main Content */}
|
||||
<main className="container mx-auto px-4 py-12 max-w-4xl">
|
||||
<div className="space-y-8">
|
||||
{/* Hero Section */}
|
||||
<div className="text-center space-y-4 pb-8">
|
||||
<div className="inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 mb-4">
|
||||
<ScrollText className="h-8 w-8 text-primary" />
|
||||
</div>
|
||||
<h1 className="text-4xl font-bold tracking-tight">Terms of Service</h1>
|
||||
<p className="text-muted-foreground text-lg">
|
||||
Last updated: December 27, 2025
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Introduction */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>Introduction</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
Welcome to LAYER.systems. By accessing and using our Nostr relay service, you agree to be bound by these Terms of Service. Please read them carefully.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Service Description */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>1. Service Description</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
LAYER.systems provides a public Nostr relay service that allows users to publish and query events on the Nostr protocol. The service is provided "as is" and we make no guarantees about uptime, data persistence, or availability.
|
||||
</p>
|
||||
<ul>
|
||||
<li>The relay may be temporarily unavailable due to maintenance or technical issues</li>
|
||||
<li>Events may be deleted or modified at our discretion</li>
|
||||
<li>We reserve the right to refuse service to any user</li>
|
||||
</ul>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* User Conduct */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>2. User Conduct</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
By using LAYER.systems, you agree not to:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Publish illegal content or content that violates applicable laws</li>
|
||||
<li>Engage in spam, phishing, or other abusive behaviors</li>
|
||||
<li>Attempt to disrupt or compromise the security of the relay</li>
|
||||
<li>Use the service to harass, threaten, or harm others</li>
|
||||
<li>Impersonate others or misrepresent your identity</li>
|
||||
<li>Violate intellectual property rights</li>
|
||||
</ul>
|
||||
<p>
|
||||
We reserve the right to remove content and ban users who violate these terms.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Content Policy */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>3. Content Policy</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
You retain all rights to content you publish through our relay. However, by publishing content, you grant us a non-exclusive, worldwide license to store, cache, and distribute your content as necessary to operate the service.
|
||||
</p>
|
||||
<p>
|
||||
We may remove content that:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Violates applicable laws or regulations</li>
|
||||
<li>Infringes on intellectual property rights</li>
|
||||
<li>Contains malware or malicious code</li>
|
||||
<li>Violates our content policies</li>
|
||||
</ul>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Limitation of Liability */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>4. Limitation of Liability</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
LAYER.systems is provided "as is" without warranties of any kind. To the fullest extent permitted by law, we disclaim all warranties, express or implied.
|
||||
</p>
|
||||
<p>
|
||||
We are not liable for:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Any data loss or corruption</li>
|
||||
<li>Service interruptions or downtime</li>
|
||||
<li>Content published by users</li>
|
||||
<li>Indirect, incidental, or consequential damages</li>
|
||||
<li>Loss of profits or revenue</li>
|
||||
</ul>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Privacy */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>5. Privacy</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
Your use of LAYER.systems is also governed by our{' '}
|
||||
<Link to="/privacy" className="text-primary hover:underline">
|
||||
Privacy Policy
|
||||
</Link>
|
||||
. Please review it to understand how we collect and use information.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Changes to Terms */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>6. Changes to Terms</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
We reserve the right to modify these Terms of Service at any time. Changes will be effective immediately upon posting. Your continued use of the service after changes constitutes acceptance of the modified terms.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Termination */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>7. Termination</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
We may terminate or suspend your access to the service at any time, without prior notice, for any reason, including violation of these Terms of Service.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Governing Law */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>8. Governing Law</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
These Terms of Service are governed by and construed in accordance with applicable laws. Any disputes shall be resolved in the appropriate courts.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Contact */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>9. Contact</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p>
|
||||
If you have questions about these Terms of Service, please contact us through the Nostr protocol or via our website.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
{/* Footer Navigation */}
|
||||
<div className="mt-12 pt-8 border-t text-center space-y-4">
|
||||
<div className="flex justify-center gap-6 text-sm">
|
||||
<Link to="/" className="text-muted-foreground hover:text-foreground transition-colors">
|
||||
Home
|
||||
</Link>
|
||||
<Link to="/privacy" className="text-muted-foreground hover:text-foreground transition-colors">
|
||||
Privacy Policy
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default Terms;
|
||||
Reference in New Issue
Block a user