Skip to content

Commit 3e458aa

Browse files
committed
feat: add /about, /privacy, /terms pages; fix footer links
1 parent 31799eb commit 3e458aa

4 files changed

Lines changed: 242 additions & 0 deletions

File tree

apps/web/app/about/page.tsx

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import type { Metadata } from 'next';
2+
import Link from 'next/link';
3+
4+
export const metadata: Metadata = {
5+
title: 'About',
6+
description: 'c0upons is a free, open-source community coupon platform built by Profullstack, Inc.',
7+
alternates: { canonical: 'https://c0upons.com/about' },
8+
};
9+
10+
export default function AboutPage() {
11+
return (
12+
<div className="max-w-2xl mx-auto flex flex-col gap-10">
13+
<div>
14+
<h1 className="text-3xl font-black text-gray-900">About c0upons</h1>
15+
<p className="text-gray-500 mt-2">Community-powered savings, open source and free forever.</p>
16+
</div>
17+
18+
<section className="flex flex-col gap-4">
19+
<h2 className="text-xl font-bold text-gray-900 border-b border-gray-200 pb-2">What is c0upons?</h2>
20+
<p className="text-gray-600 leading-relaxed">
21+
c0upons is a free, community-driven coupon code directory. Anyone can browse deals,
22+
copy promo codes, vote on the best ones, and submit new codes — no account required.
23+
The community votes codes up or down, so the most useful deals always rise to the top.
24+
</p>
25+
<p className="text-gray-600 leading-relaxed">
26+
We believe saving money shouldn't require installing a browser extension, creating an
27+
account, or wading through ads. c0upons is a fast, simple, open platform anyone can use
28+
and contribute to.
29+
</p>
30+
</section>
31+
32+
<section className="flex flex-col gap-4">
33+
<h2 className="text-xl font-bold text-gray-900 border-b border-gray-200 pb-2">Who built it?</h2>
34+
<p className="text-gray-600 leading-relaxed">
35+
c0upons is built and maintained by{' '}
36+
<a href="https://profullstack.com" target="_blank" rel="noopener noreferrer" className="text-orange-500 hover:underline font-medium">
37+
Profullstack, Inc.
38+
</a>{' '}
39+
— a software studio focused on open-source developer tools and community platforms.
40+
</p>
41+
<p className="text-gray-600 leading-relaxed">
42+
The project is open source under the MIT license. Contributions, bug reports,
43+
and feature requests are welcome on{' '}
44+
<a href="https://github.com/profullstack/c0upons" target="_blank" rel="noopener noreferrer" className="text-orange-500 hover:underline font-medium">
45+
GitHub
46+
</a>.
47+
</p>
48+
</section>
49+
50+
<section className="flex flex-col gap-4">
51+
<h2 className="text-xl font-bold text-gray-900 border-b border-gray-200 pb-2">How it works</h2>
52+
<ul className="flex flex-col gap-3">
53+
{[
54+
{ step: '1', title: 'Browse', desc: 'Search or browse by store to find coupon codes for hundreds of retailers.' },
55+
{ step: '2', title: 'Copy', desc: 'Click "Copy" to copy a coupon code instantly to your clipboard.' },
56+
{ step: '3', title: 'Vote', desc: 'Connect with CoinPay to vote codes up so the best ones stay visible.' },
57+
{ step: '4', title: 'Submit', desc: 'Found a code not on the site? Submit it in seconds via the submission form or REST API.' },
58+
].map((item) => (
59+
<li key={item.step} className="flex gap-4 items-start">
60+
<span className="w-7 h-7 bg-orange-500 text-white text-sm font-black rounded-full flex items-center justify-center shrink-0 mt-0.5">
61+
{item.step}
62+
</span>
63+
<div>
64+
<span className="font-semibold text-gray-900">{item.title}</span>
65+
<span className="text-gray-600">{item.desc}</span>
66+
</div>
67+
</li>
68+
))}
69+
</ul>
70+
</section>
71+
72+
<section className="flex flex-col gap-4">
73+
<h2 className="text-xl font-bold text-gray-900 border-b border-gray-200 pb-2">Contact</h2>
74+
<p className="text-gray-600">
75+
For general enquiries, bug reports, or partnership requests, email{' '}
76+
<a href="mailto:anthony@profullstack.com" className="text-orange-500 hover:underline font-medium">
77+
anthony@profullstack.com
78+
</a>.
79+
</p>
80+
<p className="text-gray-600">
81+
For security issues, see our{' '}
82+
<a href="/.well-known/security.txt" className="text-orange-500 hover:underline font-medium">
83+
security.txt
84+
</a>.
85+
</p>
86+
</section>
87+
88+
<div className="flex gap-4">
89+
<Link href="/" className="bg-orange-500 hover:bg-orange-600 text-white font-semibold px-5 py-2.5 rounded-xl text-sm transition-colors">
90+
Browse coupons
91+
</Link>
92+
<a
93+
href="https://github.com/profullstack/c0upons"
94+
target="_blank"
95+
rel="noopener noreferrer"
96+
className="border border-gray-200 hover:border-gray-300 text-gray-700 font-semibold px-5 py-2.5 rounded-xl text-sm transition-colors"
97+
>
98+
View on GitHub ↗
99+
</a>
100+
</div>
101+
</div>
102+
);
103+
}

