Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
a7bee2a
feat: introduce PurplePrint Studio identity
PurplePrintAI Sep 27, 2026
6a5dc28
build: harden Studio Windows package preparation
PurplePrintAI Sep 27, 2026
d66e8f5
style: format FFmpeg SDK path guard
PurplePrintAI Sep 27, 2026
2cbc948
build: prepare PurplePrint Studio .8 candidate
PurplePrintAI Sep 27, 2026
0b62691
build: refresh Nix dependency hash for Studio .8
PurplePrintAI Sep 27, 2026
300d695
ci: verify Studio CLI banner in macOS package
PurplePrintAI Sep 27, 2026
da03664
docs: record Studio .8 validation results
PurplePrintAI Sep 27, 2026
27bc1f5
docs: correct Studio macOS installation guide
PurplePrintAI Sep 27, 2026
a4147e2
docs: link verified Studio macOS packages
PurplePrintAI Sep 27, 2026
1e26258
docs: record verified Windows Studio upgrade
PurplePrintAI Sep 27, 2026
a65b527
docs: verify installed Studio project loading
PurplePrintAI Sep 27, 2026
ba7decf
docs: record installed Studio source picker validation
PurplePrintAI Sep 27, 2026
d812d1d
fix: resolve packaged transcription WASM path
PurplePrintAI Sep 27, 2026
f81a8b9
build: refresh Nix hash for Studio .9
PurplePrintAI Sep 27, 2026
a3bdd86
docs: record Studio .9 installation and validation
PurplePrintAI Sep 27, 2026
f0c0b18
fix: discover subscription prerelease updates
PurplePrintAI Sep 28, 2026
18c396f
build: prepare clean Windows Studio .10 candidate
PurplePrintAI Sep 28, 2026
2936ae5
build: refresh Nix hash for Studio .10
PurplePrintAI Sep 28, 2026
c812f1b
fix: guard native recording startup in HUD
PurplePrintAI Sep 28, 2026
66bc35f
build: prepare Studio .11 Windows candidate
PurplePrintAI Sep 28, 2026
771d6d5
build: sync Nix npm dependency hash for Studio .11
PurplePrintAI Sep 28, 2026
25f7366
docs: record installed Studio .11 Windows validation
PurplePrintAI Sep 28, 2026
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
20 changes: 10 additions & 10 deletions .github/workflows/build-fork-macos.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Build OpenScreen Subscription for macOS
name: Build PurplePrint Studio for macOS

on:
workflow_dispatch:
Expand Down Expand Up @@ -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"

Expand All @@ -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 }}"

Expand Down Expand Up @@ -147,9 +147,9 @@ 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
grep -Fq "PurplePrint Studio CLI (openscreen command)" cli-help.txt

- name: Create DMG
id: dmg
Expand All @@ -160,15 +160,15 @@ 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"
cp -R "${{ steps.app.outputs.path }}" "$STAGING/"
ln -s /Applications "$STAGING/Applications"
hdiutil create \
-srcfolder "$STAGING" \
-volname "OpenScreen Subscription" \
-volname "PurplePrint Studio" \
-fs HFS+ \
-format UDBZ \
"$OUT"
Expand All @@ -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"
Expand All @@ -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",
Expand Down
93 changes: 93 additions & 0 deletions .github/workflows/build-fork-windows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
name: Validate PurplePrint Studio for Windows

on:
workflow_dispatch:
pull_request:
branches: ["fork/main"]
paths:
- ".github/workflows/build-fork-windows.yml"
- "build/fork-speech-payload.json"
- "crates/**"
- "electron/**"
- "scripts/**"
- "src/**"
- "package.json"
- "package-lock.json"
- "electron-builder.fork.json"
- "electron-builder.json5"

permissions:
contents: read
actions: read

jobs:
package:
name: Windows x64 clean package
runs-on: windows-latest
timeout-minutes: 90
steps:
- name: Checkout source
uses: actions/checkout@v7

