ADR-001: Use Nx Monorepo
Status
Accepted
Date
2026-07-20
Context
Chilarai is the internal codename for CampusHub, a multi-tenant school management platform being developed by Ujan Labs.
The platform currently consists of:
- Web application (Next.js)
- Backend API (NestJS)
- Shared TypeScript contracts
- Shared runtime validation schemas
The platform is expected to expand over time to include background workers, reporting services, integrations, AI-assisted workflows, administrative applications, and additional supporting services.
As a small engineering team, it is important to balance rapid development with maintainability and long-term scalability.
A repository strategy must be selected before significant development begins.
Decision Drivers
The selected approach should:
- Minimize operational complexity
- Support code sharing between applications
- Support future platform growth
- Simplify dependency management
- Reduce duplicated code
- Enable consistent tooling and workflows
- Work well with TypeScript
- Support a small team while scaling to a larger team in the future
Alternatives Considered
Option 1: Multiple Independent Repositories
Example structure:
- chilarai-web
- chilarai-api
- chilarai-shared-types
- chilarai-shared-validation
Advantages
- Clear ownership boundaries
- Independent release cycles
- Smaller repositories
- Separate permissions can be applied per repository
Disadvantages
- Shared contracts require package publishing or duplication
- Shared validation schemas become harder to maintain
- Cross-cutting changes require multiple pull requests and releases
- Increased CI/CD complexity
- Increased repository administration overhead
- More difficult for a small team to manage
Assessment
This option provides strong isolation but introduces significant operational overhead. The benefits do not justify the complexity at the current size of the team.
Option 2: Single Repository Without Monorepo Tooling
Example structure:
- web
- api
- shared
Advantages
- Simple repository structure
- Single repository
- Minimal tooling requirements
- Easy initial setup
Disadvantages
- No dependency graph awareness
- No affected build or test execution
- Manual build orchestration
- Reduced visibility into project relationships
- More difficult to scale as applications and libraries increase
Assessment
This option is simple initially but is likely to require additional custom tooling as the platform grows.
Option 3: Nx Monorepo
Example structure:
- web
- api
- api-e2e
- shared-types
- shared-validation
Advantages
- Single repository
- Shared code without package publishing
- Project dependency graph
- Consistent developer experience
- Incremental and affected builds
- Shared testing infrastructure
- Strong TypeScript support
- Suitable for both startup and scale-up phases
Disadvantages
- Additional tooling complexity
- Learning curve for contributors unfamiliar with Nx
- Dependency on the Nx ecosystem
- Repository size increases over time
Assessment
This option provides the best balance between startup agility and long-term maintainability.
Decision
Use an Nx monorepo as the primary repository structure for Chilarai.
Rationale
The platform requires close coordination between frontend, backend, shared contracts, and shared validation logic.
Using an Nx monorepo allows:
- Direct sharing of TypeScript contracts between applications
- Direct sharing of validation schemas between applications
- Consistent tooling across projects
- Unified dependency management
- Easier refactoring across application boundaries
- Simplified onboarding for new contributors
A multi-repository approach introduces publishing, versioning, and coordination overhead that is not justified at the current scale.
A plain repository without monorepo tooling provides insufficient support for dependency management and build optimization as the platform grows.
Nx offers appropriate structure and tooling without introducing unnecessary operational complexity.
Consequences
Positive Consequences
- Single source of truth for shared code
- Reduced duplication
- Easier cross-project refactoring
- Consistent development workflows
- Simplified dependency management
- Simplified CI/CD strategy
- Better support for future platform growth
Negative Consequences
- Contributors must understand Nx concepts and tooling
- Repository size will increase over time
- Project structure becomes dependent on Nx conventions
Follow-up Actions
- Use shared-types for shared TypeScript contracts
- Use shared-validation for shared runtime validation schemas
- Keep shared libraries minimal until concrete usage exists
- Add CI validation for build, lint, and test workflows
- Re-evaluate repository strategy if services become independently owned