Dependencies for Each Package in Makeplane Plane: Complete Monorepo Guide
The makeplane/plane repository organizes its codebase into a TypeScript-first monorepo where every package under packages/ maintains its own package.json declaring runtime dependencies and development devDependencies, using workspace:* for internal monorepo links and catalog: for external library versions.
Understanding the dependency structure of the makeplane/plane monorepo is essential for contributing features, debugging build issues, or extending the open-source project. Each package publishes its own dependency manifest, following strict PNPM workspace conventions that separate local cross-package references from third-party library requirements.
Dependency Management Conventions
The monorepo uses two specific version specifiers to manage its dependency graph efficiently.
workspace:* – Refers to another package inside the same repository. This creates local monorepo dependencies that resolve to the current source code rather than npm registry versions.
catalog: – Refers to an external package whose exact version is resolved from the repository-wide pnpm-lock.yaml. This "catalog" feature ensures consistent versions across all packages.
Package-by-Package Dependencies
Each package in the packages/ directory serves a distinct architectural purpose with carefully declared dependencies.
@plane/utils – Shared Utility Functions
The @plane/utils package provides helper functions used across applications. In packages/utils/package.json, it declares:
- Runtime dependencies – Internal references to
@plane/constantsand@plane/typesusingworkspace:*, plus external libraries includingchroma-js,clsx,date-fns,lodash-es,lucide-react,sanitize-html,uuid, and markdown processing utilities (hast,rehype-parse,remark-gfm, etc.) viacatalog: - Dev dependencies –
@plane/typescript-config, TypeScript definitions, and build tools (tsdown,typescript) viacatalog:
@plane/ui – UI Component Library
The @plane/ui package contains the core UI component library. According to packages/ui/package.json, it depends on:
- Internal runtime –
@plane/constants,@plane/hooks,@plane/propel,@plane/types, and@plane/utilsviaworkspace:* - External runtime – Drag-and-drop utilities (
@atlaskit/pragmatic-drag-and-drop), blueprint components (@blueprintjs/core), Headless UI (@headlessui/react), Radix UI (@radix-ui/react-scroll-area),clsx,lodash-es,lucide-react, and styling utilities viacatalog: - Peer dependencies –
reactandreact-domviacatalog: - Dev dependencies –
@plane/tailwind-config,@plane/typescript-config, Storybook packages, and PostCSS tooling viacatalog:
@plane/propel – Rich UI Components
The @plane/propel package provides advanced UI components like buttons, dialogs, and tables. In packages/propel/package.json:
- Runtime dependencies – Internal packages (
@plane/constants,@plane/hooks,@plane/types,@plane/utils) viaworkspace:*, plus@base-ui-components/react,@tanstack/react-table,class-variance-authority,framer-motion,recharts, andtailwind-mergeviacatalog: - Dev dependencies –
@plane/tailwind-config,@plane/typescript-config, Storybook addons, and Vite tooling viacatalog:
@plane/services – HTTP Client Utilities
The @plane/services package wraps Axios for API communication. According to packages/services/package.json:
- Runtime dependencies –
@plane/constantsand@plane/typesviaworkspace:*, plusaxiosandfile-typeviacatalog: - Dev dependencies –
@plane/typescript-config,tsdown, andtypescriptviacatalog:
@plane/shared-state – Global State Management
The @plane/shared-state package implements MobX-based stores. In packages/shared-state/package.json:
- Runtime dependencies – Internal references (
@plane/constants,@plane/types,@plane/utils) viaworkspace:*, pluslodash-es,mobx,mobx-utils,uuid, andzodviacatalog: - Dev dependencies – TypeScript tooling and
@plane/typescript-configviacatalog:
@plane/types – TypeScript Definitions
The @plane/types package contains shared type definitions. According to packages/types/package.json:
- Runtime dependencies –
@plane/constantsand@plane/types(self-reference for circular usage) viaworkspace:* - Peer dependencies –
reactandreact-domviacatalog: - Dev dependencies –
@plane/typescript-config,@types/*packages,tsdown, andtypescriptviacatalog:
@plane/hooks – React Hooks
The @plane/hooks package provides shared React hooks. In packages/hooks/package.json:
- Runtime dependency –
reactviacatalog: - Dev dependencies –
@plane/typescript-config,@types/*,tsdown, andtypescriptviacatalog:
@plane/i18n – Internationalization
The @plane/i18n package handles translation utilities. According to packages/i18n/package.json:
- Runtime dependencies –
i18next,i18next-icu,i18next-resources-to-backend,react, andreact-i18nextviacatalog: - Dev dependencies –
@plane/typescript-config,@types/*,tsdown,tsx, andtypescriptviacatalog:
@plane/logger – Logging Infrastructure
The @plane/logger package provides Express-compatible Winston logging. In packages/logger/package.json:
- Runtime dependencies –
express-winstonandwinstonviacatalog: - Dev dependencies –
@plane/typescript-config,@types/express,@types/node,tsdown, andtypescriptviacatalog:
Configuration Packages
Several packages provide shared configuration without external runtime dependencies:
@plane/typescript-config– Containsbase.json,nextjs.json,react-library.json, andnode-library.jsonconfiguration files with no runtime dependencies.@plane/tailwind-config– Declares@tailwindcss/postcssandpostcssas runtime dependencies, withtailwindcssas a dev dependency, all viacatalog:.@plane/constants– Pure constant definitions with no external dependencies.@plane/editor– Rich-text editor component with dependencies similar to@plane/uiand@plane/propel(seepackages/editor/package.jsonfor specifics).
Working with Package Dependencies
When importing packages within the monorepo, PNPM automatically resolves workspace:* dependencies to the local source. The following examples demonstrate how these dependency relationships work in practice.
Importing UI components that rely on internal utilities:
// Consumes @plane/constants and @plane/utils internally
import { Button } from '@plane/ui';
import { APP_NAME } from '@plane/constants';
export const MyButton = () => (
<Button variant="primary">{APP_NAME}</Button>
);
Making typed API calls using the services layer:
// Uses axios internally, types from @plane/types
import { apiClient } from '@plane/services';
async function fetchProjects() {
const { data } = await apiClient.get('/api/projects');
return data; // Type inferred from @plane/types definitions
}
Using table components with their required peer dependencies:
// Relies on @tanstack/react-table and @plane/utils
import { Table } from '@plane/propel/table';
import { columns, rows } from './my-data';
export const ProjectTable = () => <Table columns={columns} data={rows} />;
Summary
- The makeplane/plane monorepo structures dependencies through
packages/<name>/package.jsonfiles, separating runtime requirements from build-time tooling. - Internal dependencies use the
workspace:*protocol to link local packages, ensuring changes propagate immediately across the codebase. - External dependencies use the
catalog:protocol to maintain consistent versions across all packages via the centralpnpm-lock.yaml. - Peer dependencies are explicitly declared in UI packages like
@plane/ui,@plane/types, and@plane/propelto ensure compatible React versions. - Zero-dependency packages like
@plane/constantsprovide pure data without external version constraints.
Frequently Asked Questions
What is the difference between workspace:* and catalog: dependencies?
workspace:* links to other packages within the same monorepo, resolving to the local file system rather than the npm registry. catalog: references external npm packages but pulls their exact version from the repository-wide catalog defined in pnpm-lock.yaml, ensuring version consistency across all packages without duplicating version strings in every package.json.
How do I add a new dependency to a specific package?
Add the dependency to the specific package's package.json using workspace:* for internal monorepo packages or catalog: for external libraries. Run pnpm install from the repository root to update the lockfile and propagate changes through the workspace dependency graph.
Which packages have peer dependencies?
The UI-focused packages declare peer dependencies to ensure compatibility with the consuming application's React version. Specifically, @plane/ui, @plane/types, and @plane/propel all list react and react-dom as peer dependencies via catalog:, preventing version mismatches in the component tree.
How are external library versions managed across the monorepo?
External versions are centralized using PNPM's catalog feature. When a package specifies "lodash-es": "catalog:", PNPM resolves this to the version defined in the root pnpm-lock.yaml or catalog configuration. This ensures that packages like @plane/utils, @plane/shared-state, and @plane/ui all use identical versions of shared libraries like lodash-es without manual synchronization.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →