Skip to content

Ship the product as OpenFuse without breaking existing installs - #224

Merged
tylerslaton merged 4 commits into
mainfrom
jerel/openfuse-rename
Nov 13, 2026
Merged

tylerslaton merged 4 commits into
mainfrom
jerel/openfuse-rename

Conversation

@jerelvelarde

@jerelvelarde jerelvelarde commented Nov 13, 2026 •

Copy link
Copy Markdown
Collaborator

The problem

The product is now called OpenFuse, and every surface still says OpenMuse: the app name and welcome screen, the agent's default name and the prompt it answers with, the API root, the PDF author, the Render services, the access-key variable, Docker image tags, package names and the docs. Anyone who deploys today sees the old name.

A find-and-replace is not enough here, because several of those strings are persisted identifiers. Google refresh tokens are encrypted with the product name as associated data. A self-hoster's .env and every Render service hold OPENMUSE_ACCESS_KEY. The default data directory holds the database and the signing key. Each Docker computer's container, workspace volume and labels, and each E2B sandbox's metadata, are derived from the name. Choice messages saved in existing threads start with [OpenMuse choice]. Renaming those alone would sign people out, ask them to reconnect Google, hide their workspace files, and show raw choice payloads in old threads.

The approach

Four commits, so each can be reviewed and reverted on its own.

The rename. Every form of the name changes in docs, UI copy, prompts, package names, render.yaml, compose, the computer Dockerfile, image tags, env names and test fixtures. The Expo app changes name, slug, scheme and its iOS and Android ids (app.openfuse.mobile): nothing in the repository shows the app was submitted to the App Store, TestFlight or Google Play, and there is no eas.json. assets/openmuse-demo.mp4 becomes assets/openfuse-demo.mp4; its title metadata is rewritten with a stream copy, so the decoded frames are byte-identical. The PDF worker fixture's text is updated. Links to github.com/CopilotKit/OpenMuse stay as they are, because they redirect once the repository is renamed and a later pass swaps them; their visible text changes. The talk-to-an-engineer link now carries ref=openfuse_hero.

Existing installs keep working. Each fallback reads the new name first and carries a short legacy comment.

  • OPENFUSE_ACCESS_KEY, else the previous variable.
  • Without DATA_DIR or WORKER_DATA_DIR, an existing old-named directory is used when .openfuse/ does not exist. Both names stay in .gitignore and Biome's excludes, so a contributor's old data directory, with its signing key and database, cannot be committed by accident.
  • Credentials decrypt with the new associated data, then the old.
  • Old choice messages still parse on the server and still render as "Selected: ...".
  • The computer. At startup a new install writes a computer-name file next to computer-deployment-id, before its signing key exists. An install with a signing key and no such file predates the rename, so it keeps its container, volume, labels, E2B metadata and files.py path. This reuses the rule that already tells old installs apart for deployment ids, and it adds no Docker or E2B lookup to every call. The cost is real: an existing install keeps naming its computer resources the old way until its data directory is reset. Without COMPUTER_IMAGE, such an install also accepts containers created from the old default image tag, and the image links the old files.py path, so rebuilding from the new Dockerfile does not break it. A new install never accepts the old tag.

Telemetry, in its own commit: accessibility_title is now "OpenFuse", and the PostHog queries in docs/TELEMETRY.md filter on it.

Media and client hooks. The demo videos, GIFs and cover images under assets/demos/, assets/document.png and assets/openfuse-demo.mp4 show the old name in the picture, so they are removed along with every link to them, including the two README videos hosted as GitHub attachments and the alpha walkthrough on a personal release. MuseApi and useMuseThread become FuseApi and useFuseThread. This follows the media removal in #223.

What is not covered

  • No new recordings. The demos that showed the old name are removed rather than re-recorded; new captures are separate work.
  • Render: service, disk and DATA_DIR names in render.yaml changed. A Blueprint that re-syncs from this file may create new services instead of renaming the existing ones. Existing services keep working through the fallbacks if they are not re-synced.
  • Compose: the project name changed, so the browser worker's profile volume is new and site logins in the old volume are not carried over.
  • Not run locally: the Docker computer smoke test, the browser-worker container, the real-Chromium worker tests and the Expo exports. CI runs all four.

Verification

Local, Node 24 and pnpm 11.19: pnpm lint, pnpm typecheck, pnpm --dir apps/worker typecheck and pnpm build:server pass. pnpm test: 523 passed, 0 failed (main: 520), also after the media commit. The rename commit alone also passes lint, typecheck and all 520 existing tests. pnpm install --frozen-lockfile succeeds with no lockfile change.

  • tests/config.test.ts: the access key and data directory fallbacks, and that the new name wins when both exist.
  • tests/vault.test.ts: a credential sealed with the old associated data decrypts; one sealed with any other does not.
  • tests/jev.test.ts, apps/mobile/test/jev-actions.test.ts: old-prefix choices parse and display.
  • tests/auth-startup.test.ts: a new install gets the new computer names and the computer-name file, and keeps them after restart; an install with a signing key keeps the old names, with or without COMPUTER_DEPLOYMENT_ID.
  • tests/computer.test.ts: a pre-rename install attaches to its existing container on the old image and runs the old files.py path; a new install refuses that image.

The remaining matches for the old name are the legacy fallbacks and their tests, and github.com URLs.

Merge notes

The telemetry tag is shared with CopilotKit/oss-path-to-production: lib/common/signup-products.ts must map "OpenFuse" too, or the weekly usage report drops these events. CopilotKit/Intelligence's ops telemetry catalog (RUNTIME_APPS in libs/ops-contracts/src/telemetry-catalog.ts) needs the same change, or its chart for this app goes empty. The README's ref=openfuse_hero relies on the website accepting the new id.

Rename the product in docs, UI strings, the agent's default name and
prompt, the API root, package names, the Expo app name, slug, scheme
and bundle/package ids, Render services, disks and env names, compose,
Docker image tags, test fixtures and temp prefixes. Rename the demo
video file and its title metadata, and the PDF test fixture text.

github.com URLs to the repository are unchanged; they redirect after
the repository rename.
Existing installs keep what they already created under the old name:

- OPENFUSE_ACCESS_KEY falls back to the previous variable name.
- Without DATA_DIR or WORKER_DATA_DIR, an existing data directory under
  the previous name is still used, and it stays ignored by git and Biome.
- Credentials encrypted under the previous associated data still decrypt.
- Choice messages saved in older threads still parse and display.
- An install that started before the rename keeps its computer's
  container, volume, labels, E2B metadata and files.py path; a new
  install records a computer-name file and uses the new names. Without
  COMPUTER_IMAGE it still accepts its existing containers' default image,
  and the image links the previous files.py path.
Runtime telemetry now carries accessibility_title "OpenFuse". The
PostHog queries in docs/TELEMETRY.md filter on the new tag.
… hooks

The demo videos, GIFs and cover images, and the document screenshot, show
the old product name in the picture. They are removed along with every
link to them, as are the two README videos hosted on GitHub. MuseApi and
useMuseThread become FuseApi and useFuseThread.
@tylerslaton
tylerslaton merged commit 7771e2d into main Nov 13, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants