{"adoption": {"forks": 125, "observed_at": "2026-08-28T04:08:09.924085+00:00", "stars": 3564}, "canonical_url": "https://ross.abutalabs.com/products/ryot", "card": {"archived": false, "artifact_type": "application", "description": "Roll your own tracker!", "domain": ["self-hosted", "developer-tools", "media", "sports", "analytics"], "enriched": true, "function": ["self-hosted", "analytics", "data-visualization", "webhook", "sdk"], "health_score": 99, "homepage": "https://ryot.io", "language": "TypeScript", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["IgnisDa/ryot"], "name": "IgnisDa/ryot", "platform": ["self-hosted", "cross-platform"], "pushed_at": "2026-08-23T17:22:06+00:00", "repo": "IgnisDa/ryot", "stars": 3564, "tags": ["media-tracker", "fitness-tracker", "workout-logging", "life-tracking", "integrations", "docker-compose", "freemium", "docker", "web-server"], "topics": ["exercise-tracker", "media-tracking", "tracker", "integrations", "fitness-tracker"], "urls": [], "use_cases": ["self-hosted media tracker for movies and shows", "track books I read and games I play", "log workouts and body measurements", "import my Goodreads and Trakt history", "automatically track what I watch on Plex or Jellyfin", "replace spreadsheets for personal tracking", "track anime and manga progress"], "what_it_is": "Ryot (Roll Your Own Tracker) is a self-hosted web application for tracking media consumption (movies, shows, books, games, anime, podcasts, music) and fitness activities in one place. It supports imports from services like Goodreads and Trakt, automatic tracking via Jellyfin/Plex integrations, workout logging, and statistics dashboards, with a paid Pro tier.", "when_to_avoid": ["you need a dedicated, deep-featured fitness app only", "you want a managed cloud service without self-hosting", "you need multi-user social tracking at scale like Trakt or Letterboxd"], "when_to_choose": ["you want a single self-hosted dashboard for media and fitness tracking", "you need imports from Goodreads, Trakt, MyAnimeList, or Audiobookshelf", "you want automatic media tracking via Plex, Jellyfin, Kodi, or Emby", "you care about owning your personal tracking data"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/ryot", "repo": "IgnisDa/ryot", "role": "main", "score": 97}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:08:09.924085+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:34:11.035002+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8526de1f47914c3d860ba3b9656c127090b22f82e465a1ff04e96254bf07da79", "fetched_at": "2026-08-28T04:08:09.924085+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IgnisDa/ryot"}, {"content_hash": "be1a2512730a7a7372bb092069e2405962d96917688a6d7b9682f67a3239028b", "fetched_at": "2026-08-29T09:28:13.431003+00:00", "kind": "homepage", "missing": false, "url": "https://ryot.io"}, {"content_hash": "e9caf6efb8c8016adaa7a467a4b02a874f4368fd4a3543372e809cdb6d190b42", "fetched_at": "2026-08-29T09:28:13.433655+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/features"}, {"content_hash": "363ec065489ec39145245daf080380374080142b2f5876aebb20ee7aa4635109", "fetched_at": "2026-08-29T09:28:13.435565+00:00", "kind": "site_page", "missing": false, "url": "https://docs.ryot.io"}, {"content_hash": "a120231c2fb8fa6c4c12779043c32e920918d01e56f3c34286d5477c2b8736a3", "fetched_at": "2026-08-29T09:28:13.437211+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/pricing-promise"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:08:09.924085+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:34:11.035002+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8526de1f47914c3d860ba3b9656c127090b22f82e465a1ff04e96254bf07da79", "fetched_at": "2026-08-28T04:08:09.924085+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IgnisDa/ryot"}, {"content_hash": "be1a2512730a7a7372bb092069e2405962d96917688a6d7b9682f67a3239028b", "fetched_at": "2026-08-29T09:28:13.431003+00:00", "kind": "homepage", "missing": false, "url": "https://ryot.io"}, {"content_hash": "e9caf6efb8c8016adaa7a467a4b02a874f4368fd4a3543372e809cdb6d190b42", "fetched_at": "2026-08-29T09:28:13.433655+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/features"}, {"content_hash": "363ec065489ec39145245daf080380374080142b2f5876aebb20ee7aa4635109", "fetched_at": "2026-08-29T09:28:13.435565+00:00", "kind": "site_page", "missing": false, "url": "https://docs.ryot.io"}, {"content_hash": "a120231c2fb8fa6c4c12779043c32e920918d01e56f3c34286d5477c2b8736a3", "fetched_at": "2026-08-29T09:28:13.437211+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/pricing-promise"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:34:11.035002+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8526de1f47914c3d860ba3b9656c127090b22f82e465a1ff04e96254bf07da79", "fetched_at": "2026-08-28T04:08:09.924085+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IgnisDa/ryot"}, {"content_hash": "be1a2512730a7a7372bb092069e2405962d96917688a6d7b9682f67a3239028b", "fetched_at": "2026-08-29T09:28:13.431003+00:00", "kind": "homepage", "missing": false, "url": "https://ryot.io"}, {"content_hash": "e9caf6efb8c8016adaa7a467a4b02a874f4368fd4a3543372e809cdb6d190b42", "fetched_at": "2026-08-29T09:28:13.433655+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/features"}, {"content_hash": "363ec065489ec39145245daf080380374080142b2f5876aebb20ee7aa4635109", "fetched_at": "2026-08-29T09:28:13.435565+00:00", "kind": "site_page", "missing": false, "url": "https://docs.ryot.io"}, {"content_hash": "a120231c2fb8fa6c4c12779043c32e920918d01e56f3c34286d5477c2b8736a3", "fetched_at": "2026-08-29T09:28:13.437211+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/pricing-promise"}], "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:09.924085+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:08:09.924085+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:08:09.924085+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:34:11.035002+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8526de1f47914c3d860ba3b9656c127090b22f82e465a1ff04e96254bf07da79", "fetched_at": "2026-08-28T04:08:09.924085+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IgnisDa/ryot"}, {"content_hash": "be1a2512730a7a7372bb092069e2405962d96917688a6d7b9682f67a3239028b", "fetched_at": "2026-08-29T09:28:13.431003+00:00", "kind": "homepage", "missing": false, "url": "https://ryot.io"}, {"content_hash": "e9caf6efb8c8016adaa7a467a4b02a874f4368fd4a3543372e809cdb6d190b42", "fetched_at": "2026-08-29T09:28:13.433655+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/features"}, {"content_hash": "363ec065489ec39145245daf080380374080142b2f5876aebb20ee7aa4635109", "fetched_at": "2026-08-29T09:28:13.435565+00:00", "kind": "site_page", "missing": false, "url": "https://docs.ryot.io"}, {"content_hash": "a120231c2fb8fa6c4c12779043c32e920918d01e56f3c34286d5477c2b8736a3", "fetched_at": "2026-08-29T09:28:13.437211+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/pricing-promise"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:08:09.924085+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:08:09.924085+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:34:11.035002+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8526de1f47914c3d860ba3b9656c127090b22f82e465a1ff04e96254bf07da79", "fetched_at": "2026-08-28T04:08:09.924085+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IgnisDa/ryot"}, {"content_hash": "be1a2512730a7a7372bb092069e2405962d96917688a6d7b9682f67a3239028b", "fetched_at": "2026-08-29T09:28:13.431003+00:00", "kind": "homepage", "missing": false, "url": "https://ryot.io"}, {"content_hash": "e9caf6efb8c8016adaa7a467a4b02a874f4368fd4a3543372e809cdb6d190b42", "fetched_at": "2026-08-29T09:28:13.433655+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/features"}, {"content_hash": "363ec065489ec39145245daf080380374080142b2f5876aebb20ee7aa4635109", "fetched_at": "2026-08-29T09:28:13.435565+00:00", "kind": "site_page", "missing": false, "url": "https://docs.ryot.io"}, {"content_hash": "a120231c2fb8fa6c4c12779043c32e920918d01e56f3c34286d5477c2b8736a3", "fetched_at": "2026-08-29T09:28:13.437211+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/pricing-promise"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:08:09.924085+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:08:09.924085+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:08:09.924085+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:34:11.035002+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8526de1f47914c3d860ba3b9656c127090b22f82e465a1ff04e96254bf07da79", "fetched_at": "2026-08-28T04:08:09.924085+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IgnisDa/ryot"}, {"content_hash": "be1a2512730a7a7372bb092069e2405962d96917688a6d7b9682f67a3239028b", "fetched_at": "2026-08-29T09:28:13.431003+00:00", "kind": "homepage", "missing": false, "url": "https://ryot.io"}, {"content_hash": "e9caf6efb8c8016adaa7a467a4b02a874f4368fd4a3543372e809cdb6d190b42", "fetched_at": "2026-08-29T09:28:13.433655+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/features"}, {"content_hash": "363ec065489ec39145245daf080380374080142b2f5876aebb20ee7aa4635109", "fetched_at": "2026-08-29T09:28:13.435565+00:00", "kind": "site_page", "missing": false, "url": "https://docs.ryot.io"}, {"content_hash": "a120231c2fb8fa6c4c12779043c32e920918d01e56f3c34286d5477c2b8736a3", "fetched_at": "2026-08-29T09:28:13.437211+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/pricing-promise"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:08:09.924085+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:08:09.924085+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:34:11.035002+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8526de1f47914c3d860ba3b9656c127090b22f82e465a1ff04e96254bf07da79", "fetched_at": "2026-08-28T04:08:09.924085+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IgnisDa/ryot"}, {"content_hash": "be1a2512730a7a7372bb092069e2405962d96917688a6d7b9682f67a3239028b", "fetched_at": "2026-08-29T09:28:13.431003+00:00", "kind": "homepage", "missing": false, "url": "https://ryot.io"}, {"content_hash": "e9caf6efb8c8016adaa7a467a4b02a874f4368fd4a3543372e809cdb6d190b42", "fetched_at": "2026-08-29T09:28:13.433655+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/features"}, {"content_hash": "363ec065489ec39145245daf080380374080142b2f5876aebb20ee7aa4635109", "fetched_at": "2026-08-29T09:28:13.435565+00:00", "kind": "site_page", "missing": false, "url": "https://docs.ryot.io"}, {"content_hash": "a120231c2fb8fa6c4c12779043c32e920918d01e56f3c34286d5477c2b8736a3", "fetched_at": "2026-08-29T09:28:13.437211+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/pricing-promise"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:34:11.035002+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8526de1f47914c3d860ba3b9656c127090b22f82e465a1ff04e96254bf07da79", "fetched_at": "2026-08-28T04:08:09.924085+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IgnisDa/ryot"}, {"content_hash": "be1a2512730a7a7372bb092069e2405962d96917688a6d7b9682f67a3239028b", "fetched_at": "2026-08-29T09:28:13.431003+00:00", "kind": "homepage", "missing": false, "url": "https://ryot.io"}, {"content_hash": "e9caf6efb8c8016adaa7a467a4b02a874f4368fd4a3543372e809cdb6d190b42", "fetched_at": "2026-08-29T09:28:13.433655+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/features"}, {"content_hash": "363ec065489ec39145245daf080380374080142b2f5876aebb20ee7aa4635109", "fetched_at": "2026-08-29T09:28:13.435565+00:00", "kind": "site_page", "missing": false, "url": "https://docs.ryot.io"}, {"content_hash": "a120231c2fb8fa6c4c12779043c32e920918d01e56f3c34286d5477c2b8736a3", "fetched_at": "2026-08-29T09:28:13.437211+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/pricing-promise"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:34:11.035002+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8526de1f47914c3d860ba3b9656c127090b22f82e465a1ff04e96254bf07da79", "fetched_at": "2026-08-28T04:08:09.924085+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IgnisDa/ryot"}, {"content_hash": "be1a2512730a7a7372bb092069e2405962d96917688a6d7b9682f67a3239028b", "fetched_at": "2026-08-29T09:28:13.431003+00:00", "kind": "homepage", "missing": false, "url": "https://ryot.io"}, {"content_hash": "e9caf6efb8c8016adaa7a467a4b02a874f4368fd4a3543372e809cdb6d190b42", "fetched_at": "2026-08-29T09:28:13.433655+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/features"}, {"content_hash": "363ec065489ec39145245daf080380374080142b2f5876aebb20ee7aa4635109", "fetched_at": "2026-08-29T09:28:13.435565+00:00", "kind": "site_page", "missing": false, "url": "https://docs.ryot.io"}, {"content_hash": "a120231c2fb8fa6c4c12779043c32e920918d01e56f3c34286d5477c2b8736a3", "fetched_at": "2026-08-29T09:28:13.437211+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/pricing-promise"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:34:11.035002+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8526de1f47914c3d860ba3b9656c127090b22f82e465a1ff04e96254bf07da79", "fetched_at": "2026-08-28T04:08:09.924085+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IgnisDa/ryot"}, {"content_hash": "be1a2512730a7a7372bb092069e2405962d96917688a6d7b9682f67a3239028b", "fetched_at": "2026-08-29T09:28:13.431003+00:00", "kind": "homepage", "missing": false, "url": "https://ryot.io"}, {"content_hash": "e9caf6efb8c8016adaa7a467a4b02a874f4368fd4a3543372e809cdb6d190b42", "fetched_at": "2026-08-29T09:28:13.433655+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/features"}, {"content_hash": "363ec065489ec39145245daf080380374080142b2f5876aebb20ee7aa4635109", "fetched_at": "2026-08-29T09:28:13.435565+00:00", "kind": "site_page", "missing": false, "url": "https://docs.ryot.io"}, {"content_hash": "a120231c2fb8fa6c4c12779043c32e920918d01e56f3c34286d5477c2b8736a3", "fetched_at": "2026-08-29T09:28:13.437211+00:00", "kind": "site_page", "missing": false, "url": "https://ryot.io/pricing-promise"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 89, "rhythm": 99}, "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": 1248, "days_push": 10, "days_rel": 11, "gap_med": 12.5, "n_releases_24m": 39}, "score": 97, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}