{"adoption": {"forks": 199, "observed_at": "2026-08-28T04:07:41.803946+00:00", "stars": 3078}, "canonical_url": "https://ross.abutalabs.com/products/blotter", "card": {"archived": false, "artifact_type": "library", "description": "A JavaScript API for drawing unconventional text effects on the web.", "domain": ["web-development", "frontend", "graphics"], "enriched": true, "function": ["animation", "graphics", "ui-components"], "health_score": 20, "homepage": "https://blotter.js.org", "language": "JavaScript", "license": "NOASSERTION", "license_family": "other", "maturity": "maintenance", "member_repos": ["bradley/Blotter"], "name": "bradley/Blotter", "platform": ["browser"], "pushed_at": "2020-07-28T12:49:10+00:00", "repo": "bradley/Blotter", "stars": 3078, "tags": ["webgl", "glsl", "typography", "text-effects", "creative-coding", "shaders", "javascript"], "topics": ["webgl", "glsl", "glsl-shaders", "javascript", "typography", "text", "css", "animation", "design", "creative-coding", "lsd"], "urls": [], "use_cases": ["create animated text effects for website headings", "apply GLSL shader effects to titles without writing GLSL", "make playful stylized text graphics for landing pages", "render distorted or liquid text animations in the browser", "build creative typography for design portfolios", "add channel-split or distortion effects to hero text"], "what_it_is": "Blotter is a JavaScript library for rendering unconventional text effects in the browser using GLSL shaders through WebGL, without requiring designers to write shader code. It renders text into canvas elements with a shared WebGL context and texture atlasing for performance.", "when_to_avoid": ["you need selectable or accessible body text - Blotter renders to canvas so text is not selectable", "you need long paragraphs of styled text", "you need a library with active development and recent releases"], "when_to_choose": ["you need eye-catching animated text for titles, headings, or graphic elements", "you want shader-based text effects without GLSL expertise", "you prefer a lightweight library over heavy animation frameworks for typography"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/blotter", "repo": "bradley/Blotter", "role": "main", "score": 32}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.803946+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:27:52.472819+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7ffecb8a550fb588eb86aeda314ca462a479c512bda4c3958199af2b9e6a4a2e", "fetched_at": "2026-08-28T04:07:41.803946+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bradley/Blotter"}, {"content_hash": "b76d5088a052843dc310922a2b596eb649e9475bb65d84b87c79f76ebfba6ea8", "fetched_at": "2026-08-29T09:43:15.443365+00:00", "kind": "homepage", "missing": false, "url": "https://blotter.js.org"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.803946+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:27:52.472819+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7ffecb8a550fb588eb86aeda314ca462a479c512bda4c3958199af2b9e6a4a2e", "fetched_at": "2026-08-28T04:07:41.803946+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bradley/Blotter"}, {"content_hash": "b76d5088a052843dc310922a2b596eb649e9475bb65d84b87c79f76ebfba6ea8", "fetched_at": "2026-08-29T09:43:15.443365+00:00", "kind": "homepage", "missing": false, "url": "https://blotter.js.org"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:27:52.472819+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7ffecb8a550fb588eb86aeda314ca462a479c512bda4c3958199af2b9e6a4a2e", "fetched_at": "2026-08-28T04:07:41.803946+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bradley/Blotter"}, {"content_hash": "b76d5088a052843dc310922a2b596eb649e9475bb65d84b87c79f76ebfba6ea8", "fetched_at": "2026-08-29T09:43:15.443365+00:00", "kind": "homepage", "missing": false, "url": "https://blotter.js.org"}], "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:41.803946+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.803946+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.803946+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:27:52.472819+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7ffecb8a550fb588eb86aeda314ca462a479c512bda4c3958199af2b9e6a4a2e", "fetched_at": "2026-08-28T04:07:41.803946+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bradley/Blotter"}, {"content_hash": "b76d5088a052843dc310922a2b596eb649e9475bb65d84b87c79f76ebfba6ea8", "fetched_at": "2026-08-29T09:43:15.443365+00:00", "kind": "homepage", "missing": false, "url": "https://blotter.js.org"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.803946+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.803946+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:27:52.472819+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7ffecb8a550fb588eb86aeda314ca462a479c512bda4c3958199af2b9e6a4a2e", "fetched_at": "2026-08-28T04:07:41.803946+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bradley/Blotter"}, {"content_hash": "b76d5088a052843dc310922a2b596eb649e9475bb65d84b87c79f76ebfba6ea8", "fetched_at": "2026-08-29T09:43:15.443365+00:00", "kind": "homepage", "missing": false, "url": "https://blotter.js.org"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.803946+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.803946+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.803946+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:27:52.472819+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7ffecb8a550fb588eb86aeda314ca462a479c512bda4c3958199af2b9e6a4a2e", "fetched_at": "2026-08-28T04:07:41.803946+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bradley/Blotter"}, {"content_hash": "b76d5088a052843dc310922a2b596eb649e9475bb65d84b87c79f76ebfba6ea8", "fetched_at": "2026-08-29T09:43:15.443365+00:00", "kind": "homepage", "missing": false, "url": "https://blotter.js.org"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.803946+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:41.803946+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:27:52.472819+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7ffecb8a550fb588eb86aeda314ca462a479c512bda4c3958199af2b9e6a4a2e", "fetched_at": "2026-08-28T04:07:41.803946+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bradley/Blotter"}, {"content_hash": "b76d5088a052843dc310922a2b596eb649e9475bb65d84b87c79f76ebfba6ea8", "fetched_at": "2026-08-29T09:43:15.443365+00:00", "kind": "homepage", "missing": false, "url": "https://blotter.js.org"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:27:52.472819+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7ffecb8a550fb588eb86aeda314ca462a479c512bda4c3958199af2b9e6a4a2e", "fetched_at": "2026-08-28T04:07:41.803946+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bradley/Blotter"}, {"content_hash": "b76d5088a052843dc310922a2b596eb649e9475bb65d84b87c79f76ebfba6ea8", "fetched_at": "2026-08-29T09:43:15.443365+00:00", "kind": "homepage", "missing": false, "url": "https://blotter.js.org"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:27:52.472819+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7ffecb8a550fb588eb86aeda314ca462a479c512bda4c3958199af2b9e6a4a2e", "fetched_at": "2026-08-28T04:07:41.803946+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bradley/Blotter"}, {"content_hash": "b76d5088a052843dc310922a2b596eb649e9475bb65d84b87c79f76ebfba6ea8", "fetched_at": "2026-08-29T09:43:15.443365+00:00", "kind": "homepage", "missing": false, "url": "https://blotter.js.org"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:27:52.472819+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7ffecb8a550fb588eb86aeda314ca462a479c512bda4c3958199af2b9e6a4a2e", "fetched_at": "2026-08-28T04:07:41.803946+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bradley/Blotter"}, {"content_hash": "b76d5088a052843dc310922a2b596eb649e9475bb65d84b87c79f76ebfba6ea8", "fetched_at": "2026-08-29T09:43:15.443365+00:00", "kind": "homepage", "missing": false, "url": "https://blotter.js.org"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases", "no_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 3845, "days_push": 2227, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 32, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}