Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-29 07:08 UTC

JohanDevl / Export_Trakt_4_Letterboxd

The purpose of this script is to export Trakt movies watchlist to csv file for manual Letterboxd import

GoMIT★ 0 estrellas⑂ 0 forksdesde mar 2025Ver en GitHub ↗

JohanDevl/Export_Trakt_4_Letterboxd tiene un índice de salud de 53 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es AI Readiness (75/100) y la más baja, Community & Adoption (43/100). Se actualizó por última vez hace 37 días. Una sola persona concentra la mayor parte del trabajo reciente.

53
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

53
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

JohanCuenta personal
7 seguidores47 repositorios públicosdesde mar 2017

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/JohanDevl/Export_Trakt_4_Letterboxdv1.2.4-23hace 491 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

55Moderado · 22% del índice global
Cómo se puntúa
18/36Recencia de push — último push hace 37 días
5.5/36Cadencia de commits — 8/52 semanas con commits
15.1/18Volumen de commits — 47 commits en el último año
0/10OpenSSF Scorecard: Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Datos de entrada utilizados
commits_last_year47
human_commit_share1
days_since_last_push37
active_weeks_last_year8
Cómo se puntúa
27/27Publica versiones — 40 versiones publicadas
16.2/36Recencia de las versiones — última versión hace 259 días
27/27Cadencia de publicación — una versión cada ~19,1 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count40
latest_release_tagv2.0.18
releases_from_tagsno
days_since_latest_release259
mean_days_between_releases19,1
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

43En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_template

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

46En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.8/22.5Distribución de commits — el principal contribuyente firma el 97% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,966
Cómo se puntúa
21.3/46.8Resolución de issues — 46% de issues cerradas
33.6/38.3Aceptación de PR — 58/66 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/6 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs58
open_issues12
closed_issues10
issue_closed_ratio0,455
closed_unmerged_prs8
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
6.5/25Alcance del propietario — 7 seguidores de JohanDevl
24.2/25Trayectoria — 47 repos públicos, cuenta de ~9 años
Datos de entrada utilizados
followers7
owner_typeUser
is_verified
owner_loginJohanDevl
public_repos47
account_age_days3431
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
14/35Recencia de publicación — última publicación hace 491 días
20/20Historial de versiones — 23 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/JohanDevl/Export_Trakt_4_Letterboxd
ecosystemsgo
any_deprecatedno
min_days_since_publish491

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

71Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 4 out of 4 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

51Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 4 out of 4 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/6 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
4.5/5SAST — SAST tool is not run on all commits -- score normalized to 9
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
3.8/7.5Vulnerabilities — 5 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,9
Excluidos de la puntuación (sin datos o no aplicable): signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
11.2/35Dependencias directas libres de avisos conocidos — 3 afectados: 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)
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
29.4/40Sin avisos pendientes — 2 paquete(s) con avisos sin atender más allá de 90 días; el más antiguo publicado hace 176 días
Datos de entrada utilizados
sourceosv
advisories8
affected_packages4
assessed_packages36
unassessed_packages0
affected_by_severityhigh 2, unknown 2
direct_affected_packages3
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos. Los pesos restantes se han renormalizado. Se cotejaron 36 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

75Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — 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
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 96 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,96
agent_instruction_filesCLAUDE.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_bytes15.153
Cómo se puntúa
12.6/18Arranque con un solo comando — go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — Dockerfile, lockfile
10/10Práctica demostrada con agentes — 36 de los últimos 100 commits con autoría o crédito de agente
5/8Mantenimiento automatizado — automatización de dependencias configurada, no observada en los commits muestreados
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,36
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/127 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes31.620
source_files_sampled127
oversized_source_files0
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

0estrellas de GitHub
2contribuidores
47commits en los últimos 12 meses
37días desde el último push
40versiones publicadas
1factor bus
12issues abiertas
Goecosistemas de paquetes

Más detalle

