Skip to content
joeblauPublic

About

Multimodal Agentic Development Environment

Resources

Security policy

Stars

9 stars

Watchers

0 watching

Forks

Repository files navigation

made

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.

Project identity

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.

Prerequisites

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.

Clean-checkout setup

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.xcodeproj

SwiftPM 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.

Build and verify

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.sh

apple/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.

Local development and screenshots

# 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.sh

bun 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.

Deployment and secrets

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 deploy

Never 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.

Security

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.

Contributing

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.

Optional Chromium browser

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.

About

Multimodal Agentic Development Environment

Resources

Security policy

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages