The backend API powering OpenMeet — a free, open-source event platform for community organizers. Think Meetup, but free for communities and open source.
- Platform: platform.openmeet.net
- API: api.openmeet.net
- API Docs: api.openmeet.net/docs (Swagger/OpenAPI)
What is OpenMeet? → — Features, roadmap, and how to contribute
| Component | Technology |
|---|---|
| Framework | NestJS + TypeScript |
| Database | PostgreSQL (multi-tenant via schemas) |
| Cache | Redis |
| Queue | RabbitMQ |
| Auth | JWT + OAuth (ATprotocol/Bluesky, Google, GitHub) |
| Chat | Matrix (Synapse) |
| AT Protocol | @atproto/* packages |
| Repository | Description | Stack |
|---|---|---|
| openmeet-api | Backend API (this repo) | NestJS, TypeScript, PostgreSQL |
| openmeet-platform | Frontend web app | Vue 3, Quasar, TypeScript |
| survey | Survey/polling service | Go, Templ, HTMX |
OpenMeet can be self-hosted. The production deployment uses Kubernetes with ArgoCD GitOps. There are 2 docker compose files that could be merged into one to run the whole thing on a single server. It is not resource intensive.
This section is incomplete presently. Do not be surprised if there are missing things you'll need to trace down. Please leave an issue for us if you do, thanks!
| Service | Purpose |
|---|---|
| PostgreSQL 16+ | Primary database (with PostGIS extension) |
| Redis | Session cache and caching |
| RabbitMQ | Async event processing (Bluesky integration) |
| Matrix Synapse | Real-time chat (optional) |
| SMTP server | Email notifications |
Copy the example environment file:
cp env-example-relational .envKey configuration:
DATABASE_*— PostgreSQL connectionREDIS_*/ELASTICACHE_*— Redis connectionMAIL_*— SMTP settingsBLUESKY_KEY_*— AT Protocol OAuth keys (base64-encoded)BACKEND_DOMAIN— Public API URL
OpenMeet is multi-tenant. Configure tenants via:
./config/tenants.jsonfile, orTENANTS_B64environment variable (base64-encoded JSON)
Example tenants.json:
[
{
"id": "1",
"name": "OpenMeet",
"frontendDomain": "https://platform.openmeet.net",
"mailDefaultEmail": "[email protected]",
"mailDefaultName": "OpenMeet"
}
]The admin user is created during database seeding using:
ADMIN_EMAILADMIN_PASSWORD
- Node.js v22+
- Docker and Docker Compose
- PostgreSQL 16+ (or use Docker)
See DEVELOPMENT.md for complete local development instructions including:
- Quick start with Docker Compose
- Services overview with ports
- Debugging tools (psql, logs)
- Troubleshooting guide
# Run migrations for all tenants
npm run migration:run:tenants
# Reset database (dev only!)
npm run migration:reset# Unit tests
npm run test
# Run specific test file
npm run test -- path/to/file.spec.ts
# E2E tests (requires running API, database, matrix to succeed)
npm run test:e2e
# Type check
npx tsc --noEmitSet TEST_TENANT_ID in .env for e2e tests.
openmeet-api/
├── design-notes/ # Architecture and design documentation
├── grafana/ # Monitoring dashboards
├── matrix-config/ # Matrix/Synapse configuration templates
├── pg-init-scripts/ # PostgreSQL init (PostGIS, Synapse DB, MAS DB)
├── scripts/ # Utility scripts
├── test/ # E2E tests
└── src/ # Application source code
├── auth*/ # Authentication (core, Bluesky, Google, GitHub)
├── event*/ # Events, attendees, series, permissions
├── group*/ # Groups, members, permissions
├── bluesky/ # AT Protocol client
├── matrix/ # Matrix chat integration
├── database/ # Migrations, seeds, data sources
├── tenant/ # Multi-tenant infrastructure
└── ... # Additional domain modules
We welcome contributions! Here's how to get started:
- Check out our good first issues
- Fork the repo and create a feature branch
- Write tests for your changes
- Submit a PR — we review within a few days
See CONTRIBUTORS.md for the people who have helped build OpenMeet.
Please review our Code of Conduct before contributing.
- OpenMeet: OpenMeet Guides Group — Community meetups
- Discord: discord.gg/eQcYADgnrc
- Bluesky: @openmeet.net
OpenMeet is free for community groups, funded by the community. Help cover hosting costs (~$350/month) at platform.openmeet.net/support.