Skip to content

Commit 55e19ee

Browse files
Merge branch 'main' into fix/compositor-bindgen-freestanding
2 parents 2edde0e + 7c4827b commit 55e19ee

11 files changed

Lines changed: 98 additions & 19 deletions

File tree

.github/workflows/build.yml

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -499,13 +499,15 @@ jobs:
499499
uses: ./.github/actions/setup
500500

501501
# bsdtar (libarchive-tools) is fpm's mtree generator for the pacman target.
502+
# rpmbuild (rpm) is what fpm shells out to for the rpm target; without it the
503+
# build fails at packaging, not at config parse.
502504
# patchelf is what build-linux-compositor-addon.mjs renames the ffmpeg symbols
503505
# with, so the addon cannot bind to Chromium's bundled ffmpeg — an unconditional
504506
# dependency that resolvePatchelf() throws on. It happens to be preinstalled on
505507
# the ubuntu-24.04 image, which is why this has worked; declaring it means the
506508
# build stops depending on the runner image's contents.
507509
- name: Install Linux packaging and native build dependencies
508-
run: sudo apt-get update && sudo apt-get install -y libarchive-tools patchelf
510+
run: sudo apt-get update && sudo apt-get install -y libarchive-tools rpm patchelf
509511

510512
- name: Stage whisper-stt binaries
511513
shell: bash
@@ -516,6 +518,30 @@ jobs:
516518
- name: Build Linux app
517519
run: npm run build:linux -- --publish never
518520

521+
# The guard for the trap documented on the upload step below: `if-no-files-found`
522+
# evaluates the union of the globs, so a format that stops being produced is
523+
# invisible there. It is a real failure mode and not a hypothetical one — the rpm
524+
# target was added to electron-builder.json5's `linux.target` alone, where the CLI
525+
# list in `build:linux` overrides it, and the upload glob for it would have matched
526+
# nothing on every release with the job still green. One assertion per format.
527+
- name: Verify every Linux format was produced
528+
run: |
529+
if [[ ! -d release ]]; then
530+
echo "::error::electron-builder produced no release/ directory"
531+
exit 1
532+
fi
533+
MISSING=()
534+
for ext in AppImage deb pacman rpm; do
535+
COUNT="$(find release -type f -name "*.${ext}" -printf . | wc -c)"
536+
echo "${ext}: ${COUNT}"
537+
if [[ "$COUNT" -eq 0 ]]; then MISSING+=("$ext"); fi
538+
done
539+
if [[ "${#MISSING[@]}" -gt 0 ]]; then
540+
echo "::error::No artifact produced for: ${MISSING[*]} — check the target list in package.json's build:linux, which overrides linux.target in electron-builder.json5"
541+
find release -maxdepth 2 -type f -print
542+
exit 1
543+
fi
544+
519545
- name: Upload Linux packages
520546
uses: actions/upload-artifact@v7
521547
with:
@@ -524,6 +550,7 @@ jobs:
524550
release/**/*.AppImage
525551
release/**/*.deb
526552
release/**/*.pacman
553+
release/**/*.rpm
527554
# No *.zsync: nothing produces one. zsync is electron-updater's delta format,
528555
# this repo has no updater (no electron-updater, no autoUpdater, no
529556
# latest-linux.yml), and app-builder-lib 26.x dropped zsync entirely in favour

.github/workflows/docs.yml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ jobs:
3939
name: Build site
4040
runs-on: ubuntu-latest
4141
steps:
42-
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
42+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
4343
with:
4444
persist-credentials: false
45-
- uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3
45+
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
4646
with:
4747
node-version: 22
4848
cache: npm
@@ -57,9 +57,15 @@ jobs:
5757
working-directory: website
5858
run: npm run build
5959
- name: Upload artifact
60-
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1
60+
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
6161
with:
6262
path: website/build
63+
# v4 stopped bundling dotfiles, and Docusaurus writes a `.nojekyll`
64+
# into website/build. The artifact-based Pages deploy never runs
65+
# Jekyll, so losing it would probably be harmless — but "probably" is
66+
# not worth finding out on the live site, and this restores exactly
67+
# what v3 uploaded. `.git`/`.github` stay excluded either way.
68+
include-hidden-files: true
6369

6470
deploy:
6571
name: Deploy to GitHub Pages
@@ -76,4 +82,4 @@ jobs:
7682
id-token: write
7783
steps:
7884
- id: deployment
79-
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5
85+
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0

