An open-source event management platform inspired by Lu.ma, built with Next.js 16, AI-powered event creation, and a modern full-stack architecture.
Use natural language to create, manage, and discover events. OpenLuma features an AI agent that handles event operations through conversation, alongside a full-featured web UI for hosts and attendees.
Live Demo · Report Bug · Request Feature
- AI-Powered Event Management: Create, edit, search, and manage events through natural language conversation
- Event Discovery: Browse and search public events with filtering by type and date
- RSVP & Ticketing: Full RSVP workflow with approval, waitlisting, and QR code tickets
- Email Notifications: Automated emails for invitations, RSVP confirmations, and reminders with ICS calendar attachments
- Role-Based Access: Host, co-host, and attendee roles with granular permissions
- Attendee Check-in: QR code scanning for event check-in with audit trail
- OAuth Authentication: Google login with session management via Better Auth
- File Uploads: Image uploads for events and profiles via Uploadthing
- Dark Mode: Theme switching with next-themes
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router, React 19, React Compiler) |
| Language | TypeScript |
| Database | PostgreSQL + Drizzle ORM |
| Auth | Better Auth (sessions, OAuth) |
| AI | Vercel AI SDK + OpenAI GPT-4o-mini |
| Resend | |
| Uploads | Uploadthing |
| Cache | Upstash Redis |
| UI | shadcn/ui + Tailwind CSS |
| Linting | Biome |
- Node.js 18+
- PostgreSQL database
- Bun (recommended) or npm
git clone https://github.com/Nishitbaria/openluma.git
cd openlumabun installcp .env.example .env.localFill in your credentials in .env.local:
| Variable | Required | Description |
|---|---|---|
DATABASE_URL |
Yes | PostgreSQL connection string |
BETTER_AUTH_SECRET |
Yes | Random secret for session signing |
BETTER_AUTH_URL |
Yes | App URL (http://localhost:3000 for dev) |
NEXT_PUBLIC_APP_URL |
Yes | Public app URL |
OPENAI_API_KEY |
Yes | OpenAI API key for the AI agent |
GOOGLE_CLIENT_ID |
No | Google OAuth client ID |
GOOGLE_CLIENT_SECRET |
No | Google OAuth client secret |
UPSTASH_REDIS_REST_URL |
Yes | Upstash Redis URL for rate limiting |
UPSTASH_REDIS_REST_TOKEN |
Yes | Upstash Redis token |
RESEND_API_KEY |
Yes | Resend API key for emails |
UPLOADTHING_TOKEN |
Yes | Uploadthing token for file uploads |
# Generate migrations from the schema
bun run db:generate
# Apply migrations
bun run db:migratebun devOpen http://localhost:3000 in your browser.
openluma/
├── app/
│ ├── (dashboard)/ # Authenticated host/attendee pages
│ │ └── dashboard/
│ │ └── events/[eventId]/
│ ├── (public)/ # Public-facing pages
│ │ ├── events/ # Event discovery & detail
│ │ └── u/ # User profiles
│ ├── api/
│ │ ├── auth/ # Better Auth endpoints
│ │ ├── chat/ # AI agent endpoint
│ │ └── events/ # Event API routes
│ └── ticket/ # Ticket & QR code pages
├── components/ # Shared UI components (shadcn/ui)
├── lib/
│ ├── ai/
│ │ └── agents/
│ │ ├── orchestrator.ts # Main AI agent (routes requests)
│ │ └── event-agent.ts # Event operations (10 tools)
│ ├── db/
│ │ └── schema.ts # Drizzle database schema
│ ├── auth.ts # Better Auth config
│ └── email.ts # Email templates (Resend)
├── actions/ # Server actions
├── hooks/ # Custom React hooks
├── providers/ # Context providers
└── public/ # Static assets
OpenLuma uses a multi-agent delegation pattern powered by the Vercel AI SDK:
User Message
│
▼
┌──────────────┐
│ Orchestrator │ Routes requests to specialized agents
└──────┬───────┘
│
▼
┌──────────────┐
│ Event Agent │ Handles all event operations
└──────────────┘
The Event Agent has access to these tools:
| Tool | Description |
|---|---|
getCurrentDate |
Resolves relative dates ("next Friday") |
createEvent |
Creates events with full validation |
listMyEvents |
Lists the user's hosted events |
searchEvents |
Searches public events by title/date |
getEventDetails |
Retrieves full event info with attendees |
editEvent |
Updates event details (host/cohost only) |
deleteEvent |
Deletes events with confirmation flow |
submitRsvp |
Handles RSVP submission |
getAttendees |
Lists attendees grouped by status |
sendInvitation |
Sends email invitations with tokens |
bun dev # Start development server
bun run build # Build for production
bun run start # Start production server
bun run lint # Run Biome linter
bun run format # Format code with Biome
bun run db:generate # Generate Drizzle migrations
bun run db:migrate # Run database migrations
bun run db:push # Push schema changes directly
bun run db:studio # Open Drizzle Studio (database GUI)The core data model:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ users │────▶│ events │◀────│ rsvps │
└──────────┘ └──────────┘ └──────────┘
│
┌──────────┼──────────┐
▼ ▼ ▼
┌───────────┐ ┌────────┐ ┌─────────────┐
│invitations│ │ tags │ │ cohosts │
└───────────┘ └────────┘ └─────────────┘
- events: Title, description, location, capacity, visibility, type, approval settings
- rsvps: Status workflow: pending -> approved / rejected / waitlisted
- invitations: Token-based email invitations with 7-day expiry
- eventCohosts: Co-host delegation
- attendeeCheckins: Check-in audit trail
OpenLuma can be deployed to any platform that supports Next.js:
- Vercel: Zero-config deployment (recommended)
- Railway: Full-stack with managed PostgreSQL
- Docker: Self-hosted (Dockerfile coming soon)
Make sure to set all environment variables from .env.example in your deployment platform.
Contributions are welcome! Here's how to get started:
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Make your changes
- Run linting:
bun run lint - Commit your changes:
git commit -m "feat: add my feature" - Push to your fork:
git push origin feature/my-feature - Open a Pull Request
This project is licensed under the MIT License.
- Inspired by Lu.ma
- Built with Next.js, Vercel AI SDK, shadcn/ui