The repository's 15 workflow files under .github/workflows/ cover application CI, release builds and management, package registries, native STT binaries, documentation deployment, and repository automation. This reference describes their verified triggers, dependencies, and artifact flow.
flowchart TD
subgraph T1["Tier 1 — application and docs CI"]
CI["ci.yml<br/>push and PR to main"] --> Lint[lint]
CI --> Type[typecheck]
CI --> Test[unit and browser tests]
CI --> BuildSmoke[Vite build]
CI --> Semantic[semantic PR title]
Docs["docs.yml<br/>website changes or dispatch"] --> DocsBuild[website build artifact]
DocsBuild --> DocsDeploy[GitHub Pages deploy on main]
end
subgraph T2["Tier 2 — native and release builds"]
Whisper["build-whisper-stt.yml<br/>native source changes or dispatch"] --> WhisperArtifacts["four platform STT archives"]
ReleaseBuild["build.yml<br/>v* tag or dispatch"] --> Win[Windows NSIS]
ReleaseBuild --> Store[Windows AppX]
ReleaseBuild --> Mac["macOS arm64 and x64 DMGs"]
ReleaseBuild --> Linux["AppImage, deb, pacman, rpm"]
Win --> Publish[GitHub release]
Mac --> Publish
Linux --> Publish
end
subgraph T25["Tier 2.5 — release management"]
RC["prerelease.yml<br/>workflow_dispatch"] -->|dispatch build at RC tag| ReleaseBuild
Promote["promote.yml<br/>workflow_dispatch"] -->|dispatch build at stable tag| ReleaseBuild
end
subgraph T3["Tier 3 — stable package distribution"]
Homebrew[update-homebrew-cask.yml]
Winget[publish-winget.yml]
Nix[bump-nix-package.yml]
AUR[aur-publish.yml]
end
Publish -->|stable release published| Homebrew
Publish -->|stable release published| Winget
Publish -->|stable release published| Nix
Publish -->|stable release published| AUR
subgraph T4["Tier 4 — automation and diagnostics"]
PRDiscord[discord-pr-notify.yml]
Roadmap[discord-roadmap-sync.yml]
Leaderboard[discord-weekly-leaderboard.yml]
Bookkeeping[merged-pr-bookkeeping.yml]
Diagnostic[diagnostic-artifact.yml] --> DiagWin[Windows diagnostic ZIP]
Diagnostic --> DiagMac[macOS diagnostic archives]
end
The STT workflow uploads standalone archives for binary refresh and does not currently feed build.yml automatically; release packages consume binaries already staged in the source snapshot. Stable package workflows are additionally guarded against prereleases.
| Tier | Workflow | Trigger |
|---|---|---|
| 1 | ci.yml |
Push to main; pull request to main |
| 1 | docs.yml |
Website/workflow changes on main or a PR; manual dispatch |
| 2 | build.yml |
Any v* tag; manual dispatch |
| 2 | build-whisper-stt.yml |
Native STT/build-script changes; manual dispatch |
| 2.5 | prerelease.yml |
Manual dispatch |
| 2.5 | promote.yml |
Manual dispatch |
| 3 | update-homebrew-cask.yml |
Published release; manual dispatch |
| 3 | publish-winget.yml |
Published release; manual dispatch |
| 3 | bump-nix-package.yml |
Published release; manual dispatch |
| 3 | aur-publish.yml |
Published release; manual dispatch |
| 4 | discord-pr-notify.yml |
PR target, review, and issue-comment events |
| 4 | discord-roadmap-sync.yml |
Merged PR to main; push to main |
| 4 | discord-weekly-leaderboard.yml |
Monday 12:00 UTC schedule; manual dispatch |
| 4 | merged-pr-bookkeeping.yml |
Closed pull request, conditional on merge to main |
| 4 | diagnostic-artifact.yml |
Push or PR to main; manual dispatch |
ci.yml runs independent lint, typecheck, test, and renderer-build jobs. Pull requests also run semantic-pr.
| Job | Runner | Command or purpose |
|---|---|---|
lint |
Ubuntu | npm run lint |
typecheck |
Ubuntu | npx tsc --noEmit |
test |
Ubuntu | Vitest unit tests, Chromium installation, then browser-mode Vitest |
build |
Ubuntu | npx vite build; this is not electron-builder packaging |
appstream |
Ubuntu | appstreamcli validate on build/com.getopenscreen.OpenScreen.metainfo.xml |
semantic-pr |
Ubuntu | Validates Conventional Commit-style PR titles |
build/com.getopenscreen.OpenScreen.metainfo.xml is upstream AppStream metadata: the name, summary, description, licence, screenshots and release history a software centre shows instead of a bare icon. Nothing in this repository consumes it yet — the shipped deb installs a .desktop file and nine icon sizes and no /usr/share/metainfo/ at all — so the appstream job is the only thing that can catch a broken edit before a Flathub reviewer does. Its component ID is com.getopenscreen.OpenScreen, deliberately not the Electron appId com.etiennelescot.openscreen: Flathub requires the ID to map to a domain the project controls, and getopenscreen.com is that domain.
Jobs that need the root dependencies use .github/actions/setup, which requests Node 22 and runs npm ci; callers perform checkout themselves.
docs.yml is separate from the technical-documentation checker. It installs dependencies in website/, type-checks and builds the site, uploads a Pages artifact, and deploys only after a push to main.
A v* tag or manual dispatch starts platform builds. Dispatch accepts arch (arm64, x64, or both) for macOS and an optional release_tag that enables publication.
build-windowsrunsnpm run build:winand uploadsopenscreen-windowsfor 30 days.build-windows-storerunsnpm run build:win:storeand uploadsopenscreen-windows-storefor 30 days.build-macosis anarm64/x64matrix. 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.build-linuxproduces AppImage, deb, pacman, and rpm files and uploadsopenscreen-linuxfor 30 days. It asserts one artifact per format before uploading, becauseif-no-files-found: errorevaluates 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.publish-releasewaits for Windows NSIS, macOS, and Linux jobs; the Store job is not a dependency. It checks the tag againstpackage.json, downloads the NSIS/macOS/Linux artifacts, and creates or updates a GitHub release withOPENSCREEN_RELEASE_TOKEN.
The build comments and package behavior refer to the local Whisper architecture documented in transcription and captions. The STT model downloads to user data at runtime and is not a release-build asset.
This matrix builds whisper-stt-server and its ggml backend sidecars for macOS arm64, macOS x64, Linux x64, and Windows x64. It uploads four 30-day archives named whisper-stt-<platform>-<arch>. The workflow installs the platform compiler dependencies and Vulkan SDK where configured. See transcription and captions for the runtime role of these binaries.
prerelease.yml and promote.yml orchestrate the frozen release branch, version tags, milestones, build dispatch, and Discord announcements. The full procedure, fallback, branch freeze, and credential requirements live in release and secrets.
At a high level, the RC workflow creates or reuses release/vX.Y.Z, tags its tip, and dispatches build.yml at that tag. Promotion creates the stable version and tag from the same release branch, syncs it back through a PR, and dispatches the stable build at the tag.
These workflows run for stable published releases and support manual replay with a tag:
update-homebrew-cask.ymlwaits for both macOS DMGs, hashes them, writes a cask, and pushes to the configured tap. Manual replay refuses any tag that is not a stablevMAJOR.MINOR.PATCH, becauseworkflow_dispatchtakes free text and theprereleasefilter only covers thereleaseevent.publish-winget.ymlpasses the matching NSIS release asset towinget-releaser.bump-nix-package.ymlcomputesnpmDepsHash, updatesnix/package.nix, and opens a PR.aur-publish.ymlhashes the pacman release asset, updatesPKGBUILDand.SRCINFO, and pushes over SSH.
Each workflow needs variables or credentials, and where it checks for them decides whether a missing one is visible. update-homebrew-cask.yml and publish-winget.yml check inside a step that emits a warning, so an unconfigured channel says so in the run summary; a job-level if: would instead report skipped, which reads as green and hid #148 for eight releases and the Homebrew cask for its entire existence (#335). bump-nix-package.yml uses the repository GITHUB_TOKEN; the others require the external registry credentials described in release and secrets.
discord-pr-notify.ymlmirrors PR events, reviews, and comments into a Discord forum thread. It iscontinue-on-error, so Discord does not block PR work.discord-roadmap-sync.ymlupdates a pinned Discord roadmap message after a merged PR or push tomain.discord-weekly-leaderboard.ymlposts a weekly contributor leaderboard.merged-pr-bookkeeping.ymlfinds closing issue references, applies pending-release labels and the rolling milestone, closes the issue, and adds an idempotent marker comment.diagnostic-artifact.ymlbuilds WGC and ScreenCaptureKit helpers and bundles platform diagnostics. Its Windows ZIP and two macOS archives are retained for 14 days.
Release platform artifacts have 30-day Actions retention. publish-release copies the NSIS installer, two architecture-specific DMGs when present, and Linux packages into the GitHub release. It intentionally does not download the independently uploaded Store artifact. A stable published release then fans out to Homebrew, WinGet, Nix, and AUR.
Diagnostic artifacts remain Actions-only for 14 days. Whisper archives remain Actions-only for 30 days and are used as a binary-refresh output rather than being downloaded by the release workflow. The website build artifact flows only into GitHub Pages deployment.