OpenProgram is a free, open source automation project written in Python and released under AGPL-3.0. It has 520 GitHub stars, 63 forks and 1 open issues, and was last pushed 2 months ago. On this registry it ranks #59 of 66 tracked projects in Automation, with 5 head-to-head comparisons available.

What is OpenProgram?

OpenProgram is a self-programming AI assistant for Python developers and automation teams that captures, automates, and refines workflows by interleaving deterministic Python code with LLM judgement.

What it is

OpenProgram is an open-source Python agent runtime, released under AGPL-3.0, that lives in the LLM agent ecosystem and implements what its authors call Agentic Programming. The design premise, stated in the README beneath a Stravinsky epigraph, is that an LLM is flexible and code is deterministic. Let the model run everything and the result is chaos: unpredictable execution, context explosion, and no output guarantees. Hard-code everything and the intelligence is lost. A harness balances the two, interleaved moment to moment: Python for the flow you want fixed, the LLM for the judgement you cannot script.

The concrete thing it replaces is the binary choice between brittle hand-written automation scripts and unconstrained prompt-only agent loops. OpenProgram gives that balance a structure. Everything else is built on the Agentic Function primitive; DAG Context supports native multi-agent systems; Agentic Workflow targets trustworthy and self-evolving agents; and Event Infrastructure supports proactive agents. Workflow authors get a stable spine to reason about while leaving judgement calls to the model.

Key capabilities

  • Agentic Function, the primitive the rest of the runtime is built on, pairing fixed Python flow with model judgement.
  • DAG Context, a context representation for native multi-agent systems.
  • Agentic Workflow, aimed at trustworthy and self-evolving agent behaviour.
  • Event Infrastructure, for proactive agents that react to events rather than only to prompts.
  • Multi-agent support added 2026-07-21: spawn sub-agents, messaging across sessions, and file-touching branches in git worktrees.
  • Built-in browser with multiple panes, bookmarks, History, and Agent control of visible pages.
  • Installable harnesses through openprogram programs install, plus multi-account providers with automatic key rotation.

Who uses it and how

  • Desktop automation teams, using the GUI Agent Harness, which operates desktop apps through screenshots and actions.
  • Research groups, using the Research Agent Harness, which automates literature reviews, experiments, and paper drafts.
  • Teams needing persistent agent memory, using Scriptorium, which stores and retrieves source-cited Markdown memories over MCP.
  • Developers running parallel agent work, who use spawn, cross-session messaging, and git worktree branches to keep concurrent edits isolated.
  • Operators who want proactive rather than prompt-driven agents, built on the Event Infrastructure.

Getting started

Install on macOS or Linux with curl -fsSL https://openprogram.io/install | sh, or on Windows with irm https://openprogram.io/install.ps1 | iex. The first openprogram run opens a provider setup wizard and then the terminal chat; re-run it with openprogram setup.

How it compares

The registry facts list no paid products that OpenProgram replaces and no third-party agent frameworks as direct comparisons, so no licence, hosting, or cost contrast can honestly be drawn. Within its own family it sits alongside the GUI Agent Harness, the Research Agent Harness, and Scriptorium, each of which is installable as a harness through openprogram programs install. In the Productivity & Utilities / Automation category as catalogued here, it stands alone.

When to use it — and when not to

A self-hoster must supply model provider credentials and run the local server, reached through openprogram web at http://localhost:18100. Windows users need a release that ships Windows runtime assets; without them the fallback is the Windows source-development installation, which is a rougher path. The licence is AGPL-3.0, which matters to anyone intending to keep derivative work closed, and at 520 stars with a single open issue the project is young, so maintainer depth should be weighed before it becomes load-bearing.

project readme (upstream, from github) — read inline

Self-Programming AI Assistant. Capture, automate, and refine all your workflows.

arXiv Release License Python Platforms Build status

Getting Started · Install · Docs · API Reference · Philosophy · 中文


"The more constraints one imposes, the more one frees oneself." — Igor Stravinsky, Poetics of Music

We propose Agentic Programming. An LLM is flexible; code is deterministic. Let the model run everything and you get chaos — unpredictable execution, context explosion, no output guarantees; hard-code everything and you lose the intelligence. A harness balances the two, interleaved moment to moment — Python for the flow you want fixed, the LLM for the judgement you can't script. (the full rationale →)

