made (Multimodal Agentic Development Environment) is a native Apple development environment: four companion apps, a public website, and an optional rendezvous relay.
- Cockpit (macOS, internal target
Pilot) combines terminals, editing, browser previews, GitHub work, device capture, simulators, remote screens, local container control (see the Docker section), and device mock-ups (see the Mock-ups section). - Walkie (iOS, internal target
Copilot) supplies a trackpad, voice transcription, settings, and secure peer messaging. - Kneeboard (iPadOS, internal target
Plotter) mirrors a Cockpit window with low-latency HEVC and sends normalized PencilKit annotations. It supports rotation, Split View, and Stage Manager; see the display policy. - Trigger (watchOS, internal target
Wingman) sends live, short-lived terminal control gestures through its paired Walkie. - blau.app is the parent Next.js/OpenNext site, maintained and deployed separately in joeblau/blau.
- Web is the static Astro site at blau.app/made.
- Rendezvous is a Cloudflare Durable Object WebSocket relay for encrypted peers that cannot discover one another locally. It cannot read peer payloads.
The peer trust, verification-code, encryption, replay, and framing design is documented in device pairing and FrameLink and secure messaging. The reviewed Drone execution architecture and versioned protocol baseline are in Drone execution protocol.
The project is published as made — Multimodal Agentic
Development Environment — from joeblau/made.
The main macOS app is Cockpit, packaged as Cockpit.app.
bun cockpit builds and installs it; bun made remains a compatibility alias.
The internal Apple target names, app.blau.* bundle identifiers, stored-data
keys, and peer protocol identifiers remain stable for existing installations.
The website is published at blau.app/made, and the relay continues to use
rendezvous.blau.app. Existing dependency release tags retain their original
names and checksums.
To use Cockpit, download the macOS app from the
latest release, move
Cockpit.app into Applications, and open it. macOS 26 or later is required;
Apple silicon and Intel Macs are supported. First-run setup walks through
permissions and optional developer tools. Reopen it from Cockpit > Set Up
Cockpit…. The terminal, editor, notes, and browser are included.
The prerequisites below are for building from source.
- macOS with Xcode 27.x selected by
xcode-select(the version enforced in CI). The pinned GhosttyKit/ChromiumKit binary artifacts are still reproduced on Xcode 26 until they are re-bootstrapped. - Homebrew for the Apple command-line tool set, including Fastlane for reproducible screenshot capture.
- Git LFS. Current checkouts download GhosttyKit through SwiftPM, while historical revisions still contain LFS pointers; keeping LFS installed makes bisects and old release checkouts work.
- Bun 1.4.4 (pinned by
packageManager) for all Worker and web dependencies. - Node.js 22.23.4 or newer for the current Astro and Vitest build tooling.
- A Cloudflare account only when running or deploying the Worker services.
The root and web TypeScript 6 pins are intentional until astro check and the
embedded-language tooling support TypeScript 7. The rendezvous Worker uses
TypeScript 7 directly.
XcodeGen is downloaded at a pinned version and checksum by the repository; do not rely on an arbitrary global installation.
git clone https://github.com/joeblau/made.git
cd made
git lfs install
git lfs pull
bun install --frozen-lockfile
brew bundle --file apple/Brewfile
apple/bin/install-xcodegen.sh generate --spec apple/project.yml --project apple
xcodebuild -resolvePackageDependencies -project apple/made.xcodeproj
open apple/made.xcodeprojSwiftPM verifies the checksummed GhosttyKit release artifact declared by the
local package in apple/Packages/GhosttyKit. Maintainers can reproduce and
audit that binary with the GhosttyKit release procedure.
Run these from the repository root:
# Apple project, application builds, tests, lint, and generated assets
apple/bin/install-xcodegen.sh generate --spec apple/project.yml --project apple
apple/bin/build-ci.sh
apple/bin/test.sh all
apple/bin/lint-swift.sh --all
apple/bin/app-icon-tool.swift validate
# Web + rendezvous dependencies, lint, type/metadata checks, tests, build, audit
bun install --frozen-lockfile
bun run lint
bun run check
bun run test
bun run build
bun run audit
bun run ci
# Documentation links and repository paths
bin/check-docs.shapple/bin/test.sh pilot runs only the macOS suite,
apple/bin/test.sh shared runs only the Walkie iOS Simulator suite,
apple/bin/test.sh plotter runs only the Kneeboard iPad Simulator suite, and
apple/bin/test.sh drone runs the protocol, lifecycle, durable-job, PTY, tool,
and encrypted worker proofs. See the
Drone installation and controlled rollout guide for
multi-Mac setup, pairing, recovery, and the remaining physical rollout gates. Set
IOS_SIMULATOR_UDID or IPAD_SIMULATOR_UDID to select an installed simulator
for the corresponding mobile suite. The scripts pin
Package.resolved, disable signing, and build the Debug configuration. They
share one derived-data directory per platform under BLAU_DERIVED_DATA
(default $TMPDIR/blau-apple-ci), so test.sh after build-ci.sh reuses the
application hosts instead of rebuilding them. Because the two scripts share
those directories, run them one after the other rather than concurrently, or
point each at its own BLAU_DERIVED_DATA; Xcode locks the build database.
The mobile suites build for the generic iOS Simulator destination, as
build-ci.sh does, and then run on the selected simulator without rebuilding.
Result bundles accumulate under the shared directories; delete
BLAU_DERIVED_DATA to reclaim the space. Chromium and release builds keep
their own derived data. See the
clean-run build-reuse measurements.
To lint only a branch diff, run
apple/bin/lint-swift.sh --changed origin/main. Suppress a SwiftLint rule only
at the narrowest declaration and explain why; do not grow the baseline.
# Build, install, and launch the desktop, phone, and tablet apps
bun cockpit
bun walkie
bun kneeboard
# Astro and rendezvous development servers through Turborepo
bun run dev
# A single service
bun run --cwd workers/web dev
bun run --cwd workers/rendezvous dev
# Demo-mode product screenshots
cd apple
fastlane snapshotAll
./bin/capture-pilot.sh
./bin/capture-wingman.shbun cockpit uses a persistent apple/.build/cockpit cache, builds only the
host architecture, and compiles Swift with whole-module optimization (-O,
the same Swift codegen as release). Changing a file recompiles its whole
module, so rebuilds are slower than incremental builds. It verifies and reuses the pinned Chromium runtime,
caches Xcode project generation, and clones the installed app on APFS. The first
build populates the cache; later builds reuse it. Set BLAU_PILOT_DERIVED_DATA
to relocate it. install-pilot-chromium.sh --skip-build installs that local
product. The standalone apple/bin/build-pilot-chromium.sh command retains
optimized universal build settings; add --local for the development settings.
Release archives retain their timestamped signing policy.
bun walkie selects an available physical iPhone, and bun kneeboard selects
an available physical iPad. Connect and unlock the device, enable Developer
Mode, and let Xcode manage development signing. bun walkie (alias
bun copilot) builds the optimized Release configuration with the APNs
sandbox environment that development signing requires; bun kneeboard builds
Debug. If multiple matching devices
are connected, select one with --device, for example
bun kneeboard --device "My iPad". Set BLAU_IOS_DEVICE for the equivalent
non-interactive selection.
For populated desktop feature scenes in both appearances, run
bun run screenshots:cockpit. It exports 28 native-panel mockups, a manifest,
and a review gallery to apple/.build/snapshots/output/. See the
Cockpit screenshot guide for scene selection,
fixture editing, and website embedding. The older mobile screenshot harness
writes to workers/web/public/screenshots/ and never requires a live peer. Both
mobile UI-test targets compile the canonical Fastlane helper at
apple/Tests/UITestSupport/SnapshotHelper.swift. To update it, replace only that
file with Fastlane's upstream helper, reapply the local Swift 6 @MainActor
compatibility annotations, and retain the upstream SnapshotHelperVersion
marker; do not add target-local copies. Regenerate the Xcode project and run
fastlane snapshotAll to verify the update.
Production deployment and rollback are owned by the protected GitHub
production environment and the pinned workflows. See
production operations for the exact commands, Cloudflare
token scope, endpoint verification, and rollback procedure. Tagged macOS and
TestFlight builds use the separate protected apple-release environment; see
Apple releases for the signing material, App Store
Connect setup, tag convention, and release behavior.
For an authorized manual deployment using the lockfile-installed Wrangler:
bun run --cwd workers/web deploy
bun run --cwd workers/rendezvous deployNever commit credentials, local .env files, signing material, pairing keys,
or Cloudflare tokens. Local Worker values belong in untracked .dev.vars
files. Production values belong in the GitHub production environment or
Cloudflare's encrypted secret store. Xcode signing is configured by the local
developer account, not checked-in certificates.
Cockpit Notes is a local plaintext scratchpad. Its value masking is only a visual shoulder-surfing aid; it is not encryption or a password manager.
Please report vulnerabilities privately using the process in SECURITY.md. Do not open a public issue for an unpatched security problem.
Generated Xcode project changes must match apple/project.yml; CI regenerates
the project and rejects drift. Use CLAUDE.md as portable repository
guidance for contributors and coding agents. Work is tracked in
GitHub Issues, not by adding stale
source line references to TODOS.md.
Cockpit's Chromium-backed browser panel is opt-in; clean Debug and Release builds continue to use WebKit without downloading CEF. Validate the immutable artifact lock with bash apple/bin/package-chromiumkit.sh manifest, then follow the Chromium browser guide and ChromiumKit setup to install, build, run apple/bin/test-chromium-runtime.sh, sign, and validate the Chromium configuration.