From b848956a7ffa4d8b59e6a20d6210fd2af87b32f0 Mon Sep 17 00:00:00 2001 From: Maxim Averyanov Date: Thu, 27 Aug 2026 16:31:13 +0200 Subject: [PATCH] The landing page described a program that could only load one picture It said the thing turns a photograph into strokes and draws it, which was the whole story once and is now the first paragraph of it. There is a section now for what the program actually does: the live view of the phone, placing the drawing by hand, layers, the eraser, recordings that replay on a different phone, and shapes and text from the command line with no picture at all. Each tile says the measured thing rather than the impressive one - three frames a second and 27 kB, not "fast" - because every other number on that page is measured and it would be a poor place to start guessing. Co-Authored-By: Claude Opus 5 --- docs/index.html | 53 ++++++++++++++++++++++++++++++++++++++++++++-- tools/make_play.py | 53 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 102 insertions(+), 4 deletions(-) diff --git a/docs/index.html b/docs/index.html index 82290da..fe33898 100644 --- a/docs/index.html +++ b/docs/index.html @@ -57,6 +57,11 @@ h2 { font-size: 26px; margin: 54px 0 6px; letter-spacing: -.01em; } .sub { color: var(--dim); margin: 0 0 20px; max-width: 70ch; } +.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 14px; } +.tile { background: var(--panel); border: 1px solid var(--line); border-radius: 14px; padding: 18px 20px; } +.tile h3 { margin: 0 0 8px; font-size: 17px; letter-spacing: -.01em; } +.tile p { margin: 0; color: var(--dim); font-size: 14.5px; } + .picker { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 16px; } .pick { padding: 7px 14px; border-radius: 8px; border: 1px solid var(--line); @@ -95,8 +100,9 @@

MThread Draw

It turns an ordinary photograph into touch strokes and draws it on an - Android phone, over ADB, with nothing installed on the device. A drawing of - five hundred points lands in about two seconds.

+ Android phone, over ADB, with nothing installed on the device. You watch the + phone's screen while you place the drawing on it, and a drawing of five hundred + points lands in about a second and a half.

Download Source on GitHub @@ -124,6 +130,49 @@

Trace it yourself

+

What it does

+

Everything below is in the released build, and every claim on this page was +measured rather than estimated.

+ +
+
+

It shows you the phone

+

The screen, live, in its own shape, with the drawing lying over exactly where + it will land. About three frames a second: the phone scales and compresses each + one, so the cable carries 27 kB instead of a sixteen-megabyte framebuffer.

+
+
+

Put it where you want it

+

Drag it over the live view, wheel to resize, Shift and wheel to turn, and + flip it either way. Held in fractions of the screen, so it survives the phone + being turned and means the same thing on a different device.

+
+
+

Layers

+

Several pictures arranged against each other before anything is drawn, each + with its own position and its own tracer settings. Hide one, reorder them, + remove one.

+
+
+

An eraser

+

Drag across the strokes you do not want and they come out. Which ones count + as under the cursor is decided after placement, because the cursor is over a + picture of the phone rather than over a coordinate space.

+
+
+

Record and replay

+

Record what you do on the phone and play it back, on that phone or another + one. The file holds each touch as a fraction of the screen, so replaying it + elsewhere scales it to that screen rather than refusing.

+
+
+

Or draw with no picture at all

+

mthread shape heart, mthread shape star --points 7, + mthread text "hello". Seven shapes from equations, and text in any + font the machine has.

+
+
+

Why it is quick

Every touch on Android normally costs a process. Sending a thousand of them that way takes minutes, which is why anything continuous - a gesture, a line, a diff --git a/tools/make_play.py b/tools/make_play.py index 557a51b..87c5eb9 100644 --- a/tools/make_play.py +++ b/tools/make_play.py @@ -126,6 +126,11 @@ def trace_all() -> dict: h2 { font-size: 26px; margin: 54px 0 6px; letter-spacing: -.01em; } .sub { color: var(--dim); margin: 0 0 20px; max-width: 70ch; } +.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 14px; } +.tile { background: var(--panel); border: 1px solid var(--line); border-radius: 14px; padding: 18px 20px; } +.tile h3 { margin: 0 0 8px; font-size: 17px; letter-spacing: -.01em; } +.tile p { margin: 0; color: var(--dim); font-size: 14.5px; } + .picker { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 16px; } .pick { padding: 7px 14px; border-radius: 8px; border: 1px solid var(--line); @@ -164,8 +169,9 @@ def trace_all() -> dict:

MThread Draw

It turns an ordinary photograph into touch strokes and draws it on an - Android phone, over ADB, with nothing installed on the device. A drawing of - five hundred points lands in about two seconds.

+ Android phone, over ADB, with nothing installed on the device. You watch the + phone's screen while you place the drawing on it, and a drawing of five hundred + points lands in about a second and a half.

Download Source on GitHub @@ -193,6 +199,49 @@ def trace_all() -> dict:
+

What it does

+

Everything below is in the released build, and every claim on this page was +measured rather than estimated.

+ +
+
+

It shows you the phone

+

The screen, live, in its own shape, with the drawing lying over exactly where + it will land. About three frames a second: the phone scales and compresses each + one, so the cable carries 27 kB instead of a sixteen-megabyte framebuffer.

+
+
+

Put it where you want it

+

Drag it over the live view, wheel to resize, Shift and wheel to turn, and + flip it either way. Held in fractions of the screen, so it survives the phone + being turned and means the same thing on a different device.

+
+
+

Layers

+

Several pictures arranged against each other before anything is drawn, each + with its own position and its own tracer settings. Hide one, reorder them, + remove one.

+
+
+

An eraser

+

Drag across the strokes you do not want and they come out. Which ones count + as under the cursor is decided after placement, because the cursor is over a + picture of the phone rather than over a coordinate space.

+
+
+

Record and replay

+

Record what you do on the phone and play it back, on that phone or another + one. The file holds each touch as a fraction of the screen, so replaying it + elsewhere scales it to that screen rather than refusing.

+
+
+

Or draw with no picture at all

+

mthread shape heart, mthread shape star --points 7, + mthread text "hello". Seven shapes from equations, and text in any + font the machine has.

+
+
+

Why it is quick

Every touch on Android normally costs a process. Sending a thousand of them that way takes minutes, which is why anything continuous - a gesture, a line, a