Contents

Install

curl -fsSL https://openprogram.io/install | sh

Windows x86_64 or arm64 CLI/server (requires a release with Windows runtime assets):

irm https://openprogram.io/install.ps1 | iex

If the selected release has no Windows runtime ZIP and checksum, use the Windows source-development installation.

Desktop: macOS releases use the signed and notarized DMG; Windows uses a signed win-x64.exe or win-arm64.exe when that artifact is attached to the GitHub Release. Linux and Windows without that EXE use the complete CLI/server runtime and Web UI.

Platform matrix, PATH, openprogram doctor, and source-checkout install: Installation.

Quick start

The first openprogram run opens a provider setup wizard, then the terminal chat. Re-run the wizard with openprogram setup.

openprogram

Open the Web UI at http://localhost:18100:

openprogram web

Confirm with one printed reply:

openprogram --print "Introduce yourself in one sentence"

Details: Getting Started.

Integrated Projects

Our open-source projects cover desktop automation, research workflows, and agent memory. Visit their repositories for source code, documentation, and contributions.

Project What it does
GUI Agent Harness GUI Automation
Operates desktop apps with screenshots and actions.
Research Agent Harness Research Automation
Automates literature reviews, experiments, and paper drafts.
Scriptorium Agent Memory
Stores and retrieves source-cited Markdown memories via MCP.

Install more: openprogram programs install / (guide).

News

  • 2026-08-17 — Built-in browser: multiple panes, bookmarks, History, and Agent control of visible pages.
  • 2026-07-21 — Multi-agent: spawn sub-agents, message across sessions, file-touching branches in git worktrees.
  • 2026-06-22 — 📄 Paper accepted at the KDD 2026 Workshop on Agentic Software Engineering (arXiv:2606.15874).
  • 2026-06-07 — Installable harnesses and multi-account providers with automatic key rotation.
  • 2026-05-28 — The Web UI design system.
  • 2026-04-04 — Built-in Anthropic / OpenAI / Gemini providers.
  • 2026-04-03 — 🌱 First release: @agentic_function and the execution DAG.

Why OpenProgram?

