The app started as one Expo project. As it grew, review logic, content, and UI
all lived in the same tree, and the boundaries started to blur. In July I split
it into a pnpm + Turborepo workspace: apps/ for the mobile app and the corpus
tooling, packages/ for the UI components, design tokens, the spaced-repetition
core, and the content pipeline.
The point is dependency direction. The review engine (srs-core) doesn’t import
the app, and the content pipeline doesn’t import either. Once that’s enforced, a
change to one package can’t silently leak into another, and each package gets a
test suite it actually owns.
The cost is tooling. Metro has to resolve @ember/* imports out of packages/,
and pnpm on Windows has its own sharp edges with native dependencies. But the
alternative, one folder where everything touches everything, was already
starting to hurt more than the tooling does.