Skip to content

Releases: agentsco-lab/item

System image: item 0.2.1 on port 0.22.0 (item-duo1-20261010)

Choose a tag to compare

The system image for a Surface Duo 1: Droidian 102, the port 0.22.0 and item 0.2.1, ready to be put on the phone's userdata. Built 2026-10-10 from the pinned Droidian nightly (rootfs api30 arm64, phosh phone, 2026-09-29) with the port's adaptation, its sensorfw with the hinge sensor, and item set as the shell. The first start grows it to fill userdata; the PIN is 1234 until item's first start sets one.

Files

rootfs.img.zst the image, 1.22 GB compressed (zstd, window log 27), 5.2 GB unpacked
boot.img the port's kernel the phones run (boot-duo1-droidian-perf-127-lid)
vbmeta.img with verification off, written beside the boot image
surfaceduo1-twrp.img the recovery that is RAM-booted, never flashed
manifest.json names, sizes and sha256 of all of the above
packages.txt every package in the image, with its version
SHA256SUMS the checksums

How it goes on

With item/grid: put the folder with these files in ~/.local/share/itemgrid/releases/item-duo1-20261010-port0.22.0/ and item/grid offers install for a Duo on stock Android (USB debugging on) or in its bootloader, and reinstall for one on Linux. It checks the image against the manifest, RAM-boots the recovery, puts the image on, RAM-boots the kernel and writes it to the slots only once it booted on that phone. About 15 minutes on the cable.

By hand, see the port's guide and SAFETY.md: the recovery and the kernel are RAM-booted with fastboot boot, the rootfs goes to userdata from the recovery, and nothing is flashed with fastboot flash but the misc brake.

Until 1.0, item is an experiment. This image is the one its owner's phone runs; nothing here is promised to work on yours. Installing it erases Android on the phone, and the bootloader has to be unlocked.

item 0.2.1 - a compositor of its own

Choose a tag to compare

@iverbovoy iverbovoy released this 09 Oct 06:49

A minute of 0.2.1, both panels at 60 fps with the gap between them: the first setup (the PIN, a finger), the tour, the shade, the system screen, the pen's sheet.

item-0.2.1-first-setup.mp4

item is a compositor of its own now. item-shell 0.1 was the two-panel shell as 36 patches on the port's phoc and phosh. item 0.2 is item-compositor: a Wayland compositor in Rust on smithay, drawing straight into the phone's hwcomposer, with the whole shell drawn inside it in the same pass as the windows. It takes phosh's place on the phone; phosh stays as the way back (sudo item-switch phosh).

Until 1.0, item is an experiment. It is used on one phone, daily, since 2026-10-03, but nothing is promised to work on yours: a release can break the lock screen, the modem's sleep or the way back to phosh. Keep the port's backups, install with a computer by the phone on the USB cable. What is in 0.2.1 is the groundwork - the compositor, its frame path, the gestures and the phone's sleep. Every app and every menu will be reworked; they are there to make the phone usable meanwhile.

Measured against item 0.1 on phosh

The same phone, timed below both compositors with a uprobe on libhybris' hwc2_compat_display_present (compositor/log/2026-10-01-step-21-ab.md, -22-canvas.md, -23-paces.md):

item 0.1 on phosh item-compositor
a tap, touch to the present with the app's new frame 17.6 ms (p90 24.4) 6.2 ms (p90 7.9)
the shade pulled back up 6 gaps over 25 ms each time, up to 54 ms 0-1, up to 29 ms
the app grid going down a 235-243 ms freeze each time up to 34 ms
an animating app, its commit to the screen not measurable one vsync, 15.8 ms
the shell at rest: memory (PSS) 461 MB 173 MB
the shell at rest: CPU 3.5 % of a core 2.6 %

A frame of the shell renders in 1-1.5 ms; the shade follows the finger 22-26 ms behind it (about 39 through GTK); 60 fps with both panels animating, no CPU copy of a frame (the Lindroid chain, the other way onto this kernel, spends 9-13 ms and 0.76 W a frame on the copy and holds 30 fps). A settings page opens in a tenth of a second where it took over one. CV ID takes about 135 ms a frame. A phone shut, Wi-Fi radio on and mobile data off, loses about 1.3 % an hour (0.16 W) with the port 0.22.0.

What is in 0.2.1

