Development


Branches

Branch Purpose
main Stable releases only. Merging from dev triggers a release if major or minor version increased.
dev Active development. Every push auto-increments the patch version and publishes a rolling pre-release.

Work on dev, merge to main when ready to release.


Setup

No build step — this is a PowerShell script extension. To test changes live:

  1. Clone the repo
  2. Copy or symlink PlayniteSunrise.psm1 to:
    %AppData%\Playnite\Extensions\SunshineAppExport\SunshineAppExport.psm1
    
  3. Restart Playnite to reload the extension

Important: The file must be saved as UTF-8 with BOM. Non-ASCII characters in string literals (em dashes, arrows, etc.) will cause a parse failure and silently prevent the extension from loading.


Releasing

  1. On dev, bump the minor version in extension.yaml (e.g. 0.1.x0.2.0) and update installer_manifest.yaml with the new version and PackageUrl
  2. Push to dev — CI will auto-increment the patch and publish a pre-release for final testing
  3. Merge dev into main — CI detects the minor/major bump and creates a full release automatically

Patch-only merges (from dev’s auto-increment) do not trigger a release.


Verifying Manifests

Before merging, validate extension.yaml and installer_manifest.yaml against Playnite’s schema:

.\verify.ps1

Requires Playnite to be installed (Toolbox.exe is shipped with it). The release workflow also runs this check automatically and blocks the release if validation fails.


Project Structure

File Purpose
PlayniteSunrise.psm1 Main extension — all logic lives here
extension.yaml Playnite extension manifest (id, name, version)
installer_manifest.yaml Addon database manifest — update for each release
verify.ps1 Local manifest validation script
covers/ Bundled default cover images for Playnite Desktop/Fullscreen entries
.github/workflows/dev.yml CI: patch bump + rolling pre-release on dev push
.github/workflows/release.yml CI: manifest verify + full release on main push

Runtime Data Files

The extension writes these files at runtime — they are not in the repo:

Path Contents
%LocalAppData%\PlayniteSunrise\settings.json Persistent user settings
%LocalAppData%\PlayniteSunrise\ignored_games.json Ignore list
%LocalAppData%\PlayniteSunrise\covers\*.png User-supplied cover overrides for Playnite entries
%LocalAppData%\PlayniteSunrise\Apps\*.png Exported cover art
%LocalAppData%\PlayniteSunrise\Apps\WaitForGameStop.ps1 Helper script (auto-generated)
%LocalAppData%\PlayniteSunrise\Apps\KillGameChildren.ps1 Helper script (auto-generated)
%LocalAppData%\PlayniteSunrise\Apps\WaitForPlaynite.ps1 Helper script (auto-generated)
%LocalAppData%\PlayniteSunrise\Apps\KillPlayniteIfLaunched.ps1 Helper script (auto-generated)
%LocalAppData%\PlayniteSunrise\Apps\pids_<GameId>.txt PID snapshot written at game start, read by kill script
%LocalAppData%\PlayniteSunrise\Apps\sentinel_<GameId>.txt Written by OnGameStopped to signal stream end

Credits