Smalltalk as a wire format: agents sending Morphic UIs as source, run on a Dart/WasmGC interpreter
Hi all, James Ladd here. Some of you may remember me from Redline Smalltalk, a Smalltalk for the JVM, years back. I've been away from the community for a while, but Smalltalk has crept back into what I'm building, and I'd like to share it with people who'll understand why that makes me happy. I've been building Taskriz, a way for AI agents to ask people things: approve an invoice, pick a delivery date, send a photo. Instead of sending text, the agent sends Smalltalk source that builds a small UI. The source arrives on the person's phone or computer, gets evaluated in a sandbox, and a button sends the answer back. For example: | colour | colour := SegmentedControlMorph new label: 'Colour'; segments: #('Red' 'Green' 'Blue'); selected: 'Green'. ScreenMorph new title: 'Favourite Colour'; addMorph: (ListMorph new style: #insetGrouped; addMorph: colour; yourself); ... The Morphs are modelled on Pharo's Morphic, which will be obvious from the addMorph:s and yourselfs. The big difference is that they don't draw themselves. The morph tree is turned into a UI description, and each platform renders it natively: in a browser, in a terminal, and in iPhone and Android apps. The set of Morphs follows Apple's UIKit (a Morph per control) rather than Pharo's, so that the result feels native on a phone. To be clear about what it isn't: there's no image, no IDE and no bytecode. It's a small interpreter written in Dart and compiled to WebAssembly (WasmGC). It reads source into message sends and interprets them, and most of the kernel is written in Smalltalk. It's a long way from Pharo, but it's been a joy to see an AI agent write cascades. Things I'd genuinely like this list's opinion on: - The Morph API. I've stuck close to Pharo's Morphic idioms so that it feels familiar. Would Spec's style have been a better model for UIs described once and rendered in many places? - Liveness. Dropping "everything is live and draws itself" was the price of native rendering. Has anyone here tried something similar, such as Morphic as a description that gets rendered elsewhere, and what did you miss? - Pharo as the agent. The agent side is a plain JSON API, so a Pharo image could send requests and get answers back with Zinc. If anyone fancies trying that, I'd love to hear how it goes, and I'll help. If you want to look closer, the developer docs and more examples are at https://www.taskriz.com/developers/ and every Morph is live at https://www.taskriz.com/morphcatalog/ Thanks for reading. It's good to be back among Smalltalkers. - James
participants (1)
-
James Ladd