原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 20370,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 1063832,
"CSS": 23636,
"HTML": 88162,
"Shell": 8440,
"Dockerfile": 2739,
"JavaScript": 22869
},
"pushed_at": "2026-06-22T04:15:11Z",
"created_at": "2025-03-09T18:54:07Z",
"owner_type": "User",
"updated_at": "2026-03-24T13:51:44Z",
"description": "The purpose of this script is to export Trakt movies watchlist to csv file for manual Letterboxd import",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": "https://linktree.johandev.com",
"name": "Johan",
"type": "User",
"login": "JohanDevl",
"company": null,
"location": "France",
"followers": 7,
"avatar_url": "https://avatars.githubusercontent.com/u/26220620?v=4",
"created_at": "2017-03-06T10:39:17Z",
"is_verified": null,
"public_repos": 47,
"account_age_days": 3431
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v2.0.18",
"kind": "patch",
"published_at": "2025-11-11T23:01:10Z"
},
{
"tag": "v2.0.17",
"kind": "patch",
"published_at": "2025-09-04T18:12:41Z"
},
{
"tag": "v2.0.16",
"kind": "patch",
"published_at": "2025-07-30T20:24:43Z"
},
{
"tag": "v2.0.15",
"kind": "patch",
"published_at": "2025-07-29T20:41:28Z"
},
{
"tag": "v2.0.14",
"kind": "patch",
"published_at": "2025-07-29T19:56:53Z"
},
{
"tag": "v2.0.13",
"kind": "patch",
"published_at": "2025-07-29T11:14:48Z"
},
{
"tag": "v2.0.12",
"kind": "patch",
"published_at": "2025-07-12T21:56:35Z"
},
{
"tag": "v2.0.11",
"kind": "patch",
"published_at": "2025-07-11T16:43:10Z"
},
{
"tag": "v2.0.10",
"kind": "patch",
"published_at": "2025-07-11T12:23:17Z"
},
{
"tag": "v2.0.9",
"kind": "patch",
"published_at": "2025-05-24T09:06:44Z"
},
{
"tag": "v2.0.8",
"kind": "patch",
"published_at": "2025-05-24T07:38:53Z"
},
{
"tag": "v2.0.7",
"kind": "patch",
"published_at": "2025-05-23T21:35:30Z"
},
{
"tag": "v2.0.6",
"kind": "patch",
"published_at": "2025-05-23T20:18:29Z"
},
{
"tag": "v2.0.5",
"kind": "patch",
"published_at": "2025-05-23T17:45:11Z"
},
{
"tag": "v2.0.4",
"kind": "patch",
"published_at": "2025-05-23T16:33:18Z"
},
{
"tag": "v2.0.3",
"kind": "patch",
"published_at": "2025-05-23T12:59:19Z"
},
{
"tag": "v2.0.2",
"kind": "patch",
"published_at": "2025-05-23T12:35:24Z"
},
{
"tag": "v2.0.1",
"kind": "patch",
"published_at": "2025-05-23T12:35:21Z"
},
{
"tag": "v1.2.4",
"kind": "patch",
"published_at": "2025-03-24T22:28:41Z"
},
{
"tag": "v1.2.3",
"kind": "patch",
"published_at": "2025-03-24T22:25:46Z"
},
{
"tag": "v1.2.2",
"kind": "patch",
"published_at": "2025-03-24T22:21:49Z"
},
{
"tag": "v1.2.1",
"kind": "patch",
"published_at": "2025-03-24T22:17:07Z"
},
{
"tag": "v1.2.0",
"kind": "minor",
"published_at": "2025-03-24T22:05:19Z"
},
{
"tag": "v1.0.17",
"kind": "patch",
"published_at": "2025-03-24T21:02:49Z"
},
{
"tag": "v1.0.16",
"kind": "patch",
"published_at": "2025-03-24T12:27:36Z"
},
{
"tag": "v1.0.15",
"kind": "patch",
"published_at": "2025-03-24T12:23:22Z"
},
{
"tag": "v1.0.14",
"kind": "patch",
"published_at": "2025-03-24T12:18:04Z"
},
{
"tag": "v1.0.13",
"kind": "patch",
"published_at": "2025-03-24T12:10:48Z"
},
{
"tag": "v1.0.12",
"kind": "patch",
"published_at": "2025-03-23T21:16:57Z"
},
{
"tag": "v1.0.11",
"kind": "patch",
"published_at": "2025-03-22T11:24:42Z"
},
{
"tag": "v1.0.10",
"kind": "patch",
"published_at": "2025-03-22T11:20:45Z"
},
{
"tag": "v1.0.9",
"kind": "patch",
"published_at": "2025-03-22T10:50:12Z"
},
{
"tag": "v1.0.8",
"kind": "patch",
"published_at": "2025-03-18T06:54:00Z"
},
{
"tag": "v1.0.7",
"kind": "patch",
"published_at": "2025-03-18T06:34:32Z"
},
{
"tag": "v1.0.6",
"kind": "patch",
"published_at": "2025-03-10T11:34:01Z"
},
{
"tag": "v1.0.5",
"kind": "patch",
"published_at": "2025-03-10T11:22:57Z"
},
{
"tag": "v1.0.4",
"kind": "patch",
"published_at": "2025-03-10T10:52:24Z"
},
{
"tag": "v1.0.3",
"kind": "patch",
"published_at": "2025-03-09T22:34:29Z"
},
{
"tag": "v1.0.2",
"kind": "patch",
"published_at": "2025-03-09T21:40:22Z"
},
{
"tag": "v1.0.1",
"kind": "patch",
"published_at": "2025-03-09T21:13:17Z"
}
],
"recent_commits": [
{
"oid": "f88c7b23e53441fed1d1253766e98cac97aca97a",
"body": null,
"is_bot": false,
"headline": "chore: remove unused Claude review workflows",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-03-24T13:51:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d80b2b31b412cb26b38a9bf3302c0435b256812",
"body": null,
"is_bot": false,
"headline": "chore: bump version to 2.1.0",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-03-24T13:49:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e988721667a2facd54823e9877bb5caae8256c5c",
"body": "v2.0.17 — Complete project optimization & CI/CD overhaul",
"is_bot": false,
"headline": "Merge pull request #88 from JohanDevl/develop",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-03-24T10:10:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab4209aeb9b637175829bb0881c5d1b403e8a1c7",
"body": null,
"is_bot": false,
"headline": "fix(ci): add workflow-level permissions block for security",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-03-24T10:04:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3404e8fb5d5feacdc8019cb6257f539fd3f8fae5",
"body": null,
"is_bot": false,
"headline": "fix(ci): bump upload/download-artifact to v7/v8 for Node.js 24",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-03-23T13:02:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c5c71c9557fd858158d0ea884b38f161c1d46db4",
"body": "Bump all GitHub Actions to latest versions supporting Node.js 24:\ncheckout v6, setup-go v6, setup-buildx v4, login v4, metadata v6,\nbuild-push v7. Re-declare ARG in Dockerfile runtime stage for labels.",
"is_bot": false,
"headline": "fix(ci): update actions to Node.js 24 and fix Dockerfile ARG warnings",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-03-23T12:55:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a51aca00a64519e98979a51bf4d3a2348b011b94",
"body": null,
"is_bot": false,
"headline": "fix(test): add mutex to MockNotificationChannel to fix race condition",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-03-23T12:46:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b329487139515b778f833ef12397e7e4dbde53c7",
"body": "Replace 4 complex workflows (ci-cd, security-scan, docker-cleanup,\nauto-tag) with 2 simple ones matching mediatorr/Linkarr pattern:\n\n- auto-tag.yml: VERSION file-based tagging (replaces auto-increment)\n- docker-publish.yml: test + multi-platform Docker build with digest\n merge (replaces ci-cd.yml with 5 jobs)\n\nRemoved: security scanning, docker cleanup, binary releases, coverage\nenforcement, PR Docker builds, notify jobs. Estimated 70-80% reduction\nin GitHub Actions quota usage.",
"is_bot": false,
"headline": "refactor(ci): overhaul GitHub Actions to 2 lean workflows",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-03-23T12:42:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5b890caf428b07021f78f3242c3059594a1baab2",
"body": null,
"is_bot": false,
"headline": "fix(ci): update trivy-action to v0.35.0 (v0.28.0 has broken dependency)",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-03-23T12:07:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b84cffd7957efee64ae02e4a66b3362899985269",
"body": null,
"is_bot": false,
"headline": "fix(ci): use correct trivy-action version tag v0.28.0",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-03-23T10:57:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1ba182e2109a054d5a11ba9f95e9a7fc7e979dc9",
"body": "Coverage dropped from 78% to 54% after removing coverage farming tests\n(logger_coverage_test.go, logger_additional_test.go). The 54% reflects\nreal test coverage without artificial inflation.",
"is_bot": false,
"headline": "fix(ci): lower coverage threshold to 50% after test cleanup",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-03-23T10:21:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bef65de85683ddd41c237a52f601f6f1850c1145",
"body": "Remove dead code (empty dirs, unused packages, coverage farming tests),\nfix goroutine leaks with proper shutdown mechanisms (done channels,\nsync.Once), simplify GitHub Actions from 6 to 4 workflows, fix critical\nWebSocket security issues (origin validation, concurrent writes), and\noptimize web interface (JS/CSS cleanup, CSRF token, DOM caching).",
"is_bot": false,
"headline": "refactor: comprehensive project optimization and cleanup",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-03-23T10:14:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8bf093a49818656485bc7db3336fb0222ff3f0ab",
"body": "Split 4 large files into focused modules following single responsibility:\n- main.go (1764→299 lines): extracted auth, export, schedule, server, validation\n- trakt.go (841→185 lines): extracted movies, shows, collections, history\n- letterboxd.go (941→157 lines): extracted movies, shows, ratings\n- exp\n[…]\n, cache\n\nAlso extracted magic numbers into named constants, fixed unchecked errors,\nreplaced deprecated ioutil with os package, and fixed .gitignore pattern\nthat was incorrectly ignoring source files.",
"is_bot": false,
"headline": "refactor: split god files and extract constants for clean code",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-01-26T06:46:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "58e741eb28c27ac2dcd55c95cab0d4ecf2c90e1f",
"body": "review: complete project audit with critical fixes",
"is_bot": false,
"headline": "Merge pull request #86 from JohanDevl/review/complete-project-review",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2026-01-14T09:14:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "23d1469d90c4d4f0b481f952b60b4d44e0e1c5e1",
"body": null,
"is_bot": false,
"headline": "review: complete project audit with critical fixes",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-11-13T13:53:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9cf7df0b609ea356d8e0fffc3f8004fad5f599a6",
"body": null,
"is_bot": false,
"headline": "Remove WEB_INTERFACE_ENHANCEMENTS.md",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-11-13T13:24:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ea6a98b500ee3a1f7030ded2159c33eebdb7a6c2",
"body": "fix: resolve export mode inversion and optimize performance",
"is_bot": false,
"headline": "Merge pull request #84 from JohanDevl/develop",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-11-11T23:01:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aef06edc0a38e5c17eca3fc5c1627bb3e8b7d564",
"body": "…09514551\n\nAdd Claude Code GitHub Workflow",
"is_bot": false,
"headline": "Merge pull request #85 from JohanDevl/add-claude-github-actions-17570…",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-09-04T18:12:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "46c86dbc4bb5f5851a96cbf6fec9846055af5911",
"body": null,
"is_bot": false,
"headline": "\"Claude Code Review workflow\"",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-09-04T18:11:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f80b729d73071192de042e193579930852164dc0",
"body": null,
"is_bot": false,
"headline": "\"Claude PR Assistant workflow\"",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-09-04T18:11:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b94894dc7b2d8c0053c5b21fb54ec93c2f701023",
"body": "This empty commit tests the new Docker PR build functionality",
"is_bot": false,
"headline": "trigger: test Docker PR build for PR-84",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-24T08:31:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9cc4846e79110d942a885633e0feb9607c1c4d30",
"body": "- Add dedicated docker-pr job for building PR-specific Docker images\n- PR images tagged as PR-{number} for easy testing and identification\n- Update notification job to handle both production and PR builds\n- Enhance workflow summary to show appropriate Docker image links\n- Maintain separation between production and PR builds for security",
"is_bot": false,
"headline": "fix: enable Docker image builds for pull requests",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-24T08:24:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "99a60ff214f505d12b58c38943bf0ed3ca683a50",
"body": "- Update docker-tag-monitor.yml to run once daily at 6 AM UTC instead of hourly\n- Reduce sleep delay from 1s to 0.5s since daily checks have less urgency\n- Update documentation to reflect daily monitoring schedule\n\nThis reduces GitHub Actions usage while still ensuring missing Docker images\nare detected and resolved within 24 hours of tag creation.",
"is_bot": false,
"headline": "chore: change Docker tag monitoring frequency to daily",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T21:05:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "56917485698d504aa345bacdc24411b47f00efdd",
"body": "- Add docker-tag-monitor.yml workflow for automatic monitoring:\n - Hourly checks for missing Docker images\n - Auto-triggers CI/CD for missing tags\n - Creates GitHub issues for tracking\n - Provides comprehensive status reporting\n\n- Update CLAUDE.md with detailed Docker tag strategy documentation:\n[…]\n✅ PAT-based auto-tagging for workflow triggering\n✅ Improved Docker tagging strategy with clear separation\n✅ Automated monitoring and issue creation\n✅ Comprehensive documentation for future maintenance",
"is_bot": false,
"headline": "feat: add Docker tag monitoring and comprehensive documentation",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T21:03:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aca3b3be33e48f07532cb09cc70d2f8c20aa47e9",
"body": "- Modify auto-tag.yml to use PAT_TOKEN for triggering downstream workflows\n- Add automatic CI/CD trigger after tag creation to ensure Docker images are built\n- Improve Docker tagging strategy in ci-cd.yml:\n - Separate main tag (branch pushes only) from release tags\n - Add stable tag as alias for latest\n - Add support for pre-release tags (beta, rc)\n - Exclude beta/rc from latest tag\n- Clarify tagging logic with improved comments",
"is_bot": false,
"headline": "fix: improve Docker tagging strategy and auto-tag workflow",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T21:00:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b01dca48792408f29a445e6cc295f55bff6a871e",
"body": "- Improve CSV record counting with 500KB sampling and dual-point analysis\n- Add timezone conversion for export history display dates\n- Optimize cache performance with 30-minute TTL and 100-export scan limit\n- Implement two-tier caching system (recent vs older exports)\n- Increase precise counting thr\n[…]\nme: ~10s → <1s for typical usage\n- CSV counting accuracy: significantly improved for large files\n- Cache hit ratio: enhanced with longer TTL\n- Memory usage: minimal increase with metadata-only caching",
"is_bot": false,
"headline": "perf: optimize export page performance and accuracy",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T20:15:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f0af010a4515b7b886619f1793240ac59324f43a",
"body": "- Fix rewatch logic in ExportMovieHistory to properly identify first vs subsequent viewings\n- Add cache invalidation after export completion to ensure new exports appear immediately\n- Add comprehensive test for movie history export with rewatch verification\n- Improve export history refresh functionality\n\nFixes issues where:\n- Individual mode showed aggregated results and vice versa\n- New exports didn't appear in web interface without manual refresh",
"is_bot": false,
"headline": "fix: correct export mode behavior and cache refresh",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T19:51:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c2080e832298a15ac0822c0a1ad0953ac80e5fb2",
"body": "The docker-test job was trying to pull an image with tag from version output (v2.0.16)\nbut the docker job pushes images with 'develop' tag on develop branch.\n\nChanged docker-test to use 'develop' tag to match the pushed image, resolving\nthe 'manifest not found' error in the CI/CD pipeline.",
"is_bot": false,
"headline": "fix: use correct Docker tag for docker-test job",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T12:27:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0e564c9588dc9c4ef75034d73d629c6dc9522557",
"body": "The Trivy scanner was trying to scan image with tag v2.0.16 which doesn't exist\non develop branch. Fixed to use 'develop' tag which matches the built image.\n\nThis resolves the CI/CD pipeline failure where Trivy couldn't find the specified image.",
"is_bot": false,
"headline": "fix: correct Docker image reference for Trivy vulnerability scan",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T12:12:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "05da30dfade0a1e313500460bac163b2362f6547",
"body": "- Fix TestTokenManager_GetValidAccessToken assertion to match actual error message\n- Fix TestBatchProcessorProcessWithError to expect JSON decode errors\n- Fix TestConcurrentStreamProcessorWithErrors to handle JSON decode errors gracefully\n- Skip TestClient_APIEndpoints when access token is unavailable in test environment\n- Add missing strings import to api_working_test.go\n\nAll previously failing tests now pass, resolving workflow #307 failure",
"is_bot": false,
"headline": "fix: correct test assertions to match actual error messages",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T12:00:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6167270832ffd847c5994157803a318e9c9170d9",
"body": "- Fix pkg/web/realtime compilation errors by correcting API usage\n- Replace problematic realtime_test.go with simple_test.go\n- Correct auth test assertions to match actual error messages\n- Fix emoji and text expectations in TokenStatus.String() tests\n- Update BroadcastMessage calls to use correct si\n[…]\nct field references (Data -> Payload, ConnectedAt -> Connected)\n- Remove non-existent method calls (Run -> Start, Stop removed)\n\nWorkflow should now pass with 57.6% test coverage (above 55% threshold)",
"is_bot": false,
"headline": "fix: resolve workflow compilation errors and test failures",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T10:39:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "86b85448a77d97ab1e5f15ed51d8cb64d49c391a",
"body": "- Add comprehensive tests for pkg/auth (21.1% → 55.9% coverage)\n- Add working tests for pkg/api (22.4% coverage improvement)\n- Create robust mock implementations for testing\n- Cover OAuth authentication, token management, and API client functionality\n- Test error handling, retry mechanisms, and performance features\n- Total coverage increased from 49.6% to 61.4%, exceeding 60% target",
"is_bot": false,
"headline": "test: achieve 61.4% code coverage by adding comprehensive tests",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T10:25:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1b0a6dee79e2bd538a56199ef5e1fc055e77a1e9",
"body": "- Add complete test suite for pkg/errors manager with 87.6% coverage\n - Test error handling, recovery strategies, circuit breaker\n - Mock logger, recovery strategies, and notification services\n - Cover all major error manager functionality\n\n- Add comprehensive streaming package tests with 86.1% c\n[…]\nhods\n - Use proper variadic parameters for logger methods\n\nThese improvements significantly boost overall test coverage from ~49% towards the target 60% threshold required for CI/CD pipeline success.",
"is_bot": false,
"headline": "test: add comprehensive test coverage for error handling and streaming",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T07:52:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a1f6edbc57336232cb63245beb72f1226e34b44a",
"body": "- Add missing handleWebSocket methods to Server\n- Fix NewExportsHandler calls in tests with CSRFMiddleware\n- Update WebSocket test expectations for proper behavior",
"is_bot": false,
"headline": "fix: resolve remaining web test failures",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T07:19:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f7bc50d5843b19d28ff78f0115aed5b6b856426d",
"body": "- Add gorilla/websocket dependency and imports\n- Fix CategoryRetryConfig type conflicts between packages\n- Remove duplicate OptimizedClientConfig definitions\n- Add missing TryRecoverFromError method to ErrorAwareClient\n- Clean up unused imports in websocket and broadcaster files",
"is_bot": false,
"headline": "fix: resolve compilation errors in workflows",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-23T07:06:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d2a7afd798a76c30c2e107a50dbd727d90563d03",
"body": null,
"is_bot": false,
"headline": "fix: update .gitignore to include CLAUDE.md and remove obsolete file",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-21T20:47:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "31d275e47a8cfa104d31e14d33e93a08ec326720",
"body": "…and accessibility improvements\n\n- Security: Add CSRF protection, security headers, XSS prevention\n- Performance: Implement memory-aware LRU cache, ring buffers, worker pool improvements\n- Architecture: Unified API client interfaces, centralized error management\n- Real-time: Replace auto-refresh wit\n[…]\ncompliant color contrasts and accessibility features\n- Testing: Achieve 97%+ test coverage for performance packages\n\nMajor improvements across security, performance, architecture, and user experience.",
"is_bot": false,
"headline": "feat: comprehensive project optimization with security, performance, …",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-08-21T20:35:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "24e45b9f2e8d3744fb87700b46efd45744fb6bdc",
"body": "fix: resolve export page 404 errors and interface issues",
"is_bot": false,
"headline": "Merge pull request #83 from JohanDevl/fix/export-page-download-issues",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-30T20:24:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "39cb9c9705d711ee91fc0b9785cae757c9992dd9",
"body": "- Add filename sanitization in findFileInExportDirs() to prevent path traversal attacks\n- Replace innerHTML with safe DOM element creation to prevent XSS\n- Sanitize error messages before display to prevent HTML injection\n- Ensures secure handling of user-provided values in path expressions\n\nSecurity\n[…]\nrsal protection: Block filename with /, \\, .., or leading dots\n- XSS prevention: Use textContent instead of innerHTML for dynamic content\n- Input sanitization: Escape HTML characters in error messages",
"is_bot": false,
"headline": "fix: resolve CodeQL security vulnerabilities",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-30T20:15:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4627dbe647696e2e704d2237efb6724e7237849e",
"body": "- Remove type=semver rules that interfered with explicit latest tag control\n- Latest tag now only applies on git tag releases (refs/tags/v*)\n- Prevents latest tag from moving on develop/main pushes and PRs",
"is_bot": false,
"headline": "fix: prevent latest Docker tag from moving on non-release builds",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-30T20:04:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "41c2995abdba7286ec17066bd9462febf62307f0",
"body": "- Lower coverage threshold from 56% to 55% to accommodate recent bug fixes\n- Current coverage is 55.9% after template and download handler improvements\n- Maintains quality while allowing necessary functionality fixes",
"is_bot": false,
"headline": "fix: adjust test coverage threshold to match current state",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-30T19:30:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0a55551b898e85641f0d30f05d00c38a5c5faf5e",
"body": "- Restore production cache TTL to 5 minutes (was 10 seconds for debug)\n- Update TestExportsHandler to expect HTTP 200 status after template fixes\n- Tests now properly reflect the corrected template behavior",
"is_bot": false,
"headline": "fix: correct GitHub Actions workflow test failures",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-30T19:26:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "487dfc58848ef77ae6707c813bc981bb73052664",
"body": "- Modified DownloadHandler to automatically search in export subdirectories\n- When /download/ratings.csv is requested:\n 1. First tries ./exports/ratings.csv (direct path)\n 2. If not found, searches in all export_* subdirectories\n 3. Returns first matching file found\n- Added findFileInExportDirs m\n[…]\n direct file downloads\n- Enhanced logging to track file resolution process\n\nThis allows simple /download/{{.}} links in templates to work\nfor both direct files and files in timestamped export folders.",
"is_bot": false,
"headline": "fix: implement smart file download search for export subdirectories",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-30T19:11:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "df37fff67186450692390a9f1597f991c204136d",
"body": "- Added detailed debug logging for template data\n- Simplified download links in template to eliminate template parsing errors\n- Fixed double WriteHeader issue by removing http.Error call\n- Added template data debugging to identify issues\n\nThe template error was likely caused by complex nested template expressions\nwith contains/substr functions. Simplified to basic links for now.",
"is_bot": false,
"headline": "fix: resolve template error preventing export display",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-30T18:52:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "debf8029db935f6463b8f61ea52da315bf763240",
"body": "- Fixed export listing to always scan older exports (not just when <50 recent)\n- Increased limit for scanning older exports from 100 to 500\n- Fixed export button conflicts between app.js and exports.html\n- Added proper button state management (disable on click, reset on error/success)\n- Excluded export buttons from generic button handler in app.js\n\nThese changes should resolve:\n- Only 1 export showing instead of full list (53 total)\n- Export buttons not working due to JavaScript conflicts",
"is_bot": false,
"headline": "fix: resolve export display and button functionality issues",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-30T15:37:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c02df134c0a1fbc9bc0e3a145c0cc8a460fa5bd",
"body": "- Added explicit JSON struct tags to ExportItem for proper serialization\n- Updated JavaScript to use correct JSON property names (lowercase)\n- Synchronized download URL generation logic between static template and dynamic JavaScript\n- Fixed missing download buttons in export history pagination/filtering\n\nThis resolves the issue where download buttons were not showing up\nin the export history when using dynamic loading (pagination/filters).",
"is_bot": false,
"headline": "fix: synchronize download logic between HTML template and JavaScript",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-30T15:24:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97de033fcfd3b47fddfcf9783b817a6252287424",
"body": "The download links in the exports page template were not correctly handling\nfiles located in timestamped export directories (export_YYYY-MM-DD_HH-MM).\nThis caused 404 errors when users tried to download CSV files.\n\nFixed by updating the template to construct proper download URLs:\n- For directory exp\n[…]\nrt_2025-07-11_15-43/ratings.csv\n- For individual files: /download/ratings.csv\n\nThe fix uses template logic to check if the export ID starts with 'dir_'\nand builds the appropriate URL path accordingly.",
"is_bot": false,
"headline": "fix: resolve 404 error for CSV file downloads from export directories",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-30T15:11:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "98788d174e9bf33ef6aedd20bb8388c6f5c51a63",
"body": "- Latest tag now only applied on git tag releases (refs/tags/v*)\n- Removes latest tag from main branch pushes to prevent confusion\n- Semantic version tags also restricted to releases only\n- Main tag still available for both releases and main branch pushes\n\nThis ensures the latest tag always points to the most recent stable release\nrather than development commits on main branch.",
"is_bot": false,
"headline": "fix: restrict Docker latest tag to releases only",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T20:51:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7a1a0dfabf44b8d5cbc890a25651f38cc823acc2",
"body": "fix: change OAuth authentication link to open in same tab",
"is_bot": false,
"headline": "Merge pull request #81 from JohanDevl/develop",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T20:41:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "22ce2a15980281c2ce86cb53b143fe8eada5b3d2",
"body": "Change target=\"_blank\" to target=\"_self\" in auth-url.html template to improve\nuser experience. When users click \"Authenticate with Trakt.tv\", the link now\nopens in the same tab instead of a new window, allowing them to naturally\nreturn to the application after OAuth callback completion.",
"is_bot": false,
"headline": "fix: change OAuth authentication link to open in same tab",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T20:31:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7d41d35f326e4f37bfa83ed6c5d2eb22fc4543b3",
"body": "- Add main branch trigger to docker-build workflow\n- Update tagging logic to apply latest/main/version tags on main pushes\n- Ensures Docker Hub latest tag always points to current main branch\n- Maintains semantic versioning from auto-tag workflow",
"is_bot": false,
"headline": "fix: enable Docker builds on main branch with proper latest/main tags",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T20:12:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8e25d59fac93c63b86375a2b8495ec67ed061e6f",
"body": "release: Export page performance optimizations and test coverage improvements",
"is_bot": false,
"headline": "Merge pull request #71 from JohanDevl/develop",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T19:56:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4c250bdb318b514c3224bcf2b0ab671814f27083",
"body": "perf: optimize Export page loading with intelligent caching and lazy loading",
"is_bot": false,
"headline": "Merge pull request #70 from JohanDevl/optimize-exports-performance",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T19:46:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4a8a307ea72752e519859f94797f9890d40682ef",
"body": "- Add tests for cache system initialization and TTL validation\n- Test lazy loading functionality with recent/older export distinction\n- Cover optimized CSV record counting for both small and large files\n- Test utility functions: parseExportType, formatFileSize, getIntParam\n- Add comprehensive filter\n[…]\nprovides reasonable accuracy for large files\n- Utility functions handle edge cases appropriately\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: add comprehensive tests for Export page optimizations",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T19:28:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8dd6f2ec9a30a2600cd82afdc2538c5d8a1d04a8",
"body": "- Document intelligent caching system with 5-minute TTL\n- Explain lazy loading strategy for recent vs older exports\n- Detail smart CSV record counting with file size estimation\n- Record performance improvements: ~10s to <1s page load time\n- Add implementation details for future reference\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: update CLAUDE.md with Export page performance optimizations",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T15:13:45Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6d7af863c8377da88484c47d1391cd70a45695fb",
"body": "…loading\n\n- Add in-memory cache (5min TTL) to avoid rescanning exports on each page load\n- Implement lazy loading: scan recent exports (30 days) first, older ones only if needed\n- Optimize CSV record counting with file size estimation for large files\n- Limit older exports scan to 100 items to preven\n[…]\n/O for large CSV files\n- Lazy loading ensures responsive UI even with hundreds of export folders\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "perf: optimize Export page loading with intelligent caching and lazy …",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T15:12:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4607db658864d804243ebd6e39a3005cc5ae98e2",
"body": "Current coverage is 56.4% but workflow was requiring 57%, causing\nmerge failures. Temporarily lowered threshold to enable merges while\nmaintaining progressive improvement toward 70% target.\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: lower test coverage threshold to 56% to allow merges",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T13:59:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4d240fb1a83c8711ed4421cb08a99fa13c007c51",
"body": "fix: Docker tagging strategy and documentation migration",
"is_bot": false,
"headline": "Merge pull request #69 from JohanDevl/develop",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T12:37:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e470e30e8afd89d343ceca56012549f9c61c4599",
"body": null,
"is_bot": false,
"headline": "Merge branch 'main' into develop",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T12:17:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d96daf55cca64855ab8593fd4ff675ba0a11348f",
"body": "- Change Docker tagging strategy to only apply latest/main tags on Git tag pushes\n- Prevent develop branch pushes from overriding latest tag\n- Ensure latest tag always points to the most recent semantic version release\n- Maintain develop tag exclusively for develop branch builds\n\nThis ensures latest tag remains on the stable main branch versions only.\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: restrict latest/main tags to semantic version tags only",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T12:16:52Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5f2868e3d400f376eac6c7f0226d325681bf6c5b",
"body": "- Remove DOCKER_STRATEGY.md and DOCKER_CHANGES.md from main repository\n- Update wiki submodule with comprehensive English Docker documentation\n- Consolidate all Docker-related information in centralized wiki\n\nThe Docker documentation is now available in English at:\nhttps://github.com/JohanDevl/Export_Trakt_4_Letterboxd/wiki/Docker\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: complete Docker documentation migration to wiki",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T12:10:42Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "285e696dc04efb16d2bc34b9225dd812bccbc1a8",
"body": "- Remove DOCKER_STRATEGY.md and DOCKER_CHANGES.md from main repository\n- Update CLAUDE.md to reference comprehensive Docker wiki documentation\n- Clean up redundant Docker documentation in favor of centralized wiki\n- Maintain quick usage examples while pointing to detailed wiki guide\n\nAll Docker docu\n[…]\ndated in the English wiki at:\nhttps://github.com/JohanDevl/Export_Trakt_4_Letterboxd/wiki/Docker\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: move Docker documentation to wiki and clean references",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T12:10:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "441b69e72e99eaab244693f6c1f3c7e347aa2ac4",
"body": "- Add back manual Git tag retrieval logic for branch pushes\n- Fix version detection for both tag pushes (direct) and branch pushes (latest tag)\n- Ensure semantic versions are properly applied to Docker images\n- Fix vulnerability scanning and testing to use correct version tags\n- Correct YAML syntax \n[…]\nk:\n- Tag push (v2.0.14) → uses tag directly\n- Branch push (main) → uses latest available Git tag\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: restore semantic version tagging for Docker images",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T11:47:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "585ef56ddd92c8c893f9103e14033fee2ba4cf5e",
"body": "- Remove push on main branch from docker-build.yml triggers\n- Add tag-based trigger (v*) to docker-build.yml for semantic versioning\n- Simplify versioning logic by removing manual Git tag retrieval\n- Remove manual workflow dispatch from auto-tag.yml (now uses automatic tag trigger)\n- Update document\n[…]\ns\n\nThis eliminates the previous double-build issue while maintaining proper semantic versioning.\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: eliminate double Docker build by optimizing workflow triggers",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T11:39:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "45c08347d534dfb33cd570f9d8643b807be0446b",
"body": "- Fix Docker image tagging to use actual Git version tags (v2.0.13) instead of SHA\n- Add automatic Git tag retrieval in docker-build.yml for main branch builds\n- Implement double-build system: immediate build + post-tag build for latest version\n- Add workflow synchronization between auto-tag.yml and\n[…]\n SHA instead of semantic versions.\nNow main branch builds will properly use v2.0.13 format tags.\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: implement proper semantic versioning for Docker images",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T11:26:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "26f6a30022a609d2c1ccaaa6d9b7d22a1e35e97d",
"body": "feat: implement intelligent Docker image management system",
"is_bot": false,
"headline": "Merge pull request #68 from JohanDevl/develop",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T11:14:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "efdf9bf2ac0af3b909b8a8a5c24b83c8f8e376ac",
"body": "- Add support for develop branch in docker-build workflow\n- Implement optimized tagging strategy (latest/main/v1.2.3 for main, develop for develop, PR-xxx for PRs)\n- Enable Docker image builds for pull requests to allow pre-merge testing\n- Add comprehensive cleanup system for obsolete Docker images\n\n[…]\ned documentation in DOCKER_STRATEGY.md\n- Update CLAUDE.md with new Docker management information\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: implement intelligent Docker image management system",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-29T10:44:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e64b9147011ff3cbd2eb1856f25c6ad84153b417",
"body": "feat: implement comprehensive OAuth 2.0 authentication and enhanced web interface",
"is_bot": false,
"headline": "Merge pull request #67 from JohanDevl/develop",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-12T21:56:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4082e26c9dd2438f166bff8db1a1a4a677f72fc6",
"body": "- Convert auth-error.html and auth-success.html from fragment templates to standalone complete HTML templates\n- Replace all h.templates.Clone() calls with direct h.templates.ExecuteTemplate() for thread-safety\n- Add comprehensive nil pointer checks and proper HTTP error handling to prevent panics\n- \n[…]\nad of crashes\nImproves: Template execution performance and eliminates race conditions under load\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: complete OAuth callback functionality with thread-safe templates",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-12T21:46:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "302b6fb60296c592e05617c6a487595c9e235acc",
"body": "Root Cause Analysis:\n- h.templates.Clone() was not thread-safe under concurrent requests\n- Multiple simultaneous requests to /auth-url caused template_clone_error\n- Stress test with 20 concurrent requests showed 100% failure (all 500 errors)\n\nSolution:\n- Converted auth-url.html from fragment ({{defi\n[…]\nplate_clone_error logs for auth-url endpoint\n- Maintained all original functionality and styling\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: resolve auth-url instability by fixing template concurrency issues",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-12T21:25:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "093e0c97688ecd7fc92572d2e9642bfcbbfaf6ab",
"body": "- Added proper error handling for template.Clone() in auth handler\n- Fixed missing error checks that were causing template_clone_error logs\n- Auth URL endpoint now works correctly in Docker container\n- Maintained proper error logging while providing user-friendly error messages\n\nThe issue was caused\n[…]\n_ := h.templates.Clone()`\nwhich could result in nil template causing subsequent parsing to fail.\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: resolve template clone error in auth-url handler",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-12T21:13:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f20e89e008a773b06ac78e33a82dc5287f730edf",
"body": "- Commented out initializeWebSocket() in app.js to stop infinite WebSocket connection attempts\n- WebSocket endpoints (/ws/status, /ws/export) return 501 Not Implemented but client was trying to reconnect every 5 seconds\n- This was causing performance issues with continuous failed connection attempts\n[…]\n9/ws/status\n- WebSocket functionality can be re-enabled when server-side implementation is added\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: disable WebSocket reconnection loops that consume app performance",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-12T21:04:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7d793271a5de7e7192125c55a7df084da4886604",
"body": "…responses\n\nUpdated the AuthHandler to properly parse and execute the auth-related templates (auth-error.html, auth-success.html, auth-url.html) through the base template. This ensures consistent rendering of content blocks and improves error handling by logging template parsing errors.\n\nChanges:\n- \n[…]\nemplate parsing failures\n- Ensured auth-error.html is consistently used for error responses\n\nThis addresses issues with template execution and enhances the user experience during authentication flows.",
"is_bot": false,
"headline": "fix: enhance template handling in auth handler for error and success …",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-12T18:15:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c56c6538f36098928b589be512560cd319b3e9f9",
"body": "Fix template execution in auth handler where auth-related templates\nwere being executed directly instead of through the base template.\nAll auth templates (auth-url.html, auth-error.html, auth-success.html)\ndefine content blocks that need to be rendered with base.html.\n\nChanges:\n- Modified auth handl\n[…]\nuth template executions for consistency\n- Resolves issue where /auth-url returned empty response\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: resolve empty response issue in /auth-url endpoint",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-12T18:05:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7c635ed00b1790b501b200d02dce4b12f912976d",
"body": "- Remove unnecessary search bar from export history interface\n- Implement server-side filtering for export type and status with URL persistence\n- Fix Export All button color consistency with other export buttons\n- Add comprehensive mobile responsive design with improved spacing\n- Enhance touch-frien\n[…]\nsing for better performance\n- Buttons: Consistent primary color scheme across all export actions\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: enhance export interface with improved filtering and mobile design",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-12T17:33:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "989a62567abc6a75dae4cd5d4916a36371ec26a3",
"body": "- Replace placeholder export handlers with actual async export execution\n- Add proper command-line argument building for export commands\n- Implement auto-refresh system for export list updates\n- Fix export buttons stuck in processing state with reset functionality\n- Add visual feedback with auto-ref\n[…]\nng and output capture\n- Remove WebSocket dependency for simpler, more reliable progress tracking\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: implement real export functionality and improve UI feedback",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-12T16:47:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d55fa33ba0726a9b7d13612d64bbcedec7048bff",
"body": "…tory\n\n- Add server-side pagination with configurable page sizes (5, 10, 20, 50, 100)\n- Implement AJAX lazy loading for seamless page navigation\n- Fix main.go to use proper web package instead of hardcoded implementation\n- Add pagination controls UI with first/previous/next/last navigation\n- Create \n[…]\ntion\n- Mobile-friendly responsive design\n- Full compatibility with existing export functionality\n\n🔧 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: implement complete server-side pagination system for export his…",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-12T16:23:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "496f08e03abd2e77e807e075744c861835f6d1f2",
"body": "Enhanced Web Interface with Modern Design",
"is_bot": false,
"headline": "Merge pull request #66 from JohanDevl/develop",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T16:42:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ceedc70f6d8adb6ff837616af9ee902923766244",
"body": "Removed pkg/webui directory copy from Dockerfile as this directory\nis empty and causing multi-platform Docker build to fail with:\n\"failed to calculate checksum: '/app/pkg/webui': not found\"\n\nThe web assets are properly handled by copying /app/web which contains\nall the necessary static files (CSS, JS, templates).\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: remove non-existent pkg/webui directory from Docker build",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T16:33:42Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "be791f2132cb724d11beb556aff19fa996bad613",
"body": "Added web static files (CSS, JS, templates) to Docker image build:\n- Copy web templates and static assets to container\n- Create web directories with proper permissions\n- Ensures enhanced web interface displays correctly in Docker\n\nResolves styling issues when running the web interface in containers\nwhere CSS and JavaScript files were missing from the image.\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: include web assets in Docker image for proper CSS/JS serving",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T16:28:11Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6901a8f6142be68be4191a3b49d644e892d6cd22",
"body": "Added extensive test coverage for web package components including:\n- Dashboard, status, exports, and auth handlers\n- Server functionality and middleware\n- File operations and utility functions\n- Edge cases and error handling\n\nThis increases overall code coverage from 50.8% to 57.0%, meeting the\nmin\n[…]\nests\n- Authentication flow and token status tests\n- System resource monitoring and health checks\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: add comprehensive tests for web package to improve code coverage",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T16:09:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "88aa96aad746bac0b5c58f90d52bc42610b81333",
"body": "feat: enhance web interface with improved export cards layout and static file serving",
"is_bot": false,
"headline": "Merge pull request #65 from JohanDevl/feature/enhanced-web-interface",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T15:59:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e0159ecd70bea5d28c9348e0bd8b1d3feed0228b",
"body": "Fixed import paths in web package handlers that were using incorrect\nlowercase 'j' in github.com/johandevl/ instead of the correct uppercase\n'J' in github.com/JohanDevl/. Also fixed configuration field references\nto use correct ExportDir from Letterboxd config and removed unused imports.\n\nThis resolves Go test failures in the web package caused by case-sensitive\nimport path conflicts.\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: correct import path case sensitivity issues in web handlers",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T15:55:05Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "43145937feb4892979139375f2723564402851fc",
"body": "- Add static file serving support to web server fallback implementation\n- Replace inline CSS with external stylesheet for consistent styling\n- Optimize export type cards layout with fixed width (180px) and centered grid\n- Remove text decoration from export cards to improve visual appearance\n- Update\n[…]\n CSS to ensure browser updates\n- Enhance responsive grid layout with proper spacing (1.5rem gap)\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: improve export cards layout and design in web interface",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T15:44:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b55b18c9d5f419ea9a5c638e76c5b7efb19ee79e",
"body": "…d functionality\n\n- Added a new web interface with a complete redesign for better user experience.\n- Implemented a responsive dashboard featuring real-time server status, authentication details, and export management.\n- Enhanced export management with detailed history, filtering options, and direct \n[…]\nScript for real-time updates and interactive elements.\n\nThis update transforms the user experience from a basic web server to a fully functional web application, enhancing usability and accessibility.",
"is_bot": false,
"headline": "feat: introduce enhanced web interface with modern design and improve…",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T14:50:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1b13d034fec5aedf1ffd1bdf3fe3b3de430e6d25",
"body": "feat: major feature release with OAuth 2.0 authentication and individual watch history export",
"is_bot": false,
"headline": "Merge pull request #64 from JohanDevl/develop",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T12:23:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4afdf2ed1fe97acd48ee6271420433f23b843eac",
"body": "- Update test expectation to match actual error message format\n- Fix TestOAuthManager_ParseCallbackURL_ErrorConditions test\n- Error message contains \"failed to parse callback URL\" not \"invalid callback URL\"\n- Ensures GitHub Actions CI pipeline passes\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: correct test assertion for ParseCallbackURL error message",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T12:04:48Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "866ed564122a2a3588c88e0b1a29db401651923b",
"body": "- Add comprehensive OAuth authentication tests in pkg/auth/oauth_simple_test.go\n- Add streaming processor tests in pkg/streaming/simple_test.go\n- Test token expiration logic, URL encoding, and error scenarios\n- Test batch processor configuration and memory efficient processing\n- Update go.mod depend\n[…]\ncoverage\n- pkg/streaming: New stream processor test coverage\n- Overall coverage: 55.5% → 57.1% ✅\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: improve code coverage from 55.5% to 57.1%",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T11:51:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "155b5e2f4db67707482faa8755c32fca1207992a",
"body": "**Documentation Updates:**\n\n**CLAUDE.md:**\n- Added comprehensive Export Modes section\n- Detailed explanation of aggregated vs individual modes\n- CLI usage examples and configuration options\n- Technical details about data sources and filtering\n- Benefits and use cases for each mode\n\n**README.md:**\n- \n[…]\neffectively choose between aggregated and individual export modes\nbased on their specific needs.\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: update documentation for individual watch history export mode",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T07:01:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ace1d67e42ff834cef03e7022d9e38cc6f4686d9",
"body": "…events\n\nThis commit implements a new export mode that captures individual watch\nevents instead of aggregated data, providing complete watch history with\nproper rewatch tracking and chronological ordering.\n\n**New Features:**\n- Individual history mode via --history-mode individual CLI option\n- Comple\n[…]\nLI help text for new --history-mode option\n- Comprehensive comments explaining new functionality\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add individual watch history export mode with complete viewing …",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T06:59:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ce1361d609362a71d5dbe3a6e9aeb72ffe72f784",
"body": null,
"is_bot": false,
"headline": "chore: update subproject commit reference in wiki",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T06:21:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1b58f53061856722643dfdcd2a87ea690677e9bf",
"body": "- Add NewClientWithTokenManager test in API package (40.1% coverage)\n- Add SetDefaults test in config package (90.1% coverage)\n- Add fetchRatings test in export package (77.4% coverage)\n- Add Keys method test in cache package for additional coverage\n- Increase overall coverage from 56.8% to 57.0% (meets CI requirement)\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: achieve 57.0% code coverage threshold",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T06:19:30Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "84a097123320160c32e3e7e6621343d838a2c1af",
"body": "- Add LRU cache tests covering basic operations (set, get, delete, clear)\n- Add token manager tests for initialization and basic functionality\n- Add streaming processor tests for batch processing\n- Improve coverage for performance/cache package to 38.8%\n- Bring overall coverage closer to 57% CI threshold\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: add tests to improve code coverage from 55.6% to 56.7%",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T06:10:09Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2e5d5bb6e5ee456613687344ea49a910405e9a19",
"body": "- Add nil safety check for API client in ExportMovies method\n- Update test calls to pass nil client (ratings will be skipped)\n- Ensure proper error handling when client is not provided\n- Fix test compilation errors after ExportMovies signature change\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: update ExportMovies tests for new API client parameter",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T06:02:25Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3a22b90ac4132020e06eba7c36fe3ef798ad2d59",
"body": "- Allow --schedule flag to work with server command\n- Start scheduler in background goroutine when server runs with --schedule\n- Modify startPersistentServer to accept schedule parameters\n- Update CLI logic to prevent scheduler-only mode when server is specified\n- Enable hybrid mode: manual exports via HTTP + automatic scheduled exports\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: enable concurrent scheduler and server modes",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T05:56:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "58420d0ad07e019cc67babccb545d28e49abe7e5",
"body": "- Deleted config.backup.toml and memory-test.toml to enhance security by removing sensitive API credentials.\n- Updated config.example.toml to provide a template with placeholders for client_id and client_secret, ensuring no real credentials are exposed.\n- This change improves security practices and aligns with best practices for handling sensitive information in configuration files.",
"is_bot": false,
"headline": "refactor: remove sensitive configuration files and update example",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T05:52:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "79ed9aa498d0a0d7be91524de85cee4e8329e6b3",
"body": "- Update ExportMovies method signature to accept *api.Client parameter\n- Replace internal fetchRatings call with client.GetRatings()\n- Ensures proper rating data retrieval using established API client\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: pass API client to ExportMovies for ratings fetch",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-11T05:35:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "101ae1e4743facdf7a9278b7093be69703019082",
"body": "- Add config.backup.toml as backup of current configuration\n- Add memory-test.toml for simplified memory backend testing\n- Memory backend successfully tested and working with OAuth authentication\n- Provides clean configuration examples for different deployment scenarios\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "config: add memory backend test configurations and backup",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-10T22:04:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "20e59684f5b1c20a3e5157d66047fb58161934ad",
"body": "- Add MemoryBackend for ephemeral token storage in RAM\n- Implement storeMemory, retrieveMemory, deleteMemory, listMemory methods\n- Add memory backend support in CLI main.go\n- Perfect for Docker environments to avoid file permission issues\n- Tokens are lost on container restart (user needs to re-authenticate)\n- Eliminates all file permission problems completely\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add memory backend for credential storage",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-10T21:55:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c82e496736343afadc4f3162a0173408c5cf3bdf",
"body": "- Add config.example.toml showing env backend setup for Docker\n- Update docker-compose.yml with TRAKT credentials as environment variables\n- This configuration resolves file permission issues in Docker environments\n- Environment variables are more secure and Docker-native for production\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "config: add Docker-compatible env backend configuration example",
"author_name": "Johan",
"author_login": "JohanDevl",
"committed_at": "2025-07-10T21:39:47Z",
"body_truncated": false,
"is_coding_agent": true
}
],
"releases_count": 40,
"commits_last_year": 47,
"latest_release_at": "2025-11-11T23:01:10Z",
"latest_release_tag": "v2.0.18",
"releases_from_tags": false,
"days_since_last_push": 37,
"active_weeks_last_year": 8,
"days_since_latest_release": 259,
"mean_days_between_releases": 19.1
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 100,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "github.com/JohanDevl/Export_Trakt_4_Letterboxd",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/JohanDevl/Export_Trakt_4_Letterboxd",
"is_deprecated": false,
"latest_version": "v1.2.4",
"repository_url": "https://github.com/JohanDevl/Export_Trakt_4_Letterboxd",
"versions_count": 23,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2025-03-24T22:28:31Z",
"latest_version_yanked": null,
"days_since_latest_publish": 491
}
]
},
"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": 19
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 31620,
"source_files_sampled": 127,
"oversized_source_files": 0,
"agent_instruction_files": [
"CLAUDE.md",
"pkg/api/CLAUDE.md",
"pkg/auth/CLAUDE.md",
"pkg/config/CLAUDE.md",
"pkg/errors/CLAUDE.md",
"pkg/export/CLAUDE.md",
"pkg/i18n/CLAUDE.md",
"pkg/logger/CLAUDE.md",
"pkg/monitoring/CLAUDE.md",
"pkg/performance/CLAUDE.md",
"pkg/resilience/CLAUDE.md",
"pkg/retry/CLAUDE.md",
"pkg/scheduler/CLAUDE.md",
"pkg/security/CLAUDE.md",
"pkg/streaming/CLAUDE.md",
"pkg/telemetry/CLAUDE.md",
"pkg/web/CLAUDE.md"
],
"agent_instruction_max_bytes": 15153
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [
{
"name": "go.opentelemetry.io/otel",
"direct": true,
"version": "1.36.0",
"severity": "high",
"ecosystem": "go",
"cvss_score": 7.5,
"advisory_ids": [
"GHSA-mh2q-q3fh-2475",
"GO-2026-5506"
],
"fixed_version": "1.41.0",
"advisory_count": 2,
"oldest_advisory_days": 112
},
{
"name": "go.opentelemetry.io/otel/sdk",
"direct": true,
"version": "1.36.0",
"severity": "high",
"ecosystem": "go",
"cvss_score": 7,
"advisory_ids": [
"GHSA-9h8m-3fm2-qjrq",
"GHSA-hfvc-g4fc-pqhx",
"GO-2026-4394",
"GO-2026-5426"
],
"fixed_version": "1.43.0",
"advisory_count": 4,
"oldest_advisory_days": 176
},
{
"name": "golang.org/x/text",
"direct": true,
"version": "0.25.0",
"severity": "unknown",
"ecosystem": "go",
"cvss_score": null,
"advisory_ids": [
"GO-2026-5970"
],
"fixed_version": "0.39.0",
"advisory_count": 1,
"oldest_advisory_days": 14
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "0.33.0",
"severity": "unknown",
"ecosystem": "go",
"cvss_score": null,
"advisory_ids": [
"GO-2026-5024"
],
"fixed_version": "0.44.0",
"advisory_count": 1,
"oldest_advisory_days": 67
}
],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {
"high": 2,
"unknown": 2
},
"advisory_count": 8,
"affected_count": 4,
"assessed_count": 36,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 3
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/BurntSushi/toml",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.3.2"
},
{
"name": "github.com/google/uuid",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.0"
},
{
"name": "github.com/nicksnyder/go-i18n/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.4.0"
},
{
"name": "github.com/prometheus/client_golang",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.22.0"
},
{
"name": "github.com/robfig/cron/v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.0.1"
},
{
"name": "github.com/sirupsen/logrus",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.9.3"
},
{
"name": "github.com/stretchr/testify",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.0"
},
{
"name": "github.com/zalando/go-keyring",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.2.6"
},
{
"name": "go.opentelemetry.io/otel",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.36.0"
},
{
"name": "go.opentelemetry.io/otel/exporters/jaeger",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.17.0"
},
{
"name": "go.opentelemetry.io/otel/sdk",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.36.0"
},
{
"name": "go.opentelemetry.io/otel/trace",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.36.0"
},
{
"name": "golang.org/x/text",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.25.0"
},
{
"name": "gopkg.in/gomail.v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.0.0-20160411212932-81ebce5c23df"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "github.com/burntsushi/toml",
"direct": true,
"version": "1.3.2",
"ecosystem": "go"
},
{
"name": "github.com/google/uuid",
"direct": true,
"version": "1.6.0",
"ecosystem": "go"
},
{
"name": "github.com/nicksnyder/go-i18n/v2",
"direct": true,
"version": "2.4.0",
"ecosystem": "go"
},
{
"name": "github.com/prometheus/client_golang",
"direct": true,
"version": "1.22.0",
"ecosystem": "go"
},
{
"name": "github.com/robfig/cron/v3",
"direct": true,
"version": "3.0.1",
"ecosystem": "go"
},
{
"name": "github.com/sirupsen/logrus",
"direct": true,
"version": "1.9.3",
"ecosystem": "go"
},
{
"name": "github.com/stretchr/testify",
"direct": true,
"version": "1.10.0",
"ecosystem": "go"
},
{
"name": "github.com/zalando/go-keyring",
"direct": true,
"version": "0.2.6",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel",
"direct": true,
"version": "1.36.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/exporters/jaeger",
"direct": true,
"version": "1.17.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/sdk",
"direct": true,
"version": "1.36.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/trace",
"direct": true,
"version": "1.36.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/text",
"direct": true,
"version": "0.25.0",
"ecosystem": "go"
},
{
"name": "gopkg.in/gomail.v2",
"direct": true,
"version": "2.0.0-20160411212932-81ebce5c23df",
"ecosystem": "go"
},
{
"name": "al.essio.dev/pkg/shellescape",
"direct": false,
"version": "1.5.1",
"ecosystem": "go"
},
{
"name": "github.com/beorn7/perks",
"direct": false,
"version": "1.0.1",
"ecosystem": "go"
},
{
"name": "github.com/cespare/xxhash/v2",
"direct": false,
"version": "2.3.0",
"ecosystem": "go"
},
{
"name": "github.com/danieljoos/wincred",
"direct": false,
"version": "1.2.2",
"ecosystem": "go"
},
{
"name": "github.com/davecgh/go-spew",
"direct": false,
"version": "1.1.1",
"ecosystem": "go"
},
{
"name": "github.com/go-logr/logr",
"direct": false,
"version": "1.4.2",
"ecosystem": "go"
},
{
"name": "github.com/go-logr/stdr",
"direct": false,
"version": "1.2.2",
"ecosystem": "go"
},
{
"name": "github.com/godbus/dbus/v5",
"direct": false,
"version": "5.1.0",
"ecosystem": "go"
},
{
"name": "github.com/gorilla/websocket",
"direct": false,
"version": "1.5.3",
"ecosystem": "go"
},
{
"name": "github.com/kylelemons/godebug",
"direct": false,
"version": "1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/munnerz/goautoneg",
"direct": false,
"version": "0.0.0-20191010083416-a7dc8b61c822",
"ecosystem": "go"
},
{
"name": "github.com/pmezard/go-difflib",
"direct": false,
"version": "1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/prometheus/client_model",
"direct": false,
"version": "0.6.1",
"ecosystem": "go"
},
{
"name": "github.com/prometheus/common",
"direct": false,
"version": "0.62.0",
"ecosystem": "go"
},
{
"name": "github.com/prometheus/procfs",
"direct": false,
"version": "0.15.1",
"ecosystem": "go"
},
{
"name": "github.com/stretchr/objx",
"direct": false,
"version": "0.5.2",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/auto/sdk",
"direct": false,
"version": "1.1.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/metric",
"direct": false,
"version": "1.36.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "0.33.0",
"ecosystem": "go"
},
{
"name": "google.golang.org/protobuf",
"direct": false,
"version": "1.36.5",
"ecosystem": "go"
},
{
"name": "gopkg.in/alexcesaro/quotedprintable.v3",
"direct": false,
"version": "3.0.0-20150716171945-2caba252f4dc",
"ecosystem": "go"
},
{
"name": "gopkg.in/yaml.v3",
"direct": false,
"version": "3.0.1",
"ecosystem": "go"
}
],
"collected": true,
"truncated": false,
"total_count": 36,
"direct_count": 14,
"indirect_count": 22
}
},
"maintainership": {
"issues": {
"open_prs": 7,
"merged_prs": 58,
"open_issues": 12,
"closed_ratio": 0.455,
"closed_issues": 10,
"closed_unmerged_prs": 8
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "JohanDevl",
"commits": 369,
"avatar_url": "https://avatars.githubusercontent.com/u/26220620?v=4"
},
{
"type": "User",
"login": "u2pitchjami",
"commits": 13,
"avatar_url": "https://avatars.githubusercontent.com/u/149841209?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.966
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"auto-tag.yml",
"docker-publish.yml"
],
"has_docs_dir": true,
"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": 10,
"reason": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
"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/6 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": 10,
"reason": "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": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow 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": 9,
"reason": "SAST tool is not run on all commits -- score normalized to 9",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"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": 5,
"reason": "5 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "f88c7b23e53441fed1d1253766e98cac97aca97a",
"ran_at": "2026-07-29T07:07:46Z",
"aggregate_score": 4.9,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-23T06:11:54Z",
"oldest_open_prs": [
{
"number": 91,
"created_at": "2026-03-24T10:12:08Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 92,
"created_at": "2026-03-24T10:12:49Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 93,
"created_at": "2026-03-24T10:12:57Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 94,
"created_at": "2026-04-08T20:51:42Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 95,
"created_at": "2026-04-24T20:05:40Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 96,
"created_at": "2026-06-15T04:14:42Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 97,
"created_at": "2026-06-22T04:15:12Z",
"last_comment_at": "2026-06-22T04:15:12Z",
"last_comment_author": "dependabot"
}
],
"last_merged_pr_at": "2026-03-24T10:10:56Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 16,
"created_at": "2025-03-23T17:39:43Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 19,
"created_at": "2025-03-23T17:40:09Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 23,
"created_at": "2025-03-23T17:40:43Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 72,
"created_at": "2025-07-29T20:02:57Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 73,
"created_at": "2025-07-29T20:03:12Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 74,
"created_at": "2025-07-29T20:03:37Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 75,
"created_at": "2025-07-29T20:03:59Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 76,
"created_at": "2025-07-29T20:04:24Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 77,
"created_at": "2025-07-29T20:04:50Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 78,
"created_at": "2025-07-29T20:05:20Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 79,
"created_at": "2025-07-29T20:05:57Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 80,
"created_at": "2025-07-29T20:06:46Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/JohanDevl/Export_Trakt_4_Letterboxd",
"host": "github.com",
"name": "Export_Trakt_4_Letterboxd",
"owner": "JohanDevl"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"security": 51,
"vitality": 55,
"community": 43,
"governance": 46,
"engineering": 71
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "moderate",
"name": "Vitality",
"value": 55,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "at_risk",
"name": "Development activity",
"note": null,
"notes": [],
"value": 39,
"inputs": {
"commits_last_year": 47,
"human_commit_share": 1,
"days_since_last_push": 37,
"active_weeks_last_year": 8
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 37 days ago",
"points": 18,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 37
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "8/52 weeks with commits",
"points": 5.5,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 8
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "47 commits in the last year",
"points": 15.1,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 47
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "good",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 78,
"inputs": {
"releases_count": 40,
"latest_release_tag": "v2.0.18",
"releases_from_tags": false,
"days_since_latest_release": 259,
"mean_days_between_releases": 19.1
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "40 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 40
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 259 days ago",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "release_recency",
"params": {
"days": 259
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~19.1 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 19.1
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 126,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 126 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 126
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 43,
"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": "excellent",
"name": "Community health",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"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": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 13.5,
"status": "met",
"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": 6.3,
"status": "met",
"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": 46,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 12,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.966
},
"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 97% of commits",
"points": 0.8,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 97
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"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": "moderate",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"merged_prs": 58,
"open_issues": 12,
"closed_issues": 10,
"issue_closed_ratio": 0.455,
"closed_unmerged_prs": 8
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "46% of issues closed",
"points": 21.3,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 46
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "58/66 decided PRs merged",
"points": 33.6,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 58,
"decided": 66
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/6 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 51,
"inputs": {
"followers": 7,
"owner_type": "User",
"is_verified": null,
"owner_login": "JohanDevl",
"public_repos": 47,
"account_age_days": 3431
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "7 followers of JohanDevl",
"points": 6.5,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 7,
"login": "JohanDevl"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "47 public repos, account ~9 yr old",
"points": 24.2,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 47
}
},
{
"code": "account_age_years",
"params": {
"years": 9
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "good",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 79,
"inputs": {
"packages": [
"github.com/JohanDevl/Export_Trakt_4_Letterboxd"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 491
},
"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 491 days ago",
"points": 14,
"status": "partial",
"details": [
{
"code": "publish_recency",
"params": {
"days": 491
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "23 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 23
}
}
],
"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": "good",
"name": "Engineering Quality",
"value": 71,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 68,
"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": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"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": 25,
"status": "met",
"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": "moderate",
"name": "Security",
"value": 51,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 50,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 4.9
},
"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": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"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/6 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": "update tool detected",
"points": 7.5,
"status": "met",
"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": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"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": "SAST tool is not run on all commits -- score normalized to 9",
"points": 4.5,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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": "5 existing vulnerabilities detected",
"points": 3.8,
"status": "partial",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "moderate",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories. Remaining weights renormalized. Matched 36 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 36
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 54,
"inputs": {
"source": "osv",
"advisories": 8,
"affected_packages": 4,
"assessed_packages": 36,
"unassessed_packages": 0,
"affected_by_severity": "high 2, unknown 2",
"direct_affected_packages": 3
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "3 affected: go.opentelemetry.io/otel 1.36.0 (high 7.5), go.opentelemetry.io/otel/sdk 1.36.0 (high 7.0), golang.org/x/text 0.25.0 (unknown)",
"points": 11.2,
"status": "partial",
"details": [
{
"code": "advisories_affected",
"params": {
"count": 3,
"packages": "go.opentelemetry.io/otel 1.36.0 (high 7.5), go.opentelemetry.io/otel/sdk 1.36.0 (high 7.0), golang.org/x/text 0.25.0 (unknown)"
}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "2 advisory-carrying package(s) unaddressed past 90 days; oldest published 176 days ago",
"points": 29.4,
"status": "partial",
"details": [
{
"code": "advisories_stale",
"params": {
"days": 90,
"count": 2,
"oldest": 176
}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 36,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 3
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"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": 75,
"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": 0.96,
"agent_instruction_files": [
"CLAUDE.md",
"pkg/api/CLAUDE.md",
"pkg/auth/CLAUDE.md",
"pkg/config/CLAUDE.md",
"pkg/errors/CLAUDE.md",
"pkg/export/CLAUDE.md",
"pkg/i18n/CLAUDE.md",
"pkg/logger/CLAUDE.md",
"pkg/monitoring/CLAUDE.md",
"pkg/performance/CLAUDE.md",
"pkg/resilience/CLAUDE.md",
"pkg/retry/CLAUDE.md",
"pkg/scheduler/CLAUDE.md",
"pkg/security/CLAUDE.md",
"pkg/streaming/CLAUDE.md",
"pkg/telemetry/CLAUDE.md",
"pkg/web/CLAUDE.md"
],
"agent_instruction_max_bytes": 15153
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "CLAUDE.md, pkg/api/CLAUDE.md, pkg/auth/CLAUDE.md, pkg/config/CLAUDE.md, pkg/errors/CLAUDE.md, pkg/export/CLAUDE.md, pkg/i18n/CLAUDE.md, pkg/logger/CLAUDE.md, pkg/monitoring/CLAUDE.md, pkg/performance/CLAUDE.md, pkg/resilience/CLAUDE.md, pkg/retry/CLAUDE.md, pkg/scheduler/CLAUDE.md, pkg/security/CLAUDE.md, pkg/streaming/CLAUDE.md, pkg/telemetry/CLAUDE.md, pkg/web/CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "CLAUDE.md, pkg/api/CLAUDE.md, pkg/auth/CLAUDE.md, pkg/config/CLAUDE.md, pkg/errors/CLAUDE.md, pkg/export/CLAUDE.md, pkg/i18n/CLAUDE.md, pkg/logger/CLAUDE.md, pkg/monitoring/CLAUDE.md, pkg/performance/CLAUDE.md, pkg/resilience/CLAUDE.md, pkg/retry/CLAUDE.md, pkg/scheduler/CLAUDE.md, pkg/security/CLAUDE.md, pkg/streaming/CLAUDE.md, pkg/telemetry/CLAUDE.md, pkg/web/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": "96 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 96,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 71,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.36,
"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": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "36 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 36,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "dependency automation configured, none observed in the sampled commits",
"points": 5,
"status": "partial",
"details": [
{
"code": "dependency_bot_config_only",
"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": 31620,
"source_files_sampled": 127,
"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/127 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 127,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"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": [],
"report_type": "repository",
"generated_at": "2026-07-29T07:08:02.214645Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/JohanDevl/Export_Trakt_4_Letterboxd.svg",
"full_name": "JohanDevl/Export_Trakt_4_Letterboxd",
"license_state": "standard",
"license_spdx": "MIT"
}