A Next.js website for the Swiss Bitcoin Institute, providing strategic Bitcoin intelligence for business leaders and executives.
npm install
# or
bun installEnsure Docker is running, then start Supabase:
supabase startThis starts PostgreSQL and all Supabase services. Copy the service_role key from the output.
First time? Install the CLI with
brew install supabase/tap/supabaseornpm install -g supabase
Create .env.local in the project root:
# Supabase (from supabase start output)
NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key-from-above
# Optional: for email/newsletter features
RESEND_API_KEY=re_xxxxxxxxxxxx
MAILERLITE_API_KEY=your-mailerlite-keynpm run dev
# or
bun devOpen http://localhost:3000 with your browser to see the result.
| Service | URL |
|---|---|
| Website | http://localhost:3000 |
| Supabase Studio | http://127.0.0.1:54323 |
| Supabase API | http://127.0.0.1:54321 |
The SBI site uses a file-based CMS where content is managed through markdown files. This provides version control, automatic deployment, and team collaboration through GitHub.
npm run new:article "Article Title" author-id
# Example:
npm run new:article "Bitcoin Mining in Switzerland" marcus-dappnpm run new:author "Full Name" "Role" "[email protected]"
# Example:
npm run new:author "Jane Doe" "Senior Researcher" "[email protected]"- Articles:
src/content/articles/- Research articles and blog posts - Authors:
src/content/authors/- Author profiles and bios - Templates:
templates/- Templates for new content
- Create content with
published: false - Test locally with
npm run dev - Set
published: truewhen ready - Push to GitHub for automatic deployment
For detailed instructions, see CMS-GUIDE.md.
Update course offerings in src/lib/courses.ts:
export const bitcoinForExecutivesCourses: CourseOffering[] = [
{
id: "bfe-feb-2026",
timeDescription: "4 afternoons (14-17h)",
dates: ["12th February", "19th February", "26th February", "5th March 2026"]
},
// Add new cohort:
{
id: "bfe-may-2026",
timeDescription: "4 afternoons (14-17h)",
dates: ["6th May", "13th May", "20th May", "27th May 2026"]
}
];Update confirmation and notification emails in src/lib/emails.ts:
SERVICE_EMAIL_CONTENT- Customer confirmation messages per service typegetContactTeamNotificationEmail()- Team notification for contact formgetContactCustomerConfirmationEmail()- Customer confirmation for contact formgetInquiryTeamNotificationEmail()- Team notification for inquiry formsgetInquiryCustomerConfirmationEmail()- Customer confirmation for inquiries
src/app/- Next.js app directory with routingsrc/components/- Reusable UI componentssrc/pages/- Page componentssrc/content/- Content files (articles, authors)src/lib/- Utility functions and configurations
- Strategic Intelligence: Research and analysis on Bitcoin adoption
- Executive Education: Programs for business leaders
- Team Expertise: World-class Bitcoin researchers and practitioners
- Modern UI: Built with Next.js, TypeScript, and Tailwind CSS
npm run build
# or
yarn build
# or
bun buildnpm start
# or
yarn start
# or
bun startThis project uses Supabase for database storage. You can run Supabase locally for development.
Install the Supabase CLI:
# macOS
brew install supabase/tap/supabase
# npm
npm install -g supabase
# Or via npx (no install needed)
npx supabase --versionEnsure Docker is running (required for local Supabase).
# Start all Supabase services (Postgres, Auth, Storage, etc.)
supabase start
# This will output your local credentials:
# API URL: http://127.0.0.1:54321
# anon key: eyJ...
# service_role key: eyJ...Migrations are stored in supabase/migrations/ and run automatically on supabase start.
# Apply migrations to local database
supabase db reset
# Create a new migration
supabase migration new your_migration_name
# Push migrations to production (requires linking)
supabase db push# Stop and preserve data
supabase stop
# Stop and delete all data
supabase stop --no-backupAccess the local database UI at http://127.0.0.1:54323 when Supabase is running.
Create a .env.local file in the project root:
# Supabase (get these from `supabase start` output or Supabase dashboard)
NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
# Email - Resend (https://resend.com)
RESEND_API_KEY=re_xxxxxxxxxxxx
# Newsletter - MailerLite (https://www.mailerlite.com)
MAILERLITE_API_KEY=your-mailerlite-api-keyRun supabase start and copy the credentials from the output. For production, create a project at supabase.com and get keys from Project Settings > API.
- Sign up at resend.com
- Go to API Keys and create a new key
- Free tier includes 100 emails/day (dev) or 3,000/month
- Sign up at mailerlite.com
- Go to Integrations > API
- Generate a new API token
For production deployment, set these in your hosting provider (Vercel, etc.):
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=your-production-service-role-key
RESEND_API_KEY=your-production-resend-key
MAILERLITE_API_KEY=your-production-mailerlite-key- Framework: Next.js 14
- Language: TypeScript
- Styling: Tailwind CSS
- UI Components: Radix UI + shadcn/ui
- Content: Markdown with gray-matter
- Database: Supabase (PostgreSQL)
- Email: Resend
- Newsletter: MailerLite