OpenSSF Scorecard 4.9 / 10
4.9agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-29 07:07 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests4 out of 4 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/6 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintained0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
9SASTSAST tool is not run on all commits -- score normalized to 9
10Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
5Vulnerabilities5 existing vulnerabilities detected
Dependencias directas 14
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/BurntSushi/tomlv1.3.2go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/nicksnyder/go-i18n/v2v2.4.0go.mod
Gogithub.com/prometheus/client_golangv1.22.0go.mod
Gogithub.com/robfig/cron/v3v3.0.1go.mod
Gogithub.com/sirupsen/logrusv1.9.3go.mod
Gogithub.com/stretchr/testifyv1.10.0go.mod
Gogithub.com/zalando/go-keyringv0.2.6go.mod
Gogo.opentelemetry.io/otelv1.36.0go.mod
Gogo.opentelemetry.io/otel/exporters/jaegerv1.17.0go.mod
Gogo.opentelemetry.io/otel/sdkv1.36.0go.mod
Gogo.opentelemetry.io/otel/tracev1.36.0go.mod
Gogolang.org/x/textv0.25.0go.mod
Gogopkg.in/gomail.v2v2.0.0-20160411212932-81ebce5c23dfgo.mod
Todas las dependencias 36

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 14 paquetes directos y 22 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
Gogithub.com/burntsushi/toml1.3.2directa
Gogithub.com/google/uuid1.6.0directa
Gogithub.com/nicksnyder/go-i18n/v22.4.0directa
Gogithub.com/prometheus/client_golang1.22.0directa
Gogithub.com/robfig/cron/v33.0.1directa
Gogithub.com/sirupsen/logrus1.9.3directa
Gogithub.com/stretchr/testify1.10.0directa
Gogithub.com/zalando/go-keyring0.2.6directa
Gogo.opentelemetry.io/otel1.36.0directa
Gogo.opentelemetry.io/otel/exporters/jaeger1.17.0directa
Gogo.opentelemetry.io/otel/sdk1.36.0directa
Gogo.opentelemetry.io/otel/trace1.36.0directa
Gogolang.org/x/text0.25.0directa
Gogopkg.in/gomail.v22.0.0-20160411212932-81ebce5c23dfdirecta
Goal.essio.dev/pkg/shellescape1.5.1indirecta
Gogithub.com/beorn7/perks1.0.1indirecta
Gogithub.com/cespare/xxhash/v22.3.0indirecta
Gogithub.com/danieljoos/wincred1.2.2indirecta
Gogithub.com/davecgh/go-spew1.1.1indirecta
Gogithub.com/go-logr/logr1.4.2indirecta
Gogithub.com/go-logr/stdr1.2.2indirecta
Gogithub.com/godbus/dbus/v55.1.0indirecta
Gogithub.com/gorilla/websocket1.5.3indirecta
Gogithub.com/kylelemons/godebug1.1.0indirecta
Gogithub.com/munnerz/goautoneg0.0.0-20191010083416-a7dc8b61c822indirecta
Gogithub.com/pmezard/go-difflib1.0.0indirecta
Gogithub.com/prometheus/client_model0.6.1indirecta
Gogithub.com/prometheus/common0.62.0indirecta
Gogithub.com/prometheus/procfs0.15.1indirecta
Gogithub.com/stretchr/objx0.5.2indirecta
Gogo.opentelemetry.io/auto/sdk1.1.0indirecta
Gogo.opentelemetry.io/otel/metric1.36.0indirecta
Gogolang.org/x/sys0.33.0indirecta
Gogoogle.golang.org/protobuf1.36.5indirecta
Gogopkg.in/alexcesaro/quotedprintable.v33.0.0-20150716171945-2caba252f4dcindirecta
Gogopkg.in/yaml.v33.0.1indirecta
Avisos de dependencias 4

Este repositorio no publica ningún paquete que el índice resuelva, así que se evaluó su propio grafo de dependencias — 36 paquetes, que incluyen también fijaciones de desarrollo y prueba que nunca se distribuyen: 4 tienen avisos conocidos, de los cuales 3 son directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
go.opentelemetry.io/otel1.36.0directaalta21.41.0
go.opentelemetry.io/otel/sdk1.36.0directaalta41.43.0
golang.org/x/text0.25.0directadesconocida10.39.0
golang.org/x/sys0.33.0indirectadesconocida10.44.0

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasGo.