JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 188,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 161279
},
"pushed_at": "2026-07-27T16:30:20Z",
"created_at": "2026-07-20T01:06:02Z",
"owner_type": "Organization",
"updated_at": "2026-07-27T16:31:06Z",
"description": "Stremio addon-source module for the Mosaic platform — a Go client of the Stremio addon protocol, built against the Mosaic SDK.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": null,
"name": "Mosaic",
"type": "Organization",
"login": "mosaic-media",
"company": null,
"location": null,
"followers": 0,
"avatar_url": "https://avatars.githubusercontent.com/u/304150337?v=4",
"created_at": "2026-07-12T20:17:48Z",
"is_verified": null,
"public_repos": 16,
"account_age_days": 15
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.30.0",
"kind": "minor",
"published_at": "2026-07-27T16:31:38Z"
},
{
"tag": "v0.29.0",
"kind": "minor",
"published_at": "2026-07-27T03:02:24Z"
},
{
"tag": "v0.28.0",
"kind": "minor",
"published_at": "2026-07-26T15:39:00Z"
},
{
"tag": "v0.27.0",
"kind": "minor",
"published_at": "2026-07-26T15:03:40Z"
},
{
"tag": "v0.26.0",
"kind": "minor",
"published_at": "2026-07-25T05:06:47Z"
},
{
"tag": "v0.25.2",
"kind": "patch",
"published_at": "2026-07-24T23:48:42Z"
},
{
"tag": "v0.25.1",
"kind": "patch",
"published_at": "2026-07-24T23:42:35Z"
},
{
"tag": "v0.25.0",
"kind": "minor",
"published_at": "2026-07-24T23:12:48Z"
},
{
"tag": "v0.24.0",
"kind": "minor",
"published_at": "2026-07-24T14:32:58Z"
}
],
"recent_commits": [
{
"oid": "fa9b18d38ce3f9185a23c22cd18bc59d4f45afb6",
"body": "SDK v0.26.0 gave StreamLink the three fields parseStreamMeta had always\nproduced and had nowhere to put, so streamLinkFrom no longer narrows the parse\nto quality, size and seeders. Until now the same walk over the same text\nproduced a richer answer for a Part than for a link, and the only place left\n[…]\nhich left the fake unable to observe the thing\nthis module is most responsible for: no test here could tell a filled Container\nfrom an empty one.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Carry container and codec on a link, and address a subtitle by episode",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-27T16:30:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5956d30ede7a4c1eab20cecb8469841ffcf20300",
"body": "M2 slice 4, this module's share — and the one of the three catalog\nproviders that is out of process, so the filter argument reaches it over\nthe wire rather than through a Go call.\n\n`ExtraDecl` read only a parameter's name, which was enough to detect\n`search` and nothing else. It now reads `options` \n[…]\navailable where no addon reports a total.\n\nAnd `Genres` on the work at import, so a library facet can be answered\nwithout a round trip per title.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Catalogs declare what an addon says they can be narrowed by",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-27T03:01:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "296a1d3c2d61645e135cb4d60951a00809f7b273",
"body": "Three editor and OS artefacts were ignored in some repositories and not others,\nfor no reason beyond which one was set up when. Levelled up so the same three\nlines are in all twelve. Nothing was tracked, so this only stops them appearing\nin working trees.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Ignore .vscode/ and .DS_Store, matching the other repositories",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-26T19:21:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2009c60793e02df562691397b019a53acf1699c6",
"body": "JetBrains project files had been committed by accident — the .iml, modules.xml,\nvcs.xml and the IDE's own .idea/.gitignore. They are per-machine editor state\nrather than anything the repository needs, and the ignore rule alone would have\nchanged nothing, because an ignore does not apply to a file already tracked. So\nthey are untracked here as well, and left on disk.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Ignore .idea/, and stop tracking the IDE scaffolding already committed",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-26T19:18:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4c900f07735b0aeb8d2fe100ca5ca6ba2320eaf9",
"body": "The link text still read `sdui` while the href already pointed at\nmosaic-media/contracts, so the sentence named a repository that was renamed\nunder ADR 0044. The Go module path and the npm package are untouched — the\ncontract itself did not move when the repository did.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Name the contracts repository by its current name",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-26T17:51:52Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b34c5bed14d6a30e1a8840222a08f20af2b1df90",
"body": "ADR 0081 took this module out of the Platform binary, so a release no\nlonger reaches anyone through a go.mod bump — a Platform gains this\nmodule when a user installs it from the official registry's signed index.\nThe dispatch still fired `core-module-release` at mosaic-media/platform,\nwhich would hav\n[…]\nver showed up as a failure.\n\nThe `binaries` job's comment said the same stale thing in passing — that\nthe module \"is still composed statically into the Platform today\" — and is\ncorrected alongside it.",
"is_bot": false,
"headline": "Point the release dispatch at the registry, not the Platform",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-26T16:29:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b68830ef855a69cd8c75a01554e13d2a99b07687",
"body": "contracts v0.54.0 adds the module-wire fields for Crew, RuntimeMinutes and\nHasMore, and sdk/host v0.6.0 maps them in each direction. This module runs out\nof process, so it is one of the ones the gap actually bit: a value set here for\nany of the three reached the Platform as a zero.\n\nNothing in this module sources them yet. Taking the releases keeps the floor\nlevel with what the Platform ships and makes the capability available.",
"is_bot": false,
"headline": "Take the contracts and host releases that carry the three new fields",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-26T15:37:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ad5883c00f13418d798797869361c560c4e8db13",
"body": "The requires named sdk v0.22.0, contracts v0.32.0 and sdk/host v0.4.0 while the\nPlatform ships v0.24.0, v0.53.0 and host/v0.5.0. Minimal version selection\nraised all three in every build that included the Platform, so boundary_test.go\nwas asserting the boundary of a dependency set that never runs.\n\nNo source change was needed: the sdk minors added fields, and the contracts\nsurfaces this module uses only gained generated builders.",
"is_bot": false,
"headline": "Raise the SDK, contracts and host floors to what the Platform ships",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-26T15:02:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e04ab63ac746a32633f72f6d10fb6c7e204d3d45",
"body": "The guard on PLATFORM_DISPATCH_TOKEN warned and exited 0, so a release run\nwith no token reported green while the Platform bump never fired. The token\nhas never in fact been set in this repository: every release so far has been\none of those green runs, and the platform repo has never seen a bump PR.\n[…]\nhere can un-publish\nthem. A red run costs a red run — which is the point, since it is the only\nway a bump chain that has stopped working says so.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fail the release when the dispatch token is missing",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-26T14:19:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "086b7f86da2abef9a41c3ac691683ecae027ed6e",
"body": "The manifest URL was a SubmitField splicing its text into the action by\nstring, and that primitive is gone in contracts v0.32.0.\n\nAdding an addon appends to a list, which a form merge cannot do. So\nsettings carry addAddon: the form writes one URL there, addonsFrom\nappends it to addons with the existing dedup, and the field is stored\nback empty. Nothing new on the wire.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Author the add-addon form, and fold the pending addition",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-25T05:05:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "17d75df5e1e56b2c9875e33f6929c20a78d167da",
"body": "The previous tag's artefact still had none: the field stopped at\nmodulesign, which reassembles the manifest and dropped what it did not\nknow about. That is fixed in the platform tool the release workflow\nbuilds from, so this tag is the first whose published manifest.json\ndescribes the module.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Re-release so the manifest carries the description",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-24T23:48:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ab7f1255c2b483cbc44b49b4ef659dc70f779b52",
"body": "The last release catalogued fine and published a manifest.json with no\n`description` in it. The field was on the module's own manifest and on\nthe SDK — but `sdk/host` is a separate module, and it is host's\n--mosaic-manifest that writes the document a release publishes and the\nregistry signs. Bumping sdk alone moved the field everywhere except the\none place that serialises it.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump sdk/host to v0.4.0, so the release carries the description",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-24T23:41:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "bd4be1a38fb86e93afa11e5bcc1ee0cfd135f202",
"body": "The description this module declares needs Manifest.Description, which\nlands in v0.22.0.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump to sdk v0.22.0 for the manifest description",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-24T23:11:45Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "efb1484d226d57799f450b5babb23d8525c9f6a6",
"body": "The Platform can read the roles off this manifest and tell a user what\nthis module can DO; only its author can say what it IS. Without that, the\ncard offering to install it named it, listed its capabilities, and left\nthe actual question — what is this for — unanswered.\n\nOne sentence: a host for what\n[…]\ngistry's index rather than being prose added downstream.\n\nNeeds sdk >= 0.22.0 for Manifest.Description; the require bump lands with\nthat release.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Say what this module is, not only what it fills",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-24T22:56:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "58c55ae87475d88e300379295d69dcffcc4e85db",
"body": "Slice 2.5a. The module's release gains a `binaries` job that cross-compiles\ncmd/module-stremio-addons for the Platform's targets (linux/darwin amd64+arm64,\nwindows/amd64; CGO off so one runner covers all five), asks the binary what it\nis via host's --mosaic-manifest, and joins that identity with the\n[…]\nmanifest format\nis extracted to a public module.\n\nBumps sdk/host to v0.3.0, which adds the --mosaic-manifest flag the identity\nstep depends on.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "release: produce out-of-process binaries and a signed-ready manifest",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-24T14:20:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "18a2a465c7c7acbab23802380b75fa69f7412fb6",
"body": "This repository had no CI at all — no gate on push, no tag validation,\nnothing to prove a published tag is resolvable, and nothing to fire ADR\n0078's dispatch. module-tmdb was the only module with workflows, so the\ntag-dispatch covered one module rather than the set. These two mirror\nthat template.\n\n[…]\nhe Platform\nbump ADR 0078 automates. The dispatch warns rather than fails when\nPLATFORM_DISPATCH_TOKEN is unset, so it is inert until the secret exists.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "CI: verify on push/PR, release on tag (ADR 0078)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-24T12:51:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9a252c99153037612e23feb0e21bdecce3368076",
"body": "A main.go of one line — host.Serve(stremio.New(nil)) — and nothing else\nin this module changes. That is the property ADR 0064 is arranged\naround, and this is the first real module to test it: the Capability is\nthe same plain Go value, its six roles are the same methods, and its\ntests still run with \n[…]\n process is unguarded until the forward proxy ADR\n0064 specifies is built, which is one reason the Platform still composes\nthis module statically today.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Run as a process: cmd/module-stremio-addons (ADR 0064, ADR 0077)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-24T03:47:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "da956573d47d2d01533ea518f92f992b68ac2fdb",
"body": "github.com/mosaic-media/sdui is now github.com/mosaic-media/contracts.\nADR 0044 decided the rename when it made these contracts protobuf; it\nnever happened, and ADR 0064 forces it now because the extension module\nwire lives in that workspace and the generated bindings end up behind\nsdk/host, which a\n[…]\necouples the npm scope from the\nrepository, and renaming the contract because the repository moved would\nbe renaming something nobody decided to rename.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Follow the contract repository rename to contracts (ADR 0044)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-24T02:31:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2759fcd8c783d52b51f00091597bc9c8ec85f325",
"body": "…0073)\n\nThe Platform now asks every stream provider about any materialised item, not\nonly the ones the provider itself imported. So a ref arrives here in two\nshapes and addressOf is the fork between them.\n\nThe module's own ref is unchanged: NativeID and NativeType are already\nStremio's and are used \n[…]\n the helper is used there only so a foreign ref\nis declined rather than becoming a request with two empty strings in it.\n\nRequires SDK v0.20.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "v0.21.0: resolve streams for content this module did not source (ADR …",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-23T22:17:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0a61bb5d96b7ab98214d78e77f3eeacbba7b0990",
"body": "This module bundled Cinemeta so a fresh install had metadata (ADR 0035). That\nguarantee now belongs to module-cinemeta, a core module that cannot be switched\noff or misconfigured (ADR 0072), and keeping a second Cinemeta here would have\nshown every title twice in search — the Platform unions search \n[…]\nport — so the directory path is exercised hermetically rather than by\nreaching Stremio's real one, and the browse grid is asserted to populate.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Drop the bundled Cinemeta default; keep the addon directory",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-23T20:52:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b167b55b8ef585714075238d0e7b5ed05a1954b7",
"body": "An addon proxying a real artwork database returns a landscapePoster beside the\nportrait poster, and the module decoded neither the field nor passed it on — so\nwide key art the source supplied was dropped at the boundary. It is translated\nhere rather than left for the Platform to learn (ADR 0051) and\n[…]\nk.Landscape at import (ADR 0071).\n\nCinemeta has no such field, so it stays empty for that source rather than being\nsubstituted from the poster.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "v0.19.0: decode landscapePoster; SDK v0.16.0",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-23T20:41:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cb2a963a38cd7e43b7a618c43ee7167ab150fdfd",
"body": "Fills Artwork{Poster, Backdrop, Logo} on AddContentWork from the metadata the\nmodule already fetches, so the Platform stores it on the node (ADR 0071) and\nlist surfaces like the continue-watching rail render art without re-querying.\n\nBumps the SDK require to v0.15.0. The jump from v0.13.0 also pulle\n[…]\nte surface, so fakeContent gains stubs for the methods\nContentService now declares — this module sources content, it does not consume\nplayback.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "v0.18.0: store artwork on import; SDK v0.15.0",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-23T19:53:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0480cbc3b492fbbdc8cb73c826fc2bf271b7152a",
"body": "Adds docker-compose.test.yml (golang:1.25, pinned to go.mod) running\ngofmt, build, vet and test. CLAUDE.md and README gain a \"nothing runs on\nthe host\" section; the README's Build section also drops a stale claim\nthat the SDK needs a `replace ../sdk` \"until published\" — go.mod requires\nit published \n[…]\ntainer has network and certificates on purpose.\n\nVerified: `docker compose -f docker-compose.test.yml run --rm test`\npasses (exit 0), no skips.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Run gates in a container, not on the host",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-23T17:47:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4d5f5d58430f36429974b304b473699f12a2ee48",
"body": "This repository had none, so a session starting here had to infer the module\nboundary — import only the published contracts, and nothing else — from a\nboundary test rather than being told it up front.\n\nWritten in another session; committed here with the rest of the tree.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add CLAUDE.md",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-23T16:59:08Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "25ab3826fa5dec067821175b92013c6ad63f9ddb",
"body": "This module had one log.Printf, and it was a good line — which source supplied\nthe identity and which supplied the artwork, so that \"the artwork came from\nCinemeta because your first addon had none\" is answerable after the fact.\n\nIt was also written the only way that was available, and every propert\n[…]\nre a provider's own identifiers and describe content, not a person.\nContributors became a count, which is what the line was really saying.\n\nSDK v0.13.0.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Record through the SDK instead of printing (ADR 0059)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-22T20:00:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "391db2740aef924ab5e9e0f6e8e5f761a83ace6f",
"body": "The hand-maintained constant had drifted across two releases: it read 0.7.0\nwhile the repository was tagged v0.9.0, so the Platform logged a version that\nhad not been true for months. Nothing forced it to agree with anything, which is\nwhy it did not.\n\nIt now resolves once at startup from whatever wa\n[…]\ner than a literal. That also frees the User-Agent, which was a\ncompile-time concatenation of the constant and is now built from the same value.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Derive the module version from the build graph (v0.16.0)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-22T15:53:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "66bebae49210d9351d81b56ef8927d19d079be3d",
"body": "The cast rail showed names and no faces, and the reason was that the module read\nthe wrong field.\n\nThe standard Stremio meta shape carries cast in `links` as a name plus a search\nURL -- no character, no photograph. An addon proxying a real metadata database\nhas more than that and nowhere to put it, \n[…]\nthrough it. The earlier TMDB-first heuristic was aiming at\nsomething already true; the ordering work still stands, but this was the actual\ngap.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Read cast photos and characters from app_extras (v0.15.0)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-22T14:46:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f14b63e6a84980d01bfe9ad3edca87e2a85100ed",
"body": "v0.13.0 unioned metadata field by field, which fills gaps well and can assemble\na record no single source would recognise. Stremio does the opposite -- it keeps\neach addon's answer whole and picks one -- which is always coherent and always\ngappy. Neither extreme is right, so the merge is now tiered \n[…]\nted Cinemeta came first. That was the behaviour, not the\nintent; it now asserts the ordering rule and that the configured position is\nrecorded.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Tiered metadata merge, and configured order as the priority (v0.14.0)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-22T14:37:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "67e88d088e5feb7c0ad263d69afd0da6ba49c36c",
"body": "The module asked one addon and stopped. Meta and Subtitles returned the first\nthat answered, so with the bundled Cinemeta prepended it always won -- and every\nricher source a user had deliberately installed was never even fetched. That is\nnot a preference anyone chose; it is an accident of list orde\n[…]\nguration order afterwards, so\nconcurrency does not make candidate ordering depend on which addon answered\nfirst. Selection ranks on that order.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Union every addon read: metadata, subtitles and streams (v0.13.0)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-22T14:23:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "26d16be4bf903fdbb3b730f83ad2dbe34eff5ee7",
"body": "…0.12.0)\n\nThe flat cap was actively harmful and this is the bug that cost the most time.\n\nAn aggregator ranks its listing by quality descending. Taking the first 40 of it\ntherefore takes the largest, least playable releases and discards every smaller\none. Measured against a real film: the source off\n[…]\nould repeat this same mistake on another axis.\n\nSource order is preserved within each bucket -- within one resolution the addon\ndoes know best.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Sample candidates across resolutions, not off the head of the list (v…",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-22T14:10:28Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c2c1158c4dd063bb315570c3baffcb887c3acd3b",
"body": "Import used to return early when the work already existed, so a re-import did\nnothing at all. Every item imported before the module stored a whole candidate\nset was therefore stranded on its single release forever, selection had nothing\nto choose between, and from outside that is indistinguishable f\n[…]\nistContentParts -- a module cannot tell a new release\nfrom a stored one without reading its own writes, which is the hole that\naddition closes.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Re-import refreshes an item's candidate releases (v0.11.0)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-22T13:43:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f2bafeefb5ab108a8357787a5702838019fecfa4",
"body": "The candidate-set and boundary-translation changes alter what composing this\nmodule produces, so it gets its own version rather than riding under the old one.\n\nThe constant was also stale: it read 0.7.0 while the repository was tagged\nv0.9.0, so the Platform logged a version that had not been true for two\nreleases. Corrected to match the tag rather than continuing the drift.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "v0.10.0: report the new module version",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-22T12:40:23Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f254945e1df0b3f4d6045e910ec82884219b4e82",
"body": "…0049, 0051)\n\nTwo changes, both of which the module should always have been doing.\n\nIt now parses container, video codec, audio codec and nominal dimensions out of\na stream's filename and descriptive text, and writes them into the SDK's typed\nfields on the Part. Those fields have existed since the c\n[…]\nn applied silently,\nbecause a cap nobody can see reads as \"we stored everything\" when it did not.\n\ngo build, go vet and go test -race all pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Translate release detail at the boundary; store every candidate (ADR …",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-22T12:20:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4810eda5e3451743b3ee7de4e2cb69ce9d23b3cf",
"body": "Port settingsui.go from the retired sdui option-bag builders to the\ndeclarative ui layer (github.com/mosaic-media/sdui/ui). The screen now reads\nas a widget tree; helpers return *ui.Element and the screen is serialised\nwith Element.BuildJSON(), which emits the canonical protojson UINode bytes\nthe Pl\n[…]\nuires sdui v0.6.1 (for the ui layer, Element.BuildJSON, and the OpenURL /\nBanner helpers this screen uses); drops the pre-protobuf sdui v0.3.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Author the settings UI with the sdui ui layer (require sdui v0.6.1)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-21T22:30:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "deceddbc2396de1f7348d349c1ea6d3839bd1887",
"body": "Repos dropped the redundant mosaic- prefix on 2026-07-21 (ADR 0043):\narchitecture, platform, sdk, sdui, module-stremio-addons. Update repo names,\nGo module paths, sibling folder paths, and GitHub/Pages URLs in the living\ndocs. The three web repos (mosaic-shell, mosaic-sdui-react, mosaic-storybook)\nand the cmd/mosaic-platform code path are unchanged. Version numbers not\ntouched here.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: update repo references after mosaic- prefix drop (ADR 0043)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-21T16:18:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f516072b05acf48c0ff384652b4356ebd4854da1",
"body": "Repo renamed mosaic-module-stremio -> module-stremio-addons under the\nmosaic-media org. Update the Go module path and internal imports, and\nretarget dependencies to sdk v0.8.0 and sdui v0.3.0 (their renamed paths).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: rename module path -> module-stremio-addons; retarget sdk/sdui",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-21T14:54:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e2011f1261abba96a570f5eb04589275a4ed3653",
"body": "Hide addons that are not content sources: a resource floor (must fill a role\nMosaic sources — meta/catalog/stream/subtitles) plus a curated deny-list of\nknown overlay/status/presence/companion addons that inject non-content through\nthose same resources and so can't be told apart by manifest. Add a d\n[…]\nthat Mosaic doesn't support every Stremio addon and community addons are\nused at the user's own risk. Curated list is non-exhaustive by design.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Filter browse to compatible addons + disclaimer (ADR 0038)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-21T01:43:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3dcc74a083fcbb1d7f0ed13c0b96c2aa38506a76",
"body": "…DR 0038)\n\nRender installed and browse addons as a grid of cards showing each addon's name,\nlogo and description (read from its manifest) instead of raw manifest URLs. The\nbundled Cinemeta default is deduped against an explicit user addon for the same\nURL, so it appears once (as the Default, with a \n[…]\nigure\ncontrol that opens its own /configure page. Add Logo/Description/behaviorHints\nto the manifest read and an InstalledAddons client method.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Settings v2: addon cards with name/logo, dedupe default, Configure (A…",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-21T01:27:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fdb4d5c105e36bff4a6679a88b040a3b41f26387",
"body": "Implement RoleSettingsUI: the module renders its own settings screen as SDUI\n(add an addon by manifest URL, view/remove installed addons, toggle the bundled\nCinemeta default, and browse installable addons via the addon_catalog resource),\nbuilt with the shared mosaic-sdui producer binding. Every cont\n[…]\nnow skipped rather than failing the whole\noperation, so one bad addon can't blank search, browse, or metadata. Require the\nreleased SDK v0.7.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Release v0.5.0: addon_catalog + a contributed settings UI (ADR 0038)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-21T01:12:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9754a11a314e02508b691b1e387c01c63dab76cf",
"body": "Complete the Stremio source surface. Bundle Cinemeta as a module-owned default\n(with a disableDefaultAddons opt-out) so metadata and search work with zero\nconfig (realises ADR 0035's default provider). Implement the subtitles resource\n(SubtitlesProvider / RoleSubtitles). Parse release detail — quality, size,\nseeders — out of stream titles/behaviorHints onto the richer StreamLink. Require\nthe released SDK v0.6.0 and drop the local replace.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Release v0.4.0: Cinemeta default, subtitles, richer streams (ADR 0037)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-21T00:22:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c271ea0b8a790c422c0e444f66af337ee80c073b",
"body": "Require mosaic-sdk v0.5.0 and drop the local replace now that it is tagged. The\nmodule decodes the rich Cinemeta fields into the grown ContentMetadata (ADR\n0034).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Release v0.3.0: rich metadata fields, on published SDK v0.5.0",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-20T23:04:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cfafef020b4f48afeedec11f44a0fd301fec7eca",
"body": "Cinemeta returns a clearlogo, cast, imdbRating, runtime and — per episode — an\noverview, thumbnail and air date; the module decoded none of them. Add them to\nthe Meta/Video wire structs (incl. the modern `links` array cast lives in), and\nmap them into the grown ContentMetadata: Logo, Cast (top-bille\n[…]\nisodes projected from the videos.\nModule v0.3.0. A local replace bridges the unreleased SDK v0.5.0 until it is\ntagged (release step in go.mod).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Decode the rich Cinemeta fields into the metadata (ADR 0034)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-20T22:54:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "93610932968d1f586e5406be24524cce06a7e8a2",
"body": "Matches the self-reported Manifest version (and User-Agent) to the\nv0.2.0 tag carrying the SDK v0.4.0 provider surface.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump module version to 0.2.0 for the provider-roles release",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-20T18:46:19Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "94703f6bcd1ea7aa95a703b33a087574f663bf3e",
"body": "The module was a single Import verb; SDK v0.4.0 (ADR 0027) turns the\ncontract into declared provider roles, and this fills all four.\n\n- Metadata: descriptive enrichment from the addon `meta` resource.\n- Search: free-text search over search-capable catalogs, returning\n virtual candidates with no raw\n[…]\ns Provides for all four\nroles, asserted at compile time.\n\nRequires mosaic-sdk v0.4.0 (published); the local replace used during dev\nis removed.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Implement the four provider roles against SDK v0.4.0",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-20T18:44:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ab491237fd58c08b03ce5c5ff45e53fb1b222d76",
"body": "Two blocking bugs made real addons fail on the input a user actually has:\n\n- The configured addon URL was treated as a base URL, so pasting the\n manifest URL Stremio hands out (\".../manifest.json\") produced\n \".../manifest.json/manifest.json\" and 404'd every request. normalise-\n AddonURL now accep\n[…]\nL normalisation and the\nUser-Agent, and documents the metadata-addon vs stream-addon split in\nthe README (the meta-only case is not a failure).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix addon reachability: accept manifest URLs and set a User-Agent",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-20T17:35:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9adeff7389cc041a4b3156a6323ec506cfeeaf29",
"body": "The module now resolves mosaic-sdk from the module proxy as an ordinary\ntagged dependency, so a fresh clone builds without a sibling SDK checkout.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Require the published SDK v0.3.0 (drop the local replace)",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-20T01:37:00Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2eb159c6300786df55b8a0c93244d999dc5f2cb6",
"body": "MIT matches the Stremio addon SDK's own license and is frictionless for an\nofficial example other module authors copy. The module depends only on the\nApache-2.0 SDK and may be compiled into the AGPL Platform under its Module\nLinking Exception.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "License the module under MIT",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-20T01:27:34Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "da316f1a3d8d4993e5ac4a50d776760a5c95fa71",
"body": "Extracted from mosaic-platform (modules/stremio) into its own repository,\nas a third-party module would be. The SDK replace now points at the\nsibling ../mosaic-sdk instead of the old nested path, and requires\nmosaic-sdk v0.3.0. Adds a README describing the module and a nominative-use\nnote: this is unofficial and not affiliated with Stremio / SmartCode OOD.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Stand alone: point the SDK replace at the sibling SDK, add a README",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-20T01:11:52Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "37a5761ee7d664b185b25dd4525d50bf39fb346f",
"body": "The first SDK gap the Stremio module surfaced. Addon URLs were an env var\n(MOSAIC_STREMIO_ADDONS) read at composition; the real need is a user\nadding an addon through the running API. Fills the gap end to end.\n\nStorage: a Platform-owned ModuleSettingsStore — one jsonb document per\nmodule id (migrati\n[…]\nhe\nshape and names the next gap the module surfaced (module-declared cron,\nwhich needs the jobs runner, a scheduler, and the system principal).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "User-managed module settings: add a Stremio addon at runtime",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-20T00:58:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "05fe89cd2039f0705e94f0848b06a273e8ac322d",
"body": "Builds the composition-and-invocation half of the extension story the\nreference capability could not: registering a separately-compiled module\nand invoking it. The reference capability proved a package can be written\nagainst the SDK alone; this proves the Platform can register and run one.\n\nSDK (v0.\n[…]\nemoteLocation path.\n\nADRs 0019 (capability/invocation contract) and 0020 (composition model)\nrecord the shapes, written after the code settled.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "The first optional module: Stremio addon source, composed and invoked",
"author_name": "AdamNi-7080",
"author_login": "Pickles2235",
"committed_at": "2026-07-20T00:23:26Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 9,
"commits_last_year": 50,
"latest_release_at": "2026-07-27T16:31:38Z",
"latest_release_tag": "v0.30.0",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 2,
"days_since_latest_release": 0,
"mean_days_between_releases": 0.4
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 50,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/mosaic-media/module-stremio-addons",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/mosaic-media/module-stremio-addons",
"is_deprecated": false,
"latest_version": "v0.30.0",
"repository_url": "https://github.com/mosaic-media/module-stremio-addons",
"versions_count": 32,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-27T16:30:18Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 34214,
"source_files_sampled": 15,
"oversized_source_files": 0,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 8729
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/mosaic-media/contracts",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.60.0"
},
{
"name": "github.com/mosaic-media/sdk",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.26.0"
},
{
"name": "github.com/mosaic-media/sdk/host",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.8.0"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "Pickles2235",
"commits": 50,
"avatar_url": "https://avatars.githubusercontent.com/u/32930825?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"release.yml",
"verify.yml"
],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 0,
"reason": "Project has not signed or included provenance with any releases.",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 1,
"reason": "9 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "fa9b18d38ce3f9185a23c22cd18bc59d4f45afb6",
"ran_at": "2026-07-28T01:27:11Z",
"aggregate_score": 2.1,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-27T16:35:17Z",
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/mosaic-media/module-stremio-addons",
"host": "github.com",
"name": "module-stremio-addons",
"owner": "mosaic-media"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": null,
"notes": [],
"value": 42,
"inputs": {
"security": 21,
"vitality": 68,
"community": 24,
"governance": 33,
"engineering": 56
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "moderate",
"name": "Vitality",
"value": 68,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"commits_last_year": 50,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 2
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "2/52 weeks with commits",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 2
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "50 commits in the last year",
"points": 15.3,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 50
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 9,
"latest_release_tag": "v0.30.0",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 0.4
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "9 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 9
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~0.4 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 0.4
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 24,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 33,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 10,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution",
"pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 39,
"inputs": {
"followers": 0,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "mosaic-media",
"public_repos": 16,
"account_age_days": 15
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "0 followers of mosaic-media",
"points": 0,
"status": "missed",
"details": [
{
"code": "owner_followers",
"params": {
"count": 0,
"login": "mosaic-media"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "16 public repos, account ~0 yr old",
"points": 9,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 16
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/mosaic-media/module-stremio-addons"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "32 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 32
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "moderate",
"name": "Engineering Quality",
"value": 56,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 60,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "critical",
"name": "Security",
"value": 21,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"packaging"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 21,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 2.1
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "9 existing vulnerabilities detected",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 7.5
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 79,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 8729
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "50 of 50 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 50,
"sampled": 50
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.94,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "go.mod (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "go.mod"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "47 of the last 50 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 47,
"sampled": 50
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 34214,
"source_files_sampled": 15,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/15 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 15,
"oversized": 0
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-28T01:27:16.215745Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/mosaic-media/module-stremio-addons.svg",
"full_name": "mosaic-media/module-stremio-addons",
"license_state": "standard",
"license_spdx": "MIT"
}