The desktop and the dock

  • The dock's halves are drops of water: they follow a finger, slosh along as the phone folds like a book and come to rest with a wobble, cross the hinge to the free panel and join, leave a wet streak that dries. Running apps in the dock; apps carried onto it, along it and off it as drops.
  • A window takes its panel; carried across the hinge it takes both. A swipe up from the panel's bottom edge puts it away, following the finger; a tap in the dock brings it back. The launch curtain answers a tap in the next frame.
  • The desktop clock on the free panel; the system screen left of the left panel (greeting, battery with its 24 h graph, the calendar's next event); the pen's sheet right of the right one: strokes as a Catmull-Rom spline through the pen's own samples with its pressure, the other end erases, four inks, undo and redo, save as PNG.
  • The desktop is Aurora, drawn by the compositor; the accent colour from it or one of seven, and everything in the shell drawn in it. Folding the locked phone back past flat turns the left panel to glass: a wave of water out from the hinge.

The shades

  • Glass over the screen, live from what is under it: a status line, brightness, volume, six quick settings, the player and night light on the left; the open windows and the notifications on the right. The volume bar beside the keys, dragged with a finger.

Locking and unlocking

  • The lock screen over the darkened wallpaper: the clock, the player, the last notifications; the PIN pad's keys as drops gathering back when put away; the unlock as a wave from where it was touched.
  • The fingerprint reader armed while the lock screen is lit; the mark at the reader under the power key glows in the accent for a known finger, red for an unknown one.
  • CV ID: a known face unlocks the phone as it is opened - "Unlocked · swipe up". item-face runs as a service, holds the camera, the models (YuNet, SFace, MiniFASNetV2 for liveness) and the faces enrolled, in /var/lib/item-face, root's alone. The camera is started at the lid itself, ahead of the panels lighting, held open only while the lock screen is lit, and kept warm 30 s after it goes dark; shut all night it no longer keeps the phone from deep sleep.
  • gnome-keyring's prompts wait while locked and are answered by the PIN that unlocked; polkit's and NetworkManager's dialogs are the compositor's own.

The first setup and the tour

  • After a clean install: a welcome, a new PIN set when it is Droidian's 1234 (the keyring's password with it), a finger enrolled - it unlocks at once - a face, then a tour; the first app on a panel brings a hint once.

The phone's sleep

  • item puts the phone to sleep and wakes it. The lid darkens and lights the screen; the power key shows or hides the keyboard, its long press is the power menu. Asleep again 3 s after a wake that lit nothing (was 15 s). Woken for Clocks' next alarm and a snoozed one; an alarm or a call ringing keeps the screen lit, nothing lights it under a shut lid. The lid opened on the way into sleep wakes the phone. The session's IdleHint follows the dark screen, so ofono quiets the modem.

item Settings

  • In Rust (GTK4, libadwaita), in the package: one window across both panels, the sections on the left, one page on the right - About, Date & time, Battery, the shell's pages; the pages of GNOME Settings and Mobile Settings that apply to this phone opened in place.

Under the hood

  • Frames paced by hwcomposer's vsync, drawn only on change, a client's frame one vsync after its commit; the GPU's clock raised on touch and while the shell moves; a kernel wakelock while the screen is lit; apps in systemd scopes; wp_presentation; a live mirror of the screen on $XDG_RUNTIME_DIR/item-mirror.sock for item/grid.
  • One Debian package, cross-built on the computer (compositor/tools/package-deb.sh): item.service for Droidian's user, item-fallback.service to phosh, a release's version bare, a build after it 0.2.1~git<time>.<hash>.

Installing

item 0.2.1 needs the port 0.22.0 or later on Droidian 102 (agentsco-lab/surfaceduo-droidian).

sudo apt install ./item_0.2.1_arm64.deb
sudo item-switch item

The first start runs the setup. Back to phosh: sudo item-switch phosh. A phone that had item from tools/install-phone.sh moves to the package cleanly.

Not in this release, and known

  • Wallpaper pictures: the picker for one's own pictures is in the code but no set ships yet; the desktop is Aurora.
  • Every app and menu is provisional and will be reworked; some of Settings' pages (networks and passwords among them) open the system's page.
  • Before the setup has run, and with a picture that cannot be read, the screen is black.
  • Tried on one phone; each step measured and tried by hand, no test suite beyond that.

item-shell 0.1.0

Choose a tag to compare

@iverbovoy iverbovoy released this 29 Sep 22:35

The two-panel shell as a package of its own. item-shell goes on top of the port (iverbovoy/surfaceduo-droidian 0.21.0 or later, Droidian 102): a dock across both panels that launches onto the panel you touch and tiles windows there, a shade per half with its own job, the system screen and the pen's sheet at the outer edges, Settings in one column, and the motion that goes with them. It carries its own builds of phoc, phosh and the keyboard, and the port's scripts put them in place; removing it gives Droidian's shell back.

sudo apt install ./item-shell_0.1.0_arm64.deb, then sudo systemctl restart phosh.