Some words about the structure of monorepo we are using here.
The monorepo is focused around multiple Typescript projects coming together to form an Element Web & Element Desktop app.
Some of the underlying typescript projects are useful for re-use elsewhere,
e.g. @element-hq/web-shared-components is reused by https://github.com/element-hq/aurora.
apps- this directory holds the apps we build,element-web&element-desktop- Things in here are not published to npm
- Things in here have very non-standard publishing steps, e.g. Element Desktop
.debships via reprepro. - Things in here are in lock-step versions with each other
- Things in here are represented as a group in Immutable Github Releases
- Things in here support pre-releases & hotfixes
packages- this directory holds some npm packages we maintain in order to build theapps- Things in here are published to npm
- Things in here respect SemVer
- Things in here are independently versioned
- Things in here have a very simple publishing stage of
pnpm publish - Things in here do not support pre-releases & hotfixes
modules- this directory will hold some Element Web/Desktop modules we maintain in order to add environment-specific functionalities atop Element- Things in here are not published to npm
develop- this is the default branch and should always be buildable, this is what developers use as a base branch for their pull requests- Deployed via CD to develop.element.io
- #TODO should we just use short-lived release branches? We'd need to effectively interlace them for the various packages which feels messy
staging- this branch is used to build the latest/next release.- During a normal release cycle,
developis merged intostagingto "cut" a release candidate- Additional changes such as version bumps & changelogs are committed on top
- During a hotfix/security release, changes are directly cherry-picked to
stagingto "cut" a release based on the last release rather thandevelop - When a release is finished, i.e. we've shipped the final release for a given version, we merge
staging->developto maintain continuity
- During a normal release cycle,
backport/*- these branches are used for cherry-picking entire pull requests fromdeveloptostaging, either to patch a release candidate, or to perform a hotfix release<username>/*- these feature branches are used for development, and may branch offdevelopor another feature branch
v*- these tags are used by the releases shown in the Github Releases UI, as in, the overall app release group<package>@*- these tags represent the release state of an individual npm package from thepackages/*dir
Ultimately, the treatment of the 3 types of submodules we host in this repository is quite asymmetrical but this is by design, to simplify processes around projects which do not need the complexities of element-web & element-desktop.