Monorepo Overview
Condo is organized as a monorepo using Yarn workspaces and Turborepo for build orchestration. The top-level structure is:Apps are fully isolated — they cannot import code from each other. All shared code must live in
packages/.Apps (/apps/*)
Each app is a standalone service with its own database, environment, and deployment lifecycle.
| App | Description |
|---|---|
condo | Main property management web app (KeystoneJS + Next.js) |
resident-app | Resident-facing mobile/web application |
billing-connector | Billing system integration service |
callcenter | Call center service |
pos-integration | Point-of-sale integration |
dev-portal-web | Developer portal for mini-app builders |
Packages (/packages/*)
Packages are internal libraries that any app can depend on.
@open-condo/ui
The official UI component library. Use this for all GUI elements instead of building custom components.
@open-condo/icons
Icon library for consistent iconography across apps.
@open-condo/keystone
Core Keystone.js utilities: schema helpers, logging, test utilities, and more.
@open-condo/webhooks
Webhook functionality that can be added to any app.
@open-condo/bridge
Bridge utilities for mini-app communication.
@open-condo/miniapp-utils
Shared utilities for building mini-apps on the Condo platform.
Domain-Driven Design in apps/condo
The main condo application uses Domain-Driven Design (DDD) to organise its logic. All business logic lives under apps/condo/domains/, split by domain:
Domain Folder Structure
Every domain follows a consistent layout:Key Domains
| Domain | Responsibility |
|---|---|
ticket | Core ticket lifecycle management |
billing | Payment tracking and invoice management |
contact | Resident contact management |
property | Building and property data |
marketplace | Service marketplace for contractors |
miniapp | Extension system for third-party mini-apps |
news | News and announcements for residents |
notification | Notification delivery (push, email, SMS) |
user | Authentication and user management |
organization | Property management company data |
common | Base components, form layouts, shared constants |
Other App Directories
Adding External Packages
The monorepo maintains a single sharedyarn.lock, so all apps use the same version of each dependency.
Code Style
The project enforces consistent style via ESLint. Key rules:| Rule | Value |
|---|---|
| Indentation | 4 spaces |
| Quotes | Single quotes (') |
| Semicolons | Never |
| Object spacing | Always: { foo } |
| Trailing commas | Always in multiline arrays/objects |
| Space before function paren | Always: function example () {} |
Import Order
Imports must be grouped in this order, with a blank line between each group:Restricted Imports
- Use
pdfmakeinstead ofjspdf - Do not import from
@open-keystone/fields*or@open-condo/keystone/fields - Use specific lodash sub-module imports:
import get from 'lodash/get'(notimport { get } from 'lodash')
yarn lint:code:fix to auto-fix most style issues.