Skip to content

Commit 5f24db5

Browse files
agustinkassisclauderolznz
authored
Add Privacy Policy and Terms of Use pages (#15)
* feat: add Privacy Policy and Terms of Use pages Add /privacy and /terms routes with content reflecting how the service actually works (custodial, hourly fee, death-when-broke, public graveyard epitaphs, per-IP rate limits, cookieless Umami analytics). Link both from the footer. These pages are required to integrate lncurl.lol with third-party platforms such as WordPress, which mandate a publicly accessible terms of use and privacy policy. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix: remove recoverable amount in terms --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
1 parent 48850fc commit 5f24db5

3 files changed

Lines changed: 452 additions & 19 deletions

File tree

frontend/src/App.tsx

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { Graveyard } from "@/pages/Graveyard";
66
import { About } from "@/pages/About";
77
import { Blog } from "@/pages/Blog";
88
import { BlogPost } from "@/pages/BlogPost";
9+
import { Privacy } from "@/pages/Privacy";
10+
import { Terms } from "@/pages/Terms";
911
import { NotFound } from "@/pages/NotFound";
1012

1113
function Nav() {
@@ -45,25 +47,35 @@ function Nav() {
4547

4648
function Footer() {
4749
return (
48-
<footer className="border-t border-border mt-12 py-6 text-center text-sm text-muted-foreground">
49-
Powered by{" "}
50-
<a
51-
href="https://getalby.com/alby-hub?ref=lncurl"
52-
target="_blank"
53-
rel="noopener noreferrer"
54-
className="text-terminal hover:underline"
55-
>
56-
Alby Hub
57-
</a>{" "}
58-
+{" "}
59-
<a
60-
href="https://nwc.dev"
61-
target="_blank"
62-
rel="noopener noreferrer"
63-
className="text-terminal hover:underline"
64-
>
65-
Nostr Wallet Connect
66-
</a>
50+
<footer className="border-t border-border mt-12 py-6 text-center text-sm text-muted-foreground space-y-3">
51+
<div>
52+
Powered by{" "}
53+
<a
54+
href="https://getalby.com/alby-hub?ref=lncurl"
55+
target="_blank"
56+
rel="noopener noreferrer"
57+
className="text-terminal hover:underline"
58+
>
59+
Alby Hub
60+
</a>{" "}
61+
+{" "}
62+
<a
63+
href="https://nwc.dev"
64+
target="_blank"
65+
rel="noopener noreferrer"
66+
className="text-terminal hover:underline"
67+
>
68+
Nostr Wallet Connect
69+
</a>
70+
</div>
71+
<div className="flex justify-center gap-4 font-mono text-xs">
72+
<Link to="/privacy" className="hover:text-foreground transition-colors">
73+
Privacy
74+
</Link>
75+
<Link to="/terms" className="hover:text-foreground transition-colors">
76+
Terms
77+
</Link>
78+
</div>
6779
</footer>
6880
);
6981
}
@@ -82,6 +94,8 @@ export default function App() {
8294
<Route path="/about" element={<About />} />
8395
<Route path="/blog" element={<Blog />} />
8496
<Route path="/blog/:slug" element={<BlogPost />} />
97+
<Route path="/privacy" element={<Privacy />} />
98+
<Route path="/terms" element={<Terms />} />
8599
<Route path="*" element={<NotFound />} />
86100
</Routes>
87101
</main>

frontend/src/pages/Privacy.tsx

Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
import { Link } from "react-router-dom";
2+
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
3+
4+
const LAST_UPDATED = "June 21, 2026";
5+
6+
export function Privacy() {
7+
return (
8+
<div className="space-y-8">
9+
<div>
10+
<h1 className="text-2xl font-bold">Privacy Policy</h1>
11+
<p className="text-muted-foreground">
12+
What lncurl.lol collects, and what it doesn't.
13+
</p>
14+
<p className="text-sm mt-1 text-muted-foreground font-mono">
15+
Last updated: {LAST_UPDATED}
16+
</p>
17+
</div>
18+
19+
{/* TL;DR */}
20+
<Card className="border-terminal">
21+
<CardHeader className="pb-2">
22+
<CardTitle className="text-sm font-mono text-terminal">
23+
TL;DR
24+
</CardTitle>
25+
</CardHeader>
26+
<CardContent className="space-y-2 text-sm">
27+
<p>
28+
There are no accounts and no sign-up. We don't ask for your name,
29+
email, or any personal information. Wallets are created with a single
30+
HTTP call and identified only by their connection secret, which we
31+
cannot recover for you.
32+
</p>
33+
<p>
34+
The little data we do touch exists to run the service, stop abuse,
35+
and keep the lights on. We don't sell it.
36+
</p>
37+
</CardContent>
38+
</Card>
39+
40+
{/* What we collect */}
41+
<Card>
42+
<CardHeader className="pb-2">
43+
<CardTitle className="text-sm font-mono text-muted-foreground">
44+
WHAT WE COLLECT
45+
</CardTitle>
46+
</CardHeader>
47+
<CardContent className="space-y-4 text-sm">
48+
<div>
49+
<p className="font-bold">IP addresses</p>
50+
<p className="text-muted-foreground">
51+
When you create a wallet we temporarily process your IP address to
52+
enforce rate limits (wallet creation is capped per IP per hour). It
53+
is not tied to a profile and is not used to identify you beyond
54+
abuse prevention.
55+
</p>
56+
</div>
57+
58+
<div>
59+
<p className="font-bold">Wallet metadata</p>
60+
<p className="text-muted-foreground">
61+
We store the operational data needed to run each wallet: its
62+
lightning address, creation time, balance, and lifecycle status
63+
(alive or dead). Wallets are custodial and live on a single shared{" "}
64+
<a
65+
href="https://getalby.com/alby-hub?ref=lncurl"
66+
target="_blank"
67+
rel="noopener noreferrer"
68+
className="text-terminal hover:underline"
69+
>
70+
Alby Hub
71+
</a>{" "}
72+
instance.
73+
</p>
74+
</div>
75+
76+
<div>
77+
<p className="font-bold">Epitaphs and public stats</p>
78+
<p className="text-muted-foreground">
79+
If you attach an epitaph (a "last words" message) when creating a
80+
wallet, that message is{" "}
81+
<strong>public</strong>. It is displayed on the{" "}
82+
<Link to="/graveyard" className="text-terminal hover:underline">
83+
Graveyard
84+
</Link>{" "}
85+
when the wallet dies, along with the wallet's generated name and
86+
how long it survived. Do not put anything sensitive or personal in
87+
an epitaph.
88+
</p>
89+
</div>
90+
91+
<div>
92+
<p className="font-bold">Analytics</p>
93+
<p className="text-muted-foreground">
94+
We use{" "}
95+
<a
96+
href="https://umami.is"
97+
target="_blank"
98+
rel="noopener noreferrer"
99+
className="text-terminal hover:underline"
100+
>
101+
Umami
102+
</a>
103+
, a privacy-friendly, cookieless analytics tool, to count page
104+
views and understand which pages get traffic. It does not use
105+
cookies and does not collect personal information or build a
106+
cross-site profile of you.
107+
</p>
108+
</div>
109+
</CardContent>
110+
</Card>
111+
112+
{/* What we don't collect */}
113+
<Card>
114+
<CardHeader className="pb-2">
115+
<CardTitle className="text-sm font-mono text-muted-foreground">
116+
WHAT WE DON'T DO
117+
</CardTitle>
118+
</CardHeader>
119+
<CardContent className="space-y-2 text-sm">
120+
<ul className="list-disc list-inside space-y-1 text-muted-foreground">
121+
<li>No accounts, no passwords, no email collection.</li>
122+
<li>No tracking cookies and no advertising networks.</li>
123+
<li>No selling or renting of any data to third parties.</li>
124+
<li>No KYC and no identity verification.</li>
125+
</ul>
126+
</CardContent>
127+
</Card>
128+
129+
{/* Third parties */}
130+
<Card>
131+
<CardHeader className="pb-2">
132+
<CardTitle className="text-sm font-mono text-muted-foreground">
133+
THIRD PARTIES
134+
</CardTitle>
135+
</CardHeader>
136+
<CardContent className="space-y-2 text-sm">
137+
<p className="text-muted-foreground">
138+
Running a custodial lightning wallet means some data necessarily
139+
passes through infrastructure we don't control:
140+
</p>
141+
<ul className="list-disc list-inside space-y-1 text-muted-foreground">
142+
<li>
143+
<a
144+
href="https://getalby.com/alby-hub?ref=lncurl"
145+
target="_blank"
146+
rel="noopener noreferrer"
147+
className="text-terminal hover:underline"
148+
>
149+
Alby Hub
150+
</a>{" "}
151+
and the{" "}
152+
<a
153+
href="https://nwc.dev"
154+
target="_blank"
155+
rel="noopener noreferrer"
156+
className="text-terminal hover:underline"
157+
>
158+
Nostr Wallet Connect
159+
</a>{" "}
160+
relays handle wallet operations and connection strings.
161+
</li>
162+
<li>
163+
The bitcoin lightning network is a public payment network. Payment
164+
routing data is shared with other nodes by design and is outside
165+
our control.
166+
</li>
167+
<li>
168+
Our hosting provider processes requests in order to serve the site.
169+
</li>
170+
</ul>
171+
</CardContent>
172+
</Card>
173+
174+
{/* Retention */}
175+
<Card>
176+
<CardHeader className="pb-2">
177+
<CardTitle className="text-sm font-mono text-muted-foreground">
178+
DATA RETENTION
179+
</CardTitle>
180+
</CardHeader>
181+
<CardContent className="space-y-2 text-sm">
182+
<p className="text-muted-foreground">
183+
When a wallet runs out of sats it is destroyed and its connection
184+
stops working. A record of the dead wallet — its name, epitaph, and
185+
lifespan — is kept on the public Graveyard for posterity. We retain
186+
aggregate, non-identifying service statistics indefinitely.
187+
</p>
188+
</CardContent>
189+
</Card>
190+
191+
{/* Contact */}
192+
<Card>
193+
<CardHeader className="pb-2">
194+
<CardTitle className="text-sm font-mono text-muted-foreground">
195+
QUESTIONS
196+
</CardTitle>
197+
</CardHeader>
198+
<CardContent className="space-y-2 text-sm">
199+
<p className="text-muted-foreground">
200+
This is a small, experimental service. If you have a question about
201+
privacy, open an issue on{" "}
202+
<a
203+
href="https://github.com/rolznz/lncurl"
204+
target="_blank"
205+
rel="noopener noreferrer"
206+
className="text-terminal hover:underline"
207+
>
208+
GitHub
209+
</a>
210+
. See also our{" "}
211+
<Link to="/terms" className="text-terminal hover:underline">
212+
Terms of Use
213+
</Link>
214+
.
215+
</p>
216+
</CardContent>
217+
</Card>
218+
</div>
219+
);
220+
}

0 commit comments

Comments
 (0)