Tomacco

Docs About

Virtual iOS device#

An experimental iOS 27 phone that runs on an x86_64 Linux PC, with no Mac. It boots to the Home screen, runs Settings, Safari and arm64 apps you built on Linux, and takes live touch in a desktop window or from an agent.

On this page (5)

Status: experimental. It is a research runtime, not a qualified simulator. Do not put real accounts or personal data into it.

Setup includes preparing a local IM4M research manifest from a public template, your firmware manifests and your VM's device tree. The IM4M instructions give the download and helper command.

What it is#

Three parts work together:

For contributors, how it works goes deeper.

What it needs#

You needDetails
Your own restore imagesTwo exact Apple images: iPhone17,3 24A446 and PCC 23E5207q. Nothing from Apple ships with Tomacco. Find and prepare the images.
A local Image4 boot manifestPrepare the IM4M on Linux with tools/prepare_ios_research_manifest.py and the public template. No Mac or Apple signing request is needed for this step. See the instructions.
To build the engineTomacco ships no engine. Setup builds it on your machine from pinned sources, with the compilers setup names.
A graphics cardVulkan, with about 16 GiB of memory. Measured on a Radeon RX 6800-class card.
A fast CPUEvery guest processor is emulated. Measured on an i9-13900K.
Memory8 GiB for the guest, and up to 2 GiB for translated code. ios.virtual.start refuses to boot with less than 12 GiB in the computer (ios_virtual_host_too_small).
DiskAbout 100 GiB for setup. Each session's disk copy is a 32 GiB disk that takes the space of its data, and at most two are kept.
TimeHalf an hour for the restore itself. After that, about 9 minutes from a start to your app.

Other machines and graphics drivers have not been qualified. Read the legal notes first.

Measured#

On an i9-13900K with a Radeon RX 6800-class 16 GiB card:

WhatNumber
App window appears after launchabout 6.4 to 7.7 s
Touch to visible changeabout 0.1 s
Home-screen swipe, first pageabout 7.5 to 11 changed frames per second
Graphics memory over 36 app launchesat most 1.7 GiB

This is far below hardware speed. These are baselines on one host, not a comparison with a real phone. The idle first Home-screen page already changes about 10.5 times a second, so the swipe figure shows that frames keep coming during a swipe, not a rate above idle.

Honest limits#

Partly supported:

Not supported:

SwiftUI works, with the SDK from your own Xcode download. An app made with xtool new, built on Linux with xtool dev build and the Xcode 27.2 SDK, launched and drew its text and SF Symbol on the device. A few small apps so far, one with a keychain round-trip and one carrying a widget extension; see deploying your own app.

Known defects and gaps:

Next#

  1. Set it up from your restore images to the first start.
  2. Use it: start, stop, apps, models, touch and gestures. Your first SwiftUI app goes from a starter project to a build, run and watch loop.
  3. Fix it when something goes wrong.

View this page as Markdown on GitHub