MOSIS local-first

/build

Run the provable core in one command.

Everything on this page except the last section ran on 2026-07-26 (macOS 26.5, Xcode 26.6, Go 1.26.5). Anything that needs real hardware is flagged device-gated, because none of it has been verified there.


Three implementations, three commands.

Each checks itself against the same frozen vectors on one machine. No second device, no account, no network.

Swift — the full end-to-end suite

ran 2026-07-26
cd apple/ConduitKit
swift test --disable-sandbox

The flag is required, not optional: the macOS sandbox hangs the Network, PKCS#12 and VideoToolbox paths rather than failing them. The 4-test broadcast suite self-skips while the screen is locked.

Go — core, daemon and conformance

ran 2026-07-26
cd core
go test ./...
go run ./cmd/conformance ../proto/vectors

The conformance runner reports 52 vectors, 0 failed. The set is append-only, so a run that passes stays passing.

Kotlin — the third implementation, pure JVM

ran 2026-07-26
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
export PATH="$JAVA_HOME/bin:$PATH"
cd android/core
kotlinc $(find src/main/kotlin -name '*.kt') -include-runtime -d /tmp/conduit-core.jar
java -cp /tmp/conduit-core.jar org.conduit.core.Conformance ../../proto/vectors
java -cp /tmp/conduit-core.jar org.conduit.core.SessionSmoke

No Android SDK needed — any JDK 17 or newer will do. The session smoke runs real Ed25519 and real pairing maths in one process.


The apps and the daemon build unsigned.

Four Apple targets and the Android APK assemble from a clean checkout. Building is not running — none of these has held a session on hardware with the current code.

macOS, iOS and tvOS apps

builds
make apple-apps
open apple/AppleApps/ConduitApps.xcodeproj

Requires Xcode 26+ on macOS 26+. Never xcodebuild -target — the legacy path cannot resolve SwiftPM dependencies under Xcode 26 and dies inside swift-crypto. Regenerating with xcodegen rewrites the entitlements files, so mirror any new capability into project.yml first.

The Go daemon

builds runs on macOS only
cd core
go build -o conduitd ./cmd/conduitd
./conduitd run --pair

Prints its listen port, device id, active input backend and ACCEPTING while it waits. It cross-compiles for Linux and Windows but has only ever been executed on macOS.

Android

APK assembles
cd android
echo "sdk.dir=$HOME/Library/Android/sdk" > local.properties
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
./gradlew :app:assembleDebug

Interim honesty: an Android tablet can watch a Mac's screen today with no Android app at all — Show My Screen, then any browser, because Chrome plays the HLS stream natively.


Everything past this point is device-gated.

None of the steps below has been run to completion with the current code. They are written down so the first person to try has a script, not so the site can imply they work.

Pair two devices

device-gated

Enable Accept pairing on one device, tap the other under Nearby, compare the six digits and the word pair, confirm on both. Android has never completed this step.

Grant Accessibility and Screen Recording

device-gated

Input injection needs Accessibility and a non-sandboxed app; capture needs Screen Recording. The real CGEvent injector compiles and is wired, and has never moved a real cursor since the fixes.

ReplayKit broadcast, and Wi-Fi Aware

device-gated

iPhone-to-Mac broadcast needs a real device; Wi-Fi Aware needs two Aware-capable iPhones or iPads. The Aware entitlement is granted and the code is written — not one byte has flowed over it.

The scripted session, with the expected output at each step, is DEVICE_CHECKLIST.md. When one of these completes for real, the counter on /status stops reading zero.