Skip to content

Commit b84774d

Browse files
authored
Merge pull request #836 from emwulrd/fix/issues-767-769-772-774
fixed all issue
2 parents 7dad65f + 7ac7db2 commit b84774d

7 files changed

Lines changed: 534 additions & 1 deletion

File tree

frontend/public/icon-192.png

509 KB
Loading

frontend/public/icon-512.png

509 KB
Loading

frontend/public/manifest.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"name": "NovaSupport",
3+
"short_name": "NovaSupport",
4+
"description": "Stellar-native creator support",
5+
"start_url": "/",
6+
"display": "standalone",
7+
"background_color": "#0d1117",
8+
"theme_color": "#00e5be",
9+
"icons": [
10+
{ "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
11+
{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }
12+
]
13+
}

frontend/src/app/create/page.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,16 @@ export default function CreatePage() {
588588
</div>
589589

590590
<p className="text-center text-[10px] uppercase tracking-[0.2em] text-steel/35">
591-
By continuing you agree to the NovaSupport Protocol Terms.
591+
By continuing you agree to the{" "}
592+
<a
593+
href="/terms"
594+
target="_blank"
595+
rel="noopener noreferrer"
596+
className="underline underline-offset-2 hover:text-steel/60 transition"
597+
>
598+
NovaSupport Protocol Terms
599+
</a>
600+
.
592601
</p>
593602
</div>
594603
</div>

frontend/src/app/layout.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ export const metadata: Metadata = {
77
title: "NovaSupport",
88
description:
99
"Stellar-native support profiles for maintainers, creators, and developers.",
10+
// #774: PWA manifest and theme color
11+
manifest: "/manifest.json",
12+
themeColor: "#00e5be",
1013
openGraph: {
1114
title: "NovaSupport",
1215
description:

frontend/src/app/privacy/page.tsx

Lines changed: 301 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,301 @@
1+
import type { Metadata } from "next";
2+
import Link from "next/link";
3+
import { AppShell } from "@/components/app-shell";
4+
5+
export const metadata: Metadata = {
6+
title: "Privacy Policy · NovaSupport",
7+
description:
8+
"Learn how NovaSupport collects, uses, and protects your data — including wallet addresses, on-chain data, and GDPR/CCPA rights.",
9+
openGraph: {
10+
title: "Privacy Policy · NovaSupport",
11+
description:
12+
"Learn how NovaSupport handles your data on the Stellar-native creator support platform.",
13+
type: "website",
14+
},
15+
};
16+
17+
export default function PrivacyPage() {
18+
return (
19+
<AppShell>
20+
<div className="mx-auto max-w-3xl px-4 py-16 space-y-10 text-sky/80">
21+
<header className="space-y-2">
22+
<h1 className="text-4xl font-bold tracking-tight text-white">
23+
Privacy Policy
24+
</h1>
25+
<p className="text-sm text-steel">Last updated: July 24, 2026</p>
26+
</header>
27+
28+
<Section title="1. Introduction">
29+
<p>
30+
NovaSupport ("we", "our", or "us") operates the NovaSupport
31+
platform, a Stellar-native creator support service. This Privacy
32+
Policy explains what personal data we collect, why we collect it,
33+
how we use it, and the rights you have regarding your information.
34+
</p>
35+
<p>
36+
By using NovaSupport you agree to the practices described in this
37+
Policy. If you do not agree, please discontinue use of the Platform.
38+
</p>
39+
</Section>
40+
41+
<Section title="2. Data We Collect">
42+
<h3 className="text-white font-medium mt-2">
43+
2.1 Data you provide directly
44+
</h3>
45+
<ul className="list-disc pl-6 space-y-1 mt-1">
46+
<li>
47+
<strong className="text-white/80">Display name and bio</strong>
48+
shown publicly on your creator profile.
49+
</li>
50+
<li>
51+
<strong className="text-white/80">Email address</strong>
52+
optional; used only for notification emails. Never shown publicly.
53+
</li>
54+
<li>
55+
<strong className="text-white/80">Social handles</strong> (Twitter,
56+
GitHub) — optional; shown publicly on your profile.
57+
</li>
58+
<li>
59+
<strong className="text-white/80">Website URL</strong> — optional;
60+
shown on your profile.
61+
</li>
62+
<li>
63+
<strong className="text-white/80">Avatar image</strong> — uploaded
64+
to and served from Supabase Storage.
65+
</li>
66+
</ul>
67+
68+
<h3 className="text-white font-medium mt-4">
69+
2.2 Wallet addresses
70+
</h3>
71+
<p>
72+
Your Stellar wallet public key (G…) is used to authenticate you and
73+
to route supporter payments to you. It is stored in our database and
74+
displayed publicly on your profile page. It is also recorded
75+
permanently on the Stellar blockchain for every transaction. We never
76+
have access to your private key or seed phrase.
77+
</p>
78+
79+
<h3 className="text-white font-medium mt-4">2.3 On-chain data</h3>
80+
<p>
81+
When a supporter sends you Stellar assets, the transaction hash,
82+
amount, asset code, sender address, and timestamp are recorded on the
83+
Stellar Network and in our database. This data is public by nature
84+
of the Stellar blockchain and cannot be deleted from the ledger.
85+
</p>
86+
87+
<h3 className="text-white font-medium mt-4">
88+
2.4 Automatically collected data
89+
</h3>
90+
<ul className="list-disc pl-6 space-y-1 mt-1">
91+
<li>
92+
IP addresses — used transiently for rate limiting and abuse
93+
prevention; not linked to your profile and not stored long-term.
94+
</li>
95+
<li>
96+
HTTP request logs — retained for up to 30 days for security and
97+
diagnostics, then purged.
98+
</li>
99+
<li>
100+
Profile view counts — aggregate only; no individual visitor
101+
tracking.
102+
</li>
103+
</ul>
104+
</Section>
105+
106+
<Section title="3. How We Use Your Data">
107+
<ul className="list-disc pl-6 space-y-1">
108+
<li>To authenticate you via Stellar wallet signature.</li>
109+
<li>
110+
To display your public creator profile to potential supporters.
111+
</li>
112+
<li>
113+
To send transactional email notifications when you receive
114+
support (if you have verified an email address and enabled this
115+
option).
116+
</li>
117+
<li>To process and verify Stellar payment transactions.</li>
118+
<li>
119+
To enforce rate limits and protect the Platform from abuse.
120+
</li>
121+
<li>
122+
To send optional weekly digest emails summarising your support
123+
activity (opt-in only).
124+
</li>
125+
</ul>
126+
<p className="mt-2">
127+
We do not sell, rent, or trade your personal data to third parties.
128+
</p>
129+
</Section>
130+
131+
<Section title="4. Data Sharing">
132+
<p>We share data with the following third parties only as necessary:</p>
133+
<ul className="list-disc pl-6 space-y-1 mt-2">
134+
<li>
135+
<strong className="text-white/80">Supabase</strong> — database
136+
hosting and avatar image storage. Data is processed under their
137+
Data Processing Agreement.
138+
</li>
139+
<li>
140+
<strong className="text-white/80">SMTP provider</strong> — for
141+
transactional email delivery. Only your email address and first
142+
name are transmitted.
143+
</li>
144+
<li>
145+
<strong className="text-white/80">Sentry</strong> — error
146+
monitoring. Wallet addresses may appear in error traces; we
147+
configure Sentry to scrub PII where possible.
148+
</li>
149+
<li>
150+
<strong className="text-white/80">Stellar Network</strong>
151+
transaction data is broadcast to and permanently stored on the
152+
public Stellar blockchain.
153+
</li>
154+
</ul>
155+
</Section>
156+
157+
<Section title="5. Cookies and Local Storage">
158+
<p>
159+
NovaSupport uses an <strong className="text-white/80">httpOnly
160+
cookie</strong> named <code className="text-mint text-xs bg-white/5 px-1 py-0.5 rounded">auth_token</code> to
161+
maintain your authenticated session. This cookie is set after you
162+
sign in with your Stellar wallet, expires after 1 hour, and is not
163+
accessible to JavaScript (reducing XSS risk).
164+
</p>
165+
<p className="mt-2">
166+
We use browser <code className="text-mint text-xs bg-white/5 px-1 py-0.5 rounded">localStorage</code> to
167+
store your chosen username and UI preferences (e.g. theme). No
168+
tracking or advertising cookies are used.
169+
</p>
170+
</Section>
171+
172+
<Section title="6. Data Retention">
173+
<ul className="list-disc pl-6 space-y-1">
174+
<li>
175+
Profile data is retained for as long as your account is active.
176+
</li>
177+
<li>
178+
Transaction records are retained indefinitely for audit and
179+
compliance purposes (they are also immutably recorded on the
180+
Stellar blockchain).
181+
</li>
182+
<li>
183+
Email addresses are deleted within 30 days of account deletion.
184+
</li>
185+
<li>HTTP logs are purged after 30 days.</li>
186+
</ul>
187+
</Section>
188+
189+
<Section title="7. Your Rights (GDPR & CCPA)">
190+
<p>
191+
Depending on where you are located, you may have the following
192+
rights:
193+
</p>
194+
<ul className="list-disc pl-6 space-y-1 mt-2">
195+
<li>
196+
<strong className="text-white/80">Access</strong> — request a copy
197+
of the personal data we hold about you.
198+
</li>
199+
<li>
200+
<strong className="text-white/80">Rectification</strong> — correct
201+
inaccurate personal data via your profile settings.
202+
</li>
203+
<li>
204+
<strong className="text-white/80">Erasure ("right to be
205+
forgotten")</strong> — request deletion of your profile and
206+
off-chain data. Note that on-chain transaction data cannot be
207+
erased from the Stellar blockchain.
208+
</li>
209+
<li>
210+
<strong className="text-white/80">Portability</strong> — export
211+
your transaction history as CSV via the Creator Dashboard.
212+
</li>
213+
<li>
214+
<strong className="text-white/80">Opt-out of sale</strong> — we do
215+
not sell personal data; this right is satisfied by default.
216+
</li>
217+
<li>
218+
<strong className="text-white/80">Withdraw consent</strong>
219+
unsubscribe from email notifications at any time in your
220+
Notification Preferences.
221+
</li>
222+
</ul>
223+
<p className="mt-2">
224+
To exercise these rights, email{" "}
225+
<a
226+
href="mailto:privacy@novasupport.xyz"
227+
className="text-mint hover:underline"
228+
>
229+
privacy@novasupport.xyz
230+
</a>
231+
. We will respond within 30 days.
232+
</p>
233+
</Section>
234+
235+
<Section title="8. Security">
236+
<p>
237+
We implement industry-standard security measures including HTTPS
238+
encryption in transit, httpOnly session cookies, rate limiting, CORS
239+
restrictions, and input sanitisation. However, no system is
240+
completely secure. You are responsible for securing your Stellar
241+
wallet private key.
242+
</p>
243+
</Section>
244+
245+
<Section title="9. Children's Privacy">
246+
<p>
247+
NovaSupport is not directed at children under 18. We do not
248+
knowingly collect personal data from minors. If you believe a minor
249+
has provided us with personal data, please contact us immediately.
250+
</p>
251+
</Section>
252+
253+
<Section title="10. Changes to This Policy">
254+
<p>
255+
We may update this Privacy Policy periodically. Changes will be
256+
posted on this page with an updated "Last updated" date. Continued
257+
use of the Platform after changes constitutes acceptance of the
258+
revised Policy.
259+
</p>
260+
</Section>
261+
262+
<Section title="11. Contact">
263+
<p>
264+
For privacy-related questions, contact us at{" "}
265+
<a
266+
href="mailto:privacy@novasupport.xyz"
267+
className="text-mint hover:underline"
268+
>
269+
privacy@novasupport.xyz
270+
</a>
271+
.
272+
</p>
273+
</Section>
274+
275+
<div className="border-t border-white/10 pt-8 text-sm text-steel flex gap-6">
276+
<Link href="/terms" className="hover:text-mint transition-colors">
277+
Terms of Service
278+
</Link>
279+
<Link href="/" className="hover:text-mint transition-colors">
280+
← Back to Home
281+
</Link>
282+
</div>
283+
</div>
284+
</AppShell>
285+
);
286+
}
287+
288+
function Section({
289+
title,
290+
children,
291+
}: {
292+
title: string;
293+
children: React.ReactNode;
294+
}) {
295+
return (
296+
<section className="space-y-3">
297+
<h2 className="text-xl font-semibold text-white">{title}</h2>
298+
<div className="text-sky/70 leading-relaxed space-y-2">{children}</div>
299+
</section>
300+
);
301+
}

0 commit comments

Comments
 (0)