{"slug": "prospero-a-new-coding-harness-for-a-more-civilized-age", "title": "Prospero: A new coding harness for a more civilized age", "summary": "Developer Chris Wellons released Prospero, an open-source coding harness written in C++ with a Dear ImGui docking interface, which he says uses roughly two orders of magnitude fewer resources than other harnesses without sacrificing features. Prospero ships with no built-in model providers, so users must supply their own via llama.cpp, OpenRouter, the Anthropic API or the OpenAI API, and it supports subagents, headless deployment over SSH or WSL, desktop control for vision-capable models, and a Professional Edition embedding x86/x86-64 and ARM64 engines for macOS, Windows and Linux. Wellons argues a coding harness is essentially curl glued to popen() and should not require gigabytes of RAM, and says Prospero's leanness may make it the only harness able to drive a fuzz campaign on a headless system without the Linux OOM killer terminating the harness itself.", "body_md": "nullprogram.com/blog/2026/10/31/\n  \n\nI’ve been [fascinated with local LLMs](https://nullprogram.com/blog/2024/11/10/) for a couple of years now.\nThe better open weight models, including some that inference on regular,\nhigher-end consumer hardware at tolerable speeds, are now reliable enough\nto handle simpler programming tasks. This requires a coding harness, but\nso far this year I’ve been disappointed by all the harness offerings. For\ninexplicable reasons most are built with web stacks, and consume enormous\namounts of memory. At its core a coding harness is essentially curl glued\nto `popen()`. This should not require gigabytes of RAM. So I built my own:\n**[Prospero](https://github.com/skeeto/prospero)**. It’s written in [my C++ style](https://nullprogram.com/blog/2026/10/04/) with a snappy [Dear\nImGui docking interface](https://nullprogram.com/blog/2026/04/07/). It uses around two orders of magnitude\nfewer resources than other harnesses without sacrificing features.\n\nDark mode aficionados are covered, too:\n\nNote that Prospero comes with no model providers built-in. You’re expected\nto supply that yourself, such as with [llama.cpp](https://github.com/ggml-org/llama.cpp), a workplace on-prem\nmodel, OpenRouter, Anthropic API, OpenAI API, etc. (You can’t use your\nClaude subscription.)\n\nFor those unfamiliar with coding harnesses: In a chat interface you and\nthe AI take turns writing messages to each other. A coding harness extends\nthis concept, allowing an AI to “talk” to tools offered by the harness.\nTools “reply” with their outputs. A tool might read or write a file, or\nrun a shell command. An AI will go from tool call to tool call on its own,\nlooping on the results. Such an AI is called an *agent*. Occasionally the\nAI will send you a message to inform you of progress or to ask a question,\nand the chat interface is still there.\n\nSome harnesses, including Prospero, allow agents to spawn *subagents* to\ndo their bidding, to work in parallel or keep their *context* clean. That\nis, to not fill their working memory with subtasks. Agents can message one\nanother and coordinate on tasks. Given SSH access to another machine, or\nover plain WSL, Prospero can deploy a headless copy of itself to other\nhosts so that agents can operate on those systems. The [Professional\nEdition](https://skeeto.itch.io/prospero) embeds engines for combinations of x86/x86-64 and ARM64 on\nmacOS, Windows, and Linux. The Windows x86 engine even works on Windows\nXP, and can play solitaire and minesweeper if you ask.\n\nThe last is because Prospero is one of the few harnesses with *desktop\ncontrol* capabilities. If your model supports vision — any any model worth\nusing does — then it can “see” your desktop and interact with it. It can\nclick, type, and drag to test and debug GUI applications live without a\nspecialized, per-app [MCP assist](https://nullprogram.com/blog/2026/09/17/).\n\nThis headless engine is why no TUI is necessary. The harness engine runs\non the headless system, and the UI runs on your desktop or laptop. With a\nlittle extra setup, the harness to run fully independently of the GUI, so\nthat it will continue without the GUI system attached — re-attachable\nlater.\n\nBecause Prospero is so lean, it may be the only harness that can drive a\n[fuzz campaign](https://nullprogram.com/blog/2025/02/05/), particularly on a headless system, without the\nLinux OOM killer targeting *the memory-gobbling harness* rather than the\nout-of-control fuzz target that triggered it. So many times I’ve checked\nback in on a fuzz campaign hours later, to find nothing was accomplished\nbecause the harness process is gone.\n\n(Why have an agent run a fuzz campaign? Because it can fix discovered bugs\non the fly and keep the campaign going! It’s a no brainer.)\n\n### Configuration\n\nThe configuration lives at `~/.config/prospero/prospero.ini`. Easy to\nedit. No JSON, thank goodness. Check it into source control, copy-paste\nit. All the usual benefits. Alternatively, the Settings page can reach\nevery setting from the GUI, so you don’t have to edit the INI by hand. INI\nfiles can also include each other, not just naming file system paths but\nURLs:\n\n```\ninclude = https://example.com/prospero.ini\n```\n\nThe idea is to allow a live shared or managed configuration. Includes by\nURL are restricted in what they can set, with a hard rule against anything\nwhich might appear in shell command. Some trust is still required, as a\nconfiguration can extract an environment variable by using it as an API\nkey and supplying an endpoint it controls.\n\nProspero fetches a model list and other parameters like context size from\nthe endpoint, but you might want to tweak it. A typical configuration may\nlook like:\n\n```\nmodel = falstaff/Qwen3.8-27B\n\n[endpoint falstaff]\nurl = http://falstaff.local/\nkey = env:FALSTAFF_API_KEY\n\n[model Qwen3.8-27B]\nedit_format = replace\ntemplate.reasoning_effort = medium\n\n[model Qwen3.8-27B-xhigh]\nlike = Qwen3.8-27B\ntemplate.reasoning_effort = xhigh\n\n[web]\nsearch = searxng\nurl = https://search.example.com/\nkey = env:EXAMPLE_API_KEY\n```\n\n### Passive rendering\n\nThe ImGui paradigm typically uses *active rendering*, redrawing on vsync\nlike a video game. This is appropriate in some contexts, like interfaces\nwithin video games. Less so for mostly-static text-oriented UIs, such as a\ncoding harness. Instead Prospero uses *passive rendering* with *settle\nframes* to finish animations before going idle. When there’s nothing to\ndo, Prospero does nothing. It won’t chew on the GPU while the agent is\nwaiting on a build.\n\n### Never wait forever\n\nAn annoyance with most other harnesses is how easily they get stuck. I set\na long-running task, go to sleep, and in the morning find the harness hung\non a trivial issue two hours into the night, wasting the rest. Therefore\nProspero prime design principle: *Never wait forever*. **Every operation\nhas a deadline.** This decision influences everything. If you’re not there\nto grant a requested permission, the agent will get a denial by timeout\nand must do without. To assist, Prospero will raise a system toast when an\nagent requires your attention so that you’re less likely to miss it if\nyou’re attending.\n\nThe harness itself *plows through intermittent errors*, trying its best to\ndrive the agent to complete its task. All network requests have timeouts,\nand watchdogs prevent [endless waiting](https://nullprogram.com/blog/2019/03/22/). Agent mailboxes [are\nbounded](https://lucumr.pocoo.org/2020/1/1/async-pressure/).\n\nShell commands that hit their timeout convert to asynchronous background\ncommands. The agent can continue to wait on them, with a timeout, and so\nwill be woken at regular intervals to decide if it should continue.\n\nThe one exception is Plan mode, where it waits indefinitely after offering\na plan or requesting clarification (`ask_user` tool). It’s expected that a\nuser is attending to the agent during Plan mode.\n\n### No stray processes\n\nThe harnesses I’ve used have improved, but another regular annoyance\nearlier this year was agents starting processes that never get cleaned up.\nAn agent kicks off a parallel build, hits a timeout because it was too\noptimistic, the build “stops” by killing a piece of the build system. But\nactually *the build continues anyway*, at least in part. The agent tries\nagain, and now two builds are going, interfering with each other, making a\nmess and bringing my system to its knees.\n\nFor awhile I was wary of letting agents run builds in certain harnesses,\nwhich is a terrible outcome. *You want agents to close the loop* and\niterate independently. A human in the loop is like putting a ball and\nchain on the agent, giving up most of its advantages.\n\nProspero promoting a synchronous timeout to an asynchronous task is a huge\nimprovement on its own, but there’s an additional principle at play: The\nwhole process tree lives and dies together. When a command is stopped, *it\nstops*. This is [trivial on Windows](https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects), though few harnesses seem to\ntake advantage of it. It’s more difficult on macOS and Linux, but Prospero\nfollows through.\n\n### Built-in self-help\n\nLike every harness, Prospero supports *skills*, a pre-packaged set of\ninstructions on how to accomplish some task (“I know kung fu.”). Prospero\ncontains a skill on itself and can read its built-in documentation. Ask\nthe agent how to do or configure something in Prospero, and the agent can\nonly answers your question, it can provide a hyperlink taking you to the\nrelevant place in the UI. It can also edit your `prospero.ini` and reload\nit, to configure things on your behalf. This is not unique to Prospero,\nbut I’m not aware of any harness doing this nearly as well.\n\n### Choose your shell\n\nOn Windows, Prospero is designed to work well with [w64devkit](https://github.com/skeeto/w64devkit), and will\nprefer its shell if available. Models designed for coding know w64devkit\nout-of-the-box, so these tools are complementary. Of course you’re not\nlocked into that shell, and you can freely choose a different default\nshell. But Prospero is a rare harness where you can change shells mid\nsession. Sometimes PowerShell is more suited to the task, so you can pick\nit out of the dropdown. The agent is informed of the change, and told\nabout known quirks (i.e. “this is an old Bash!”). On macOS you can switch\nbetween bash and zsh.\n\n### The usual features\n\nProspero has the usual sorts of features you can expect from an advanced\nshell. It can use Git worktrees, including subagent worktrees, so that\nagents can share a repository. It speaks the Model Context Protocol (MCP).\nIt can search the web (if you allow). You can start side chats that share\ncontext, realized as subagents. You can fork sessions.\n\nFor now there is no built-in terminal or editor. Instead Prospero will\nopen an external terminal or editor of your choosing. I’d rather use Vim\nthan a built-in notepad.exe-equivalent. With Ctrl+G you can edit your\nprompt in an external editor.\n\nLike all harnesses, the permissions system will not stop a malicious\nagent. Agents are writing and running programs on your computer, and so\ncan ultimately access everything the harness can access. Permissions are\nabout gently reminding the agent of your wishes, and catching simple\nmistakes. More like, “Whoa there, stay within the project” or, “Do not\ncontrol my desktop at this time.” If you want to lock an agent out, you\nhave to restrict the harness itself, putting it in a container or on a\nRaspberry Pi, at the usual cost of inconvenience or cutting off useful\nresources.\n\nI’m really excited about Prospero, and **I honestly feel it’s one of the\nbest coding harnesses available**. It’s how such tools ought to be built,\nbut until now nobody else stepped up to do it. It would take a video to do\nit justice, and maybe I’ll do that sometime, but that’s currently outside\nmy experience.\n\nMost of the audience for my projects are hobbyists, even w64devkit. But if\nProspero goes beyond me and my little circle, I expect most users would be\nprofessionals building commercial products. I’ve also invested more than\njust my time into this project — already true for w64devkit, even more\ntrue with Prospero. So while it’s an open source project, I’ve split it\ninto two tiers:\n\n- \nCommunity Edition: the build you find on GitHub at no cost. It has no\nbuilt-in headless engines, so remote deployments are limited. Plus a\nlittle nag text to remind you you’re on the Community Edition. Suited\nfor hobbyists.\n- \n[Professional Edition](https://skeeto.itch.io/prospero) : Pay a nominal fee, get a DRM-free download\nwith free updates. All the headless engines are built in so you can push\nremote deployments and remote sessions on other systems at the press of\na button. A serious feature for professionals.\n\nWindows and macOS builds are code-signed in both cases (some of the cost).\nIf Prospero is useful for you professionally, even without the remote\ndeployment feature, you’re still encouraged to buy a copy to support my\nongoing costs!", "url": "https://wpnews.pro/news/prospero-a-new-coding-harness-for-a-more-civilized-age", "canonical_source": "https://nullprogram.com/blog/2026/10/31/", "published_at": "2026-10-31 11:54:59+00:00", "updated_at": "2026-10-31 12:18:42.944318+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "large-language-models", "artificial-intelligence"], "entities": ["Prospero", "Chris Wellons", "llama.cpp", "OpenRouter", "Anthropic", "OpenAI", "Dear ImGui", "GitHub"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/prospero-a-new-coding-harness-for-a-more-civilized-age", "markdown": "https://wpnews.pro/news/prospero-a-new-coding-harness-for-a-more-civilized-age.md", "text": "https://wpnews.pro/news/prospero-a-new-coding-harness-for-a-more-civilized-age.txt", "jsonld": "https://wpnews.pro/news/prospero-a-new-coding-harness-for-a-more-civilized-age.jsonld"}}