Thank you for your interest in contributing to Bubble Lab! We welcome all kinds of contributions from the community. AI-powered search tools such as Cursor's ask mode can significantly speed up the process of understanding each part of the codebase.
- Getting Started
- Prerequisites
- Development Setup
- Environment Configuration
- Development vs Production Mode
- Available Commands
- Project Architecture
- Deployment
- Contribution Guidelines
Before contributing, please:
- Join our Discord community for discussions and support
- Check existing issues or open a new one to discuss your idea
- Read through this guide to set up your development environment
Make sure you have the following installed:
- Bun - Required for running the backend API server
- pnpm - Package manager for monorepo management
- Node.js - v18 or higher
Run Bubble Studio locally in 2 commands:
# 1. Install dependencies
pnpm install
# 2. Start everything
pnpm run devThat's it! The setup script automatically:
- ✅ Creates
.envfiles from examples - ✅ Configures dev mode (no auth required)
- ✅ Sets up SQLite database
- ✅ Builds core packages
- ✅ Starts both frontend and backend
Open http://localhost:3000 and start building workflows!
- Frontend: http://localhost:3000 (Bubble Studio)
- Backend: http://localhost:3001 (API Server)
Some scripts use Unix commands (cp, bash), so Windows requires manual steps:
pnpm installpnpm build:coreCopy-Item "packages/bubble-core/dist/bubble-bundle.d.ts" "apps/bubble-studio/public/bubble-types.txt" -Force
Copy-Item "packages/bubble-core/dist/bubbles.json" "apps/bubble-studio/public/bubbles.json" -ForceTerminal 1 – Backend (API):
cd apps/bubblelab-api
& "$env:USERPROFILE\.bun\bin\bun.exe" run src/index.ts- Runs on: http://localhost:3001
Terminal 2 – Frontend (Studio):
cd apps/bubble-studio
pnpm vite --host 0.0.0.0 --port 3000- Runs on: http://localhost:3000
⚠ If you get "TypeScript validation failed," rebuild core packages.
apps/bubblelab-api/.env:
GOOGLE_API_KEY=your_google_api_key # Required for AI flow execution
OPENROUTER_API_KEY=your_openrouter_key # Required for AI flow executionWithout these keys, you can use the visual builder but cannot execute flows. Get your keys:
- Google AI API: https://aistudio.google.com/apikey
- OpenRouter: https://openrouter.ai/keys
The setup script creates these files with sensible defaults:
apps/bubble-studio/.env:
VITE_API_URL=http://localhost:3001
VITE_CLERK_PUBLISHABLE_KEY=
VITE_DISABLE_AUTH=true # Dev mode: no auth neededapps/bubblelab-api/.env:
BUBBLE_ENV=dev # Creates mock user automatically
DATABASE_URL=file:./dev.db # SQLiteEnable specific features in apps/bubblelab-api/.env:
# AI Model Providers
OPENAI_API_KEY= # OpenAI API key for GPT models
# Communication & Storage
RESEND_API_KEY= # Resend API key for email notifications
FIRE_CRAWL_API_KEY= # FireCrawl API key for web scraping
# Authentication (optional, only needed for production mode)
CLERK_SECRET_KEY_BUBBLELAB= # Clerk secret key for authentication
# OAuth (optional)
GOOGLE_OAUTH_CLIENT_ID= # Google OAuth client ID
GOOGLE_OAUTH_CLIENT_SECRET= # Google OAuth client secret
# Cloud Storage (optional)
CLOUDFLARE_R2_ACCESS_KEY= # Cloudflare R2 access key
CLOUDFLARE_R2_SECRET_KEY= # Cloudflare R2 secret key
CLOUDFLARE_R2_ACCOUNT_ID= # Cloudflare R2 account ID
# Other
PYTHON_PATH= # Custom Python path (optional)
CREDENTIAL_ENCRYPTION_KEY=8VfrrosUTORJghTDpdTKG7pvfD721ChyFt97m3Art1Y= # Encryption key for storing user credentials
BUBBLE_CONNECTING_STRING_URL= # Database connection string (optional, defaults to SQLite)By default, the app runs in development mode with:
- 🔓 No authentication required - Uses mock user
dev@localhost.com - 💾 SQLite database - Auto-created at
apps/bubblelab-api/dev.db - 🎯 Auto-seeded dev user - Backend creates the user automatically
To run with real authentication:
- Get your Clerk keys at clerk.com
- Update
.envfiles:
Frontend (apps/bubble-studio/.env):
VITE_CLERK_PUBLISHABLE_KEY=pk_test_...
VITE_DISABLE_AUTH=falseBackend (apps/bubblelab-api/.env):
BUBBLE_ENV=prod
CLERK_SECRET_KEY=sk_test_...- Restart with
pnpm run dev
# Run only the setup script
pnpm run setup:env
# Start development servers
pnpm run dev
# Build for production
pnpm run build
# Run tests
pnpm test
# Lint code
pnpm lintBubbleLab is built on a modular monorepo architecture:
- @bubblelab/bubble-core - Core AI workflow engine
- @bubblelab/bubble-runtime - Runtime execution environment
- @bubblelab/shared-schemas - Common type definitions and schemas
- @bubblelab/ts-scope-manager - TypeScript scope analysis utilities
- create-bubblelab-app - Quick start with bubble lab runtime
- bubble-studio - Visual workflow builder (React + Vite)
- bubblelab-api - Backend API for flow storage and execution (Bun + Hono)
For Docker-based deployment instructions, see deployment/README.md.
We welcome all types of contributions:
- 🐛 Bug Reports - Open an issue with detailed reproduction steps
- ✨ Feature Requests - Suggest new features or improvements to Bubble Studio
- 🔧 Code Contributions - Fix bugs or implement new features
- 🧩 New Bubbles - Add new integrations, tools, or logic nodes
- 📚 Documentation - Improve guides, examples, or API docs
- 💬 Community Support - Help others in Discord or GitHub discussions
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes following the coding standards
- Test your changes thoroughly
- Commit your changes with clear, descriptive messages
- Push to your fork and submit a pull request
- Wait for review and address any feedback
- Use TypeScript with proper types (no
any) - Follow existing code style and conventions
- Write tests for new features
- Update documentation as needed
- Keep commits atomic and well-described
- Check our Documentation
- Ask questions in our Discord community
- Open a discussion on GitHub for general questions
Thank you for contributing to Bubble Lab! 🎉