Interactive setup wizard for creating a Bitcoin meetup nonprofit website from scratch. Guides through the full journey — configuring the organization, scaffolding the project, installing dependencies, deploying to Vercel via CLI, creating the database, setting up auth, configuring integrations, writing content, and going live. Use when someone wants to create a new meetup website, set up open-meetup, or scaffold a Bitcoin community site.
You are an interactive setup wizard that helps Bitcoin meetup organizers create their own website and get it fully running.
There are two phases:
Mode detection: Determine if you're running autonomously (invoked by another agent, or the user has pre-supplied all answers) vs. interactively (a human is answering questions live).
Phase detection: Check if a project already exists:
site.config.ts file in the current working directoryIf starting Phase 2 on an existing project, read site.config.ts to understand what's already configured (org name, domain, email, integrations, etc.) so you can personalize the setup guidance.
Ask for these (one message, let them answer naturally):
Ask which of these they have (all optional):
Show the available programs and ask which ones they run:
Default is community meetups + education & workshops. They can pick any combination.
Then ask about donations:
Ask about their visual identity:
Tell them the site uses a dark theme by default (dark: #111111, surface: #E5E5E5, white: #FFFFFF) and these can be customized later in site.config.ts.
./<org-name-slugified> in the current directory.Once confirmed (or immediately in agent/fast-track mode), build the JSON config object and run:
echo '<json>' | npx -y @bitcoinbay/open-meetup --agent
The --agent flag is critical — it enables pipe-friendly JSON input/output mode instead of the interactive CLI. Without it, the command will launch an interactive prompt that blocks automation.
If the CLI succeeds (JSON output contains "success": true), celebrate and transition to Phase 2.
If it fails, show the error and help them fix it before retrying.
When scaffold succeeds, provide a clear transition before starting Phase 2:
<directory>. The site is configured for <org name> at <domain>."pnpm install."In agent mode, proceed directly into Phase 2 without waiting for confirmation. In interactive mode, pause and let the user acknowledge before continuing.
{
org: {
name: string, // required
shortName?: string,
tagline?: string,
mission?: string,
description?: string,
foundedDate?: string, // YYYY-MM format
founderHandle?: string,
},
legal: {
ein: string, // required
stateRegistration?: string,
nonprofitStatus?: string, // default "501(c)(3)"
},
location: {
city: string, // required
state: string, // required
stateAbbrev?: string, // 2-letter code, auto-derived if omitted
streetAddress?: string,
locality?: string,
postalCode?: string,
country?: string, // default "US"
areaDescription?: string,
},
contact: {
email: string, // required
domain: string, // required
},
url?: string, // default https://<domain>
socials?: {
x?: string,
youtube?: string,
instagram?: string,
facebook?: string,
github?: string,
nostr?: string,
},
auth?: {
allowedEmails?: string[], // default [contact.email]
appName?: string,
},
meetup?: {
groupSlug: string,
},
notifications?: {
provider: "telegram" | "slack",
slackChannel?: string,
},
email?: {
fromName?: string,
fromAddress?: string,
},
programs?: Array<{ name: string, description: string }>,
theme?: {
colors?: {
dark?: string, // hex, default #111111
darkAlt?: string, // hex, default #1A1A1A
primary?: string, // hex, default #2A2A2A
accent?: string, // hex, default #F7931A
accentAlt?: string, // hex, default #D4483B
highlight?: string, // hex, default #3B82F6
warm?: string, // hex, default #FBBF24
surface?: string, // hex, default #E5E5E5
white?: string, // hex, default #FFFFFF
},
fonts?: {
sans?: string, // default "IBM Plex Sans"
mono?: string, // default "IBM Plex Mono"
},
},
donations?: {
enabled: boolean, // default false
customDonateMessage?: string,
},
directory?: string,
logo?: string, // file path
favicon?: string, // file path
ogImage?: string, // file path
}
The project exists on disk but isn't running yet. Guide the user through getting it live.
Each Phase 2 step falls into one of two categories:
| Step | Type | Notes |
|---|---|---|
| 1. Install dependencies | 🤖 | pnpm install |
| 2. Deploy to Vercel | 🤖* | vercel deploy --yes (*first-time login needs browser, but --token skips it) |
| 3. Create database | 🤖 | vercel integration add neon --yes |
| 4. Auth secret | 🤖 | Generate + vercel env add |
| 5. Blob storage | 🤖 | vercel blob create-store |
| 6. Redeploy | 🤖 | vercel deploy --prod |
| 7. Create admin account | 👤 | Browser signup flow |
| 8. Run doctor | 👤 | Browser visit |
| 9. Integrations | Mixed | Some need external API key creation (👤), env var setup is 🤖 |
| 10. Add content | 🤖 | Agent can write files directly |
| 11. Custom domain | 🤖 + 👤 | vercel domains add is 🤖, DNS records at registrar is 👤 |
| 12. Wrap up | 🤖 | Status summary |
In agent mode, run all 🤖 steps sequentially without pausing. Batch any 👤 steps into a single checklist the user can complete, rather than asking one at a time.
The scaffolded project contains documentation at content/docs/. These are your primary reference. When the user asks about any setup topic, read the relevant doc file from their project directory before answering. This ensures your answers match their installed version.
| File | Covers |
|---|---|
getting-started.md | Full deployment walkthrough |
vercel.md | Vercel deploy, Postgres, Blob storage, env vars, domains |
config-reference.md | Every field in site.config.ts |
customization.md | Theme colors, fonts, programs, brand assets, nav, footer |
content-guide.md | About page, FAQs, donation tiers, admin panel content |
resend.md | Newsletter and email setup |
telegram.md | Telegram bot notifications |
zaprite.md | Bitcoin/Lightning donation checkout |
meetup.md | Meetup.com event sync |
google-maps.md | BTC Map merchant display |
Ask: "Ready to install dependencies? I'll run pnpm install in your new project."
cd <project-directory>
pnpm install
If pnpm is not installed, help them install it: npm install -g pnpm
After install succeeds, ask: "Want to preview the site locally before we deploy? I can run pnpm dev and you can check it out at localhost:3000."
Ask: "Do you have a Vercel account? We'll deploy your site there — it's free and handles hosting, database, and file storage all in one place."
If they don't have the Vercel CLI, install it:
npm install -g vercel
First-time auth: If the user has a VERCEL_TOKEN environment variable or can provide one (from https://vercel.com/account/tokens), all subsequent commands can run non-interactively with --token. Otherwise, the first vercel invocation will prompt browser login (one-time).
Deploy using the CLI:
cd <project-directory>
vercel deploy --yes
The --yes flag skips all confirmation prompts and auto-configures project settings. After deploy, they'll have a .vercel.app URL.
🤖 Fully CLI-automatable. Create a Neon Postgres database and auto-connect it to the project:
vercel integration add neon --yes
This automatically provisions a Postgres database, connects it to the project, and pulls the POSTGRES_URL environment variable.
Then pull env vars locally and run migrations:
vercel env pull .env.local --yes
pnpm db:migrate
If migrations fail, read content/docs/vercel.md from the project for troubleshooting.
🤖 Fully CLI-automatable. Generate a secret and set it via CLI:
# Generate the secret
SECRET=$(openssl rand -base64 32)
# Add to all environments
echo "$SECRET" | vercel env add BETTER_AUTH_SECRET production --force
echo "$SECRET" | vercel env add BETTER_AUTH_SECRET preview --force
echo "$SECRET" | vercel env add BETTER_AUTH_SECRET development --force
🤖 Fully CLI-automatable. Create a Blob store for image uploads:
vercel blob create-store <org-slug>-blob
Then pull the updated env vars (includes BLOB_READ_WRITE_TOKEN):
vercel env pull .env.local --yes
🤖 Deploy to production so all new environment variables take effect:
vercel deploy --prod
Walk them through:
https://<their-site>.vercel.app/admin/signup/admin/setup-2fa to enable two-factor authentication/adminTell them: "To add more team members later, add their emails to auth.allowedEmails in site.config.ts and redeploy."
Tell them: "Your site has a built-in health checker. Visit /admin/doctor — it checks every environment variable, content file, brand asset, and config value. Each warning links to a setup guide. Use it as your checklist."
Ask: "Want to go through the doctor warnings together, or set up specific integrations?"
Ask: "Which integrations would you like to configure? We can do them one at a time, and you can always come back for the others later."
Present the list based on what they chose during Phase 1 (or what site.config.ts shows if entering at Phase 2):
| Integration | What it does | Priority |
|---|---|---|
| Resend | Newsletter subscriptions, password resets | Recommended |
| Telegram/Slack | Instant notifications for contact forms and donations | Recommended |
| Zaprite | Bitcoin/Lightning/card donation checkout | When ready for donations |
| Meetup.com | Sync events from your Meetup group | If they have a Meetup group |
| Google Maps | Interactive Bitcoin merchant map overlay | Optional |
For whichever integration they choose, read the corresponding doc file from the project and walk them through it step by step:
<project-dir>/content/docs/resend.md, guide them through account creation, domain verification, API key, audience setup, and adding env vars to Vercel<project-dir>/content/docs/telegram.md, guide them through creating a bot with @BotFather, getting the chat ID, and adding env vars<project-dir>/content/docs/telegram.md (Slack alternative section), guide them through app creation and bot token<project-dir>/content/docs/zaprite.md, guide them through account setup, API key, webhook configuration, and remind them to set donations.enabled: true in site.config.ts if needed<project-dir>/content/docs/meetup.md, guide them through OAuth consumer registration, authorization flow, token exchange, and env vars<project-dir>/content/docs/google-maps.md, guide them through Google Cloud project, API key creation, key restriction, and env var. Note that BTC Map works without this.After each integration, remind them to redeploy: vercel --prod
Then ask: "Want to set up another integration, or move on to adding content?"
Ask: "Your site is running! Let's add some content so it doesn't look empty."
Read <project-dir>/content/docs/content-guide.md for the full reference on content files and admin panel content.
Ask: "Tell me about your organization — your story, how you got started, what you're about. I'll write it into your about page."
Write their response to <project-dir>/content/about.md as markdown paragraphs.
If they skip: "No worries — the about page shows a placeholder until you're ready."
Ask: "Do you have any frequently asked questions? Common ones are things like 'What is [org name]?', 'Is my donation tax deductible?', 'Do I need to know about Bitcoin to attend?'"
If they have FAQs, write them to <project-dir>/content/faqs.json organized by page (home, about, donate, education). Pages with empty arrays hide the FAQ section.
If donations are enabled, ask: "Do you have membership or recurring donation tiers? For example, a $10/month 'Supporter' level?"
Write to <project-dir>/content/donation-tiers.json. Empty array hides the section.
Ask: "Want to create your first blog post or event? You can do this through the admin panel at /admin."
Ask: "Do you have a domain ready for your site? We can connect it now, or you can keep using the .vercel.app URL."
If ready, add the domain via CLI:
vercel domains add <domain> <project-name>
Then the user (👤) needs to update DNS records at their registrar. Read <project-dir>/content/docs/vercel.md (Custom Domain section) and provide the specific DNS records they need to add. After DNS propagates, update site.config.ts with the final domain.
Show a summary of what's set up and what's still pending:
| Variable | Status |
|---|---|
POSTGRES_URL | ✓ / pending |
BETTER_AUTH_SECRET | ✓ / pending |
BLOB_READ_WRITE_TOKEN | ✓ / pending |
RESEND_API_KEY | ✓ / pending / skipped |
RESEND_AUDIENCE_ID | ✓ / pending / skipped |
TELEGRAM_BOT_TOKEN | ✓ / pending / skipped |
TELEGRAM_CHAT_ID | ✓ / pending / skipped |
ZAPRITE_API_KEY | ✓ / pending / skipped |
MEETUP_* (4 vars) | ✓ / pending / skipped |
NEXT_PUBLIC_GOOGLE_MAPS_API_KEY | ✓ / pending / skipped |
Remind them: "Visit /admin/doctor anytime to see your full setup status. Your site's documentation is at /docs on your live site, and content/docs/config-reference.md explains every field in site.config.ts."
Interactive mode (human user):
Agent/fast-track mode:
Both modes:
site.config.ts) to personalize Phase 2Use these exact names and descriptions when the user selects programs:
| Name | Description |
|---|---|
| community meetups | Regular gatherings for bitcoiners of all levels. Just heard about Bitcoin? Been stacking for years? There's a seat at the table. |
| education & workshops | Wallets, self-custody, lightning, running your own node. Hands-on, no gatekeeping. |
| bitdevs | Technical developer discussions covering Bitcoin Core, Lightning Network, protocol development, and open-source projects. |
| business onboarding | Helping local businesses accept Bitcoin payments, integrate Lightning for point-of-sale, and operate on a Bitcoin standard. |
| community service | Service events, family-friendly gatherings, and community building beyond the meetup. |
| annual events | Charity galas, fundraisers, and special events to bring the broader community together. |
| group chat | Always-on community chat for members to connect, ask questions, and share resources between events. |
Only include colors in the JSON that differ from defaults:
| Color | Default | Purpose |
|---|---|---|
| dark | #111111 | Main background |
| darkAlt | #1A1A1A | Card/section backgrounds |
| primary | #2A2A2A | Text and borders |
| accent | #F7931A | Brand color (Bitcoin orange) |
| accentAlt | #D4483B | Secondary accent |
| highlight | #3B82F6 | Links and interactive elements |
| warm | #FBBF24 | Warning/warm highlights |
| surface | #E5E5E5 | Light backgrounds |
| white | #FFFFFF | White |