feat: organizers, meetups UI, Plausible analytics, and migration tooling

- Add organizer model/API, admin and public organizer pages, meetup cards
- Refresh events/home/contact; add calendar dialog and carousel components
- Optional Plausible via NEXT_PUBLIC_PLAUSIBLE_* env vars in root layout
- Prisma migration, seed updates, baseline-and-migrate script

Made-with: Cursor
This commit is contained in:
bbe
2026-04-04 21:55:34 +02:00
parent 586b572f73
commit 78271ea110
37 changed files with 1555 additions and 301 deletions

View File

@@ -6,10 +6,11 @@ import { Footer } from "@/components/public/Footer";
export const metadata: Metadata = {
title: "Privacy Policy",
description:
"Privacy policy for the Belgian Bitcoin Embassy website. We collect minimal data, use no tracking cookies, and respect your sovereignty.",
"GDPR-oriented privacy policy for the Belgian Bitcoin Embassy. Learn what data we process, why we process it, and your rights.",
openGraph: {
title: "Privacy Policy - Belgian Bitcoin Embassy",
description: "How we handle your data. Minimal collection, no tracking, full transparency.",
description:
"How we process data for account access, moderation, and community features, with clear GDPR rights and transparency.",
},
alternates: { canonical: "/privacy" },
};
@@ -20,43 +21,93 @@ export default function PrivacyPage() {
<Navbar />
<div className="min-h-screen">
<div className="max-w-3xl mx-auto px-8 pt-16 pb-24">
<h1 className="text-4xl font-black mb-8">Privacy Policy</h1>
<h1 className="text-4xl font-black mb-3">Privacy Policy</h1>
<p className="text-sm text-on-surface-variant mb-8">Last updated: April 3, 2026</p>
<div className="space-y-8 text-on-surface-variant leading-relaxed">
<section>
<h2 className="text-xl font-bold text-on-surface mb-4">Overview</h2>
<h2 className="text-xl font-bold text-on-surface mb-4">Who We Are</h2>
<p>
The Belgian Bitcoin Embassy values your privacy. This website is designed
to collect as little personal data as possible. We do not use tracking
cookies, analytics services, or advertising networks.
Belgian Bitcoin Embassy is a community initiative focused on Bitcoin education
and meetups in Belgium. We aim to process the minimum data needed to run this
website safely and reliably.
</p>
</section>
<section>
<h2 className="text-xl font-bold text-on-surface mb-4">Data We Collect</h2>
<h2 className="text-xl font-bold text-on-surface mb-4">What Data We Process</h2>
<p>
If you log in using a Nostr extension, we store your public key to
identify your session. Public keys are, by nature, public information
on the Nostr network. We do not collect email addresses, names, or
any other personal identifiers.
If you log in with Nostr, we process your public key, role, and optional
username. We also process content needed to operate the site, such as posts,
submissions, media metadata, and moderation records. Some Nostr-related data
may be cached on our servers to improve performance.
</p>
</section>
<section>
<h2 className="text-xl font-bold text-on-surface mb-4">Nostr Interactions</h2>
<h2 className="text-xl font-bold text-on-surface mb-4">Why We Process Data</h2>
<p>
Likes and comments are published to the Nostr network via your own
extension. These are peer-to-peer actions and are not stored on our
servers beyond local caching for display purposes.
We process data to provide core site features, maintain account sessions,
prevent abuse, moderate community interactions, and keep the service secure.
Our legal bases are contract (or steps requested by you before using features)
and legitimate interests (security, integrity, and service operation).
</p>
</section>
<section>
<h2 className="text-xl font-bold text-on-surface mb-4">Local Storage</h2>
<h2 className="text-xl font-bold text-on-surface mb-4">Cookies and Local Storage</h2>
<p>
We use browser local storage to persist your authentication session.
You can clear this at any time by logging out or clearing your
browser data.
We currently do not use third-party analytics or advertising cookies. We do use
browser local storage to keep your authentication session active. You can clear
this data at any time by logging out or clearing browser storage.
</p>
</section>
<section>
<h2 className="text-xl font-bold text-on-surface mb-4">Recipients</h2>
<p>
When you interact through Nostr, your actions are published on the Nostr network,
which is public by design. We may also use infrastructure providers to host and
secure the website.
</p>
</section>
<section>
<h2 className="text-xl font-bold text-on-surface mb-4">Retention</h2>
<p>
We keep account and operational data only as long as needed for service operation,
security, and moderation. Technical logs may be retained for a limited period.
You can remove local browser data at any time.
</p>
</section>
<section>
<h2 className="text-xl font-bold text-on-surface mb-4">Your GDPR Rights</h2>
<p>
Depending on applicable law, you may have rights to access, rectify, erase, restrict,
object to, or request portability of your personal data. You also have the right to
lodge a complaint with the Belgian Data Protection Authority.
</p>
</section>
<section>
<h2 className="text-xl font-bold text-on-surface mb-4">International Transfers</h2>
<p>
If technical providers process data outside the EEA, we aim to rely on appropriate
safeguards as required under GDPR.
</p>
</section>
<section>
<h2 className="text-xl font-bold text-on-surface mb-4">Children</h2>
<p>This website is not directed at children under the age of 16.</p>
</section>
<section>
<h2 className="text-xl font-bold text-on-surface mb-4">Policy Updates</h2>
<p>
We may update this Privacy Policy from time to time. Material changes are reflected
by updating the date at the top of this page.
</p>
</section>