Tomacco

Give your agent a phone.

It builds, runs, taps through and debugs iOS and Android apps.
On Linux. No Mac needed.

See how it works Source and downloads: coming soon

Homer crossed a tomato with tobacco. We crossed iOS with a Linux PC.

Same idea. Less soil.

The name comes from The Simpsons, where the cross turns out addictive. Not affiliated with The Simpsons or Disney, Apple or Omarchy. Nothing here to smoke.

Your agent can finally run what it writes.

Coding agents write mobile apps, then can't see them run. With Tomacco they build, run, tap through and fix the app themselves.

$ tomaccoctl call project.run '{"path":"/home/you/Tomatoes","platform":"android","device":"emulator-5554"}'
{"ok":true,"result":{"id":"JOB_ID","state":"queued",…}}
$ tomaccoctl call job.wait '{"job_id":"JOB_ID","seconds":30}'
{"ok":true,"result":{"state":"succeeded",…}}
$ tomaccoctl call runtime.input '{"session":"SESSION_ID","action":"tap","x":0.5,"y":0.7}'
{"ok":true,…}
$ 

164 operations. For your agent and for you.

Your agent

Works with Claude Code, Codex and any MCP client, or through a JSON command line.

You

A desktop app on the same running app. Watch your agent work, or take over.

Built for agents

Every call is checked before it runs. Long builds keep going if the connection drops.

All 164 operation names

ios36

ios.appsios.crash_symbolicateios.doctorios.emulator.build_gpu_pluginios.emulator.build_guest_toolsios.emulator.controlios.emulator.execios.emulator.guestios.emulator.guest_resultios.emulator.inspectios.emulator.inspect_pmpios.emulator.memoryios.emulator.paravirtualios.emulator.pmpios.emulator.prepare_cryptexesios.emulator.prepare_guest_toolsios.emulator.prepare_pmpios.emulator.prepare_researchios.emulator.prepare_restoreios.emulator.prepare_userlandios.emulator.probeios.emulator.reportios.emulator.researchios.emulator.restoreios.emulator.usb_bridgeios.flutter_buildios.flutter_setupios.prepareios.sdk_installios.store_shipios.toolkit_installios.virtual.configureios.virtual.startios.virtual.statusios.virtual.stopios.wda_prepare

android19

android.avd_configureandroid.avd_createandroid.avd_profileandroid.avd_startandroid.avdsandroid.calibrateandroid.connectandroid.deep_linkandroid.emulatorandroid.hierarchyandroid.inputandroid.launchandroid.mirrorandroid.performanceandroid.permissionandroid.portsandroid.recordandroid.sdk_installandroid.sdk_packages

preview15

preview.auditpreview.capturepreview.catalog_reloadpreview.clickpreview.configurepreview.consolepreview.evaluatepreview.fillpreview.inspectpreview.matrixpreview.navigatepreview.readypreview.reloadpreview.sessionspreview.state

apple10

apple.archiveapple.buildapple.deviceapple.devicesapple.exportapple.profileapple.projectapple.simulatorapple.storeapple.test

debug10

debug.breakpointsdebug.controldebug.evaluatedebug.eventsdebug.listdebug.stackdebug.startdebug.statedebug.threadsdebug.variables

project8

project.appproject.configureproject.createproject.executeproject.import_xcodeproject.inspectproject.planproject.run

runtime8

runtime.audioruntime.captureruntime.hierarchyruntime.inputruntime.listruntime.startruntime.stateruntime.stop

device7

device.appdevice.capturedevice.infodevice.installdevice.listdevice.logsdevice.screenshot

job6

job.canceljob.getjob.listjob.logsjob.sendjob.wait

remote6

remote.checkremote.configureremote.fetchremote.listremote.runremote.sync

files5

files.listfiles.mkdirfiles.readfiles.searchfiles.write

swift5

swift.android_configureswift.executeswift.planswift.sdk_installswift.status

testing5

testing.actiontesting.findtesting.instrumentationtesting.runtesting.setup

workspace5

workspace.contextworkspace.executeworkspace.listworkspace.removeworkspace.save

catalog4

catalog.exportcatalog.importcatalog.listcatalog.remove

release4

release.keystorerelease.signrelease.verifyrelease.version

play3

play.abortplay.commitplay.prepare

profile3

profile.analyzeprofile.captureprofile.compare

desktop2

desktop.opendesktop.status

settings2

settings.configuresettings.get

doctor1

doctor

The loop.

Write, build, run, tap, fix. Your agent does all five on its own.

