Claude Sonnet 5.5
Recommendation: use one monorepo.
Eight engineers, three tightly coupled codebases, and a shared API client is close to the ideal case for a monorepo. The API client is the dependency that ties the web and mobile apps together. With separate repos, every change to it means publishing a package, bumping versions in two other repos, and coordinating releases. Versions drift, and bugs show up only after integration. In a monorepo, one pull request can change the client and update both consumers, and CI proves they all still work together. At this team size, that saved coordination matters far more than the tooling cost.
Risk 1: CI slows down and becomes fragile as the repo grows. Every commit could trigger builds and tests for all three projects, which wastes time and makes unrelated failures block people.
Mitigations:
- Use a workspace tool with affected-only builds and caching (Nx, Turborepo, or Bazel if you need it later) so a web-only change doesn't rebuild mobile.
- Use path-based CI triggers and remote caching.
- Track CI duration as a metric and set a budget, such as under 10 minutes for a typical PR.
Risk 2: Unclear boundaries and ownership lead to tangled code and accidental coupling. When everything is importable from everywhere, the web app can start reaching into mobile internals, or the shared client can pick up app-specific logic. A single main branch also means one broken merge affects everyone.
Mitigations:
- Define clear package boundaries (
apps/web,apps/mobile,packages/api-client) and enforce them with lint rules, such as Nx module boundaries or ESLint import restrictions. - Use CODEOWNERS so changes to the shared client require review from the right people.
- Protect main with required CI checks and a merge queue, and keep PRs small.
- Give the shared client a stable public interface, with internals not importable by apps.
One caveat: mobile release cycles (app store review, users on old versions) differ from web deploys. A monorepo doesn't prevent this, but keep the API client backward compatible, and version and release the apps independently from the same repo.