# Packages and their versions

Version and changes of the packages for developers — API client, Apps SDK, CLI, and contracts, newest first.

> **Type:** reference
> **For:** developers who work with one of these packages and want to know what changed in a version.
> **Prerequisite:** none.

The list is built with every new version from the change notes of the platform and shows their section for developers. There is no public way to obtain the packages today; the page says which version applies and what changed in it.

| Package | Version |
|---|---|
| `@szenera/cli` | `0.4.0` |
| `@szenera/client` | `0.6.0` |

## @szenera/cli

### 0.4.0 · 2026-10-25

**Breaking changes**

- The stored sign-in state carries the fields `token` and `expiresAt`. Upgrade: An old sign-in state counts as signed out, and the next sign-in writes the new one. ([#821](https://github.com/HKNovaTechUG/digital-signage-2026/pull/821))

**Added**

- New commands `szenera proof list`, `szenera proof show`, and `szenera proof download`. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- New commands `szenera analytics overview`, `szenera analytics explore`, and `szenera analytics delivery <acp_…>`. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- New commands `advertiser list`, `advertiser get`, `advertiser create`, `campaign list`, `campaign get`, `booking list`, `creative list`, and `creative approve`. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))

**Changed**

- The archive follows the client with the revenue statements, without a new command. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- The archive follows the client without the read routes of the minute counting and the insights. The commands stay. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- The archive follows the client with the panel sources `cec`, `ddc`, and `none`. The commands stay. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- The command line ships the client that knows a sign-in host of its own. Without a setting, nothing changes. ([#825](https://github.com/HKNovaTechUG/digital-signage-2026/pull/825))
- The archive follows the client with `campaignId` per proof of the campaign report. The commands stay. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- The archive bundles the current state of the contracts, and the commands of `szenera` stay the same. ([#847](https://github.com/HKNovaTechUG/digital-signage-2026/pull/847))
- `szenera playlist get` shows an ad break as "Werbeblock · 3 Plätze à 10 s" with its duration. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))

### 0.3.0 · 2026-10-23

**Breaking changes**

- Die JSON-Ausgabe der Kommandozeile nennt dieselben Namen wie die API. Umstieg: Skripte, die die JSON-Ausgabe lesen, auf die englischen Feldnamen umstellen. ([#761](https://github.com/HKNovaTechUG/digital-signage-2026/pull/761)) *(German only)*
- `szenera api-key revoke <akm_…> --compromised` nennt den Grund des Widerrufs. `szenera api-key list` mit einem Schlüssel-Profil antwortet 401. Umstieg: Für `szenera api-key list` ein Profil mit Sitzung verwenden. ([#762](https://github.com/HKNovaTechUG/digital-signage-2026/pull/762)) *(German only)*

**Added**

- Die Typen folgen der API: Feed-Katalog, Quellen für den Betrieb und der Fehlercode `FeedSource.NotFound`. ([#801](https://github.com/HKNovaTechUG/digital-signage-2026/pull/801)) *(German only)*
- Neue Aufrufe: Zusammenfassung, Sammelaktion und Wiederherstellen von Benachrichtigungen, dazu `state` und `groupKey` an der Liste. ([#795](https://github.com/HKNovaTechUG/digital-signage-2026/pull/795)) *(German only)*
- `playerId` an der Vorschau der Widget-Daten und der Lesebereich `player-location`. ([#801](https://github.com/HKNovaTechUG/digital-signage-2026/pull/801)) *(German only)*
- Standorte: `region` und `openingHours`, dazu das Ereignis `fleet.location.opening-hours-changed`. ([#801](https://github.com/HKNovaTechUG/digital-signage-2026/pull/801)) *(German only)*
- Widget-Definitionen des Katalogs kennen `size` und `preview.states`, Ansichten des Stores kennen `size`. ([#801](https://github.com/HKNovaTechUG/digital-signage-2026/pull/801)) *(German only)*

### 0.2.3

**Changes**

- `GET /v1/audit/bulk/:correlationId` entfällt und mit ihm `client.audit.auditBulk` und das Schema `GetBulkActionDetailResponse`. ([#742](https://github.com/HKNovaTechUG/digital-signage-2026/pull/742)) *(German only)*
- Das Recht `audit.bulk.read`, die Ereignisart `audit.bulk-action.completed` und der Fehlercode `Internal.AuditBulkActionDetailRepositoryUnavailable` entfallen. ([#742](https://github.com/HKNovaTechUG/digital-signage-2026/pull/742)) *(German only)*

### 0.2.2

**Changes**

- `@szenera/contracts`: neu `CatalogAppSchema`, `AppReleaseNotesSchema` (Notizen je Zielgruppe und Sprache), `AppReleaseEventSchema`, `RestoreAppRelease*`, `ListAppReleaseHistory*` und `GetAppVersionHistory*`. Ein `AppRelease` trägt `notes`, die Wire-Form daneben weiter `releaseNotes`. `PATCH /v1/platform/app-catalog/apps/{appId}/releases/{id}` nimmt `notes` je Zielgruppe oder wie bisher `releaseNotes`. ([#677](https://github.com/HKNovaTechUG/digital-signage-2026/pull/677)) *(German only)*
- Ein Grant trägt `installedReleaseId`, `pendingReleaseId`, `pendingReasons` und `pendingDeadline`, ein Zustimmungs-Nachweis `releaseId`, eine offene Zustimmung `fromVersion`, `toVersion`, `reasons` und `deadline`. Entfallen sind `autoUpgrade` am Grant und `ConfigSchemaChangedPayloadSchema`. ([#677](https://github.com/HKNovaTechUG/digital-signage-2026/pull/677)) *(German only)*
- `GET /v1/apps/{appId}/history` liefert einer Organisation die Fassungen einer App, die stable erreicht haben, mit Datum und „Neu in dieser Fassung" in der erbetenen Sprache (`?locale=en-US`, ohne Angabe Deutsch). ([#677](https://github.com/HKNovaTechUG/digital-signage-2026/pull/677)) *(German only)*
- `@szenera/api-client`: neu `client.platform.appCatalogAppsHistory.list`, `client.platform.appCatalogAppsReleases.restore` und `client.appCatalog.appsHistory.list`. `@szenera/client`: neu `client.appCatalog.appsHistory.list`. `@szenera/cli` bündelt die neuen Verträge, ihre Befehle bleiben, wie sie sind. ([#677](https://github.com/HKNovaTechUG/digital-signage-2026/pull/677)) *(German only)*
- Das scenes-Bündel der Momentaufnahme trägt `appVersions` (je App die eine Fassung des Displays) sowie `appRendererHosts` und `appWidgetTypes` je `<appId>@<version>`, alle mit der Vorgabe `{}`. Die Pins der Szenen und Widgets nennen dieselbe Fassung. ([#683](https://github.com/HKNovaTechUG/digital-signage-2026/pull/683)) *(German only)*
- `displayAppVersion(pins, installed)` in `@szenera/contracts/composition` rechnet die Fassung eines Displays: die installierte, bei gehaltenen Pins älterer Hauptnummern die niedrigste davon. ([#683](https://github.com/HKNovaTechUG/digital-signage-2026/pull/683)) *(German only)*
- Die neue Befundart `AppVersionHeld` ist immer eine Warnung und trägt `appId`, `appName`, `version`, `installedVersion` und `widgetIds`. Die KI-Anbindung erklärt sie. ([#683](https://github.com/HKNovaTechUG/digital-signage-2026/pull/683)) *(German only)*
- `@szenera/client`: Der Filter `type` der Integritäts-Befunde einer Szene kennt `AppVersionHeld`. `@szenera/cli` bündelt den erweiterten Vertrag, ihre Befehle bleiben, wie sie sind. ([#683](https://github.com/HKNovaTechUG/digital-signage-2026/pull/683)) *(German only)*
- Ein Zustimmungs-Nachweis trägt `version`, die Nummer der Fassung, der zugestimmt wurde (`null` nur bei Nachweisen von davor, deren Fassung schon fehlte). Eine Installation trägt `declinedAt` neben `declinedVersion`. ([#681](https://github.com/HKNovaTechUG/digital-signage-2026/pull/681)) *(German only)*
- `GET /v1/apps/{appId}/history` nennt je Fassung `releaseId`, dieselbe Kennung wie an Installation, Nachweis und Update-Entscheidung. ([#681](https://github.com/HKNovaTechUG/digital-signage-2026/pull/681)) *(German only)*
- `@szenera/client`: `client.appCatalog.appsHistory.list` nennt je Fassung `releaseId`, eine Installation trägt `declinedAt`. `@szenera/cli` bündelt die erweiterten Verträge, ihre Befehle bleiben, wie sie sind. ([#681](https://github.com/HKNovaTechUG/digital-signage-2026/pull/681)) *(German only)*
- `@szenera/widget-editor`: `EditorShell` nimmt `appsAwaitingUpdate` (Apps samt Weg zur Entscheidung). Der App-Bereich zeigt ihre Widgets mit „Update wartet“, ein Klick führt zur Entscheidung statt einzufügen. ([#681](https://github.com/HKNovaTechUG/digital-signage-2026/pull/681)) *(German only)*
- Neue Routen der Organisation: `GET /v1/me/apps/updates` und `GET /v1/me/apps/{appId}/update` liefern die Entscheidung über ein Update (Fassung von und nach, Gründe, Neues, Änderungen in Klartext, Folgen, Frist, ob Ablehnen noch geht), `POST /v1/me/apps/{appId}/update/accept` und `…/update/reject` entscheiden mit dem Hash der Ziel-Fassung. ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- Kanäle mit Publikum: `GET|PUT /v1/me/apps/beta-enrollment` und `POST|DELETE /v1/me/apps/{appId}/beta-enrollment` tragen eine Organisation für Fassungen aus beta ein, global oder je App. Store, App-Seite, Installation und Upgrade nehmen die höchste Fassung, die die Organisation sieht, die Liste trägt dazu `channel`. ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- Schwimmende Pins: `effectiveAppVersion(pin, installed)` in `@szenera/contracts/composition`. Die Momentaufnahme nennt die gespielte Fassung. `GET /v1/me/apps/{appId}/scene-pins` und `POST …/scene-pins/lift` heben alle Szenen auf die installierte Fassung, je Szene als neue veröffentlichte Fassung. ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- `POST /v1/marketplace/apps/{appId}/upgrade` geht nur vorwärts und nur auf Fassungen, die die Organisation sieht. Neuer Fehlercode `App.UpdateUnavailable` (409, `details.reason`: `not-forward`, `none`, `not-rejectable`). ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- Entfallen sind `GET /v1/me/pending-reacceptances`, `POST /v1/marketplace/apps/{appId}/accept` und `…/reject` samt ihren Verträgen. `RetireAppReleaseRequest` nimmt `grace` und `securityAdvisory` statt `graceMonths`. ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- Neue Ereignisse `marketplace.app.update-declined`, `marketplace.app.update-withdrawn` und `marketplace.app.release-switched`. `app-catalog.app-release.retired` und `…grace-expired` tragen `successorVersion`. Ein Grant trägt `declinedReleaseId` und `declinedVersion`, ein Nachweis `reasons`, eine Fassung `securityAdvisory`. ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- `@szenera/client` und `@szenera/api-client`: neu `me.appsUpdates.list`, `me.appsUpdate.list/accept/reject`, `me.appsBetaEnrollment.*` und `me.appsScenePins.list/lift`, entfallen `me.pendingReacceptances` und `marketplace.marketplaceApps.accept/reject`. `szenera app accept` und `app reject` nutzen die neuen Routen, ihre Aufrufe bleiben gleich. ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- `@szenera/client` und `@szenera/cli` bündeln die erweiterten Verträge der Plattform. Ihre Aufrufe und Befehle bleiben, wie sie sind. ([#697](https://github.com/HKNovaTechUG/digital-signage-2026/pull/697)) *(German only)*
- `@szenera/contracts` baut je Quelldatei ein Modul (`dist/<domain>/<pfad>.js`), und die `exports`-Karte trägt das Muster `./*`: Jedes Blatt ist ladbar (`@szenera/contracts/app-catalog/app-manifest/locked-app`). Die benannten Subpaths bleiben, auch die drei des Host-Vertrags der App-Laufzeit (`composition`, `media-library`, `shared`): `appRuntimeHostSpecifiers` steht unverändert, die Import-Map der Anzeige kennt keinen neuen Namen. Ein Import aus einem Barrel kostet nur noch die Blätter, deren Exporte gebraucht werden (`sideEffects` nennt allein `openapi-extend`). ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- Jede Datei, deren Code `.openapi(…)` ruft, importiert `openapi-extend` selbst. Wer ein Blatt direkt lädt, braucht den Barrel seiner Domäne nicht mehr, damit die Zod-Erweiterung vor dem Schema läuft. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- `@szenera/apps-sdk` liest Widget-Definition, Konfigurations-Schema und Manifest aus den Blättern des App-Katalogs statt aus dessen Barrel. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- `@szenera/client` und `@szenera/cli`: Die Archive sind neu geschnitten, weil die eingebündelten Verträge ihre Nebenwirkungs-Importe je Blatt tragen. Oberfläche und Deckel bleiben, wie sie sind. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- Neue Routen des Stores (session): `GET /v1/me/apps/store` (Karten, Filter mit Zahlen, Zählung, Kernfunktionen), `GET /v1/me/apps/store/{appId}` (Eintrag mit fertig entschiedener Lage, Sprache per `locale` oder `Accept-Language`), `GET /v1/me/apps/collections`, `GET /v1/me/apps/{appId}/installed` (App-Seite der installierten Fassung), `POST /v1/me/apps/{appId}/install-request`, `POST /v1/me/apps/{appId}/update/decision-request`, `GET /v1/me/apps/{appId}/data`, `POST` und `DELETE /v1/me/apps/{appId}/data/deletion`. Fehler `OwnerRequest.NotApplicable`, `AppData.NotDeletable` und `AppData.DeletionNotFound`. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- Neue Pflege-Routen (Betreiber): `GET`, `POST /v1/platform/app-catalog/collections`, `PATCH …/collections/{collectionKey}`, `PUT …/collections/order`. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- `@szenera/contracts`: `StoreEntryView`, `StoreCardView`, `StoreSituation` (Lage, genau eine Handlung, Grund mit Zahlen), Sammlungen, Bitten, App-Daten. Das Manifest trägt am Ende den optionalen Block `compatibility`. `preview.screenshots` wird nicht mehr gelesen, und die Liste des Marktplatzes führt es nicht mehr (Bruch). `InstalledApp.coreFeature`, `GetAppUpdateResponse.decisionRequest`, `SetPlayerProgramResponse.warnings`, `vertical` an der Organisation und im Profil. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- `@szenera/client` und `@szenera/api-client`: `me.appsStore`, `me.appsCollections`, `me.appsInstalled`, `me.apps.installRequest`, `me.appsUpdate.decisionRequest`, `me.appsData`, `me.appsDataDeletion`, `platform.appCatalogCollections`. `@szenera/cli` bündelt die erweiterten Verträge, seine Befehle bleiben, wie sie sind. `@szenera/agent` kennt die neuen Fehlercodes. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- `@szenera/apps-sdk`: `AppLifecycleHooks` hat zwei weitere freiwillige Punkte, `inventory(tenantId)` (Einträge je Datenbereich) und `purge(tenantId)` (alles endgültig löschen, idempotent). Sie kommen nur zusammen, eine Klasse mit nur einem von beiden lehnt der Boot ab. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- `@szenera/contracts`: Das Manifest trägt `translations`, je Sprache ein Block nur mit Texten (`AppManifestTranslationsSchema`). Dazu `appManifestLocales()`, `localizeAppManifest()` und `appManifestTranslationIssues()`. Der Store antwortet in `locale` oder `Accept-Language` und nennt die Sprache der Texte in `textLocale`. Entfallen sind `MarketplaceAppListingSchema` und die Anwendungsfälle der entfallenen Routen, `GetInstalledAppResponse` trägt `history`, die Store-Übersicht `coreFeatures` mit der angebotenen Fassung. `PortalFeatureEntry` trägt keinen Namen mehr, die Namen stehen in den Texten des Stores. ([#699](https://github.com/HKNovaTechUG/digital-signage-2026/pull/699)) *(German only)*
- `@szenera/client`: `client.marketplace.apps.list` und `.get` sowie `client.me.installedApps` sind entfallen, `client.me.apps.list({ locale })` liefert die installierten Apps. ([#699](https://github.com/HKNovaTechUG/digital-signage-2026/pull/699)) *(German only)*
- `@szenera/apps-sdk`: `defineAppManifest` wirft bei einem unvollständigen Übersetzungsblock und nennt die Stelle. ([#699](https://github.com/HKNovaTechUG/digital-signage-2026/pull/699)) *(German only)*
- `@szenera/widget-editor`: `schemaFieldText(schema, pfad)` und `splitFieldDescription()` lesen Beschriftung und Hilfe eines Felds aus `.describe('Titel|Satz')`, `APP_CATEGORY_LABEL_KEYS` ordnet die Kategorien den Beschriftungen der Palette zu. ([#699](https://github.com/HKNovaTechUG/digital-signage-2026/pull/699)) *(German only)*
- `@szenera/cli` liest Apps über die Store-Routen, die Befehle bleiben, wie sie sind. ([#699](https://github.com/HKNovaTechUG/digital-signage-2026/pull/699)) *(German only)*

### 0.2.1

No entry for developers.

### 0.2.0

**Breaking changes**

- Die Kommandozeile heißt jetzt `szenera`. Das Paket `@szenera/cli` liefert das Programm unter diesem Namen aus, der Name `signage` entfällt ohne Übergang. ([#618](https://github.com/HKNovaTechUG/digital-signage-2026/pull/618)) *(German only)*
- Die Umgebungsvariablen heißen `SZENERA_PROFILE`, `SZENERA_BASE_URL`, `SZENERA_API_KEY`, `SZENERA_OUTPUT` und `SZENERA_PROFILE_FILE`. Variablen mit dem Präfix `SIGNAGE_` liest die Kommandozeile nicht mehr. ([#618](https://github.com/HKNovaTechUG/digital-signage-2026/pull/618)) *(German only)*
- Die Profil-Datei liegt unter `~/.config/szenera/profile.json`. Ein zwischengespeichertes Zugriffsmerkmal liegt daneben, nach dem Umzug meldet sich die Kommandozeile einmal neu an. ([#618](https://github.com/HKNovaTechUG/digital-signage-2026/pull/618)) *(German only)*
- In der Sitzungsliste erscheint die Kommandozeile als `szenera-cli` mit ihrer Fassung. ([#618](https://github.com/HKNovaTechUG/digital-signage-2026/pull/618)) *(German only)*
- Die Befehle des Plattformbetriebs sind nicht mehr enthalten. `szenera` führt 122 Befehle für Organisationen: Medien, Szenen, Programme, Geräte, Team, Schlüssel, Abonnement und den Notausgang `api`. ([#618](https://github.com/HKNovaTechUG/digital-signage-2026/pull/618)) *(German only)*
- Ein Profil für den Plattformbetrieb (`"audience": "operator"`) weist die Kommandozeile beim Lesen ab. ([#618](https://github.com/HKNovaTechUG/digital-signage-2026/pull/618)) *(German only)*
- `permission catalog --key-eligible` zeigt jetzt die Rechte, die ein Schlüssel der eigenen Organisation tragen darf. ([#618](https://github.com/HKNovaTechUG/digital-signage-2026/pull/618)) *(German only)*
- `invoice list` kennt die Flagge `--status` nicht mehr. Für eine Organisation blieb sie bisher ohne Wirkung. ([#618](https://github.com/HKNovaTechUG/digital-signage-2026/pull/618)) *(German only)*
- Die Pakete heißen jetzt `@szenera/*` und die Apps `@szenera-app/*`, Importe und Abhängigkeiten sind entsprechend anzupassen. ([#610](https://github.com/HKNovaTechUG/digital-signage-2026/pull/610)) *(German only)*

**Changes**

- `POST /v1/devices/:id/release` mit `reason` ersetzt `POST /v1/devices/:id/reset`. ([#601](https://github.com/HKNovaTechUG/digital-signage-2026/pull/601)) *(German only)*
- Neu sind `POST /v1/devices/:id/block`, `PATCH /v1/devices/:id` sowie `release`, `block` und `unblock` unter `/v1/platform/ops/devices/:id`. ([#601](https://github.com/HKNovaTechUG/digital-signage-2026/pull/601)) *(German only)*
- `POST /v1/players/:id/decommission` entfällt, und `DELETE /v1/players/:id` nimmt die Angabe `device` mit `reconnect`, `remove` oder `keep`. ([#601](https://github.com/HKNovaTechUG/digital-signage-2026/pull/601)) *(German only)*
- Der Zustand eines Geräts ist nur noch `unclaimed`, `active` oder `blocked`. ([#601](https://github.com/HKNovaTechUG/digital-signage-2026/pull/601)) *(German only)*
- Neue Fehlercodes sind `Auth.DeviceBlocked`, `Device.Blocked`, `Device.NotBlocked` und `Player.KeepDeviceNotAllowed`, und `Auth.DeviceSuspended` entfällt. ([#601](https://github.com/HKNovaTechUG/digital-signage-2026/pull/601)) *(German only)*
- Die Ereignisse `identity.device.blocked` und `identity.device.unblocked` kommen hinzu, `identity.device.decommissioned` entfällt, und `identity.device.released` trägt einen `reason`. ([#601](https://github.com/HKNovaTechUG/digital-signage-2026/pull/601)) *(German only)*
- `POST /v1/devices/register` antwortet einem gekoppelten Gerät mit neuem Schlüssel mit `409 Device.ReregistrationPending` und dem Gerätenamen in `details.deviceName` und ersetzt damit den Code `Device.ReregistrationBlocked`. ([#607](https://github.com/HKNovaTechUG/digital-signage-2026/pull/607)) *(German only)*
- Neu ist `POST /v1/devices/:id/reregistration` mit `decision` `keep`, `reconnect` oder `block` samt `reason`, dazu der Fehlercode `Device.ReregistrationNotPending`. ([#607](https://github.com/HKNovaTechUG/digital-signage-2026/pull/607)) *(German only)*
- Geräte tragen die Felder `reregistrationRequestedAt`, `reregistrationAttempts`, `reregistrationSourceIp` und `reregistrationAllowedUntil`. ([#607](https://github.com/HKNovaTechUG/digital-signage-2026/pull/607)) *(German only)*
- Die Ereignisse `identity.device.reregistration-requested` und `identity.device.reregistration-decided` kommen hinzu, ebenso die Benachrichtigungs-Art `identity.device-reregistration-requested`. ([#607](https://github.com/HKNovaTechUG/digital-signage-2026/pull/607)) *(German only)*
- Die Befehlsart `factory-reset` entfällt, denn ein Gerät wird nur noch über die Freigabe geleert. ([#607](https://github.com/HKNovaTechUG/digital-signage-2026/pull/607)) *(German only)*
- Die Erstanmeldung eines Browsers unter der Kennung eines gekoppelten WebDisplays antwortet mit `Device.AlreadyClaimed`. ([#607](https://github.com/HKNovaTechUG/digital-signage-2026/pull/607)) *(German only)*
- Der Block `host` der Gerätefähigkeiten kennt zwei weitere Plattformen: `vega` für Fire TV mit Vega OS und `extension` für die Erweiterung für Chrome. Bisher meldet kein Gerät sie. ([#636](https://github.com/HKNovaTechUG/digital-signage-2026/pull/636)) *(German only)*
- Die Fähigkeiten eines Geräts kennen den Block `remote` nicht mehr. Die Erweiterung meldet sich im Block `host` mit `platform: extension`. Der Block `host` trägt dazu `bridge` (die Brückenfassung des Wirts) und `bootStart` (ob der Wirt von selbst startet). ([#640](https://github.com/HKNovaTechUG/digital-signage-2026/pull/640)) *(German only)*
- Die Archive von `@szenera/client` und `@szenera/cli` werden jetzt geprüft, bevor eine Fassung erscheinen darf: Sie tragen nur die eigenen Dateien, keine Route außerhalb der öffentlichen Spezifikation und keinen Verweis auf ein unveröffentlichtes Paket, und die Installation gelingt auf Node 22 und 24. ([#620](https://github.com/HKNovaTechUG/digital-signage-2026/pull/620)) *(German only)*
- Die gepackte Größe jedes Archivs ist gedeckelt, und jedes Archiv trägt einen Fingerabdruck seiner Dateien. Ändert sich ein Archiv, gehört dazu eine neue Fassung. ([#620](https://github.com/HKNovaTechUG/digital-signage-2026/pull/620)) *(German only)*
- `@szenera/cli` bringt Kern, Befehle, die Module des öffentlichen Klienten und die Verträge in einer einzigen Datei mit. `@szenera/client` bringt seine Typen je Unterpfad mit und braucht neben `zod` nichts aus der Plattform. ([#620](https://github.com/HKNovaTechUG/digital-signage-2026/pull/620)) *(German only)*
- Die Kommandozeile nimmt nur noch Schlüssel einer Organisation (`ak_…`) an und nennt in ihrer Kennung die Fassung aus ihrem eigenen Manifest. ([#620](https://github.com/HKNovaTechUG/digital-signage-2026/pull/620)) *(German only)*
- Veröffentlicht ist weiterhin nichts. ([#620](https://github.com/HKNovaTechUG/digital-signage-2026/pull/620)) *(German only)*
- Der Herzschlag eines Geräts nennt im Block `renderer` die Fassung, den Bau und die Quelle der Anzeige (`bundle` oder `hosted`), dazu die Folge der zuletzt angenommenen Freigabe und seit wann das Bündel aktiv ist. Alle Felder sind optional. ([#633](https://github.com/HKNovaTechUG/digital-signage-2026/pull/633)) *(German only)*
- Geräte tragen statt `runtime` den Block `software` (je Baustein Fassung, Bau und angenommene Freigabe), dazu `channel` und `softwareTarget`, das Soll ihres Kanals. Player tragen kein `capabilities` mehr, der gemeldete Zustand kein `reportedState.capabilities`. Was ein Gerät kann, steht in seinen Fähigkeiten, deren Block `software` `runtime` ersetzt. ([#642](https://github.com/HKNovaTechUG/digital-signage-2026/pull/642)) *(German only)*
- Der Zustand der Anzeige (`lastTelemetry.renderer`) nennt das Bau-Profil (`modern` oder `legacy`). ([#642](https://github.com/HKNovaTechUG/digital-signage-2026/pull/642)) *(German only)*
- `PlayerCapabilitySchema` und die beiden `OS_CHANNELS` entfallen, `ReleaseChannel` lebt in `@szenera/contracts/shared` neben `PROTOCOL_SERVED`. Die Selbstsicht trägt `channel` und `softwareTarget`. `channel` fehlt, solange die Cloud keinen Kanal für das Gerät führt, `currentOsChannel` bleibt für ältere Fernwartungen. ([#642](https://github.com/HKNovaTechUG/digital-signage-2026/pull/642)) *(German only)*
- Beispiele der Vorfassungen je Naht liegen unter `packages/contracts/src/samples/protocols/`, Tests in TypeScript und Go legen sie den heutigen Lesern vor. ([#642](https://github.com/HKNovaTechUG/digital-signage-2026/pull/642)) *(German only)*
- Die Kommandozeile ändert kein Verhalten. Ihr Archiv trägt den neuen Stand der Verträge (Servicemenü am Gerät), deshalb ein neuer Fingerabdruck. ([#628](https://github.com/HKNovaTechUG/digital-signage-2026/pull/628)) *(German only)*
- `HOST_EDITIONS`, `HostEditionSchema` und `HostEdition` stehen in `@szenera/contracts/fleet` und im Einstieg `@szenera/contracts/fleet/host-bridge`. Die Beschreibung eines Wirts in `@szenera/host-bridge` nimmt `edition`. ([#653](https://github.com/HKNovaTechUG/digital-signage-2026/pull/653)) *(German only)*
- Das Archiv von `@szenera/cli` ist mit esbuild 0.28 neu gebündelt. Befehle und Verhalten sind unverändert, nur der Fingerabdruck des Archivs ist neu. ([#621](https://github.com/HKNovaTechUG/digital-signage-2026/pull/621)) *(German only)*

### 0.1.0

Stand vor den Änderungsnotizen — die erste Fassung mit eigener Zahl. Was davor geschah, steht im Verlauf des Quellbaums; diese Liste beginnt mit der nächsten Fassung. *(German only)*

## @szenera/client

### 0.6.0 · 2026-10-25

**Breaking changes**

- `analytics.analyticsReports` is `@beta` and carries a `SavedExploreQuery` as its query. The only formats are `csv` and `pdf`. Upgrade: Recreate reports as a query of the ad hoc analysis. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- `analytics.analyticsPlayback`, `analytics.playersPlayback`, `analytics.mediaAssetsPlayback`, `analytics.analyticsInsightsOverview`, and `analytics.analyticsInsights` are removed. Upgrade: Read the new analytics through `analytics.analyticsOverview`, `analytics.analyticsPlayersDay`, and `analytics.analyticsExplore`. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- Entries of playlists and of the timeline of a display know the kind `adPod`, the ad break with slots, spot length, and filler. Upgrade: Handle entries with `kind: 'adPod'` when reading playlists and timelines. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))

**Added**

- `analytics.analyticsExplore.create` and `.export`, `analytics.analyticsCatalog.list` and `analytics.analyticsOverview.list` (beta) for query, catalog, output, and overview. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- `analytics.analyticsPlayersDay.list`, `analytics.analyticsPlayersPlays.list`, `analytics.analyticsContent.list` and `.byId`, `analytics.analyticsCampaignsDelivery.list` (beta). ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- `fleet.playersScreenshots.list` and `fleet.playersScreenshots.byId` (beta) read the time series of screenshots of a display. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- `analytics.analyticsProofs` (`list`, `byId`, `interim`), `analytics.analyticsProofsFiles.byId`, and `analytics.analyticsShareLinks` (`list`, `create`, `remove`), all beta. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- `analytics.publicProofKeys.list`, `analytics.publicProofs.verify`, and `analytics.publicCampaignReports` (`open`, `proofFile`) call without sign-in, all beta. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- `advertising.advertisingRevenue.list` (beta) reads the revenue statements of the organization, with allocation per ad campaign and a reference to the credit note. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- The factory accepts `authBaseUrl`. Sign-in, session, OAuth, SCIM, and invitation go to this host, everything else to `baseUrl`. Without the setting, nothing changes. ([#825](https://github.com/HKNovaTechUG/digital-signage-2026/pull/825))
- `analytics.publicCampaignReports.open` returns `campaignId` per proof. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- New module `advertising` (beta): advertisers, ad campaigns, bookings, creatives, ad space, audience, participation, and settings. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- Locations carry `venueType`, the type of venue. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))

**Changed**

- `analytics.analyticsPlayersDay.list` names `cec`, `ddc`, or `none` as the source of the panel state and, as the reason for a plan revision, only what planning sets. ([#822](https://github.com/HKNovaTechUG/digital-signage-2026/pull/822))
- The bundled types follow the cleaned-up catalog of error codes and events. Codes and events of the removed distribution campaigns and the OS shelf no longer exist. ([#847](https://github.com/HKNovaTechUG/digital-signage-2026/pull/847))

### 0.5.0 · 2026-10-23

**Breaking changes**

- Das Paket nutzt das englische API-Format. Felder, Typen und Werte in Billing, Lizenzen, Abbildern und Bündeln heißen anders. Umstieg: Die Namen im eigenen Code ersetzen, etwa `zielstand` durch `targetState` und `herkunft` durch `provenance`. ([#761](https://github.com/HKNovaTechUG/digital-signage-2026/pull/761)) *(German only)*
- `me.apiKeys.remove(id, { reason })` verlangt den Grund `owner-rotation` oder `compromised`. Unter `/v1/me` antworten mit einem Schlüssel nur noch fünf Lesewege, alle übrigen mit 401. Umstieg: Den Grund mitsenden und Automation auf die fünf Lesewege beschränken. ([#762](https://github.com/HKNovaTechUG/digital-signage-2026/pull/762)) *(German only)*

**Added**

- Dokumente: Varianten `page-<n>` und `page-<n>-sm`, `pageCount` an Medien und der Befund `DocumentPagesChanged`. ([#801](https://github.com/HKNovaTechUG/digital-signage-2026/pull/801)) *(German only)*
- Die Typen folgen der API: Feed-Katalog, Quellen für den Betrieb und der Fehlercode `FeedSource.NotFound`. ([#801](https://github.com/HKNovaTechUG/digital-signage-2026/pull/801)) *(German only)*
- Neue Aufrufe: Zusammenfassung, Sammelaktion und Wiederherstellen von Benachrichtigungen, dazu `state` und `groupKey` an der Liste. ([#795](https://github.com/HKNovaTechUG/digital-signage-2026/pull/795)) *(German only)*
- `playerId` an der Vorschau der Widget-Daten und der Lesebereich `player-location`. ([#801](https://github.com/HKNovaTechUG/digital-signage-2026/pull/801)) *(German only)*
- Standorte: `region` und `openingHours`, dazu das Ereignis `fleet.location.opening-hours-changed`. ([#801](https://github.com/HKNovaTechUG/digital-signage-2026/pull/801)) *(German only)*
- Widget-Definitionen des Katalogs kennen `size` und `preview.states`, Ansichten des Stores kennen `size`. ([#801](https://github.com/HKNovaTechUG/digital-signage-2026/pull/801)) *(German only)*

**Changed**

- Billing: `zielstand` heißt `targetState`, `regel` heißt `rule`, `teilstorno` heißt `partialCancellation`, `staffel` heißt `tierScale`, `testphase` heißt `trialCredit`. ([#761](https://github.com/HKNovaTechUG/digital-signage-2026/pull/761)) *(German only)*
- Billing: `belegteBildschirme` heißt `usedDisplays`, `zyklusVormerkung` heißt `pendingBillingCycle`, `restguthabenCents` heißt `remainingCreditCents`, `mindestBildschirme` heißt `minDisplays`. ([#761](https://github.com/HKNovaTechUG/digital-signage-2026/pull/761)) *(German only)*
- Lizenzen: `konfliktBis` heißt `conflictUntil`, `lizenzKonfliktBis` heißt `licenseConflictUntil`, `vormerkungWirktAm` heißt `pendingChangeEffectiveAt`, `mandant` heißt `tenant`. ([#761](https://github.com/HKNovaTechUG/digital-signage-2026/pull/761)) *(German only)*
- Abbilder und Bündel: `herkunft` heißt `provenance` mit `environment`, `appAnchor` und `otaAnchor`. Die Liste der Abbilder filtert über `?environment=`. ([#761](https://github.com/HKNovaTechUG/digital-signage-2026/pull/761)) *(German only)*
- Rollen liest der Client über `assignments` mit `roleId` und `expiresAt` statt über `roleIds`. ([#762](https://github.com/HKNovaTechUG/digital-signage-2026/pull/762)) *(German only)*

### 0.4.0

**Breaking changes**

- `GET /v1/audit/bulk/:correlationId` entfällt und mit ihm `client.audit.auditBulk` und das Schema `GetBulkActionDetailResponse`. ([#742](https://github.com/HKNovaTechUG/digital-signage-2026/pull/742)) *(German only)*
- Das Recht `audit.bulk.read`, die Ereignisart `audit.bulk-action.completed` und der Fehlercode `Internal.AuditBulkActionDetailRepositoryUnavailable` entfallen. ([#742](https://github.com/HKNovaTechUG/digital-signage-2026/pull/742)) *(German only)*

### 0.3.0

**Breaking changes**

- Neue Routen der Organisation: `GET /v1/me/apps/updates` und `GET /v1/me/apps/{appId}/update` liefern die Entscheidung über ein Update (Fassung von und nach, Gründe, Neues, Änderungen in Klartext, Folgen, Frist, ob Ablehnen noch geht), `POST /v1/me/apps/{appId}/update/accept` und `…/update/reject` entscheiden mit dem Hash der Ziel-Fassung. ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- Kanäle mit Publikum: `GET|PUT /v1/me/apps/beta-enrollment` und `POST|DELETE /v1/me/apps/{appId}/beta-enrollment` tragen eine Organisation für Fassungen aus beta ein, global oder je App. Store, App-Seite, Installation und Upgrade nehmen die höchste Fassung, die die Organisation sieht, die Liste trägt dazu `channel`. ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- Schwimmende Pins: `effectiveAppVersion(pin, installed)` in `@szenera/contracts/composition`. Die Momentaufnahme nennt die gespielte Fassung. `GET /v1/me/apps/{appId}/scene-pins` und `POST …/scene-pins/lift` heben alle Szenen auf die installierte Fassung, je Szene als neue veröffentlichte Fassung. ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- `POST /v1/marketplace/apps/{appId}/upgrade` geht nur vorwärts und nur auf Fassungen, die die Organisation sieht. Neuer Fehlercode `App.UpdateUnavailable` (409, `details.reason`: `not-forward`, `none`, `not-rejectable`). ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- Entfallen sind `GET /v1/me/pending-reacceptances`, `POST /v1/marketplace/apps/{appId}/accept` und `…/reject` samt ihren Verträgen. `RetireAppReleaseRequest` nimmt `grace` und `securityAdvisory` statt `graceMonths`. ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- Neue Ereignisse `marketplace.app.update-declined`, `marketplace.app.update-withdrawn` und `marketplace.app.release-switched`. `app-catalog.app-release.retired` und `…grace-expired` tragen `successorVersion`. Ein Grant trägt `declinedReleaseId` und `declinedVersion`, ein Nachweis `reasons`, eine Fassung `securityAdvisory`. ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- `@szenera/client` und `@szenera/api-client`: neu `me.appsUpdates.list`, `me.appsUpdate.list/accept/reject`, `me.appsBetaEnrollment.*` und `me.appsScenePins.list/lift`, entfallen `me.pendingReacceptances` und `marketplace.marketplaceApps.accept/reject`. `szenera app accept` und `app reject` nutzen die neuen Routen, ihre Aufrufe bleiben gleich. ([#680](https://github.com/HKNovaTechUG/digital-signage-2026/pull/680)) *(German only)*
- Neue Routen des Stores (session): `GET /v1/me/apps/store` (Karten, Filter mit Zahlen, Zählung, Kernfunktionen), `GET /v1/me/apps/store/{appId}` (Eintrag mit fertig entschiedener Lage, Sprache per `locale` oder `Accept-Language`), `GET /v1/me/apps/collections`, `GET /v1/me/apps/{appId}/installed` (App-Seite der installierten Fassung), `POST /v1/me/apps/{appId}/install-request`, `POST /v1/me/apps/{appId}/update/decision-request`, `GET /v1/me/apps/{appId}/data`, `POST` und `DELETE /v1/me/apps/{appId}/data/deletion`. Fehler `OwnerRequest.NotApplicable`, `AppData.NotDeletable` und `AppData.DeletionNotFound`. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- Neue Pflege-Routen (Betreiber): `GET`, `POST /v1/platform/app-catalog/collections`, `PATCH …/collections/{collectionKey}`, `PUT …/collections/order`. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- `@szenera/contracts`: `StoreEntryView`, `StoreCardView`, `StoreSituation` (Lage, genau eine Handlung, Grund mit Zahlen), Sammlungen, Bitten, App-Daten. Das Manifest trägt am Ende den optionalen Block `compatibility`. `preview.screenshots` wird nicht mehr gelesen, und die Liste des Marktplatzes führt es nicht mehr (Bruch). `InstalledApp.coreFeature`, `GetAppUpdateResponse.decisionRequest`, `SetPlayerProgramResponse.warnings`, `vertical` an der Organisation und im Profil. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- `@szenera/client` und `@szenera/api-client`: `me.appsStore`, `me.appsCollections`, `me.appsInstalled`, `me.apps.installRequest`, `me.appsUpdate.decisionRequest`, `me.appsData`, `me.appsDataDeletion`, `platform.appCatalogCollections`. `@szenera/cli` bündelt die erweiterten Verträge, seine Befehle bleiben, wie sie sind. `@szenera/agent` kennt die neuen Fehlercodes. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- `@szenera/apps-sdk`: `AppLifecycleHooks` hat zwei weitere freiwillige Punkte, `inventory(tenantId)` (Einträge je Datenbereich) und `purge(tenantId)` (alles endgültig löschen, idempotent). Sie kommen nur zusammen, eine Klasse mit nur einem von beiden lehnt der Boot ab. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- `@szenera/contracts`: Das Manifest trägt `translations`, je Sprache ein Block nur mit Texten (`AppManifestTranslationsSchema`). Dazu `appManifestLocales()`, `localizeAppManifest()` und `appManifestTranslationIssues()`. Der Store antwortet in `locale` oder `Accept-Language` und nennt die Sprache der Texte in `textLocale`. Entfallen sind `MarketplaceAppListingSchema` und die Anwendungsfälle der entfallenen Routen, `GetInstalledAppResponse` trägt `history`, die Store-Übersicht `coreFeatures` mit der angebotenen Fassung. `PortalFeatureEntry` trägt keinen Namen mehr, die Namen stehen in den Texten des Stores. ([#699](https://github.com/HKNovaTechUG/digital-signage-2026/pull/699)) *(German only)*
- `@szenera/client`: `client.marketplace.apps.list` und `.get` sowie `client.me.installedApps` sind entfallen, `client.me.apps.list({ locale })` liefert die installierten Apps. ([#699](https://github.com/HKNovaTechUG/digital-signage-2026/pull/699)) *(German only)*
- `@szenera/apps-sdk`: `defineAppManifest` wirft bei einem unvollständigen Übersetzungsblock und nennt die Stelle. ([#699](https://github.com/HKNovaTechUG/digital-signage-2026/pull/699)) *(German only)*
- `@szenera/widget-editor`: `schemaFieldText(schema, pfad)` und `splitFieldDescription()` lesen Beschriftung und Hilfe eines Felds aus `.describe('Titel|Satz')`, `APP_CATEGORY_LABEL_KEYS` ordnet die Kategorien den Beschriftungen der Palette zu. ([#699](https://github.com/HKNovaTechUG/digital-signage-2026/pull/699)) *(German only)*
- `@szenera/cli` liest Apps über die Store-Routen, die Befehle bleiben, wie sie sind. ([#699](https://github.com/HKNovaTechUG/digital-signage-2026/pull/699)) *(German only)*

**Changes**

- `@szenera/contracts`: neu `CatalogAppSchema`, `AppReleaseNotesSchema` (Notizen je Zielgruppe und Sprache), `AppReleaseEventSchema`, `RestoreAppRelease*`, `ListAppReleaseHistory*` und `GetAppVersionHistory*`. Ein `AppRelease` trägt `notes`, die Wire-Form daneben weiter `releaseNotes`. `PATCH /v1/platform/app-catalog/apps/{appId}/releases/{id}` nimmt `notes` je Zielgruppe oder wie bisher `releaseNotes`. ([#677](https://github.com/HKNovaTechUG/digital-signage-2026/pull/677)) *(German only)*
- Ein Grant trägt `installedReleaseId`, `pendingReleaseId`, `pendingReasons` und `pendingDeadline`, ein Zustimmungs-Nachweis `releaseId`, eine offene Zustimmung `fromVersion`, `toVersion`, `reasons` und `deadline`. Entfallen sind `autoUpgrade` am Grant und `ConfigSchemaChangedPayloadSchema`. ([#677](https://github.com/HKNovaTechUG/digital-signage-2026/pull/677)) *(German only)*
- `GET /v1/apps/{appId}/history` liefert einer Organisation die Fassungen einer App, die stable erreicht haben, mit Datum und „Neu in dieser Fassung" in der erbetenen Sprache (`?locale=en-US`, ohne Angabe Deutsch). ([#677](https://github.com/HKNovaTechUG/digital-signage-2026/pull/677)) *(German only)*
- `@szenera/api-client`: neu `client.platform.appCatalogAppsHistory.list`, `client.platform.appCatalogAppsReleases.restore` und `client.appCatalog.appsHistory.list`. `@szenera/client`: neu `client.appCatalog.appsHistory.list`. `@szenera/cli` bündelt die neuen Verträge, ihre Befehle bleiben, wie sie sind. ([#677](https://github.com/HKNovaTechUG/digital-signage-2026/pull/677)) *(German only)*
- Das scenes-Bündel der Momentaufnahme trägt `appVersions` (je App die eine Fassung des Displays) sowie `appRendererHosts` und `appWidgetTypes` je `<appId>@<version>`, alle mit der Vorgabe `{}`. Die Pins der Szenen und Widgets nennen dieselbe Fassung. ([#683](https://github.com/HKNovaTechUG/digital-signage-2026/pull/683)) *(German only)*
- `displayAppVersion(pins, installed)` in `@szenera/contracts/composition` rechnet die Fassung eines Displays: die installierte, bei gehaltenen Pins älterer Hauptnummern die niedrigste davon. ([#683](https://github.com/HKNovaTechUG/digital-signage-2026/pull/683)) *(German only)*
- Die neue Befundart `AppVersionHeld` ist immer eine Warnung und trägt `appId`, `appName`, `version`, `installedVersion` und `widgetIds`. Die KI-Anbindung erklärt sie. ([#683](https://github.com/HKNovaTechUG/digital-signage-2026/pull/683)) *(German only)*
- `@szenera/client`: Der Filter `type` der Integritäts-Befunde einer Szene kennt `AppVersionHeld`. `@szenera/cli` bündelt den erweiterten Vertrag, ihre Befehle bleiben, wie sie sind. ([#683](https://github.com/HKNovaTechUG/digital-signage-2026/pull/683)) *(German only)*
- Ein Zustimmungs-Nachweis trägt `version`, die Nummer der Fassung, der zugestimmt wurde (`null` nur bei Nachweisen von davor, deren Fassung schon fehlte). Eine Installation trägt `declinedAt` neben `declinedVersion`. ([#681](https://github.com/HKNovaTechUG/digital-signage-2026/pull/681)) *(German only)*
- `GET /v1/apps/{appId}/history` nennt je Fassung `releaseId`, dieselbe Kennung wie an Installation, Nachweis und Update-Entscheidung. ([#681](https://github.com/HKNovaTechUG/digital-signage-2026/pull/681)) *(German only)*
- `@szenera/client`: `client.appCatalog.appsHistory.list` nennt je Fassung `releaseId`, eine Installation trägt `declinedAt`. `@szenera/cli` bündelt die erweiterten Verträge, ihre Befehle bleiben, wie sie sind. ([#681](https://github.com/HKNovaTechUG/digital-signage-2026/pull/681)) *(German only)*
- `@szenera/widget-editor`: `EditorShell` nimmt `appsAwaitingUpdate` (Apps samt Weg zur Entscheidung). Der App-Bereich zeigt ihre Widgets mit „Update wartet“, ein Klick führt zur Entscheidung statt einzufügen. ([#681](https://github.com/HKNovaTechUG/digital-signage-2026/pull/681)) *(German only)*
- `@szenera/client` und `@szenera/cli` bündeln die erweiterten Verträge der Plattform. Ihre Aufrufe und Befehle bleiben, wie sie sind. ([#697](https://github.com/HKNovaTechUG/digital-signage-2026/pull/697)) *(German only)*
- `@szenera/contracts` baut je Quelldatei ein Modul (`dist/<domain>/<pfad>.js`), und die `exports`-Karte trägt das Muster `./*`: Jedes Blatt ist ladbar (`@szenera/contracts/app-catalog/app-manifest/locked-app`). Die benannten Subpaths bleiben, auch die drei des Host-Vertrags der App-Laufzeit (`composition`, `media-library`, `shared`): `appRuntimeHostSpecifiers` steht unverändert, die Import-Map der Anzeige kennt keinen neuen Namen. Ein Import aus einem Barrel kostet nur noch die Blätter, deren Exporte gebraucht werden (`sideEffects` nennt allein `openapi-extend`). ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- Jede Datei, deren Code `.openapi(…)` ruft, importiert `openapi-extend` selbst. Wer ein Blatt direkt lädt, braucht den Barrel seiner Domäne nicht mehr, damit die Zod-Erweiterung vor dem Schema läuft. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- `@szenera/apps-sdk` liest Widget-Definition, Konfigurations-Schema und Manifest aus den Blättern des App-Katalogs statt aus dessen Barrel. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*
- `@szenera/client` und `@szenera/cli`: Die Archive sind neu geschnitten, weil die eingebündelten Verträge ihre Nebenwirkungs-Importe je Blatt tragen. Oberfläche und Deckel bleiben, wie sie sind. ([#688](https://github.com/HKNovaTechUG/digital-signage-2026/pull/688)) *(German only)*

### 0.2.1

No entry for developers.

### 0.2.0

**Breaking changes**

- Die Fähigkeiten eines Geräts kennen den Block `remote` nicht mehr. Die Erweiterung meldet sich im Block `host` mit `platform: extension`. Der Block `host` trägt dazu `bridge` (die Brückenfassung des Wirts) und `bootStart` (ob der Wirt von selbst startet). ([#640](https://github.com/HKNovaTechUG/digital-signage-2026/pull/640)) *(German only)*
- Geräte tragen statt `runtime` den Block `software` (je Baustein Fassung, Bau und angenommene Freigabe), dazu `channel` und `softwareTarget`, das Soll ihres Kanals. Player tragen kein `capabilities` mehr, der gemeldete Zustand kein `reportedState.capabilities`. Was ein Gerät kann, steht in seinen Fähigkeiten, deren Block `software` `runtime` ersetzt. ([#642](https://github.com/HKNovaTechUG/digital-signage-2026/pull/642)) *(German only)*
- Der Zustand der Anzeige (`lastTelemetry.renderer`) nennt das Bau-Profil (`modern` oder `legacy`). ([#642](https://github.com/HKNovaTechUG/digital-signage-2026/pull/642)) *(German only)*
- `PlayerCapabilitySchema` und die beiden `OS_CHANNELS` entfallen, `ReleaseChannel` lebt in `@szenera/contracts/shared` neben `PROTOCOL_SERVED`. Die Selbstsicht trägt `channel` und `softwareTarget`. `channel` fehlt, solange die Cloud keinen Kanal für das Gerät führt, `currentOsChannel` bleibt für ältere Fernwartungen. ([#642](https://github.com/HKNovaTechUG/digital-signage-2026/pull/642)) *(German only)*
- Beispiele der Vorfassungen je Naht liegen unter `packages/contracts/src/samples/protocols/`, Tests in TypeScript und Go legen sie den heutigen Lesern vor. ([#642](https://github.com/HKNovaTechUG/digital-signage-2026/pull/642)) *(German only)*
- `HOST_EDITIONS`, `HostEditionSchema` und `HostEdition` stehen in `@szenera/contracts/fleet` und im Einstieg `@szenera/contracts/fleet/host-bridge`. Die Beschreibung eines Wirts in `@szenera/host-bridge` nimmt `edition`. ([#653](https://github.com/HKNovaTechUG/digital-signage-2026/pull/653)) *(German only)*

**Changes**

- Der Block `host` der Gerätefähigkeiten kennt zwei weitere Plattformen: `vega` für Fire TV mit Vega OS und `extension` für die Erweiterung für Chrome. Bisher meldet kein Gerät sie. ([#636](https://github.com/HKNovaTechUG/digital-signage-2026/pull/636)) *(German only)*
- Neu ist das Paket `@szenera/client`, der öffentliche TypeScript-Klient der Schnittstelle. Er spricht genau die Operationen der öffentlichen Spezifikation, je Bereich ein Namensraum, und weist sich mit einem API-Schlüssel `ak_…` oder dem Zugriffstoken `oat_…` eines delegierten Zugangs aus. Veröffentlicht wird er noch nicht. ([#617](https://github.com/HKNovaTechUG/digital-signage-2026/pull/617)) *(German only)*
- Jede Methode beider Klienten trägt die Kurzbeschreibung ihrer Operation als Kommentar. Junge Operationen tragen zusätzlich `@beta`, auslaufende `@deprecated` mit ihrem Abschalt-Tag. ([#617](https://github.com/HKNovaTechUG/digital-signage-2026/pull/617)) *(German only)*
- Die anmeldefreien Routen `GET /v1/public/status` und `GET /v1/public/maintenance-status` stehen im eigenen Bereich `status` statt unter `ops-console`. Im Klienten heißt ihr Namensraum deshalb `status` statt `opsConsole`. ([#617](https://github.com/HKNovaTechUG/digital-signage-2026/pull/617)) *(German only)*
- Die öffentliche Spezifikation führt die Sitzung und die Einrichtung der Betreiber-Konten nicht mehr (`POST /v1/auth/operator/refresh`, `POST /v1/auth/onboarding/consume`). Sie nennt keinen Server auf `localhost` mehr und nur noch die Ausweisarten, die eine ihrer Operationen annimmt. ([#617](https://github.com/HKNovaTechUG/digital-signage-2026/pull/617)) *(German only)*
- Das Sicherheitsverfahren `cookie` nennt das Cookie, das es wirklich gibt: `refresh_token`, gelesen nur von `POST /v1/auth/refresh`. ([#617](https://github.com/HKNovaTechUG/digital-signage-2026/pull/617)) *(German only)*
- Die Beispiele der Spezifikation zeigen Geräte-Adressen aus dem Dokumentationsbereich `192.0.2.0/24`. ([#617](https://github.com/HKNovaTechUG/digital-signage-2026/pull/617)) *(German only)*
- `@szenera/api-client/factory` bietet mit `createBearerClientWith` einen Klienten mit festem Merkmal und frei gewählten Modulen. ([#617](https://github.com/HKNovaTechUG/digital-signage-2026/pull/617)) *(German only)*
- Die Archive von `@szenera/client` und `@szenera/cli` werden jetzt geprüft, bevor eine Fassung erscheinen darf: Sie tragen nur die eigenen Dateien, keine Route außerhalb der öffentlichen Spezifikation und keinen Verweis auf ein unveröffentlichtes Paket, und die Installation gelingt auf Node 22 und 24. ([#620](https://github.com/HKNovaTechUG/digital-signage-2026/pull/620)) *(German only)*
- Die gepackte Größe jedes Archivs ist gedeckelt, und jedes Archiv trägt einen Fingerabdruck seiner Dateien. Ändert sich ein Archiv, gehört dazu eine neue Fassung. ([#620](https://github.com/HKNovaTechUG/digital-signage-2026/pull/620)) *(German only)*
- `@szenera/cli` bringt Kern, Befehle, die Module des öffentlichen Klienten und die Verträge in einer einzigen Datei mit. `@szenera/client` bringt seine Typen je Unterpfad mit und braucht neben `zod` nichts aus der Plattform. ([#620](https://github.com/HKNovaTechUG/digital-signage-2026/pull/620)) *(German only)*
- Die Kommandozeile nimmt nur noch Schlüssel einer Organisation (`ak_…`) an und nennt in ihrer Kennung die Fassung aus ihrem eigenen Manifest. ([#620](https://github.com/HKNovaTechUG/digital-signage-2026/pull/620)) *(German only)*
- Veröffentlicht ist weiterhin nichts. ([#620](https://github.com/HKNovaTechUG/digital-signage-2026/pull/620)) *(German only)*
- Der Herzschlag eines Geräts nennt im Block `renderer` die Fassung, den Bau und die Quelle der Anzeige (`bundle` oder `hosted`), dazu die Folge der zuletzt angenommenen Freigabe und seit wann das Bündel aktiv ist. Alle Felder sind optional. ([#633](https://github.com/HKNovaTechUG/digital-signage-2026/pull/633)) *(German only)*
- Neue Verträge `DeviceServiceStatus`, `RendererServiceStatus` und `ServiceFinding` in `@szenera/contracts/fleet`. ([#628](https://github.com/HKNovaTechUG/digital-signage-2026/pull/628)) *(German only)*
- `GET /v1/devices/me` liefert `deviceName`, den Namen aus der Geräteakte. ([#628](https://github.com/HKNovaTechUG/digital-signage-2026/pull/628)) *(German only)*
- Der Herzschlag nimmt `appFailures` an, höchstens 20 je Meldung mit dem Grund `missing`, `rejected` oder `failed`. Der Agent füllt `time.offsetMs` mit dem Versatz seiner Uhr zur Cloud. ([#628](https://github.com/HKNovaTechUG/digital-signage-2026/pull/628)) *(German only)*
- Die Ereignis-Kategorie `service` bringt die Codes `service.menu-opened` (`input`) und `service.menu-closed` (`reason`). Der Agent meldet jetzt auch `content.bundle-failed`. ([#628](https://github.com/HKNovaTechUG/digital-signage-2026/pull/628)) *(German only)*
- Der Agent bedient auf `127.0.0.1:8081` die Seite des Menüs und `GET /v1/status`, `/v1/report`, `/v1/input`, `/v1/backdrop` sowie `POST /v1/open` und `/v1/close`. `service.menu-opened` entsteht erst, wenn die Seite das Öffnen meldet. `Origin: null` bekommt 403, außer die Startseite mit ihrem Schlüssel im Kopf `X-Service-Token`. Der Eingabe-Wächter `szenera-input-watch` ist ein eigenes Programm im selben Go-Modul. ([#628](https://github.com/HKNovaTechUG/digital-signage-2026/pull/628)) *(German only)*
- Der Katalog der Befunde kennt `app-bundle-download-failed` (`appId`, `version`, `appName`, `httpStatus`, `since`). Die App-Befunde tragen `appName`, `wifi-weak` und `clock-skew` den Auslöser `trigger`. ([#628](https://github.com/HKNovaTechUG/digital-signage-2026/pull/628)) *(German only)*

### 0.1.0

Die erste Fassung mit eigener Zahl, noch nicht veröffentlicht. Diese Liste beginnt mit der nächsten Fassung. *(German only)*