Write

files.write

Your agent writes the code. It never overwrites a change you just made.

Build

project.execute

It builds the app and gets the errors back as data.

Run

project.run

It installs the app on a phone, an emulator or the virtual iOS device.

Tap

runtime.input

It taps through the screens and sees what you'd see.

Fix

device.logs

It reads the logs, finds the bug and goes again.

iOS 27. On a Linux PC. No Mac needed.

  • Boots to the Home screen
  • Runs Settings and Safari
  • Runs SwiftUI apps you built on Linux
  • Responds to touch from you or your agent

0.1s

from touch to the screen responding, on a PC emulating every ARM instruction.

It's a virtual iOS device on your own PC, built on QEMU, with a Rust renderer that draws through Vulkan.

Android, complete.

  • Gradle and Flutter builds
  • Swift on Android
  • The real Android Emulator
  • USB and wireless phones
  • Live screen with touch and sound
  • Debugging with JDWP and LLDB
  • UI tests across devices
  • Performance traces with Perfetto
  • Signing and Play uploads

Lives in your bar.

A phone button in your Omarchy bar. Start a device, watch your jobs and build a saved project without opening the app. The installer adds it with --omarchy.

Left: overview · Middle: device as window · Right: workspace
Left click
Opens the panel.
Middle click
Shows the live device in its own window.
Right click
Opens the live device in the desktop app.
In the bar
The icon lights up while a device is live and spins while a build runs.
TomaccoBuild Tomatoes
As windowF ScreenshotS DevicesG JobsA
ProjectFilesDebuggerProfilerWeb

DEVICES

1 connected
  • Virtual iOS deviceiOS · experimental · off
  • Medium PhoneAndroid · Emulator · live in workspace
  • Small PhoneAndroid emulator · off

JOBS

1 active
  • Build TomatoesRunning · for 12 s
  • Test TomatoesSucceeded · 4 min ago · took 38 s

PROJECTS

  • Tomatoes~/Tomatoes · Medium Phone
The Tomacco desktop app in its project workspace: a sidebar with Overview, Live device, Files, Devices, Builds and jobs, Debugger, UI tests, Performance, Release and Agents, and panels to create a build and run it on a device.
The desktop app: project, devices, builds, debugger, tests and release in one window.

What you need, and where it stands.

What you need

  • x86_64 Linux. Arch Linux and Omarchy are tested.
  • Toolchain. CMake, Ninja, a C++20 compiler, Rust 1.85+, protobuf, FFmpeg, Qt 6.9+, Python 3.11+.

For the virtual iOS device

  • Your own iOS images. Restore images and an Image4 boot ticket. Nothing from Apple ships with Tomacco, and no tool makes these for you.
  • Graphics and CPU. A Vulkan card with about 16 GiB of memory, and a fast processor.
  • Memory and disk. 8 GiB of RAM for the virtual device, up to 2 GiB more for translated code, about 100 GiB of disk for setup.
  • Time. Half an hour for the first restore, then about 9 minutes from start to your app.

Current status

  • Experimental. The virtual iOS device is a research runtime, not a finished simulator, and hasn't passed its release checks.
  • Speed. It runs far below hardware speed. An app window appears about 6.5 to 8 s after launch, the screen responds to touch in about 0.1 s, and a Home-screen swipe shows about 7 to 15 changed frames per second. Measured on an i9-13900K with a 16 GiB Radeon RX 6800-class card. A clean final measurement is still coming.
  • Not supported today. Network, audio, debugging and hardware keys on the virtual device.
  • SwiftUI. Builds need the SDK from your own Xcode download. One small app has been shown running so far.
  • Security. The virtual device isn't a security boundary. Run your own apps and don't use real accounts.
  • Not yet proven. A physical iPhone, a physical ARM64 Android phone, live store submission, and machines other than the development PC.
  • Research and interoperability. Tomacco is an independent open-source project and contains no Apple software. You supply your own iOS image and SDK, and you are responsible for using them within their license terms.

Built on the work of others.

qemu-sptm darwin-vm orchard reims-vgpu metal2vulkan Inferno vphone-cli linux-apfs-rw vhost-device m1n1 xtool go-ios WebDriverAgent cctools-port apple-libtapi ldid ipsw scrcpy

They did the hard part first. Thank you. Worth knowing too: omarchy-apple-dev and omarchy-ios-kit.

Tomacco is free software, GPL-2.0-or-later. No telemetry, no account, no cloud.

Give your agent a phone. Soon.

Source and downloads: coming soon