{"adoption": {"forks": 62, "observed_at": "2026-08-28T04:05:06.185994+00:00", "stars": 1577}, "canonical_url": "https://ross.abutalabs.com/products/typical", "card": {"archived": false, "artifact_type": "library", "description": "Animated typing in ~400 bytes 🐡 of JavaScript", "domain": ["frontend", "web-development"], "enriched": true, "function": ["animation"], "health_score": 62, "homepage": null, "language": "JavaScript", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["camwiegert/typical"], "name": "camwiegert/typical", "platform": ["browser"], "pushed_at": "2026-03-02T13:56:51+00:00", "repo": "camwiegert/typical", "stars": 1577, "tags": ["typewriter-effect", "zero-dependency", "text-animation", "micro-library", "es-modules", "nodejs"], "topics": ["javascript", "module", "typing", "animation"], "urls": [], "use_cases": ["animate typing text on a landing page hero", "create a typewriter effect for a tagline", "loop through rotating text phrases on a website", "add animated typing to a portfolio site", "simulate a terminal typing effect in the browser", "type and delete text with minimal JavaScript"], "what_it_is": "A tiny (~400 bytes) zero-dependency JavaScript module for animating typewriter-style text effects in the browser. It exposes a single `type` function that accepts a target element and a sequence of steps (strings to type, pauses, callbacks, or Promises) with features like smart delete, looping, and humanized typing speed.", "when_to_avoid": ["you need rich text animation features like cursors, syntax highlighting, or scroll-triggered effects", "you are animating non-text UI elements", "you prefer a declarative React/Vue component over an imperative DOM function", "you need accessibility features like reduced-motion support out of the box"], "when_to_choose": ["you need a lightweight typewriter effect with zero dependencies", "you want fine control over typing steps, pauses, and looping", "bundle size matters and full animation libraries are overkill", "you need to wait on Promises or run custom logic between typing steps"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/typical", "repo": "camwiegert/typical", "role": "main", "score": 54}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:06.185994+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:57:02.495399+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a1e91fa8024dabed7cfe6635a5a5d36f8fae30b8b56e5c19be0c38feec3065ad", "fetched_at": "2026-08-28T04:05:06.185994+00:00", "kind": "readme", "missing": false, "url": "https://github.com/camwiegert/typical"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:06.185994+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:57:02.495399+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a1e91fa8024dabed7cfe6635a5a5d36f8fae30b8b56e5c19be0c38feec3065ad", "fetched_at": "2026-08-28T04:05:06.185994+00:00", "kind": "readme", "missing": false, "url": "https://github.com/camwiegert/typical"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:57:02.495399+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a1e91fa8024dabed7cfe6635a5a5d36f8fae30b8b56e5c19be0c38feec3065ad", "fetched_at": "2026-08-28T04:05:06.185994+00:00", "kind": "readme", "missing": false, "url": "https://github.com/camwiegert/typical"}], "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:05:06.185994+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:06.185994+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:06.185994+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:57:02.495399+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a1e91fa8024dabed7cfe6635a5a5d36f8fae30b8b56e5c19be0c38feec3065ad", "fetched_at": "2026-08-28T04:05:06.185994+00:00", "kind": "readme", "missing": false, "url": "https://github.com/camwiegert/typical"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:06.185994+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:06.185994+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:57:02.495399+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a1e91fa8024dabed7cfe6635a5a5d36f8fae30b8b56e5c19be0c38feec3065ad", "fetched_at": "2026-08-28T04:05:06.185994+00:00", "kind": "readme", "missing": false, "url": "https://github.com/camwiegert/typical"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:06.185994+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:06.185994+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:06.185994+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:57:02.495399+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a1e91fa8024dabed7cfe6635a5a5d36f8fae30b8b56e5c19be0c38feec3065ad", "fetched_at": "2026-08-28T04:05:06.185994+00:00", "kind": "readme", "missing": false, "url": "https://github.com/camwiegert/typical"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:06.185994+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:06.185994+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:57:02.495399+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a1e91fa8024dabed7cfe6635a5a5d36f8fae30b8b56e5c19be0c38feec3065ad", "fetched_at": "2026-08-28T04:05:06.185994+00:00", "kind": "readme", "missing": false, "url": "https://github.com/camwiegert/typical"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:57:02.495399+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a1e91fa8024dabed7cfe6635a5a5d36f8fae30b8b56e5c19be0c38feec3065ad", "fetched_at": "2026-08-28T04:05:06.185994+00:00", "kind": "readme", "missing": false, "url": "https://github.com/camwiegert/typical"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:57:02.495399+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a1e91fa8024dabed7cfe6635a5a5d36f8fae30b8b56e5c19be0c38feec3065ad", "fetched_at": "2026-08-28T04:05:06.185994+00:00", "kind": "readme", "missing": false, "url": "https://github.com/camwiegert/typical"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:57:02.495399+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a1e91fa8024dabed7cfe6635a5a5d36f8fae30b8b56e5c19be0c38feec3065ad", "fetched_at": "2026-08-28T04:05:06.185994+00:00", "kind": "readme", "missing": false, "url": "https://github.com/camwiegert/typical"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 70, "longevity": 100, "rhythm": 8}, "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": 2532, "days_push": 184, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 54, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}