Blolabel
← Notes
analysis 8 min read

Desktop-only training data lifted Qwen3.5-4B's mobile grounding by 10.8 points; phoneshell's crawler keeps centre points that cannot score a click

The dataset is desktop-only, built from apps chosen because their accessibility trees are good. The gain still shows up on phone screenshots. We compared what DeskForge stores for each observation with what phoneshell's crawler stores for each iPhone screen.

Fine-tuning Qwen3.5-4B on 200,000 grounding examples drawn from Linux desktops raised its ScreenSpot-v2 mobile accuracy from 82.44% to 93.21%, a 10.77-point gain from a dataset that, in its authors' words, "contains no mobile screens". The same model, used as the action model under a fixed planner, solved 50 of 119 WebArena-Infinity tasks instead of 31. DeskForge was posted on 1 October 2026. phoneshell's crawler collects the same kind of data on an iPhone, and stores it in a form that could not have produced either number.

Abstract technical illustration of overlapping translucent window rectangles with thin outlined boxes around small elements, next to a single tall narrow rectangle

What DeskForge built

A. Said Gurbuz, Ahmed Nassar, Sunghwan Hong, Marc Pollefeys and Peter W. J. Staar (ETH Zurich, IBM Research Zurich, Microsoft; arXiv:2610.02320) compose real applications into controlled desktop scenes: 19 Linux apps from GNOME Calculator to VS Code, 7 appearance presets including four macOS-inspired and one Windows-inspired theme, all on a Linux backend, and 7 resolutions from 1366 x 768 to 3840 x 2160. They vary app state, staged content, window layout and stacking. Each observation fuses the screenshot, the accessibility tree and window geometry: boxes are clipped against ancestors, the viewport, higher windows and overlays, visible area is stored as a union of rectangles, and displayed text is separated from accessibility names so an icon's name is not taken for on-screen text. Each click records what happened to every element: appeared, disappeared, moved, text or state changed, newly occluded, revealed.

MeasureDeskForge-1Mphoneshell crawlsSource
Observations / screens1,207,368113 screens, 120 shots2610.02320 App. A; manifest.json x 11
Elements159,723,780 (mean 132.29 per observation)1,922 controls (17.0 per screen)App. A; manifests
Element geometryBox plus visible areaCentre point onlySec. 3; manifest controls keys
Actions recorded917,211 clicks with per-element effects248 taps, 237 edges: from, to, tap or no-opTable 5; manifest edges
Apps19, admitted only if the accessibility tree exposes main content2 (Settings, Talika)App. B.1; manifests
Quality check4.7% of captures rejected; 99.84% of 16,487 elements correct (one reviewer)not measuredApp. B.3, Table 10
Per-action success labelnone, change onlynone, change onlySec. 3.3; manifests
Mobile screens0113 (iPhone, iOS 18.4 and 26.6.1)App. A; manifests

The mobile gain, and who it went to

Four vision-language models were LoRA-tuned (rank 8, one epoch) on 200,000 examples and tested on five external grounding benchmarks; all four improved on all five. Qwen3.5-4B gained 11.51 points on ScreenSpot-Pro (30.17 to 41.68) and 10.11 on OSWorld-G (51.24 to 61.35). The per-domain ScreenSpot-v2 split, in the paper's Table 11, is where phones come in. Qwen's mobile score rose about as much as its web score and less than its desktop score. UI-R1-3B, a model already trained for GUI grounding, gained 0.6 on mobile. Judgement: the transfer is real for a general model with weak GUI grounding and close to nothing for one that already has it.

ScreenSpot-v2 accuracy by domain, before and after DeskForge-1M base + DeskForge-1M 0 20 40 60 80 100 accuracy (%) 77.25 91.62 Qwen desktop 82.44 93.21 Qwen mobile 79.63 86.04 Qwen web 78.14 83.83 UI-R1 desktop 88.42 89.02 UI-R1 mobile 77.35 78.26 UI-R1 web Source: Gurbuz et al., arXiv:2610.02320, Table 11.

