Contributing
Notes for people working on Laika rather than with it. If you're building an app that uses Laika, see the Guides instead — this section is for changes to this repo.
Orientation
Laika is a monorepo carrying two core packages, released together:
| Package | What it is |
|---|---|
laikacms | Core domain, HTTP APIs, storage/document/asset implementations, serializers, shared utilities. |
@laikacms/server | Decap CMS integrations: the Decap-compatible backend, OAuth2, widgets, server adapters. |
Alongside them, packages/github, packages/gitlab, packages/bitbucket, and packages/vite-plugin hold git-host storage adapters and the dev-server plugin. docs/ and apps/website are the documentation site and marketing site, both apps in the same pnpm workspace.
Each core package follows the same layered, DDD-lite structure (see Architecture):
api → HTTP surface (storage-api, documents-api, ...) depends on domain
domain → interfaces (StorageRepository, ...), no runtime deps
impl → concrete implementations (storage-fs, storage-r2, ...) depends on domain
shared → no internal dependencies (core, crypto, i18n, json-api)A domain package (e.g. documents) defines an interface; an implementation package (e.g. documents-drizzle) implements it; an api package (e.g. documents-api) exposes it over HTTP. Use an existing triple under packages/laikacms/src (domain/storage, impl/storage-fs, api/storage-api) as the reference shape when adding a new one.
Guide
- Local setup — clone, install, build.
- Inner loop — test, lint, typecheck, dev, and where to add code.
- Landing a PR — branch naming, changesets, commit convention, CI checks.
- House style — the conventions a reviewer will hold you to.
Other pages in this section:
- Starter templates — status of the
starter-*reference apps and the core building blocks they demonstrated.
Design decisions (ADRs, incident write-ups) are recorded internally, not on this public site.
The full contribution workflow also lives in CONTRIBUTING.md at the repo root.