{"adoption": {"forks": 302, "observed_at": "2026-08-28T04:08:34.130769+00:00", "stars": 4070}, "canonical_url": "https://ross.abutalabs.com/products/grimmory", "card": {"archived": false, "artifact_type": "application", "description": "A self-hosted library for your ebooks, comics, and audiobooks", "domain": ["self-hosted", "files", "pdf", "media", "developer-tools"], "enriched": true, "function": ["self-hosted", "search-engine", "file-upload", "web-framework"], "health_score": 100, "homepage": "https://grimmory.org", "language": "Java", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["grimmory-tools/grimmory"], "name": "grimmory-tools/grimmory", "platform": ["self-hosted", "cross-platform"], "pushed_at": "2026-08-25T03:01:10+00:00", "repo": "grimmory-tools/grimmory", "stars": 4070, "tags": ["ebook-library", "comics-reader", "audiobooks", "opds", "kobo-sync", "koreader", "booklore-fork", "kindle-send", "bookdrop", "oidc-auth", "metadata", "docker", "web-server"], "topics": ["angular", "azw3", "cbr", "cbz", "comics", "comics-reader", "documents", "ebooks", "epub", "java", "metadata", "mobi", "oidc", "opds", "pdf", "self-hosted", "spring-boot", "ebooks-reader"], "urls": [], "use_cases": ["self-host my ebook collection with a web reader", "manage and read comics (CBZ/CBR) in the browser", "sync reading progress to my Kobo or KOReader", "serve my library to mobile apps over OPDS", "automatically import new books from a watched folder", "send books to my Kindle via email", "share a library with multiple users and per-user progress", "fetch covers and metadata from Google Books and Open Library"], "what_it_is": "Grimmory is a self-hosted digital library server for ebooks, comics, documents, and audiobooks, deployed via Docker with a web-based interface. It offers metadata enrichment, an in-browser reader, multi-user support with OIDC, OPDS/Kobo/KOReader sync, and automatic import via a watched BookDrop folder.", "when_to_avoid": ["you only need a lightweight Calibre alternative without a server", "you need DRM-protected store books to work", "you cannot run Docker or a MariaDB database", "you need music or video media management rather than books"], "when_to_choose": ["you want a single self-hosted app for ebooks, comics, and audiobooks", "you need OPDS, Kobo, and KOReader integration", "you want multi-user libraries with OIDC authentication", "you prefer automatic metadata lookup and rule-based smart shelves"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/grimmory", "repo": "grimmory-tools/grimmory", "role": "main", "score": 82}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:08:34.130769+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:23:30.501062+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a45db35a3b9ab710999ff020b2d2404d56ed66870aaf44af59b06230e15daa57", "fetched_at": "2026-08-28T04:08:34.130769+00:00", "kind": "readme", "missing": false, "url": "https://github.com/grimmory-tools/grimmory"}, {"content_hash": "4b658ef546d2e0cea3f4aa302458e34e009dcf7706b06c69f72d7e07f3f37a49", "fetched_at": "2026-08-29T09:15:30.706796+00:00", "kind": "homepage", "missing": false, "url": "https://grimmory.org"}, {"content_hash": "e12508028b3213ee4f0ba233e256fdd90019fa534660cb38f38faa509827d02f", "fetched_at": "2026-08-29T09:15:30.715694+00:00", "kind": "site_page", "missing": false, "url": "https://grimmory.org/docs/getting-started"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:08:34.130769+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:23:30.501062+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a45db35a3b9ab710999ff020b2d2404d56ed66870aaf44af59b06230e15daa57", "fetched_at": "2026-08-28T04:08:34.130769+00:00", "kind": "readme", "missing": false, "url": "https://github.com/grimmory-tools/grimmory"}, {"content_hash": "4b658ef546d2e0cea3f4aa302458e34e009dcf7706b06c69f72d7e07f3f37a49", "fetched_at": "2026-08-29T09:15:30.706796+00:00", "kind": "homepage", "missing": false, "url": "https://grimmory.org"}, {"content_hash": "e12508028b3213ee4f0ba233e256fdd90019fa534660cb38f38faa509827d02f", "fetched_at": "2026-08-29T09:15:30.715694+00:00", "kind": "site_page", "missing": false, "url": "https://grimmory.org/docs/getting-started"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:23:30.501062+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a45db35a3b9ab710999ff020b2d2404d56ed66870aaf44af59b06230e15daa57", "fetched_at": "2026-08-28T04:08:34.130769+00:00", "kind": "readme", "missing": false, "url": "https://github.com/grimmory-tools/grimmory"}, {"content_hash": "4b658ef546d2e0cea3f4aa302458e34e009dcf7706b06c69f72d7e07f3f37a49", "fetched_at": "2026-08-29T09:15:30.706796+00:00", "kind": "homepage", "missing": false, "url": "https://grimmory.org"}, {"content_hash": "e12508028b3213ee4f0ba233e256fdd90019fa534660cb38f38faa509827d02f", "fetched_at": "2026-08-29T09:15:30.715694+00:00", "kind": "site_page", "missing": false, "url": "https://grimmory.org/docs/getting-started"}], "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:34.130769+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:08:34.130769+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:08:34.130769+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:23:30.501062+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a45db35a3b9ab710999ff020b2d2404d56ed66870aaf44af59b06230e15daa57", "fetched_at": "2026-08-28T04:08:34.130769+00:00", "kind": "readme", "missing": false, "url": "https://github.com/grimmory-tools/grimmory"}, {"content_hash": "4b658ef546d2e0cea3f4aa302458e34e009dcf7706b06c69f72d7e07f3f37a49", "fetched_at": "2026-08-29T09:15:30.706796+00:00", "kind": "homepage", "missing": false, "url": "https://grimmory.org"}, {"content_hash": "e12508028b3213ee4f0ba233e256fdd90019fa534660cb38f38faa509827d02f", "fetched_at": "2026-08-29T09:15:30.715694+00:00", "kind": "site_page", "missing": false, "url": "https://grimmory.org/docs/getting-started"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:08:34.130769+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:08:34.130769+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:23:30.501062+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a45db35a3b9ab710999ff020b2d2404d56ed66870aaf44af59b06230e15daa57", "fetched_at": "2026-08-28T04:08:34.130769+00:00", "kind": "readme", "missing": false, "url": "https://github.com/grimmory-tools/grimmory"}, {"content_hash": "4b658ef546d2e0cea3f4aa302458e34e009dcf7706b06c69f72d7e07f3f37a49", "fetched_at": "2026-08-29T09:15:30.706796+00:00", "kind": "homepage", "missing": false, "url": "https://grimmory.org"}, {"content_hash": "e12508028b3213ee4f0ba233e256fdd90019fa534660cb38f38faa509827d02f", "fetched_at": "2026-08-29T09:15:30.715694+00:00", "kind": "site_page", "missing": false, "url": "https://grimmory.org/docs/getting-started"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:08:34.130769+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:08:34.130769+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:08:34.130769+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:23:30.501062+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a45db35a3b9ab710999ff020b2d2404d56ed66870aaf44af59b06230e15daa57", "fetched_at": "2026-08-28T04:08:34.130769+00:00", "kind": "readme", "missing": false, "url": "https://github.com/grimmory-tools/grimmory"}, {"content_hash": "4b658ef546d2e0cea3f4aa302458e34e009dcf7706b06c69f72d7e07f3f37a49", "fetched_at": "2026-08-29T09:15:30.706796+00:00", "kind": "homepage", "missing": false, "url": "https://grimmory.org"}, {"content_hash": "e12508028b3213ee4f0ba233e256fdd90019fa534660cb38f38faa509827d02f", "fetched_at": "2026-08-29T09:15:30.715694+00:00", "kind": "site_page", "missing": false, "url": "https://grimmory.org/docs/getting-started"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:08:34.130769+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:08:34.130769+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:23:30.501062+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a45db35a3b9ab710999ff020b2d2404d56ed66870aaf44af59b06230e15daa57", "fetched_at": "2026-08-28T04:08:34.130769+00:00", "kind": "readme", "missing": false, "url": "https://github.com/grimmory-tools/grimmory"}, {"content_hash": "4b658ef546d2e0cea3f4aa302458e34e009dcf7706b06c69f72d7e07f3f37a49", "fetched_at": "2026-08-29T09:15:30.706796+00:00", "kind": "homepage", "missing": false, "url": "https://grimmory.org"}, {"content_hash": "e12508028b3213ee4f0ba233e256fdd90019fa534660cb38f38faa509827d02f", "fetched_at": "2026-08-29T09:15:30.715694+00:00", "kind": "site_page", "missing": false, "url": "https://grimmory.org/docs/getting-started"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:23:30.501062+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a45db35a3b9ab710999ff020b2d2404d56ed66870aaf44af59b06230e15daa57", "fetched_at": "2026-08-28T04:08:34.130769+00:00", "kind": "readme", "missing": false, "url": "https://github.com/grimmory-tools/grimmory"}, {"content_hash": "4b658ef546d2e0cea3f4aa302458e34e009dcf7706b06c69f72d7e07f3f37a49", "fetched_at": "2026-08-29T09:15:30.706796+00:00", "kind": "homepage", "missing": false, "url": "https://grimmory.org"}, {"content_hash": "e12508028b3213ee4f0ba233e256fdd90019fa534660cb38f38faa509827d02f", "fetched_at": "2026-08-29T09:15:30.715694+00:00", "kind": "site_page", "missing": false, "url": "https://grimmory.org/docs/getting-started"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:23:30.501062+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a45db35a3b9ab710999ff020b2d2404d56ed66870aaf44af59b06230e15daa57", "fetched_at": "2026-08-28T04:08:34.130769+00:00", "kind": "readme", "missing": false, "url": "https://github.com/grimmory-tools/grimmory"}, {"content_hash": "4b658ef546d2e0cea3f4aa302458e34e009dcf7706b06c69f72d7e07f3f37a49", "fetched_at": "2026-08-29T09:15:30.706796+00:00", "kind": "homepage", "missing": false, "url": "https://grimmory.org"}, {"content_hash": "e12508028b3213ee4f0ba233e256fdd90019fa534660cb38f38faa509827d02f", "fetched_at": "2026-08-29T09:15:30.715694+00:00", "kind": "site_page", "missing": false, "url": "https://grimmory.org/docs/getting-started"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:23:30.501062+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a45db35a3b9ab710999ff020b2d2404d56ed66870aaf44af59b06230e15daa57", "fetched_at": "2026-08-28T04:08:34.130769+00:00", "kind": "readme", "missing": false, "url": "https://github.com/grimmory-tools/grimmory"}, {"content_hash": "4b658ef546d2e0cea3f4aa302458e34e009dcf7706b06c69f72d7e07f3f37a49", "fetched_at": "2026-08-29T09:15:30.706796+00:00", "kind": "homepage", "missing": false, "url": "https://grimmory.org"}, {"content_hash": "e12508028b3213ee4f0ba233e256fdd90019fa534660cb38f38faa509827d02f", "fetched_at": "2026-08-29T09:15:30.715694+00:00", "kind": "site_page", "missing": false, "url": "https://grimmory.org/docs/getting-started"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 12, "rhythm": 99}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["young"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 174, "days_push": 8, "days_rel": 11, "gap_med": 2.5, "n_releases_24m": 21}, "score": 82, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}