{"adoption": {"forks": 719, "observed_at": "2026-08-28T04:10:23.071080+00:00", "stars": 8481}, "canonical_url": "https://ross.abutalabs.com/products/tether", "card": {"archived": false, "artifact_type": "library", "description": " A positioning engine to make overlays, tooltips and dropdowns better", "domain": ["frontend", "web-development"], "enriched": true, "function": ["ui-components", "frontend-framework"], "health_score": 75, "homepage": "https://tetherjs.dev/docs/welcome", "language": "JavaScript", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["shipshapecode/tether"], "name": "shipshapecode/tether", "platform": ["browser"], "pushed_at": "2026-02-02T11:11:28+00:00", "repo": "shipshapecode/tether", "stars": 8481, "tags": ["positioning-engine", "tooltips", "dropdowns", "popovers", "dom-manipulation", "javascript"], "topics": ["javascript", "position", "tooltips", "hacktoberfest"], "urls": [], "use_cases": ["position tooltips next to elements", "build dropdown menus that stay attached to buttons", "keep popovers visible inside scrollable containers", "prevent overlays from being clipped by the viewport", "position autocomplete suggestions under an input", "build guided product tours with anchored steps"], "what_it_is": "Tether is a small client-side JavaScript library that positions absolutely positioned UI elements (tooltips, dropdowns, popovers) next to target elements on a page. It tracks target movement and handles constraints, flipping, and repositioning on scroll, resize, and other events.", "when_to_avoid": ["you want a full-featured tooltip or dropdown component with styling out of the box", "you're using a modern CSS-only or framework-native solution that covers your needs", "you need to support legacy browsers older than IE10"], "when_to_choose": ["you need precise element-to-element positioning with viewport and scroll-parent constraints", "you want a tiny (~5kb) dependency-free positioning engine", "you're building tooltips, dropdowns, or popovers from scratch", "you need high-performance positioning with many tethered elements"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/tether", "repo": "shipshapecode/tether", "role": "main", "score": 70}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:10:23.071080+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T17:27:08.996293+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "730c41718d1b3bc93146eba318b346075675293242b496fc20b545f31a05ad36", "fetched_at": "2026-08-28T04:10:23.071080+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shipshapecode/tether"}, {"content_hash": "4e94a589f26acef4fd217fc02e9ab016d24b2eae9ae714ea6d0328f806afee8d", "fetched_at": "2026-08-29T08:27:13.393305+00:00", "kind": "homepage", "missing": false, "url": "https://tetherjs.dev/docs/welcome"}, {"content_hash": "a1ef02af36ff8b61f3d46f53a28c9367fb6868cec6b30361cbb573891a00a6c9", "fetched_at": "2026-08-29T08:27:13.397978+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/tether"}, {"content_hash": "02d7cc907987d09bab99ed44cdeb1c92ea4aeeabce0ef55f1c9c2383d38b86dd", "fetched_at": "2026-08-29T08:27:13.395757+00:00", "kind": "site_page", "missing": false, "url": "https://tetherjs.dev/"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:10:23.071080+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T17:27:08.996293+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "730c41718d1b3bc93146eba318b346075675293242b496fc20b545f31a05ad36", "fetched_at": "2026-08-28T04:10:23.071080+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shipshapecode/tether"}, {"content_hash": "4e94a589f26acef4fd217fc02e9ab016d24b2eae9ae714ea6d0328f806afee8d", "fetched_at": "2026-08-29T08:27:13.393305+00:00", "kind": "homepage", "missing": false, "url": "https://tetherjs.dev/docs/welcome"}, {"content_hash": "a1ef02af36ff8b61f3d46f53a28c9367fb6868cec6b30361cbb573891a00a6c9", "fetched_at": "2026-08-29T08:27:13.397978+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/tether"}, {"content_hash": "02d7cc907987d09bab99ed44cdeb1c92ea4aeeabce0ef55f1c9c2383d38b86dd", "fetched_at": "2026-08-29T08:27:13.395757+00:00", "kind": "site_page", "missing": false, "url": "https://tetherjs.dev/"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T17:27:08.996293+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "730c41718d1b3bc93146eba318b346075675293242b496fc20b545f31a05ad36", "fetched_at": "2026-08-28T04:10:23.071080+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shipshapecode/tether"}, {"content_hash": "4e94a589f26acef4fd217fc02e9ab016d24b2eae9ae714ea6d0328f806afee8d", "fetched_at": "2026-08-29T08:27:13.393305+00:00", "kind": "homepage", "missing": false, "url": "https://tetherjs.dev/docs/welcome"}, {"content_hash": "a1ef02af36ff8b61f3d46f53a28c9367fb6868cec6b30361cbb573891a00a6c9", "fetched_at": "2026-08-29T08:27:13.397978+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/tether"}, {"content_hash": "02d7cc907987d09bab99ed44cdeb1c92ea4aeeabce0ef55f1c9c2383d38b86dd", "fetched_at": "2026-08-29T08:27:13.395757+00:00", "kind": "site_page", "missing": false, "url": "https://tetherjs.dev/"}], "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:10:23.071080+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:10:23.071080+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:10:23.071080+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T17:27:08.996293+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "730c41718d1b3bc93146eba318b346075675293242b496fc20b545f31a05ad36", "fetched_at": "2026-08-28T04:10:23.071080+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shipshapecode/tether"}, {"content_hash": "4e94a589f26acef4fd217fc02e9ab016d24b2eae9ae714ea6d0328f806afee8d", "fetched_at": "2026-08-29T08:27:13.393305+00:00", "kind": "homepage", "missing": false, "url": "https://tetherjs.dev/docs/welcome"}, {"content_hash": "a1ef02af36ff8b61f3d46f53a28c9367fb6868cec6b30361cbb573891a00a6c9", "fetched_at": "2026-08-29T08:27:13.397978+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/tether"}, {"content_hash": "02d7cc907987d09bab99ed44cdeb1c92ea4aeeabce0ef55f1c9c2383d38b86dd", "fetched_at": "2026-08-29T08:27:13.395757+00:00", "kind": "site_page", "missing": false, "url": "https://tetherjs.dev/"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:10:23.071080+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:10:23.071080+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T17:27:08.996293+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "730c41718d1b3bc93146eba318b346075675293242b496fc20b545f31a05ad36", "fetched_at": "2026-08-28T04:10:23.071080+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shipshapecode/tether"}, {"content_hash": "4e94a589f26acef4fd217fc02e9ab016d24b2eae9ae714ea6d0328f806afee8d", "fetched_at": "2026-08-29T08:27:13.393305+00:00", "kind": "homepage", "missing": false, "url": "https://tetherjs.dev/docs/welcome"}, {"content_hash": "a1ef02af36ff8b61f3d46f53a28c9367fb6868cec6b30361cbb573891a00a6c9", "fetched_at": "2026-08-29T08:27:13.397978+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/tether"}, {"content_hash": "02d7cc907987d09bab99ed44cdeb1c92ea4aeeabce0ef55f1c9c2383d38b86dd", "fetched_at": "2026-08-29T08:27:13.395757+00:00", "kind": "site_page", "missing": false, "url": "https://tetherjs.dev/"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:10:23.071080+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:10:23.071080+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:10:23.071080+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T17:27:08.996293+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "730c41718d1b3bc93146eba318b346075675293242b496fc20b545f31a05ad36", "fetched_at": "2026-08-28T04:10:23.071080+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shipshapecode/tether"}, {"content_hash": "4e94a589f26acef4fd217fc02e9ab016d24b2eae9ae714ea6d0328f806afee8d", "fetched_at": "2026-08-29T08:27:13.393305+00:00", "kind": "homepage", "missing": false, "url": "https://tetherjs.dev/docs/welcome"}, {"content_hash": "a1ef02af36ff8b61f3d46f53a28c9367fb6868cec6b30361cbb573891a00a6c9", "fetched_at": "2026-08-29T08:27:13.397978+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/tether"}, {"content_hash": "02d7cc907987d09bab99ed44cdeb1c92ea4aeeabce0ef55f1c9c2383d38b86dd", "fetched_at": "2026-08-29T08:27:13.395757+00:00", "kind": "site_page", "missing": false, "url": "https://tetherjs.dev/"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:10:23.071080+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:10:23.071080+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T17:27:08.996293+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "730c41718d1b3bc93146eba318b346075675293242b496fc20b545f31a05ad36", "fetched_at": "2026-08-28T04:10:23.071080+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shipshapecode/tether"}, {"content_hash": "4e94a589f26acef4fd217fc02e9ab016d24b2eae9ae714ea6d0328f806afee8d", "fetched_at": "2026-08-29T08:27:13.393305+00:00", "kind": "homepage", "missing": false, "url": "https://tetherjs.dev/docs/welcome"}, {"content_hash": "a1ef02af36ff8b61f3d46f53a28c9367fb6868cec6b30361cbb573891a00a6c9", "fetched_at": "2026-08-29T08:27:13.397978+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/tether"}, {"content_hash": "02d7cc907987d09bab99ed44cdeb1c92ea4aeeabce0ef55f1c9c2383d38b86dd", "fetched_at": "2026-08-29T08:27:13.395757+00:00", "kind": "site_page", "missing": false, "url": "https://tetherjs.dev/"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T17:27:08.996293+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "730c41718d1b3bc93146eba318b346075675293242b496fc20b545f31a05ad36", "fetched_at": "2026-08-28T04:10:23.071080+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shipshapecode/tether"}, {"content_hash": "4e94a589f26acef4fd217fc02e9ab016d24b2eae9ae714ea6d0328f806afee8d", "fetched_at": "2026-08-29T08:27:13.393305+00:00", "kind": "homepage", "missing": false, "url": "https://tetherjs.dev/docs/welcome"}, {"content_hash": "a1ef02af36ff8b61f3d46f53a28c9367fb6868cec6b30361cbb573891a00a6c9", "fetched_at": "2026-08-29T08:27:13.397978+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/tether"}, {"content_hash": "02d7cc907987d09bab99ed44cdeb1c92ea4aeeabce0ef55f1c9c2383d38b86dd", "fetched_at": "2026-08-29T08:27:13.395757+00:00", "kind": "site_page", "missing": false, "url": "https://tetherjs.dev/"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T17:27:08.996293+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "730c41718d1b3bc93146eba318b346075675293242b496fc20b545f31a05ad36", "fetched_at": "2026-08-28T04:10:23.071080+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shipshapecode/tether"}, {"content_hash": "4e94a589f26acef4fd217fc02e9ab016d24b2eae9ae714ea6d0328f806afee8d", "fetched_at": "2026-08-29T08:27:13.393305+00:00", "kind": "homepage", "missing": false, "url": "https://tetherjs.dev/docs/welcome"}, {"content_hash": "a1ef02af36ff8b61f3d46f53a28c9367fb6868cec6b30361cbb573891a00a6c9", "fetched_at": "2026-08-29T08:27:13.397978+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/tether"}, {"content_hash": "02d7cc907987d09bab99ed44cdeb1c92ea4aeeabce0ef55f1c9c2383d38b86dd", "fetched_at": "2026-08-29T08:27:13.395757+00:00", "kind": "site_page", "missing": false, "url": "https://tetherjs.dev/"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T17:27:08.996293+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "730c41718d1b3bc93146eba318b346075675293242b496fc20b545f31a05ad36", "fetched_at": "2026-08-28T04:10:23.071080+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shipshapecode/tether"}, {"content_hash": "4e94a589f26acef4fd217fc02e9ab016d24b2eae9ae714ea6d0328f806afee8d", "fetched_at": "2026-08-29T08:27:13.393305+00:00", "kind": "homepage", "missing": false, "url": "https://tetherjs.dev/docs/welcome"}, {"content_hash": "a1ef02af36ff8b61f3d46f53a28c9367fb6868cec6b30361cbb573891a00a6c9", "fetched_at": "2026-08-29T08:27:13.397978+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/tether"}, {"content_hash": "02d7cc907987d09bab99ed44cdeb1c92ea4aeeabce0ef55f1c9c2383d38b86dd", "fetched_at": "2026-08-29T08:27:13.395757+00:00", "kind": "site_page", "missing": false, "url": "https://tetherjs.dev/"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 65, "longevity": 100, "rhythm": 60}, "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": 4705, "days_push": 212, "days_rel": 269, "gap_med": 0.5, "n_releases_24m": 3}, "score": 70, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}