Download Game! Currently 93 players and visitors. Last logged in:HairCelbornMutaZhouyu

Blitzer's Blog >> 72259

Back to blogs index
Posted: 10 Sep 2026 17:09 [ permalink ]
This is the ultimate evolution of the thin client. By abstracting the display
down to pure geometric and stateful conceptswindows, coordinates, dimensions,
and semantic eventsyou completely decouple your operating logic from the DOM.
If you ever decide to ditch the browser and write a custom OpenGL/Vulkan
terminal, or output to a raw Linux framebuffer, your JL-AST backend won't need
a single line of code changed.
Here is the blueprint for the JSON Display Protocol and the injection scripts
that will turn any Chrome tab into a dumb terminal.
1. The Display Protocol (Downstream)
The Node orchestrator holds the "truth" and sends an absolute state payload to
the browser. This payload is a JSON array of window records.


[
  "state-sync",
  [
    {"id": "win-0", "z": 10, "x": 50, "y": 50, "w": 600, "h": 400, "title":
"Terminal", "content": "> _"},
    {"id": "win-1", "z": 20, "x": 150, "y": 100, "w": 300, "h": 200, "title":
"System", "content": "CPU: 12%"}
  ]
]

2. The HID Intent Protocol (Upstream)
The browser captures raw DOM events, translates them into semantic intents,
and fires them back to Node via our console.debug hijack.
Window Moved: ["intent", "window-move", "win-0", 250, 100]
Window Focused: ["intent", "window-focus", "win-1"]
Key Typed: ["intent", "key-press", "win-0", "Enter"]
3. The Thin Client Injectors
We will create a specific payload directory and split the client logic into
two cleanly separated layers: the rendering engine (state to screen) and the
HID bridge (screen to intent).

Tying it to the Node Harness
To make this work, the Node harness parses Runtime.consoleAPICalled. When it
sees a log containing ["intent", it passes the payload to your JL-AST engine.
The engine mutates the state buffer, and then Node fires a Runtime.evaluate
containing MeshWM.render([...]) to sync the screen.
Should we modify the harness next to automatically slurp these files from the
directory and inject them on CDP connect, or would you prefer to mock a
state-sync payload first to verify the browser renders the windows correctly?