Heisler Studio's monorepo — Expo apps and the packages they share.
apps/ deployable units — an app is not necessarily an Expo app
evergreen-bbd/ Expo SDK 57 app — personal investment tracking for a margin account
investment-portfolio-service/ Node service: Postgres, engine, MCP, HTTP API (ADR-0004)
packages/ shared packages (none yet — see ADR-0001)
docs/
adr/ architecture decisions
design/ agreed designs, per app
recipes/ reproducible setup procedures
Node 24.19 LTS and pnpm 10.28, both pinned in .tool-versions (asdf installs them). Turborepo is a
workspace dependency — no global install.
pnpm installRun from the root; Turborepo fans them out across workspaces.
pnpm dev # start every workspace's dev task
pnpm build # export bundles
pnpm lint
pnpm typecheck
pnpm test
pnpm format # prettier, with Tailwind class sortingTarget one workspace with pnpm --filter evergreen-bbd <script>.
The service needs Docker and 1Password —
apps/investment-portfolio-service/README.md has the loop.
Follow docs/recipes/new-expo-app.md. There is deliberately no base app to copy — ADR-0001 explains why.
nodeLinker: hoistedinpnpm-workspace.yamlis load-bearing. Metro resolves modules from disk rather than from the importing package's scope, so pnpm's isolated store hides transitive dependencies from the bundler. Removing it breaks NativeWind.- Tailwind is pinned to v3. NativeWind 4 requires it — see ADR-0002.
- The theme lives in two files.
src/global.cssholds HSL custom properties for NativeWind;src/lib/theme.tsholds the same values as JS strings for React Navigation, which cannot read CSS variables. Change both together. - A shared package needs a real consumer or it breaks silently. That consumer is an app, never a template.
Work is tracked in Linear (heisler-studio, team ENG) — see .linear.toml.
This repo was reset on 2026-08-04. Everything prior — a base universal app, a Next.js app, and four
packages, all several Expo SDKs behind — is preserved at the pre-reset tag and reachable with
git show pre-reset:<path>.