**SimpleTalk** is a HyperCard inspired authoring environment for the browser, built by Dan Krasner and Eric Gade — and living proof that an xTalk parses on Ohm. A 386 line Ohm grammar, a tree walking interpreter, and a message passing part hierarchy, all in vanilla JavaScript with custom elements. Apache licensed, dormant since 2023, and unusually well shaped for agentic work.
# The shape About 17,000 lines of hand written source and 11,000 lines of tests across 51 test files. Four files are the system — the grammar at 13 KB, the interpreter semantics at 48 KB, System.js at 47 KB, Part.js at 27 KB — and together they fit in a single agent context window. The 72 MB repo weight is a red herring: images and serialized snapshot worlds, data not code. The one load bearing runtime dependency is `ohm-js`. No framework anywhere.
# What the grammar shows A coherent HyperTalk flavoured PEG: `on` and `end` handlers, a forty message system vocabulary, `tell ... to`, rich object specifiers with nested `of` chains, and keyword guarding by negative lookahead:
Command (a command statement) = "go to" ObjectSpecifier --goToByObjectSpecifier | "put" Expression "into" "global"? variableName --putVariable | "tell" ObjectSpecifier "to" Command --tellCommand | messageName CommandArgumentList? --arbitraryCommand messageName = ~(keyword " " | keyword end) letter+ keyword = "do" | "next" | "else" | "on" | "end" | "pass" | "exit" | "repeat" | "function" | "return" | "global" | "send" | "if" | "then" | "true" | "false" | numericalKeyword
That guard is the strict by construction compromise every generated parser makes with the xTalk tradition — see Double Parse. Notably absent: classic text chunk expressions. There is no `word 3 of line 2 of` in SimpleTalk; ordinals apply to parts, not text. Anyone extending toward full HyperTalk adds chunking themselves.
# The part hierarchy System.js is a singleton message router; Part.js gives every object `receiveMessage`, `delegateMessage` and `sendMessage`, walking the owner chain — button to card to stack to world — which is HyperTalk's message path rendered in modern JavaScript. Views are custom elements subscribing to model changes. The language core touches the part interface, never the DOM.
# Licence and life Apache 2.0 — a LICENSE file at root, though `package.json` still says ISC; resolve that mismatch, ideally with a line from Krasner, before shipping derived code. Born in the UnitedLex computing lab; 96 percent of its 929 commits are Krasner and Gade. Last mainline commit May 2023. Dormant, not locked: no archive flag, forty open issues, and the self hosting docs still run at simpletalk.systems.
# Evolving it with agents > Mine it, rather than adopt it.
The grammar and its fourteen test files are the crown jewels — immediately reusable under Apache, and the tests double as an executable spec. The semantics file is the template for mapping an Ohm parse to an interpreter, and the delegation model is the second best idea in the repo.
Wholesale adoption drags 2023 vintage dependencies — Node 14, native canvas, deprecated uuid — plus a Firefox only runtime and a UI research agenda that is not ours: wiki is our authoring surface. At thirty thousand lines with strong tests, a full agentic refactor is entirely feasible if the whole environment is ever wanted; for WikiScript, lift the grammar idioms and the message path, and let the stage dialect of Three Livecode Doors carry them.
# Links
- SimpleTalk on GitHub
- The grammar
- simpletalk.systems
— the self hosting docs
- Authorship Environments
— Eric Gade, Strange Loop 2021
# See - Ohm and Double Parse - HyperTalk and Three Livecode Doors - WikiScript and Agentic Sustainability