GlowHarness

An agent harness we built from scratch: the loop that lets an AI use tools, the reader that repairs its broken tool calls, the gate that asks before anything changes, and a trace of every step. It runs in this page, and it even works with no AI model at all.

Give it a task

Brain

Its tools, and what each may do

These are the only things it can do. Reading is allowed. Anything that saves, deletes or downloads asks you first, and you can switch any tool off.

What it remembers

The notebook is its only memory. It is saved in this browser, on this device, and nowhere else.

Nothing saved yet. Try β€œRemember that my locker code is …”.

The numbers, measured

Nothing here is an estimate. Every figure is read from the benchmark file our scripts wrote, and the button at the bottom of this page reruns the engine's checks in your own browser.

The same tasks, with and without the harness

How this was measured, and what it does not show

    Where it wins, where it loses

    GlowHarness is not a rival to Claude Code, Codex or OpenCode at real work. Those drive your computer with the best models there are. This one goes after what they skip: nothing to install, no account, every step visible, and useful with no model at all.

    GlowHarness Claude CodeAnthropic Codex CLIOpenAI OpenCodeopen source
    Real work on your computer None. It cannot touch files, run programs or browse the web. Edits files and runs shell commands Edits files and runs shell commands Edits files and runs shell commands
    The model behind it Small free models: rationed, slow at times and often wrong Anthropic's best models OpenAI's best models Whichever model you connect
    Adding your own tools Only by editing the code Yes, through MCP servers Yes, through MCP servers Yes, through MCP servers
    Before the first task Open this page Install it, then sign in with a paid Claude plan or an API key Install it, then sign in with a ChatGPT account or an API key Install it. Free models are included, or bring your own keys
    Works with no AI model Yes, for plain requests about sums, dates, units, text and notes No No No
    Where it runs A browser tab, phones included Terminal, code editors, desktop app and web Terminal, code editors and desktop app Terminal, desktop app and web
    Before a risky action Asks. After reading untrusted text it asks again, even for tools you set to always allow Permission modes, and an optional sandbox for shell commands A sandbox from the operating system, with approval policies Allow, ask or deny rules for each tool
    Source code Open. Plain JavaScript, no dependencies Proprietary Open source Open source

    Sources for the other columns, found through a web search on …: Claude Code overview, Claude Code setup, Codex CLI docs, Codex repository, OpenCode docs. We did not benchmark those tools ourselves, so no number is claimed for them.

    What it can't do

    Built from scratch

    1. The loop: ask the brain for one step, read it, run a tool, show the result, repeat. It stops at a step limit, a time limit, a repeated call, or when you press Stop.
    2. The reader: small models write tool calls badly. The reader repairs the common ways they break. When it cannot, it tells the model exactly what was wrong and asks again.
    3. The gate: reading is allowed, while saving, deleting and downloading ask first. Once a run has read untrusted text, every such action asks again. With nobody there to ask, the answer is no.
    4. The trace: every step is recorded with its time. Replay runs the engine again on the recording and checks that it makes the same decisions.

    Use it in another Glow app

    The engine and the tool kit are two plain script files with no dependencies. Any Glow page can load them, give the harness a brain, some tools and a way to ask the user, and run a task.

    <script src="../shared/glow-harness.js"></script>
    <script src="../shared/glow-harness-kit.js"></script>
    
    const harness = GlowHarness.createHarness({
      brain: GlowHarnessKit.rulesBrain(),
      tools: GlowHarnessKit.createTools({ storage: localStorage }),
      confirm: async (request) => "deny",
      onEvent: (event) => console.log(event.type, event),
    });
    const result = await harness.run("Convert 26.2 miles to km.");
    console.log(result.status, result.answer, result.trace);