- name: Setup Node.js
uses: ./.github/actions/setup

- name: Check pinned LLVM toolchain
shell: pwsh
run: |
$clang = 'C:\Program Files\LLVM\bin\libclang.dll'
if (-not (Test-Path -LiteralPath $clang)) {
throw "libclang missing at $clang"
}

- name: Build native helpers, renderer and unsigned NSIS package
shell: pwsh
env:
GH_TOKEN: ${{ github.token }}
CSC_IDENTITY_AUTO_DISCOVERY: "false"
run: npm run build:win:fork

- name: Smoke-test packaged CLI
shell: pwsh
run: |
$version = (Get-Content package.json -Raw | ConvertFrom-Json).version
$exe = Join-Path "release/$version/win-unpacked" 'PurplePrint Studio.exe'
$process = Start-Process -FilePath $exe -ArgumentList 'help' -WindowStyle Hidden -Wait -PassThru -RedirectStandardOutput cli-help.txt -RedirectStandardError cli-stderr.txt
if ($process.ExitCode -ne 0) { throw "Packaged CLI exited $($process.ExitCode)" }
if (-not (Select-String -LiteralPath cli-help.txt -SimpleMatch 'PurplePrint Studio CLI (openscreen command)' -Quiet)) {
throw 'Packaged CLI banner missing'
}

- name: Verify package identity, payload and checksums
shell: pwsh
env:
GITHUB_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: node scripts/validate-fork-windows-package.mjs

- name: Confirm candidate is unsigned
shell: pwsh
run: |
$version = (Get-Content package.json -Raw | ConvertFrom-Json).version
$setup = "release/$version/PurplePrint-Studio-$version-Windows-x64-Setup.exe"
$status = (Get-AuthenticodeSignature -LiteralPath $setup).Status
if ($status -ne 'NotSigned') { throw "Unexpected installer signature status: $status" }

- name: Read candidate version
id: version
shell: pwsh
run: |
$version = (Get-Content package.json -Raw | ConvertFrom-Json).version
"value=$version" >> $env:GITHUB_OUTPUT

