{"adoption": {"forks": 395, "observed_at": "2026-08-28T04:07:09.976908+00:00", "stars": 2680}, "canonical_url": "https://ross.abutalabs.com/products/client_side_validations", "card": {"archived": false, "artifact_type": "library", "description": "Client Side Validations made easy for Ruby on Rails", "domain": ["web-development", "frontend", "developer-tools"], "enriched": true, "function": ["form-handling", "frontend-framework", "plugin-system"], "health_score": 100, "homepage": null, "language": "Ruby", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["DavyJonesLocker/client_side_validations"], "name": "DavyJonesLocker/client_side_validations", "platform": ["ruby", "browser"], "pushed_at": "2026-08-24T14:50:04+00:00", "repo": "DavyJonesLocker/client_side_validations", "stars": 2680, "tags": ["ruby-on-rails", "client-side-validation", "activemodel", "form-validation", "gem", "javascript", "web-server"], "topics": ["clientsidevalidations", "rails"], "urls": [], "use_cases": ["validate rails forms in the browser without page reloads", "reuse server-side activemodel validation rules on the client", "show inline form validation errors matching server-side rendering", "validate nested form fields client-side", "add client-side validation to a custom rails form builder", "avoid duplicating validation logic between backend and frontend"], "what_it_is": "A Ruby gem and JavaScript package that automatically extracts ActiveModel validation rules from a Rails backend and applies them as client-side form validations. It renders validation errors identically to server-side rendering and supports custom validators, nested fields, and a plugin system for additional form builders and ORMs.", "when_to_avoid": ["you are not using Ruby on Rails or ActiveModel-based models", "your validations rely heavily on conditional callbacks like :if/:unless, which fall back to the server", "you use a frontend framework (React, Vue) with its own form validation ecosystem", "you need validations for non-Rails backends"], "when_to_choose": ["you have a Rails 7.2 or 8.x app with ActiveModel::Validations and want instant client-side feedback", "you want client-side errors to look identical to server-side validation errors", "you need support for nested fields and custom validations out of the box", "you want a jQuery-free, plugin-extensible validation solution"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/client_side_validations", "repo": "DavyJonesLocker/client_side_validations", "role": "main", "score": 97}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:09.976908+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:17:56.180965+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8479922d325f82429d13169099408e97f7047a5908d99919a66c78ba236a05a5", "fetched_at": "2026-08-28T04:07:09.976908+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DavyJonesLocker/client_side_validations"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:09.976908+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:17:56.180965+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8479922d325f82429d13169099408e97f7047a5908d99919a66c78ba236a05a5", "fetched_at": "2026-08-28T04:07:09.976908+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DavyJonesLocker/client_side_validations"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:17:56.180965+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8479922d325f82429d13169099408e97f7047a5908d99919a66c78ba236a05a5", "fetched_at": "2026-08-28T04:07:09.976908+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DavyJonesLocker/client_side_validations"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:07:09.976908+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:09.976908+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:09.976908+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:17:56.180965+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8479922d325f82429d13169099408e97f7047a5908d99919a66c78ba236a05a5", "fetched_at": "2026-08-28T04:07:09.976908+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DavyJonesLocker/client_side_validations"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:09.976908+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:09.976908+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:17:56.180965+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8479922d325f82429d13169099408e97f7047a5908d99919a66c78ba236a05a5", "fetched_at": "2026-08-28T04:07:09.976908+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DavyJonesLocker/client_side_validations"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:09.976908+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:09.976908+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:09.976908+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:17:56.180965+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8479922d325f82429d13169099408e97f7047a5908d99919a66c78ba236a05a5", "fetched_at": "2026-08-28T04:07:09.976908+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DavyJonesLocker/client_side_validations"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:09.976908+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:09.976908+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:17:56.180965+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8479922d325f82429d13169099408e97f7047a5908d99919a66c78ba236a05a5", "fetched_at": "2026-08-28T04:07:09.976908+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DavyJonesLocker/client_side_validations"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:17:56.180965+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8479922d325f82429d13169099408e97f7047a5908d99919a66c78ba236a05a5", "fetched_at": "2026-08-28T04:07:09.976908+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DavyJonesLocker/client_side_validations"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:17:56.180965+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8479922d325f82429d13169099408e97f7047a5908d99919a66c78ba236a05a5", "fetched_at": "2026-08-28T04:07:09.976908+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DavyJonesLocker/client_side_validations"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:17:56.180965+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8479922d325f82429d13169099408e97f7047a5908d99919a66c78ba236a05a5", "fetched_at": "2026-08-28T04:07:09.976908+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DavyJonesLocker/client_side_validations"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 92}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 5694, "days_push": 9, "days_rel": 59, "gap_med": 0, "n_releases_24m": 6}, "score": 97, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}