apps/web/app/privacy/page.tsx

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import type { Metadata } from 'next';
2+
3+
export const metadata: Metadata = {
4+
title: 'Privacy Policy',
5+
description: 'Privacy policy for c0upons.com — what data we collect and how we use it.',
6+
alternates: { canonical: 'https://c0upons.com/privacy' },
7+
};
8+
9+
function Section({ title, children }: { title: string; children: React.ReactNode }) {
10+
return (
11+
<section className="flex flex-col gap-3">
12+
<h2 className="text-lg font-bold text-gray-900 border-b border-gray-200 pb-2">{title}</h2>
13+
<div className="flex flex-col gap-2 text-gray-600 leading-relaxed">{children}</div>
14+
</section>
15+
);
16+
}
17+
18+
export default function PrivacyPage() {
19+
return (
20+
<div className="max-w-2xl mx-auto flex flex-col gap-10">
21+
<div>
22+
<h1 className="text-3xl font-black text-gray-900">Privacy Policy</h1>
23+
<p className="text-gray-500 mt-2">Last updated: June 2026</p>
24+
</div>
25+
26+
<Section title="Overview">
27+
<p>
28+
c0upons.com is operated by Profullstack, Inc. This policy explains what personal data we
29+
collect, how we use it, and your rights. We keep it short because we collect very little.
30+
</p>
31+
</Section>
32+
33+
<Section title="Data we collect">
34+
<p><strong>Submitted coupons:</strong> When you submit a coupon, we store the coupon data you provide (store, code, title, description, discount, expiry date, URL). No account or email is required.</p>
35+
<p><strong>Authentication (optional):</strong> If you connect via CoinPay to vote on coupons, we receive and store your CoinPay DID (decentralised identifier) as a pseudonymous identifier. We do not receive your name, email, or payment information.</p>
36+
<p><strong>Server logs:</strong> Our hosting provider (Railway) may log standard server access data (IP address, user agent, request path, timestamps) for operational and security purposes. We do not retain these logs beyond Railway's standard retention period.</p>
37+
<p><strong>Analytics:</strong> We use CrawlProof for privacy-friendly site analytics. No cookies are set; no personal data is shared with third parties for advertising.</p>
38+
</Section>
39+
40+
<Section title="How we use data">
41+
<p>We use submitted coupon data solely to display coupons on the site. We use CoinPay DIDs solely to associate votes with an account so each user can vote once per coupon. We do not sell, rent, or share personal data with third parties for marketing.</p>
42+
</Section>
43+
44+
<Section title="Cookies">
45+
<p>We set session cookies for CoinPay authentication (HttpOnly, Secure, SameSite=Lax). These are strictly necessary for the voting feature and expire after 30 days or on logout. No advertising or tracking cookies are used.</p>
46+
</Section>
47+
48+
<Section title="Data retention">
49+
<p>Coupon submissions are retained indefinitely as public community data. CoinPay DIDs are retained while your vote history exists. You may request deletion of your vote history and associated DID by emailing us.</p>
50+
</Section>
51+
52+
<Section title="Your rights">
53+
<p>Under GDPR (EU/UK) and CCPA (California), you may have rights to access, correct, or delete personal data we hold about you. To exercise any right, email <a href="mailto:anthony@profullstack.com" className="text-orange-500 hover:underline">anthony@profullstack.com</a>.</p>
54+
</Section>
55+
56+
<Section title="Third-party services">
57+
<ul className="list-disc list-inside flex flex-col gap-1">
58+
<li><strong>Railway</strong> — cloud hosting (<a href="https://railway.com/legal/privacy" target="_blank" rel="noopener noreferrer" className="text-orange-500 hover:underline">privacy policy</a>)</li>
59+
<li><strong>SQLite Cloud</strong> — database provider</li>
60+
<li><strong>CoinPay</strong> — optional OAuth authentication for voting</li>
61+
<li><strong>CrawlProof</strong> — privacy-friendly analytics</li>
62+
</ul>
63+
</Section>
64+
65+
<Section title="Contact">
66+
<p>Profullstack, Inc. · <a href="mailto:anthony@profullstack.com" className="text-orange-500 hover:underline">anthony@profullstack.com</a></p>
67+
</Section>
68+
</div>
69+
);
70+
}

