packages/docs/docs/contributing/project-details/index.md
Actual is made up of lots of different packages organized as a monorepo using Yarn workspaces. This article covers how they all fit together to form the project you know as Actual.
All of our repositories can be found in the Actual Budget organization on GitHub, within that organization you will then find the repository containing the code for Actual, Actual Server and the Docs.
The Actual monorepo contains the following main packages:
packages/loot-core/)The core application logic that runs on any platform.
src/client/ - Client-side core logicsrc/server/ - Server-side core logicsrc/shared/ - Shared utilitiessrc/types/ - Type definitionsmigrations/ - Database migration filespackages/desktop-client/ - aliased as @actual-app/web)The React-based UI for web and desktop.
src/components/ - React componentssrc/hooks/ - Custom React hookse2e/ - End-to-end testspackages/desktop-electron/)Electron wrapper for the desktop application.
packages/api/ - aliased as @actual-app/api)Public API for programmatic access to Actual.
packages/sync-server/ - aliased as @actual-app/sync-server)Synchronization server for multi-device support.
@actual-app/web (the desktop-client package)yarn build:server and yarn install, the Actual client is installed as a dependencyYou can see this in the package.json file:
"dependencies": {
"@actual-app/web": "workspace:*",
// rest of dependencies...
},
The workspace reference ensures that changes to @actual-app/web are reflected in your server deployment. If you see any discrepancies, run yarn build:server to compile the latest.
packages/component-library/ - aliased as @actual-app/components)Reusable React UI components.
src/ - Component source filessrc/icons/ - Icon components (auto-generated)packages/crdt/ - aliased as @actual-app/crdt)CRDT (Conflict-free Replicated Data Type) implementation for data synchronization.
packages/plugins-service/)Service for handling plugins/extensions.
packages/eslint-plugin-actual/)Custom ESLint rules specific to Actual.
no-untranslated-strings - Enforces i18n usageprefer-trans-over-t - Prefers Trans component over t() functionprefer-logger-over-console - Enforces using logger instead of consoletypography - Typography rulesprefer-if-statement - Prefers explicit if statementspackages/docs/)Documentation website built with Docusaurus.
To run commands for a specific package, use:
yarn workspace <workspace-name> run <command>
For more information about development workflows, see the Development Setup Guide.