Frontend CI / Apple Silicon 2026

2026 Frontend Pitfall Checklist:
Biome + TypeScript Incremental on a Remote Mac

March 31, 2026 Frontend & platform engineers 8 min read

Release engineers on rented Mac runners often run Biome and TypeScript back to back without a shared contract for caches, threads, or CI order. This checklist compares biome.json with tsc --incremental settings, names realistic cache paths, and adds a three-step acceptance gate before you tag. Use it beside our monorepo remote-cache checklist and Vite and Webpack cache guide so static analysis stays fast and deterministic.

01 Pain points on shared remote Mac workers

Pain 1 — stampeding threads: Biome parallelizes file work while tsc holds a large single-process graph. Together they can oversubscribe performance cores and stall SSH. Pain 2 — poisoned caches: switching branches without invalidating tsbuildinfo yields green pipelines that fail locally. Pain 3 — wrong stage order: running expensive browser checks before cheap lint and type gates wastes minutes on every push.

02 Decision matrix: biome.json vs tsc incremental

The table below is the fastest way to align owners of formatting rules with owners of type graphs. Biome covers lint and format; TypeScript incremental covers type information reuse.

Topic Biome (biome.json / CLI) TypeScript (tsc / tsconfig)
Primary knobs files.include, files.ignore, formatter, linter, vcs.useIgnoreFile "incremental": true, optional "tsBuildInfoFile", "composite": true for project refs
CLI flags (examples) biome check --write ., biome ci . in pipelines tsc -p tsconfig.json --incremental or tsc -b for monorepos
Parallelism model Multi-file worker pool inside the Biome binary Mostly single program; use tsc -b to parallelize projects at the graph level
Typical cache artifact Project-local caches; consult Biome release notes for version-specific paths and log verbosity flags *.tsbuildinfo path from tsBuildInfoFile, default .tsbuildinfo beside config
CI cache key inputs Lockfile, Biome version, biome.json hash Lockfile, TypeScript version, tsconfig graph, source glob hash

03 Parallel workers and CPU core binding

macOS does not expose taskset. Practical binding means policy, not pinning threads by hand. Keep one or two cores free for remote desktop, sshd, and metadata daemons. Treat hw.ncpu as an upper bound, not a target concurrency.

Host profile Biome + tsc suggestion
8 performance cores (base M4 class) Run Biome and tsc sequentially in CI, or parallel only if RAM exceeds roughly twenty-four gigabytes free.
10–12 cores (Pro class) Parallel allowed: start Biome, then tsc with NODE_OPTIONS=--max-old-space-size=8192; cap other Node tools to half of logical CPUs.
Interactive SSH session Prefer nice or lower overall job count so WindowServer stays responsive during long checks.
Binding note

Advanced teams may wrap jobs with taskpolicy attributes on macOS to bias QoS, but most frontend pipelines simply limit simultaneous heavy steps and rely on incremental files to shorten wall time.

04 Cache directories worth restoring in CI

Persist read-only caches between commits when lockfiles are unchanged. Always separate caches per branch or include the lockfile hash in the key. Pair this section with package.json script preflight so script changes invalidate the right layers.

  • TypeScript: restore the directory that contains each tsBuildInfoFile plus node_modules/.cache if your wrapper stores auxiliary data.
  • Biome: cache the repository root that holds biome.json and any internal cache folder your version writes after first run.
  • Clean rule: delete build info when package.json, workspace globs, or compiler options change.

05 CI and CD placement on remote Mac

Order jobs from cheapest signal to most expensive artifact. Install dependencies, then Biome, then tsc --noEmit incremental, then unit tests, then bundlers, then smoke and predeploy checks. CD should never promote a build that skipped type information when Biome alone passed, because Biome does not replace the type checker.

06 Five-step executable runbook

  1. Pin Biome and TypeScript versions in the lockfile and print both versions into the CI log header.
  2. Run biome ci . with repository-root biome.json committed; fail on formatter drift.
  3. Run tsc -p tsconfig.json --incremental --noEmit (or tsc -b for references) and upload tsbuildinfo as a cache artifact keyed by branch and lockfile.
  4. Record wall time and CPU saturation; if both steps together exceed eighty percent CPU for ten minutes, split them across two workflow jobs.
  5. On failure, attach the first fifty diagnostics from each tool to the ticket to avoid rerunning full suites blindly.

07 Three-step pre-release acceptance

Step A: On the exact release SHA, run Biome and incremental tsc with cold caches once to prove reproducibility. Step B: Warm-cache run must finish at least thirty percent faster or you likely mis-keyed artifacts. Step C: Execute the smoke path documented in your CD runbook before tagging; link failures back to the cache key used.

Citable targets: keep incremental typecheck under five minutes for medium monorepos, Biome under ninety seconds for one million lines when cached, and always reserve two logical CPUs for the OS on shared hosts.
Takeaway

Treat biome.json and tsc --incremental as complementary gates, persist their cache files with strict keys, and cap parallelism on remote Mac hosts so SSH stays usable. The three-step acceptance block catches stale tsbuildinfo before customers do.

Next steps: open the MacWww home page for product context, compare plans and pricing for Apple Silicon rental, and read the help center for SSH, VNC, and automation setup. Browse the full blog index for more CI recipes.

Dedicated Mac Mini M4

Run Biome and tsc Incremental on a Rented Mac

Stable Apple Silicon, real macOS paths, and bandwidth for parallel CI steps. View pricing without login, then follow help docs to wire SSH runners.

Lint + types Remote Mac 24/7
Rent M4 for CI