{"adoption": {"forks": 405, "observed_at": "2026-08-28T04:08:18.031766+00:00", "stars": 3765}, "canonical_url": "https://ross.abutalabs.com/products/ccapturejs", "card": {"archived": false, "artifact_type": "library", "description": "A library to capture canvas-based animations at a fixed framerate", "domain": ["web-development", "graphics", "media"], "enriched": true, "function": ["video-processing", "image-processing"], "health_score": 97, "homepage": null, "language": "JavaScript", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["spite/ccapture.js"], "name": "spite/ccapture.js", "platform": ["browser"], "pushed_at": "2026-07-27T23:40:51+00:00", "repo": "spite/ccapture.js", "stars": 3765, "tags": ["canvas", "webgl", "webgpu", "webcodecs", "motion-blur", "fixed-framerate", "video-export", "gif", "webm", "mp4", "creative-coding", "javascript"], "topics": ["capture", "javascript", "canvas", "video", "webm", "gif", "png", "jpg", "ffmpeg"], "urls": [], "use_cases": ["export a canvas animation as a smooth 60fps video", "record WebGL/WebGPU scenes to MP4 or WebM", "capture creative coding sketches as GIFs", "add motion blur to exported canvas animations", "record animations deterministically at fixed framerate regardless of render performance", "capture 4K frames that render slowly into flawless 60fps video"], "what_it_is": "A JavaScript library that captures canvas-based animations at a fixed framerate by replacing the browser's clock with a virtual one, producing perfectly smooth video exports regardless of render speed. It supports modern encoders (WebCodecs) and formats like MP4, WebM, GIF, PNG, and JPG, with GPU motion blur.", "when_to_avoid": ["you need to capture the whole screen or DOM, not just a canvas", "you need real-time recording of live user interaction rather than deterministic playback", "you need server-side video encoding outside the browser"], "when_to_choose": ["you need deterministic, fixed-framerate video exports from canvas/WebGL animations", "your render loop is slower than real time but you still want smooth output", "you want motion blur and modern encoders like WebCodecs in the browser", "you want minimal code changes to an existing requestAnimationFrame loop"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/ccapturejs", "repo": "spite/ccapture.js", "role": "main", "score": 84}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:08:18.031766+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:28:36.833648+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d5dfaf2dfca6abae437a7b8cadacf5985d4c15984565652f5e1b6789a6a5d80a", "fetched_at": "2026-08-28T04:08:18.031766+00:00", "kind": "readme", "missing": false, "url": "https://github.com/spite/ccapture.js"}, {"content_hash": "8cf19e388c7a7e98070818d4b3955eb08aed319be0cefcd294f6afc58bb53c5c", "fetched_at": "2026-08-29T09:23:01.442261+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccapture.js"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:08:18.031766+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:28:36.833648+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d5dfaf2dfca6abae437a7b8cadacf5985d4c15984565652f5e1b6789a6a5d80a", "fetched_at": "2026-08-28T04:08:18.031766+00:00", "kind": "readme", "missing": false, "url": "https://github.com/spite/ccapture.js"}, {"content_hash": "8cf19e388c7a7e98070818d4b3955eb08aed319be0cefcd294f6afc58bb53c5c", "fetched_at": "2026-08-29T09:23:01.442261+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccapture.js"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:28:36.833648+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d5dfaf2dfca6abae437a7b8cadacf5985d4c15984565652f5e1b6789a6a5d80a", "fetched_at": "2026-08-28T04:08:18.031766+00:00", "kind": "readme", "missing": false, "url": "https://github.com/spite/ccapture.js"}, {"content_hash": "8cf19e388c7a7e98070818d4b3955eb08aed319be0cefcd294f6afc58bb53c5c", "fetched_at": "2026-08-29T09:23:01.442261+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccapture.js"}], "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:08:18.031766+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:08:18.031766+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:08:18.031766+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:28:36.833648+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d5dfaf2dfca6abae437a7b8cadacf5985d4c15984565652f5e1b6789a6a5d80a", "fetched_at": "2026-08-28T04:08:18.031766+00:00", "kind": "readme", "missing": false, "url": "https://github.com/spite/ccapture.js"}, {"content_hash": "8cf19e388c7a7e98070818d4b3955eb08aed319be0cefcd294f6afc58bb53c5c", "fetched_at": "2026-08-29T09:23:01.442261+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccapture.js"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:08:18.031766+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:08:18.031766+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:28:36.833648+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d5dfaf2dfca6abae437a7b8cadacf5985d4c15984565652f5e1b6789a6a5d80a", "fetched_at": "2026-08-28T04:08:18.031766+00:00", "kind": "readme", "missing": false, "url": "https://github.com/spite/ccapture.js"}, {"content_hash": "8cf19e388c7a7e98070818d4b3955eb08aed319be0cefcd294f6afc58bb53c5c", "fetched_at": "2026-08-29T09:23:01.442261+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccapture.js"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:08:18.031766+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:08:18.031766+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:08:18.031766+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:28:36.833648+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d5dfaf2dfca6abae437a7b8cadacf5985d4c15984565652f5e1b6789a6a5d80a", "fetched_at": "2026-08-28T04:08:18.031766+00:00", "kind": "readme", "missing": false, "url": "https://github.com/spite/ccapture.js"}, {"content_hash": "8cf19e388c7a7e98070818d4b3955eb08aed319be0cefcd294f6afc58bb53c5c", "fetched_at": "2026-08-29T09:23:01.442261+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccapture.js"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:08:18.031766+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:08:18.031766+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:28:36.833648+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d5dfaf2dfca6abae437a7b8cadacf5985d4c15984565652f5e1b6789a6a5d80a", "fetched_at": "2026-08-28T04:08:18.031766+00:00", "kind": "readme", "missing": false, "url": "https://github.com/spite/ccapture.js"}, {"content_hash": "8cf19e388c7a7e98070818d4b3955eb08aed319be0cefcd294f6afc58bb53c5c", "fetched_at": "2026-08-29T09:23:01.442261+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccapture.js"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:28:36.833648+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d5dfaf2dfca6abae437a7b8cadacf5985d4c15984565652f5e1b6789a6a5d80a", "fetched_at": "2026-08-28T04:08:18.031766+00:00", "kind": "readme", "missing": false, "url": "https://github.com/spite/ccapture.js"}, {"content_hash": "8cf19e388c7a7e98070818d4b3955eb08aed319be0cefcd294f6afc58bb53c5c", "fetched_at": "2026-08-29T09:23:01.442261+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccapture.js"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:28:36.833648+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d5dfaf2dfca6abae437a7b8cadacf5985d4c15984565652f5e1b6789a6a5d80a", "fetched_at": "2026-08-28T04:08:18.031766+00:00", "kind": "readme", "missing": false, "url": "https://github.com/spite/ccapture.js"}, {"content_hash": "8cf19e388c7a7e98070818d4b3955eb08aed319be0cefcd294f6afc58bb53c5c", "fetched_at": "2026-08-29T09:23:01.442261+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccapture.js"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:28:36.833648+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d5dfaf2dfca6abae437a7b8cadacf5985d4c15984565652f5e1b6789a6a5d80a", "fetched_at": "2026-08-28T04:08:18.031766+00:00", "kind": "readme", "missing": false, "url": "https://github.com/spite/ccapture.js"}, {"content_hash": "8cf19e388c7a7e98070818d4b3955eb08aed319be0cefcd294f6afc58bb53c5c", "fetched_at": "2026-08-29T09:23:01.442261+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccapture.js"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 94, "longevity": 100, "rhythm": 63}, "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": 5112, "days_push": 37, "days_rel": 37, "gap_med": null, "n_releases_24m": 1}, "score": 84, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}