Public record
Software health reportschema 0.26.0 · metrics 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 stars⑂ 10 forkssince May 2025View on GitHub ↗

rive-app/rive-nitro-react-native holds a health index of 75 out of 100, placing it in the Good band. It scores highest on Vitality (92/100) and lowest on Security (49/100). It was last updated today. A single contributor accounts for most of its recent work.

75
overall / 100
Good

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

75
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

RiveOrganization
1,330 followers60 public repossince Dec 2019

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npm@rive-app/react-native0.4.19208,183384 days agoreact-nativeiosandroid

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

92Excellent · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
22.2/36Commit cadence — 32/52 weeks with commits
18/18Commit volume — 186 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 23 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year186
human_commit_share1
days_since_last_push0
active_weeks_last_year32

Release discipline

100Excellent
How it's scored
27/27Ships releases — 40 releases published
36/36Release recency — latest release 4 days ago
27/27Release cadence — a release every ~5.5 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count40
latest_release_tagv0.4.19
releases_from_tagsno
days_since_latest_release4
mean_days_between_releases5.5
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

71Good · 18% of overall
How it's scored
35/60Stars — 145 stars
8/25Forks — 10 forks
5/15Watchers — 9 watchers
Inputs used
forks10
stars145
watchers9
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

Community health

85Excellent
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
18/18CONTRIBUTING guide
13.5/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductyes
has_pull_request_templateno
How it's scored
70.9/80Monthly downloads — 208,183 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packages@rive-app/react-native
dependents
ecosystemsnpm
total_downloads
monthly_downloads208,183
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

73Good · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
8.8/22.5Commit distribution — top contributor authored 61% of commits
8.1/13.5Contributor breadth — 6 contributors
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Inputs used
bus_factor1
contributors_sampled6
top_contributor_share0.607
How it's scored
45.3/46.8Issue resolution — 97% of issues closed
32/38.3PR acceptance — 226/270 decided PRs merged
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Inputs used
merged_prs226
open_issues2
closed_issues62
issue_closed_ratio0.969
closed_unmerged_prs44
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
22.5/25Owner reach — 1,330 followers of rive-app
25/25Track record — 60 public repos, account ~6 yr old
Inputs used
followers1,330
owner_typeOrganization
is_verified
owner_loginrive-app
public_repos60
account_age_days2,423
How it's scored
25/25Published & resolvable — 1 package(s) on npm
35/35Publish recency — latest publish 4 days ago
20/20Version history — 38 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packages@rive-app/react-native
ecosystemsnpm
any_deprecatedno
min_days_since_publish4

Engineering Quality

Are baseline engineering and documentation practices in place?

82Good · 20% of overall
How it's scored
24/24CI workflows — 4 workflow(s)
24/24Tests present
16/16Linter config — 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
Inputs used
has_ciyes
has_testsyes
has_editorconfigyes
has_linter_configyes
has_precommit_configno
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

49At risk · 16% of overall
How it's scored
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.5License — 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 — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 105 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4.9
Excluded from scoring (no data or not applicable): signed_releases. Remaining weights renormalized.

AI Readiness

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.

61Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 100 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
How it's scored
12.6/18One-command bootstrap — android/build.gradle, example/android/app/build.gradle, example/android/build.gradle (toolchain convention, no task runner)
22/22Automated tests
11/11Lint / format config — eslint.config.js, eslint.config.mjs
11/11Static type checking — expo-example/tsconfig.json, expo55-example/tsconfig.json, expo57-example/tsconfig.json, tsconfig.json
10/10Reproducible environment — lockfile
2/10Demonstrated agent practice — 1 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilesGemfile.lock, yarn.lock
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configyes
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
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
54.6/55Manageable file sizes — 2/304 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes2,228,925
source_files_sampled304
oversized_source_files2
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — demos, example
Inputs used
example_dirsdemos, example
has_mcp_signalno
api_schema_files

Key facts

145GitHub stars
6contributors
186commits, last 12 months
0days since last push
40releases
1bus factor
2open issues
Maven, npm, RubyGemspackage ecosystems

Data collection 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

More detail

Star and fork history 0 ★ / 10 ⇿
0Stars
10Forks
33Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

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

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).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
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities105 existing vulnerabilities detected
Direct dependencies 88
RegistryPackageVersion constraintManifest
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
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.26.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsnpm.