Llim.run

Quickstart

Build an iOS app on a remote Xcode sandbox and watch the result stream into your browser, all from your terminal.

If you're handing this off to a coding agent, read CLI for coding agents instead. That page is the skill an agent should follow end to end.

Try it in your browser first

If you'd rather poke at an instance before installing anything, console.limrun.com has a Playground that creates and streams an instance from a dropdown. Pick an OS, pick an app to preinstall, hit Start.

Limrun console Playground with Organization, Operating System, Apps, Open URL, and Start controls

The rest of this page covers the CLI flow.

Set up the build

Requires Node.js 20 LTS or newer.

# Pick your package manager
npm  install --global @limrun/cli
pnpm add     --global @limrun/cli
bun  add     --global @limrun/cli

Open the console in your browser, grab the API key from the page, and write it to ~/.lim/config.yaml:

lim login

On a headless host (CI, a devcontainer), set LIM_API_KEY in the environment instead.

Use the sample app for the quickest path. Already have an iOS project locally? Skip the clone and cd into your project directory.

git clone https://github.com/limrun-inc/sample-native-app.git
cd sample-native-app

A single lim ios create --xcode provisions a simulator and an attached Xcode sandbox in one call. --reuse-if-exists makes re-runs return the same instance instead of creating a new one.

lim ios create --xcode --reuse-if-exists --label project=quickstart

Open the Signed Stream URL from the output in any browser to watch the simulator live. The URL has its own token embedded, so no sign-in is needed.

From inside the project directory:

lim xcode build .

For multi-scheme projects, add --scheme <name> and either --workspace <path> or --project <path>.

Build logs stream back as they happen. On success, the build artifact auto-installs and auto-launches on the attached simulator. The streaming tab updates to your app's first screen a few seconds after the build completes.

The sample-native-app running on a remote iOS simulator, showing its 'Hello, world!' first screen

Drive the app

Once the build lands, you can read state and drive the UI directly from your shell. Most commands default to the last-created instance, so you rarely need to pass --id.

lim ios screenshot ./screen.png
lim ios element-tree
lim ios tap-element --ax-label "Continue"
lim ios type "Hello"

The element tree is the source of truth for what the UI shows: labels, accessibility IDs, types, frames. Reach for it before every action; it's faster and more reliable than visual inspection.

Tear down

When you're done, delete the instance. Without an ID, lim ios delete removes the last iOS instance the CLI created for you (the pointer is in ~/.lim/last-instances.json).

lim ios delete

Where to go next

bot

CLI for coding agents

Hand the build, drive, and ship loop off to a coding agent via the bundled skill.

hammer

Build with remote Xcode

Every lim xcode build flag, real-device IPAs, source-sync internals, MCP-wrapped build tools.

monitor-play

Embed the simulator

Stream a live iOS or Android simulator into your web app with <RemoteControl /> from @limrun/ui.

tablet-smartphone

Run an Android Emulator

ADB tunnel, scrcpy streaming, Appium, and the rest of the Android toolchain over a remote emulator.