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

0xMoonrise / gochive

My personal archive to store PDF and markdown files

Go · JavaScript · CSSSin licencia detectada★ 0 estrellas⑂ 0 forksdesde jun 2025Ver en GitHub ↗

0xMoonrise/gochive tiene un índice de salud de 41 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es Vitality (83/100) y la más baja, Community & Adoption (12/100). Se actualizó por última vez hace 1 día. Una sola persona concentra la mayor parte del trabajo reciente.

41
global / 100
En riesgo

Í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.

41
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

Carlos NuñezCuenta personal
8 seguidores12 repositorios públicosdesde mar 2019

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/0xMoonrise/gochivev1.2.0-6hace 1 día

Métricas por categoría

Vitalidad

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

83Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 1 días
8.3/36Cadencia de commits — 12/52 semanas con commits
17.1/18Volumen de commits — 80 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year80
human_commit_share1
days_since_last_push1
active_weeks_last_year12
Cómo se puntúa
27/27Publica versiones — 5 versiones publicadas
36/36Recencia de las versiones — última versión hace 1 días
27/27Cadencia de publicación — una versión cada ~1,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count5
latest_release_tagv1.2.0
releases_from_tagsno
days_since_latest_release1
mean_days_between_releases1,3
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?

12Crítico · 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
0/22.5Licencia — no se detectó ningún archivo de licencia
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_licenseno
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

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

35En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
6.9/25Alcance del propietario — 8 seguidores de 0xMoonrise
20.1/25Trayectoria — 12 repos públicos, cuenta de ~7 años
Datos de entrada utilizados
followers8
owner_typeUser
is_verified
owner_login0xMoonrise
public_repos12
account_age_days2678
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
35/35Recencia de publicación — última publicación hace 1 días
20/20Historial de versiones — 6 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/0xMoonrise/gochive
ecosystemsgo
any_deprecatedno
min_days_since_publish1

Calidad de Ingeniería

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

38En riesgo · 20% del índice global
Cómo se puntúa
0/24Flujos de trabajo de CI
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_cino
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

50Moderado
Cómo se puntúa
30/30README
0/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_dirno
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?

28Crítico · 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
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — sin datos
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5Licencia — license file not detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate2,8
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, dangerous_workflow, packaging, signed_releases, token_permissions. Los pesos restantes se han renormalizado.

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.

57Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
30.9/40Historial de commits legible — 58 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,58
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
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
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
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_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
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/40 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes10.953
source_files_sampled40
oversized_source_files0