OpenProgram supports macOS and Linux installations, native Windows x86_64/arm64 CLI/server, multiple providers, and a Web interface (Desktop App or openprogram web → http://localhost:18100). The Windows Desktop distribution path produces a signed per-user installer and embeds the same complete runtime; Windows sandbox execution remains a separate level. The harness itself provides four mechanisms — one primitive and the three capabilities it enables.

1. Agentic Function — the primitive everything else is built on

An agent is a Python function. You write it like any other function. The docstring is the system prompt: it tells the model what this agent does. Each argument is input for this run. A str argument is the task. In this example the task is the ticket to classify. You do not store the prompt or the JSON as separate variables. They are written as code. choices=[...] asks again until the answer is one of those words.

Here is an example, compared with the common way:

OpenProgramThe common way
@agentic_function
def triage(ticket: str, runtime=None) -> str:
    """Classify the ticket as bug / feature /
    question, then draft a reply."""
    kind = llm(                             # 🤖 LLM decides
        ticket, choices=["bug", "feature", "question"])
    if kind == "bug":                       # 🐍 you decide
        logs = search_logs(ticket)          # 🐍 plain Python
        return llm(                         # 🤖 LLM writes
            f"Reply using:\n{logs}")
    return llm("Draft a short reply.")

🤖 llm() is the model call
🐍 everything else is ordinary Python, and it runs every time

TRIAGE_PROMPT = """You are a triage
agent. Classify the ticket as bug,
feature, or question. Reply as JSON."""

TOOLS = [{"type": "function", "function": {
  "name": "triage",
  "parameters": {"type": "object",
    "properties": {"ticket": {"type": "string"}},
    "required": ["ticket"]}}}]

resp = client.chat(TRIAGE_PROMPT, tools=TOOLS)
kind = json.loads(resp)["kind"]     # hope it parses
if kind not in ("bug", "feature"):
    ...                             # and re-prompt by hand

2. DAG Context — for native multi-agent systems

Context is an addressable node, not a per-agent buffer — so every multi-agent move is just "point at a different node set":

Want to… It's one call
Run a sub-agent on a clean context spawn_branch(...)
Send a message to another branch, get the reply message_branch(message, target=...)
Try an alternative without losing the original fork the node
Let a branch touch files safely it runs in its own git worktree

3. Agentic Workflow — for trustworthy & self-evolving agents

A code gate can't be talked past. When the model's answer fails validation, it is sent back to re-decide — this is the real transcript:

llm  → "probably a feature request"
gate ✗ no parseable pick from ["bug", "feature", "question"]
llm  → {"call": "feature"}
gate ✓ → branch taken in Python

And it grows itself: the agent edits its own @agentic_function files with ordinary file tools → a watcher hot-loads them → the new tool is live on the next turn. No create() / fix() machinery.

4. Event Infrastructure — for proactive agents

One bus, every subsystem. The agent loop, auth, context, channels, and memory all emit the same Event(type, payload, ts) envelope, so anything can watch anything:

from openprogram.events import get_event_bus

get_event_bus().subscribe(                       # returns an unsubscribe fn
    lambda e: alert(e.payload),
    types={"context.compacted", "file.changed"},
)

A foundation, honestly labelled: the plumbing is in place and the proactive policy layer is its first intended consumer — that part is yours to build.

Also in the product

The four mechanisms above are the thesis. Below are other designs that are not the usual shape — shipped items are checked.

  • 🧠 Scriptorium. Markdown under ~/.openprogram/memory/, every paragraph cited, written in background batches — there is no "save this" tool. Details
  • ♾️ Infinite Context. Occupancy drives /compact and automatic compact; tool results inside a single turn can compact without another command; original records stay in the session. Details
  • 🌿 Conversation stored as git. History is a repo, not a list: branch, attach, and merge from the sidebar. Details
  • 🎯 Goals in ordinary chat. Persistent goals with bound todo plans live in the same conversation, not a separate Goal mode.
  • 👁️ Proactive policies. The event bus is live; a layer that watches it and acts on its own is the next piece of that design.
  • 🖥️ Agent terminal. A host-owned PTY for the agent is underway — not yet a chat tool.
  • 🔄 Self-update. The agent patching and replacing its own runtime in conversation — with owner approval, verification, and recovery — is still a goal. Details

Citation

Using OpenProgram in your work, or building on the code? Please cite our paper — and under the AGPL, any derivative you distribute or run as a network service must itself be open-sourced under the AGPL, with attribution preserved (see License).

LLM-as-Code: Agentic Programming for Agent Harness — accepted at the KDD 2026 Workshop on Agentic Software Engineering (AgenticSE). arXiv:2606.15874

@inproceedings{qi2026llmascode,
  title     = {LLM-as-Code: Agentic Programming for Agent Harness},
  author    = {Qi, Junjia and Fu, Zichuan and Gao, Jingtong and Zhang, Wenlin and Yan, Hanyu and Wu, Xian and Zhao, Xiangyu},
  booktitle = {KDD 2026 Workshop on Agentic Software Engineering (AgenticSE)},
  year      = {2026},
  eprint    = {2606.15874},
  archivePrefix = {arXiv},
  url       = {https://arxiv.org/abs/2606.15874},
}

License

AGPL-3.0 © 2026 Fzkuji. Free to use, study, modify, and share — but any derivative you distribute or run as a network service must also be released under the AGPL, with attribution preserved.

Acknowledgements

Thank you to everyone who helps improve OpenProgram through code, bug reports, reproductions, tests, documentation, reviews, and suggestions.

Fzkuji Qi202 GithungDang basil-k-aji-dev binyangzhu000-sudo

Thank you also to everyone who helps through issues and pull requests.

Frequently asked questions

Is OpenProgram free to use?

OpenProgram is open source under the AGPL-3.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does OpenProgram do?

Self-Programming AI Assistant. Capture, automate, and refine all your workflows.

What is OpenProgram written in?

OpenProgram is primarily written in Python. Its source is publicly available at https://github.com/Fzkuji/OpenProgram, and it has 520 GitHub stars.