- name: Upload validation-only Windows package
uses: actions/upload-artifact@v7
with:
name: purpleprint-studio-windows-x64
path: |
release/${{ steps.version.outputs.value }}/PurplePrint-Studio-${{ steps.version.outputs.value }}-Windows-x64-Setup.exe
release/${{ steps.version.outputs.value }}/PurplePrint-Studio-${{ steps.version.outputs.value }}-Windows-x64-Setup.exe.blockmap
release/${{ steps.version.outputs.value }}/latest.yml
release/${{ steps.version.outputs.value }}/windows-validation.json
release/${{ steps.version.outputs.value }}/SHA256SUMS-Windows.txt
if-no-files-found: error
retention-days: 30
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ release/**
# Playwright
test-results
playwright-report/
/.playwright-cli/
/output/playwright/


# Vitest browser mode screenshots
Expand Down
80 changes: 79 additions & 1 deletion FORK-CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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)
Expand All @@ -17,6 +17,84 @@ 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 (`1.10.0-subscription.11` candidate)

- 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.
- Before live installation, the unsigned Windows NSIS package was smoke-tested
with an isolated profile. Packaged H.264 import, editor launch and MP4 export
passed with synthetic media.
- An isolated profile created by the installed `.7` fork retained its project,
media clip, light theme and preferences when opened by the Studio package;
the old project exported a decodable MP4. A packaged Windows WGC window
capture of a generated, non-user-content target also reopened and exported.
This exercised native capture with automated control. On the installed `.8`
app, the owner separately confirmed that a physical mouse click on the HUD's
Screen button opened the source selector. The owner then selected a source,
recorded six seconds, stopped from the HUD and opened the saved recording in
Studio. A user-driven export remains unverified.
- Fixes the packaged audio-demuxer WASM URL used by automatic transcription.
The installed `.8` opened a silent recording but showed a transient
"Failed to fetch" transcription error because this URL resolved outside the
packaged `dist/wasm` directory. After the `.9` upgrade, the owner recorded
another silent clip without the error toast; its new project persisted a
`no-audio` verdict and the owner exported an MP4 successfully.
- With the owner's approval, the `.8` NSIS installer upgraded the existing
per-user `.7` registration. It removed the old executable, installed Studio
in a product-named child folder beneath the prior custom location and replaced
the Start-menu shortcut. A local backup was verified before installation;
three existing project files and the AI configuration retained their hashes.
Studio launched using the existing locale. The installed `.8` binary loaded
an isolated copy of all three real project documents (three assets and three
clips) and opened the editor without emitting their contents. The live
profile was not used for this project-loading test; private footage was not
exported.
- Builds Apple Silicon and Intel macOS DMGs in
[the fork's validation workflow](https://github.com/PurplePrintAI/openscreen-subscription/actions/runs/36320426373).
Both passed architecture, native payload, bundle ID, ad-hoc signature, CLI
boot and mounted-DMG checks. The bundled installation guide uses the Studio
name and links Apple's current per-app security procedure. A real Mac record →
edit → export pass, Developer ID signing and notarization remain release
gates. No Studio release has been published.
- Advances the unpublished candidate to `1.10.0-subscription.9`. The `.8`
candidate refreshed the Nix dependency hash and checked the rebranded CLI
banner in macOS packaging. The unsigned `.9` Windows NSIS installer was built
and its packaged WASM path checked, then installed on the owner's PC after a
verified backup. Nine installed payload files matched the `.9` build, the
registered version was `.9`, and the Start-menu shortcut kept its target.
This developer PC
lacked `libclang.dll` for a fresh compositor rebuild, so packaging reused the
verified `.8` compositor binary with the same SHA-256; the WGC helper was
rebuilt. [macOS `.9` CI](https://github.com/PurplePrintAI/openscreen-subscription/actions/runs/36358715037)
built Apple Silicon and Intel DMGs and passed payload, bundle identity,
architecture, ad-hoc signature structure, CLI boot and mounted-DMG checks.
A real Mac record → edit → export pass and notarization remain unverified.
- Advances the Windows source candidate to `1.10.0-subscription.10`. Update
discovery now reads published releases in the installed `subscription`
prerelease channel; GitHub's `/releases/latest` endpoint returned 404 while
the fork had only prereleases. Drafts and unrelated channels are ignored,
versions are compared semantically, and release URLs remain restricted to
this fork. A clean Windows packaging workflow rebuilds the native helpers
and verifies the installer without publishing it. The Windows speech runtime
is pinned to a checksum-verified artifact built by this fork rather than an
upstream workflow artifact.
- The `.10` clean Windows package passed CI and was installed locally after a
verified `.9` backup. The owner reported a first recording attempt where the
three-second countdown ended but native capture had not yet acknowledged
startup; a second click received "already running". Retrying later recorded
and exported MP4. The `.11` candidate blocks overlapping start requests and
shows a localized "Starting…" spinner while waiting for the native helper.
The clean `.11` Windows package passed CI and was installed on the owner's PC
after a verified `.10` backup. The owner confirmed a successful test recording,
MP4 export and an installed-app "up to date" check. A real future-version
updater download/install remains unverified; `.11` is not published.

## 1.10.0-subscription.7 — 2026-09-27

### GPT-6 model catalog
Expand Down
19 changes: 14 additions & 5 deletions FORK.md
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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.
Expand Down Expand Up @@ -55,7 +56,8 @@ are different actions. Do not represent a PR as accepted without actual review.
2. Build the WGC helper and compositor from this checkout. Keep native-payload
and freshness checks enabled. Do not bypass them or retimestamp old binaries.
3. Fetch the pinned, checksum-verified LGPL FFmpeg SDK. Stage speech helpers from
a recorded upstream build; retain provenance and hashes.
the recorded fork build in `build/fork-speech-payload.json`; retain provenance
and hashes.
4. Run app/test typechecks, relevant tests, the full unit suite, i18n checks and
native smoke tests. Resolve new failures; never relabel a failed check as passed.
5. Package with `electron-builder.fork.json` and `--publish never`. The original
Expand All @@ -74,6 +76,13 @@ npm run build-vite
npx electron-builder --win nsis --x64 --config electron-builder.fork.json --config.npmRebuild=false --publish never
```

For a clean Windows runner build, use
[`build-fork-windows.yml`](.github/workflows/build-fork-windows.yml). Relevant
fork PR changes trigger it; after the workflow is on the default branch, it
can also be dispatched manually. It rebuilds the native helpers and unsigned
installer, checks the packaged payload against the build outputs, and uploads
validation-only artifacts without publishing a GitHub Release.

The installer is unsigned unless an independently authorized signing identity is
configured. No upstream publisher identity is borrowed. Windows security prompts
must be handled by the user, not disabled by this fork or its build scripts.
Expand Down
32 changes: 20 additions & 12 deletions MACOS-INSTALLATION.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
# OpenScreen Subscription on macOS
# PurplePrint Studio on macOS

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**.
> This guide covers PurplePrint Studio validation builds, including the
> unpublished `1.10.0-subscription.8` candidate. It is not a stable consumer release.

PurplePrint Studio is an unofficial OpenScreen fork. The current macOS packages
carry the fork bundle identifier and an ad-hoc hardened-runtime signature. They
are **not Developer ID signed or notarized by Apple**. Apple warns that running
software without those checks may put the Mac and its data at risk; use these
packages only for controlled testing from a source you trust.

## Choose the package

Expand All @@ -15,11 +20,14 @@ preview and export would all run through translation.

## Install and open

1. Download the matching `.dmg` from this fork's GitHub prerelease.
2. Open the DMG and drag **OpenScreen Subscription** to **Applications**.
3. In Applications, Control-click **OpenScreen Subscription**, choose **Open**, and
confirm the first launch. This is the per-app Gatekeeper path for an unnotarized
validation build. Do not disable Gatekeeper globally.
1. Obtain the matching `.dmg` from the fork's validation workflow or an approved
prerelease. Compare its SHA-256 with the accompanying `SHA256SUMS-macOS.txt`.
2. Open the DMG and drag **PurplePrint Studio** to **Applications**.
3. Try opening **PurplePrint Studio** from Applications. If macOS blocks it and
you independently decide to test this unnotarized build despite the warning,
use Apple's [Privacy & Security → Open Anyway procedure](https://support.apple.com/en-au/102445)
after that attempt. Do not disable Gatekeeper globally or remove quarantine
attributes by command line.
4. Grant only the permissions needed for the features you use. macOS may request
Screen & System Audio Recording, Accessibility, Microphone or Camera access.
5. Fully quit and reopen the app after changing a privacy permission.
Expand All @@ -34,14 +42,14 @@ Codex CLI and Claude Code are optional external dependencies. They are never bun
in the DMG.

- ChatGPT subscription: install the official Codex CLI, then connect the account in
OpenScreen's AI settings.
Studio's AI settings.
- Claude subscription: install the official Claude Code CLI and run
`claude auth login` in Terminal before checking the connection in OpenScreen.
`claude auth login` in Terminal before checking the connection in Studio.

The packaged app checks the inherited PATH and common Finder-safe locations:
`~/.local/bin`, `~/.npm-global/bin`, `~/.volta/bin`, `~/Library/pnpm`,
`/opt/homebrew/bin` and `/usr/local/bin`. The corresponding command should work in
Terminal (`codex --version` or `claude --version`) before troubleshooting OpenScreen.
Terminal (`codex --version` or `claude --version`) before troubleshooting Studio.

## Known transcription limitation

Expand Down
Loading
Loading