# Inside your app repo (/docs/ship/your-app-repo)



Your app repo is a standalone React Native project wired to the Appbrew platform. Knowing what each piece does, and what is safe to change, keeps upgrades and releases painless.

## The layout [#the-layout]

<Files>
  <Folder name="src/app">
    <File name="App.tsx" />

    <File name="register-blocks.ts" />

    <Folder name="blocks">
      <File name="promo-banner.tsx" />
    </Folder>
  </Folder>

  <Folder name="packages">
    <Folder name="your-integration" />
  </Folder>

  <Folder name="ios" />

  <Folder name="android" />

  <Folder name="patches" />

  <File name=".npmrc" />

  <File name=".env" />

  <File name="mise.toml" />

  <File name="package.json" />

  <File name="pnpm-workspace.yaml" />
</Files>

## Yours to change [#yours-to-change]

* **`src/app/`** — your code: `App.tsx` composition, `register-blocks.ts`, and your custom blocks ([Custom blocks](/docs/build/custom-blocks)).
* **`packages/`** — local packages you build, consumed as `workspace:*`.
* **`.env`** — which store/app config the dev build points at ([Run your app](/docs/start/run-your-app)).

## Platform-managed files [#platform-managed-files]

* **`package.json` dependency pins** — every `@gauntlet/*` entry is pinned to one exact platform version. Bump them only as a full set ([Upgrading](/docs/ship/upgrading)).
* **`.npmrc`** — the registry wiring and the committed read token ([Registry access](/docs/ship/registry-access)), plus `node-linker=hoisted`.

<Callout type="error" title="Do not change node-linker">
  React Native's native build steps expect a hoisted `node_modules` layout.
  Removing `node-linker=hoisted` (or installing with a different package
  manager) produces Android builds that fail at runtime with missing native
  libraries — an error that looks nothing like its cause.
</Callout>

* **`patches/`** — dependency patches applied on install. Removing one breaks the build in non-obvious ways.
* **`ios/` and `android/`** — the native projects. You'll rarely edit these; integrations that need native changes usually arrive through a platform upgrade or an Appbrew-run change.
* **`mise.toml`** — pinned toolchain versions; edit only when Appbrew tells you the platform moved.
* **Bundler config** (`metro.config.js` / `rspack.config.mjs`) and `tsconfig` — preconfigured so `@gauntlet` source packages compile; treat as platform files.

## One version at a time [#one-version-at-a-time]

The repo always represents one consistent platform version: pinned `@gauntlet` set, matching toolchain, matching native projects. The [release pipeline](/docs/ship/app-releases) builds exactly what your default branch describes, which only works if the repo stays internally consistent.
