From a7bee2a63d50d94430697cf43c0d290b2a09502b Mon Sep 17 00:00:00 2001
From: PurplePrintAI <269393167+PurplePrintAI@users.noreply.github.com>
Date: Sun, 27 Sep 2026 16:41:12 +0900
Subject: [PATCH 01/22] feat: introduce PurplePrint Studio identity
---
.github/workflows/build-fork-macos.yml | 18 +-
.gitignore | 2 +
FORK-CHANGELOG.md | 14 +-
FORK.md | 9 +-
MACOS-INSTALLATION.md | 3 +
README.md | 16 +-
docs/purpleprint-studio-identity.md | 44 +++++
electron-builder.fork.json | 10 +-
electron/about.test.ts | 6 +
electron/about.ts | 9 +-
electron/ai-edition/agent-tools.ts | 2 +-
electron/ai-edition/claude/cli.ts | 4 +-
electron/ai-edition/codex/app-server.ts | 8 +-
electron/ai-edition/deep-agent/service.ts | 4 +-
electron/cli/args.ts | 2 +-
electron/fork-release.test.ts | 5 +-
electron/ipc/handlers.ts | 6 +-
electron/main.ts | 14 +-
.../services/aiEditionService.ts | 2 +-
icons/icons/mac/icon.icns | Bin 1335122 -> 119251 bytes
icons/icons/png/1024x1024.png | Bin 832645 -> 53481 bytes
icons/icons/png/128x128.png | Bin 13964 -> 5666 bytes
icons/icons/png/16x16.png | Bin 630 -> 594 bytes
icons/icons/png/24x24.png | Bin 1092 -> 938 bytes
icons/icons/png/256x256.png | Bin 53916 -> 11672 bytes
icons/icons/png/32x32.png | Bin 1643 -> 1200 bytes
icons/icons/png/48x48.png | Bin 2941 -> 1884 bytes
icons/icons/png/512x512.png | Bin 229117 -> 25511 bytes
icons/icons/png/64x64.png | Bin 4412 -> 2580 bytes
icons/icons/win/icon.ico | Bin 361102 -> 24633 bytes
index.html | 20 ++-
public/purpleprint-studio.png | Bin 0 -> 2580 bytes
public/purpleprint-studio.svg | 5 +
scripts/generate-studio-icons.py | 74 ++++++++
src/App.tsx | 2 +-
.../ai-edition/AnnotationOverlay.tsx | 19 +-
.../ai-edition/EditorEmptyState.tsx | 8 +-
src/components/ai-edition/ExportDialog.tsx | 2 +-
.../ai-edition/NewEditorShell.module.css | 30 ++--
src/components/ai-edition/NewEditorShell.tsx | 20 ++-
.../ai-edition/ProviderSettings.test.tsx | 6 +-
.../ai-edition/TranscriptionStatus.tsx | 2 +-
.../ai-edition/ZoomFocusOverlay.module.css | 4 +-
.../ai-edition/v4/EditorShellV4.module.css | 65 +++++--
.../ai-edition/v4/EditorTopBar.test.tsx | 18 +-
src/components/ai-edition/v4/EditorTopBar.tsx | 15 +-
src/components/launch/HudControls.tsx | 2 +-
src/components/launch/LaunchWindow.module.css | 6 +-
src/components/launch/LaunchWindow.test.tsx | 4 +-
.../launch/SourceSelector.module.css | 18 +-
src/components/launch/SourceSelector.test.tsx | 4 +-
src/components/launch/SourceSelector.tsx | 6 +-
src/hooks/useTheme.ts | 4 +-
src/i18n/locales/ar/common.json | 12 +-
src/i18n/locales/ar/dialogs.json | 6 +-
src/i18n/locales/ar/editor.json | 10 +-
src/i18n/locales/ar/launch.json | 8 +-
src/i18n/locales/en/common.json | 12 +-
src/i18n/locales/en/dialogs.json | 6 +-
src/i18n/locales/en/editor.json | 10 +-
src/i18n/locales/en/launch.json | 8 +-
src/i18n/locales/es/common.json | 12 +-
src/i18n/locales/es/dialogs.json | 6 +-
src/i18n/locales/es/editor.json | 10 +-
src/i18n/locales/es/launch.json | 8 +-
src/i18n/locales/fr/common.json | 12 +-
src/i18n/locales/fr/dialogs.json | 6 +-
src/i18n/locales/fr/editor.json | 10 +-
src/i18n/locales/fr/launch.json | 8 +-
src/i18n/locales/it/common.json | 12 +-
src/i18n/locales/it/dialogs.json | 6 +-
src/i18n/locales/it/editor.json | 10 +-
src/i18n/locales/it/launch.json | 8 +-
src/i18n/locales/ja-JP/common.json | 12 +-
src/i18n/locales/ja-JP/dialogs.json | 6 +-
src/i18n/locales/ja-JP/editor.json | 10 +-
src/i18n/locales/ja-JP/launch.json | 8 +-
src/i18n/locales/ko-KR/common.json | 12 +-
src/i18n/locales/ko-KR/dialogs.json | 6 +-
src/i18n/locales/ko-KR/editor.json | 10 +-
src/i18n/locales/ko-KR/launch.json | 8 +-
src/i18n/locales/pt-BR/common.json | 12 +-
src/i18n/locales/pt-BR/dialogs.json | 6 +-
src/i18n/locales/pt-BR/editor.json | 10 +-
src/i18n/locales/pt-BR/launch.json | 8 +-
src/i18n/locales/ru/common.json | 12 +-
src/i18n/locales/ru/dialogs.json | 6 +-
src/i18n/locales/ru/editor.json | 10 +-
src/i18n/locales/ru/launch.json | 8 +-
src/i18n/locales/tr/common.json | 12 +-
src/i18n/locales/tr/dialogs.json | 6 +-
src/i18n/locales/tr/editor.json | 10 +-
src/i18n/locales/tr/launch.json | 8 +-
src/i18n/locales/vi/common.json | 12 +-
src/i18n/locales/vi/dialogs.json | 6 +-
src/i18n/locales/vi/editor.json | 10 +-
src/i18n/locales/vi/launch.json | 8 +-
src/i18n/locales/zh-CN/common.json | 12 +-
src/i18n/locales/zh-CN/dialogs.json | 6 +-
src/i18n/locales/zh-CN/editor.json | 10 +-
src/i18n/locales/zh-CN/launch.json | 8 +-
src/i18n/locales/zh-TW/common.json | 12 +-
src/i18n/locales/zh-TW/dialogs.json | 6 +-
src/i18n/locales/zh-TW/editor.json | 10 +-
src/i18n/locales/zh-TW/launch.json | 8 +-
src/native/browserShim.ts | 2 +-
src/styles/design-tokens.css | 169 +++++++++---------
107 files changed, 688 insertions(+), 463 deletions(-)
create mode 100644 docs/purpleprint-studio-identity.md
create mode 100644 public/purpleprint-studio.png
create mode 100644 public/purpleprint-studio.svg
create mode 100644 scripts/generate-studio-icons.py
diff --git a/.github/workflows/build-fork-macos.yml b/.github/workflows/build-fork-macos.yml
index 1b0d57105..5d7a92dfe 100644
--- a/.github/workflows/build-fork-macos.yml
+++ b/.github/workflows/build-fork-macos.yml
@@ -1,4 +1,4 @@
-name: Build OpenScreen Subscription for macOS
+name: Build PurplePrint Studio for macOS
on:
workflow_dispatch:
@@ -98,8 +98,8 @@ jobs:
run: |
set -euo pipefail
VERSION="$(node -p 'require("./package.json").version')"
- APP="$(find "release/${VERSION}" -maxdepth 3 -name 'OpenScreen Subscription.app' -type d -print -quit)"
- [ -n "$APP" ] || { echo "::error::OpenScreen Subscription.app was not packaged"; exit 1; }
+ APP="$(find "release/${VERSION}" -maxdepth 3 -name 'PurplePrint Studio.app' -type d -print -quit)"
+ [ -n "$APP" ] || { echo "::error::PurplePrint Studio.app was not packaged"; exit 1; }
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
echo "path=${APP}" >> "$GITHUB_OUTPUT"
@@ -114,7 +114,7 @@ jobs:
run: |
set -euo pipefail
APP="${{ steps.app.outputs.path }}"
- BIN="${APP}/Contents/MacOS/OpenScreen Subscription"
+ BIN="${APP}/Contents/MacOS/PurplePrint Studio"
RESOURCES="${APP}/Contents/Resources"
NATIVE="${RESOURCES}/electron/native/bin/darwin-${{ matrix.arch }}"
@@ -147,7 +147,7 @@ jobs:
- name: Smoke-test packaged CLI boot
run: |
set -euo pipefail
- BIN="${{ steps.app.outputs.path }}/Contents/MacOS/OpenScreen Subscription"
+ BIN="${{ steps.app.outputs.path }}/Contents/MacOS/PurplePrint Studio"
"$BIN" help > cli-help.txt
grep -q "OpenScreen CLI" cli-help.txt
@@ -160,7 +160,7 @@ jobs:
arm64) LABEL="Apple-Silicon" ;;
x64) LABEL="Intel" ;;
esac
- OUT="release/${VERSION}/OpenScreen-Subscription-${VERSION}-macOS-${LABEL}.dmg"
+ OUT="release/${VERSION}/PurplePrint-Studio-${VERSION}-macOS-${LABEL}.dmg"
STAGING="release/${VERSION}/dmg-${{ matrix.arch }}"
rm -rf "$STAGING" "$OUT"
mkdir -p "$STAGING"
@@ -168,7 +168,7 @@ jobs:
ln -s /Applications "$STAGING/Applications"
hdiutil create \
-srcfolder "$STAGING" \
- -volname "OpenScreen Subscription" \
+ -volname "PurplePrint Studio" \
-fs HFS+ \
-format UDBZ \
"$OUT"
@@ -185,7 +185,7 @@ jobs:
}
trap cleanup EXIT
hdiutil attach -readonly -nobrowse -mountpoint "$MOUNT" "${{ steps.dmg.outputs.path }}" >/dev/null
- APP="${MOUNT}/OpenScreen Subscription.app"
+ APP="${MOUNT}/PurplePrint Studio.app"
test -d "$APP"
test -L "${MOUNT}/Applications"
codesign --verify --deep --strict "$APP"
@@ -204,7 +204,7 @@ jobs:
import { readFileSync, writeFileSync } from "node:fs";
const bytes = readFileSync(process.env.DMG);
const report = {
- product: "OpenScreen Subscription",
+ product: "PurplePrint Studio",
version: process.env.VERSION,
architecture: process.env.ARCH,
bundleId: "io.github.purpleprintai.openscreen-subscription",
diff --git a/.gitignore b/.gitignore
index a1822ee05..7e99ab72f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -49,6 +49,8 @@ release/**
# Playwright
test-results
playwright-report/
+/.playwright-cli/
+/output/playwright/
# Vitest browser mode screenshots
diff --git a/FORK-CHANGELOG.md b/FORK-CHANGELOG.md
index 08a7597bb..1b6a4e511 100644
--- a/FORK-CHANGELOG.md
+++ b/FORK-CHANGELOG.md
@@ -1,4 +1,4 @@
-# OpenScreen Subscription fork changelog
+# PurplePrint Studio fork changelog
This file tracks changes made by the unofficial
[PurplePrintAI/openscreen-subscription](https://github.com/PurplePrintAI/openscreen-subscription)
@@ -17,6 +17,18 @@ see [FORK.md](FORK.md).
For the dated review of newer upstream changes, see
[FORK-UPSTREAM-REVIEW.md](FORK-UPSTREAM-REVIEW.md).
+## Unreleased — PurplePrint Studio identity
+
+- Adopts the PurplePrint GraphOS family's neutral surfaces, restrained violet
+ accents, typography hierarchy and product mark across the editor and capture
+ entry surfaces. Recording and semantic status colors retain their meanings.
+- Renames visible app, installer, Start menu and macOS package labels to
+ PurplePrint Studio. The technical app ID, data profile, `.openscreen` format,
+ CLI command and GitHub update origin stay stable for compatibility.
+- Keeps upstream attribution explicit. This work does not add Design Coach/MCP
+ integration or claim GraphOS runtime integration.
+- No Studio release has been packaged or validated yet.
+
## 1.10.0-subscription.7 — 2026-09-27
### GPT-6 model catalog
diff --git a/FORK.md b/FORK.md
index 18b52eb9a..65dc2d94b 100644
--- a/FORK.md
+++ b/FORK.md
@@ -1,6 +1,7 @@
-# OpenScreen Subscription — independent fork
+# PurplePrint Studio — independent OpenScreen fork
-This is an **unofficial, independently maintained fork** of
+PurplePrint Studio (formerly OpenScreen Subscription) is an **unofficial,
+independently maintained fork** of
[getopenscreen/openscreen](https://github.com/getopenscreen/openscreen), initially
based on upstream **v1.10.0** (`dbdadb7d27fe3287d994fb741d6f264a31066648`).
It is not an official OpenScreen release and is not endorsed by the upstream
@@ -18,8 +19,8 @@ architecture, policy and release notes behind those changes.
- Retain API-key providers, editor tool validation and checkpoints.
- Separate installation identity, user data and update downloads from upstream.
-The app remains free. "Subscription" names the optional use of the user's own
-eligible ChatGPT plan; this fork does not sell or require its own plan. Codex CLI
+The app remains free. The former "Subscription" name described optional use of the
+user's own eligible ChatGPT plan; Studio does not sell or require its own plan. Codex CLI
is a user-installed dependency, not bundled in the installer. Tokens, API keys,
user settings, recordings and diagnostic transcripts must never be committed or
uploaded as release assets.
diff --git a/MACOS-INSTALLATION.md b/MACOS-INSTALLATION.md
index 37a0bc9ff..f88fd2fa6 100644
--- a/MACOS-INSTALLATION.md
+++ b/MACOS-INSTALLATION.md
@@ -1,5 +1,8 @@
# OpenScreen Subscription on macOS
+> This guide covers published `1.10.0-subscription.*` validation builds under the
+> former name. PurplePrint Studio packaging is still under development.
+
OpenScreen Subscription is an unofficial fork. The current macOS packages are
validation prereleases with the fork bundle identifier and an ad-hoc hardened-runtime
signature. They are **not notarized by Apple**.
diff --git a/README.md b/README.md
index 6916c4806..85483b288 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,20 @@
-> **Unofficial fork: OpenScreen Subscription.** Adds local ChatGPT/Codex and Claude Code subscription routing, AI-session UI improvements, and a Windows Unicode recording-path fix. This is not an upstream release or endorsement. See [FORK.md](FORK.md) for attribution, policy and publication boundaries, and [FORK-CHANGELOG.md](FORK-CHANGELOG.md) for the versioned differences from upstream v1.10.0. Use this fork's release artifacts, not the upstream installers linked in the original documentation below.
+> **PurplePrint Studio is an independent, unofficial fork of [OpenScreen](https://github.com/getopenscreen/openscreen).** This working rebrand is not an upstream release or endorsement. Published `1.10.0-subscription.*` installers still use the former OpenScreen Subscription name until a Studio build passes release validation. See [FORK.md](FORK.md) for provenance and [FORK-CHANGELOG.md](FORK-CHANGELOG.md) for changes. Use [this fork's releases](https://github.com/PurplePrintAI/openscreen-subscription/releases), not the upstream installers described later on this page.
-
+
-# OpenScreen
+# PurplePrint Studio
-A free, open-source desktop app for recording your screen and turning the result into polished product demos and walkthroughs.
+Agentic Film Editor for product demos and GTM video content.
+
+PurplePrint Studio remains free to use. It records and edits locally; optional AI editing uses the user's own configured provider or local Codex/Claude Code runtime. The existing `.openscreen` project format and `openscreen` CLI command remain unchanged for compatibility. Design Coach handoff and GraphOS integration are not included in this rebrand. See the [Studio identity and release gates](docs/purpleprint-studio-identity.md).
+
+## OpenScreen upstream documentation — reference only
+
+The feature overview and installation sections below describe the upstream OpenScreen project. Its Store listings, signing claims and release links **do not apply to this fork**. [FORK.md](FORK.md) describes fork release boundaries; [MACOS-INSTALLATION.md](MACOS-INSTALLATION.md) currently documents the published packages under their former name. Studio packages still need validation.
+
+### OpenScreen
diff --git a/docs/purpleprint-studio-identity.md b/docs/purpleprint-studio-identity.md
new file mode 100644
index 000000000..5e95e1a45
--- /dev/null
+++ b/docs/purpleprint-studio-identity.md
@@ -0,0 +1,44 @@
+# PurplePrint Studio identity
+
+Status: worktree implementation; no Studio release has been published.
+
+PurplePrint Studio is the agentic film editor intended as a video-production
+companion to PurplePrint Design Coach's GTM and operating phases. GraphOS is the
+developing top-level PurplePrint product. This fork does **not** currently share
+GraphOS runtime state or consume Design Coach/MCP project context; that handoff
+belongs to the Design Coach/MCP workstream, not this frontend identity change.
+
+## Visual contract
+
+- Neutral dark surfaces are the default. Light mode remains available and an
+ existing explicit light preference is respected.
+- Violet identifies the PurplePrint family, focus, selected tools and primary
+ actions. It does not replace the functional colors for recording, progress,
+ success, warnings or errors.
+- Borders and small elevation steps carry panel hierarchy. Overlays can be more
+ prominent, while the editing surface and footage remain the visual focus.
+- The editor's minimum 800px desktop width retains mode and export controls;
+ chat and the inspector start collapsed when their width would crowd the stage.
+
+The implementation lives in `src/styles/design-tokens.css` and the active editor
+and capture surfaces. The checked-in Studio icon assets are generated from
+`public/purpleprint-studio.svg` geometry by
+`scripts/generate-studio-icons.py` (Pillow is needed only to regenerate them).
+
+## Compatibility and provenance
+
+- Visible product name: **PurplePrint Studio**. Descriptor: **Agentic Film Editor**.
+- The fork's technical app ID, package/data profile name, GitHub update origin,
+ `.openscreen` project extension and `openscreen` CLI command remain unchanged.
+ Test these boundaries in a packaged upgrade before a public release.
+- Preserve the upstream MIT license, copyright notices and independent-fork
+ disclosure. Do not imply OpenScreen maintainer endorsement.
+- Do not add a paywall to this editor as part of the Design Coach bundle.
+
+## Release gate
+
+Before publishing a Studio installer: validate existing-user project/settings
+continuity; confirm new icons, app/menu/shortcut names and update origin in the
+actual package; run Windows and Mac record → edit → export checks. The Mac build
+requires its own signing/notarization and permission review before it can be
+called a stable consumer release. Design Coach/MCP linkage is a separate gate.
diff --git a/electron-builder.fork.json b/electron-builder.fork.json
index 8fbb6aa8a..42c65e600 100644
--- a/electron-builder.fork.json
+++ b/electron-builder.fork.json
@@ -1,10 +1,10 @@
{
"extends": "./electron-builder.json5",
"appId": "io.github.purpleprintai.openscreen-subscription",
- "productName": "OpenScreen Subscription",
+ "productName": "PurplePrint Studio",
"extraMetadata": {
"name": "openscreen-subscription",
- "description": "Unofficial OpenScreen fork with optional ChatGPT and local Claude integration",
+ "description": "PurplePrint Studio, an agentic film editor based on OpenScreen",
"author": { "name": "PurplePrintAI", "url": "https://github.com/PurplePrintAI" },
"homepage": "https://github.com/PurplePrintAI/openscreen-subscription",
"repository": {
@@ -15,18 +15,18 @@
"publish": { "provider": "github", "owner": "PurplePrintAI", "repo": "openscreen-subscription" },
"win": {
"target": ["nsis"],
- "artifactName": "OpenScreen-Subscription-${version}-Windows-x64-Setup.${ext}"
+ "artifactName": "PurplePrint-Studio-${version}-Windows-x64-Setup.${ext}"
},
"mac": {
"target": ["dmg"],
- "artifactName": "OpenScreen-Subscription-${version}-macOS-${arch}.${ext}"
+ "artifactName": "PurplePrint-Studio-${version}-macOS-${arch}.${ext}"
},
"nsis": {
"oneClick": false,
"allowToChangeInstallationDirectory": true,
"createStartMenuShortcut": true,
"createDesktopShortcut": false,
- "shortcutName": "OpenScreen Subscription"
+ "shortcutName": "PurplePrint Studio"
},
"extraResources": [
{ "from": "FORK.md", "to": "FORK.md" },
diff --git a/electron/about.test.ts b/electron/about.test.ts
index 96e401630..d7b271f2e 100644
--- a/electron/about.test.ts
+++ b/electron/about.test.ts
@@ -4,6 +4,7 @@ import {
type AboutFacts,
COPYRIGHT,
formatAboutDetail,
+ PRODUCT_NAME,
usesNativeAboutPanel,
WEBSITE_URL,
} from "./about";
@@ -22,6 +23,11 @@ function facts(overrides: Partial = {}): AboutFacts {
}
describe("formatAboutDetail", () => {
+ it("uses the Studio display identity without dropping upstream provenance", () => {
+ expect(PRODUCT_NAME).toBe("PurplePrint Studio");
+ expect(formatAboutDetail(facts())).toContain("Unofficial fork of getopenscreen/openscreen");
+ });
+
it("lays the runtime, the install and the project out one per line", () => {
expect(formatAboutDetail(facts())).toBe(
[
diff --git a/electron/about.ts b/electron/about.ts
index 897748851..6231495a4 100644
--- a/electron/about.ts
+++ b/electron/about.ts
@@ -9,10 +9,9 @@
import type { InstallChannel } from "./install-channel";
export const WEBSITE_URL = "https://github.com/PurplePrintAI/openscreen-subscription";
-/** The brand spelling, for the surfaces we render ourselves. NOT `app.name`: that resolves to
- * electron-builder's `productName` ("Openscreen") when packaged and to package.json's `name`
- * ("openscreen") in dev, so the About box would disagree with its own title bar. */
-export const PRODUCT_NAME = "OpenScreen Subscription";
+/** The brand spelling for our own surfaces. `app.name` can resolve differently in dev and
+ * packaged builds, so the About box must not derive its title from that value. */
+export const PRODUCT_NAME = "PurplePrint Studio";
/** The collective form, and deliberately NOT the whole of LICENSE. LICENSE carries two holders:
* Siddharth Vaddem, who created the project — MIT obliges us to keep that notice on a codebase
* that still contains his code — and the contributors collectively. This is the line every user
@@ -45,7 +44,7 @@ export interface AboutFacts {
node: string;
}
-/** The block under "Openscreen ". Untranslated on purpose: every line is a version
+/** The block under "PurplePrint Studio ". Untranslated on purpose: every line is a version
* number, a platform identifier or a URL, and a pasted bug report reads the same whatever
* locale the reporter runs.
*
diff --git a/electron/ai-edition/agent-tools.ts b/electron/ai-edition/agent-tools.ts
index 5a0966398..ef4c58188 100644
--- a/electron/ai-edition/agent-tools.ts
+++ b/electron/ai-edition/agent-tools.ts
@@ -1149,7 +1149,7 @@ export function executeAgentTool(
assetId: load.assetId,
note:
"Checked: this asset has no cursor-telemetry sidecar. That normally means it " +
- "was imported rather than recorded with OpenScreen's cursor recorder. This is " +
+ "was imported rather than recorded with PurplePrint Studio's cursor recorder. This is " +
"a fact about the asset, not a limit of yours.",
}),
};
diff --git a/electron/ai-edition/claude/cli.ts b/electron/ai-edition/claude/cli.ts
index a8524f3eb..ebc8f29a3 100644
--- a/electron/ai-edition/claude/cli.ts
+++ b/electron/ai-edition/claude/cli.ts
@@ -368,12 +368,12 @@ export class ClaudeCli {
)
) {
throw new Error(
- "Claude enabled tools outside the OpenScreen editor. Check your CLI managed configuration.",
+ "Claude enabled tools outside the PurplePrint Studio editor. Check your CLI managed configuration.",
);
}
if (expectedTools.some((name) => !(event.tools as unknown[]).includes(name))) {
throw new Error(
- "Claude could not load the OpenScreen editor tools. Check your CLI MCP policy and connection.",
+ "Claude could not load the PurplePrint Studio editor tools. Check your CLI MCP policy and connection.",
);
}
}
diff --git a/electron/ai-edition/codex/app-server.ts b/electron/ai-edition/codex/app-server.ts
index 6b4a5ecb7..a2a2a78e2 100644
--- a/electron/ai-edition/codex/app-server.ts
+++ b/electron/ai-edition/codex/app-server.ts
@@ -177,7 +177,7 @@ export class CodexAppServer {
});
try {
await this.request("initialize", {
- clientInfo: { name: "openscreen_subscription", title: "OpenScreen Subscription", version },
+ clientInfo: { name: "openscreen_subscription", title: "PurplePrint Studio", version },
capabilities: { experimentalApi: true },
});
this.send({ method: "initialized", params: {} });
@@ -226,7 +226,7 @@ export class CodexAppServer {
if (payload.id !== undefined) {
if (payload.method === "item/tool/call" && turn) {
const tool = turn.tools.get(String(params.tool));
- let text = "Tool is not available in this OpenScreen turn.";
+ let text = "Tool is not available in this PurplePrint Studio turn.";
let success = false;
if (tool && ++turn.toolCalls <= 1000) {
try {
@@ -245,7 +245,7 @@ export class CodexAppServer {
// No shell, file edits, remote MCP approvals or other vendor tools are approved here.
this.send({
id: payload.id,
- error: { code: -32601, message: "Only OpenScreen editor tools are supported." },
+ error: { code: -32601, message: "Only PurplePrint Studio editor tools are supported." },
});
}
return;
@@ -288,7 +288,7 @@ export class CodexAppServer {
child?.kill();
}
close(): void {
- this.fail(new Error("OpenScreen closed the Codex connection."));
+ this.fail(new Error("PurplePrint Studio closed the Codex connection."));
}
async status(): Promise {
diff --git a/electron/ai-edition/deep-agent/service.ts b/electron/ai-edition/deep-agent/service.ts
index b1a15c908..2dd4dcce1 100644
--- a/electron/ai-edition/deep-agent/service.ts
+++ b/electron/ai-edition/deep-agent/service.ts
@@ -100,7 +100,7 @@ const CONSENT_PROMPT_BLOCK = [
// string and NOTHING else — the deepagents regression was invisible precisely
// because the middlewares appended their prompts downstream of this constant.
const BASE_SYSTEM_PROMPT = [
- "You are an AI video editor working inside OpenScreen. The user is editing a recording.",
+ "You are an AI video editor working inside PurplePrint Studio. The user is editing a recording.",
"Help them cut silences, tighten pacing, add captions, and rewrite titles.",
"Be concise, action-oriented, and reference the timeline or transcript by time when relevant.",
"You can call the tools below against the live document snapshot; the runtime executes each edit and feeds the result back into the loop.",
@@ -121,7 +121,7 @@ const BASE_SYSTEM_PROMPT = [
"- Deleting is a first-class action, not a workaround: removeTrim, removeModifier, removeClip. Never fake a deletion by re-adding an element or zeroing it out (span 0, speed 1×) — that leaves it in the document and misreports what you did.",
"If nothing in the list does what was asked, say so; do not approximate it with a bigger tool.",
"",
- "Cursor telemetry: while the screen was captured, OpenScreen recorded where the pointer went. assets[].hasCursorTelemetry in getCurrentDocument says which assets carry it, and getCursorTrack returns the recorded track for one of them — positions over time, and the pointer shape at each moment. What it means is yours to read.",
+ "Cursor telemetry: while the screen was captured, PurplePrint Studio recorded where the pointer went. assets[].hasCursorTelemetry in getCurrentDocument says which assets carry it, and getCursorTrack returns the recorded track for one of them — positions over time, and the pointer shape at each moment. What it means is yours to read.",
"Blindness is not evidence. When a tool reports it could not read something (reason 'unavailable'), that is a limit of your runtime, not a fact about the project. Only an explicit negative — reason 'no-sidecar', or a false flag — supports telling the user the data is not there.",
"",
"Honesty rules: if a request has NO matching tool (e.g. deleting an asset/recording, exporting), say so plainly — do not substitute a different edit and report it as the requested one. After your edits, if you are at all unsure the document ended up as intended, call getCurrentDocument and reconcile what you claim with the real state; each tool result already tells you exactly what it did, so never report a change the results don't support.",
diff --git a/electron/cli/args.ts b/electron/cli/args.ts
index d9e33819e..67e7ed3f2 100644
--- a/electron/cli/args.ts
+++ b/electron/cli/args.ts
@@ -61,7 +61,7 @@ const SUBCOMMANDS = new Set([
"-h",
]);
-export const CLI_USAGE = `OpenScreen CLI
+export const CLI_USAGE = `PurplePrint Studio CLI (openscreen command)
Usage:
openscreen export [options] Render a project to MP4/GIF
diff --git a/electron/fork-release.test.ts b/electron/fork-release.test.ts
index 0a9adc623..b1446b547 100644
--- a/electron/fork-release.test.ts
+++ b/electron/fork-release.test.ts
@@ -5,7 +5,9 @@ import { describe, expect, it } from "vitest";
describe("fork release identity", () => {
it("keeps installation and update identity separate from upstream", async () => {
const config = await getConfig(process.cwd(), path.resolve("electron-builder.fork.json"), null);
- expect(config.appId).not.toBe("com.etiennelescot.openscreen");
+ // The technical ID and profile name stay stable across the visible rebrand.
+ expect(config.appId).toBe("io.github.purpleprintai.openscreen-subscription");
+ expect(config.productName).toBe("PurplePrint Studio");
expect(config.extraMetadata?.name).toBe("openscreen-subscription");
expect(config.extraMetadata?.author).toEqual({
name: "PurplePrintAI",
@@ -18,6 +20,7 @@ describe("fork release identity", () => {
repo: "openscreen-subscription",
});
expect(config.nsis?.createStartMenuShortcut).toBe(true);
+ expect(config.nsis?.shortcutName).toBe("PurplePrint Studio");
const targets = (config.extraResources as Array<{ to: string }>).map((entry) => entry.to);
// Duplicate resource targets race in copyFile on Windows.
expect(new Set(targets).size).toBe(targets.length);
diff --git a/electron/ipc/handlers.ts b/electron/ipc/handlers.ts
index 958ef6d96..aaa6febfe 100644
--- a/electron/ipc/handlers.ts
+++ b/electron/ipc/handlers.ts
@@ -1920,7 +1920,7 @@ export function registerIpcHandlers(
const detail =
access.status === "missing-helper"
? "The cursor helper couldn't be found in this build, so the editable cursor can't be enabled. Rebuild the native helper (npm run build:native:mac) or switch the HUD cursor mode to system."
- : "Allow OpenScreen under System Settings → Privacy & Security → Accessibility, then press record again to start the countdown.";
+ : "Allow PurplePrint Studio under System Settings → Privacy & Security → Accessibility, then press record again to start the countdown.";
const messageOptions = {
type: "warning",
buttons: ["Open Accessibility Settings", "Cancel"],
@@ -1968,7 +1968,7 @@ export function registerIpcHandlers(
cancelId: 1,
message: "Screen Recording permission is required",
detail:
- "Allow OpenScreen in macOS System Settings, then come back and choose a screen or window.",
+ "Allow PurplePrint Studio in macOS System Settings, then come back and choose a screen or window.",
} satisfies Electron.MessageBoxOptions;
const result =
mainWin && !mainWin.isDestroyed()
@@ -3962,7 +3962,7 @@ export function registerIpcHandlers(
}
// Validate extension and readability
if (path.extname(filePath).toLowerCase() !== `.${PROJECT_FILE_EXTENSION}`) {
- return { success: false, message: "Not an Openscreen project file" };
+ return { success: false, message: "Not a .openscreen project file" };
}
const stats = await fs.stat(filePath).catch(() => null);
if (!stats?.isFile()) {
diff --git a/electron/main.ts b/electron/main.ts
index a85629bf3..db0458b58 100644
--- a/electron/main.ts
+++ b/electron/main.ts
@@ -132,7 +132,7 @@ const isMac = process.platform === "darwin";
const trayIconSize = isMac ? 16 : 24;
// Tray Icons
-const defaultTrayIcon = getTrayIcon("openscreen.png", trayIconSize);
+const defaultTrayIcon = getTrayIcon("purpleprint-studio.png", trayIconSize);
const recordingTrayIcon = getTrayIcon("rec-button.png", trayIconSize);
function createWindow() {
@@ -213,7 +213,7 @@ function setupApplicationMenu() {
submenu: [
{
role: "about",
- label: mainT("common", "actions.about") || "About OpenScreen",
+ label: mainT("common", "actions.about") || "About PurplePrint Studio",
},
{ type: "separator" as const },
{
@@ -239,7 +239,7 @@ function setupApplicationMenu() {
{ type: "separator" },
{
role: "hide",
- label: mainT("common", "actions.hide") || "Hide OpenScreen",
+ label: mainT("common", "actions.hide") || "Hide PurplePrint Studio",
},
{
role: "hideOthers",
@@ -375,7 +375,7 @@ function setupApplicationMenu() {
]
: []),
{
- label: mainT("common", "actions.about") || "About OpenScreen",
+ label: mainT("common", "actions.about") || "About PurplePrint Studio",
click: runAboutDialog,
},
{ type: "separator" as const },
@@ -504,7 +504,7 @@ async function presentAboutDialog() {
const heading = `${PRODUCT_NAME} ${facts.version}`;
const choice = await showMessageBox({
type: "info",
- title: mainT("common", "actions.about") || "About OpenScreen",
+ title: mainT("common", "actions.about") || "About PurplePrint Studio",
message: heading,
detail,
buttons: [
@@ -779,10 +779,10 @@ function updateTrayMenu(recording: boolean = false) {
isMac
? {
role: "about" as const,
- label: mainT("common", "actions.about") || "About OpenScreen",
+ label: mainT("common", "actions.about") || "About PurplePrint Studio",
}
: {
- label: mainT("common", "actions.about") || "About OpenScreen",
+ label: mainT("common", "actions.about") || "About PurplePrint Studio",
click: runAboutDialog,
},
// Right next to About, and reachable without opening any window: this is the
diff --git a/electron/native-bridge/services/aiEditionService.ts b/electron/native-bridge/services/aiEditionService.ts
index 4393dc592..30a882cf4 100644
--- a/electron/native-bridge/services/aiEditionService.ts
+++ b/electron/native-bridge/services/aiEditionService.ts
@@ -243,7 +243,7 @@ export class AiEditionService {
return {
success: false,
error:
- "Manage Claude authentication in the official CLI. OpenScreen does not store its credentials.",
+ "Manage Claude authentication in the official CLI. PurplePrint Studio does not store its credentials.",
};
if (providerId === "codex-subscription")
return { success: false, error: "Use ChatGPT sign-in, not an API key." };
diff --git a/icons/icons/mac/icon.icns b/icons/icons/mac/icon.icns
index 02de106cff4af6b3f6e844b22c0a623fc8a77330..9a376a3f3841ab6135e34904c20a8e8079a6d4e9 100644
GIT binary patch
literal 119251
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 |