---
url: https://suyiiyii.github.io/alldayrec/en/how-to/contribute.md
---

# How to contribute

[Issues](https://github.com/suyiiyii/alldayrec/issues) and PRs are welcome. Code boundaries, the CI workflows, release builds and their secrets are in [CONTRIBUTING.md](https://github.com/suyiiyii/alldayrec/blob/main/CONTRIBUTING.md).

## Local checks

The same checks CI runs:

```bash
# server/
uv run --with pytest pytest -q
# web/
pnpm install --frozen-lockfile && pnpm build
for f in *.check.ts; do node --experimental-strip-types "$f" || exit 1; done
# app/ (use the pub host recorded in pubspec.lock)
PUB_HOSTED_URL=https://pub.flutter-io.cn flutter pub get --enforce-lockfile
flutter analyze --no-pub && flutter test --no-pub -j 4
```

The Android JVM and Swift checks are in `.github/workflows/app.yml`; the firmware host checks are in `.github/workflows/firmware-check.yml`.

## Docs site

The docs site lives in `docs/` and is built with VitePress:

```bash
cd docs
pnpm install --frozen-lockfile
pnpm docs:dev       # preview locally
pnpm docs:build     # build to docs/.vitepress/dist and check for dead links
```

The tables in [HTTP API](../reference/api.md) and [MCP tools](../reference/mcp.md) are generated by a script. After you change an endpoint, regenerate them from the repository root and commit:

```bash
uv run --project server python docs/gen-api.py
```

## Commit messages

* Format `[type][Area] subject`: in English, imperative, a subject line of at most 72 characters, details in the body.
* type: `feat`, `fix`, `chore`, `ci`, `perf`, `doc`, `test`; Area: `Server`, `App`, `Firmware`, `Web`, `CI` and others, which you can stack (`[fix][Server][Web]`).
* No `Co-authored-by`.

Binary files such as screenshots don't go into `main`: push them to the `assets` branch first (add only, never change; name them `img/<name>-<yyyymmdd>.ext`), then link them as `https://raw.githubusercontent.com/suyiiyii/alldayrec/assets/img/<file>`.