The long-horizon test changes only the action model under a fixed Qwen3.6-27B planner, with success decided by each environment's own state checks. On a custom 119-task WebArena-Infinity panel Gemma4-E4B went from 5 to 40 solved, Qwen3.5-4B from 31 to 50, InternVL3.5-8B and UI-R1-3B each gained 7. On the 100-task OpenApps longer-horizon set Qwen went from 3 to 15. The fine-tuning used single grounding examples, not trajectories.

Long-horizon tasks solved with a fixed Qwen3.6-27B planner base action model + DeskForge-1M 0 10 20 30 40 50 60 WebArena-Infinity tasks (of 119) 5 40 Gemma4-E4B 30 37 UI-R1-3B 37 44 InternVL3.5-8B 31 50 Qwen3.5-4B Source: arXiv:2610.02320 Table 4 and Sec. 5; base values from the text.

Why phoneshell's crawl data cannot do this yet

phoneshell's crawl.py walks an app, taps what it judges safe, and writes a manifest.json per run. The 11 manifests on the rig, all from 11 September 2026, hold 113 screens from Settings and Talika. For each control they keep the label, the accessibility type, a key, the centre point and a skip reason. They do not keep width, height or a box, so a model's predicted click cannot be scored as inside or outside the element, which is how ScreenSpot-style benchmarks grade. Each edge records the screen a tap left, the screen it reached and whether it was a tap or a no-op. Nothing records what changed on the screen. The crawler's caution shows in the skips: 54 switches, skipped because a switch changes a setting, and 29 "dictate" controls were never tapped, so state changes are exactly what the data lacks.

One observation, as each pipeline stores it DeskForge-1M (Linux desktop) 19 apps, 7 themes, 7 resolutions 1366 x 768 up to 3840 x 2160 fused: screenshot + a11y tree + window geometry per element: role, name, displayed text, box, visible area as a union of rectangles 132.29 elements per observation (mean) per click: appeared, disappeared, moved, text or state changed, occluded, revealed audit: 59,103 of 1,266,471 captures dropped (4.7%) human check: 99.84% of 16,487 elements correct 1,207,368 observations, 917,211 clicks no per-action success label phoneshell crawl manifests (iPhone) 2 apps: Settings (63 screens), Talika (50) iOS 18.4 and 26.6.1, WDA 16.12.4 stored: shots, structural and textual hash per control: label, type, key, centre x, y, skip reason; no width, height or box 17.0 controls per screen (1,922 / 113) per edge: from screen, to screen, label, kind tap or no-op; no element effects 54 switches and 29 'dictate' controls skipped as state-changing or irreversible 113 screens, 248 taps, 237 edges 11 manifests, 11 September 2026, 1,610 s Sources: arXiv:2610.02320 Sec. 3, 4, App. A, B.3, Table 5, Table 10; phoneshell runtime/crawls/*/manifest.json (read 5 October 2026).

The grounding question matters to phoneshell even though its agent taps element ids. When the accessibility tree is thin, perception/blind.py recovers elements from pixels with OCR and an icon proposer, and those elements are only as good as their boxes. DeskForge's admission rule is a warning for anyone copying its recipe to phones: apps whose trees did not expose content were rejected before collection, so its 99.84% element correctness describes apps chosen for good trees. The apps where a phone agent most needs pixel grounding are the ones that rule removes.

What it means if you collect phone GUI data

Check it yourself

What would prove this wrong

Our reading is that DeskForge's mobile gain is transfer to a weak GUI model, not evidence that desktop data substitutes for phone data. Test: score the released DeskForge-tuned Qwen3.5-4B and its base on phoneshell's 113 crawled iPhone screens, after adding element boxes, on point-in-box accuracy for every labelled control. If the tuned model gains 8 points or more there, desktop data transfers to real iPhone screens as well as it did on ScreenSpot-v2 and our caution is wrong. We expect a gain under 5 points. We will publish the run, or say we did not run it, by 31 March 2027.

Sources

  1. Gurbuz, Nassar, Hong, Pollefeys, Staar, DeskForge: Dense Supervision from Desktop Environments for Computer-Use Agents, arXiv:2610.02320v1, 1 October 2026
  2. DeskForge project page: framework code, DeskForge-1M and fine-tuned model
  3. phoneshell source: crawl.py, perception/blind.py (read 5 October 2026); crawl manifests in runtime/crawls on the rig
  4. Blolabel, earlier note: the render gap between OCR and the accessibility tree