Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: Bug report
description: Report a reproducible OpenMuse failure
description: Report a reproducible OpenFuse failure
title: "[Bug] "
body:
- type: textarea
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ body:
- type: textarea
id: outcome
attributes:
label: What outcome should OpenMuse handle?
label: What outcome should OpenFuse handle?
validations:
required: true
- type: textarea
Expand Down
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## 0.1.0-alpha — 2026-09-15

Initial public OpenMuse alpha.
Initial public OpenFuse alpha.

- Native/web interface using CopilotKit React Native and AG-UI.
- Persistent browser computer, inline PDFs, structured artifacts, and optional Rich Threads integration.
Expand Down
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Contributing to OpenMuse
# Contributing to OpenFuse

OpenMuse is an MIT-licensed alpha. Contributions should make delegated work reliable and visible, with honest connector status and useful native interactions.
OpenFuse is an MIT-licensed alpha. Contributions should make delegated work reliable and visible, with honest connector status and useful native interactions.

## Local development

Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2026 OpenMuse contributors
Copyright (c) 2026 OpenFuse contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
20 changes: 8 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<div align="center">

# OpenMuse
# OpenFuse

**A personal agent with a browser, terminal, files, and work that keeps going. Compatible with any agent harness.**

Expand All @@ -18,29 +18,25 @@ Built with CopilotKit React Native for iOS, Android, and web.

Clone this template and customize it however you want.

