Created applications
open directly in a new tab
Interfaces are freely authored, business data persists independently, and model/program capabilities use explicit runtime contracts.
Implementing usage examples: Program, Package, and Application
This section specifies management changes. Program is the collective name for callable capabilities; Tools and Workflows retain their definitions. Package is the installation unit containing these capabilities, including the three harnesses. Application is user-openable software with its own interface, version, data, and lifecycle. Package is not a new execution type; Applications no longer live in the Program source catalog.
| User example | Entry and action | Observable result and failure handling | Implementation and acceptance |
|---|---|---|---|
| U1 View existing capabilities | Abilities → Programs; expand Tools, Workflows, Packages | Three harnesses appear under Packages. Selecting a package shows source, default call entry, and call structure. Names such as gui_agent remain unchanged. Software applications are excluded from capability scanning. | Unify source discovery, explorer, call graphs, and page categories. API tests check new categories and old-path compatibility. |
| U2 Install, upgrade, and uninstall packages | Inspect management commands in package details; use existing programs install, install --upgrade, and uninstall CLI | New installations use programs/packages. Existing installations remain recognized at original paths and are labeled package. Do not redownload, move external source, or modify development-symlink targets. Desktop read-only dependency restrictions remain; the page identifies the owning environment’s CLI as manager. | Installation-directory helpers, protected paths, source records, registry, CLI, and refresh scripts support old/new directories. Test install/removal and refusal to import unknown directories. |
| U3 Install software | Sidebar Applications → enter local application directory → Install | Show declarations, source, version, and enabled status. Python backends require an explicit local-code trust checkbox in the installation form. Duplicate IDs, invalid entries, and failed dependency preparation return errors without overwriting existing versions. | Independent management page reuses owner API; new registry file applications/catalog.json. Browser tests validate directory, failure, and successful installation through the form. |
| U4 Open software from the menu | Click an application button in New tab, or Open on the management page | Open its own tab, reusing the same instance. Project applications bind to the current project or project picker. Ordinary Programs/Packages gain no automatic launch buttons. | Reuse application opening and project selection. Browser tests verify management and menu open the same instance. |
| U5 Manage installed software | Applications → enable/disable, show/hide, update, uninstall | Disabling prevents new opens and operations; hiding removes only the menu button. Updates explicitly reinstall from the original source while preserving schema safeguards. Uninstall deregisters but retains user data; reinstall restores the original instance. Errors remain beside the corresponding action. | Reuse PATCH, install replace, and DELETE APIs. Refresh and cross-page reopening read the latest catalog. Verify classification migration preserves saved data and running versions. |
| U6 Update existing OpenProgram | Startup or first read of the new application catalog | Move kind=application software records from program-sources.json into a separate file, including disabled/hidden state, source, and uninstall records. Write the new file successfully before removing old records. Conflicts reject overwrites and preserve originals; migration is repeatable. Package sources remain in the Program catalog. | Trigger migration through real API calls. Verify idempotency, write failure, conflicts, and data/instance identity preservation. Serialize migration and catalog updates with consistent lock order. |
| U7 Call through CLI or Agent | apps list/install/run/status/cancel/uninstall; legacy programs apps remains compatible | New documentation uses top-level apps for software management. Existing tools, Workflows, and harness calls remain unchanged; old automation commands continue working. | Validate CLI parser/dispatch and help; retain the owner-authenticated application client. |
Management entries and directories
Abilities / Programs Applications /applications
Tools Installed software and installation form
Workflows Source, version, enable/disable, update, uninstall
Packages Open → same application-instance tab
gui_harness
research_harness New tab
wiki_agent_harness Enabled, visible software buttons
New packages install under openprogram/programs/packages/. Old programs/applications/ is read only for legacy-install compatibility and displayed as Packages; do not move old source into software data directories. Program sources remain in program-sources.json. Software registration uses applications/catalog.json; versions, environments, instance SQLite, run records, and data directories stay in place. Reclassifying source directories grants no execution authority to unregistered directories.
Implementation order and scope
Implement one complete classification migration: establish U1/U6 public-entry failure tests, then source and independent-catalog changes; complete U2/U7 directory/CLI compatibility and U3–U5 management/menu integration; finally verify end-to-end usage examples. Update all shared-directory consumers, sandbox protections, release packaging, product documentation, and contract tests together. After independent specification review, run quality review, the complete test list, and update the default App.
This adds no marketplace, changes no harness algorithms, does not infer software from arbitrary code, and adds neither other-language runners nor independent deployment. Package installation retains existing CLI environment constraints; application forms cannot use package APIs to modify desktop host dependencies.
Implementation status: U1–U7 implemented and accepted. Classification, independent-catalog migration, management page, menu launch, and top-level CLI passed independent specification/quality reviews and complete checks. Default-App acceptance verified three harnesses under Packages, management/menu reuse of a reader instance, preserved notes and project-file analysis results, and menu hiding/restoration. Actual migration preserved three application records, three instances, two data files, and fourteen Program sources. Duplicate historical registrations resolve by identical path; conflicting installation locations remain rejected. Public API, CLI, and real browser tests cover installation, update, disable, reinstall after uninstall, and failures. Controlled integration tests verify model success/failure, not live provider availability. Independent deployment and MCP Apps adapters remain unimplemented.
Manage Application software separately from Program capabilities
OpenProgram applications contain their own UI, business logic, data, and dependencies. The framework handles registration, opening, runtime context, and shared capabilities. Completed, verified applications appear in New tab by name/icon. One click opens them without redescribing requirements or returning to their creation conversation.
Default interfaces use standard Web technology: HTML, CSS, JavaScript, and compiled React/Vue. Applications design their own pages, editors, charts, and interactions rather than assembling only fixed OpenProgram components. Python backends handle business/model tasks. HTML is an interface technology, not a measure of completeness; backend, state, runtime contracts, and deployment dependencies determine software capabilities.
Applications run inside OpenProgram by default. The architecture permits later independent deployment with a minimal runtime, without the full desktop client, while retaining OpenProgram runtime dependencies. Removing every OpenProgram dependency requires replacement model, storage, and execution implementations; arbitrary applications cannot be promised automatic standalone export.
The concrete value is shared business operations for buttons and Agents, model calls in existing execution records, business data independent of chat windows, and upgrades preserving running-task code. This combines product contracts and does not claim these mechanisms are unique. Hermes UI extensions, MCP Apps portable interfaces, and AgentOS runtime services are direct references.[8] Hermes Desktop Plugin SDK [40] MCP Apps [29] Agno / AgentOS
What users see
New tab retains Files, New chat, Browser, and Terminal, adding enabled registered applications in the same area. Application features appear after opening; launch buttons do not show model, port, runtime, or installation paths. Management handles hiding, display-name changes, uninstall, and errors. Hiding preserves data.
This demonstrates only opening existing applications from New tab, without model calls or installation. Four built-ins provide context; the two application buttons and return button are interactive.
The same application/project reuses an open tab by default; separate projects can open independently with explicit data scopes. Without an active project in New tab, reuse the saved binding. If a required project is unbound, select one on first open. Applications must not silently change data directories to follow another chat tab’s cwd.
“One-sentence creation” still starts in chat: the Agent writes the application package and dependency declarations, builds and behaviorally verifies it, then registers within the creation task’s authorization. Only successful registration adds a menu button. Failure retains source/errors for repair rather than advertising an unusable application. Later changes produce validated candidate versions before replacement.
First opening may show dependency preparation or startup. Failure stays on the same application page with reasons and Retry. Ordinary page closing closes only the view; user-started background tasks continue, and reopening reads the same task state. Service-process exit and business-task interruption are reported separately.
Survey scope and evaluation method
This report covers the major public Agent harnesses, coding tools, embedded frameworks, application platforms, and interface protocols listed below. Categories describe their role in this question, not market-share rank. Protocols are included to answer UI integration questions, not to misclassify them as harness products.
Relevant DSH distribution, worktable, and OpenProgram code paths were checked. Other projects use current official documentation, public examples, or repository descriptions as evidence. Not every product was installed and end-to-end tested. “Unverified” means insufficient evidence, not absolute absence of support. Cursor/Windsurf internals are unknown. AutoGen and Semantic Kernel are discussed in Microsoft Agent Framework’s evolution, not presented as three separately audited current implementations.
“All market frameworks” has no closed catalog. Commercial products, community forks, and private harnesses are not exhausted. Relevant Qwen Code/Strands pages could not be obtained; Trae, Kimi CLI, and cloud software-generation services are outside the verified matrix. These gaps limit uniqueness claims, not the application runtime requirements below.
For each project ask: what is delivered, who loads/executes it, who renders UI, where business state lives, and whether it can leave the host. Evaluate code generation, code execution, UI, and application installation separately.
Public mechanism comparison
| Project / evidence | Category | Extension or runtime mechanism | UI capability | Host dependency / source |
|---|---|---|---|---|
| DeepSeek HarnessLocal distribution code inspected | Host extension | Cordis lifecycle and service injection; dynamic plugins have host/client parts. | Host React slots; dynamic frontends invoke registered backend handlers. | Plugins depend on DSH services/loaders and do not automatically become standalone software. [1] DeepSeek Harness |
| dsh-worktablePlugin source inspected | Host extension | Installation package supplies backend routes and frontend worktable. | Project entries and split view; generated artifacts load in iframes using widget-result.json. | Worktable depends on DSH; generated pages are standalone only if their own dependencies allow it. [2] dsh-worktable |
| PiOfficial documentation | Host extension | TypeScript extensions: tools, events, commands, context. | ctx.ui custom terminal components, message rendering, and overlays. | Extensions require Pi; terminal components are not HTML. [3] Pi |
| OpenCodeOfficial documentation | Host extension | JS/TS plugin event hooks, custom tools, SDK client. | Reviewed docs list TUI notifications and related interfaces; this does not establish arbitrary business-page plugin support. | Plugins depend on OpenCode; generated application independence is separate. [4] OpenCode |
| Codex App ServerOfficial documentation | Agent service | Bidirectional JSON-RPC: threads, turns, events, approvals. | Clients implement their own UI; this interface is not an application installation manifest. | Independent clients are possible, but Agent capabilities still require Codex services. [5] Codex App Server |
| Claude CodeOfficial documentation | Host extension | Plugins package skills, agents, hooks, MCP, LSP, and more. | Public contracts mainly extend Agents; arbitrary React-page registration is unconfirmed. | Plugins depend on Claude Code; plugin packages are not desktop applications. [6] Claude Code |
| HermesOfficial documentation | Host extension | Python register(ctx) and multiple capability registrations. | Also Desktop SDK and Dashboard extensions, beyond terminal plugins. | Local host extensions; compatibility with other plugin formats covers only explicit subsets. [7] Hermes |
| OpenClawOfficial documentation | Host extension | Gateway plugins provide tools, services, channels, and runtime capabilities. | Interactive Dashboard and macOS widget panel have different contracts. | Plugins require Gateway; HTML panel rendering does not imply complete runtime capability. [10] OpenClaw |
| Gemini CLIOfficial documentation | Host extension | Extensions package prompts, MCP, commands, and other Agent configuration/capabilities. | CLI extension mechanism, not arbitrary application-page installation. | Extensions use Gemini CLI loading/runtime environments. [12] Gemini CLI |
| gooseOfficial documentation | Host extension | MCP extensions, recipes, CLI/API. | Desktop explicitly supports MCP Apps interactive interfaces. | MCP services may deploy separately; UI requires compatible hosts. [13] goose |
| OpenHandsOfficial documentation | Agent service | Python/REST SDK, tools, sessions, and remote Agent Server. | SDK supports custom developer experiences. | Embeddable in applications, not a generic application menu or arbitrary host-UI extension. [14] OpenHands |
| DeerFlowOfficial repository description | Agent service | Gateway, long-running Agents, skills, files, execution environments. | Complete Web client; read-only static demos differ explicitly from backend-backed runtime mode. | Full capability requires its backend; demo pages do not establish service independence. [15] DeerFlow |
| AiderOfficial documentation | Coding tool | Primarily code changes, tests, and Git workflows. | CLI product; generic application-UI plugin contract unverified here. | Generated source may deploy with its own dependencies, separate from Aider extensions. [16] Aider |
| mini-SWE-agentOfficial repository description | Coding tool | Simplified Agent loop, independent shell actions, linear history. | CLI and trajectory viewer. | Can generate programs; reviewed contracts do not install them as host applications. [17] mini-SWE-agent |
| Mistral VibeOfficial repository description | Coding tool | CLI coding Agent, programmatic mode, streaming output. | Terminal; business-page plugin contract unverified here. | Programmatically callable; output formats do not define UI rendering. [18] Mistral Vibe |
| ClineOfficial documentation | Coding tool | MCP extends external tools/services. | Reviewed pages establish tool integration, not arbitrary UI extensions. | MCP servers may run independently; hosts invoke tools. [19] Cline |
| Roo CodeOfficial documentation | Coding tool | Project/global MCP with stdio, HTTP, and other connections. | In-editor Agent interaction. | MCP services and editor extensions are distinct deployment objects. [20] Roo Code |
| ContinueOfficial documentation | Coding tool | Configure MCP tools for Agents. | Editor/Agent integration; arbitrary business-page registration unverified here. | Tool services work across hosts; Continue configuration still depends on Continue. [21] Continue |
| CursorOfficial overview; internals unknown | Closed-source product | Public docs provide Agent, Rules, MCP, and other entries. | Product UI is visible; internal plugin runtime unverified here. | Do not infer internal architecture or arbitrary application-hosting contracts from public feature lists. [22] Cursor |
| Windsurf / Devin DesktopOfficial docs; internals unknown | Closed-source product | Public Cascade MCP integration. | In-editor interaction; internal mechanism unverified. | MCP capabilities do not imply portable business-application pages. [23] Windsurf / Devin Desktop |
| Claude Agent SDKOfficial documentation | Embedded framework | Embed Claude Agent capabilities into Python/TypeScript programs. | Applications provide their own UI. | Independent of Claude Code’s interactive UI, with SDK/runtime dependencies retained. [24] Claude Agent SDK |
| LangGraphOfficial documentation | Embedded framework | State graphs, persistence, recovery, human intervention. | Graphs/events do not prescribe final business UI. | Usable as a standalone-program library; persistence needs actual configuration. [25] LangGraph |
| Deep AgentsOfficial documentation | Embedded framework | Combines tools, files, context, and sub-agents atop LangGraph. | Agent harness is separate from final application UI. | Embeddable, depending on its libraries/runtime configuration. [26] Deep Agents |
| Google ADKOfficial documentation | Embedded framework | Agent development, orchestration, tools, deployment. | Evaluate development tools and business UI separately. | Builds/deploys Agents; not a desktop application-registration protocol. [27] Google ADK |
| Microsoft Agent FrameworkOfficial documentation | Embedded framework | Agent/workflow development, continuing relevant AutoGen/Semantic Kernel capabilities. | Applications integrate their own UI and channels. | SDK/service dependencies, without requiring a particular desktop host page. [28] Microsoft Agent Framework |
| Agno / AgentOSOfficial documentation | Agent service | FastAPI runs agents, teams, workflows, with database state and APIs. | Control Plane manages them; products may have independent frontends. | Applications can deploy services independently while requiring AgentOS/storage configuration. [29] Agno / AgentOS |
| CrewAIOfficial documentation | Embedded framework | Flows express business processes and state. | Flow execution does not prescribe business frontends. | Application libraries/deployment dependencies, not a page-plugin format. [30] CrewAI |
| PydanticAIOfficial documentation | Embedded framework | Typed Agents and UI-event-stream integration. | UI Event Streams adapts events for frontend consumption. | Frontend and Agent runtime may separate; not a complete application-installation protocol. [31] PydanticAI |
| MastraOfficial documentation | Embedded framework | TypeScript agents, workflows, services, storage. | Next.js, React/Vite, and other integrations; Studio manages development. | Business applications deploy independently with Mastra service/library dependencies. [32] Mastra |
| NeMo Agent ToolkitOfficial repository description | Embedded framework | Functions, models, workflow configuration, multi-framework integration. | Reviewed entries primarily run/optimize Agent workflows. | Deployment toolchain; generic desktop application plugins unconfirmed. [33] NeMo Agent Toolkit |
| smolagentsOfficial repository description | Embedded framework | CodeAgent executes code and tools; Agents can be shared. | Application UI is implemented/integrated separately. | Supports ordinary Python programs; not a host-page extension protocol. [34] smolagents |
| DifyOfficial repository description | Application platform | Plugin Daemon manages local/debug/serverless execution. | Plugin execution and Dify application display are separate; backend plugins are not arbitrary UI. | Local subprocesses or remote execution still depend on Dify plugin-call protocols. [35] Dify |
| Open WebUIOfficial documentation | Application platform | Python Tools/Functions extend inference/platform behavior. | Actions can add chat buttons; event-driven interaction extensions also exist. | Platform extensions depend on Open WebUI, not automatically standalone software. [36] Open WebUI |
| ChainlitOfficial documentation | Application platform | Python applications with custom elements and callbacks. | CustomElement uses React; custom frontends are also possible. | Elements depend on Chainlit context; complete applications may deploy as services. [37] Chainlit |
| OpenAI Plugins (formerly Apps SDK path)Official documentation | Interface protocol | MCP tools provide UI resources, a standard bridge, and host-specific extensions. | iframe Web UI; current official documentation builds on MCP Apps. | Portable across compatible hosts; window.openai-specific capabilities are not automatically portable. [39] OpenAI Plugins (formerly Apps SDK path) |
| MCP AppsOfficial documentation | Interface protocol | Tools associate with ui:// resources; JSON-RPC / postMessage. | Sandboxed Web UI with frontend-framework choice. | Compatibility covers UI/tool interaction, not local installation, business databases, or background tasks. [40] MCP Apps |
| AG-UIOfficial documentation | Interface protocol | Event communication between Agents and UI. | Does not prescribe HTML, native components, or page frameworks. | Solves streaming interaction, not application packages, permissions, or deployment. [41] AG-UI |
| A2UIOfficial documentation | Interface protocol | Generates structured UI descriptions rendered by trusted component catalogs. | Limited to available components and renderer contracts. | Cross-platform rendering, not execution of arbitrary generated frontend code. [42] A2UI |
“Official repository description” means reading public descriptions, not auditing the entire repository. Compatibility without measured evidence does not count as accepted.
Mechanisms directly affecting our choices
DSH: host plugins and generated pages are separate paths
The installed worktable plugin uses host services/UI slots and a React split layout; it is not standalone software launched by double-click. Its generated windows read HTML, URLs, or files from artifact manifests. Pages using only their own resources may be hosted separately; pages depending on DSH routes, sessions, or plugin services lose those implementations outside DSH.[2] dsh-worktable
DSH dynamic Cordis plugins are another mechanism. In the inspected distribution, host parts register handlers and client parts run in the host environment and call the backend. They support real logic, not just static display, but remain constrained by supported APIs, loading lifecycle, and dynamic-code formats—not arbitrary code in arbitrary windows. Node vm is not OS-level security isolation.[1] DeepSeek Harness
Hermes and Pi: complex host-extension interaction with explicit dependencies
Hermes Desktop SDK has pane, page, sidebar, status-bar, and palette contributions. Local plugins load directly in the host environment, distinct from isolated HTML previews. Dashboard also supports pages/slots. Adopt explicit contributions/lifecycles without giving ordinary generated applications every host internal object. Pi custom UI uses terminal components, disproving the assumption that all plugin interfaces are HTML.[8] Hermes Desktop Plugin SDK [9] Hermes Dashboard extensions [3] Pi
OpenClaw: display panels and interactive applications differ
Current macOS widget-panel docs explicitly limit it to rendering. Host-integration actions belong to Control UI/session dashboard; A2UI also belongs to dashboard. Sharing the name canvas does not transfer old-documentation or other-interface capabilities onto this panel.[11] OpenClaw Widget panel
MCP Apps, AG-UI, and A2UI solve different problems
MCP Apps provides portable Web resources and host communication; AG-UI describes Agent/UI events; A2UI lets hosts render declarative data from component catalogs. Freely laid-out applications suit Web UI, common forms can use optional declarative rendering, and streaming tasks need event protocols. None automatically supplies installation, data migration, or background-service lifecycles.[40] MCP Apps [41] AG-UI [42] A2UI
Runtime frameworks: independent deployment still has framework dependencies
LangGraph persistence, AgentOS runtime APIs, and OpenHands SDK/Agent Server support Agent capabilities in custom products. Applications can deploy independently while requiring libraries/services. OpenProgram should use this distinction rather than equating leaving the desktop client with removing every OpenProgram dependency.[25] LangGraph [29] Agno / AgentOS [14] OpenHands
Current OpenProgram implementation and boundaries
Application runtime reuses Program source management, model Runtime, execution records, and tabs. This document follows Programs code structure; broader comparison is in Framework comparison. Independent review, complete acceptance, and local-App delivery status are consolidated at the end.
| Current implementation | Source | Boundary |
|---|---|---|
| New tab retains four built-ins and reads installed applications; clicks reuse instance-specific tabs. | apps/web/components/center-tabs/new-tab-page.tsx | Project applications support project selection and saved bindings; hiding and disabling are separate. |
| Independent application UI uses sandbox iframes and MessagePort instance APIs. | apps/web/components/center-tabs/application-tab-pane.tsx | Applications author HTML/CSS/JavaScript independently of host React components; pages cannot directly call owner APIs. |
| Applications register in independent applications/catalog.json; pinned content versions live in version directories. Legacy Program-source records migrate on first read. | openprogram/programs/_applications/catalog.py | Python installation requires explicit trust, rechecked against the final snapshot. Process isolation is not a malicious-code sandbox. |
| Python operations execute in separate processes using existing execution records, Attempts, and Drivers. | openprogram/programs/_applications/service.py | Concurrent cancellation shares cleanup; process-tree ownership persists so children can terminate after the parent exits. |
| Model calls bind existing Runtime and SessionNodeWriter. | openprogram/programs/_applications/runner.py | Application model names pass to Runtime; pages never receive model credentials. Ordinary Python call stacks cannot resume. |
| Instances persist business state, results, questions, and increasing events. | openprogram/programs/_applications/state.py | Reopening restores data; worker restart marks interruption. Automatic migrations, attachment APIs, and menu ordering remain unimplemented. |
Applications and host plugins are managed separately. Existing plugins extend host behavior; applications use their own pages/instance APIs. Existing plugin loaders do not guarantee this design’s application isolation. Automatic plugin-to-Application adaptation remains a future extension.
Application architecture and responsibilities
Name, icon, open, close view
Source, version, UI, operations, data scope
Own components and business interaction
Validate identity, operation, authorization, and task
Ordinary code, llm(), agent()
Business data, events, results, recovery
Application is a Program package extending existing source registration. Plugin is an installation unit extending host behavior, such as tools/themes; automatically adapting plugin-contributed Application definitions remains an extension. Not every plugin appears in New tab, and not every Application changes host UI. Keep one application definition per package; later adapters reference it.
Ordinary applications render only in their tabs. Global toolbars, chat editors, themes, and system services are trusted host extensions using plugin permissions. Expose a small stable API, not React stores, global session managers, or internal framework modules. Appearance components are optional; standard HTML and independent frontend builds are valid.
Phase one supports static Web applications and Web applications with Python business operations. Browser-executable JavaScript, Canvas, WebGL, and WASM are available; system GUI, GPU drivers, arbitrary binaries, and arbitrary-language services are not native browser capabilities. Add explicit runtime adapters/dependency contracts for later Node/other-language backends; do not claim arbitrary-program support in the first version.
Packages retain dependency files, tests, and release boundaries. Published UI uses build artifacts, without starting dev servers, installing latest dependencies, or regenerating code per click. Applications without backend operations start no Python process; operations start runners on demand. Runner denotes an application execution role; process isolation and security sandboxing require separate implementations and labels.
Minimum application contract
The first version references a Python entrypoint and built static directory from the manifest. Fields below match current application.json; public commands/SDK are in product docs. Operation names address UI/process boundaries only. Python internals retain ordinary imports/calls without a second string-based Workflow dispatcher.
{
"id": "local.paper-reader",
"title": "Paper reader",
"version": "1.0.0",
"ui": { "root": "web/dist", "entry": "index.html" },
"backend": { "kind": "python", "entry": "paper_reader.app:operations" },
"scope": "project",
"capabilities": ["model.invoke", "storage.app", "files.project.read"],
"dataSchema": 1,
"operations": { "summarize": { "agent": true, "input": { "type": "object" }, "output": { "type": "string" } } }
}
Static applications omit backend and may have empty capabilities. id is stable package identity, not title, absolute path, or creation-chat ID. Installation records bind owner, source, content digest, and selected version. Instances use app ID, owner, and explicit project scope. Hidden/order preferences belong to users, not release packages.
| Object | Responsibilities and minimum fields |
|---|---|
| ApplicationDefinition | App ID, source ref, version/UI resources, runtime type, operation schema, capability requirements, data schema. |
| Installation | References existing source records; selected version, enabled status, validation results, permission decisions. Copying a source directory does not complete installation. |
| AppInstance | owner + app ID + project scope; business-data location and active runs. A window is not a database. |
| View | tab ID, instance ID, UI route, displayed run; disposable and recreatable. |
| OperationRun | run ID, instance ID, operation version, inputs, identity, idempotency key, state, event sequence, result ref. Links existing execution records without copying the entire DAG. |
Cross-process operations have input/output schemas. Clients cannot choose arbitrary import paths, source paths, or owners; servers resolve installed records. Trusted identity comes from authenticated connections, not a JSON appId. Events have increasing sequences; clients resume by cursor after disconnect. Results and errors persist.
Business state uses per-instance SQLite databases; attachment APIs remain future work. Data lives under the current profile state directory, located by host-generated instance keys. Default profile is ~/.openprogram. Never store user data in source-version directories. Project-path changes update bindings without changing instance identity. Existing Runtime databases hold execution facts; application state references run IDs rather than duplicating Agent session databases. localStorage caches disposable view preferences only.
Python runners use pinned application dependency environments, never installing directly into the main worker. The host launches allowed entries from selected installation records, rejecting arbitrary browser launch commands. Each operation starts a runner and cleans its owned process tree on completion. Closing views does not cancel operations; reopening reads persisted state without requiring a resident app service.
Combining models and business operations
The first paper-reader sample accepts paper text and supports Generate summary and Save annotation. Saving is deterministic code; summaries enter OpenProgram Runtime and call existing llm(). PDF import requires separate application implementation. Models handle reasoning steps, not an obligatory chat before every button click.
User Generate summary and Agent summarize calls share input validation, permissions, and implementation. Applications explicitly declare Agent exposure; internal database methods never automatically become tools. Agent calls bind instances and cannot switch project data because chat selection changed.
The runner creates Runtime using the manifest’s model name or host defaults, binding application run records. Context contains operation inputs and explicitly supplied app data, independent of active chat. Explicit current-conversation import remains future work. Model configuration resolves at Runtime creation; running operations pin content versions.
Frontend receives progress/results, not provider keys. Model calls reuse Runtime recording/error handling. context.ask() emits question events; answers bind run ID/request ID and apply only to the currently pending question in that run. Application questions add no second ExecutionStatus.
Ordinary code validates model outputs before transactional data commits. Natural-language “saved” is not evidence of persistence. For non-idempotent external effects, retries must inspect existing operation records or require user handling; network timeout must not automatically repeat execution.
Opening, background execution, recovery, and upgrades
Opening path
New tab reads verified definitions → user selects app → resolve instance/project → reuse/create tab → load pinned resources → establish capability connection → read state/active runs. Registration/listing reads manifests only, without importing business code or making model requests.
Task path
Persist input, idempotency key, and accepted event, then existing Attempt manages running. Persist questions when input is needed; finish completed/failed/cancelled. Closing views never creates cancelled. Stop terminates owned process trees and returns cancelled only after cleanup; late results cannot overwrite terminal states. Concurrent business-object writes need database transactions/version checks, not merely disabled frontend buttons.
Restart path
Reopening restores view/state. After worker restart, incomplete runs follow existing owner-loss rules, becoming interrupted or completing requested cancellation. Retain inputs, saved progress, and results, and show interruption clearly. First version does not automatically resume Python operations; applications may read saved state and explicitly submit new operations.
Upgrade path
Build candidate → static/schema checks → dependency preparation → startup/behavior validation → data compatibility → atomic installation-record switch. Existing operations retain old versions; new operations use new versions. Old views/new backends must match versions; static-file updates cannot silently change loaded-page contracts.
First version rejects incompatible dataSchema/scope replacements without automatic migrations. Future migrations need backup, validation, and explicit recovery. Uninstall stops runs and hides the app, retaining source, schema, scope, snapshots, and data. Reinstallation obeys the same compatibility checks. No business-data deletion API exists.
Isolation and portability
Browser isolation enables freely authored interfaces. Ordinary applications use sandbox iframes/restricted CSP; existing unsandboxed same-origin plugin pages cannot prove isolation. Opaque origins communicate through validated MessageChannel/window handshakes. Future separate origins must still isolate host cookies, storage, and management APIs. CORS is not authentication; iframes are not safe by default.
Resources are addressed by installed-content digest and restricted to published static directories. The host delivers MessagePort only to its own iframe and validates operations against the bound instance, rejecting page-supplied owners, arbitrary URLs, or other-instance runs. Frontends cannot access all /api/* by default. Network, project-file, and device access need explicit capabilities rechecked per operation; disable/uninstall revokes connections.
Separate Python processes isolate dependencies/crashes but do not stop direct host-file reads or networking. First-version backends allow only explicitly authorized local code, never advertising manifest capabilities as a malicious-Python sandbox. Untrusted remote code requires platform file/network restrictions or container sandboxing, including child processes, package install scripts, and inherited environments. High-trust host plugins remain separately labeled.
| Runtime mode | Dependencies | Design commitment |
|---|---|---|
| Pure static application | Standard browser and own resources. | Independently hostable without host APIs; data migration remains the app’s responsibility. |
| Application inside OpenProgram | UI + application backend + OpenProgram Runtime. | Current implementation: menu, model operations, data, and task attribution agree. |
| Independent deployment, same runtime | Application package + minimal runtime + configuration/storage. | Architectural boundary reserved; unavailable until adapters and acceptance are implemented. |
| Cross-host MCP Apps | MCP server + compatible host/capabilities. | Shared UI/tool contract; OpenProgram-specific background APIs are not automatically portable. |
| No OpenProgram dependency at all | Application supplies replacement models, tasks, storage, and related implementations. | No automatic guarantee; separately build and test. |
Adopted, adapted, and deferred
| Choice | Basis | Concrete handling |
|---|---|---|
| Adopt: standard Web interfaces | [40] MCP Apps [39] OpenAI Plugins (formerly Apps SDK path) | Free frontend builds with optional theme components; stable host APIs. |
| Adopt: explicit contributions/lifecycles | [8] Hermes Desktop Plugin SDK [1] DeepSeek Harness | Applications contribute only within their pages; global host-UI slots remain trusted-plugin capabilities. |
| Adopt: state separate from pages | [25] LangGraph [29] Agno / AgentOS | Persist business state/run records; neither localStorage nor chat history is the sole database. |
| Adapt: MCP Apps integration | [40] MCP Apps | Reserve standard-bridge adaptation; implement local contracts first. Persistent tasks exceeding standard tool calls use explicit host extensions, never claimed as standard guarantees. |
| Adapt: UI event streams | [41] AG-UI | Reuse existing event semantics; add AG-UI adapters when cross-framework integration is needed, without rebuilding internal tasks. |
| Optional: declarative UI | [42] A2UI | Suitable for confirmations/common forms, not a requirement that all apps use built-in components. |
| Defer: arbitrary dynamic code in host | Host stability and ordinary-application isolation requirements. | Code becomes a reviewable, buildable version before registration; eval is not the default publication mechanism. |
| Defer: full marketplace, arbitrary-language runners, native GUI embedding | Not required for established first-version paths. | First verify install–open–operate–recover contracts; publication platforms are not first-version dependencies. |
Implementation breakdown and acceptance
This is approved implementation scope. Phases 1–4 passed independent reviews, complete checks, and default-App acceptance; phase 5 is unimplemented. Verify every step through public entries, not registry unit tests alone. Run existing Programs/plugin compatibility tests with affected changes.
| Phase / main location | Delivered behavior | Required acceptance |
|---|---|---|
| 1. Definition and source programs/_programs.py, plugins manifest/loader, application-catalog API | One definition/source identity with validation/enabled state; metadata discovery executes no code. | Duplicate IDs, invalid entries, missing sources, disabled leftovers; uninstalled apps absent from menus. |
| 2. Menu and pages new-tab-page.tsx, center-tabs state, app-shell.tsx, application components | Fixed entries open static apps, reuse tabs, bind instances, isolate resources. | Add two applications to four built-ins; keyboard opening, reload recovery, two-project isolation, iframe denial of host state. |
| 3. Business operations and Runtime Server application routes, Program execution adapters/events | Python operations use existing model/Workflow contracts; cancellation, questions, results persist. | UI/Agent share operations; model config applies, credentials stay off frontend, duplicate submissions do not duplicate writes. |
| 4. Complete lifecycle Source versions, application-state storage, runner management | Dependencies, background tasks, restart interruption, version pinning, migrations, uninstall. | Tasks continue after page close; explain worker interruption; running tasks retain code during upgrades; migration failures preserve data. |
| 5. Compatibility and independent deployment Independent adapters as needed | MCP Apps and minimal-runtime service deployment; other-language runners later. | Actually run the same UI/operations on an explicitly supported second host/deployment target, not screenshots alone. |
Phases 1–4 together constitute first-version complete application support; phase 2 alone is a static application entry. Three acceptance apps are a non-model local calculator, a paper reader saving annotations/generating summaries, and batch file analysis showing progress/restart interruption. Acceptance includes reopen, restart, repeated clicks, and model failures.
Performance targets are measurable: listing New tab starts no business process; repeated opening creates no second same-scope instance; opening triggers neither code generation nor model requests; large outputs use references rather than embedding in every event. Measure latency/resources in the first complete sample. Without current benchmarks, make no unmeasured millisecond or week commitments.
Implementation status and evidence limits
Phases 1–4 are implemented: registration/pinned versions, New tab entries, independent UI/capability bridge, Python operations, instance data, execution records. Independent reviews and complete checks passed. Default-App acceptance verified calculator launch, note persistence after reopening, Python file analysis, and tabs/results restored after restart. Integration tests cover model success/failure, cancellation, duplicate submission, and interruption; offline tests do not guarantee live model availability. Independent deployment/MCP Apps adaptation remain unimplemented.
Operation status uses ExecutionStore; model records use SessionNodeWriter in application run directories. UI accesses instance-scoped APIs through MessagePort. Opaque-origin pages load relative modules with single-version resource credentials permitting UI reads only. Python content versions have separate environments depending on the host framework. context.ask() handles questions; worker loss reports interrupted without resuming Python stacks. JSON state limit is 4 MiB, events 1 MiB. Attachments, automatic schema migration, conversation-context selection, and manual menu order remain unimplemented. Product APIs: Application documentation.
DSH details use installed distribution 0.1.5-rc.1; worktable source is 0.3.3. Neither received full compatibility acceptance, and current GitHub default branches may evolve. Dynamic plugin loading and worktable artifact pages are cited separately, without using one version’s demo as evidence for another’s capabilities.
Source index
Framework facts use official docs/repositories or local public distributions. Links support nearby claims, not endorsements of entire implementations. OpenProgram file links target main; inspected local revisions are in separate delivery records.
- DeepSeek Harnesshttps://github.com/deepseek-ai/deepseek-harness
- dsh-worktablehttps://github.com/Aisland-SJL/dsh-worktable
- Pihttps://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/extensions.md
- OpenCodehttps://opencode.ai/docs/plugins/
- Codex App Serverhttps://learn.chatgpt.com/docs/app-server
- Claude Codehttps://code.claude.com/docs/en/plugins-reference
- Hermeshttps://hermes-agent.nousresearch.com/docs/developer-guide/plugins/
- Hermes Desktop Plugin SDKhttps://hermes-agent.nousresearch.com/docs/developer-guide/desktop-plugin-sdk
- Hermes Dashboard extensionshttps://hermes-agent.nousresearch.com/docs/user-guide/features/extending-the-dashboard
- OpenClawhttps://docs.openclaw.ai/tools/plugin
- OpenClaw Widget panelhttps://docs.openclaw.ai/platforms/mac/canvas
- Gemini CLIhttps://geminicli.com/docs/extensions/
- goosehttps://block.github.io/goose/index.html
- OpenHandshttps://docs.openhands.dev/sdk
- DeerFlowhttps://github.com/bytedance/deer-flow
- Aiderhttps://aider.chat/docs/
- mini-SWE-agenthttps://github.com/SWE-agent/mini-swe-agent
- Mistral Vibehttps://github.com/mistralai/mistral-vibe
- Clinehttps://docs.cline.bot/mcp/mcp-overview
- Roo Codehttps://roocodeinc.github.io/Roo-Code/features/mcp/using-mcp-in-roo/
- Continuehttps://docs.continue.dev/customize/deep-dives/mcp
- Cursorhttps://cursor.com/docs
- Windsurf / Devin Desktophttps://docs.devin.ai/desktop/cascade/mcp
- Claude Agent SDKhttps://code.claude.com/docs/en/agent-sdk/overview
- LangGraphhttps://docs.langchain.com/oss/python/langgraph/overview
- Deep Agentshttps://docs.langchain.com/oss/python/deepagents/overview
- Google ADKhttps://adk.dev/
- Microsoft Agent Frameworkhttps://learn.microsoft.com/en-us/agent-framework/overview/
- Agno / AgentOShttps://docs.agno.com/agent-os/introduction
- CrewAIhttps://docs.crewai.com/en/concepts/flows
- PydanticAIhttps://pydantic.dev/docs/ai/integrations/ui/overview/
- Mastrahttps://mastra.ai/docs
- NeMo Agent Toolkithttps://github.com/NVIDIA/NeMo-Agent-Toolkit
- smolagentshttps://github.com/huggingface/smolagents
- Difyhttps://github.com/langgenius/dify-plugin-daemon
- Open WebUIhttps://docs.openwebui.com/features/extensibility/plugin/
- Chainlithttps://docs.chainlit.io/api-reference/elements/custom
- Chainlit custom React frontendhttps://docs.chainlit.io/deploy/react/overview
- OpenAI Plugins (formerly Apps SDK path)https://developers.openai.com/plugins/build/chatgpt-ui
- MCP Appshttps://modelcontextprotocol.io/extensions/apps/overview
- AG-UIhttps://docs.ag-ui.com/introduction
- A2UIhttps://a2ui.org/