docs/adr/0004-public-mirror-private-ios.md

ADR 0004: Public Mirror With Private iOS Release Lane

  • Status: Accepted
  • Date: 2026-07-05

Context

GitHub repository visibility applies to every tracked path and every reachable Git object in the repository. The private clanky-ios/ package cannot remain private inside a public repository, and old branches or tags can still expose private iOS history even if the directory is deleted from master.

Clanky still needs the private iOS app to build from a checkout that also contains clanky-contract/, because the app consumes @clanky/contract as a workspace dependency and EAS builds install dependencies from the archived Git checkout.

Decision

Clanky keeps an internal full checkout for private development and release automation. That checkout contains clanky-ios/, the public package directories, and the internal iOS Mobile, Public Export, and Docs Pages workflows.

The public repository is exported from the internal checkout as an iOS-free tree. The export excludes:

  • clanky-ios/
  • .github/workflows/docs-pages.yml
  • .github/workflows/ios-testflight.yml
  • .github/workflows/public-export.yml

The public repository starts from a sanitized export rather than making the existing private repository public. Old private branches and tags are not published to the public remote.

The root public CI workflow runs only the public package gates. The internal Public Export workflow refreshes the public snapshot on master pushes. The internal Docs Pages workflow publishes generated public ClankVox docs to the shared Volpestyle/docs GitHub Pages host. The internal iOS Mobile workflow runs the private mobile fast gate on pull requests and master pushes that touch clanky-ios/, clanky-contract/, or the workflow itself. Its EAS production iOS build with TestFlight submission runs only on manual workflow_dispatch.

The private iOS docs app is not part of the public docs lane. A future public iOS landing page is a curated public page, not an export of the private clanky-ios/ package.

flowchart LR
  internal["Internal full checkout<br/>private"]
  ios["clanky-ios<br/>private"]
  public["Public clanky repo<br/>iOS-free export"]
  docs["Volpestyle/docs Pages<br/>generated public docs"]
  testflight["EAS production build<br/>TestFlight submit"]

  internal --> ios
  internal --> public
  internal --> docs
  ios --> testflight
  internal --> testflight

Consequences

  • Private mobile source and release automation are not present in the public tree or public Git history.
  • The private release lane preserves the existing workspace dependency from the iOS app to clanky-contract/.
  • Public CI no longer depends on clanky-ios/.
  • Public docs can update from private source without exposing private mobile docs or source files.
  • Publishing starts from a clean public export. If history preservation is required later, every published ref must be filtered and audited before it is pushed to the public remote.