README.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,21 @@ Download the `.exe` installer directly from the [Releases page](https://github.c
8383

8484
### Linux
8585

86-
Three packages are published to the [Releases page](https://github.com/getopenscreen/openscreen/releases) for each version. Pick the one that matches your distro:
86+
Four packages are published to the [Releases page](https://github.com/getopenscreen/openscreen/releases) for each version. Pick the one that matches your distro:
8787

8888
**Debian / Ubuntu / Pop!_OS (`.deb`)**
8989
```bash
90-
sudo apt install ./Openscreen-Linux-latest.deb
90+
sudo apt install ./Openscreen-Linux-*.deb
91+
```
92+
93+
**Fedora / RHEL / CentOS (`.rpm`)**
94+
```bash
95+
sudo dnf install ./Openscreen-Linux-*.rpm
9196
```
9297

9398
**Arch / Manjaro (`.pacman`)**
9499
```bash
95-
sudo pacman -U Openscreen-Linux-latest.pacman
100+
sudo pacman -U Openscreen-Linux-*.pacman
96101
```
97102

98103
**Any distro (`.AppImage`)**

electron-builder.json5

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,16 @@
102102
}
103103
},
104104
"linux": {
105+
// Cette liste ne suffit PAS à produire un artefact en CI : `build:linux` passe
106+
// ses cibles en ligne de commande (`electron-builder --linux AppImage deb pacman
107+
// rpm`), et la CLI REMPLACE `linux.target` au lieu de le compléter. Toute cible
108+
// ajoutée ici doit l'être aussi dans le script, sinon elle n'existe que pour un
109+
// `electron-builder --linux` nu, que rien n'exécute.
105110
"target": [
106111
"AppImage",
107112
"deb",
108-
"pacman"
113+
"pacman",
114+
"rpm"
109115
],
110116
"icon": "icons/icons/png",
111117
"artifactName": "${productName}-Linux-${version}.${ext}",
@@ -176,6 +182,32 @@
176182
"vulkan-swrast"
177183
]
178184
},
185+
"rpm": {
186+
// Même règle que ci-dessus : la liste REMPLACE le défaut d'electron-builder,
187+
// donc les huit premières entrées SONT ce défaut (FpmTarget.getDefaultDepends,
188+
// cas "rpm"), verbatim, suivies des deux qui nous sont propres.
189+
//
190+
// `mesa-vulkan-drivers` porte le même nom sur Fedora que sur Debian : c'est le
191+
// paquet qui garantit lavapipe, sans quoi l'aperçu du compositeur est indisponible.
192+
//
193+
// `libsecret` n'est PAS dans le défaut rpm alors qu'il l'est dans le défaut deb
194+
// (`libsecret-1-0`). `safeStorage` chiffre les clés d'API des fournisseurs LLM
195+
// (electron/ai-edition/llm-config-store.ts) et passe par le Secret Service :
196+
// sans lui, `isEncryptionAvailable()` répond faux et l'enregistrement d'une clé
197+
// lève. Une omission d'electron-builder, pas un choix.
198+
"depends": [
199+
"gtk3",
200+
"libnotify",
201+
"nss",
202+
"libXScrnSaver",
203+
"(libXtst or libXtst6)",
204+
"xdg-utils",
205+
"at-spi2-core",
206+
"(libuuid or libuuid1)",
207+
"libsecret",
208+
"mesa-vulkan-drivers"
209+
]
210+
},
179211
"win": {
180212
"target": [
181213
"nsis"

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
"build:native:linux": "node scripts/build-linux-pipewire-helper.mjs",
4444
"build:win": "npm run build:native:win && npm run fetch:ffmpeg && npm run build:native:compositor && tsc && vite build && electron-builder --win --config.npmRebuild=false",
4545
"build:win:store": "npm run build:native:win && npm run fetch:ffmpeg && npm run build:native:compositor && tsc && vite build && electron-builder --win appx --config.npmRebuild=false",
46-
"build:linux": "npm run fetch:ffmpeg:sdk && npm run build:native:linux && npm run build:native:compositor:linux && tsc && vite build && electron-builder --linux AppImage deb pacman --config.npmRebuild=false",
46+
"build:linux": "npm run fetch:ffmpeg:sdk && npm run build:native:linux && npm run build:native:compositor:linux && tsc && vite build && electron-builder --linux AppImage deb pacman rpm --config.npmRebuild=false",
4747
"build:whisper-binaries": "bash scripts/build-whisper-stt.sh",
4848
"test:whisper-stt": "node scripts/test-whisper-stt.mjs",
4949
"test": "vitest --run",

technical-documentation/engineering/build-and-packaging.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ OpenScreen builds its renderer, Electron main process, preload bridge, native he
1212
| `npm run build:mac` | Builds the ScreenCaptureKit and cursor helpers, checks TypeScript, runs Vite, and packages the macOS target. |
1313
| `npm run build:win` | Builds WGC/cursor helpers and the D3D11 compositor addon, fetches FFmpeg, checks TypeScript, runs Vite, and packages the Windows NSIS target without npm rebuild. |
1414
| `npm run build:win:store` | Performs the Windows native and renderer build, then asks electron-builder for the configured AppX Store package. |
15-
| `npm run build:linux` | Checks TypeScript, runs Vite, then packages AppImage, Debian, and pacman artifacts without npm rebuild. |
15+
| `npm run build:linux` | Checks TypeScript, runs Vite, then packages AppImage, Debian, pacman, and RPM artifacts without npm rebuild. Its explicit `--linux` target list overrides `linux.target` in `electron-builder.json5`, so a target added to the config alone is never built. |
1616
| `npm run build:native:mac` | Uses SwiftPM to build requested single-architecture ScreenCaptureKit and macOS cursor helpers and stages them under `electron/native/bin/darwin-*`. |
1717
| `npm run build:native:win` | Uses CMake/Ninja in an MSVC environment to build WGC capture and cursor-sampler executables and stage x64 binaries. |
1818
| `npm run build:native:compositor` | Uses Cargo/MSVC and the pinned shared FFmpeg SDK to build `compositor_view.node`. |
@@ -124,7 +124,7 @@ Electron-builder targets DMG for both `arm64` and `x64`, enables hardened runtim
124124

125125
### Linux and Nix
126126

127-
Electron-builder produces AppImage, `.deb`, and `.pacman` targets. The flake separately supports `x86_64-linux` and `aarch64-linux`, offers NixOS and Home Manager modules, and builds a wrapper around nixpkgs' system Electron. `nix/package.nix` runs Vite directly, installs `dist/`, `dist-electron/`, production npm dependencies, wallpapers, icons, and a desktop entry; it does not invoke electron-builder. The release workflow later opens a PR to update the Nix package version and npm dependency hash after stable releases.
127+
Electron-builder produces AppImage, `.deb`, `.pacman`, and `.rpm` targets. Each fpm target carries its own `depends` list, which *replaces* electron-builder's default rather than extending it; all three package formats therefore repeat that default verbatim before adding the Vulkan ICD (`mesa-vulkan-drivers`, `vulkan-swrast` on Arch) the native compositor needs. The RPM list also restores `libsecret`, which electron-builder includes in its `deb` default but omits from its `rpm` one, and which `safeStorage` needs to encrypt LLM credentials. The flake separately supports `x86_64-linux` and `aarch64-linux`, offers NixOS and Home Manager modules, and builds a wrapper around nixpkgs' system Electron. `nix/package.nix` runs Vite directly, installs `dist/`, `dist-electron/`, production npm dependencies, wallpapers, icons, and a desktop entry; it does not invoke electron-builder. The release workflow later opens a PR to update the Nix package version and npm dependency hash after stable releases.
128128

129129
## Node and toolchain versions
130130

technical-documentation/engineering/ci-workflows.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ flowchart TD
2121
ReleaseBuild["build.yml<br/>v* tag or dispatch"] --> Win[Windows NSIS]
2222
ReleaseBuild --> Store[Windows AppX]
2323
ReleaseBuild --> Mac["macOS arm64 and x64 DMGs"]
24-
ReleaseBuild --> Linux["AppImage, deb, pacman"]
24+
ReleaseBuild --> Linux["AppImage, deb, pacman, rpm"]
2525
Win --> Publish[GitHub release]
2626
Mac --> Publish
2727
Linux --> Publish
@@ -101,7 +101,7 @@ A `v*` tag or manual dispatch starts platform builds. Dispatch accepts `arch` (`
101101
- `build-windows` runs `npm run build:win` and uploads `openscreen-windows` for 30 days.
102102
- `build-windows-store` runs `npm run build:win:store` and uploads `openscreen-windows-store` for 30 days.
103103
- `build-macos` is an `arm64`/`x64` matrix. It builds Vite/Electron and native helpers, packages and optionally signs the app, creates DMGs, notarizes every signed build including pre-releases, and uploads one artifact per architecture for 30 days.
104-
- `build-linux` produces AppImage, deb, and pacman files and uploads `openscreen-linux` for 30 days. No zsync: that is electron-updater's delta format, this repo ships no updater, and app-builder-lib 26.x embeds a block map in the AppImage instead.
104+
- `build-linux` produces AppImage, deb, pacman, and rpm files and uploads `openscreen-linux` for 30 days. It asserts one artifact per format before uploading, because `if-no-files-found: error` evaluates the union of the upload globs and so cannot catch a single format that stopped being produced. No zsync: that is electron-updater's delta format, this repo ships no updater, and app-builder-lib 26.x embeds a block map in the AppImage instead.
105105
- `publish-release` waits for Windows NSIS, macOS, and Linux jobs; the Store job is not a dependency. It checks the tag against `package.json`, downloads the NSIS/macOS/Linux artifacts, and creates or updates a GitHub release with `OPENSCREEN_RELEASE_TOKEN`.
106106

107107
The build comments and package behavior refer to the local Whisper architecture documented in [transcription and captions](../architecture/transcription-and-captions.md). The STT model downloads to user data at runtime and is not a release-build asset.

website/docs/installation.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
id: installation
33
title: Installation
44
sidebar_position: 2
5-
description: "Install OpenScreen on macOS, Windows, or Linux — .dmg, .exe, .deb, .pacman, AppImage, and a Nix flake, including the macOS Gatekeeper step."
5+
description: "Install OpenScreen on macOS, Windows, or Linux — .dmg, .exe, .deb, .rpm, .pacman, AppImage, and a Nix flake, including the macOS Gatekeeper step."
66
keywords:
77
- install screen recorder
88
- download OpenScreen
99
- macOS dmg
1010
- Windows installer
1111
- Linux deb
12+
- Fedora rpm
1213
- AppImage
1314
- Nix flake
1415
---
@@ -41,13 +42,18 @@ Download and run the `.exe` installer from [Releases](https://github.com/getopen
4142

4243
## Linux
4344

44-
Three packages are published per release — pick the one matching your distro.
45+
Four packages are published per release — pick the one matching your distro.
4546

4647
**Debian / Ubuntu / Pop!_OS**
4748
```bash
4849
sudo apt install ./Openscreen-Linux-*.deb
4950
```
5051

52+
**Fedora / RHEL / CentOS**
53+
```bash
54+
sudo dnf install ./Openscreen-Linux-*.rpm
55+
```
56+
5157
**Arch / Manjaro**
5258
```bash
5359
sudo pacman -U Openscreen-Linux-*.pacman

website/src/lib/release.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export const ASSET_PATTERNS = {
3030
macIntel: /Mac.*x64.*\.dmg$/i,
3131
windows: /\.exe$/i,
3232
deb: /\.deb$/i,
33+
rpm: /\.rpm$/i,
3334
pacman: /\.pacman$/i,
3435
appImage: /\.AppImage$/i,
3536
} as const;

website/src/pages/download.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const PAGE_URL = "https://getopenscreen.com/download/";
2525
// structured-data description that contradicts the meta one is worse than none.
2626
const PAGE_TITLE = "Download for Windows, macOS & Linux";
2727
const PAGE_DESCRIPTION =
28-
"Download OpenScreen free for Windows, macOS, and Linux — .dmg, .exe, .deb, .pacman, AppImage, and a Nix flake. Open source, no account, no watermark.";
28+
"Download OpenScreen free for Windows, macOS, and Linux — .dmg, .exe, .deb, .rpm, .pacman, AppImage, and a Nix flake. Open source, no account, no watermark.";
2929

3030
type PlatformSpec = {
3131
id: string;
@@ -60,6 +60,7 @@ const PLATFORMS: PlatformSpec[] = [
6060
icon: TerminalSquare,
6161
options: [
6262
{ kind: "deb", label: "Debian, Ubuntu, Pop!_OS", sublabel: "Package · .deb" },
63+
{ kind: "rpm", label: "Fedora, RHEL, CentOS", sublabel: "Package · .rpm" },
6364
{ kind: "pacman", label: "Arch, Manjaro", sublabel: "Package · .pacman" },
6465
{ kind: "appImage", label: "Any distribution", sublabel: "Portable · .AppImage" },
6566
],

0 commit comments

Comments
 (0)