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

sonyarianto / santui

Santui is your terminal home base.

RustMIT★ 12 estrellas⑂ 0 forksdesde jun 2026Ver en GitHub ↗

sonyarianto/santui tiene un índice de salud de 58 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (81/100) y la más baja, Security (31/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

58
global / 100
Moderado

Índice de salud del software

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

58
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

Sony AKCuenta personal
95 seguidores104 repositorios públicosdesde jul 2010

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ónEtiquetas
crates.iosantui-db0.2.3114219hace 5 días
crates.iosantui0.2.3111720hace 5 días
crates.iosantui-ipc0.2.3116822hace 5 días
crates.iosantui-auth0.2.3116622hace 5 días
crates.iosantui-core0.2.3122822hace 5 días
npmsantui0.2.31303630hace 5 díastuiterminallaunchersantui
crates.iosantui-registry0.2.3118522hace 5 días

Métricas por categoría

Vitalidad

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

71Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
4.2/36Cadencia de commits — 6/52 semanas con commits
18/18Volumen de commits — 563 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year563
human_commit_share1
days_since_last_push5
active_weeks_last_year6
Cómo se puntúa
27/27Publica versiones — 21 versiones publicadas
36/36Recencia de las versiones — última versión hace 1 días
27/27Cadencia de publicación — una versión cada ~2,6 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count21
latest_release_tagv0.2.31
releases_from_tagsno
days_since_latest_release1
mean_days_between_releases2,6

Comunidad y Adopción

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

39En riesgo · 18% del índice global
Cómo se puntúa
16.9/60Estrellas — 12 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars12
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
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_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
48.1/80Descargas mensuales — 4042 descargas/mes en crates, npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagessantui-db, santui, santui-ipc, santui-auth, santui-core, santui, santui-registry
dependents
ecosystemscrates, npm
total_downloads3018
monthly_downloads4042
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

60Moderado · 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
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
42.9/46.8Resolución de issues — 92% de issues cerradas
38.2/38.3Aceptación de PR — 3/3 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/25 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs3
open_issues9
closed_issues100
issue_closed_ratio0,917
closed_unmerged_prs0
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
14.3/25Alcance del propietario — 95 seguidores de sonyarianto
25/25Trayectoria — 104 repos públicos, cuenta de ~16 años
Datos de entrada utilizados
followers95
owner_typeUser
is_verified
owner_loginsonyarianto
public_repos104
account_age_days5852
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 — 7 paquete(s) en crates, npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 30 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagessantui-db, santui, santui-ipc, santui-auth, santui-core, santui, santui-registry
ecosystemscrates, npm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

81Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 1 out of 1 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://santuiapp.vercel.app
10/10Descripción del repositorio
10/10Topics — 4 topics
10/10Wiki
Datos de entrada utilizados
topicscli, plugins, ratatui, terminal
has_wiki
homepagehttps://santuiapp.vercel.app
has_readme
has_docs_dir
has_description

Seguridad

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

31En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 1 out of 1 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/25 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
3.8/7.5Vulnerabilities — 5 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3

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.

74Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 97 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,97
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes8657
Cómo se puntúa
12.6/18Arranque con un solo comando — Cargo.toml, crates/app/Cargo.toml, crates/auth/Cargo.toml (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Rust (tipado estático)
10/10Entorno reproducible — 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
lockfilesCargo.lock, package-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsCargo.toml, crates/app/Cargo.toml, crates/auth/Cargo.toml, crates/core/Cargo.toml, crates/db/Cargo.toml, crates/dev-setup/Cargo.toml, crates/ipc/Cargo.toml, crates/plugins/ai-chat/Cargo.toml, crates/plugins/api-monitor/Cargo.toml, crates/plugins/archive-browser/Cargo.toml, crates/plugins/ascii-table/Cargo.toml, crates/plugins/base64-encoder/Cargo.toml, crates/plugins/batch-renamer/Cargo.toml, crates/plugins/bmi-calculator/Cargo.toml, crates/plugins/bookmark-launcher/Cargo.toml, crates/plugins/breathing-exercise/Cargo.toml, crates/plugins/budget-tracker/Cargo.toml, crates/plugins/calendar-agenda/Cargo.toml, crates/plugins/case-converter/Cargo.toml, crates/plugins/cheatsheet-browser/Cargo.toml, crates/plugins/chess/Cargo.toml, crates/plugins/clipboard-history/Cargo.toml, crates/plugins/cloud-cost/Cargo.toml, crates/plugins/code-runner/Cargo.toml, crates/plugins/color-picker/Cargo.toml, crates/plugins/connection-string-builder/Cargo.toml, crates/plugins/cron-expression-helper/Cargo.toml, crates/plugins/csv-viewer/Cargo.toml, crates/plugins/currency-converter/Cargo.toml, crates/plugins/dashboard/Cargo.toml, crates/plugins/dictionary-thesaurus/Cargo.toml, crates/plugins/disk-usage/Cargo.toml, crates/plugins/dns-globe/Cargo.toml, crates/plugins/docker-dashboard/Cargo.toml, crates/plugins/email-client/Cargo.toml, crates/plugins/env-manager/Cargo.toml, crates/plugins/erd-sketch/Cargo.toml, crates/plugins/expense-splitter/Cargo.toml, crates/plugins/file-diff/Cargo.toml, crates/plugins/file-explorer/Cargo.toml, crates/plugins/flashcards/Cargo.toml, crates/plugins/fortune-cookie/Cargo.toml, crates/plugins/game-of-life/Cargo.toml, crates/plugins/git-repository-dashboard/Cargo.toml, crates/plugins/github-browser/Cargo.toml, crates/plugins/gpg-encryptor/Cargo.toml, crates/plugins/graphql-playground/Cargo.toml, crates/plugins/habit-tracker/Cargo.toml, crates/plugins/hacker-news-reader/Cargo.toml, crates/plugins/hash-calculator/Cargo.toml, crates/plugins/hex-viewer/Cargo.toml, crates/plugins/http-client/Cargo.toml, crates/plugins/iptv-player/Cargo.toml, crates/plugins/irc-client/Cargo.toml, crates/plugins/json-yaml-formatter/Cargo.toml, crates/plugins/jwt-inspector/Cargo.toml, crates/plugins/k8s-viewer/Cargo.toml, crates/plugins/kanban-board/Cargo.toml, crates/plugins/loan-calculator/Cargo.toml, crates/plugins/log-viewer/Cargo.toml, crates/plugins/lorem-generator/Cargo.toml, crates/plugins/markdown-previewer/Cargo.toml, crates/plugins/math-evaluator/Cargo.toml, crates/plugins/mermaid-renderer/Cargo.toml, crates/plugins/mongo-explorer/Cargo.toml, crates/plugins/music-player-controller/Cargo.toml, crates/plugins/music-preview/Cargo.toml, crates/plugins/mysql-browser/Cargo.toml, crates/plugins/network-bandwidth-monitor/Cargo.toml, crates/plugins/package-manager/Cargo.toml, crates/plugins/package-version-monitor/Cargo.toml, crates/plugins/password-generator/Cargo.toml, crates/plugins/path-editor/Cargo.toml, crates/plugins/periodic-table/Cargo.toml, crates/plugins/ping-traceroute/Cargo.toml, crates/plugins/pipe-runner/Cargo.toml, crates/plugins/pixel-art/Cargo.toml, crates/plugins/pomodoro-timer/Cargo.toml, crates/plugins/port-scanner/Cargo.toml, crates/plugins/postgres-console/Cargo.toml, crates/plugins/process-manager/Cargo.toml, crates/plugins/qr-generator/Cargo.toml, crates/plugins/quick-notes/Cargo.toml, crates/plugins/quran-reader/Cargo.toml, crates/plugins/radio-stream-player/Cargo.toml, crates/plugins/radio-stream-player/scraper/Cargo.toml, crates/plugins/recipe-manager/Cargo.toml, crates/plugins/redis-explorer/Cargo.toml, crates/plugins/regex-tester/Cargo.toml, crates/plugins/registry/Cargo.toml, crates/plugins/rss-reader/Cargo.toml, crates/plugins/sdk-playground/Cargo.toml, crates/plugins/service-manager/Cargo.toml, crates/plugins/slug-generator/Cargo.toml, crates/plugins/snake-game/Cargo.toml, crates/plugins/snippet-manager/Cargo.toml, crates/plugins/speed-test/Cargo.toml, crates/plugins/sprint-retro/Cargo.toml, crates/plugins/sql-playground/Cargo.toml, crates/plugins/sqlite-browser/Cargo.toml, crates/plugins/ssh-manager/Cargo.toml, crates/plugins/ssl-checker/Cargo.toml, crates/plugins/stock-ticker/Cargo.toml, crates/plugins/subnet-calculator/Cargo.toml, crates/plugins/system-monitor/Cargo.toml, crates/plugins/terminal-pet/Cargo.toml, crates/plugins/text-toolkit/Cargo.toml, crates/plugins/time-tracker/Cargo.toml, crates/plugins/todo-task-manager/Cargo.toml, crates/plugins/totp-viewer/Cargo.toml, crates/plugins/typing-test/Cargo.toml, crates/plugins/unit-converter/Cargo.toml, crates/plugins/uuid-generator/Cargo.toml, crates/plugins/wake-on-lan/Cargo.toml, crates/plugins/water-tracker/Cargo.toml, crates/plugins/weather/Cargo.toml, crates/plugins/webhook-tester/Cargo.toml, crates/plugins/websocket-client/Cargo.toml, crates/plugins/whois-lookup/Cargo.toml, crates/plugins/world-clock/Cargo.toml, crates/registry/Cargo.toml, crates/server/Cargo.toml, templates/plugin/Cargo.toml
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Rust (tipado estático)
54.7/55Tamaños de archivo manejables — 1/218 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRust
largest_source_bytes89.343
source_files_sampled218
oversized_source_files1

Datos clave

12estrellas de GitHub
1contribuidores
563commits en los últimos 12 meses
5días desde el último push
21versiones publicadas
1factor bus
9issues abiertas
crates.io, npmecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch npm package 'santui-website' from its registry
  • Could not fetch crates package 'santui-server' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 3.0 / 10
3.0agregado

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-24 04:06 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests1 out of 1 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/25 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
5Vulnerabilities5 existing vulnerabilities detected
Dependencias directas 57
RegistroPaqueteRestricción de versiónManifiesto
crates.iosantui-core0.2.31crates/app/Cargo.toml
crates.iosantui-ipc0.2.31crates/app/Cargo.toml
crates.iosantui-auth0.2.31crates/app/Cargo.toml
crates.iosantui-registry0.2.31crates/app/Cargo.toml
crates.iosantui-db0.2.31crates/app/Cargo.toml
crates.iorusqlite0.40crates/app/Cargo.toml
crates.iologcrates/app/Cargo.toml
crates.ioenv_loggercrates/app/Cargo.toml
crates.iosantui-core0.2.31crates/auth/Cargo.toml
crates.ioureq3crates/auth/Cargo.toml
crates.iourl2crates/auth/Cargo.toml
crates.ioserdecrates/auth/Cargo.toml
crates.ioserde_jsoncrates/auth/Cargo.toml
crates.iodirs6crates/auth/Cargo.toml
crates.ioratatui0.30crates/core/Cargo.toml
crates.iocrossterm0.29crates/core/Cargo.toml
crates.ioserdecrates/core/Cargo.toml
crates.ioserde_jsoncrates/core/Cargo.toml
crates.iotoml1.1crates/core/Cargo.toml
crates.iologcrates/core/Cargo.toml
crates.ioctrlc3.5crates/core/Cargo.toml
crates.ionotify8crates/core/Cargo.toml
crates.ioureq3crates/core/Cargo.toml
crates.iorusqlite0.40crates/db/Cargo.toml
crates.ioserdecrates/db/Cargo.toml
crates.ioserde_jsoncrates/db/Cargo.toml
crates.ioserdecrates/dev-setup/Cargo.toml
crates.ioserde_jsoncrates/dev-setup/Cargo.toml
crates.iosha2crates/dev-setup/Cargo.toml
crates.iorayoncrates/dev-setup/Cargo.toml
crates.iosantui-core0.2.31crates/ipc/Cargo.toml
crates.ioratatui0.30crates/ipc/Cargo.toml
crates.iocrossterm0.29crates/ipc/Cargo.toml
crates.ioserdecrates/ipc/Cargo.toml
crates.ioserde_jsoncrates/ipc/Cargo.toml
crates.iobincode2crates/ipc/Cargo.toml
crates.iologcrates/ipc/Cargo.toml
crates.iosantui-core0.2.31crates/registry/Cargo.toml
crates.ioserdecrates/registry/Cargo.toml
crates.ioserde_jsoncrates/registry/Cargo.toml
crates.iotoml1.1crates/registry/Cargo.toml
crates.ioureq3crates/registry/Cargo.toml
crates.iosha20.11crates/registry/Cargo.toml
crates.iosantui-core0.2.31crates/server/Cargo.toml
crates.ioaxum0.8crates/server/Cargo.toml
crates.iotokio1crates/server/Cargo.toml
crates.iotower-http0.7crates/server/Cargo.toml
crates.ioserdecrates/server/Cargo.toml
crates.ioserde_jsoncrates/server/Cargo.toml
crates.iojsonwebtoken10crates/server/Cargo.toml
crates.iorusqlite0.40crates/server/Cargo.toml
crates.ioureq3crates/server/Cargo.toml
crates.iotracing0.1crates/server/Cargo.toml
crates.iotracing-subscriber0.3crates/server/Cargo.toml
crates.ioclap4crates/server/Cargo.toml
crates.iosantui-ipctemplates/plugin/Cargo.toml
crates.ioserde1templates/plugin/Cargo.toml
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": [
        "cli",
        "plugins",
        "ratatui",
        "terminal"
      ],
      "is_fork": false,
      "size_kb": 7765,
      "has_wiki": true,
      "homepage": "https://santuiapp.vercel.app",
      "languages": {
        "CSS": 252,
        "HTML": 4261,
        "Rust": 2835601,
        "Shell": 8404,
        "JavaScript": 4973,
        "PowerShell": 8863,
        "TypeScript": 7532
      },
      "pushed_at": "2026-07-18T18:18:47Z",
      "created_at": "2026-06-14T18:56:33Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T18:18:50Z",
      "description": "Santui is your terminal home base.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://sony-ak.com",
      "name": "Sony AK",
      "type": "User",
      "login": "sonyarianto",
      "company": null,
      "location": "Jakarta",
      "followers": 95,
      "avatar_url": "https://avatars.githubusercontent.com/u/333051?v=4",
      "created_at": "2010-07-15T14:19:16Z",
      "is_verified": null,
      "public_repos": 104,
      "account_age_days": 5852
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.31",
          "kind": "patch",
          "published_at": "2026-07-23T02:25:42Z"
        },
        {
          "tag": "v0.2.28",
          "kind": "patch",
          "published_at": "2026-07-06T22:31:00Z"
        },
        {
          "tag": "v0.2.27",
          "kind": "patch",
          "published_at": "2026-07-04T17:03:24Z"
        },
        {
          "tag": "v0.2.26",
          "kind": "patch",
          "published_at": "2026-07-01T15:20:57Z"
        },
        {
          "tag": "v0.2.25",
          "kind": "patch",
          "published_at": "2026-07-01T13:59:46Z"
        },
        {
          "tag": "v0.2.24",
          "kind": "patch",
          "published_at": "2026-06-30T15:21:59Z"
        },
        {
          "tag": "v0.2.23",
          "kind": "patch",
          "published_at": "2026-06-30T12:07:49Z"
        },
        {
          "tag": "v0.2.22",
          "kind": "patch",
          "published_at": "2026-06-29T20:44:20Z"
        },
        {
          "tag": "v0.2.21",
          "kind": "patch",
          "published_at": "2026-06-29T19:52:05Z"
        },
        {
          "tag": "v0.2.20",
          "kind": "patch",
          "published_at": "2026-06-29T14:41:19Z"
        },
        {
          "tag": "v0.2.19",
          "kind": "patch",
          "published_at": "2026-06-29T14:26:24Z"
        },
        {
          "tag": "v0.2.17",
          "kind": "patch",
          "published_at": "2026-06-28T05:59:28Z"
        },
        {
          "tag": "v0.2.16",
          "kind": "patch",
          "published_at": "2026-06-28T01:22:49Z"
        },
        {
          "tag": "v0.2.14",
          "kind": "patch",
          "published_at": "2026-06-25T18:57:12Z"
        },
        {
          "tag": "v0.2.13",
          "kind": "patch",
          "published_at": "2026-06-22T15:41:58Z"
        },
        {
          "tag": "v0.2.12",
          "kind": "patch",
          "published_at": "2026-06-22T05:56:42Z"
        },
        {
          "tag": "v0.2.11",
          "kind": "patch",
          "published_at": "2026-06-21T12:41:51Z"
        },
        {
          "tag": "v0.2.10",
          "kind": "patch",
          "published_at": "2026-06-21T10:35:26Z"
        },
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-06-21T10:06:50Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-06-21T10:03:51Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-06-21T05:55:43Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "e8194fcad07944731aa2687e1d7dd4f659e931ac",
          "body": null,
          "is_bot": false,
          "headline": "feat(music-preview): add filter indicator, pgup/pgdn, remove # column",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T18:18:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbeb3aa83632f3294cae6c1829096bd913e70eb1",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.2.31",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T17:54:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac8b0d1b17049456712af56cc947e5f85b965543",
          "body": "Every installed plugin already gets an auto-generated palette entry\nfrom registry.toml via dynamic_items. The per-plugin palette_commands()\nreturning \"Plugins\" → \"Open X\" was fully redundant — the registry\nentry already opens the plugin.\n\nRadio Stream Player and Log Viewer already returned vec![]. T\n[…]\nr, Pomodoro, Hacker News, Weather, etc.) also\nlose their quick-action entries as they are equally accessible via\nthe registry entry.\n\nMusic Preview's palette_commands test was updated to expect empty.",
          "is_bot": false,
          "headline": "refactor: remove redundant palette_commands() from all plugins",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T17:50:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c906bd440ecf34e22314d2f0df5f3cd3d321671",
          "body": null,
          "is_bot": false,
          "headline": "chore: add generated plugins.json to gitignore",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T17:37:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f80a1fe65f952ad3f1dcd94848af6ae1c1e4041",
          "body": "All plugins now register under the unified 'Plugins' category instead\nof 40+ custom category names (Utilities, Developer, Music, Weather, etc.)",
          "is_bot": false,
          "headline": "refactor: normalize all palette categories to 'Plugins'",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T17:37:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7818f9ddc44af8302d13eefe9565b8b3321e0fb1",
          "body": "… hint\n\n- Replace open_url() with libmpv playback via player.rs\n- Add search mode (press / to search, Enter to submit, Esc to cancel)\n- Change track_id from u32 to u64 (fixes overflow for large iTunes IDs)\n- Fix table overlap with bottom border, widen Duration column\n- Show dimmed \"Search: \" hint wh\n[…]\nChange Filter: label from accent to text color\n- Update hint labels: space toggle fav, f toggle fav list\n\nfix(ipc): redirect plugin stderr to null\n\n- Prevents mpv/PipeWire noise from printing over TUI",
          "is_bot": false,
          "headline": "feat(music-preview): add mpv playback, search mode, and dimmed search…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T17:25:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "247acf77ef2ac46413bea08c29604990501a686e",
          "body": "- Add crates/dev-setup/ binary with subcommands: dev-json, release-json,\n  list-ids, list-paths, list-globs\n- Replace inline Python in scripts/dev-setup.sh with santui-dev-setup\n- Replace 3 inline Python snippets in CI release.yml with santui-dev-setup + jq\n- Skip SHA-256 hashing in dev mode (unused\n[…]\nacker, hacker-news-reader, http-client,\n  music-preview, pomodoro-timer, rss-reader, ssh-manager, system-monitor,\n  weather, world-clock) for consistency with Plugin Registry and\n  Radio Stream Player",
          "is_bot": false,
          "headline": "refactor: replace Python build scripts with Rust (santui-dev-setup)",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T15:34:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "455c770c4d036b105f908b7e531e609a3d2c3d34",
          "body": "- Add actions/checkout@v6 to release job so plugins-manifest.json\n  is available for the empty-file validation step\n- Update AGENTS.md: warn against cargo build --workspace (disk space)\n- Fix: use theme.border for panel title_fg instead of theme.text",
          "is_bot": false,
          "headline": "fix(release): checkout repo before validating asset sizes",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T15:07:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac4987a506f89bdf42b4d7d78cbdd3b62b5e68de",
          "body": "…build",
          "is_bot": false,
          "headline": "fix(code-runner): use #[cfg(unix)] for PermissionsExt to fix Windows …",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T14:39:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5488c9bebff0cc9f19cb3a1e56d03a61cb13667",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.2.30",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T14:26:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b11d9923a147c52773891f29323e388d2403748",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.2.30",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T14:26:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a91e2170c3e82a8c4a812cf808d4c1c295d4c9e6",
          "body": null,
          "is_bot": false,
          "headline": "fix: move alt+m mouse off hint to left side, lowercase alt+m",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T14:24:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7c490c34023778b9305c3ed8d5c4adf26612c8b",
          "body": null,
          "is_bot": false,
          "headline": "fix(registry): use Unicode width for info line right-alignment",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T14:08:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccb7c4daaeb48259f9c5932a175223f4097d6ea2",
          "body": null,
          "is_bot": false,
          "headline": "chore: update radio station database (30 enrichment runs)",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T13:56:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7fdf09861e49b961db9b6bd1ddb65a633a5a01b4",
          "body": "feat(registry): add plugin favorites",
          "is_bot": false,
          "headline": "Merge pull request #111 from sonyarianto/feat/ipc-binary",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T13:25:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a0c19487f8cf4d380db07cb81e508f1f39d21d1",
          "body": null,
          "is_bot": false,
          "headline": "feat(registry): add plugin favorites (bookmark with ♥, filter with f)",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T13:25:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe087380990b1f19a26c9f4ff542afb0a42ecc2c",
          "body": "Create a shared ureq Agent with timeout_global(10s) and use it\nin fetch_manifest and download_plugin to prevent blocking on\nslow/unreachable network.",
          "is_bot": false,
          "headline": "fix(registry): add 10s timeout to all HTTP requests",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T13:00:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97bd139089f83af0d0811ba1caaa6416adc4fe8f",
          "body": "Binary bincode is now the only format for plugin→host messages.\nAll 111 first-party plugins have been migrated.",
          "is_bot": false,
          "headline": "refactor(ipc): remove JSON fallback from read_plugin_msg",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T08:15:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37f6d837f6227858462e27091f8124857e8ac0d8",
          "body": "Convert all plugin respond() functions from JSON Lines to binary\nbincode using write_plugin_msg. Fix type mismatches across ~75\nplugins where hints(), palette_commands(), and key_hints()\nreturned serde_json::Value instead of Vec<(String, String)>.\nFix ~30 plugins where render() returns Vec<Value> by\ndeserializing to Vec<RenderCmd>. Restore use std::io::Write\nwhere still needed. Add mouse_capture field to Config test\nstructs.",
          "is_bot": false,
          "headline": "fix(ipc): migrate remaining 111 plugins to binary bincode format",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T08:14:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41d143abc76bb3bc51d54986c6c5f915654081e2",
          "body": "- Add bincode v2 with serde+std features to santui-ipc\n- Add read_plugin_msg / write_plugin_msg helpers in protocol.rs\n  with auto-detection: first byte '{' → JSON Lines, else binary frame\n- Host reader thread uses read_plugin_msg for backward-compat parsing\n- Plubin writer uses write_plugin_msg (bi\n[…]\nplugin updated to use binary format\n- Add criterion benchmarks for JSON vs binary encode/decode\n  (binary encode is ~2x faster for typical PluginMsg with 50-row Table)\n- All 48 existing IPC tests pass",
          "is_bot": false,
          "headline": "feat(ipc): binary bincode format for PluginMsg (plugin→host)",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T07:42:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4d24027cdbfafd219143bb5c1595f661539f42ea",
          "body": null,
          "is_bot": false,
          "headline": "fix: disable mouse capture by default (opt-in via Alt+M)",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T07:26:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "609ed0dc8a9c238c29a341d217156f257d95294f",
          "body": null,
          "is_bot": false,
          "headline": "chore: SANTUI_NO_MOUSE env, improve help order and status bar hint",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T07:24:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c8568163ec87db27ffdd1dd14b2b8d80fa416c4",
          "body": null,
          "is_bot": false,
          "headline": "docs: document that native/radio_stream_stations.db must be committed",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T07:22:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c953d3a23aa1514afaca4dcaaf2b82764bb1f88f",
          "body": null,
          "is_bot": false,
          "headline": "chore: update radio station database",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T07:21:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "922fa45d57583219e7770fa4556f5b5d8bbb96b0",
          "body": "- Add mouse_capture: bool to config.toml (default true)\n- Alt+M toggles mouse capture at runtime\n- --no-mouse CLI flag overrides config\n- Status bar shows 'mouse off' when disabled\n- mouse capture disabled events are swallowed so text selection works\n\nCloses #issue",
          "is_bot": false,
          "headline": "feat: mouse capture toggle (Alt+M), --no-mouse flag, config option",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T07:19:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5fcece6e6d941dfbc40c4866e4a9a218e351c5e3",
          "body": "…existing genre entries",
          "is_bot": false,
          "headline": "fix(radio-scraper): unescape HTML entities in parse_genres, clean 61 …",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T07:00:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2bba48c7e1a93c37e06bec794f899f0179fadab7",
          "body": "…alidation",
          "is_bot": false,
          "headline": "docs(radio-scraper): clarify --prune catches dead URLs without HEAD v…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T06:58:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0070a44f776c6a18cac756bccfb91348bf489ea5",
          "body": null,
          "is_bot": false,
          "headline": "bump(radio-scraper): increase genre enrichment from 50 to 200 per run",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T06:46:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d31c4561f7c701d53fc422a6f6e7ec561149f5c",
          "body": "…, --prune CLI",
          "is_bot": false,
          "headline": "feat(radio-scraper): rate limiting, UPSERT, radio_id dedup, --db-path…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T06:44:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e35a9903671a9ce8d6bd7cde0f28119cecdb29ac",
          "body": "…ENTS.md",
          "is_bot": false,
          "headline": "docs: add --no-build fast dev cycle and fix stale plugin counts in AG…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T06:22:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab527a5fd960e957961295f38c2cf419447ca471",
          "body": null,
          "is_bot": false,
          "headline": "refactor: merge dns-lookup into dns-globe to remove duplicate DNS plugin",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-18T06:12:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69b7426c339269229dae6533b697b534c4b97a7e",
          "body": "…2 plugins)",
          "is_bot": false,
          "headline": "refactor: move plugin hints from panel bottom border to IPC footer (9…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T15:55:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ba0a173f7de8e0cbf75b44f44f7dfeddc0e75ff",
          "body": "… dot in status bar",
          "is_bot": false,
          "headline": "fix(base64-encoder): remove output border box, fix trailing separator…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T14:16:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d7ffc0ba6c6748c45e02997acec758047ebb07f",
          "body": "… plugin consume ? key",
          "is_bot": false,
          "headline": "fix(base64-encoder): move hints to IPC footer, persist clipboard, let…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T13:56:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56cec499c994979500a1e19f7f5b729f900b343f",
          "body": null,
          "is_bot": false,
          "headline": "fix: ascii-table add 'l' key to load sample data",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T13:30:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6430e17f0dd89b884c3a0482dd40fc98d5fc8d52",
          "body": "…oss 37 plugins",
          "is_bot": false,
          "headline": "fix: correct palette_commands format and render cmd serialization acr…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T13:29:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f205c55c8e8804945c8906de3cf3487ef63042a5",
          "body": null,
          "is_bot": false,
          "headline": "fix: log-viewer palette_commands format + agent test instructions",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T13:03:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdfaf73eedec0463ce41b34cec66ff162b999d9b",
          "body": "- Add LoggerBuffer in santui-core (log::Log impl with ring buffer)\n- Add LogEntry type + HostMsg::LogEntries to IPC protocol\n- Wire LoggerBuffer as global logger in main.rs (forwards to env_logger\n  for stderr, hardcoded to Warn to ignore RUST_LOG leakage)\n- Register log-viewer as persistent default\n[…]\n (press 'l' to toggle)\n- Remove init watchdog (was hiding real failures behind 'forced ready')\n- Convert LogEntries from newtype variant to struct variant (serde\n  tag='type' doesn't support newtypes)",
          "is_bot": false,
          "headline": "feat: runtime log capture via LoggerBuffer + log-viewer plugin",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T12:44:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dfc63254fec38b993041521ebe10af8faec913b8",
          "body": null,
          "is_bot": false,
          "headline": "refactor(starfield): use time-based ticks instead of frame-based",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T10:34:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8dd9ee6733348a8fc8b5a2f768a6e8bfe414f44",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.2.29",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T10:07:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d31c6cd43a9271f6b321efa479624b8f331e0795",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.2.29",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T10:07:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba6c20c120af75a6e14dfeef6b77410496429529",
          "body": "Broken streams (e.g. 1.FM with no audio) could leave the mpv event loop in\na stuck state where subsequent LoadUrl commands were never processed,\ncausing all stations to hang on 'Connecting' forever.\n\n- Every station switch now calls reset_mpv(), which creates a completely\n  fresh mpv handle + thread\n[…]\nops advancing its counter for\n  5s while Connecting/Playing, a forced reset fires automatically.\n- cfg!(test) mock mode prevents parallel tests from corrupting libmpv's\n  non-thread-safe global state.",
          "is_bot": false,
          "headline": "fix(radio-stream-player): recreate mpv handle on every station switch",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T10:03:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e7f0228b3a3b87167ceb84e202fc3533aa767516",
          "body": null,
          "is_bot": false,
          "headline": "fix(radio): pre-drain ALL stale mpv events before LoadUrl, not after",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T08:22:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8a8468623903a29bb6a1b377205646bdf20c384",
          "body": "…-stream retry poisoning",
          "is_bot": false,
          "headline": "fix(radio): separate FileLoaded from Metadata events to prevent stale…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T08:16:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e24527a6627716740e8cd33e22a5d2158f5efdc",
          "body": "… from new stream",
          "is_bot": false,
          "headline": "fix(radio): only drain END_FILE events after LoadUrl, not FILE_LOADED…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T08:12:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7d04db06193b2f3e66383cce337d635f41ff7fb",
          "body": "… scrap broken seq approach\n\n- Remove fake Metadata sent immediately after every LoadUrl (was causing\n  premature Connecting -> Playing transitions that triggered retry loops)\n- Remove redundant Stop before LoadUrl in play_selected_station and retry\n  path (the 'replace' flag already stops current p\n[…]\ne machine later\n- Scrap the load_seq approach — it was fundamentally broken because\n  Stop + LoadUrl events get cross-tagged when last_load_seq is updated\n  before wait_event retrieves the old EndFile",
          "is_bot": false,
          "headline": "fix(radio): drain stale mpv events on LoadUrl, remove redundant Stop,…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T07:36:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2634e9909da85983713eebf3fd792d3e57183394",
          "body": "- Remove spurious MpvMsg::Metadata sent immediately after every LoadUrl,\n  which caused premature Connecting -> Playing transitions before the\n  stream actually connected, triggering a retry cycle.\n- Add load_seq generation counter to filter stale EndFile events from\n  aborted previous loads when rapidly switching stations.\n- Handle EndFile(ERROR) during Connecting with immediate Error state\n  instead of silently dropping it.",
          "is_bot": false,
          "headline": "fix(radio): prevent infinite retry loop from fake Metadata on LoadUrl",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T07:22:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d68f3569959666e2d425318e30f4c4cfa560444",
          "body": "…and handler",
          "is_bot": false,
          "headline": "feat(radio): persist volume across restarts; remove dead palette_comm…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T07:10:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d580b393a97bae6e661f6790a839ad79bb63e75",
          "body": "…ures",
          "is_bot": false,
          "headline": "feat(radio): add exponential backoff retry for stream connection fail…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T07:01:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25cbc8faa575d3d4d2deeb2936d7170e87f9e0e8",
          "body": null,
          "is_bot": false,
          "headline": "fix: remove redundant borrow in format arg to satisfy new clippy lint",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T06:33:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35f4a6ee5fb446fad50f6b6ebf77266faaed7b3b",
          "body": "…ble allow\n\n- arboard 3.3 -> 3.6\n- feed-rs 2.3 -> 2.4\n- rand 0.8 -> 0.10 (9 crates) — updated to new API (rng(), random_range(), etc.)\n- toml 0.8 -> 1.1 — updated to Table-based API\n- notify 7 -> 8\n- sha2/sha1/md-5 0.10 -> 0.11 — fixed LowerHex formatting\n- sysinfo 0.30 -> 0.39 — updated API calls\n- tower-http 0.6 -> 0.7\n- jsonwebtoken 9 -> 10\n- tungstenite 0.24 -> 0.29 — Utf8Bytes type\n- chrono-tz 0.9 -> 0.10\n- convert_case 0.6 -> 0.11\n- qrcode 0.12 -> 0.14\n- zip 2 -> 8",
          "is_bot": false,
          "headline": "chore: bump all deps to latest versions via cargo upgrade --incompati…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-11T06:30:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aee573ade5b0b68f707f514261ed9665896173c5",
          "body": "…lient\n\n- New crate crates/server: axum-based server with JWT auth, REST sync API,\n  SQLite storage, and web UI dashboard/login pages\n- SyncClient in crates/core: best-effort, queue-based, non-blocking push\n  to remote server, driven from main loop\n- Config: add [server] section with server.url for \n[…]\nional sync\n- SantuiDb in main.rs enqueues writes to SyncClient on every set_value()\n- Docs: update architecture.md, README.md, AGENTS.md\n- AGENTS.md: add 'Never delete code unintentionally' convention",
          "is_bot": false,
          "headline": "feat: add optional self-hosted sync server (santui-server) and sync c…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-10T07:00:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7ee3f579d57dac5fdf2d4e06f3ffb640e92c072b",
          "body": null,
          "is_bot": false,
          "headline": "word-wrap lyrics panel instead of truncating long lines",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-10T05:37:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5073c1033adc4e39d62132f122b46e3f5792bcb6",
          "body": "…Starting plugin process...' message",
          "is_bot": false,
          "headline": "remove redundant loading indicators: dot on focused panel title and '…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-10T05:20:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0e1aa148dee07b98900c778ad45c8835fa2608f",
          "body": null,
          "is_bot": false,
          "headline": "Replace Unicode ellipsis … with ASCII ...",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-10T05:08:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "928da19c49d2e95e951f6ad5bda148e60c6a131c",
          "body": "These plugins had entries in plugins-manifest.json but were not in the\nworkspace members list, causing cargo build and dev-setup.sh to skip them:\n\nascii-table, base64-encoder, bmi-calculator, case-converter, color-picker,\ncsv-viewer, hash-calculator, loan-calculator, lorem-generator,\npassword-generator, periodic-table, qr-generator, slug-generator,\nuuid-generator",
          "is_bot": false,
          "headline": "fix: add 14 orphaned plugins to workspace members",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-09T18:57:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adef8ff3efa79009fd2f7de51e4a1afffd7865dc",
          "body": "… nom v1.2.4 dependency\n\nmeval v0.2.0 depends on nom v1.2.4 which will be rejected by future\nRust versions. Replaced with fasteval v0.2.4 (MIT, zero dependencies)\nwhich supports the same expression syntax and built-in functions.",
          "is_bot": false,
          "headline": "fix(math-evaluator): replace meval with fasteval to remove deprecated…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-09T18:11:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47eebbb15c4264c90e499f4006774d3eb52efe21",
          "body": "…ugin",
          "is_bot": false,
          "headline": "feat: add mouse support to plugin host, radio player, and registry pl…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-09T18:07:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2599ee54670d57a44c3dbc1e0c2aea5c0dbb7ef5",
          "body": "cargo update locked 33 packages to latest compatible versions.\nFix unrelated changes in ipc render and quran-reader that were\nleftover from previous work.",
          "is_bot": false,
          "headline": "chore: bump deps and fix registry search change fallout",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-09T04:43:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f523e14755e9aa5e8afb7825f7370769c6cd785",
          "body": "Follows the same pattern as Radio Stream Player — press / to enter\nsearch mode, type to filter by name/description/publisher, Esc to\ncancel, Enter to open detail on the filtered selection. Filtered\ncount shown as N / M available. Cursor blinks while typing.",
          "is_bot": false,
          "headline": "feat(registry): add live search to plugin list",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-08T08:33:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46e858b947b39e0d50b8ac20ba775049d9a45027",
          "body": "…iminate 6 empty lines at bottom",
          "is_bot": false,
          "headline": "fix(registry): use correct table height (ah-4 instead of ah-10) to el…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-08T05:25:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61c62d005838006b44243364d84c9349fa92eb42",
          "body": "…bers",
          "is_bot": false,
          "headline": "docs: clarify plugin addition requires both manifest + Cargo.toml mem…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-08T05:18:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5fb2af647263f111226b30fe772677a9fe52bfbb",
          "body": "Previous sessions added plugins to plugins-manifest.json and created\nsource directories but forgot to include them in the root Cargo.toml\nworkspace members list, causing dev-setup.sh to only register 79/112\nplugins. This adds the missing 31: breathing-exercise, cheatsheet-browser,\ndns-globe, dns-loo\n[…]\ng-traceroute, pipe-runner, snake-game, stock-ticker, subnet-calculator,\nterminal-pet, text-toolkit, totp-viewer, typing-test, wake-on-lan,\nwater-tracker, webhook-tester, websocket-client, whois-lookup",
          "is_bot": false,
          "headline": "fix: add 31 missing plugins to workspace members",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-08T05:06:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1bfec8da977272f2792252f7c41f2db3d18d4448",
          "body": "- mysql-browser: interactive MySQL database browser with mock queries,\n  SHOW TABLES, SELECT, DESCRIBE, INSERT, UPDATE, DELETE, CREATE/DROP TABLE\n- irc-client: IRC chat client with channel list, message view,\n  /join, /nick, /msg, /list commands, Ctrl+Up/Down channel switching\n- Both follow single-binary IPC plugin pattern (mock data, no external deps)",
          "is_bot": false,
          "headline": "feat: add mysql-browser and irc-client plugins",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-08T04:52:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d89c6bba275af1743be03400369643a867f9251",
          "body": "Replace hardcoded 27-row plugin tables in README.md and website/guide/index.md\nwith a dynamic reference to the Plugin Registry. Collapse workspace trees in\nAGENTS.md and docs/development.md to show only key examples + count. Update\nrelease.yml validate step to read plugin IDs from plugins-manifest.json, and\nreplace hardcoded 18-plugin release files list with a wildcard glob.",
          "is_bot": false,
          "headline": "docs: sync plugin listings with 110-plugin count",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-08T04:42:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1789cdf9a5b8c6a2d6452b4fcbb09d694b887a4",
          "body": null,
          "is_bot": false,
          "headline": "docs: add plugins-manifest.json note to AGENTS.md",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-08T04:37:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ff7f76f6c81e8068a5903d4874d0d4dcfa8b363",
          "body": "This is the source of truth used by dev-setup.sh and CI\nto generate plugins.json and platform-specific release manifests.",
          "is_bot": false,
          "headline": "chore: add all 84 missing plugins to plugins-manifest.json",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-08T04:36:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c7c37ebc52f68ad868e2fb5b6899ee946e9f987",
          "body": "…wser, Code Runner, Network Monitor, Time Tracker, Recipe Manager, Package Manager, Music Controller, Mermaid Renderer",
          "is_bot": false,
          "headline": "feat: implement 10 more plugins — AI Chat, SQLite Browser, GitHub Bro…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-08T04:32:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7dfa90a00012a0b5c42e1f54abff0a66b5626af2",
          "body": "Add plugin implementations for:\n  api-monitor, archive-browser, batch-renamer, budget-tracker,\n  chess, cloud-cost, connection-string-builder, dashboard,\n  disk-usage, docker-dashboard, email-client, env-manager,\n  erd-sketch, file-diff, file-explorer, mongo-explorer,\n  pixel-art, port-scanner, post\n[…]\nest, sprint-retro, sql-playground, ssl-checker\n\nAll plugins follow the IPC stdio protocol pattern with bordered\npanels, semantic theme colors, consumed-key handling, and Tick\nsupport in the main loop.",
          "is_bot": false,
          "headline": "feat: implement all 28 remaining plugin IPC binaries",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-08T04:14:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b0e71b3654fae82e3a250c8d4165198498d332d4",
          "body": "… loss",
          "is_bot": false,
          "headline": "docs: fix git push command in release instructions to avoid tag event…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T22:24:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f5e7d6b546ee379810814e744681c9a5d25cc12",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.2.28",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T22:15:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1114d9c051665d408fc168624cae358e7afa1dea",
          "body": null,
          "is_bot": false,
          "headline": "docs: update docs to reflect lefthook pre-commit automation",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T22:12:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71407f57c6cf2dec64ec227bea90738372e8cdfb",
          "body": null,
          "is_bot": false,
          "headline": "fix: remove github URL from about screen copyright line",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T22:10:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8ffa79858bd41a53a5152895e00b76bc0310ee1",
          "body": null,
          "is_bot": false,
          "headline": "fix: highlight key names in home screen hint with accent color",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T22:08:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca40b3eec72d471621ccbd04d976df93ffe6e81b",
          "body": null,
          "is_bot": false,
          "headline": "chore: fix formatting, set up lefthook pre-commit hook",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T22:06:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ed7e9bc717c5c8ea2a8fc72b54dd00b52d91c33",
          "body": null,
          "is_bot": false,
          "headline": "fix: remove double spaces in home screen hint text",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T21:58:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a110bc1beac5ad3963cb9ffcabc4649a2a09bdd6",
          "body": null,
          "is_bot": false,
          "headline": "chore: replace 'Sony AK' with 'Santui contributors' in website footer",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T21:54:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc9ad9b8a1deafb71f90ca86bc478dd5642ec36f",
          "body": null,
          "is_bot": false,
          "headline": "fix: dynamically compute copyright year, credit Santui contributors",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T21:53:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "94e63c45d3bf0aa09e16213682ec8d4dfdc676ec",
          "body": "…hrough gaps",
          "is_bot": false,
          "headline": "feat(splash): render logo character-by-character so starfield shows t…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T21:38:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc5956ea57699a773126a3e5a9c1fda54d87269f",
          "body": "…uring Connecting, add 10s timeout",
          "is_bot": false,
          "headline": "fix(radio): always send Metadata on stream events and guard EndFile d…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T21:24:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a87da40fc8ccd0e1fd653c982a050405a85362f",
          "body": "… title is empty",
          "is_bot": false,
          "headline": "fix(radio): transition Connecting→Playing on first Metadata even when…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T21:17:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "963ca7dc5a090541d5b1c6c81c969e7de31c951f",
          "body": null,
          "is_bot": false,
          "headline": "feat(radio): show lyrics source attribution in lyrics panel footer",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T21:11:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7749d16a7e9367c645b50776eb7032b8ab0f8f91",
          "body": "…itioning",
          "is_bot": false,
          "headline": "refactor(radio): extract Now Playing title to constant for volume pos…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T21:09:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "889ec7d0f12d6778807d200b672b7a73f0f251b4",
          "body": null,
          "is_bot": false,
          "headline": "feat(radio): show scroll position percentage on stations list",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T21:01:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a6d4d5242588c7fa7bc07992a10b547239f304e",
          "body": null,
          "is_bot": false,
          "headline": "fix(radio): add 8s HTTP timeout to lrclib and itunes lyric lookups",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:56:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a18a7c85430279f12bd9e5d6ea6c39b85a64b984",
          "body": "…nting wrong group placement",
          "is_bot": false,
          "headline": "fix(core): invalidate palette cache when registry items change, preve…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:47:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f93f34e29fc79f5f45c4f62e9c3b6b48dafa499",
          "body": null,
          "is_bot": false,
          "headline": "fix(radio): remove redundant palette commands from home screen",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:37:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0707cf17b773977308499176eb0ca39594258316",
          "body": null,
          "is_bot": false,
          "headline": "fix(radio): dim stations table text when lyrics panel has focus",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:32:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c62f8d6fb58bfedc9051208c6be8702cad5170c4",
          "body": null,
          "is_bot": false,
          "headline": "fix(radio): Now Playing panel should never appear dimmed",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:30:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c358581053e86a572ec3304b3f62317c2b9214b9",
          "body": null,
          "is_bot": false,
          "headline": "fix(radio): align stations table header color with registry (text_muted)",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:27:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5aacebb4594da82d08c6a18abde8a345e34e875c",
          "body": "…d, bright when focused",
          "is_bot": false,
          "headline": "fix(radio): lyrics content follows panel focus — dimmed when unfocuse…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:25:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08dcce041963b8e2cfe564d509062e71622fae21",
          "body": "…ocused, not scroll hints",
          "is_bot": false,
          "headline": "fix(radio): show 'tab stations' hint on stations footer when lyrics f…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:19:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7ab27d6bd4ae90d16143d006965d237aca23776",
          "body": null,
          "is_bot": false,
          "headline": "fix(radio): stations panel appeared dimmed when lyrics were hidden",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:17:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc97dfc8131ff3fbc4a286888d8e10e365ea3afd",
          "body": null,
          "is_bot": false,
          "headline": "revert(radio,registry): restore muted table header color",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:15:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93aacc64e1b2893eacf90bc8401c69680f7af6d1",
          "body": null,
          "is_bot": false,
          "headline": "chore(radio): use clearer 'show lyrics'/'hide lyrics' hint labels",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:15:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63b20bb8d791e0c86aeae408c27f059924211b61",
          "body": "…isible",
          "is_bot": false,
          "headline": "feat(radio): dim unfocused panel borders and titles when lyrics are v…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:11:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f743baf777170206cdcd9ae7b081f156563860c8",
          "body": null,
          "is_bot": false,
          "headline": "fix(radio): opening lyrics panel no longer steals keyboard focus",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T20:06:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75663de3b9dfb6c29e5aef35ffe37d9758b0e5ee",
          "body": null,
          "is_bot": false,
          "headline": "feat(radio): add Connecting state for playback lifecycle feedback",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T19:54:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d08d5982e44c93c4d607810ba3522aa6e271a1b9",
          "body": "… line",
          "is_bot": false,
          "headline": "fix(radio): PageUp/PageDown in lyrics now scrolls by full page, not 1…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T19:50:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c80a927e0097aa41e99903ac5fe1c64a52a58ce",
          "body": "…nt lines",
          "is_bot": false,
          "headline": "fix(radio): use accent color for table headers, add spacing before hi…",
          "author_name": "Sony AK",
          "author_login": "sonyarianto",
          "committed_at": "2026-07-06T19:42:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 21,
      "commits_last_year": 563,
      "latest_release_at": "2026-07-23T02:25:42Z",
      "latest_release_tag": "v0.2.31",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 6,
      "days_since_latest_release": 1,
      "mean_days_between_releases": 2.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "santui-db",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/santui-db",
          "is_deprecated": false,
          "latest_version": "0.2.31",
          "repository_url": "https://github.com/sonyarianto/santui",
          "versions_count": 19,
          "total_downloads": 425,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 142,
          "first_published_at": "2026-06-21T10:11:49.093827Z",
          "latest_published_at": "2026-07-18T18:11:43.422612Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 5
        },
        {
          "name": "santui",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/santui",
          "is_deprecated": false,
          "latest_version": "0.2.31",
          "repository_url": "https://github.com/sonyarianto/santui",
          "versions_count": 20,
          "total_downloads": 351,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 117,
          "first_published_at": "2026-06-21T06:00:30.669747Z",
          "latest_published_at": "2026-07-18T18:14:02.953489Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 5
        },
        {
          "name": "santui-ipc",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/santui-ipc",
          "is_deprecated": false,
          "latest_version": "0.2.31",
          "repository_url": "https://github.com/sonyarianto/santui",
          "versions_count": 22,
          "total_downloads": 504,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 168,
          "first_published_at": "2026-06-21T05:46:13.323084Z",
          "latest_published_at": "2026-07-18T18:09:16.389892Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 5
        },
        {
          "name": "santui-auth",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/santui-auth",
          "is_deprecated": false,
          "latest_version": "0.2.31",
          "repository_url": "https://github.com/sonyarianto/santui",
          "versions_count": 22,
          "total_downloads": 499,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 166,
          "first_published_at": "2026-06-21T05:47:27.210511Z",
          "latest_published_at": "2026-07-18T18:10:31.288689Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 5
        },
        {
          "name": "santui-core",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/santui-core",
          "is_deprecated": false,
          "latest_version": "0.2.31",
          "repository_url": "https://github.com/sonyarianto/santui",
          "versions_count": 22,
          "total_downloads": 683,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 228,
          "first_published_at": "2026-06-21T05:45:10.439762Z",
          "latest_published_at": "2026-07-18T18:08:10.005114Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 5
        },
        {
          "name": "santui",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "tui",
            "terminal",
            "launcher",
            "santui"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/santui",
          "is_deprecated": false,
          "latest_version": "0.2.31",
          "repository_url": "https://github.com/sonyarianto/santui",
          "versions_count": 30,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3036,
          "first_published_at": "2026-06-20T09:41:03.924000Z",
          "latest_published_at": "2026-07-18T18:07:44.164000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "santui-registry",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/santui-registry",
          "is_deprecated": false,
          "latest_version": "0.2.31",
          "repository_url": "https://github.com/sonyarianto/santui",
          "versions_count": 22,
          "total_downloads": 556,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 185,
          "first_published_at": "2026-06-21T05:43:53.443169Z",
          "latest_published_at": "2026-07-18T18:12:49.380189Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 12,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 9
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "Cargo.toml",
        "crates/app/Cargo.toml",
        "crates/auth/Cargo.toml",
        "crates/core/Cargo.toml",
        "crates/db/Cargo.toml",
        "crates/dev-setup/Cargo.toml",
        "crates/ipc/Cargo.toml",
        "crates/plugins/ai-chat/Cargo.toml",
        "crates/plugins/api-monitor/Cargo.toml",
        "crates/plugins/archive-browser/Cargo.toml",
        "crates/plugins/ascii-table/Cargo.toml",
        "crates/plugins/base64-encoder/Cargo.toml",
        "crates/plugins/batch-renamer/Cargo.toml",
        "crates/plugins/bmi-calculator/Cargo.toml",
        "crates/plugins/bookmark-launcher/Cargo.toml",
        "crates/plugins/breathing-exercise/Cargo.toml",
        "crates/plugins/budget-tracker/Cargo.toml",
        "crates/plugins/calendar-agenda/Cargo.toml",
        "crates/plugins/case-converter/Cargo.toml",
        "crates/plugins/cheatsheet-browser/Cargo.toml",
        "crates/plugins/chess/Cargo.toml",
        "crates/plugins/clipboard-history/Cargo.toml",
        "crates/plugins/cloud-cost/Cargo.toml",
        "crates/plugins/code-runner/Cargo.toml",
        "crates/plugins/color-picker/Cargo.toml",
        "crates/plugins/connection-string-builder/Cargo.toml",
        "crates/plugins/cron-expression-helper/Cargo.toml",
        "crates/plugins/csv-viewer/Cargo.toml",
        "crates/plugins/currency-converter/Cargo.toml",
        "crates/plugins/dashboard/Cargo.toml",
        "crates/plugins/dictionary-thesaurus/Cargo.toml",
        "crates/plugins/disk-usage/Cargo.toml",
        "crates/plugins/dns-globe/Cargo.toml",
        "crates/plugins/docker-dashboard/Cargo.toml",
        "crates/plugins/email-client/Cargo.toml",
        "crates/plugins/env-manager/Cargo.toml",
        "crates/plugins/erd-sketch/Cargo.toml",
        "crates/plugins/expense-splitter/Cargo.toml",
        "crates/plugins/file-diff/Cargo.toml",
        "crates/plugins/file-explorer/Cargo.toml",
        "crates/plugins/flashcards/Cargo.toml",
        "crates/plugins/fortune-cookie/Cargo.toml",
        "crates/plugins/game-of-life/Cargo.toml",
        "crates/plugins/git-repository-dashboard/Cargo.toml",
        "crates/plugins/github-browser/Cargo.toml",
        "crates/plugins/gpg-encryptor/Cargo.toml",
        "crates/plugins/graphql-playground/Cargo.toml",
        "crates/plugins/habit-tracker/Cargo.toml",
        "crates/plugins/hacker-news-reader/Cargo.toml",
        "crates/plugins/hash-calculator/Cargo.toml",
        "crates/plugins/hex-viewer/Cargo.toml",
        "crates/plugins/http-client/Cargo.toml",
        "crates/plugins/iptv-player/Cargo.toml",
        "crates/plugins/irc-client/Cargo.toml",
        "crates/plugins/json-yaml-formatter/Cargo.toml",
        "crates/plugins/jwt-inspector/Cargo.toml",
        "crates/plugins/k8s-viewer/Cargo.toml",
        "crates/plugins/kanban-board/Cargo.toml",
        "crates/plugins/loan-calculator/Cargo.toml",
        "crates/plugins/log-viewer/Cargo.toml",
        "crates/plugins/lorem-generator/Cargo.toml",
        "crates/plugins/markdown-previewer/Cargo.toml",
        "crates/plugins/math-evaluator/Cargo.toml",
        "crates/plugins/mermaid-renderer/Cargo.toml",
        "crates/plugins/mongo-explorer/Cargo.toml",
        "crates/plugins/music-player-controller/Cargo.toml",
        "crates/plugins/music-preview/Cargo.toml",
        "crates/plugins/mysql-browser/Cargo.toml",
        "crates/plugins/network-bandwidth-monitor/Cargo.toml",
        "crates/plugins/package-manager/Cargo.toml",
        "crates/plugins/package-version-monitor/Cargo.toml",
        "crates/plugins/password-generator/Cargo.toml",
        "crates/plugins/path-editor/Cargo.toml",
        "crates/plugins/periodic-table/Cargo.toml",
        "crates/plugins/ping-traceroute/Cargo.toml",
        "crates/plugins/pipe-runner/Cargo.toml",
        "crates/plugins/pixel-art/Cargo.toml",
        "crates/plugins/pomodoro-timer/Cargo.toml",
        "crates/plugins/port-scanner/Cargo.toml",
        "crates/plugins/postgres-console/Cargo.toml",
        "crates/plugins/process-manager/Cargo.toml",
        "crates/plugins/qr-generator/Cargo.toml",
        "crates/plugins/quick-notes/Cargo.toml",
        "crates/plugins/quran-reader/Cargo.toml",
        "crates/plugins/radio-stream-player/Cargo.toml",
        "crates/plugins/radio-stream-player/scraper/Cargo.toml",
        "crates/plugins/recipe-manager/Cargo.toml",
        "crates/plugins/redis-explorer/Cargo.toml",
        "crates/plugins/regex-tester/Cargo.toml",
        "crates/plugins/registry/Cargo.toml",
        "crates/plugins/rss-reader/Cargo.toml",
        "crates/plugins/sdk-playground/Cargo.toml",
        "crates/plugins/service-manager/Cargo.toml",
        "crates/plugins/slug-generator/Cargo.toml",
        "crates/plugins/snake-game/Cargo.toml",
        "crates/plugins/snippet-manager/Cargo.toml",
        "crates/plugins/speed-test/Cargo.toml",
        "crates/plugins/sprint-retro/Cargo.toml",
        "crates/plugins/sql-playground/Cargo.toml",
        "crates/plugins/sqlite-browser/Cargo.toml",
        "crates/plugins/ssh-manager/Cargo.toml",
        "crates/plugins/ssl-checker/Cargo.toml",
        "crates/plugins/stock-ticker/Cargo.toml",
        "crates/plugins/subnet-calculator/Cargo.toml",
        "crates/plugins/system-monitor/Cargo.toml",
        "crates/plugins/terminal-pet/Cargo.toml",
        "crates/plugins/text-toolkit/Cargo.toml",
        "crates/plugins/time-tracker/Cargo.toml",
        "crates/plugins/todo-task-manager/Cargo.toml",
        "crates/plugins/totp-viewer/Cargo.toml",
        "crates/plugins/typing-test/Cargo.toml",
        "crates/plugins/unit-converter/Cargo.toml",
        "crates/plugins/uuid-generator/Cargo.toml",
        "crates/plugins/wake-on-lan/Cargo.toml",
        "crates/plugins/water-tracker/Cargo.toml",
        "crates/plugins/weather/Cargo.toml",
        "crates/plugins/webhook-tester/Cargo.toml",
        "crates/plugins/websocket-client/Cargo.toml",
        "crates/plugins/whois-lookup/Cargo.toml",
        "crates/plugins/world-clock/Cargo.toml",
        "crates/registry/Cargo.toml",
        "crates/server/Cargo.toml",
        "templates/plugin/Cargo.toml"
      ],
      "largest_source_bytes": 89343,
      "source_files_sampled": 218,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 8657
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml",
        "website/package.json"
      ],
      "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": [
        "crates",
        "npm"
      ],
      "dependencies": [
        {
          "name": "santui-core",
          "manifest": "crates/app/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2.31"
        },
        {
          "name": "santui-ipc",
          "manifest": "crates/app/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2.31"
        },
        {
          "name": "santui-auth",
          "manifest": "crates/app/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2.31"
        },
        {
          "name": "santui-registry",
          "manifest": "crates/app/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2.31"
        },
        {
          "name": "santui-db",
          "manifest": "crates/app/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2.31"
        },
        {
          "name": "rusqlite",
          "manifest": "crates/app/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.40"
        },
        {
          "name": "log",
          "manifest": "crates/app/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "env_logger",
          "manifest": "crates/app/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "santui-core",
          "manifest": "crates/auth/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2.31"
        },
        {
          "name": "ureq",
          "manifest": "crates/auth/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "url",
          "manifest": "crates/auth/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "serde",
          "manifest": "crates/auth/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde_json",
          "manifest": "crates/auth/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "dirs",
          "manifest": "crates/auth/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "6"
        },
        {
          "name": "ratatui",
          "manifest": "crates/core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.30"
        },
        {
          "name": "crossterm",
          "manifest": "crates/core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.29"
        },
        {
          "name": "serde",
          "manifest": "crates/core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde_json",
          "manifest": "crates/core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "toml",
          "manifest": "crates/core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.1"
        },
        {
          "name": "log",
          "manifest": "crates/core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "ctrlc",
          "manifest": "crates/core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3.5"
        },
        {
          "name": "notify",
          "manifest": "crates/core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "8"
        },
        {
          "name": "ureq",
          "manifest": "crates/core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "rusqlite",
          "manifest": "crates/db/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.40"
        },
        {
          "name": "serde",
          "manifest": "crates/db/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde_json",
          "manifest": "crates/db/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde",
          "manifest": "crates/dev-setup/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde_json",
          "manifest": "crates/dev-setup/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "sha2",
          "manifest": "crates/dev-setup/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "rayon",
          "manifest": "crates/dev-setup/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "santui-core",
          "manifest": "crates/ipc/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2.31"
        },
        {
          "name": "ratatui",
          "manifest": "crates/ipc/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.30"
        },
        {
          "name": "crossterm",
          "manifest": "crates/ipc/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.29"
        },
        {
          "name": "serde",
          "manifest": "crates/ipc/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde_json",
          "manifest": "crates/ipc/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "bincode",
          "manifest": "crates/ipc/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "log",
          "manifest": "crates/ipc/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "santui-core",
          "manifest": "crates/registry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2.31"
        },
        {
          "name": "serde",
          "manifest": "crates/registry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde_json",
          "manifest": "crates/registry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "toml",
          "manifest": "crates/registry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.1"
        },
        {
          "name": "ureq",
          "manifest": "crates/registry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "sha2",
          "manifest": "crates/registry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.11"
        },
        {
          "name": "santui-core",
          "manifest": "crates/server/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2.31"
        },
        {
          "name": "axum",
          "manifest": "crates/server/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "tokio",
          "manifest": "crates/server/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tower-http",
          "manifest": "crates/server/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.7"
        },
        {
          "name": "serde",
          "manifest": "crates/server/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde_json",
          "manifest": "crates/server/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "jsonwebtoken",
          "manifest": "crates/server/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "10"
        },
        {
          "name": "rusqlite",
          "manifest": "crates/server/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.40"
        },
        {
          "name": "ureq",
          "manifest": "crates/server/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "tracing",
          "manifest": "crates/server/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "tracing-subscriber",
          "manifest": "crates/server/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "clap",
          "manifest": "crates/server/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "4"
        },
        {
          "name": "santui-ipc",
          "manifest": "templates/plugin/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde",
          "manifest": "templates/plugin/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "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": 3,
        "open_issues": 9,
        "closed_ratio": 0.917,
        "closed_issues": 100,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "sonyarianto",
          "commits": 555,
          "avatar_url": "https://avatars.githubusercontent.com/u/333051?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock",
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/25 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 5,
            "reason": "5 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "e8194fcad07944731aa2687e1d7dd4f659e931ac",
        "ran_at": "2026-07-24T04:06:54Z",
        "aggregate_score": 3,
        "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-18T18:25:55Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-18T13:25:53Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 3,
          "created_at": "2026-06-27T07:32:26Z",
          "last_comment_at": "2026-06-27T21:08:23Z",
          "last_comment_author": "sonyarianto"
        },
        {
          "number": 4,
          "created_at": "2026-06-27T07:32:29Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 6,
          "created_at": "2026-06-27T07:32:32Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 10,
          "created_at": "2026-06-27T07:32:58Z",
          "last_comment_at": "2026-06-27T21:08:21Z",
          "last_comment_author": "sonyarianto"
        },
        {
          "number": 13,
          "created_at": "2026-06-27T07:33:00Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 17,
          "created_at": "2026-06-27T21:15:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 24,
          "created_at": "2026-06-29T19:53:53Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 110,
          "created_at": "2026-07-11T07:14:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 112,
          "created_at": "2026-07-23T10:30:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/sonyarianto/santui",
    "host": "github.com",
    "name": "santui",
    "owner": "sonyarianto"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 31,
        "vitality": 71,
        "community": 39,
        "governance": 60,
        "engineering": 81
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 71,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "commits_last_year": 563,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 6
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "6/52 weeks with commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "563 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 563
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 21,
              "latest_release_tag": "v0.2.31",
              "releases_from_tags": false,
              "days_since_latest_release": 1,
              "mean_days_between_releases": 2.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "21 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 21
                    }
                  }
                ],
                "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 ~2.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 39,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 17,
            "inputs": {
              "forks": 0,
              "stars": 12,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "12 stars",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "packages": [
                "santui-db",
                "santui",
                "santui-ipc",
                "santui-auth",
                "santui-core",
                "santui",
                "santui-registry"
              ],
              "dependents": null,
              "ecosystems": "crates, npm",
              "total_downloads": 3018,
              "monthly_downloads": 4042
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "4,042 downloads/month across crates, npm",
                "points": 48.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 4042,
                      "ecosystems": "crates, npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 60,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "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 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "merged_prs": 3,
              "open_issues": 9,
              "closed_issues": 100,
              "issue_closed_ratio": 0.917,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "92% of issues closed",
                "points": 42.9,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 92
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "3/3 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 3,
                      "decided": 3
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/25 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 62,
            "inputs": {
              "followers": 95,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "sonyarianto",
              "public_repos": 104,
              "account_age_days": 5852
            },
            "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": "95 followers of sonyarianto",
                "points": 14.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 95,
                      "login": "sonyarianto"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "104 public repos, account ~16 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 104
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 16
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "santui-db",
                "santui",
                "santui-ipc",
                "santui-auth",
                "santui-core",
                "santui",
                "santui-registry"
              ],
              "ecosystems": "crates, npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "7 package(s) on crates, npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 7,
                      "ecosystems": "crates, npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "30 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 30
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 81,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "cli",
                "plugins",
                "ratatui",
                "terminal"
              ],
              "has_wiki": true,
              "homepage": "https://santuiapp.vercel.app",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://santuiapp.vercel.app",
                "points": 15,
                "status": "met",
                "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": "4 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Security",
        "value": 31,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 31,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3
            },
            "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": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/25 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "5 existing vulnerabilities detected",
                "points": 3.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 74,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.97,
              "agent_instruction_files": [
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 8657
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "97 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 97,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock",
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "Cargo.toml",
                "crates/app/Cargo.toml",
                "crates/auth/Cargo.toml",
                "crates/core/Cargo.toml",
                "crates/db/Cargo.toml",
                "crates/dev-setup/Cargo.toml",
                "crates/ipc/Cargo.toml",
                "crates/plugins/ai-chat/Cargo.toml",
                "crates/plugins/api-monitor/Cargo.toml",
                "crates/plugins/archive-browser/Cargo.toml",
                "crates/plugins/ascii-table/Cargo.toml",
                "crates/plugins/base64-encoder/Cargo.toml",
                "crates/plugins/batch-renamer/Cargo.toml",
                "crates/plugins/bmi-calculator/Cargo.toml",
                "crates/plugins/bookmark-launcher/Cargo.toml",
                "crates/plugins/breathing-exercise/Cargo.toml",
                "crates/plugins/budget-tracker/Cargo.toml",
                "crates/plugins/calendar-agenda/Cargo.toml",
                "crates/plugins/case-converter/Cargo.toml",
                "crates/plugins/cheatsheet-browser/Cargo.toml",
                "crates/plugins/chess/Cargo.toml",
                "crates/plugins/clipboard-history/Cargo.toml",
                "crates/plugins/cloud-cost/Cargo.toml",
                "crates/plugins/code-runner/Cargo.toml",
                "crates/plugins/color-picker/Cargo.toml",
                "crates/plugins/connection-string-builder/Cargo.toml",
                "crates/plugins/cron-expression-helper/Cargo.toml",
                "crates/plugins/csv-viewer/Cargo.toml",
                "crates/plugins/currency-converter/Cargo.toml",
                "crates/plugins/dashboard/Cargo.toml",
                "crates/plugins/dictionary-thesaurus/Cargo.toml",
                "crates/plugins/disk-usage/Cargo.toml",
                "crates/plugins/dns-globe/Cargo.toml",
                "crates/plugins/docker-dashboard/Cargo.toml",
                "crates/plugins/email-client/Cargo.toml",
                "crates/plugins/env-manager/Cargo.toml",
                "crates/plugins/erd-sketch/Cargo.toml",
                "crates/plugins/expense-splitter/Cargo.toml",
                "crates/plugins/file-diff/Cargo.toml",
                "crates/plugins/file-explorer/Cargo.toml",
                "crates/plugins/flashcards/Cargo.toml",
                "crates/plugins/fortune-cookie/Cargo.toml",
                "crates/plugins/game-of-life/Cargo.toml",
                "crates/plugins/git-repository-dashboard/Cargo.toml",
                "crates/plugins/github-browser/Cargo.toml",
                "crates/plugins/gpg-encryptor/Cargo.toml",
                "crates/plugins/graphql-playground/Cargo.toml",
                "crates/plugins/habit-tracker/Cargo.toml",
                "crates/plugins/hacker-news-reader/Cargo.toml",
                "crates/plugins/hash-calculator/Cargo.toml",
                "crates/plugins/hex-viewer/Cargo.toml",
                "crates/plugins/http-client/Cargo.toml",
                "crates/plugins/iptv-player/Cargo.toml",
                "crates/plugins/irc-client/Cargo.toml",
                "crates/plugins/json-yaml-formatter/Cargo.toml",
                "crates/plugins/jwt-inspector/Cargo.toml",
                "crates/plugins/k8s-viewer/Cargo.toml",
                "crates/plugins/kanban-board/Cargo.toml",
                "crates/plugins/loan-calculator/Cargo.toml",
                "crates/plugins/log-viewer/Cargo.toml",
                "crates/plugins/lorem-generator/Cargo.toml",
                "crates/plugins/markdown-previewer/Cargo.toml",
                "crates/plugins/math-evaluator/Cargo.toml",
                "crates/plugins/mermaid-renderer/Cargo.toml",
                "crates/plugins/mongo-explorer/Cargo.toml",
                "crates/plugins/music-player-controller/Cargo.toml",
                "crates/plugins/music-preview/Cargo.toml",
                "crates/plugins/mysql-browser/Cargo.toml",
                "crates/plugins/network-bandwidth-monitor/Cargo.toml",
                "crates/plugins/package-manager/Cargo.toml",
                "crates/plugins/package-version-monitor/Cargo.toml",
                "crates/plugins/password-generator/Cargo.toml",
                "crates/plugins/path-editor/Cargo.toml",
                "crates/plugins/periodic-table/Cargo.toml",
                "crates/plugins/ping-traceroute/Cargo.toml",
                "crates/plugins/pipe-runner/Cargo.toml",
                "crates/plugins/pixel-art/Cargo.toml",
                "crates/plugins/pomodoro-timer/Cargo.toml",
                "crates/plugins/port-scanner/Cargo.toml",
                "crates/plugins/postgres-console/Cargo.toml",
                "crates/plugins/process-manager/Cargo.toml",
                "crates/plugins/qr-generator/Cargo.toml",
                "crates/plugins/quick-notes/Cargo.toml",
                "crates/plugins/quran-reader/Cargo.toml",
                "crates/plugins/radio-stream-player/Cargo.toml",
                "crates/plugins/radio-stream-player/scraper/Cargo.toml",
                "crates/plugins/recipe-manager/Cargo.toml",
                "crates/plugins/redis-explorer/Cargo.toml",
                "crates/plugins/regex-tester/Cargo.toml",
                "crates/plugins/registry/Cargo.toml",
                "crates/plugins/rss-reader/Cargo.toml",
                "crates/plugins/sdk-playground/Cargo.toml",
                "crates/plugins/service-manager/Cargo.toml",
                "crates/plugins/slug-generator/Cargo.toml",
                "crates/plugins/snake-game/Cargo.toml",
                "crates/plugins/snippet-manager/Cargo.toml",
                "crates/plugins/speed-test/Cargo.toml",
                "crates/plugins/sprint-retro/Cargo.toml",
                "crates/plugins/sql-playground/Cargo.toml",
                "crates/plugins/sqlite-browser/Cargo.toml",
                "crates/plugins/ssh-manager/Cargo.toml",
                "crates/plugins/ssl-checker/Cargo.toml",
                "crates/plugins/stock-ticker/Cargo.toml",
                "crates/plugins/subnet-calculator/Cargo.toml",
                "crates/plugins/system-monitor/Cargo.toml",
                "crates/plugins/terminal-pet/Cargo.toml",
                "crates/plugins/text-toolkit/Cargo.toml",
                "crates/plugins/time-tracker/Cargo.toml",
                "crates/plugins/todo-task-manager/Cargo.toml",
                "crates/plugins/totp-viewer/Cargo.toml",
                "crates/plugins/typing-test/Cargo.toml",
                "crates/plugins/unit-converter/Cargo.toml",
                "crates/plugins/uuid-generator/Cargo.toml",
                "crates/plugins/wake-on-lan/Cargo.toml",
                "crates/plugins/water-tracker/Cargo.toml",
                "crates/plugins/weather/Cargo.toml",
                "crates/plugins/webhook-tester/Cargo.toml",
                "crates/plugins/websocket-client/Cargo.toml",
                "crates/plugins/whois-lookup/Cargo.toml",
                "crates/plugins/world-clock/Cargo.toml",
                "crates/registry/Cargo.toml",
                "crates/server/Cargo.toml",
                "templates/plugin/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml, crates/app/Cargo.toml, crates/auth/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml, crates/app/Cargo.toml, crates/auth/Cargo.toml"
                    }
                  }
                ],
                "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": "Rust (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "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": "Rust",
              "largest_source_bytes": 89343,
              "source_files_sampled": 218,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/218 source files over 60KB",
                "points": 54.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 218,
                      "oversized": 1
                    }
                  }
                ],
                "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Could not fetch npm package 'santui-website' from its registry",
    "Could not fetch crates package 'santui-server' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T04:07:04.713341Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/sonyarianto/santui.svg",
  "full_name": "sonyarianto/santui",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadascrates.io, npm.