**[Building on OpenMuse? Meet with the CopilotKit team →](https://www.copilotkit.ai/talk-to-an-engineer?ref=openmuse_hero)**

https://github.com/user-attachments/assets/8014d185-346c-4954-8ff0-26c582c5093a

https://github.com/user-attachments/assets/0cc87de0-c3c1-4f24-b7df-e7d04bb946fd
**[Building on OpenFuse? Meet with the CopilotKit team →](https://www.copilotkit.ai/talk-to-an-engineer?ref=openmuse_hero)**

</div>

> **Alpha, for self-hosting and building on.** Open-ended reasoning, live Google accounts, and CopilotKit Rich Threads require their own configuration. See [what is verified](docs/VERIFICATION.md) and the [roadmap](ROADMAP.md).

## Demo

On iPhone, ask OpenMuse to find interesting stories on Hacker News and summarize CopilotKit. On desktop, ask it to check the school-trip email, open the message, and research exhibits at Monterey Bay Aquarium. The agent shows email and browser results inline. **Take control** opens that same browser session when you need it.
On iPhone, ask OpenFuse to find interesting stories on Hacker News and summarize CopilotKit. On desktop, ask it to check the school-trip email, open the message, and research exhibits at Monterey Bay Aquarium. The agent shows email and browser results inline. **Take control** opens that same browser session when you need it.

The 38-second iPhone and 42-second desktop web demos show the current interface, framed in 16:9. The send arrow becomes a stop square inside the input pill while the agent replies, then switches back. Stopping keeps your draft intact. See the [recording notes](docs/DEMO.md) for the model setup and reproduction steps.
The send arrow becomes a stop square inside the input pill while the agent replies, then switches back. Stopping keeps your draft intact. See the [recording notes](docs/DEMO.md) for the model setup and reproduction steps.

[Mobile MP4](https://github.com/user-attachments/assets/8014d185-346c-4954-8ff0-26c582c5093a) · [Web MP4](https://github.com/user-attachments/assets/0cc87de0-c3c1-4f24-b7df-e7d04bb946fd) · [Recording details and reproduction](docs/DEMO.md)
[Recording details and reproduction](docs/DEMO.md)

The [Jev aquarium-trip demo](docs/demos/jev-generative-ui.md) walks through a fictional school email, clarification choices, sourced exhibit cards, hands-on preference refinement, and a confirmed selection. [Watch the 83-second live Jev recording](assets/demos/2026-09-23/jev-live-web.mp4), where TypeSafe Jev makes the decisions and a scripted agent keeps the trip scenario repeatable. A [scripted-decision sample recording](assets/demos/2026-09-23/jev-web.mp4) is also available.
The [Jev aquarium-trip demo](docs/demos/jev-generative-ui.md) walks through a fictional school email, clarification choices, sourced exhibit cards, hands-on preference refinement, and a confirmed selection.

## What it is

OpenMuse is a personal-agent application with an agent computer, visible work, and rich results. It runs its own server, task worker, and browser worker. You can inspect and change the source under the MIT license.
OpenFuse is a personal-agent application with an agent computer, visible work, and rich results. It runs its own server, task worker, and browser worker. You can inspect and change the source under the MIT license.

The computer combines **persistent Chromium and an optional Linux workspace**. The agent can browse public pages, run commands in its own container, work with files, and move PDFs between the computer and the app. You can open its browser or terminal and continue the work. Graphical desktops and autonomous checkout remain future work.

Expand Down Expand Up @@ -230,7 +226,7 @@ flowchart TD

### OpenBot compatibility

OpenMuse's native client and personal-agent workflows are independent of OpenBot. The disabled OpenBot adapter is pinned and contract-tested against upstream interfaces. Live user/session bridging, routine mapping, and computer backend wiring remain future work. OpenBot's Intelligence runtime is not a raw AG-UI endpoint. [Integration contract](docs/OPENBOT-INTEGRATION.md).
OpenFuse's native client and personal-agent workflows are independent of OpenBot. The disabled OpenBot adapter is pinned and contract-tested against upstream interfaces. Live user/session bridging, routine mapping, and computer backend wiring remain future work. OpenBot's Intelligence runtime is not a raw AG-UI endpoint. [Integration contract](docs/OPENBOT-INTEGRATION.md).

## Development

Expand Down
2 changes: 1 addition & 1 deletion ROADMAP.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# OpenMuse roadmap
# OpenFuse roadmap

The release is a personal-agent alpha: delegate a job, inspect its plan, supply missing information, review an action, and return to a saved result. The [reference inventory](docs/FEATURES.md) is broader than this release.

Expand Down
6 changes: 3 additions & 3 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Use the repository's **Security → Report a vulnerability** form for private re

## Deployment boundary

OpenMuse currently supports one owner per deployment. Live mode uses a shared access key; it is not multi-tenant account authentication. Sample mode binds to loopback and contains fictional data. Use HTTPS and restricted network access for a remote live deployment.
OpenFuse currently supports one owner per deployment. Live mode uses a shared access key; it is not multi-tenant account authentication. Sample mode binds to loopback and contains fictional data. Use HTTPS and restricted network access for a remote live deployment.

The API holds provider credentials. Google tokens are encrypted at rest; short-lived signed URLs grant file and browser-console access. Protect `.env`, `.openmuse`, database backups, and browser profiles as private data. A signed URL is a credential until it expires.

Expand All @@ -18,15 +18,15 @@ The optional computer service runs a **single-owner Docker Linux container**, se

The container runs as UID/GID 1000 with a read-only root filesystem, all capabilities dropped, no added privileges, and Docker networking set to `none`. It receives no host directory mounts, Docker socket, model keys, Google tokens, or API access key. Limits are 512 MB RAM with no swap, one CPU, 128 processes, and 64 MB of temporary storage. Existing containers and volumes must match this deployment's ownership labels and isolation settings before the service attaches.

A named volume persists `/workspace`. Commands may create, change, or delete its files. The file API stays inside `/workspace`, rejects symlink traversal and special files, and uses atomic text replacement. Text reads/writes are limited to 256 KB; PDF import/export is limited to 10 MB and checks ownership in OpenMuse. File contents and command output remain untrusted input for the agent.
A named volume persists `/workspace`. Commands may create, change, or delete its files. The file API stays inside `/workspace`, rejects symlink traversal and special files, and uses atomic text replacement. Text reads/writes are limited to 256 KB; PDF import/export is limited to 10 MB and checks ownership in OpenFuse. File contents and command output remain untrusted input for the agent.

Commands have a 30-second container timeout, a 2-second kill grace, a 35-second Docker-client timeout, and a combined 128 KB output cap. The server records output, status, and exit codes. Stop prevents restart until both Docker stop and the original execution are acknowledged. Failed cleanup retains a safety lock and permits an explicit Stop retry. Interrupted work is recorded with an uncertain outcome and is never automatically replayed.

Docker shares its host kernel and does not provide a full VM or a hostile-tenant guarantee. The persistent volume has no portable per-volume disk quota; provision and monitor Docker storage separately. The browser's public-web checks do not enable networking in the Linux computer. See [computer setup](docs/COMPUTER.md).

### E2B desktop provider (opt-in)

With `COMPUTER_PROVIDER=e2b-desktop`, each owner's computer is a dedicated E2B Desktop VM instead of a Docker container, and the paragraphs above about Docker networking, the read-only root filesystem, capabilities and limits do not apply. Outbound internet access is enabled, the in-VM `user` account has passwordless sudo, and `/workspace` is stored with E2B. Internet access is an egress path that OpenMuse does not review: approval gating covers only the app's own email and calendar tools, so a prompt-injected agent could send data from the computer or submit forms in its browser. The live desktop stream is reachable from the internet and protected only by the VNC password in its URL (8 effective characters); treat that URL as a bearer secret. All listening VM ports are publicly reachable at `https://<port>-<sandboxId>.e2b.app` without application authentication; public traffic is enabled to allow the direct desktop iframe. The sandbox ID appears in the stream hostname and is not an access control. For example, `python3 -m http.server 8000` in `/workspace` exposes workspace files to the internet. Do not leave servers running or put sensitive files in an unauthenticated service. The iframe is sandboxed to block forms, popups and top-level navigation, but VM-controlled content can still display misleading prompts. The E2B API key stays on the API host and is never passed into the VM or to the client. A unique `COMPUTER_DEPLOYMENT_ID` is required, because sandboxes are matched by metadata across the whole E2B team. See [the E2B desktop section](docs/COMPUTER.md#run-the-computer-on-an-e2b-desktop-optional).
With `COMPUTER_PROVIDER=e2b-desktop`, each owner's computer is a dedicated E2B Desktop VM instead of a Docker container, and the paragraphs above about Docker networking, the read-only root filesystem, capabilities and limits do not apply. Outbound internet access is enabled, the in-VM `user` account has passwordless sudo, and `/workspace` is stored with E2B. Internet access is an egress path that OpenFuse does not review: approval gating covers only the app's own email and calendar tools, so a prompt-injected agent could send data from the computer or submit forms in its browser. The live desktop stream is reachable from the internet and protected only by the VNC password in its URL (8 effective characters); treat that URL as a bearer secret. All listening VM ports are publicly reachable at `https://<port>-<sandboxId>.e2b.app` without application authentication; public traffic is enabled to allow the direct desktop iframe. The sandbox ID appears in the stream hostname and is not an access control. For example, `python3 -m http.server 8000` in `/workspace` exposes workspace files to the internet. Do not leave servers running or put sensitive files in an unauthenticated service. The iframe is sandboxed to block forms, popups and top-level navigation, but VM-controlled content can still display misleading prompts. The E2B API key stays on the API host and is never passed into the VM or to the client. A unique `COMPUTER_DEPLOYMENT_ID` is required, because sandboxes are matched by metadata across the whole E2B team. See [the E2B desktop section](docs/COMPUTER.md#run-the-computer-on-an-e2b-desktop-optional).

## External actions

Expand Down
6 changes: 3 additions & 3 deletions apps/mobile/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ export default function App() {
<Text
style={{ fontSize: 32, color: colors.text, letterSpacing: -1, fontWeight: "500" }}
>
Welcome to OpenMuse.
Welcome to OpenFuse.
</Text>
<Text style={[s.muted, { textAlign: "center" }]}>A little room for your day.</Text>
{busy ? (
Expand All @@ -130,7 +130,7 @@ export default function App() {
Open workspace
</Button>
<Text style={[s.small, { marginTop: 15 }]}>
Local workspaces open without a key. Make sure your OpenMuse server is running at{" "}
Local workspaces open without a key. Make sure your OpenFuse server is running at{" "}
{API_URL}.
</Text>
</Card>
Expand Down Expand Up @@ -261,7 +261,7 @@ function WorkspaceShell({
data?.tasks.find(
(task) => task.status === "waiting_approval" || task.status === "waiting_input",
) || data?.tasks.find((task) => task.status === "running");
const agentName = data?.identity.name || "OpenMuse";
const agentName = data?.identity.name || "OpenFuse";
const status = activeTask
? activeTask.status === "waiting_approval"
? `Ready to review · ${activeTask.title}`
Expand Down
10 changes: 5 additions & 5 deletions apps/mobile/README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# OpenMuse mobile
# OpenFuse mobile

A shared React Native workspace for iOS, Android, and the web preview. The client uses native primitives and the CopilotKit headless hooks; the web preview renders those same screens through React Native Web.

## Demos

[![OpenMuse on iPhone — watch the 38-second demo](../../assets/demos/2026-09-16/mobile.png)](../../assets/demos/2026-09-16/mobile.mp4)
![OpenFuse on iPhone](../../assets/demos/2026-09-16/mobile.png)

[iPhone · 38 seconds](../../assets/demos/2026-09-16/mobile.mp4) · [Desktop web · 42 seconds](../../assets/demos/2026-09-16/web.mp4) · [Recording setup](../../docs/DEMO.md)
[Recording setup](../../docs/DEMO.md)

Meet OpenMuse's capybara in two different journeys: Hacker News and CopilotKit on iPhone; reading a school-trip email and researching aquarium exhibits on desktop. Results appear inline in chat, with **Take control** opening the same browser session. Send and Stop share the input pill's primary control.
Meet OpenFuse's capybara in two different journeys: Hacker News and CopilotKit on iPhone; reading a school-trip email and researching aquarium exhibits on desktop. Results appear inline in chat, with **Take control** opening the same browser session. Send and Stop share the input pill's primary control.

## Run

Expand Down Expand Up @@ -39,7 +39,7 @@ The `build:ios` and `build:android` commands validate and export platform JavaSc
## Behavior

- Chat, Activity, Ideas, Goals and Apps are the primary navigation. Tasks, timelines and notifications refresh from the durable server state. Apps contains Mail, Calendar, Browser, Files and Connections.
- Drafts are saved in OpenMuse and can be reopened from Mail. Mail attachments import into Files before reading.
- Drafts are saved in OpenFuse and can be reopened from Mail. Mail attachments import into Files before reading.
- Calendar edits preserve named time zones. Date entry rejects nonexistent times at daylight-saving transitions.
- Sending mail and creating, changing, or deleting events require a stored proposal and an explicit review decision. Editing a proposal declines the previous version, then opens a new draft.
- Chat restores/saves AG-UI conversation messages, renders frontend tool cards, and supports interruption, retry, and document references.
Expand Down
4 changes: 2 additions & 2 deletions apps/mobile/app.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"expo": {
"name": "OpenMuse",
"name": "OpenFuse",
"slug": "openmuse",
"scheme": "openmuse",
"version": "0.1.0",
Expand All @@ -9,7 +9,7 @@
"newArchEnabled": true,
"ios": { "supportsTablet": true, "bundleIdentifier": "app.openmuse.mobile" },
"android": { "package": "app.openmuse.mobile" },
"web": { "bundler": "metro", "name": "OpenMuse — a little room for everything" },
"web": { "bundler": "metro", "name": "OpenFuse — a little room for everything" },
"plugins": [
"expo-document-picker",
"@config-plugins/react-native-blob-util",
Expand Down
4 changes: 2 additions & 2 deletions apps/mobile/assets/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# OpenMuse capybara
# OpenFuse capybara

`capybara.png` is original artwork generated for OpenMuse with the built-in image-generation tool on September 16, 2026. The transparent PNG is bundled locally and used by the shared `Mascot` component. Sky, sand and lilac backgrounds preserve the avatar color preference. The asset is included under this repository's MIT license.
`capybara.png` is original artwork generated for OpenFuse with the built-in image-generation tool on September 16, 2026. The transparent PNG is bundled locally and used by the shared `Mascot` component. Sky, sand and lilac backgrounds preserve the avatar color preference. The asset is included under this repository's MIT license.

Generation prompt: “An original friendly capybara assistant mascot, with a broad boxy rounded snout, small round ears, tiny relaxed eyes, a squat body and short legs. Sitting in a gentle three-quarter view, with warm caramel and oat tan coloring, a calm expression, a soft clay/plush finish and restrained detail readable at 48–96 pixels. Entire character centered on a transparent background. One character, no clothing, props, text, logos or watermark.”
8 changes: 4 additions & 4 deletions apps/mobile/src/agent-ui.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -934,7 +934,7 @@ export function DelegateSheet({ goalId, milestoneId }: { goalId?: string; milest
return (
<Sheet
title="Hand over an outcome"
subtitle="OpenMuse saves a plan and keeps working on the server."
subtitle="OpenFuse saves a plan and keeps working on the server."
onClose={close}
>
{milestoneId && (
Expand Down Expand Up @@ -1147,7 +1147,7 @@ function IdeaCard({ idea }: { idea: Idea }) {
<EvidenceList items={idea.evidence} />
{editing && (
<Field
label="What should OpenMuse do?"
label="What should OpenFuse do?"
value={prompt}
onChangeText={setPrompt}
multiline
Expand Down Expand Up @@ -1571,7 +1571,7 @@ function MonitorForm({ onDone }: { onDone: () => void }) {
<Text style={[s.small, { marginBottom: 14 }]}>
{sample
? "Changes to this built-in page stay in your workspace."
: "OpenMuse checks this public page on the server and saves meaningful changes in Notifications."}
: "OpenFuse checks this public page on the server and saves meaningful changes in Notifications."}
</Text>
<ErrorNotice error={error} />
<Button
Expand Down Expand Up @@ -1723,7 +1723,7 @@ export function AppsScreen() {
const { data, mutate } = useAgentWorkspace();
const [query, setQuery] = useState("");
const [settings, setSettings] = useState(false);
const [name, setName] = useState(data?.identity.name || "OpenMuse");
const [name, setName] = useState(data?.identity.name || "OpenFuse");
const [tone, setTone] = useState(data?.identity.tone || "warm");
const [avatar, setAvatar] = useState(data?.identity.avatar || "sky");
const [showChatUpdates, setShowChatUpdates] = useState(data?.identity.showChatUpdates !== false);
Expand Down
Loading
Loading