Datos clave

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

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 2.8 / 10
2.8agregado

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-25 11:32 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
n/dDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
7Vulnerabilities3 existing vulnerabilities detected
Dependencias directas 14
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/BurntSushi/tomlv1.6.0go.mod
Gogithub.com/aws/aws-sdk-go-v2v1.42.1go.mod
Gogithub.com/aws/aws-sdk-go-v2/configv1.32.28go.mod
Gogithub.com/aws/aws-sdk-go-v2/credentialsv1.19.27go.mod
Gogithub.com/aws/aws-sdk-go-v2/feature/s3/transfermanagerv0.3.0go.mod
Gogithub.com/aws/aws-sdk-go-v2/service/s3v1.105.0go.mod
Gogithub.com/chai2010/webpv1.4.0go.mod
Gogithub.com/go-chi/chi/v5v5.3.1go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/klippa-app/go-pdfiumv1.17.2go.mod
Gogithub.com/mattn/go-sqlite3v1.14.33go.mod
Gogithub.com/pressly/goose/v3v3.26.0go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 299,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 58868,
        "CSS": 9738,
        "HTML": 4050,
        "Shell": 2627,
        "Makefile": 743,
        "Dockerfile": 607,
        "JavaScript": 12634
      },
      "pushed_at": "2026-07-24T07:45:35Z",
      "created_at": "2025-06-11T10:24:41Z",
      "owner_type": "User",
      "updated_at": "2026-07-24T07:45:51Z",
      "description": "My personal archive to store PDF and markdown files",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "JavaScript",
        "CSS"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Carlos Nuñez",
      "type": "User",
      "login": "0xMoonrise",
      "company": null,
      "location": null,
      "followers": 8,
      "avatar_url": "https://avatars.githubusercontent.com/u/48922521?v=4",
      "created_at": "2019-03-25T16:33:49Z",
      "is_verified": null,
      "public_repos": 12,
      "account_age_days": 2678
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-07-24T07:43:22Z"
        },
        {
          "tag": "v1.1.1",
          "kind": "patch",
          "published_at": "2026-07-21T08:31:40Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-07-21T00:13:11Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-07-20T01:53:23Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-07-19T01:09:17Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "cfe7f9f1e145f9396f7e404a2161fdf5703f7d0b",
          "body": null,
          "is_bot": false,
          "headline": "Fix typo in README for server command",
          "author_name": "Carlos Nuñez",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-24T07:45:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1d835b4a2d0e87f8705c7487cbb3a6604311f3a",
          "body": "Replace manual sync.WaitGroup + semaphore + error-channel patterns\nwith golang.org/x/sync/errgroup across backup, restore, and thumbnail\ngeneration, and migrate HTTP routing from net/http's ServeMux to chi.\n\nBackup/restore/generate:\n- errgroup.Group with SetLimit for bounded concurrency, replacing\n \n[…]\nware\n  composition and chi/middleware.Logger\n- add a FileServer helper with Cache-Control headers for static\n  asset routes, replacing the old fromFS helper\n- rename the `server` subcommand to `serve`",
          "is_bot": false,
          "headline": "refactor: switch concurrency to errgroup, migrate to chi router",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-24T07:39:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df1ee67bd2c16fce14387ccf9fbdff5ff38583f8",
          "body": "Wrap http.ResponseWriter to capture the status code passed to\nWriteHeader, since it isn't otherwise observable after the handler\nruns. Previously request logs had no way to distinguish a 200 from\na 500.",
          "is_bot": false,
          "headline": "feat: log the response status code in the logging middleware",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-21T08:29:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f709a7c9216da759b755239bb75ee5a1b8ba0613",
          "body": "Move the HTTP server into a `server` subcommand alongside the\nexisting backup/restore/generate/upload_archive/status/version\ncommands. cmd/gochive-cli is removed; everything now lives in\ncmd/gochive under a single Cobra root.\n\nOld: `gochive` (server only) + `gochive-cli <cmd>` (maintenance)\nNew: `gochive server` + `gochive <cmd>` (maintenance), one binary\n\nUpdate the Dockerfile CMD, Makefile `all` target, and README to\nreflect the single-binary usage. Bump VERSION to 1.1.0.",
          "is_bot": false,
          "headline": "refactor: merge gochive and gochive-cli into a single binary",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-21T00:10:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d88d28bc1d7ba2199c5f83d68b0180bb39fbf9f0",
          "body": "godotenv was only used to load a .env file in TestMain, a remnant\nfrom before the config.toml migration; tests already build their\nconfig directly via newTestConfig(). Remove the dependency, the\nnow-unused projectRoot() helper, and TestMain itself.",
          "is_bot": false,
          "headline": "chore: drop leftover godotenv usage and dead TestMain from test suite",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-20T01:01:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb7b17da5aea34d482ebb9911d57192fcca2db50",
          "body": "- Add slog info messages when items are backed up or restored.\n- Remove hardcoded timeouts and pass cmd.Context() to thumbnail generation and file downloading functions.\n- Clean up unused time import and remove redundant .env include from Makefile.",
          "is_bot": false,
          "headline": "cli: add logs to backup/restore and pass command context down",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-19T01:04:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65cff86ac2c0b0401fafdded7628876e605f2a46",
          "body": null,
          "is_bot": false,
          "headline": "docs: document native backup/restore, remove obsolete config.backup",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-18T21:58:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcee0f598ffccdf45f14489c359dacbe6a5e172d",
          "body": "Drop the grsync/rsync dependency in favor of backup/restore commands\nthat understand gochive's actual storage layout instead of syncing\nraw directory trees.\n\n- backup: streams each archived file/thumbnail from the storage\n  backend to local disk (bounded concurrency via a worker pool),\n  snapshots t\n[…]\nase and config\n- Backup destination is now a required -p/--path flag instead of a\n  configured `backup` field; remove Config.Backup and drop it from\n  config.example.toml and the status command output",
          "is_bot": false,
          "headline": "feat: replace rsync-based backup/restore with native Go implementation",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-18T10:05:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c8024904115fd50d5efd72725e81e76ef4551f60",
          "body": "X-Real-IP is set by a single reverse proxy directly and can't be\nlist-spoofed the way X-Forwarded-For can (a client can prepend\narbitrary values to X-Forwarded-For before it reaches the proxy).\nFalls back to RemoteAddr when the header is absent.",
          "is_bot": false,
          "headline": "refactor: prefer X-Real-IP over X-Forwarded-For in clientIP",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-18T03:13:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6289aa04135a541f5219da5102f364e04a4c9b08",
          "body": "Replace gin.Engine with http.ServeMux (Go 1.22+ method+pattern\nrouting) across all handlers, the server, and tests. Drops the Gin\ndependency entirely.\n\n- Add internal/handlers/helpers.go: JSON/Error/render response\n  helpers, DecodeJSON, fromStorageObject, parseID\n- Add internal/handlers/responses.g\n[…]\nL renderer\n- Switch cmd/gochive/main.go to net.Listen + http.Serve for explicit\n  bind-error handling before serving\n- Update all handler tests to build routes on http.ServeMux instead\n  of gin.Engine",
          "is_bot": false,
          "headline": "refactor: migrate HTTP layer from Gin to net/http",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-18T02:54:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c5d3deaeb7c21b4af3684be915bc4db5a140ab8e",
          "body": "Matches the StatusUnauthorized -> StatusBadRequest change made to\nSetEditFile",
          "is_bot": false,
          "headline": "test: update expected status for invalid extension edit to 400",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-17T09:55:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57b03952c5e4b8a23ad398cac527de3a72d823cd",
          "body": "- Add filename/editorial length limit (255 chars) on upload, upload_archive, and edit endpoints\n- Sanitize rendered markdown with DOMPurify before injecting into the DOM, switch mermaid to strict security level\n- Replace go-sanitize XSS calls in editFile.go\n- Bump Go to 1.26.1\n- Rework setup.sh to i\n[…]\nll JS deps via a data-driven loop over the npm registry, vendor marked locally instead of loading it from a CDN, bump pdf.js to 6.1.200\n- Minor cleanup: import ordering, defer placement in generate.go",
          "is_bot": false,
          "headline": "harden input validation and markdown rendering, refresh vendored assets",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-17T08:46:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2c50ff6e4df1974a29dd0ecfe3e17d353bb4dac9",
          "body": "Replace godotenv/.env with a TOML config file (config.example.toml\nas a documented template), resolved in order from GOCHIVE_CONFIG,\n/opt/gochive/config.toml, ./config.toml, and\n~/.config/gochive/config.toml. Startup now fails explicitly if none\nof these exist, instead of silently falling back to un\n[…]\neal config.toml from disk, so tests can't\n  fail or run against production paths depending on host state\n- Document the new config format, S3 secret overrides, and the\n  Docker mount changes in README",
          "is_bot": false,
          "headline": "feat: migrate configuration from env vars to TOML file",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-16T10:42:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "99e551bc1680815ba82529c9c1b800e9c4773e0e",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-15T10:19:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85c478208ff5b7d7a216ad55e058ea1b7b4baa81",
          "body": "…type detection\n\n- setupTestApp now asserts errors from app.Run() instead of\n  discarding them; splits config init from DB/storage init so test\n  overrides (Data, FS.Root) apply before those stages bootstrap\n- gochive-cli's Cobra root Use renamed to match the binary name\n- fsClient.GetItem now uses utils.DetectContentType instead of a\n  separate http.DetectContentType + empty-string fallback",
          "is_bot": false,
          "headline": "fix: check bootstrap errors in tests, align CLI name, dedupe content-…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-15T10:13:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "560e760bad4d04b1e8ef9135242bc1df980c6715",
          "body": "…mmand\n\n- Add internal/core/app.go: App.Run(stages...) replaces the repeated\n  config/storage/db init in main.go, root.go, and each CLI command\n- Each CLI command now builds its own *core.App and picks stages via\n  PreRunE/PostRunE; drop root.go's shared PersistentPreRunE\n- Add `status` command (pri\n[…]\nread from a fresh bytes.Reader instead of\n  the already-drained buffer\n- Update Makefile sqlc path and handlers_test.go for the new bootstrap\n- Minor formatting/error-wrap cleanup in mode.go, utils.go",
          "is_bot": false,
          "headline": "refactor: add staged App bootstrap (config/storage/db), CLI status co…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-15T09:00:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a1fa77141bb5f21e5f61e0049c43cb302419e25",
          "body": "- Extract utils.DetectContentType(data []byte) to replace the\n  repeated http.DetectContentType + sniff-length clamping in\n  uploadFile.go and uploadArchive.go\n- Check tx.Commit() errors in UploadFile (markdown early-return and\n  final success path); previously ignored, so a failed commit could\n  report success to the client while the DB row was never persisted\n- Switch uploadArchive.go's download from io.ReadAll to io.Copy into\n  a bytes.Buffer, using the copied byte count instead of len()",
          "is_bot": false,
          "headline": "refactor: dedupe content-type detection, fix unchecked tx.Commit errors",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-11T19:32:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a129dee7c9064a6ed0829c2cdb6550120119454",
          "body": null,
          "is_bot": false,
          "headline": "fix: validate page cookie and retry from page 1 on failed fetch",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-10T22:12:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6503a18f05a4ce5bd2370a17d3c8c1f7ebb7545c",
          "body": "…l content-type\n\n- SetFavorite and SearchFiles now check and log previously ignored\n  query errors instead of silently returning 200/continuing with\n  stale data\n- DeleteFile no longer returns 304 (Not Modified) on DB fetch/delete\n  failures, uses 400 consistently, since 500 is reserved for\n  unexpe\n[…]\nng in \"pdf\"/\"md\" without requiring a dot\n- Fixed copy-pasted log messages in SetEditFile that referenced\n  \"search file\" instead of the actual operation\n- Normalized log message casing across handlers",
          "is_bot": false,
          "headline": "fix(handlers): check ignored errors, correct status codes, detect rea…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-10T22:06:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3fcf90db28aae33a455c915fdf9a6c5ce209f92c",
          "body": "…rsal\n\nGetImage previously joined the raw \":name\" path param directly into\nthe storage key without validation, unlike GetFile which already\nrequired a numeric id. Although gin's single-segment param matching\nprevents \"/\" from reaching the handler, relying solely on that\nbehavior was an implicit assu\n[…]\n from :name to :id (images are always stored\n  under numeric ids, never arbitrary filenames)\n- Reject non-numeric ids with 400 before touching storage\n- Update tests and route registration accordingly",
          "is_bot": false,
          "headline": "fix(images): validate id as numeric in GetImage to prevent path trave…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-10T21:15:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b53d0eb177aa5ee7872bf86f102d5ce16e464a02",
          "body": "- Document the gochive-cli binary and its subcommands (backup, restore,\n  generate, upload_archive, version)\n- Add ROOT/DATA/BACKUP env vars to the configuration table, with a note\n  on why storage and DB paths are separate\n- Clarify that backup/restore sync only DATA <-> BACKUP via rsync -avu,\n  in\n[…]\ning bounded thumbnail\n  concurrency, capped/context-scoped URL downloads, and the\n  transaction/AUTOINCREMENT rollback guarantee\n- Fix docker run example to include -d, and minor formatting/typo fixes",
          "is_bot": false,
          "headline": "docs: rewrite README to reflect CLI, config, and backup workflow",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-10T20:33:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f06275e7d3ef33b59b8d167ac187f4c871c1121e",
          "body": "- rename `cmd/cli` to `cmd/gochive-cli`\n- remove unnecessary `CGO_ENABLED` and `LDFLAGS` usage from the Makefile\n- update database and migration commands to use `$(DATA)/gochive.db`\n- remove backup/restore Makefile targets\n- load configuration from `/opt/gochive/.env`, falling back to environment variables if unavailable",
          "is_bot": false,
          "headline": "refactor: reorganize CLI entrypoint and simplify build configuration",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-10T12:34:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "967ab019dd57ed335fd06e38b334b3a6a035e35d",
          "body": "…pload_archive commands\n\nReplace the os.Args dispatch in cmd/gochive with a proper cmd/cli\nCobra tree. Add backup/restore (rsync via grsync), generate\n(thumbnail regeneration, single or all), upload_archive (fetch +\nstore from URL), and version. Rename config.DBRoot to Data and add\nBackup to support the new commands; fix the migrations embed glob\nto include the full directory.",
          "is_bot": false,
          "headline": "feat: introduce Cobra-based CLI with backup, restore, generate, and u…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-10T12:07:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58b7fd8330545f95c82b551b4349701ce869c141",
          "body": ".md uploads never get a generated thumbnail, so DeleteFile always\nattempted (and failed) to remove a nonexistent images/ object for\nmarkdown files. Fetch the filename first and skip the image delete\nwhen the file is markdown.",
          "is_bot": false,
          "headline": "fix: only delete thumbnail image for PDF-derived files",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-09T20:46:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42fee8058c567a07d7ddea9ad6f76a6dec692729",
          "body": "The .md branch returned success before calling tx.Commit(), so the\ninserted row was rolled back by the deferred tx.Rollback() despite\nthe client receiving a 200. Commit before returning.",
          "is_bot": false,
          "headline": "fix: commit the upload transaction on the markdown early-return path",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-09T11:05:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fccee6f48d8e48f25a7d573e49b459d5069d78f9",
          "body": "…edded templates\n\n- Replace package-level config vars/init() with config.LoadConfig() returning *Config\n- Move NewfsClient/NewS3Client onto App so storage clients read app.Config\n- Switch S3 uploads to transfermanager.UploadObject; verify bucket via HeadBucket on connect\n- Enforce max upload size vi\n[…]\ntent status codes\n- Regenerate sqlc queries (int64 -> int) and bump Go/deps\n- Add testify as a dependency in preparation for unit tests (none yet)\n- Remove legacy db/sql, sqlc.yml, and unused handlers",
          "is_bot": false,
          "headline": "refactor: introduce typed Config, S3 transfermanager uploads, and emb…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-09T10:40:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1940c602f93662e5149390032fd4fe3574b04b8e",
          "body": "Replace the DeleteFile-based rollback in UploadFile with a proper\nsql.Tx: begin, run InsertFile through WithTx, defer Rollback, and\nCommit only on success. This requires exposing the underlying\n*sql.DB, so wrap it together with *database.Queries in a new\ncore.Database struct and rename App.Db to App.DB across handlers\nand cli.go.",
          "is_bot": false,
          "headline": "refactor: use real transactions for upload, embed *sql.DB in App",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-05T09:26:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02db5f73bd3ca5fdbe0095fb9a2f2e149883a742",
          "body": "Document features, requirements, Docker build/run, .env config\n(including MODE and S3 vars), migration/backup make targets, and\nthe normalize CLI subcommand.",
          "is_bot": false,
          "headline": "docs: rewrite README with setup, config, and CLI reference",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-04T04:08:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f749e5d00edd764eea57388b69305bc430e85178",
          "body": "- serve frontend libraries from /lib instead of external CDNs\n- install Highlight.js, Mermaid, MathJax, and PDF.js assets in setup script\n- add Mermaid diagram rendering support\n- enable local MathJax rendering\n- improve copy button implementation and make it reusable\n- enhance markdown viewer styling and scrollbar behavior\n- expose /lib static assets\n- remove unused PDF viewer implementation",
          "is_bot": false,
          "headline": "feat: bundle frontend assets and improve markdown rendering",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-03T22:31:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1139f63486db9982c96c9effd45ed2406bb891d",
          "body": "PATCH is the correct method for a partial update; align both the\nroute and the frontend fetch call.",
          "is_bot": false,
          "headline": "refactor: use PATCH instead of POST for the edit endpoint",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-03T20:04:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a1ac186df2db7208263d7ae729c2b37e668c87e",
          "body": null,
          "is_bot": false,
          "headline": "Fix remove log package on searFile.go",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-03T10:49:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "abad3935bd2a9e02b3ec39fb820d019efb720c34",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove leftover debug log statements",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-03T10:46:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a50515510bb5902b0d8ab72ba14e896b79a70ab8",
          "body": "- Bump builder image to golang:1.26.4-bookworm\n- Drop -extldflags rpath (no longer needed with ldconfig setup)\n- Copy pdfjs assets from /opt/gochive/lib instead of /opt/pdfjs\n- Install sudo (required by setup.sh)\n- Remove unused docker-compose.yml (Postgres, replaced by SQLite)\n- Document docker build/run commands in README",
          "is_bot": false,
          "headline": "chore: update Dockerfile for SQLite migration and pdfjs path move",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-03T10:36:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a70458a975dcf848556527dc5f92ad909afd72a3",
          "body": "DeleteFile only removed the file object from storage, leaving its\nthumbnail orphaned under images/. Delete both objects.",
          "is_bot": false,
          "headline": "fix: also delete the thumbnail image when deleting a file",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-03T10:10:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffa3e7dd7266f324bcbc9b0bd58bc1ed62d3d959",
          "body": "Add DELETE /file/:id route and wire a delete button into each card\nthat opens a Yes/No confirmation modal before calling the endpoint\nand reloading the file list.",
          "is_bot": false,
          "headline": "feat: add file deletion with confirmation modal",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-03T10:03:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32e493995e4eae5e03449f4707ec13ecd3db872f",
          "body": "Extract per-file logic into normalizeFile() and run it across up to\n8 concurrent workers via a semaphore + WaitGroup. Replace log.Fatal\nwith per-file error logging so one failure doesn't abort the batch;\nwrap errors with fmt.Errorf for context, and close the reader\nexplicitly.",
          "is_bot": false,
          "headline": "refactor: parallelize file normalization with worker pool",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-03T09:24:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0f12ce54b1dc5dcf6571398edfaa13b2cda867a",
          "body": "… to client\n\nConfig:\n- Replace os.Getenv/godotenv calls with typed constants in internal/config\n- Update Makefile, README and setup.sh paths to match /opt/gochive layout\n\nStorage:\n- Add DelItem to the Store interface (fs and S3 backends)\n- Insert the archive DB row first, then store the file under i\n[…]\nerate sqlc queries (v1.31.1), switch archive.id to int, add\n  ArchiveExists/GetAllFiles/DeleteFile\n\nFrontend:\n- Refactor index.js (dom helpers, dedupe edit-modal fields)\n- Fix indentation in index.css",
          "is_bot": false,
          "headline": "refactor: centralize config, key files by id, move markdown rendering…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-07-03T09:08:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "45942236259be20a69129bb0f419f715c6f6d9bd",
          "body": "- Replace hardcoded /opt/gochive paths with APP_ROOT environment variable\n- Update newSQLITE to accept path parameter\n- Remove --ignore-existing flag from restore command\n- Add path traversal protection in file upload handler",
          "is_bot": false,
          "headline": "refactor: use APP_ROOT env variable for configurable file paths",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-13T04:22:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03795a486548f7e8d6cfdaee49036722397d0d7f",
          "body": "- Rename backup env vars to APP_ROOT and BACKUP_ROOT\n- Update rsync flags: add -u for timestamp-based updates\n- Remove unused DATE variable from Makefile",
          "is_bot": false,
          "headline": "refactor(make): improve backup/restore rules",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-09T00:36:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79c6e53cc9f64e55ec82ebef034480f735de55e6",
          "body": "- Replace Docker PostgreSQL setup with SQLite database\n- Change backup/restore strategy from pg_dump to rsync\n- Simplify .env configuration by removing DB connection parameters\n- Update README with streamlined configuration requirements",
          "is_bot": false,
          "headline": "refactor: migrate from PostgreSQL to SQLite with rsync backups",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-08T06:48:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be988f3398e5f7054452fb892b0a8c2167e6fdce",
          "body": "…andling\n\n- Initialize Object struct before assignment to fix nil dereference\n- Replace ignored error with utils.Must() for file.Stat()",
          "is_bot": false,
          "headline": "refactor(fsClient): initialize Object and use Must helper for error h…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-07T22:40:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77bd51690def0dfd66d2903b8878792397fbb697",
          "body": "…turn values\n\nReplace individual parameters (length, contentType, reader) with Object struct\nfor cleaner API and better extensibility. Update all implementations and handlers\nto use the new interface.",
          "is_bot": false,
          "headline": "refactor: use Object struct in Store interface instead of multiple re…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-07T22:22:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe5dc60d11e650fad546e3da666bef9227a6ce3b",
          "body": "- Rename internal/app to internal/core to avoid naming conflicts\n- Update all import paths across handlers, server, and boot files\n- Remove 'application' alias in main.go, now uses 'core' directly\n- No functional changes, purely organizational refactor",
          "is_bot": false,
          "headline": "refactor: rename app package to core for better clarity",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-05T21:27:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8cdf0d2a5852e035bfb11b5fecca884f63f6555",
          "body": "- Check error return from schema execution in bootDatabase\n- Ensure /opt/gochive directory exists before creating filesystem client\n- Initialize storage client before database to guarantee directory structure\n- Improve error messages for storage and database initialization failures",
          "is_bot": false,
          "headline": "fix: add error handling for database initialization",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-05T10:11:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36ef7d491ea488c46c3b31763cee0eee0061e1d7",
          "body": "- Replace PostgreSQL driver with go-sqlite3\n- Update database schema to SQLite syntax (AUTOINCREMENT, datetime)\n- Remove PostgreSQL-specific schema prefix (archive_schema)\n- Convert all queries from $1 placeholder to ? placeholder\n- Change ILIKE to LIKE for case-insensitive search\n- Update all ID ty\n[…]\nd out)\n- Update connection logic to use SQLite database file\n- Fix typo in function name: NewfdClient -> NewfsClient\n- Remove unused dependencies (lib/pq, stretchr/testify)\n- Add go-sqlite3 dependency",
          "is_bot": false,
          "headline": "refactor: migrate from PostgreSQL to SQLite",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-05T09:39:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d7230850219f6956287bcd4117bc1eca2904c0a",
          "body": "- Switch from S3Client to filesystem-based storage client\n- Add fileSystem.go implementing local file operations\n- Maintain storage interface compatibility for seamless transition",
          "is_bot": false,
          "headline": "refactor: replace S3 storage with local filesystem storage",
          "author_name": "Carlos Nunez",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-05T06:46:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0ba8a7462cf77f2551045a7a5d39ed813b2b0c9",
          "body": "- Replace io.ReadCloser with io.Reader in storage interface\n- Remove temp file usage for uploads\n- Upload images directly from memory\n- Tune HTTP client and S3 endpoint options",
          "is_bot": false,
          "headline": "refactor: stream uploads with io.Reader and improve S3 client config",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-02T22:08:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec6ce9b004852531a04f32540f84e7b247c734e5",
          "body": "- Add PutItem method to Store interface and S3Client for uploading files\n- Implement complete upload flow: store file, save metadata to DB, generate thumbnail\n- Refactor MakeThumbnail to accept io.ReadSeeker and write to buffer instead of file\n- Use temporary files for thumbnail storage before S3 up\n[…]\nan up formatting in queries.sql and remove unused whitespace\n- Rename variables for clarity (p -> param, rawFile -> fileReader)\n- Update error messages to be more generic (s3 client -> storage client)",
          "is_bot": false,
          "headline": "feat: implement file upload with S3 storage and thumbnail generation",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-02T01:33:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dffa70fa663d216a7fff281ca3f205ce8c93d8b8",
          "body": null,
          "is_bot": false,
          "headline": "update Storage interface to support context and errors",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-01T11:46:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a6fa3d1bba80685572275c55f3f2161feeca4b0",
          "body": "…pdate file handlers\n\n- Replaced `db/migrations` with consolidated `db/sql/schema.sql` for schema setup\n- Removed schema/table creation code from Go and SQLC queries\n- Updated models to remove file and thumbnail fields, added `S3Key` for object storage\n- Modified `InsertFile` and `GetArchive` querie\n[…]\ner markdown from S3 content\n- Cleaned up `UploadFile` handler to no longer store file contents or generate thumbnails in DB\n- Updated Dockerfile, Makefile, and SQLC config to match new schema location",
          "is_bot": false,
          "headline": "Refactor database schema handling, remove file storage from DB, and u…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-01T10:44:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c7ff2fccac3b9c6684353eef9b0a5ae0d8994d0c",
          "body": null,
          "is_bot": false,
          "headline": "reset and clean obsolete goose migrations",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-01T07:41:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a343b0f9e24949c9d070c3bf41bcd2dcb5c90bb",
          "body": null,
          "is_bot": false,
          "headline": "fix: clean Docker setup and correct S3 object paths",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-01T07:18:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "950c4da7d933740ad547c5b5cca9bc155bd6a637",
          "body": null,
          "is_bot": false,
          "headline": "Assign response body to reader in GetItem",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-01T06:07:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e98bcc36c4557fe32f22dd2f27b0ec2d371f4cfe",
          "body": "- Introduced a Store interface and refactored App to use `Storage` instead of `S3Client` directly.\n- Implemented `GetItem` on S3 client returning length, content type, and reader, allowing handlers to stream files without coupling to AWS SDK.\n- Updated GetImage handler to use `GetItem`.",
          "is_bot": false,
          "headline": "Refactor S3 file handling and storage abstraction",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-02-01T05:59:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2f89c09444424aa4c706230461408af55f1a4c7",
          "body": null,
          "is_bot": false,
          "headline": "Simplify Docker setup and clean up repository structure",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-01-31T04:26:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38cc256bf240ec9e64b661ece578f76da290da3a",
          "body": "…iner\n\n- Install unzip and download pdf.js during app build\n- Extract pdf.js into /opt/pdfjs\n- Copy web and build assets into final runtime image\n- Remove Dockerfile.pdf and the separate nginx container",
          "is_bot": false,
          "headline": "feat: integrate pdf.js into main app image and remove dedicated conta…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-01-31T03:17:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d000b76f4e3caa74cad0b5393c9411774a1e73a",
          "body": "- Replace config-based dependency passing with central App struct\n- Refactor handlers to use dependency injection via closures\n- Add unified database bootstrap (schemas + migrations)\n- Move S3 client initialization into application layer\n- Remove obsolete config and utils code (S3 client, thumbnail dump)\n- Update server routing to use new handler signatures\n- Improve .env documentation and S3 configuration variables",
          "is_bot": false,
          "headline": "refactor: introduce App container and improve S3/database bootstrap",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-01-31T02:17:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c570c3748db2d873344de370a6329854931380a1",
          "body": "- Replace DBhdlr with App struct containing DB and S3 client\n- Update all handlers to use App instead of DBhdlr\n- Stream images directly from S3 via new GetImage handler\n- Pass config (DB + S3 URL) to server instead of DB only\n- Update frontend to request images from /images/:name\n- Remove DumpThumbnails utility; use App/Conf for DB access",
          "is_bot": false,
          "headline": "refactor: unify handlers under App struct and add S3 streaming",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-01-29T08:18:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2bbc61f74757edc8a1e287873c008749c8be3a6",
          "body": "- Use gin.Context.Data for serving PDF responses\n- Expose files at /:id instead of /get_file/:id\n- Update PDF.js viewer links to match new file route",
          "is_bot": false,
          "headline": "Simplify file serving and PDF routing",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-01-27T03:33:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c36c5b71c8c8ffe74d66fdfdfa1cd34f1dc14002",
          "body": "- Move MAX_RETRIES constant from main.go to boot.go for clarity\n- Update Docker Compose to use env_file and simplify port mapping\n- Add InjectUserCSS middleware to serve combined viewer.css and userContent.css\n- Serve PDF.js build and web assets via static routes\n- Update frontend to route PDF links to `web/viewer.html?file=...`",
          "is_bot": false,
          "headline": "Refactor server CSS handling, PDF viewer routing, and Docker config",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-01-27T02:53:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d21aeecaf8087e368c6da8c78ee646c680a803d3",
          "body": "- Separate schema bootstrap and migrations into explicit boot stages\n- Replace formatted DSN with net/url builder\n- Add retry logic and structured logging for DB connection\n- Introduce run() for cleaner main orchestration",
          "is_bot": false,
          "headline": "split DB startup steps and improve connection handling",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-01-07T20:10:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3dce2c0da1bcdd75102a91e7c8b7c3341e8cf01a",
          "body": "- Normalize indentation and formatting across index.js\n- Improve readability of event handlers and helper functions\n- Apply consistent object destructuring and parameter layout\n- No functional changes intended",
          "is_bot": false,
          "headline": "reformat index.js and improve code consistency",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-01-07T18:44:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "560b4f88c9c408b9865943231392c5c47b9b1c57",
          "body": "- Refactor PDF thumbnail generation to use proper return ordering (value, error)\n- Fix thumbnail creation bug when uploading PDFs\n- Simplify and harden pdfium setup in Docker build\n- Update Dockerfile to properly link libpdfium and run ldconfig\n- Remove obsolete dbManager and move DB init logic to m\n[…]\n and retry handling\n- Make docker-compose environment configurable via .env\n- Add missing Dockerfile and nginx config\n- Minor frontend formatting cleanup\n- Update TODO list with known PDF upload issue",
          "is_bot": false,
          "headline": "improve PDF handling, Docker build, and DB initialization",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2026-01-07T18:07:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a3bd6c21ad58534dc05ce21706f6a2038780f4c",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade Postgres image to 17.5",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-30T15:42:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee8107abdd044dcba154371f81646b6336bea215",
          "body": null,
          "is_bot": false,
          "headline": "Add database connection retries on startup",
          "author_name": "Carlos Nunez",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-30T15:30:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecfac8aa65ffb718b32411cedc8a7a286cc0622e",
          "body": null,
          "is_bot": false,
          "headline": "Refine Docker build and compose configuration",
          "author_name": "Carlos Nunez",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-30T14:26:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3cbbc4f69f6c3ebf8c7f527cfeda41ee88bf7f7",
          "body": null,
          "is_bot": false,
          "headline": "move schema creation to sqlc and reorganize thumbnail dumping",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-30T04:29:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c51fcb760d31c45c0b8d9e64b244d8f8945420a0",
          "body": null,
          "is_bot": false,
          "headline": "Update TODO with new development and client-side goals",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-21T02:37:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de74ebfe28820d9e807e14830a44139e1e10e8f4",
          "body": null,
          "is_bot": false,
          "headline": "correct pdfium architecture selection",
          "author_name": "Carlos Nunez",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-19T22:04:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d26564b02ef25c75758e3b7e277ad2276d1cd02c",
          "body": null,
          "is_bot": false,
          "headline": "Switch Docker build to Debian bookworm with pdfium support",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-19T19:43:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5adc81087d4d1528a9627aed462201add6719d68",
          "body": null,
          "is_bot": false,
          "headline": "Support archive bookmarks and update sqlc output",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-16T16:13:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af13a4cfadcfad3f4ab3eda1e7d38f4adc7090da",
          "body": null,
          "is_bot": false,
          "headline": "TODO.md Simplify the `main.go` code",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-16T15:56:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7eead8a16228600fbdd9b7bc3a55ef82026ea8d3",
          "body": null,
          "is_bot": false,
          "headline": "simplify initialization and thumbnail dumping",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-16T15:54:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53f449a7c97b5baefb359798dd0ef245b216b937",
          "body": null,
          "is_bot": false,
          "headline": "Update TODO.md",
          "author_name": "Carlos Nuñez",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-12T18:34:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c5f95f1265ce1ae7156497915e6ac16b84956f4",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Carlos Nuñez",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-12T18:27:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdf6d75dceab0583bcf23b8150c468ed06722640",
          "body": null,
          "is_bot": false,
          "headline": "Add environment variables template and improve README.md",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-12T18:25:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70d5d6a9a55a034c960d3ef3f43ff8cc676ff30e",
          "body": null,
          "is_bot": false,
          "headline": "Add TODO.md with main goals to achieve",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-12T18:19:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfbc9baf70ed1ff636d6e95c675c5337b3ac0659",
          "body": null,
          "is_bot": false,
          "headline": "Untrust all the proxies by default",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-12T18:03:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9bf06bd5bb0e169f753dbce5f1a6930d02be8c67",
          "body": null,
          "is_bot": false,
          "headline": "Refactor UploadFile to improve WebP generation",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-11T14:51:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdf0a8825ac802a85a1a0dafee7f99de71f0ec13",
          "body": "…irectory handling.",
          "is_bot": false,
          "headline": "Remove obsolete configs, clean up logs, and fix thumbnail paths and d…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-12-11T13:18:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a66e11504c22579c6af08176a1dfd4162d8be95",
          "body": null,
          "is_bot": false,
          "headline": "refactor: clean thumbnail path usage and improve error responses",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-07-17T03:22:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "defeb5bc1b0cb1ed8c410731dd8cb6c861c0236a",
          "body": null,
          "is_bot": false,
          "headline": "Refactor file upload and validation into utils package",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-07-15T19:04:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3f50509dbc57b1ad5bb76d73d53bb3943f9ae7f",
          "body": null,
          "is_bot": false,
          "headline": "Add new config on Makefile and changes on http status",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-07-15T03:08:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2d9914bcf2ea6bc308c0255ea5f0614f648ca15",
          "body": null,
          "is_bot": false,
          "headline": "Fix: Add create thumbnails dir if not exists",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-07-13T21:24:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9242e2168f572b86e301c434078a7316b3a5248",
          "body": null,
          "is_bot": false,
          "headline": "Fix: Add new query to save the thumbnail",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-07-13T02:50:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9dc9b679c0b863bcce9d35bf5bd5a5af55f3c96c",
          "body": null,
          "is_bot": false,
          "headline": "Fix: Dockerfile dependency update",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-07-11T21:52:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd804883d1b674a505d234207f58172694a51c69",
          "body": "…th postgres container using service name.",
          "is_bot": false,
          "headline": "Feat: Update Dockerfiles and docker-compose to connect gochive app wi…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-07-11T21:38:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17d89fe21514508b6f8069392bdac834f4ac7c8a",
          "body": null,
          "is_bot": false,
          "headline": "Fix: upload endpoint used old thumbnail filename",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-17T15:35:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "888cab0b2fc3a90686437822298dfd1c213f8403",
          "body": null,
          "is_bot": false,
          "headline": "Feat: add edit endpoint to update filename and editorial fields",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-17T12:00:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39642e8513709b9851900a95604b2697f1079e03",
          "body": "…ication, simplifying logic, improving UI updates, and optimizing DOM manipulation while maintaining all functionality",
          "is_bot": false,
          "headline": "Fix: Refactor file management and pagination code by eliminating dupl…",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-16T14:50:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ed24ef7640f90778d1a6b3e659a6c9ec62da4ab",
          "body": null,
          "is_bot": false,
          "headline": "Feat: add functional favorite button with API integration",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-16T14:12:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d094e63198c8d2ee0b1143f83580e91863aeb980",
          "body": null,
          "is_bot": false,
          "headline": "Fix: Math markdown rendering",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-14T14:16:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a9896fb9aa4d9707541170c8c34b88bf652179a",
          "body": null,
          "is_bot": false,
          "headline": "Feat: implement search bar with dynamic fetch on submit",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-13T07:21:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e184a9e3807d85a3b3c8e9f6f36fdd415df16e16",
          "body": null,
          "is_bot": false,
          "headline": "Fix: add input sanitization",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-13T02:59:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed6d68f7b690ea7b4947e45f5e80d88c21ab0b23",
          "body": null,
          "is_bot": false,
          "headline": "Feat: add image dumper to write image bytes to file",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-12T17:51:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f07e94192dbb9f98461b3e99f37bae85ceedb002",
          "body": null,
          "is_bot": false,
          "headline": "Feat: add server-side markdown rendering support",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-12T17:14:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34d2711b42ac60dc554ee98625d57b56300b5fe0",
          "body": null,
          "is_bot": false,
          "headline": "Fix: archive cards show correctly",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-12T15:22:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21cb6e69f92cea8ae1f7b092498e4dc80e2a6461",
          "body": null,
          "is_bot": false,
          "headline": "Feat: add view endpoint",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-12T14:35:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a92b383af0c9829af7f0348eedfa3217273a440f",
          "body": null,
          "is_bot": false,
          "headline": "Feat: Generate thumbnail image",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-12T14:11:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e22a9b68a0c8db376f39f37722ee9880c3ad3b3",
          "body": null,
          "is_bot": false,
          "headline": "Feat: add pagination",
          "author_name": "0xMoonrise",
          "author_login": "0xMoonrise",
          "committed_at": "2025-06-12T13:24:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 5,
      "commits_last_year": 80,
      "latest_release_at": "2026-07-24T07:43:22Z",
      "latest_release_tag": "v1.2.0",
      "releases_from_tags": false,
      "days_since_last_push": 1,
      "active_weeks_last_year": 12,
      "days_since_latest_release": 1,
      "mean_days_between_releases": 1.3
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 28,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/0xMoonrise/gochive",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/0xMoonrise/gochive",
          "is_deprecated": false,
          "latest_version": "v1.2.0",
          "repository_url": "https://github.com/0xMoonrise/gochive",
          "versions_count": 6,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-24T07:39:23Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 10953,
      "source_files_sampled": 40,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/BurntSushi/toml",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.42.1"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/config",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.32.28"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/credentials",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.19.27"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.3.0"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/service/s3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.105.0"
        },
        {
          "name": "github.com/chai2010/webp",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.4.0"
        },
        {
          "name": "github.com/go-chi/chi/v5",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v5.3.1"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/klippa-app/go-pdfium",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.17.2"
        },
        {
          "name": "github.com/mattn/go-sqlite3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.14.33"
        },
        {
          "name": "github.com/pressly/goose/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.26.0"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "0xMoonrise",
          "commits": 107,
          "avatar_url": "https://avatars.githubusercontent.com/u/48922521?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 7,
            "reason": "3 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "cfe7f9f1e145f9396f7e404a2161fdf5703f7d0b",
        "ran_at": "2026-07-25T11:32:35Z",
        "aggregate_score": 2.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-24T07:45:36Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/0xMoonrise/gochive",
    "host": "github.com",
    "name": "gochive",
    "owner": "0xMoonrise"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 41,
      "inputs": {
        "security": 28,
        "vitality": 83,
        "community": 12,
        "governance": 35,
        "engineering": 38
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 83,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "commits_last_year": 80,
              "human_commit_share": 1,
              "days_since_last_push": 1,
              "active_weeks_last_year": 12
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "12/52 weeks with commits",
                "points": 8.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "80 commits in the last year",
                "points": 17.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 80
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "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": 100,
            "inputs": {
              "releases_count": 5,
              "latest_release_tag": "v1.2.0",
              "releases_from_tags": false,
              "days_since_latest_release": 1,
              "mean_days_between_releases": 1.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "5 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.3
                    }
                  }
                ],
                "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": 1,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 1 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 12,
        "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": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 35,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "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": 46,
            "inputs": {
              "followers": 8,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "0xMoonrise",
              "public_repos": 12,
              "account_age_days": 2678
            },
            "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": "8 followers of 0xMoonrise",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 8,
                      "login": "0xMoonrise"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "12 public repos, account ~7 yr old",
                "points": 20.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 12
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 7
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/0xMoonrise/gochive"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 1
            },
            "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 1 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "6 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 38,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 28,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 28,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 2.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "3 existing vulnerabilities detected",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 57,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 31,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.58,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "58 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 30.9,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 58,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "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": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 10953,
              "source_files_sampled": 40,
              "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/40 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 40,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T11:32:39.483417Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/0/0xMoonrise/gochive.svg",
  "full_name": "0xMoonrise/gochive",
  "license_state": "absent",
  "license_spdx": null
}

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.