packages/.
Tech stack
KeystoneJS 5
Backend framework that generates a GraphQL API from schema definitions. Each domain model is defined as a Keystone list.
Next.js
React-based frontend framework used for all server-rendered and client-side pages inside each Keystone app.
Apollo GraphQL
Apollo Client on the frontend and Apollo Server (via Keystone) on the backend. All data flows through GraphQL.
PostgreSQL 16
Primary relational database. Each application has its own database. Migrations are managed by
kmigrator, a Django-based tool.Redis 6.2
Used for session storage, asynchronous task queuing (via Bull), and caching.
Bull
Redis-backed task queue for asynchronous background jobs: notifications, imports, exports, and other long-running operations.
Turbo
Monorepo build orchestration. Manages task pipelines, caching, and parallel execution across workspaces.
Docker
Containerization for both local development (databases) and production deployment (full application stack).
Jest
Test runner with Jasmine2. Supports schema integration tests (
.test.js) and unit tests (.spec.ts).Monorepo layout
apps/
Each directory underapps/ is a standalone service with its own database, environment variables, and deployment unit. Applications cannot import from each other.
| App | Description |
|---|---|
condo | Main property management application (KeystoneJS + Next.js) |
resident-app | Resident-facing mobile/web application |
dev-portal-web | Developer portal frontend |
dev-portal-api | Developer portal API service |
address-service | Address resolution and normalization service |
billing-connector | Billing system integration |
callcenter | Call center service |
pos-integration | Point-of-sale integration |
miniapp | Mini-app hosting service |
news-greenhouse | News distribution service |
property-importer | Property data import service |
ticket-importer | Ticket data import service |
telephony | Telephony integration |
insurance | Insurance integration |
accruals-gateway | Accruals gateway service |
announcements | Announcements service |
The monorepo contains 30+ apps in total. The table above lists the most prominent ones.
packages/
Shared internal libraries that any app can depend on. All packages are published under the@open-condo/* scope.
| Package | Description |
|---|---|
@open-condo/ui | UI component kit — the recommended way to build all GUI elements |
@open-condo/icons | Icon library used across all applications |
@open-condo/keystone | Keystone utilities: schema helpers, logging, test utilities |
@open-condo/bridge | Communication bridge for mini-app ↔ host integration |
@open-condo/webhooks | Reusable webhook functionality for any app |
@open-condo/miniapp-utils | Utilities for building mini-applications |
@open-condo/apollo | Apollo client configuration and utilities |
@open-condo/billing | Shared billing utilities |
@open-condo/config | Configuration and environment variable utilities |
@open-condo/codegen | GraphQL code generation tooling |
@open-condo/locales | Internationalization and locale data |
@open-condo/messaging | Messaging abstractions |
@open-condo/featureflags | Feature flag utilities |
@open-condo/next | Next.js configuration and shared page utilities |
@open-condo/files | File upload and storage utilities |
@open-condo/migrator | Database migration tooling |
The main app: apps/condo
apps/condo is the core property management application. It uses a domain-driven design structure where all business logic is organized into domain directories.
Domain structure
How apps communicate
Apps in the monorepo are isolated services. They communicate at runtime through GraphQL APIs — each app exposes its own Keystone-generated GraphQL endpoint.Because apps cannot share code directly, any logic needed by multiple apps must be extracted into a package under
packages/ and published as an internal workspace dependency.Turbo build pipeline
Turbo orchestrates the build pipeline defined inturbo.json. Tasks declare their dependencies using ^ notation — for example, build depends on ^build, which means all upstream workspace dependencies must be built first.
yarn workspace @app/condo build:deps before starting the app is required — it triggers Turbo to build all packages that @app/condo depends on, in topological order.
Database and migrations
Each app manages its own database schema. Migrations are created and applied usingkmigrator, a wrapper around the Django migration system:
Django and psycopg2-binary installed.
Next steps
Quick Start
Set up your local development environment and run Condo for the first time.
Project structure
Deep dive into the domain-driven design structure inside
apps/condo.Mini-Apps
Learn how to build mini-applications that extend Condo using the Bridge API.
GraphQL API
Explore the GraphQL API exposed by each Keystone application.