diff --git a/.codex b/.codex
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3b25d32598..ce40eb2937 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
# Roo Code Changelog
+## 3.53.1
+
+### Patch Changes
+
+- Add the Zoo Code migration handoff flow, including a VS Code command, activation notification, and release announcement actions to prepare Roo data for import into Zoo Code.
+
## 3.53.0
### Minor Changes
diff --git a/packages/types/src/vscode-extension-host.ts b/packages/types/src/vscode-extension-host.ts
index b20539afe4..6264371b46 100644
--- a/packages/types/src/vscode-extension-host.ts
+++ b/packages/types/src/vscode-extension-host.ts
@@ -427,6 +427,8 @@ export interface WebviewMessage {
| "terminalOperation"
| "clearTask"
| "didShowAnnouncement"
+ | "prepareZooMigration"
+ | "installZooExtension"
| "selectImages"
| "exportCurrentTask"
| "shareCurrentTask"
diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts
index 1106d34005..cf9b6f901a 100644
--- a/src/core/webview/ClineProvider.ts
+++ b/src/core/webview/ClineProvider.ts
@@ -169,7 +169,7 @@ export class ClineProvider
public isViewLaunched = false
public settingsImportedAt?: number
- public readonly latestAnnouncementId = "apr-2026-v3.53.0-community-handoff-gpt55-opus47" // v3.53.0 Community handoff, GPT-5.5, Claude Opus 4.7, checkpoint navigation
+ public readonly latestAnnouncementId = "may-2026-v3.53.1-zoo-migration-handoff" // v3.53.1 Zoo migration handoff
public readonly providerSettingsManager: ProviderSettingsManager
public readonly customModesManager: CustomModesManager
diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts
index e3b8c1bea8..f7e48b7f74 100644
--- a/src/core/webview/webviewMessageHandler.ts
+++ b/src/core/webview/webviewMessageHandler.ts
@@ -54,6 +54,10 @@ import { openImage, saveImage } from "../../integrations/misc/image-handler"
import { selectImages } from "../../integrations/misc/process-images"
import { getTheme } from "../../integrations/theme/getTheme"
import { searchWorkspaceFiles } from "../../services/search/file-search"
+import {
+ installOrShowZooExtension,
+ promptAndCreateZooMigrationHandoff,
+} from "../../services/zoo-migration/ZooMigration"
import { fileExistsAtPath } from "../../utils/fs"
import { playTts, setTtsEnabled, setTtsSpeed, stopTts } from "../../utils/tts"
import { searchCommits } from "../../utils/git"
@@ -766,6 +770,22 @@ export const webviewMessageHandler = async (
await updateGlobalState("lastShownAnnouncementId", provider.latestAnnouncementId)
await provider.postStateToWebview()
break
+ case "prepareZooMigration":
+ try {
+ await promptAndCreateZooMigrationHandoff({
+ context: provider.context,
+ contextProxy: provider.contextProxy,
+ providerSettingsManager: provider.providerSettingsManager,
+ })
+ } catch (error) {
+ const message = error instanceof Error ? error.message : String(error)
+ provider.log(`[Zoo Migration] Failed to prepare migration handoff from announcement: ${message}`)
+ await vscode.window.showErrorMessage(t("common:zooMigration.handoffFailed", { error: message }))
+ }
+ break
+ case "installZooExtension":
+ await installOrShowZooExtension()
+ break
case "selectImages":
const images = await selectImages()
await provider.postMessageToWebview({
diff --git a/webview-ui/src/components/chat/Announcement.tsx b/webview-ui/src/components/chat/Announcement.tsx
index 180767be44..715a572f5d 100644
--- a/webview-ui/src/components/chat/Announcement.tsx
+++ b/webview-ui/src/components/chat/Announcement.tsx
@@ -1,7 +1,7 @@
import { memo, type ReactNode, useState } from "react"
import { Trans } from "react-i18next"
import { SiDiscord, SiReddit, SiX } from "react-icons/si"
-import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"
+import { VSCodeButton, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
import { Package } from "@roo/package"
import { useAppTranslation } from "@src/i18n/TranslationContext"
@@ -40,7 +40,7 @@ const Announcement = ({ hideAnnouncement }: AnnouncementProps) => {