Öffentliches Register
Software-GesundheitsberichtSchema 0.26.0 · Metriken 1.13.0 · 2026-07-22 10:54 UTC

rive-app / rive-nitro-react-native

Rive React Native - v2 built with Nitro

TypeScript · Kotlin · SwiftMIT★ 145 Sterne⑂ 10 Forksseit Mai 2025Auf GitHub ansehen ↗

rive-app/rive-nitro-react-native erreicht einen Gesundheitsindex von 75 von 100 und liegt damit im Bereich Gut. Am stärksten schneidet es bei Vitality (92/100) ab, am schwächsten bei Security (49/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

75
gesamt / 100
Gut

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

75
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

RiveOrganisation
1.330 Follower60 öffentliche Reposseit Dez. 2019

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
npm@rive-app/react-native0.4.19208.18338vor 4 Tagenreact-nativeiosandroid

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

92Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
22.2/36Commit-Rhythmus — 32/52 Wochen mit Commits
18/18Commit-Volumen — 186 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 23 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year186
human_commit_share1
days_since_last_push0
active_weeks_last_year32

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 40 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 4 Tagen
27/27Release-Rhythmus — ein Release etwa alle 5,5 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count40
latest_release_tagv0.4.19
releases_from_tagsnein
days_since_latest_release4
mean_days_between_releases5,5
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

71Gut · 18 % des Gesamtindex
Wie die Bewertung erfolgt
35/60Stars — 145 Stars
8/25Forks — 10 Forks
5/15Watcher — 9 Watcher
Verwendete Eingangsdaten
forks10
stars145
watchers9
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
18/18CONTRIBUTING-Leitfaden
13.5/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templatenein
has_code_of_conductja
has_pull_request_templatenein
Wie die Bewertung erfolgt
70.9/80Downloads pro Monat — 208.183 Downloads/Monat über npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packages@rive-app/react-native
dependents
ecosystemsnpm
total_downloads
monthly_downloads208.183
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

73Gut · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
8.8/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 61 % der Commits
8.1/13.5Breite der Beitragenden — 6 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Verwendete Eingangsdaten
bus_factor1
contributors_sampled6
top_contributor_share0,607
Wie die Bewertung erfolgt
45.3/46.8Issue-Lösungsquote — 97 % der Issues geschlossen
32/38.3PR-Annahme — 226/270 entschiedene PRs gemergt
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Verwendete Eingangsdaten
merged_prs226
open_issues2
closed_issues62
issue_closed_ratio0,969
closed_unmerged_prs44
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
22.5/25Reichweite des Inhabers — 1.330 Follower von rive-app
25/25Kontohistorie — 60 öffentliche Repos, Kontoalter ca. 6 Jahre
Verwendete Eingangsdaten
followers1.330
owner_typeOrganization
is_verified
owner_loginrive-app
public_repos60
account_age_days2.423

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf npm
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 4 Tagen
20/20Versionshistorie — 38 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packages@rive-app/react-native
ecosystemsnpm
any_deprecatednein
min_days_since_publish4

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

82Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 4 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — eslint.config.js, eslint.config.mjs
0/9.6Pre-Commit-Hooks
6.4/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 26 out of 30 merged PRs checked by a CI test -- score normalized to 8
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfigja
has_linter_configja
has_precommit_confignein
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

49Gefährdet · 16 % des Gesamtindex

Sicherheitslage

49Gefährdet
Wie die Bewertung erfolgt
6.8/7.5Binary-Artifacts — binaries present in source code
3.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2/2.5CI-Tests — 26 out of 30 merged PRs checked by a CI test -- score normalized to 8
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
7.5/7.5Code-Review — all changesets reviewed
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 23 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 105 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,9
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): signed_releases. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

61Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 100 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — android/build.gradle, example/android/app/build.gradle, example/android/build.gradle (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — eslint.config.js, eslint.config.mjs
11/11Statische Typprüfung — expo-example/tsconfig.json, expo55-example/tsconfig.json, expo57-example/tsconfig.json, tsconfig.json
10/10Reproduzierbare Umgebung — lockfile
2/10Belegte Agentenpraxis — 1 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesGemfile.lock, yarn.lock
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configsexpo-example/tsconfig.json, expo55-example/tsconfig.json, expo57-example/tsconfig.json, tsconfig.json
agent_commit_share0,01
toolchain_manifestsandroid/build.gradle, example/android/app/build.gradle, example/android/build.gradle, rive-debug-utils/android/build.gradle
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — TypeScript (statisch typisiert)
54.6/55Handhabbare Dateigrößen — 2/304 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageTypeScript
largest_source_bytes2.228.925
source_files_sampled304
oversized_source_files2
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — demos, example
Verwendete Eingangsdaten
example_dirsdemos, example
has_mcp_signalnein
api_schema_files

Eckdaten

145GitHub-Sterne
6Mitwirkende
186Commits, letzte 12 Monate
0Tage seit letztem Push
40Releases
1Bus-Faktor
2offene Issues
Maven, npm, RubyGemsPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:@rive-app/react-native@0.4.19; advisories assessed against the repository dependency graph instead

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 10 ⇿
0Sterne
10Forks
33Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

02468101022025-112026-032026-06
Major 0Minor 3Patch 29
OpenSSF Scorecard 4.9 / 10
4.9Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-22 10:54 UTC

9Binary-Artifactsbinaries present in source code
5Branch-Protectionbranch protection is not maximal on development and all release branches
8CI-Tests26 out of 30 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 23 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities105 existing vulnerabilities detected
Direkte Abhängigkeiten 88
RegistryPaketVersionsvorgabeManifest
npm@expo/vector-icons^15.0.3expo-example/package.json
npm@react-native-async-storage/async-storage^2.1.2expo-example/package.json
npm@react-native-picker/picker^2.11.4expo-example/package.json
npm@react-navigation/bottom-tabs^7.4.0expo-example/package.json
npm@react-navigation/elements^2.6.3expo-example/package.json
npm@react-navigation/native^7.1.8expo-example/package.json
npmexpo~54.0.20expo-example/package.json
npmexpo-constants~18.0.10expo-example/package.json
npmexpo-font~14.0.9expo-example/package.json
npmexpo-haptics~15.0.7expo-example/package.json
npmexpo-image~3.0.10expo-example/package.json
npmexpo-linking~8.0.8expo-example/package.json
npmexpo-router~6.0.13expo-example/package.json
npmexpo-screen-orientation~9.0.8expo-example/package.json
npmexpo-splash-screen~31.0.10expo-example/package.json
npmexpo-status-bar~3.0.8expo-example/package.json
npmexpo-symbols~1.0.7expo-example/package.json
npmexpo-system-ui~6.0.8expo-example/package.json
npmexpo-web-browser~15.0.8expo-example/package.json
npmreact19.1.0expo-example/package.json
npmreact-dom19.1.0expo-example/package.json
npmreact-native0.81.5expo-example/package.json
npmreact-native-gesture-handler2.29.1expo-example/package.json
npmreact-native-nitro-modules0.35.10expo-example/package.json
npmreact-native-reanimated4.1.5expo-example/package.json
npmreact-native-safe-area-context~5.6.0expo-example/package.json
npmreact-native-screens~4.16.0expo-example/package.json
npmreact-native-web~0.21.0expo-example/package.json
npmreact-native-worklets0.6.1expo-example/package.json
npmrive-debug-utilsworkspace:*expo-example/package.json
npm@expo/vector-icons^15.0.3expo55-example/package.json
npm@react-native-async-storage/async-storage^2.1.2expo55-example/package.json
npm@react-native-picker/picker^2.11.4expo55-example/package.json
npm@react-navigation/bottom-tabs^7.15.5expo55-example/package.json
npm@react-navigation/elements^2.6.3expo55-example/package.json
npm@react-navigation/native^7.1.33expo55-example/package.json
npmexpo^55.0.12expo55-example/package.json
npmexpo-constants~55.0.12expo55-example/package.json
npmexpo-font~55.0.4expo55-example/package.json
npmexpo-haptics~55.0.14expo55-example/package.json
npmexpo-image~55.0.8expo55-example/package.json
npmexpo-linking~55.0.11expo55-example/package.json
npmexpo-router~55.0.11expo55-example/package.json
npmexpo-screen-orientation~55.0.13expo55-example/package.json
npmexpo-splash-screen~55.0.6expo55-example/package.json
npmexpo-status-bar~55.0.5expo55-example/package.json
npmexpo-symbols~55.0.7expo55-example/package.json
npmexpo-system-ui~55.0.15expo55-example/package.json
npmexpo-web-browser~15.0.10expo55-example/package.json
npmreact19.2.0expo55-example/package.json
npmreact-dom19.2.0expo55-example/package.json
npmreact-native0.83.4expo55-example/package.json
npmreact-native-gesture-handler~2.29.0expo55-example/package.json
npmreact-native-nitro-modules0.35.10expo55-example/package.json
npmreact-native-reanimated4.2.1expo55-example/package.json
npmreact-native-safe-area-context~5.6.2expo55-example/package.json
npmreact-native-screens~4.23.0expo55-example/package.json
npmreact-native-web~0.21.0expo55-example/package.json
npmreact-native-worklets0.7.4expo55-example/package.json
npmrive-debug-utilsworkspace:*expo55-example/package.json
npm@react-native-async-storage/async-storage^2.1.2expo57-example/package.json
npm@react-native-picker/picker^2.11.4expo57-example/package.json
npm@react-navigation/bottom-tabs^7.15.5expo57-example/package.json
npm@react-navigation/elements^2.6.3expo57-example/package.json
npm@react-navigation/native^7.1.33expo57-example/package.json
npmexpo^57.0.4expo57-example/package.json
npmexpo-constants~57.0.3expo57-example/package.json
npmexpo-font~57.0.0expo57-example/package.json
npmexpo-haptics~57.0.0expo57-example/package.json
npmexpo-image~57.0.0expo57-example/package.json
npmexpo-linking~57.0.2expo57-example/package.json
npmexpo-router~57.0.4expo57-example/package.json
npmexpo-screen-orientation~57.0.0expo57-example/package.json
npmexpo-splash-screen~57.0.2expo57-example/package.json
npmexpo-status-bar~57.0.0expo57-example/package.json
npmexpo-system-ui~57.0.0expo57-example/package.json
npmexpo-web-browser~57.0.0expo57-example/package.json
npmreact19.2.3expo57-example/package.json
npmreact-dom19.2.3expo57-example/package.json
npmreact-native0.86.0expo57-example/package.json
npmreact-native-gesture-handler~2.32.0expo57-example/package.json
npmreact-native-nitro-modules0.35.10expo57-example/package.json
npmreact-native-reanimated4.5.0expo57-example/package.json
npmreact-native-safe-area-context~5.7.0expo57-example/package.json
npmreact-native-screens4.25.2expo57-example/package.json
npmreact-native-web~0.21.0expo57-example/package.json
npmreact-native-worklets0.10.0expo57-example/package.json
npmrive-debug-utilsworkspace:*expo57-example/package.json
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 78222,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "C++": 316,
        "Ruby": 5288,
        "CMake": 1062,
        "Shell": 2644,
        "Swift": 156884,
        "Kotlin": 166183,
        "JavaScript": 38641,
        "TypeScript": 565024,
        "Objective-C": 1518
      },
      "pushed_at": "2026-07-21T18:56:34Z",
      "created_at": "2025-05-12T00:48:42Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T18:56:23Z",
      "description": "Rive React Native - v2 built with Nitro",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "Kotlin",
        "Swift"
      ]
    },
    "owner": {
      "blog": "https://rive.app/",
      "name": "Rive",
      "type": "Organization",
      "login": "rive-app",
      "company": null,
      "location": "United States of America",
      "followers": 1330,
      "avatar_url": "https://avatars.githubusercontent.com/u/58453772?v=4",
      "created_at": "2019-12-03T02:48:12Z",
      "is_verified": null,
      "public_repos": 60,
      "account_age_days": 2423
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.4.19",
          "kind": "patch",
          "published_at": "2026-07-17T11:11:55Z"
        },
        {
          "tag": "v0.4.18",
          "kind": "patch",
          "published_at": "2026-07-15T16:19:44Z"
        },
        {
          "tag": "v0.4.17",
          "kind": "patch",
          "published_at": "2026-07-14T20:09:19Z"
        },
        {
          "tag": "v0.4.16",
          "kind": "patch",
          "published_at": "2026-07-14T10:00:08Z"
        },
        {
          "tag": "v0.4.15",
          "kind": "patch",
          "published_at": "2026-07-13T20:16:40Z"
        },
        {
          "tag": "v0.4.14",
          "kind": "patch",
          "published_at": "2026-07-06T13:34:47Z"
        },
        {
          "tag": "v0.4.13",
          "kind": "patch",
          "published_at": "2026-07-02T07:35:49Z"
        },
        {
          "tag": "v0.4.12",
          "kind": "patch",
          "published_at": "2026-06-26T13:19:21Z"
        },
        {
          "tag": "v0.4.11",
          "kind": "patch",
          "published_at": "2026-06-08T10:25:34Z"
        },
        {
          "tag": "v0.4.10",
          "kind": "patch",
          "published_at": "2026-05-29T05:37:12Z"
        },
        {
          "tag": "v0.4.9",
          "kind": "patch",
          "published_at": "2026-05-22T15:02:31Z"
        },
        {
          "tag": "v0.4.8",
          "kind": "patch",
          "published_at": "2026-05-21T20:01:34Z"
        },
        {
          "tag": "v0.4.7",
          "kind": "patch",
          "published_at": "2026-05-19T05:45:22Z"
        },
        {
          "tag": "v0.4.6",
          "kind": "patch",
          "published_at": "2026-04-23T14:46:27Z"
        },
        {
          "tag": "v0.4.5",
          "kind": "patch",
          "published_at": "2026-04-17T21:41:32Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-04-17T14:41:55Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-04-17T07:09:20Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-04-13T19:28:56Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-04-08T04:47:00Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-03-31T05:26:16Z"
        },
        {
          "tag": "v0.3.4",
          "kind": "patch",
          "published_at": "2026-03-30T17:16:22Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-03-26T21:27:20Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-03-26T06:17:54Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-03-20T06:22:18Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-03-13T16:10:35Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-03-13T11:18:51Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-03-06T12:14:27Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-03-05T11:31:59Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-03-02T13:47:21Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-02-27T08:45:50Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-02-23T10:23:58Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-02-20T21:52:39Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-01-27T10:34:44Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-01-20T13:25:12Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-01-14T10:43:08Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-01-09T16:31:47Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-01-06T11:30:34Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2025-12-17T18:51:24Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2025-12-11T13:12:00Z"
        },
        {
          "tag": "v0.1.1-beta.1",
          "kind": "prerelease",
          "published_at": "2025-12-11T08:07:08Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "17984bc4752ec6c8523e75fd32944083143b0c41",
          "body": "Rive's official docs call the CommandQueue-based runtimes the \"New\nRuntime\" (Apple) / \"New Compose API\" (Android) and the previous ones\n\"legacy\" — \"experimental\" was our own term and is now off-message. This\nupdates prose in docs and spec JSDoc to the new/legacy vocabulary, and\nrewords user-facing e\n[…]\nckend()` keeps returning\n`'experimental' | 'legacy'` and is now documented `@internal` — it\nexists for internal testing during the rollout, and it and the legacy\nruntime are slated for removal in 0.6.",
          "is_bot": false,
          "headline": "docs: adopt Rive's \"new runtime\" / \"legacy runtime\" terminology (#351)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-21T18:56:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ae779a30668fbaef2ad58f015ab6365a7ff83fe6",
          "body": "Adds a new native backend using Rive's experimental runtime APIs on both\niOS and Android. The new backend is async-native — all ViewModel\noperations go through a CommandQueue, eliminating the need for\n`blockingAsync`/`runBlocking` wrappers on the non-deprecated API\nsurface.\n\nThe experimental backend\n[…]\n are no-ops (not yet available in\nexperimental SDK)\n\n---------\n\nCo-authored-by: Happy <yesreply@happy.engineering>\nCo-authored-by: Rive Engineering <60802183+rive-engineering@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat!: experimental Rive runtime backend (iOS + Android) (#134)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-20T13:19:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "293843393346a3b41f2e32817e48d3682a44efbf",
          "body": "The feature table still said \"alignment coming soon\", but the\n`alignment` prop is implemented end to end\n(`src/specs/RiveView.nitro.ts`, `src/core/Alignment.ts`, and both native\nviews). Updates the row description to match.",
          "is_bot": false,
          "headline": "docs: alignment is supported, remove stale \"coming soon\" note (#339)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-17T13:19:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6e1baa2ed62ba0ce7687c1c8c33f7ce3403762f",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.19](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.18...v0.4.19)\n(2026-07-16)\n\n\n### Bug Fixes\n\n* **android:** make play() start the configured state machine on cold\nstart\n([#343](https://github.com/rive-app/rive-nitro-rea\n[…]\nact-native/issues/332)\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.19 (#346)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-07-17T11:11:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "99344d87ce05f48feeac073090c7232c102a7c74",
          "body": "…start (#343)\n\nOn Android, calling `play()` on a view mounted with `autoPlay={false}`\ndidn't start the configured state machine: nothing is instanced at that\npoint, so the wrapper fell through to rive-android's no-arg\n`controller.play()`, which starts the artboard's first raw animation\nplus its firs\n[…]\nludes a harness test that fails without the fix (\"View not\nconfigured\") and passes with it; verified on the Android emulator\nharness (full suite green) and on iOS (passes before and after).\n\nRefs #332",
          "is_bot": false,
          "headline": "fix(android): make play() start the configured state machine on cold …",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-16T21:54:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1ddfe3fbb8eb76dec8f6c7c2702fc7163e2592b6",
          "body": "The v0.4.15–v0.4.17 publish failures went unnoticed for three releases\nbecause releases are created via the release-please PAT, so GitHub's\nworkflow-failure emails only go to the `rive-engineering` account. This\nadds two safeguards to the publish workflow:\n\n1. After `npm publish`, poll the registry \n[…]\nepo with a\nlink to the failed run and cc the maintainers, so failures surface where\npeople actually look.\n\nNeeds `issues: write` on the job, otherwise uses the default\n`GITHUB_TOKEN` — no new secrets.",
          "is_bot": false,
          "headline": "ci: file issue on publish failure and verify release is on npm (#345)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-16T21:25:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9b8448dfe205e06329de4ec34777c2d206c8486a",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.18](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.17...v0.4.18)\n(2026-07-15)\n\n\n### Bug Fixes\n\n* pin npm down to v11 as latest compatible version for our node runner\n([#340](https://github.com/rive-app/rive-nitro-react-na\n[…]\n04b77d7e6cb7b9450afa))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.18 (#342)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-07-15T16:19:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5154496f0c943b068a6d04b77d7e6cb7b9450afa",
          "body": "…nner (#340)\n\nnpm v12 recently got released which dropped support for our pinned\n`.nvmrc` node version. We can look at updating that separately, but\npinning to npm v11 should unblock npm publishing.",
          "is_bot": false,
          "headline": "fix: pin npm down to v11 as latest compatible version for our node ru…",
          "author_name": "Zachary Plata",
          "author_login": "zplata",
          "committed_at": "2026-07-15T15:44:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb5a10b6328059a7d0affeb2440c644fba5098a3",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.17](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.16...v0.4.17)\n(2026-07-14)\n\n\n### Bug Fixes\n\n* bump rive-android to 11.7.1 and rive-ios to 6.21.0\n([#322](https://github.com/rive-app/rive-nitro-react-native/issues/322))\n\n[…]\n65bbdab8bec24c7d935e))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.17 (#338)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-07-14T20:09:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dd38f8fbc16a2d26b9b965bbdab8bec24c7d935e",
          "body": "Bumps the pinned native runtimes to the latest releases: rive-android\n11.6.2 → 11.7.1 and rive-ios 6.20.4 → 6.21.0.\n\nNotable changes on Android: 11.7.0 enables the Vulkan renderer by\ndefault (#317 had intentionally stayed on the 11.6.2 backport to defer\nthis) and includes the full ViewModelInstance \n[…]\nap generation fixes.\n\nNotable changes on iOS: 6.21.0 adds VoiceOver semantics support,\nartboard volume control, and defaults `RiveUIView.isOpaque` to false so\ntransparent backgrounds render correctly.",
          "is_bot": false,
          "headline": "fix: bump rive-android to 11.7.1 and rive-ios to 6.21.0 (#322)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-14T15:52:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c36b42571ff16294e621f62aa4f61c43378229dc",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.16](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.15...v0.4.16)\n(2026-07-14)\n\n\n### Bug Fixes\n\n* **android:** release data-binding HybridObject native resources\n([#302](https://github.com/rive-app/rive-nitro-react-native/\n[…]\n5bd960301edebd112c55))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.16 (#337)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-07-14T09:59:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42815197962f0ba9d2fd5bd960301edebd112c55",
          "body": "Each `HybridViewModel*Property` / `HybridViewModelInstance` is a small\nJS object that pins a JNI global reference plus a native Rive object.\nTwo issues with how those were managed:\n\n**`dispose()` was hidden.** A property both extends its generated\n`*Spec` (a `HybridObject`) and delegates `BaseHybrid\n[…]\nand on an unfixed build the\napp dies within seconds; with this fix the counter climbs indefinitely.\n(Same operations as the local harness stress, which aborts every run\nwithout the fix and 0 with it.)",
          "is_bot": false,
          "headline": "fix(android): release data-binding HybridObject native resources (#302)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-14T08:00:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0796bbe8d57e0ecfa889969e5bc7ee6ed536089d",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.15](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.14...v0.4.15)\n(2026-07-13)\n\n\n### Features\n\n* **hooks:** async instance creation via useViewModelInstance({ async:\ntrue })\n([#331](https://github.com/rive-app/rive-nitro-r\n[…]\n697afdcff9d05308a785))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.15 (#334)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-07-13T20:16:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "78052b57ec89b0649285697afdcff9d05308a785",
          "body": "…: true }) (#331)\n\nPort of #304 (merged to `feat/rive-ios-experimental`) to `main`.\n\n`useViewModelInstance(source, { async: true })` creates the instance via\nthe `*Async` runtime APIs off the JS thread and returns `{ instance,\nisLoading, error }`. The sync overloads are deprecated per-overload\n(they\n[…]\nthe sync hook, a `null` source now settles to a terminal `{\ninstance: null, isLoading: false }` instead of reporting\nundefined/loading forever.\n\n\nDocs: rive-app/rive-docs#797 (draft until this ships).",
          "is_bot": false,
          "headline": "feat(hooks): async instance creation via useViewModelInstance({ async…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-13T13:57:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e38ce81dcb8764eecadeb55b5e7632fd0ad9ff62",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.14](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.13...v0.4.14)\n(2026-07-06)\n\n\n### Bug Fixes\n\n* **android:** bump rive-android to 11.6.2\n([#317](https://github.com/rive-app/rive-nitro-react-native/issues/317))\n([ae66b24]\n[…]\ne399a0b299459d01abb2))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.14 (#321)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-07-06T13:34:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4259723cda269a29700fdba81a85bddd131f429c",
          "body": "… (#319)\n\nFixes a production crash: after a RiveView is dropped, `dispose()`\nreleases the controller (which releases its `File`), but\n`rendererAttributes.resource` still caches a `ResourceRiveFile` pointing\nat the now-disposed file. If the Android view is later attached to a\nwindow again (e.g. Fabri\n[…]\n\nreproducer crashes with the exact production stack before the fix and\npasses after.\n\nSame fix as #318, which targets the `feat/use-viewmodel-instance-async`\nbranch (its `android/src/legacy` variant).",
          "is_bot": false,
          "headline": "fix(android): don't re-acquire a disposed Rive file on view re-attach…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-06T13:13:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dbb4dd7f8bdef33d2c50e399a0b299459d01abb2",
          "body": "A setter returned by `useRiveNumber`/`useRiveString`/etc. can be\ncaptured in a stale closure (async callback, timeout) and fire after its\nproperty was disposed by a deps change or unmount. The write then\nreaches the disposed hybrid and throws `Cannot set hybrid property ...\nNativeState is null` — fa\n[…]\nfter-unmount no-op+warn and the deps-change\nredirect, plus an on-device harness test (`staleSetterWrite.test.tsx`)\nthat fails on the unguarded hook — verified on the Android emulator on\nboth backends.",
          "is_bot": false,
          "headline": "fix(hooks): no-op stale property setter calls after dispose (#316)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-06T12:20:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ae66b2409418feb61d2e73d0900af169a1d1c505",
          "body": "Bumps the pinned Android runtime from 11.6.1 to 11.6.2, which backports\nthe ViewModelInstance read/write lock from 11.7.0 without the 11.7.x\nVulkan default flip.\n\nIn 11.6.1, `StateMachineInstance.advance()` holds the file lock but\nViewModelInstance property access takes no lock, so a property write \n[…]\nhe\ndatabinding-related harness suites and a targeted advance-vs-write\nstress loop are green on both 11.6.1 and 11.6.2 (the race did not\nreproduce locally at this volume; no regressions from the bump).",
          "is_bot": false,
          "headline": "fix(android): bump rive-android to 11.6.2 (#317)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-06T11:48:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ae45abb136cb1adb7fc677f8dceab8aff450afa6",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.13](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.12...v0.4.13)\n(2026-07-01)\n\n\n### Bug Fixes\n\n* **android:** avoid NoSuchElementException in view-model property\nlistener dispatch\n([#301](https://github.com/rive-app/rive-\n[…]\n3ca91f778dedae2ef789))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.13 (#311)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-07-02T07:35:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c643963f94f70157fac95ff48791bbfa9713b9ef",
          "body": "…rs) (#303)\n\nThe `#230` test drove re-renders with `setInterval(50ms)` for 300ms and\nasserted `renderCount >= 3` within a 2000ms `waitFor`. `waitFor`\nresolves the instant renderCount hits 3 — i.e. it needs *exactly* 2\ninterval ticks, **zero margin**. When the JS thread is busy at mount\n(RiveView + d\n[…]\nttempt eats the\nwhole 15-min step budget and the retry loop never advances. macOS has no\n`timeout`, so a background watchdog kills the stuck attempt and\n`nuke_harness` reaps the rest before the retry.",
          "is_bot": false,
          "headline": "test(example): de-flake use-rive-trigger #230 (deterministic re-rende…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-01T20:12:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d47784f1002a6bde7f193ca91f778dedae2ef789",
          "body": "…tener dispatch (#301)\n\n`onChanged()` copied the listener map with `listeners.values.toList()`.\nKotlin's `toList()` has a `size == 1` fast-path that calls\n`iterator().next()` unguarded, so it throws `NoSuchElementException`\nwhen the sole listener is removed concurrently (dispatch runs on\n`Dispatcher\n[…]\nes) — crashing the app\n(`test-harness-android` *\"App bridge disconnected\"*).\n\nIterate the `ConcurrentHashMap` directly instead — its weakly-consistent\niterator is `hasNext()`-guarded and never throws.",
          "is_bot": false,
          "headline": "fix(android): avoid NoSuchElementException in view-model property lis…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-07-01T14:57:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "89ae4a7c174bd7d831f2c2778f1df6da84ec4068",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.12](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.11...v0.4.12)\n(2026-06-26)\n\n\n### Bug Fixes\n\n* make Rive data binding thread-safe on iOS & Android\n([#297](https://github.com/rive-app/rive-nitro-react-native/issues/297))\n[…]\nb937df53b8ae3ee68e8e))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.12 (#299)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-06-26T13:19:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "abc0c2c27c8e1bc559b7b937df53b8ae3ee68e8e",
          "body": "## Summary\n\nFixes the occasional crashes in #297. The Rive data-binding objects\naren't thread-safe and must be driven from a single thread, but the\nNitro layer accessed them from several threads with no synchronization:\n\n- **iOS** — the Rive SDK plus the Obj-C\n`RiveDataBindingViewModelInstance` / C+\n[…]\n/Products/Debug-iphonesimulator/RiveExample.app\nyarn test:harness:ios --testPathPattern issue297\n```\n\nOr enable Thread Sanitizer in the Xcode scheme (Run → Diagnostics) and\n`⌘R` once to build+install.",
          "is_bot": false,
          "headline": "fix: make Rive data binding thread-safe on iOS & Android (#297) (#298)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-06-26T11:22:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "134be5069468d022fc1e820a994f3338f5390e61",
          "body": "…admap items complete (#293)\n\nRemoves the Early Release warning banner and updates the roadmap to\nreflect that Data Binding - Artboards and Data Binding - Value props are\nboth fully implemented.",
          "is_bot": false,
          "headline": "chore: remove Early Release banner, mark artboards and value props ro…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-06-17T13:48:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11f5c36c50bc15e2435da43f6355c4866ff3a080",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.11](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.10...v0.4.11)\n(2026-06-08)\n\n\n### Bug Fixes\n\n* **android:** defer autoplay until after VM instance is bound\n([#283](https://github.com/rive-app/rive-nitro-react-native/iss\n[…]\n81794f6560b7ac251e92))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.11 (#284)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-06-08T10:25:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f600a471bcb55f4cf3b981794f6560b7ac251e92",
          "body": "Fixes #282\n\nEntry transitions evaluated with default VM values before the user's\ninstance was bound. Pass `autoplay=false` to `setRiveFile` and call\n`play(settleInitialState=false)` when data binding is active so the\nstate machine is created without advancing Entry. The first\nChoreographer frame adv\n[…]\n+ `dataBind`, asserts\n`inputOnEntry=42` (Entry copied `input` into `inputOnEntry`)\n- iOS: pass (was already correct)\n- Android: pass (was failing before fix -- `inputOnEntry` stayed at\ndefault `-100`)",
          "is_bot": false,
          "headline": "fix(android): defer autoplay until after VM instance is bound (#283)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-06-08T09:48:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bd36c25a3b2915fb6075ce359b5dfc9598c7b50f",
          "body": "Upgrades harness from 1.1.0 to 1.3.0. Key improvements:\n\n- Bridge RPC closes immediately on app disconnect instead of waiting for\ntimeout\n- New internal RPC transport with heartbeat-based liveness detection\n- Dead app connections fail fast instead of ambiguous \"device did not\nrespond\" after 90s\n\nShould reduce intermittent CI flakiness.",
          "is_bot": false,
          "headline": "Upgrade react-native-harness to 1.3.0 (#279)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-06-03T07:48:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b21fea24c49be6b1439a237332520d3f9c0d4b6",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.10](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.9...v0.4.10)\n(2026-05-28)\n\n\n### Bug Fixes\n\n* **android:** allow overriding CMake version for Windows long-path\nbuilds\n([#265](https://github.com/rive-app/rive-nitro-react\n[…]\nf30c040f78adafdf7cbc))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.10 (#276)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-05-29T05:36:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e5a5ce43fa3f27a40a7cf30c040f78adafdf7cbc",
          "body": "Fixes #225.\n\nThe crash was a use-after-free: `RiveFile` deallocated while asset\ndownloads are in-flight, leaving `RiveFactory` with a dangling\n`rive::Factory*` pointer. Concurrent downloads widened the timing\nwindow, making it look like a threading race.\n\nFix: strong `self` capture in decode closure\n[…]\nia a `decodeAndApply`\nhelper.\n\nAlso upgrades rive-ios from 6.18.2 to 6.20.4 (includes CDN\nuse-after-free fix from rive-app/rive-ios#449).\n\nVerified with 320+ mount/unmount stress cycles without crash.",
          "is_bot": false,
          "headline": "fix(ios): keep RiveFile alive until decode* completes (#225) (#266)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-05-28T05:58:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3748643a9751ef23684f01af0d7a9330436ac5a2",
          "body": "Bumps rive-ios from 6.18.2 to 6.20.4.",
          "is_bot": false,
          "headline": "fix: bump iOS runtime to 6.20.4 (#271)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-05-27T11:38:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7300001fdcfb6b31bec4841537b174d4a897e807",
          "body": "…ilds (#265)\n\nFixes #263\n\nOn Windows, the Android build fails when CMake object-file paths exceed\n`MAX_PATH` (260 chars). The NDK default CMake (3.22.1) can't handle the\ndeeply-nested paths from Nitrogen's generated sources.\n\nThis is a [known issue across React Native libraries that use\nCMake](https\n[…]\n/react-native-reanimated/docs/guides/building-on-windows/).\nAdds support for the `CMAKE_VERSION` env var (same as Reanimated) so\nusers can opt into a newer CMake (e.g. 3.31.6) that handles long paths.",
          "is_bot": false,
          "headline": "fix(android): allow overriding CMake version for Windows long-path bu…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-05-27T11:08:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ed3f65c16af199bedf6ffa15d70431d6ac9b084e",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.9](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.8...v0.4.9)\n(2026-05-22)\n\n\n### Bug Fixes\n\n* prevent crash when trigger is called after dispose\n([#268](https://github.com/rive-app/rive-nitro-react-native/issues/268))\n([1\n[…]\n51ca67f9657cbc8e68b6))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.9 (#272)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-05-22T15:02:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "13d9dc108f0427a09ba351ca67f9657cbc8e68b6",
          "body": "Calling `trigger()` from a stale closure (e.g. a Reanimated callback\nthat fires after navigation/unmount) would crash because the native\nproperty was already disposed.\n\n`useDisposableMemo` now accepts an optional `liveRef` parameter — set on\ncreate, cleared on dispose. `useRiveTrigger` uses this to safely no-op\nwith a `console.warn` instead of crashing.\n\nReproducer: mount RiveView with trigger → unmount → call trigger from\nasync callback.",
          "is_bot": false,
          "headline": "fix: prevent crash when trigger is called after dispose (#268)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-05-22T14:57:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91e488483fe8269925133325d9a9e349722bda5b",
          "body": "… (#269)\n\nAdding a \"standardized\" github issue template similar to what we did\nwith android/ios/js/etc. so users can fill out a form when submitting\nissues.\n\nFeel free to suggest other questions/context we should gather in the\nissue template",
          "is_bot": false,
          "headline": "chore: add standardized github issue template to react native runtime…",
          "author_name": "Zachary Plata",
          "author_login": "zplata",
          "committed_at": "2026-05-22T12:53:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0615e29408d1a455645cae0c5d59a4c7b4eab9b0",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.8](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.7...v0.4.8)\n(2026-05-21)\n\n\n### Bug Fixes\n\n* separate trigger hook lifecycle to prevent missed events on Android\n([#262](https://github.com/rive-app/rive-nitro-react-native\n[…]\n57a755491d874d9ed637))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.8 (#267)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-05-21T20:01:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2279f9026cc6d2c8c53357a755491d874d9ed637",
          "body": "…oid (#262)\n\nFixes #230\n\nUnstable `onTrigger` callback references cause `useRiveTrigger` to\nsilently stop receiving events on Android after re-renders.\n\n`useRiveTrigger` now manages its own property lifecycle (like\n`useRiveList`) instead of going through `useRiveProperty`. The callback\nis stored in \n[…]\nhe Rive button — first tap works, then triggers stop.\n// On Android the trigger fires at the native level (chest opens)\n// but the JS callback is never called after the bailout render.\n```\n\n</details>",
          "is_bot": false,
          "headline": "fix: separate trigger hook lifecycle to prevent missed events on Andr…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-05-21T13:43:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e8337e11cecb98f71a0e33088cac559b9af8d6e",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.7](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.6...v0.4.7)\n(2026-05-14)\n\n\n### Features\n\n* add async variants for ViewModelListProperty mutation methods\n([#238](https://github.com/rive-app/rive-nitro-react-native/issues\n[…]\nact-native/issues/255)\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.7 (#257)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-05-19T05:45:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "522ad07ac6f77907d61e3bf61cc569a0b78e1495",
          "body": "…#238)\n\nDeprecate sync addInstance, addInstanceAt, removeInstance,\nremoveInstanceAt, swap in favor of async versions that return\nPromise<void>. Ported from feat/rive-ios-experimental branch.",
          "is_bot": false,
          "headline": "feat: add async variants for ViewModelListProperty mutation methods (…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-05-14T11:32:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e5d3ecaa8109b952bfc0fc874e60cadaa5ece74",
          "body": "…del (#256)\n\nUnwrap `riveFile` upfront to avoid `RiveArtboard??` from `try?` combined\nwith optional chaining. Fixes build failure on Xcode 26.3+.\n\nCloses #255",
          "is_bot": false,
          "headline": "fix(iOS): resolve double optional type error in defaultArtboardViewMo…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-05-14T10:25:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7b1949c6f00c278c0688ebe27044bb23d987802",
          "body": "Add `kanit_regular.ttf` to expo-example and expo55-example via\n`expo-font` plugin so the font fallback example can load bundled fonts.\n`expo-asset` rejects `.ttf` files — `expo-font` is required.",
          "is_bot": false,
          "headline": "chore: bundle kanit_regular.ttf in expo examples (#235)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-05-13T19:34:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16a2a25e52716838ab83a8dda80286a8d4a9d839",
          "body": "Expo SDK 55 / RN 0.83 example app for testing on newer React Native\nversions. Shares the same page infrastructure as the main example app\nvia `@example/*` path aliases.\n\nIncludes a Metro resolver redirect so shared exerciser/reproducer files\nfrom `example/src/` resolve their dependencies from\n`expo55-example/node_modules`.",
          "is_bot": false,
          "headline": "chore: add expo55-example app for testing on RN 0.83 (#228)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-04-24T10:12:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1ed1a50e155f3520f2f9afd2bd3f48c702e12db",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.6](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.5...v0.4.6)\n(2026-04-23)\n\n\n### Bug Fixes\n\n* **iOS:** dispatch completion to main thread in handlePreloadedImage\n([#222](https://github.com/rive-app/rive-nitro-react-native\n[…]\n00dfa92eb98b74eb446d))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.6 (#229)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-04-23T14:42:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8286bcf03fbe759f50f200dfa92eb98b74eb446d",
          "body": "…ject (#227)\n\nCalling `dispose()` on a HybridObject that's currently a prop on a\nHybridView crashes on RN 0.83 (React 19 / Fabric). React Fabric's\n`cloneNodeWithNewProps` reads properties from the old prop value after\n`dispose()` has set NativeState to null, causing `\"Cannot get hybrid\nproperty ... \n[…]\n999',\n    fontSize: 12,\n    marginBottom: 4,\n  },\n  riveBox: {\n    borderWidth: 1,\n    borderColor: 'red',\n  },\n});\n```\n\n</details>\n\nUpstream Nitro issue: https://github.com/mrousavy/nitro/issues/1296",
          "is_bot": false,
          "headline": "fix: prevent crash when React Fabric diffs props on disposed HybridOb…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-04-23T14:17:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c043d4a80112c38da46c9da443d90302d3ec701",
          "body": "…(#222)\n\nFixes #221\n\n`handlePreloadedImage` was calling `completion()` synchronously on the\nRive C++ runtime's background import queue, but `completion` triggers\n`releaseFile()` which asserts main thread via `dispatchPrecondition`.\nEvery other asset path in `ReferencedAssetLoader` already dispatches\n[…]\ntchQueue.global(.userInitiated)\n```\n\nReproduced using the Out-of-Band Assets (Suspense) exerciser which calls\n`RiveImages.loadFromURLAsync` and passes the preloaded `RiveImage` via\n`referencedAssets`.",
          "is_bot": false,
          "headline": "fix(iOS): dispatch completion to main thread in handlePreloadedImage …",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-04-23T13:47:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "548bafe897ae8b7260c919595b1ab52a87145a28",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.5](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.4...v0.4.5)\n(2026-04-17)\n\n\n### Bug Fixes\n\n* **iOS:** use per-call ReferencedAssetLoader to prevent concurrent\naccess crash\n([#218](https://github.com/rive-app/rive-nitro-r\n[…]\na40be98621b54edc7cc4))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.5 (#224)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-04-17T21:41:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d92574dffbf86ccfd408a40be98621b54edc7cc4",
          "body": "…cess crash (#218)\n\nFixes #215\n\nRegression from #202 — the shared `ReferencedAssetLoader` instance on\n`HybridRiveFileFactory` caused a data race when multiple `RiveFile`\nloads ran concurrently (e.g. mounting several `RiveView` components\nsimultaneously).\n\n`HybridRiveFileFactory.genericFrom` dispatch\n[…]\ningVertical: 8, paddingHorizontal: 20, borderRadius: 12, alignSelf: 'center', marginTop: 8 },\n  buttonText: { color: '#FFF', fontSize: 13, fontWeight: '600', textAlign: 'center' },\n});\n```\n\n</details>",
          "is_bot": false,
          "headline": "fix(iOS): use per-call ReferencedAssetLoader to prevent concurrent ac…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-04-17T20:57:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9d648bce355fe56b0f9b0cd064cfc498ac86d2d",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.4](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.3...v0.4.4)\n(2026-04-17)\n\n\n### Bug Fixes\n\n* survive fast refresh without disposing native objects\n([#213](https://github.com/rive-app/rive-nitro-react-native/issues/213))\n\n[…]\n895abd39db648fd3a9f0))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.4 (#223)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-04-17T14:41:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dea0ae28282245e145ce895abd39db648fd3a9f0",
          "body": "## Summary\n\nCherry-pick of #212 onto main. Fixes #205.\n\nFast refresh (HMR) re-runs all effect cleanups then all effects. Hooks\nthat disposed native HybridObjects in effect cleanup would destroy the\nbacking native state, but `useMemo` caches still returned the same (now\ndead) JS references — causing \n[…]\n`useRiveList`, and `useViewModelInstance`.\n\n## Test plan\n\n- [x] 9 unit tests for useDisposableMemo\n- [x] All existing tests pass\n- [x] Tested on iOS with Data Binding exerciser — fast refresh survives",
          "is_bot": false,
          "headline": "fix: survive fast refresh without disposing native objects (#213)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-04-17T14:26:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "edbde135018057d13d91836e41eabef53e8d40f9",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.3](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.2...v0.4.3)\n(2026-04-17)\n\n\n### Bug Fixes\n\n* bump rive-ios to 6.18.2 and rive-android to 11.4.0\n([#216](https://github.com/rive-app/rive-nitro-react-native/issues/216))\n([a\n[…]\nf4b90b26f732b4d8b406))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.3 (#217)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-04-17T07:09:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ae92eff16e668c1346dff4b90b26f732b4d8b406",
          "body": "Bump native Rive SDKs: rive-ios 6.18.0 → 6.18.2, rive-android 11.3.1 →\n11.4.0.\n\nNote: rive-ios 6.18.3 is tagged on GitHub but not yet published to\nCocoaPods, so using 6.18.2.\n\n### rive-ios 6.18.1–6.18.2\n- fix(renderer): gamma correction fix\n- fix(runtime): databind state machine transition duration\n\n[…]\nisteners on scripted VM properties\n- feat: component based conditions support\n- feat: single/multiline support in TextInput and improved scrolling\n- feat: image fit & alignment when parented by layout",
          "is_bot": false,
          "headline": "fix: bump rive-ios to 6.18.2 and rive-android to 11.4.0 (#216)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-04-17T06:28:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "89dd60f1f21c98e16021baea85ac3c579e5ebc55",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.2](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.1...v0.4.2)\n(2026-04-13)\n\n\n### Bug Fixes\n\n* Fit.LAYOUT artboard oversized on Android\n([#209](https://github.com/rive-app/rive-nitro-react-native/issues/209))\n([8b4219d](ht\n[…]\nbf57f1a9d02996ebe179))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.2 (#211)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-04-13T19:28:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8b4219d2b5d3e1129579bf57f1a9d02996ebe179",
          "body": "Fixes #206\n\n## Problem\n\n`Fit.LAYOUT` **intermittently** renders the artboard at pixel dimensions\ninstead of dp on Android (~50% repro rate, requires process restart).\n\n`layoutScaleFactorAutomatic` in rive-android defaults to `1.0` and is\nonly corrected to device density in `onMeasure()`. When `confi\n[…]\nabsoluteFill} dataBind={viewModelInstance} />\n      )}\n      {children}\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: { flex: 1, backgroundColor: '#0c1027' },\n});\n```\n\n</details>",
          "is_bot": false,
          "headline": "Fix Fit.LAYOUT artboard oversized on Android (#209)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-04-13T18:56:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "950026c97f79c8df046c691d2bd54ec31a31ee0f",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.1](https://github.com/rive-app/rive-nitro-react-native/compare/v0.4.0...v0.4.1)\n(2026-04-08)\n\n\n### Bug Fixes\n\n* **iOS:** eagerly dispose RiveView and break referenced asset retain\ncycle\n([#202](https://github.com/rive-app/rive-nitro-react-\n[…]\n7285b1e90d6551ddc988))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.1 (#208)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-04-08T04:46:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c4b12d6b951509e8d9417285b1e90d6551ddc988",
          "body": "…cycle (#202)\n\n## Summary\n- RiveView now calls `dispose()` on the native HybridObject on unmount\nvia `useEffect` cleanup, freeing the native view, ViewModel, and C++\nscene graph immediately instead of waiting for Hermes GC\n- Breaks the `SendableRef<RiveFile?>` retain cycle in\n`ReferencedAssetLoader`\n[…]\ntMonsterType('monster1');\n    riveViewRef?.playIfNeeded();\n  }, [setPG1, setPG2, setPG3, setPG4, setMouth, setPattern, setHeadpart, setColor, setEyes, setMonsterType, riveViewRef]);\n};\n```\n\n</details>",
          "is_bot": false,
          "headline": "fix(iOS): eagerly dispose RiveView and break referenced asset retain …",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-04-08T03:33:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4fb46a1e156c6b239d19e1aa8a6b9e904e1260e6",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.4.0](https://github.com/rive-app/rive-nitro-react-native/compare/v0.3.4...v0.4.0)\n(2026-03-30)\n\n\n### ⚠ BREAKING CHANGES\n\n* hooks start undefined, useViewModelInstance returns {instance, error}\n([#184](https://github.com/rive-app/rive-nitro-r\n[…]\nadc7c2eeff44d47b9985))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.4.0 (#200)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-03-31T05:26:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "059e5f4865ab8bcc207badc7c2eeff44d47b9985",
          "body": "…error} (#184)\n\nBreaking changes to improve state transparency and prepare for the async\nexperimental runtime.\n\n**`useRiveFile`** error is now `Error` instead of `string`, and\n`riveFile` is `undefined` while loading (was `null`). `isLoading` is\nkept for convenience. Migration: `{error}` in JSX → `{e\n[…]\nlInstance(file)`.\n\n**`useRiveNumber/String/Boolean/Color/Enum` hooks** start as `undefined`\ninstead of reading `property.value` synchronously. The real value\narrives via the listener's first emission.",
          "is_bot": false,
          "headline": "fix!: hooks start undefined, useViewModelInstance returns {instance, …",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-30T18:20:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1d0046863b8ffde03ec2e117918fa2f1e251ffed",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.3.4](https://github.com/rive-app/rive-nitro-react-native/compare/v0.3.3...v0.3.4)\n(2026-03-30)\n\n\n### Features\n\n* add getPropertyCountAsync and getInstanceCountAsync and deprecate\npropertyCount and instanceCount\n([#198](https://github.com/riv\n[…]\n3cfeacfc65ce405666a7))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.3.4 (#199)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-03-30T17:16:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6244b2ee306875a3608a3cfeacfc65ce405666a7",
          "body": "…te propertyCount and instanceCount (#198)\n\n## Summary\n- Add `getPropertyCountAsync()` and `getInstanceCountAsync()` async\nmethods to `ViewModel`\n- Deprecate sync `propertyCount` and `instanceCount` properties — the\nexperimental Rive runtime requires async calls, and sync versions use\nblocking wrapp\n[…]\nad\n- Legacy implementations wrap the existing sync getters in\n`Promise.async`\n- Update harness test to use async methods\n\n## Test plan\n- [x] Run `databinding-advanced` harness tests on iOS and Android",
          "is_bot": false,
          "headline": "feat: add getPropertyCountAsync and getInstanceCountAsync and depreca…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-30T16:44:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9779d2c567f1190ed111059595bf511542700e0",
          "body": "…194)\n\nMigrates all example/demo/exerciser files off the deprecated sync\nViewModel API and enables `@typescript-eslint/no-deprecated` as a lint\nerror to prevent regressions.\n\n**Examples migrated** (sync `useMemo` chains → `useViewModelInstance`\nhook or `useEffect`+async):\n- `RiveDataBindingExample`,\n[…]\nending async migration\nget `eslint-disable` with TODO comments.\n\n**Harness test:** asserts that `useRiveNumber` delivers its initial\nvalue on first listener emission without requiring any prop update.",
          "is_bot": false,
          "headline": "chore(examples): migrate to async API, add no-deprecated lint rule (#…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-27T08:16:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5cfe9715b87ae2adb2f3b3f56ccb852d9adabf06",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.3.3](https://github.com/rive-app/rive-nitro-react-native/compare/v0.3.2...v0.3.3)\n(2026-03-26)\n\n\n### Features\n\n* bump rive-ios to 6.18.0 and rive-android to 11.3.1\n([#193](https://github.com/rive-app/rive-nitro-react-native/issues/193))\n([ba\n[…]\n59d443ab0cfbf642f53b))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.3.3 (#197)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-03-26T21:27:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "21c71fd3cd3832bcbc4059d443ab0cfbf642f53b",
          "body": "…ard default (#196)\n\nFixes #189.\n\nIn Auto dataBind mode, Android passed `autoBind=true` to `setRiveFile`\nwhenever `viewModelCount > 0`. If the artboard had no default ViewModel\nassigned, the Rive SDK threw `\"No default ViewModel found for\nartboard\"`, freezing the animation.\n\nFix: always pass `autoBi\n[…]\n  />\n  ) : null;\n}\n```\n\n**Expected:** animation plays normally on both platforms.  \n**Actual (Android, unfixed):** animation freezes,\n`ViewModelInstanceNotFound` error fired via `onError`.\n\n</details>",
          "is_bot": false,
          "headline": "fix(android): animation freezes when file has ViewModels but no artbo…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-26T18:14:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bad9c604cf414a87c25f2fecf1ba36c6191c8409",
          "body": "Bumps both native Rive SDKs:\n- rive-ios: 6.17.0 → 6.18.0\n- rive-android: 11.2.1 → 11.3.1\n\n**rive-ios 6.18.0**\n([release](https://github.com/rive-app/rive-ios/releases/tag/6.18.0))\n- Advanced blend support\n- Expose audio engine\n- Keyboard input support for focused elements\n- ViewModel Listeners + Tra\n[…]\nupport for focused elements\n- ViewModel Listeners + Transition Conditions support\n- Fix: store relinked ViewModel instance on nested artboard\n- Skip focus nodes that are collapsed or fully transparent",
          "is_bot": false,
          "headline": "feat: bump rive-ios to 6.18.0 and rive-android to 11.3.1 (#193)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-26T15:38:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "abdb71e5ff8b9beeec519a0efcf53291b49a2068",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.3.2](https://github.com/rive-app/rive-nitro-react-native/compare/v0.3.1...v0.3.2)\n(2026-03-25)\n\n\n### Features\n\n* add async API compat layer for experimental migration\n([#183](https://github.com/rive-app/rive-nitro-react-native/issues/183))\n(\n[…]\nd9507900ecf277d6cce3))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.3.2 (#191)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-03-26T06:17:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c788ad6b4ac7496e027ed9507900ecf277d6cce3",
          "body": "Adds async equivalents for all sync methods and marks the sync versions\nas `@deprecated`. This lets users migrate to the new async API while\nstill on the legacy backend, before switching to experimental.\n\nNo behavior changes — all new async methods are thin `Promise.async {}`\nwrappers around existing sync calls.",
          "is_bot": false,
          "headline": "feat: add async API compat layer for experimental migration (#183)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-25T13:52:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb6d4d66c4d6da55d65759294a6817e88755970d",
          "body": "Upgrade from 1.0.0-alpha.25 to 1.0.0 stable for all three harness\npackages.",
          "is_bot": false,
          "headline": "chore: upgrade react-native-harness to 1.0.0 (#186)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-22T12:04:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3adf4a681de5234a9e36bbc0ba0dd57caf1bfbc3",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.3.1](https://github.com/rive-app/rive-nitro-react-native/compare/v0.3.0...v0.3.1)\n(2026-03-19)\n\n\n### Bug Fixes\n\n* bump iOS runtime to 6.17.0 and Android to 11.2.1\n([#182](https://github.com/rive-app/rive-nitro-react-native/issues/182))\n([a7c\n[…]\nact-native/issues/164)\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.3.1 (#188)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-03-20T06:22:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5a6f0393f9cc64b61e940c1370e6d0ab2760354d",
          "body": "Removes the `branches: - main` filter from `pull_request` trigger so CI\nruns on PRs targeting any branch. Enables stacked PR workflows. Push\ntriggers remain main-only.",
          "is_bot": false,
          "headline": "ci: run CI on PRs targeting any branch (#185)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-19T16:28:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7ca07955628c475d214ea2b5c0af49f1018dfcd",
          "body": "## Summary\n\n- **iOS 6.17.0**: Fixes offscreen-settled animations becoming stale when\nreturning onscreen (the reported stale animation issue). Also fixes text\nincorrectly advancing with some system font-backed fallback fonts.\n- **Android 11.2.1**: Removes debug symbols that were leaking into\nrelease builds since 11.0.0, reducing APK/AAB size for apps without NDK\nsymbol stripping configured.\n\nFixes #164",
          "is_bot": false,
          "headline": "fix: bump iOS runtime to 6.17.0 and Android to 11.2.1 (#182)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-19T16:11:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "608f5361baa3ca81f50a7a62e30817e4248a5a44",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.3.0](https://github.com/rive-app/rive-nitro-react-native/compare/v0.2.8...v0.3.0)\n(2026-03-13)\n\n\n### ⚠ BREAKING CHANGES\n\n* minimum nitro-modules version is now 0.35.0\n\n### Bug Fixes\n\n* upgrade nitro-modules to 0.35.0\n([#172](https://github.c\n[…]\nact-native/issues/169)\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.3.0 (#181)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-03-13T16:10:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c989fa595036ace3110c4bbe0142f2a8f8a268f6",
          "body": "Upgrades nitrogen CLI and nitro-modules runtime to 0.35.0. Fixes\n`ArrayBufferHolder` → `ArrayBuffer` rename and regenerates all nitrogen\nbindings.\n\nNitro 0.35 made generated ViewManagers `final`\n([nitro#1181](https://github.com/mrousavy/nitro/pull/1181)), which broke\nour `RiveViewManager.onDropViewI\n[…]\nidth: '100%', height: 200, justifyContent: 'center', alignItems: 'center', backgroundColor: '#ffebee' },\n});\n```\n\n</details>\n\nBREAKING CHANGE: minimum nitro-modules version is now 0.35.0\n\nCloses: #169",
          "is_bot": false,
          "headline": "fix!: upgrade nitro-modules to 0.35.0 (#172)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-13T15:40:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fc933b0ba87417a83f86bb4df1f35aaf61e0284d",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.2.8](https://github.com/rive-app/rive-nitro-react-native/compare/v0.2.7...v0.2.8)\n(2026-03-13)\n\n\n### Bug Fixes\n\n* Xcode 26 compatibility — strip .Swift submodule from RiveRuntime\nmodulemaps\n([#174](https://github.com/rive-app/rive-nitro-reac\n[…]\n911f36417c9fae46d463))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.2.8 (#180)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-03-13T11:18:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e82c4bee46f50db8f440911f36417c9fae46d463",
          "body": "… modulemaps (#174)\n\nFixes #173\n\nRiveRuntime's prebuilt XCFramework was built with Swift 6.1. Xcode 26\nuses Swift 6.2. Both generate `.Swift` Clang submodules with different\nC++ interop type definitions (`swift::Optional`, `swift::String`, etc),\ncausing hard ODR errors that can't be suppressed. This\n[…]\nrence is definition in module 'LocalCxxPod.Swift' found method 'init' with 1st parameter named 'value'\n```\n\n### After fix\n\nBUILD SUCCEEDED (Xcode 26.2, clean DerivedData, `pod install` +\n`xcodebuild`)",
          "is_bot": false,
          "headline": "fix: Xcode 26 compatibility — strip .Swift submodule from RiveRuntime…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-13T08:58:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9831e19f132a3980307363831e5c2dd7145b4c13",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.2.7](https://github.com/rive-app/rive-nitro-react-native/compare/v0.2.6...v0.2.7)\n(2026-03-06)\n\n\n### Features\n\n* setting fallback fonts\n([#152](https://github.com/rive-app/rive-nitro-react-native/issues/152))\n([e2c64ea](https://github.com/ri\n[…]\n3908a05c6598b2316d81))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.2.7 (#175)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-03-06T12:14:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e2c64eaf513085e52e543908a05c6598b2316d81",
          "body": "Adds `RiveFonts` — font fallback API for react-native. Two-phase design:\nload fonts into opaque handles, then configure a weight-based fallback\nmap. System font fallback is opt-in via `RiveFonts.systemFallback()`.\n\n```ts\nconst regular = await RiveFonts.loadFont({ uri: 'https://…/font.ttf' });\nconst \n[…]\n://github.com/user-attachments/assets/8d95082f-9b5a-4342-873c-db2073435f08\"\n/> | <img width=\"300\" alt=\"image\"\nsrc=\"https://github.com/user-attachments/assets/fea7dc6a-3c42-4d36-bfe5-c692abde3fa4\"\n/> |",
          "is_bot": false,
          "headline": "feat: setting fallback fonts (#152)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-06T11:06:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa32f3e177688d26d69567c6278cb2625a33cca8",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.2.6](https://github.com/rive-app/rive-nitro-react-native/compare/v0.2.5...v0.2.6)\n(2026-03-05)\n\n\n### Bug Fixes\n\n* restrict nitro to &lt;0.35, as we are not compatible with 0.35\n([#170](https://github.com/rive-app/rive-nitro-react-native/issu\n[…]\nfbe07e8dc575eb69fa70))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.2.6 (#171)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-03-05T11:31:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b304000e542d524ce112fbe07e8dc575eb69fa70",
          "body": "Restrict peer dependency version range for react-native-nitro-modules to\n< 0.35",
          "is_bot": false,
          "headline": "fix: restrict nitro to <0.35, as we are not compatible with 0.35 (#170)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-05T09:55:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3479d63b2b9b20f6cd0778d9a1199996c0ddd71",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.2.5](https://github.com/rive-app/rive-nitro-react-native/compare/v0.2.4...v0.2.5)\n(2026-03-02)\n\n\n### Bug Fixes\n\n* **android:** pass autoBind to SDK when dataBind is set\n([#156](https://github.com/rive-app/rive-nitro-react-native/issues/156))\n[…]\nact-native/issues/161)\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.2.5 (#165)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-03-02T13:47:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d8e5a4b16b97b1314e39dc61ad645a20e74d814",
          "body": "PR #140 correctly removed the play() that was called even if autoplay\nwas false, but it caused binding to break, as state machines were not\ninitialised in rive-android. This PR implements a better workaround by\npassing autoBind=true to rive-android, to make sure a stateMahcines is\nvalid. The only do\n[…]\n.\nThree modes: `playIfNeeded()` (bug path), `play()` (workaround), and tap\ngraphic (user interaction). Health bar at ~25% = binding applied (PASS),\n~100% = NOT applied (FAIL).\n\n</details>\n\nCloses #156",
          "is_bot": false,
          "headline": "fix(android): pass autoBind to SDK when dataBind is set (#156) (#157)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-02T13:20:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1bc139f63f7366f6755454410e152ab48f2ad52d",
          "body": "Bump native Rive SDKs: iOS 6.13.0 → 6.15.2, Android 11.1.0 → 11.2.0.\n\nNotable: Android 11.2.0 automatically bypasses ReLinker on API 23+ and\nuses System.loadLibrary directly.",
          "is_bot": false,
          "headline": "chore: bump iOS runtime to 6.15.2 and Android to 11.2.0 (#166)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-02T13:16:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1349bd8858e52d015480aaf863293d99645d7f5c",
          "body": "On iOS, when a state machine settles (isPlaying=false), setting an input\ndoesn't restart the render loop so the change is never visually\nprocessed. Android handles this via its controller queue. Adds\n`playIfNeeded()` to the three input setters (`setBooleanInputValue`,\n`setNumberInputValue`, `triggerInput`) to match Android behavior.\n\nFixes #161",
          "is_bot": false,
          "headline": "fix(ios): restart render loop after setting state machine inputs (#162)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-03-02T10:40:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9626351d21469654aa51c7a1cf836f9230631d7c",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.2.4](https://github.com/rive-app/rive-nitro-react-native/compare/v0.2.3...v0.2.4)\n(2026-02-27)\n\n\n### Features\n\n* add RiveRuntime API for Android init failure handling\n([#153](https://github.com/rive-app/rive-nitro-react-native/issues/153))\n(\n[…]\ned791930c3df2bdfd6e6))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.2.4 (#163)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-02-27T08:45:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "634724eb7db2282f47beed791930c3df2bdfd6e6",
          "body": "## Summary\n\nMoves `Rive.init()` out of `ContentProvider` (which crashes before user\ncode can run) into `RivePackage.createViewManagers()` with try/catch.\nExposes `RiveRuntime.initialize()` and `RiveRuntime.getStatus()` to JS\nso apps can detect and recover from native lib loading failures (ABI\nmismat\n[…]\ncom/user-attachments/assets/b473079e-c21a-42c4-ad8c-5f4875f0f885\"\n/>\n\n<img width=\"323\" height=\"629\" alt=\"image\"\nsrc=\"https://github.com/user-attachments/assets/98ff1ffd-4cbd-424c-b222-37026bbad10f\"\n/>",
          "is_bot": false,
          "headline": "feat: add RiveRuntime API for Android init failure handling (#153)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-02-27T06:37:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b5fb514e34ad46af2dd9927a38158dac588c4a8e",
          "body": "…#155)\n\nFixes #141 (hooks level)\n\n`useRiveProperty`'s `setValue` was throwing an error when called before\nthe `ViewModelInstance` loaded. This is a common React pattern —\n`useEffect` fires on mount before async data is available.\n\nChanged to silent no-op, as setValue does changes once the instance i\n[…]\npercase', marginBottom: 8,\n  },\n  logPlaceholder: { color: '#666', fontSize: 12, fontFamily: 'monospace' },\n  logEntry: { color: '#FF6B6B', fontSize: 11, fontFamily: 'monospace' },\n});\n```\n\n</details>",
          "is_bot": false,
          "headline": "fix: make useRiveProperty setValue a no-op before instance is ready (…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-02-26T06:50:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b159043efba19d97099ede9ae0561d94d2d3f1a4",
          "body": "Pre-compile the JS bundle before the test retry loop so harness Metro\nstarts with a warm cache. Replace fixed `sleep 2` with active port\npolling between retries. Bump bridgeTimeout from 60s to 180s as\nfallback.",
          "is_bot": false,
          "headline": "chore: pre-warm Metro bundle and improve port cleanup in iOS CI (#150)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-02-24T09:51:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1f1d672a12bd274da73ee01543e3fdd8bfe7a72",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.2.3](https://github.com/rive-app/rive-nitro-react-native/compare/v0.2.2...v0.2.3)\n(2026-02-20)\n\n\n### Bug Fixes\n\n* respect autoPlay={false} in applyDataBinding\n([#140](https://github.com/rive-app/rive-nitro-react-native/issues/140))\n([ac976f8\n[…]\n0bc645f24ae40966afd4))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.2.3 (#154)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-02-23T10:23:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ac976f8decdee39f1d8d0bc645f24ae40966afd4",
          "body": "Fixes #138\nFixes #139\n\n`applyDataBinding` unconditionally called `play()` on both iOS and\nAndroid, ignoring the `autoPlay` prop. Also, a second\n`configure(reload=true)` call would recreate the RiveViewModel without\nre-applying data binding. On Android, `getSafeStateMachineName` threw a\nfatal error w\n[…]\ne()` return null instead of\ncrashing\n\nAdds harness tests verifying `autoPlay={false}` prevents playback,\n`autoPlay={true}` drives ViewModel changes, and manual `play()` works\nafter `autoPlay={false}`.",
          "is_bot": false,
          "headline": "fix: respect autoPlay={false} in applyDataBinding (#140)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-02-20T23:58:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a5c9f2098195fc25e9387e60b3f5458df52da9d9",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.2.2](https://github.com/rive-app/rive-nitro-react-native/compare/v0.2.1...v0.2.2)\n(2026-02-20)\n\n\n### Bug Fixes\n\n* pin react-native-harness to exact alpha.25\n([#148](https://github.com/rive-app/rive-nitro-react-native/issues/148))\n([0b2c618](\n[…]\n0d9fb3daab1ddb4bcd36))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.2.2 (#149)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-02-20T21:52:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b2c61884f83602ea2768a47a58e7c363c1b9443",
          "body": "- Pin `react-native-harness` deps to exact `1.0.0-alpha.25` —\n`^1.0.0-alpha.25` resolves to `1.0.0-canary.*` because semver sorts\n\"canary\" > \"alpha\"\n- Add 5-minute per-attempt timeout for iOS harness tests (matching\nAndroid) — without it, a hung harness connection consumed the entire\n60-min job timeout leaving no room for retries",
          "is_bot": false,
          "headline": "fix: pin react-native-harness to exact alpha.25 (#148)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-02-20T17:01:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "24337ffbc2167991506903bd17683c63ef644950",
          "body": "Adds `babel-plugin-react-compiler` to the library's babel config so bob\npre-compiles the `lib/module/` output with React Compiler. This\nauto-memoizes all hooks in the published package, preventing referential\ninstability issues for consumers who don't use React Compiler\nthemselves.\n\nThe `configFile:\n[…]\no resolves to `lib/module/` for all external consumers (via the\n`default` condition in `exports`). The `source` condition is only used\nin our monorepo example apps where bob's metro config injects it.",
          "is_bot": false,
          "headline": "chore: add React Compiler to library build (#146)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-02-19T12:23:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "372d4ae1f5e06fc2be4f0d9fb3daab1ddb4bcd36",
          "body": "… (#145)\n\nFixes #136\n\n`useRiveEnum` was creating an inline options object on every render\n(with `useCallback` inside it). Without React Compiler, this caused\n`setValue` to get a new identity every render — triggering extra effect\nfires in user code that has `setValue` in its dependency array.\n\nExtra\n[…]\n: 16, marginBottom: 16, backgroundColor: '#007AFF', paddingVertical: 14, borderRadius: 10, alignItems: 'center' },\n  buttonText: { color: '#fff', fontSize: 16, fontWeight: '600' },\n});\n```\n\n</details>",
          "is_bot": false,
          "headline": "fix: stabilize useRiveEnum options to prevent setValue identity churn…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-02-19T11:20:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6d40e33771871bd8f6c34d554bc2be76a6301150",
          "body": "Adds Android harness test CI job mirroring the existing iOS harness\nsetup. Also fixes two Android test failures exposed by running the\nharness.\n\n- Android harness CI job with emulator (API 35, x86_64), 3 retries,\n5-min per-attempt timeout\n- Timeout guards: 60 min for iOS, 30 min for Android\n- Fix colorProperty Double→Int overflow on Android (`toLong().toInt()`)\n- Enum test tolerance for Android legacy SDK accepting invalid values",
          "is_bot": false,
          "headline": "ci: add Android harness test job (#147)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-02-19T10:49:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36bdf8d2ee04dcea88a14e3b04596299af1094c1",
          "body": "Add advanced databinding harness tests to main and bump\nreact-native-harness to alpha.25. Guard negative indices in\nviewModelByIndex and createInstanceByIndex on both iOS and Android. Wrap\nAndroid viewModelByIndex/viewModelByName in try-catch since the Rive SDK\nthrows JNI exceptions for invalid lookups. Add ANDROID_AVD env var\nsupport to harness config.\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>\nCo-authored-by: Happy <yesreply@happy.engineering>",
          "is_bot": false,
          "headline": "test: add advanced databinding harness tests (#137)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-02-17T11:48:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "98de6689e35ccd8ab47b86a4b262c514a85ae9e8",
          "body": "Co-authored-by: PierreCapo <pierre.caporossi@gadz.org>",
          "is_bot": false,
          "headline": "doc: fix typo (#135)",
          "author_name": "PierreCapo",
          "author_login": "PierreCapo",
          "committed_at": "2026-02-09T09:25:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9201b17fb480270b4b27a1422bc32e4bddcd484c",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.2.1](https://github.com/rive-app/rive-nitro-react-native/compare/v0.2.0...v0.2.1)\n(2026-01-23)\n\n\n### Features\n\n* useViewModelInstance use name and artboardName when getting vmi from a\nfile\n([#129](https://github.com/rive-app/rive-nitro-react\n[…]\n9cdcf96df523026fbe16))\n\n---\nThis PR was generated with [Release\nPlease](https://github.com/googleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).",
          "is_bot": false,
          "headline": "chore(main): release 0.2.1 (#130)",
          "author_name": "Rive Engineering",
          "author_login": "rive-engineering",
          "committed_at": "2026-01-27T10:34:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c6a1a906d8e97b5c605c2d7955b2f6999e19000",
          "body": "## Summary\n- `artboardName` and `viewModelName` are now mutually exclusive\n(TypeScript discriminated unions)\n- Clarified docs: \"ViewModel assigned to artboard\" instead of implying\nownership\n\n## API\n\n```tsx\n// RiveFile source - pick ONE of: default, artboardName, or viewModelName\nuseViewModelInstance\n[…]\niewModelName: string,      // get ViewModel by name (file-wide)\n  instanceName?: string\n})\n\n// ViewModel source (unchanged)\nuseViewModelInstance(viewModel, {\n  name?: string,\n  useNew?: boolean\n})\n```",
          "is_bot": false,
          "headline": "feat: add viewModelName param to useViewModelInstance (#132)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-01-23T15:50:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "66c2e5fe8f73d4fb053a840242aa405b13f3d955",
          "body": "Add test coverage output directory to gitignore.",
          "is_bot": false,
          "headline": "chore: add coverage to gitignore (#131)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-01-22T16:10:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd22bb3f07a589324a16c0c90086a91ca4547b8e",
          "body": "## Summary\n- Cache Xcode build artifacts in test-harness-ios job, skipping\nxcodebuild when only JS files change\n- Update turbo inputs to only track `src/specs/*.nitro.ts` instead of\nall TS files\n\n## Test plan\n- [ ] Verify CI passes on first run (cache miss, full build)\n- [ ] Verify subsequent JS-only changes skip native build (cache hit)",
          "is_bot": false,
          "headline": "chore(ci): improve iOS build caching for test harness (#126)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-01-21T21:20:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56156545442b8f529d559cdcf96df523026fbe16",
          "body": "… from a file (#129)\n\n## Summary\n\nFixes #124 - `useViewModelInstance` hook now correctly handles the\n`name` parameter:\n\n- `name` consistently means **ViewModel instance name** (not ViewModel\nclass name) for both `RiveFile` and `ViewModel` sources\n- New `artboardName` param for `RiveFile` source to s\n[…]\ntboardName` only available for `RiveFile`)\n\n## Test plan\n\n- [x] Unit tests pass (`yarn test`)\n- [x] TypeScript compiles (`yarn typecheck`)\n- [x] Lint passes (`yarn lint`)\n- [ ] Harness tests on device",
          "is_bot": false,
          "headline": "feat: useViewModelInstance use name and artboardName when getting vmi…",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-01-21T11:15:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6bcaac2647903089440ea2ebd171c8761fa6ca0b",
          "body": "## Summary\n- Add harness test for `useRiveNumber` hook\n- Fix duplicate React instances in metro config that prevented hooks\nfrom working in harness tests\n\n## Root Cause\nThe library's hooks were importing React from a different location than\nthe harness, causing \"Cannot read property 'useMemo' of null\" errors.\nFixed by adding `react` to the module deduplication list in\n`metro.helpers.js`.",
          "is_bot": false,
          "headline": "test(harness): add useRiveNumber hook test (#128)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-01-21T10:28:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f810d020acf561dad240479d8f87b6376a8b6a39",
          "body": "## Summary\n- Add comprehensive ViewModel property tests based on Flutter's\ndata_binding_test.dart\n- Tests cover: number, string, boolean, color, enum, trigger properties\n- Tests cover: nested viewModel access and nested path syntax (e.g.,\n`pet/name`)\n- Add `databinding.riv` test asset from Flutter test suite\n\n## Test plan\n- Run tests via in-app test runner on iOS/Android",
          "is_bot": false,
          "headline": "test: add ViewModel property tests for all types (#125)",
          "author_name": "Miklós Fazekas",
          "author_login": "mfazekas",
          "committed_at": "2026-01-20T15:28:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 40,
      "commits_last_year": 186,
      "latest_release_at": "2026-07-17T11:11:55Z",
      "latest_release_tag": "v0.4.19",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 32,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 5.5
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@rive-app/react-native",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "react-native",
            "ios",
            "android"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@rive-app/react-native",
          "is_deprecated": false,
          "latest_version": "0.4.19",
          "repository_url": "https://github.com/rive-app/rive-nitro-react-native",
          "versions_count": 38,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 5,
          "monthly_downloads": 208183,
          "first_published_at": "2025-12-10T19:42:46.430000Z",
          "latest_published_at": "2026-07-17T11:14:04.882000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 10,
      "stars": 145,
      "watchers": 9,
      "fork_history": {
        "days": [
          {
            "date": "2025-11-25",
            "count": 1
          },
          {
            "date": "2025-12-01",
            "count": 1
          },
          {
            "date": "2026-01-29",
            "count": 1
          },
          {
            "date": "2026-02-05",
            "count": 1
          },
          {
            "date": "2026-03-03",
            "count": 1
          },
          {
            "date": "2026-03-05",
            "count": 2
          },
          {
            "date": "2026-03-31",
            "count": 1
          },
          {
            "date": "2026-04-18",
            "count": 1
          },
          {
            "date": "2026-06-30",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 10,
        "total_forks": 10
      },
      "star_history": null,
      "open_issues_and_prs": 13
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "demos",
        "example"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "expo-example/tsconfig.json",
        "expo55-example/tsconfig.json",
        "expo57-example/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [
        "android/build.gradle",
        "example/android/app/build.gradle",
        "example/android/build.gradle",
        "rive-debug-utils/android/build.gradle"
      ],
      "largest_source_bytes": 2228925,
      "source_files_sampled": 304,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "android/build.gradle",
        "example/Gemfile",
        "example/package.json",
        "expo-example/package.json",
        "expo55-example/package.json",
        "expo57-example/package.json",
        "package.json",
        "rive-debug-utils/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "maven",
        "npm",
        "rubygems"
      ],
      "dependencies": [
        {
          "name": "@expo/vector-icons",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.0.3"
        },
        {
          "name": "@react-native-async-storage/async-storage",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.2"
        },
        {
          "name": "@react-native-picker/picker",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.11.4"
        },
        {
          "name": "@react-navigation/bottom-tabs",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.4.0"
        },
        {
          "name": "@react-navigation/elements",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.6.3"
        },
        {
          "name": "@react-navigation/native",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.1.8"
        },
        {
          "name": "expo",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~54.0.20"
        },
        {
          "name": "expo-constants",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~18.0.10"
        },
        {
          "name": "expo-font",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~14.0.9"
        },
        {
          "name": "expo-haptics",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~15.0.7"
        },
        {
          "name": "expo-image",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~3.0.10"
        },
        {
          "name": "expo-linking",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~8.0.8"
        },
        {
          "name": "expo-router",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~6.0.13"
        },
        {
          "name": "expo-screen-orientation",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~9.0.8"
        },
        {
          "name": "expo-splash-screen",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~31.0.10"
        },
        {
          "name": "expo-status-bar",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~3.0.8"
        },
        {
          "name": "expo-symbols",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~1.0.7"
        },
        {
          "name": "expo-system-ui",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~6.0.8"
        },
        {
          "name": "expo-web-browser",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~15.0.8"
        },
        {
          "name": "react",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.1.0"
        },
        {
          "name": "react-dom",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.1.0"
        },
        {
          "name": "react-native",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.81.5"
        },
        {
          "name": "react-native-gesture-handler",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "2.29.1"
        },
        {
          "name": "react-native-nitro-modules",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.35.10"
        },
        {
          "name": "react-native-reanimated",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "4.1.5"
        },
        {
          "name": "react-native-safe-area-context",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~5.6.0"
        },
        {
          "name": "react-native-screens",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~4.16.0"
        },
        {
          "name": "react-native-web",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~0.21.0"
        },
        {
          "name": "react-native-worklets",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.6.1"
        },
        {
          "name": "rive-debug-utils",
          "manifest": "expo-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@expo/vector-icons",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.0.3"
        },
        {
          "name": "@react-native-async-storage/async-storage",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.2"
        },
        {
          "name": "@react-native-picker/picker",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.11.4"
        },
        {
          "name": "@react-navigation/bottom-tabs",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.15.5"
        },
        {
          "name": "@react-navigation/elements",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.6.3"
        },
        {
          "name": "@react-navigation/native",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.1.33"
        },
        {
          "name": "expo",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^55.0.12"
        },
        {
          "name": "expo-constants",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~55.0.12"
        },
        {
          "name": "expo-font",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~55.0.4"
        },
        {
          "name": "expo-haptics",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~55.0.14"
        },
        {
          "name": "expo-image",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~55.0.8"
        },
        {
          "name": "expo-linking",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~55.0.11"
        },
        {
          "name": "expo-router",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~55.0.11"
        },
        {
          "name": "expo-screen-orientation",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~55.0.13"
        },
        {
          "name": "expo-splash-screen",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~55.0.6"
        },
        {
          "name": "expo-status-bar",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~55.0.5"
        },
        {
          "name": "expo-symbols",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~55.0.7"
        },
        {
          "name": "expo-system-ui",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~55.0.15"
        },
        {
          "name": "expo-web-browser",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~15.0.10"
        },
        {
          "name": "react",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.0"
        },
        {
          "name": "react-dom",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.0"
        },
        {
          "name": "react-native",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.83.4"
        },
        {
          "name": "react-native-gesture-handler",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~2.29.0"
        },
        {
          "name": "react-native-nitro-modules",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.35.10"
        },
        {
          "name": "react-native-reanimated",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "4.2.1"
        },
        {
          "name": "react-native-safe-area-context",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~5.6.2"
        },
        {
          "name": "react-native-screens",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~4.23.0"
        },
        {
          "name": "react-native-web",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~0.21.0"
        },
        {
          "name": "react-native-worklets",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.7.4"
        },
        {
          "name": "rive-debug-utils",
          "manifest": "expo55-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-native-async-storage/async-storage",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.2"
        },
        {
          "name": "@react-native-picker/picker",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.11.4"
        },
        {
          "name": "@react-navigation/bottom-tabs",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.15.5"
        },
        {
          "name": "@react-navigation/elements",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.6.3"
        },
        {
          "name": "@react-navigation/native",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.1.33"
        },
        {
          "name": "expo",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "^57.0.4"
        },
        {
          "name": "expo-constants",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.3"
        },
        {
          "name": "expo-font",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.0"
        },
        {
          "name": "expo-haptics",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.0"
        },
        {
          "name": "expo-image",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.0"
        },
        {
          "name": "expo-linking",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.2"
        },
        {
          "name": "expo-router",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.4"
        },
        {
          "name": "expo-screen-orientation",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.0"
        },
        {
          "name": "expo-splash-screen",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.2"
        },
        {
          "name": "expo-status-bar",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.0"
        },
        {
          "name": "expo-system-ui",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.0"
        },
        {
          "name": "expo-web-browser",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.0"
        },
        {
          "name": "react",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-native",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.86.0"
        },
        {
          "name": "react-native-gesture-handler",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~2.32.0"
        },
        {
          "name": "react-native-nitro-modules",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.35.10"
        },
        {
          "name": "react-native-reanimated",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "4.5.0"
        },
        {
          "name": "react-native-safe-area-context",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~5.7.0"
        },
        {
          "name": "react-native-screens",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "4.25.2"
        },
        {
          "name": "react-native-web",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "~0.21.0"
        },
        {
          "name": "react-native-worklets",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.10.0"
        },
        {
          "name": "rive-debug-utils",
          "manifest": "expo57-example/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 11,
        "merged_prs": 226,
        "open_issues": 2,
        "closed_ratio": 0.969,
        "closed_issues": 62,
        "closed_unmerged_prs": 44
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "mfazekas",
          "commits": 128,
          "avatar_url": "https://avatars.githubusercontent.com/u/52435?v=4"
        },
        {
          "type": "User",
          "login": "HayesGordon",
          "commits": 44,
          "avatar_url": "https://avatars.githubusercontent.com/u/13705472?v=4"
        },
        {
          "type": "User",
          "login": "rive-engineering",
          "commits": 35,
          "avatar_url": "https://avatars.githubusercontent.com/u/60802183?v=4"
        },
        {
          "type": "User",
          "login": "zplata",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/5685058?v=4"
        },
        {
          "type": "User",
          "login": "bassrock",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1010384?v=4"
        },
        {
          "type": "User",
          "login": "PierreCapo",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/26744253?v=4"
        }
      ],
      "contributors_sampled": 6,
      "top_contributor_share": 0.607
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "bare-example.yml",
        "ci.yml",
        "publish.yml",
        "release-please.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.js",
        "eslint.config.mjs"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Gemfile.lock",
        "yarn.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 9,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 5,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 8,
            "reason": "26 out of 30 merged PRs checked by a CI test -- score normalized to 8",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 10,
            "reason": "all changesets reviewed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 23 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "105 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "17984bc4752ec6c8523e75fd32944083143b0c41",
        "ran_at": "2026-07-22T10:54:16Z",
        "aggregate_score": 4.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-21T18:56:39Z",
      "oldest_open_prs": [
        {
          "number": 41,
          "created_at": "2025-11-25T16:25:53Z",
          "last_comment_at": "2026-01-29T15:55:58Z",
          "last_comment_author": "bassrock"
        },
        {
          "number": 190,
          "created_at": "2026-03-25T10:29:04Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 250,
          "created_at": "2026-05-12T13:34:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 252,
          "created_at": "2026-05-12T13:59:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 264,
          "created_at": "2026-05-19T07:18:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 281,
          "created_at": "2026-06-01T20:04:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 294,
          "created_at": "2026-06-15T11:27:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 326,
          "created_at": "2026-07-07T20:35:10Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 330,
          "created_at": "2026-07-09T08:28:06Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 335,
          "created_at": "2026-07-14T06:18:41Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 350,
          "created_at": "2026-07-20T13:19:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-21T18:56:08Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 58,
          "created_at": "2025-11-29T10:06:30Z",
          "last_comment_at": "2025-12-08T14:14:46Z",
          "last_comment_author": "mfazekas"
        },
        {
          "number": 159,
          "created_at": "2026-02-26T04:31:28Z",
          "last_comment_at": "2026-02-26T23:30:17Z",
          "last_comment_author": "Jianlong-Nie"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/rive-app/rive-nitro-react-native",
    "host": "github.com",
    "name": "rive-nitro-react-native",
    "owner": "rive-app"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 75,
      "inputs": {
        "security": 49,
        "vitality": 92,
        "community": 71,
        "governance": 73,
        "engineering": 82
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 92,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 86,
            "inputs": {
              "commits_last_year": 186,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 32
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "32/52 weeks with commits",
                "points": 22.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 32
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "186 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 186
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 23 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 40,
              "latest_release_tag": "v0.4.19",
              "releases_from_tags": false,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 5.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "40 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 40
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~5.5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 5.5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "good",
        "name": "Community & Adoption",
        "value": 71,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "forks": 10,
              "stars": 145,
              "watchers": 9,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "145 stars",
                "points": 35,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 145
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "10 forks",
                "points": 8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "9 watchers",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "excellent",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 89,
            "inputs": {
              "packages": [
                "@rive-app/react-native"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 208183
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "208,183 downloads/month across npm",
                "points": 70.9,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 208183,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 73,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 6,
              "top_contributor_share": 0.607
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 61% of commits",
                "points": 8.8,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 61
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "6 contributors",
                "points": 8.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "merged_prs": 226,
              "open_issues": 2,
              "closed_issues": 62,
              "issue_closed_ratio": 0.969,
              "closed_unmerged_prs": 44
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "97% of issues closed",
                "points": 45.3,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 97
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "226/270 decided PRs merged",
                "points": 32,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 226,
                      "decided": 270
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "all changesets reviewed",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "followers": 1330,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "rive-app",
              "public_repos": 60,
              "account_age_days": 2423
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "1,330 followers of rive-app",
                "points": 22.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1330,
                      "login": "rive-app"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "60 public repos, account ~6 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 60
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@rive-app/react-native"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "38 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 38
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 82,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 86,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "eslint.config.js, eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "26 out of 30 merged PRs checked by a CI test -- score normalized to 8",
                "points": 16,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 49,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 49,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 3.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "26 out of 30 merged PRs checked by a CI test -- score normalized to 8",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "all changesets reviewed",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 23 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "105 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 7
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 61,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 69,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Gemfile.lock",
                "yarn.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "expo-example/tsconfig.json",
                "expo55-example/tsconfig.json",
                "expo57-example/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.01,
              "toolchain_manifests": [
                "android/build.gradle",
                "example/android/app/build.gradle",
                "example/android/build.gradle",
                "rive-debug-utils/android/build.gradle"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "android/build.gradle, example/android/app/build.gradle, example/android/build.gradle (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "android/build.gradle, example/android/app/build.gradle, example/android/build.gradle"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "eslint.config.js, eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "expo-example/tsconfig.json, expo55-example/tsconfig.json, expo57-example/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "expo-example/tsconfig.json, expo55-example/tsconfig.json, expo57-example/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 2228925,
              "source_files_sampled": 304,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/304 source files over 60KB",
                "points": 54.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 304,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "demos",
                "example"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "demos, example",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "demos, example"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:@rive-app/react-native@0.4.19; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T10:54:43.838491Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/rive-app/rive-nitro-react-native.svg",
  "full_name": "rive-app/rive-nitro-react-native",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.26.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistikennpm.