Development

July 11, 2026 ยท View on GitHub

Remux uses XcodeGen. The checked-in project definition is project.yml.

Requirements

  • Xcode with iOS 18 SDK support
  • XcodeGen on PATH
  • Zig and the Ghostty source checkout at the relative path configured in project.yml

Build GhosttyKit

Build the XCFramework used by Release and performance profiling with:

scripts/build_release_ghosttykit.sh

Set GHOSTTY_SOURCE_DIR when the Ghostty checkout is not the configured sibling directory. The script always builds ReleaseFast, and Remux Release builds independently query the resulting XCFramework and fail on any other mode. The app also validates the selected iOS slice at launch.

Generate Project

xcodegen generate

Run this after changing project.yml.

Build

xcodebuild build \
  -project Remux.xcodeproj \
  -scheme Remux \
  -destination 'generic/platform=iOS Simulator'

Test

xcodebuild test \
  -project Remux.xcodeproj \
  -scheme Remux \
  -destination 'platform=iOS Simulator,name=iPhone 17,OS=latest'

Local Files

Keep developer-only notes, live validation configuration, and machine-specific working files in .local/. The directory is ignored by Git.

Do not commit local credentials, live SSH host details, machine-specific result bundles, or generated build products.

Debug Seeding

Debug builds can seed one saved connection from launch environment variables.

REMUX_DEBUG_SEED_CONNECTION=1
REMUX_DEBUG_SERVER_NAME="Example Server"
REMUX_DEBUG_SERVER_HOST="server.example.com"
REMUX_DEBUG_SERVER_PORT=22
REMUX_DEBUG_SERVER_USERNAME="demo"
REMUX_DEBUG_SERVER_PASSWORD="<password>"
REMUX_DEBUG_TMUX_SESSION="base"

Live validation should stay opt-in and local. Keep any real host, username, password, or test-control files out of the tracked repository.

When running generated live UI tests, use the tracked host-side wrapper so the app runs with ephemeral debug storage, the test records the exact disposable remux-latency-* tmux sessions it creates, and the wrapper removes only those allowlisted sessions after the run:

scripts/remux_live_ui_test_with_cleanup.sh \
  --only-testing RemuxUITests/RemuxAppUITests/testLiveSSHTmuxActionCycleWhenConfigured