apps/web/app/terms/page.tsx

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import type { Metadata } from 'next';
2+
3+
export const metadata: Metadata = {
4+
title: 'Terms of Service',
5+
description: 'Terms of service for c0upons.com — rules for using and contributing to the platform.',
6+
alternates: { canonical: 'https://c0upons.com/terms' },
7+
};
8+
9+
function Section({ title, children }: { title: string; children: React.ReactNode }) {
10+
return (
11+
<section className="flex flex-col gap-3">
12+
<h2 className="text-lg font-bold text-gray-900 border-b border-gray-200 pb-2">{title}</h2>
13+
<div className="flex flex-col gap-2 text-gray-600 leading-relaxed">{children}</div>
14+
</section>
15+
);
16+
}
17+
18+
export default function TermsPage() {
19+
return (
20+
<div className="max-w-2xl mx-auto flex flex-col gap-10">
21+
<div>
22+
<h1 className="text-3xl font-black text-gray-900">Terms of Service</h1>
23+
<p className="text-gray-500 mt-2">Last updated: June 2026</p>
24+
</div>
25+
26+
<Section title="Acceptance">
27+
<p>By using c0upons.com you agree to these terms. If you do not agree, do not use the site.</p>
28+
</Section>
29+
30+
<Section title="Service description">
31+
<p>c0upons.com is a free, community-driven directory of coupon codes and deals. We do not guarantee the accuracy, validity, or availability of any coupon. Codes are submitted by community members and may be expired or incorrect.</p>
32+
</Section>
33+
34+
<Section title="Acceptable use">
35+
<p>You may use c0upons.com to browse, search, copy, and submit coupon codes for personal use. You must not:</p>
36+
<ul className="list-disc list-inside flex flex-col gap-1">
37+
<li>Submit false, misleading, or spam coupon data</li>
38+
<li>Attempt to manipulate voting through bots or multiple accounts</li>
39+
<li>Scrape the site at a rate that degrades service for others</li>
40+
<li>Use the service for any unlawful purpose</li>
41+
</ul>
42+
</Section>
43+
44+
<Section title="Community submissions">
45+
<p>By submitting a coupon, you grant Profullstack, Inc. a perpetual, royalty-free licence to display and distribute the submitted data on c0upons.com and via the API. You represent that you have the right to submit the data and that it does not infringe any third-party rights.</p>
46+
<p>We reserve the right to remove any submission that violates these terms or that we determine, in our sole discretion, is inappropriate.</p>
47+
</Section>
48+
49+
<Section title="Disclaimer of warranties">
50+
<p>The service is provided "as is" without warranties of any kind, express or implied. We do not warrant that coupons are valid, that the service will be uninterrupted, or that errors will be corrected.</p>
51+
</Section>
52+
53+
<Section title="Limitation of liability">
54+
<p>To the fullest extent permitted by law, Profullstack, Inc. shall not be liable for any indirect, incidental, special, or consequential damages arising from your use of c0upons.com.</p>
55+
</Section>
56+
57+
<Section title="Changes">
58+
<p>We may update these terms at any time. Continued use of the service after changes constitutes acceptance of the revised terms.</p>
59+
</Section>
60+
61+
<Section title="Contact">
62+
<p>Profullstack, Inc. · <a href="mailto:anthony@profullstack.com" className="text-orange-500 hover:underline">anthony@profullstack.com</a></p>
63+
</Section>
64+
</div>
65+
);
66+
}

apps/web/components/Footer.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ export default function Footer() {
3333
<Link href="/stores" className="hover:text-white transition-colors">All Stores</Link>
3434
<Link href="/search" className="hover:text-white transition-colors">Search</Link>
3535
<Link href="/submit" className="hover:text-white transition-colors">Submit a Code</Link>
36+
<Link href="/about" className="hover:text-white transition-colors">About</Link>
37+
<Link href="/privacy" className="hover:text-white transition-colors">Privacy</Link>
38+
<Link href="/terms" className="hover:text-white transition-colors">Terms</Link>
3639
</div>
3740

3841
<div className="flex flex-col gap-3 text-sm">

0 commit comments

Comments
 (0)