From f2df08372e771e011bb48e6ec73bc0f5c665da99 Mon Sep 17 00:00:00 2001 From: thesiti92 Date: Wed, 23 Sep 2026 23:26:47 -0400 Subject: [PATCH 1/2] Name the stamped Desktop and its release artifacts Whiteboard #507 set nameShort and nameLong to Whiteboard in product.json, but every release and preview job runs stamp-release-channel.mjs first, and that overwrote them from release-channel.mjs, which still said Review and Review Preview. Published builds therefore kept shipping as Review.app and Review Preview.app. Give both channel identities their Whiteboard names, so the packaged bundle, the Info.plist names, the app menu and the Linux desktop entry follow. Rename the artifacts to match: Whiteboard-darwin-arm64-.zip and .dmg, the releases/latest and preview-latest Whiteboard.dmg aliases, and the df-whiteboard download filenames. applicationName, dataFolderName, darwinBundleIdentifier and urlProtocol stay as they are: they name the Linux binary and RPM, the user data directory, the bundle Squirrel verifies updates against and the share link scheme, so renaming them would break existing installs. Existing installs keep their on-disk Review.app filename, since Squirrel replaces the bundle contents in place. Only a fresh drag from the DMG produces Whiteboard.app. install.dev.fast serves the new alias once the update Worker deploys with its Review.dmg fallback. Agent-Session: dc92f1ba-7080-4b63-b006-4dae65124781 Agent-Session: 78ffd160-974b-41b4-b7dd-d536de7c2833 Agent-Session: dd71f4e3-5ca2-4bf2-a4ca-1eb0bacd43ec Agent-Session: a95580ef-9598-48ce-a13d-1c74ea1ef2fa Agent-Session: aad32659-bbbe-45b2-b163-317afc1a6a83 --- .github/workflows/review-desktop-preview.yml | 18 +++++++++--------- .github/workflows/review-desktop-release.yml | 18 +++++++++--------- .../scripts/e2e/journeys/cli-desktop-edges.mjs | 2 +- .../scripts/linux-package.test.mjs | 4 ++-- apps/review-desktop/scripts/notarize-macos.sh | 4 ++-- .../review-desktop/scripts/release-channel.mjs | 8 ++++---- .../scripts/validate-release-artifacts.mjs | 6 +++--- .../validate-release-artifacts.test.mjs | 2 +- packages/review/src/cli-runner.ts | 2 +- .../review-latency/review_latency/runner.py | 2 +- 10 files changed, 33 insertions(+), 33 deletions(-) diff --git a/.github/workflows/review-desktop-preview.yml b/.github/workflows/review-desktop-preview.yml index 36017f38c..1fa740dff 100644 --- a/.github/workflows/review-desktop-preview.yml +++ b/.github/workflows/review-desktop-preview.yml @@ -397,17 +397,17 @@ jobs: run: | DIST=apps/review-desktop/dist RELEASE_PREFIX="s3://${R2_BUCKET}/releases/${RELEASE_VERSION}/darwin-arm64" - DMG_DISPOSITION="attachment; filename=\"df-review-preview-${RELEASE_VERSION}.dmg\"" + DMG_DISPOSITION="attachment; filename=\"df-whiteboard-preview-${RELEASE_VERSION}.dmg\"" - aws s3 cp "$DIST/Review-darwin-arm64-${RELEASE_VERSION}.zip" \ - "${RELEASE_PREFIX}/Review-darwin-arm64-${RELEASE_VERSION}.zip" \ + aws s3 cp "$DIST/Whiteboard-darwin-arm64-${RELEASE_VERSION}.zip" \ + "${RELEASE_PREFIX}/Whiteboard-darwin-arm64-${RELEASE_VERSION}.zip" \ --content-type application/zip - aws s3 cp "$DIST/Review-darwin-arm64-${RELEASE_VERSION}.dmg" \ - "${RELEASE_PREFIX}/Review-darwin-arm64-${RELEASE_VERSION}.dmg" \ + aws s3 cp "$DIST/Whiteboard-darwin-arm64-${RELEASE_VERSION}.dmg" \ + "${RELEASE_PREFIX}/Whiteboard-darwin-arm64-${RELEASE_VERSION}.dmg" \ --content-type application/x-apple-diskimage \ --content-disposition "$DMG_DISPOSITION" - aws s3 cp "$DIST/Review-darwin-arm64-${RELEASE_VERSION}.dmg" \ - "s3://${R2_BUCKET}/releases/preview-latest/darwin-arm64/Review.dmg" \ + aws s3 cp "$DIST/Whiteboard-darwin-arm64-${RELEASE_VERSION}.dmg" \ + "s3://${R2_BUCKET}/releases/preview-latest/darwin-arm64/Whiteboard.dmg" \ --content-type application/x-apple-diskimage \ --content-disposition "$DMG_DISPOSITION" @@ -435,7 +435,7 @@ jobs: echo "install.dev.fast/preview (expect 302 to the preview disk image):" LOCATION=$(curl -s -o /dev/null -w "%{redirect_url}" https://install.dev.fast/preview) echo "$LOCATION" - test "$LOCATION" = "https://install.dev.fast/releases/preview-latest/darwin-arm64/Review.dmg" + test "$LOCATION" = "https://install.dev.fast/releases/preview-latest/darwin-arm64/Whiteboard.dmg" echo "Following it (expect 200 and a disk image):" curl -sfL -o /dev/null -w "%{http_code} %{content_type}\n" https://install.dev.fast/preview \ @@ -445,7 +445,7 @@ jobs: uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: review-desktop-preview-${{ env.RELEASE_VERSION }}-dmg - path: apps/review-desktop/dist/Review-darwin-arm64-${{ env.RELEASE_VERSION }}.dmg + path: apps/review-desktop/dist/Whiteboard-darwin-arm64-${{ env.RELEASE_VERSION }}.dmg retention-days: 3 compression-level: 0 diff --git a/.github/workflows/review-desktop-release.yml b/.github/workflows/review-desktop-release.yml index 5d857845d..9cd46b028 100644 --- a/.github/workflows/review-desktop-release.yml +++ b/.github/workflows/review-desktop-release.yml @@ -572,17 +572,17 @@ jobs: RELEASE_PREFIX="s3://${R2_BUCKET}/releases/${RELEASE_VERSION}/darwin-arm64" # The releases/latest/ key is version-free by design, so the version # rides along in the filename a client saves the download as. - DMG_DISPOSITION="attachment; filename=\"df-review-${RELEASE_VERSION}.dmg\"" + DMG_DISPOSITION="attachment; filename=\"df-whiteboard-${RELEASE_VERSION}.dmg\"" - aws s3 cp "$DIST/Review-darwin-arm64-${RELEASE_VERSION}.zip" \ - "${RELEASE_PREFIX}/Review-darwin-arm64-${RELEASE_VERSION}.zip" \ + aws s3 cp "$DIST/Whiteboard-darwin-arm64-${RELEASE_VERSION}.zip" \ + "${RELEASE_PREFIX}/Whiteboard-darwin-arm64-${RELEASE_VERSION}.zip" \ --content-type application/zip - aws s3 cp "$DIST/Review-darwin-arm64-${RELEASE_VERSION}.dmg" \ - "${RELEASE_PREFIX}/Review-darwin-arm64-${RELEASE_VERSION}.dmg" \ + aws s3 cp "$DIST/Whiteboard-darwin-arm64-${RELEASE_VERSION}.dmg" \ + "${RELEASE_PREFIX}/Whiteboard-darwin-arm64-${RELEASE_VERSION}.dmg" \ --content-type application/x-apple-diskimage \ --content-disposition "$DMG_DISPOSITION" - aws s3 cp "$DIST/Review-darwin-arm64-${RELEASE_VERSION}.dmg" \ - "s3://${R2_BUCKET}/releases/latest/darwin-arm64/Review.dmg" \ + aws s3 cp "$DIST/Whiteboard-darwin-arm64-${RELEASE_VERSION}.dmg" \ + "s3://${R2_BUCKET}/releases/latest/darwin-arm64/Whiteboard.dmg" \ --content-type application/x-apple-diskimage \ --content-disposition "$DMG_DISPOSITION" @@ -610,7 +610,7 @@ jobs: echo "install.dev.fast (expect 302 to the disk image):" LOCATION=$(curl -s -o /dev/null -w "%{redirect_url}" https://install.dev.fast/) echo "$LOCATION" - test "$LOCATION" = "https://install.dev.fast/releases/latest/darwin-arm64/Review.dmg" + test "$LOCATION" = "https://install.dev.fast/releases/latest/darwin-arm64/Whiteboard.dmg" echo "Following it (expect 200 and a disk image):" curl -sfL -o /dev/null -w "%{http_code} %{content_type}\n" https://install.dev.fast/ \ @@ -623,7 +623,7 @@ jobs: run: | gh release upload "$RELEASE_TAG" \ --repo "${{ github.repository }}" \ - "apps/review-desktop/dist/Review-darwin-arm64-${RELEASE_VERSION}.dmg" + "apps/review-desktop/dist/Whiteboard-darwin-arm64-${RELEASE_VERSION}.dmg" - name: Remove signing credentials if: always() diff --git a/apps/review-desktop/scripts/e2e/journeys/cli-desktop-edges.mjs b/apps/review-desktop/scripts/e2e/journeys/cli-desktop-edges.mjs index 984d6d215..c3ef80ec5 100644 --- a/apps/review-desktop/scripts/e2e/journeys/cli-desktop-edges.mjs +++ b/apps/review-desktop/scripts/e2e/journeys/cli-desktop-edges.mjs @@ -53,7 +53,7 @@ async function installedDesktopPids(home) { // LaunchServices can pick a bundle anywhere, so this only has to find a Review bundle; the two filters below narrow it. const stdout = await listing( "/usr/bin/pgrep", - ["-f", "Review.app/Contents"], + ["-f", "(Review|Whiteboard)\\.app/Contents"], "no process matches", ); diff --git a/apps/review-desktop/scripts/linux-package.test.mjs b/apps/review-desktop/scripts/linux-package.test.mjs index 9fbaedd33..daee12f8c 100644 --- a/apps/review-desktop/scripts/linux-package.test.mjs +++ b/apps/review-desktop/scripts/linux-package.test.mjs @@ -10,7 +10,7 @@ test("stable versions package as dev-fast-review", () => { assert.deepEqual(reviewPackage(product("stable"), "1.2.3", "2"), { name: "dev-fast-review", app: "review", - appName: "Review", + appName: "Whiteboard", appId: "dev.fast.review", rpmVersion: "1.2.3", revision: "2", @@ -24,7 +24,7 @@ test("preview versions package separately with a tilde RPM version", () => { { name: "dev-fast-review-preview", app: "review-preview", - appName: "Review Preview", + appName: "Whiteboard Preview", appId: "dev.fast.review.preview", rpmVersion: "1.2.4~preview.20260922.7", revision: "1", diff --git a/apps/review-desktop/scripts/notarize-macos.sh b/apps/review-desktop/scripts/notarize-macos.sh index 21096c00b..059297ce5 100755 --- a/apps/review-desktop/scripts/notarize-macos.sh +++ b/apps/review-desktop/scripts/notarize-macos.sh @@ -8,8 +8,8 @@ PRODUCT_NAME="$(node -p "require('$CHECKOUT/product.json').nameShort")" PACKAGED_APP="$APP_DIR/VSCode-darwin-arm64/$PRODUCT_NAME.app" VERSION="$(node -p "require('$APP_DIR/package.json').version")" ARTIFACT_DIR="${DEV_FAST_REVIEW_ARTIFACT_DIR:-$APP_DIR/dist}" -UPDATE_ZIP="$ARTIFACT_DIR/Review-darwin-arm64-$VERSION.zip" -DMG="$ARTIFACT_DIR/Review-darwin-arm64-$VERSION.dmg" +UPDATE_ZIP="$ARTIFACT_DIR/Whiteboard-darwin-arm64-$VERSION.zip" +DMG="$ARTIFACT_DIR/Whiteboard-darwin-arm64-$VERSION.dmg" if (( $# > 0 )); then echo "usage: $0" >&2 diff --git a/apps/review-desktop/scripts/release-channel.mjs b/apps/review-desktop/scripts/release-channel.mjs index b10e19ad6..10512d2d8 100644 --- a/apps/review-desktop/scripts/release-channel.mjs +++ b/apps/review-desktop/scripts/release-channel.mjs @@ -1,7 +1,7 @@ const RELEASE_IDENTITIES = Object.freeze({ stable: Object.freeze({ - nameShort: "Review", - nameLong: "/dev/fast Review", + nameShort: "Whiteboard", + nameLong: "/dev/fast Whiteboard", applicationName: "review", dataFolderName: ".dev-fast-review", sharedDataFolderName: ".dev-fast-review-shared", @@ -9,8 +9,8 @@ const RELEASE_IDENTITIES = Object.freeze({ urlProtocol: "dev-fast-review", }), preview: Object.freeze({ - nameShort: "Review Preview", - nameLong: "/dev/fast Review Preview", + nameShort: "Whiteboard Preview", + nameLong: "/dev/fast Whiteboard Preview", applicationName: "review-preview", dataFolderName: ".dev-fast-review-preview", sharedDataFolderName: ".dev-fast-review-preview-shared", diff --git a/apps/review-desktop/scripts/validate-release-artifacts.mjs b/apps/review-desktop/scripts/validate-release-artifacts.mjs index 39834ad35..52b7e0552 100644 --- a/apps/review-desktop/scripts/validate-release-artifacts.mjs +++ b/apps/review-desktop/scripts/validate-release-artifacts.mjs @@ -35,7 +35,7 @@ export function buildManifest({ return { version, commit, - url: `${UPDATE_URL}/releases/${version}/darwin-arm64/Review-darwin-arm64-${version}.zip`, + url: `${UPDATE_URL}/releases/${version}/darwin-arm64/Whiteboard-darwin-arm64-${version}.zip`, name: version, pub_date: now.toISOString(), timestamp: now.getTime(), @@ -136,8 +136,8 @@ async function main() { `${sourceProduct.nameShort}.app`, ); - const zip = path.join(artifactDir, `Review-darwin-arm64-${version}.zip`); - const dmg = path.join(artifactDir, `Review-darwin-arm64-${version}.dmg`); + const zip = path.join(artifactDir, `Whiteboard-darwin-arm64-${version}.zip`); + const dmg = path.join(artifactDir, `Whiteboard-darwin-arm64-${version}.dmg`); await assertPackagedArtifacts(app); assertUpdaterCompatibleApp(app); diff --git a/apps/review-desktop/scripts/validate-release-artifacts.test.mjs b/apps/review-desktop/scripts/validate-release-artifacts.test.mjs index ba40a870a..670bffc53 100644 --- a/apps/review-desktop/scripts/validate-release-artifacts.test.mjs +++ b/apps/review-desktop/scripts/validate-release-artifacts.test.mjs @@ -40,7 +40,7 @@ test("buildManifest emits the schema the update Worker serves", () => { assert.deepEqual(manifest, { version: "1.2.3", commit: "abc123", - url: "https://update.dev.fast/releases/1.2.3/darwin-arm64/Review-darwin-arm64-1.2.3.zip", + url: "https://update.dev.fast/releases/1.2.3/darwin-arm64/Whiteboard-darwin-arm64-1.2.3.zip", name: "1.2.3", pub_date: "2026-07-29T00:00:00.000Z", timestamp: now.getTime(), diff --git a/packages/review/src/cli-runner.ts b/packages/review/src/cli-runner.ts index 7f959959b..6a7c19e9d 100644 --- a/packages/review/src/cli-runner.ts +++ b/packages/review/src/cli-runner.ts @@ -602,7 +602,7 @@ export async function runReviewCli(input: ReviewCliInput): Promise { ) .option("--review ", "Review ID") .option("--version ", "Saved version to share") - .option("--preview", "Open the share link in Review Preview by default") + .option("--preview", "Open the share link in Whiteboard Preview by default") .option( "--request-id ", "Reuse this ID when retrying the same immutable upload", diff --git a/scripts/review-latency/review_latency/runner.py b/scripts/review-latency/review_latency/runner.py index 8381b74f2..5569cdb09 100644 --- a/scripts/review-latency/review_latency/runner.py +++ b/scripts/review-latency/review_latency/runner.py @@ -73,7 +73,7 @@ def desktop_request(method: str, route: str, home: Path) -> dict | None: # Each run gets its own review app: DEV_REVIEW_HOME (reviews store + desktop # discovery) under the run dir, and the desktop's Electron state under a short # /tmp path — the user-data dir carries a unix socket capped at 103 chars. -PACKAGED_DESKTOP = Path("/Applications/dev.fast Review.app/Contents/MacOS/Review") +PACKAGED_DESKTOP = Path("/Applications/Whiteboard.app/Contents/MacOS/Whiteboard") # Development desktop from this checkout: the Code OSS shell built by # `pnpm --filter @dev-fast/review-desktop app:build`, serving this checkout's # review server, so desktop-side instrumentation is measurable. run.sh honors From 4e2082dd58798ed22f297c9340718533ebed8efe Mon Sep 17 00:00:00 2001 From: thesiti92 Date: Wed, 23 Sep 2026 23:30:30 -0400 Subject: [PATCH 2/2] Document the Whiteboard artifact names Agent-Session: dc92f1ba-7080-4b63-b006-4dae65124781 Agent-Session: 78ffd160-974b-41b4-b7dd-d536de7c2833 Agent-Session: dd71f4e3-5ca2-4bf2-a4ca-1eb0bacd43ec Agent-Session: a95580ef-9598-48ce-a13d-1c74ea1ef2fa Agent-Session: aad32659-bbbe-45b2-b163-317afc1a6a83 Agent-Session: 01a0d16a-3c5b-7151-a388-02c852d993ff --- apps/review-desktop/README.md | 29 ++++++++++++++++------------- scripts/review-latency/README.md | 5 +++-- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/apps/review-desktop/README.md b/apps/review-desktop/README.md index 68d16649e..6cb369d35 100644 --- a/apps/review-desktop/README.md +++ b/apps/review-desktop/README.md @@ -113,9 +113,9 @@ packaging script but no distribution. Signed builds auto-update from SKIP_NOTARIZE=1 pnpm --filter @dev.fast/review-desktop app:package:macos ``` -builds an unsigned `VSCode-darwin-arm64/Review.app` and skips +builds an unsigned `VSCode-darwin-arm64/Whiteboard.app` and skips signing, notarization, and artifact creation. A full run needs the signing -environment and produces `dist/Review-darwin-arm64-.zip` (the +environment and produces `dist/Whiteboard-darwin-arm64-.zip` (the Squirrel update payload) and the matching `.dmg`, both notarized and stapled: - `CODESIGN_IDENTITY` — the Developer ID Application identity string. @@ -211,14 +211,16 @@ publishing an older commit intentionally rolls preview installations back to that build. Install the latest preview from . It installs -as `Review Preview.app`, displays as `/dev/fast Review Preview`, and uses an +as `Whiteboard Preview.app`, displays as `/dev/fast Whiteboard Preview`, and uses an orange app-icon background so it stays visually distinct from stable in Finder, the Dock, and the app switcher. Preview uses its own bundle identifier, URL scheme, CLI name, and data folders, so it can run beside stable without replacing the stable app or sharing its settings. Preview updates continue to use the preview feed. To return to stable, -open the existing `Review.app` or install it from . +open the existing `Whiteboard.app` or install it from . +Auto-updated Review installs keep the `Review.app` file name; reinstall from +the disk image to get `Whiteboard.app`. Builds from before the preview identity split installed as `Review.app`. Reinstall once from after the split so the @@ -268,26 +270,27 @@ host discrimination; the two names exist to give humans and Squirrel separate front doors. `GET /` is the stable install landing: it redirects to the -`releases/latest/darwin-arm64/Review.dmg` alias, while `GET /preview` redirects -to `releases/preview-latest/darwin-arm64/Review.dmg`. For example, +`releases/latest/darwin-arm64/Whiteboard.dmg` alias, while `GET /preview` redirects +to `releases/preview-latest/darwin-arm64/Whiteboard.dmg`. For example, `curl -fLOJ https://install.dev.fast` downloads the current disk image. It deliberately does not read `latest.json` — the alias is uploaded with the payloads, so the download keeps working while the manifest is mid-upload. The keys stay version-free for that reason, so the version rides on each object's `Content-Disposition` instead and the saved file names itself. Stable uses -`df-review-.dmg`; preview uses -`df-review-preview-.dmg`. curl only honours that with `-J`; a +`df-whiteboard-.dmg`; preview uses +`df-whiteboard-preview-.dmg`. curl only honours that with `-J`; a browser download always does. ``` update/stable/darwin-arm64/latest.json current-release manifest update/preview/darwin-arm64/latest.json current-preview manifest -releases//darwin-arm64/ Review-darwin-arm64-.zip + .dmg -releases/latest/darwin-arm64/Review.dmg direct-download alias, saved as - df-review-.dmg -releases/preview-latest/darwin-arm64/Review.dmg +releases//darwin-arm64/ Whiteboard-darwin-arm64-.zip + .dmg +releases/latest/darwin-arm64/Whiteboard.dmg + direct-download alias, saved as + df-whiteboard-.dmg +releases/preview-latest/darwin-arm64/Whiteboard.dmg preview-download alias, saved as - df-review-preview-.dmg + df-whiteboard-preview-.dmg ``` `GET /api/update/:platform/:quality/:commit` answers 204 when the caller's diff --git a/scripts/review-latency/README.md b/scripts/review-latency/README.md index e78f4b59f..5a6083e73 100644 --- a/scripts/review-latency/README.md +++ b/scripts/review-latency/README.md @@ -13,8 +13,9 @@ uv run review-latency render ~/.dev/review-latency/runs/ # re-render uv run review-latency dashboards # compare.html + flamegraph.html over all runs ``` -Requirements: the packaged Review app installed at `/Applications/dev.fast -Review.app` (each run launches its own isolated instance), `claude` on PATH, +Requirements: the packaged Whiteboard app installed at +`/Applications/Whiteboard.app` (each run launches its own isolated instance), +`claude` on PATH, `tsx` on PATH (for `review_cli = "source"`), and the dev-review skill installed for Claude Code.