9.5 KiB
Belgian Bitcoin Embassy Website
1. Overview
The Belgian Bitcoin Embassy (BBE) website is a community-driven, Nostr-powered platform centered around a monthly Bitcoin meetup in Belgium.
It is not a corporate site or institutional platform. It is a lightweight, curated Nostr client that:
- showcases the next meetup
- connects users to the community
- displays curated Bitcoin content
- allows users to interact via Nostr (likes, comments)
The platform combines a simple public website with a role-based admin/moderation system.
2. Core Goals
The website must:
- clearly present the next monthly meetup
- grow the Belgian Bitcoin community
- aggregate and curate Nostr content
- allow social interaction via Nostr
- remain simple, fast, and easy to maintain
3. Tech Direction
Frontend:
- Next.js (App Router recommended)
- Component-based architecture
- Tailwind CSS (based on design system)
Backend:
- Lightweight API (Node.js / Go)
- Nostr integration layer
- Caching layer for events and posts
Auth:
- Nostr extension login (NIP-07 or signer)
4. Public Website Structure
Routes
/→ Onepage homepage/blog→ Blog overview/blog/[slug]→ Blog post page/admin→ Dashboard (role-based)
5. Homepage (Onepage)
5.1 Hero
- Headline: Biggest Bitcoin community in Belgium
- Subtext: Monthly meetup + community
- CTA:
- Join Meetup
- Join Telegram
- Follow on Nostr
5.2 Next Meetup
Critical section.
Fields:
- title
- date
- time
- city
- venue
- description
- link
Actions:
- Attend / RSVP
5.3 About
Short explanation:
- what BBE is
- community-driven
- beginner friendly
5.4 Why Join
- meet local Bitcoiners
- learn Bitcoin
- discover events
- connect with community
5.5 Community Links
Platforms:
- Telegram
- Nostr
- X
- YouTube
- Discord
Each includes:
- icon
- short description
- link
5.6 Blog Preview
- featured posts
- latest posts
- categories
5.7 FAQ
- beginner friendly?
- do I need bitcoin?
- cost?
- location?
5.8 Final CTA
- join meetup
- follow community
6. Blog System (Nostr-Based)
Source
- Nostr longform events
- imported manually by admins
Flow
- Admin inputs event id or naddr
- Backend fetches from relays
- Event is parsed and cached
- Admin edits metadata
- Post is published
Blog Page /blog
- list of posts
- category filters
- featured post
Blog Post /blog/[slug]
- title
- content
- categories
- author
- Nostr interactions:
- likes
- comments
7. Nostr Interaction Layer
Users can:
- login with Nostr
- like posts (reactions)
- comment (replies)
- interact with events
Backend:
- fetch events from relays
- cache data
- apply local moderation
Important:
- no deletion on Nostr
- moderation is local only
8. Roles & Auth
Auth
- Nostr login (extension)
- signature verification
- session/JWT
Roles
Defined by pubkeys.
Admins:
- set in
.env
Moderators:
- assigned by admins
9. Admin Dashboard
Route: /admin
Admins have full control.
Tabs
9.1 Overview
- meetup summary
- latest posts
- quick actions
9.2 Events
- create/edit meetups
- mark upcoming/past
- manage event content
- moderate comments
9.3 Blog
- import Nostr posts
- edit metadata
- assign categories
- publish/unpublish
- feature posts
9.4 Moderation
- view comments
- filter by post/event
- hide content
- block pubkeys (local)
9.5 Users
- list users (pubkeys)
- promote to moderator
- remove moderator
- block users
9.6 Categories
- create/edit/delete
- reorder
9.7 Relays
- add/remove relays
- set priority
- test connectivity
9.8 Settings
- site title
- tagline
- social links
- feature toggles
9.9 Nostr Tools
- manual fetch
- cache refresh
- debug events
10. Moderator Dashboard
Moderators have content-only control.
Tabs
10.1 Moderation
- comment stream
- hide spam
- filter content
10.2 Events
- view meetups
- moderate comments
- minor edits
10.3 Blog
- edit metadata
- assign categories
- publish/unpublish
10.4 Reports (optional)
- flagged content
- moderation actions
11. Data Models
Meetup
- title
- description
- date
- location
- link
- status
Blog Post
- nostr_event_id
- title
- slug
- content
- excerpt
- categories
- featured
- visible
Category
- name
- slug
User
- pubkey
- role
12. Component Structure
Public:
- HeroSection
- NextMeetupCard
- AboutSection
- CommunityLinks
- BlogPreview
- FAQSection
Admin:
- AdminSidebar
- MeetupEditor
- PostManager
- CategoryManager
- SettingsPanel
13. Design Principles
- dark theme
- Bitcoin orange accent
- large whitespace
- no borders (use spacing)
- layered surfaces
- minimal animation
14. MVP Scope
Build first:
- homepage
- blog
- blog post page
- Nostr login
- admin dashboard
- moderator dashboard
- meetup system
- Nostr blog import
15. Key Principle
This is not a CMS.
This is a curated Nostr client for a Bitcoin meetup community.
Keep it simple, fast, and focused on:
- meetup
- community
- content
pages.md
1. Routing Overview
Public routes:
/→ Homepage (onepage)/blog→ Blog listing/blog/[slug]→ Blog detail
Auth / Dashboard routes:
/admin→ Dashboard entry (role-based)/admin/overview/admin/events/admin/blog/admin/moderation/admin/users(admin only)/admin/categories/admin/relays(admin only)/admin/settings(admin only)/admin/nostr(admin only tools)
System routes (optional):
/api/*→ Backend endpoints/health→ Health check
All /admin/* routes require Nostr authentication.
2. Layouts
2.1 Public Layout
Used by / and /blog*
Structure:
- Top Navigation
- Page Content
- Footer
Top Navigation:
- Logo (BBE)
- Links (scroll or anchor):
- Meetup
- About
- Community
- Blog
- CTA button: Join Meetup
Footer:
- Logo
- Links: Privacy, Terms, Contact
- Social links
2.2 Admin Layout
Used by /admin/*
Structure:
- Sidebar (left)
- Content area (right)
- Top bar (optional)
Sidebar:
- Overview
- Events
- Blog
- Moderation
- Categories
- (Admins only)
- Users
- Relays
- Settings
- Nostr Tools
Role-based rendering:
- Moderator sees limited menu
- Admin sees full menu
3. Homepage /
Single page composed of sections.
Sections (top to bottom)
3.1 HeroSection
Content:
- headline
- subtext
- CTA buttons:
- Join Meetup
- Join Telegram
- Follow on Nostr
3.2 NextMeetupSection
Data source: Meetup API
Content:
- date
- time
- city
- venue
- description
- CTA: Attend Meetup
3.3 AboutSection
Static/admin-editable content.
3.4 WhyJoinSection
Static list of benefits.
3.5 CommunityLinksSection
Dynamic from settings:
- Telegram
- Nostr
- X
- YouTube
- Discord
3.6 BlogPreviewSection
Data source: Blog API
Content:
- featured post
- latest posts
3.7 FAQSection
Static/admin-editable.
3.8 FinalCTASection
- Join Meetup
- Follow Community
4. Blog Listing /blog
Layout
- Header (title + description)
- Category filter
- Post grid/list
Features
- filter by category
- highlight featured post
- pagination or infinite scroll
Data
From cached Nostr posts.
5. Blog Detail /blog/[slug]
Layout
- Title
- Metadata (date, author)
- Content
- Categories
- Interaction section
- Related posts
Interaction
If user logged in (Nostr):
- Like button
- Comment input
Display:
- likes count
- comments (Nostr replies)
6. Admin Entry /admin
Behavior
- if not logged in → show Nostr login screen
- if logged in → redirect to
/admin/overview
Login Screen
- button: Login with Nostr extension
- explanation text
7. Admin Pages
7.1 /admin/overview
Dashboard summary:
- next meetup
- recent posts
- recent activity
- quick actions
7.2 /admin/events
Meetup management.
Views:
- list of meetups
- create/edit form
Fields:
- title
- description
- date/time
- location
- link
Actions:
- create
- edit
- delete
- mark featured
Moderation:
- view comments
- hide comments
7.3 /admin/blog
Blog management.
Views:
- list of posts
- import tool
Import flow:
- paste event id or naddr
- fetch preview
- confirm import
Post editing:
- title
- excerpt
- slug
- categories
- featured toggle
- visibility toggle
7.4 /admin/moderation
Moderation center.
Views:
- comment stream
- filters:
- by post
- by event
- by user
Actions:
- hide comment
- mark spam
- block pubkey (local)
7.5 /admin/users (admin only)
User management.
Views:
- list of pubkeys
Actions:
- promote to moderator
- remove moderator
- block user
7.6 /admin/categories
Category management.
Actions:
- create
- edit
- delete
- reorder
7.7 /admin/relays (admin only)
Relay configuration.
Actions:
- add relay
- remove relay
- set priority
- test connection
7.8 /admin/settings (admin only)
Global settings.
Fields:
- site title
- tagline
- social links
- feature toggles
7.9 /admin/nostr (admin only)
Advanced tools.
Features:
- manual event fetch
- cache refresh
- debug viewer
8. Access Control
/admin/*requires Nostr auth- roles checked server-side
- UI adapts based on role
9. Error Pages
/404/500
Simple, minimal, same design style.
10. Key Principles
- keep routes minimal
- keep pages focused
- no unnecessary nesting
- everything role-based
The structure must stay simple and predictable for developers.