01 / 11
KMP + IA · caso de estudio

Cómo klibs.io cambia la forma de elegir librerías multiplataforma

Un caso real: migrar el sistema de charts de PiggyBank descubrió que el README nunca cuenta toda la historia — y que evaluar KMP a mano no escala.

Carlos Ugaz  /  github.com/carlosgub/PiggyBank
01 · el problema

Kotlin Multiplatform tiene un problema de descubrimiento.

No es falta de librerías — es falta de visibilidad. ¿Soporta iOS de verdad o solo declara el target? ¿Está mantenida? ¿Qué tan real es esa feature que promete el README?

4,300+
librerías catalogadas en klibs.io
3
repos que tuvimos que clonar a mano para confirmar una sola feature
0
de esos detalles aparecía en el README
02 · el caso real

PiggyBank corría con su propia librería de charts.

kotlinm-charts: una lib propia (carlosgub/kotlinm-charts) usada en producción para los bar & line charts de la app. Migrar el resto del stack a Kotlin 2.4 / Compose 1.12 era el momento perfecto para probar si klibs.io encontraba algo mejor.

en producción

FinanceBarChart & FinanceLineChart

Gasto diario por mes, con overlay táctil mostrando el monto exacto del día tocado — una feature real, no decorativa.

la pregunta

¿Existe algo mejor en klibs.io?

Mismo soporte Android + iOS, mejor mantenimiento, sin perder la interacción táctil que ya usa la app.

03 · la búsqueda

La búsqueda encontró 4 candidatos serios.

Todos con bar chart + line chart, todos publicados en Maven Central. En superficie, se ven casi idénticos.

LibreríaStarsPlataformasNotas
HDCharts454 ★ Android + iOS Interacción táctil real, docs completas
AAY-chart681 ★ Android + iOS Más popular — sin gestos de selección
compose-multiplatform-chart7 ★ Android + iOS Nicho, pensado para datasets grandes
kmpcharts1 ★ Android + iOS Muy joven, tooltip documentado en README
04 · lo que el readme no dice

La librería con más estrellas no tenía la feature que necesitábamos.

Ningún README menciona si el tap-to-select realmente existe. Solo clonando el código fuente se puede confirmar.

681 ★ · AAY-chart

Cero código de gestos

Sin detectTapGestures, sin pointerInput en LineChart.kt ni BarChart.kt. La lib más popular del catálogo no tiene selección táctil.

454 ★ · HDCharts

Interacción real… pero interna

BarChartInteractionModifiers.kt, selectedBarIndex, tap+drag+pinch reales. El callback onValueChanged existe — pero nunca se expone en la función pública BarChart().

05 · la decisión

Ninguna alternativa iguala 1:1 el overlay custom.

Con HDCharts elegido por su interacción real, quedaban tres caminos honestos sobre la mesa:

A

Aceptar el header nativo de HDCharts

El valor tocado reemplaza el título interno del chart — funcional, pero no es tu diseño.

B

Quitar la interacción — la elegida

El bar chart queda visual, sin tooltip al tocar. Honesto sobre lo que la librería puede dar hoy.

C

Mantener kotlinm-charts solo ahí

Cero regresión, pero dos librerías de charts conviviendo en la misma app.

06 · el bug oculto

31 barras, un ancho por defecto, un botón "+" que nadie pidió.

Con minBarWidth y space por defecto (10.dp cada uno), HDCharts no encontraba espacio para 31 días y activaba su modo denso — un toggle "[+]" sin estilo, que nunca existió en el diseño original.

Bug: toggle de modo denso sin estilo apareciendo en el header azul
antes del fix

El header muestra un [+] negro flotando sobre el fondo azul — ningún diseño lo contemplaba.

07 · antes / después

El fix real: hacer las barras más angostas.

Con minBarWidth = 3.dp y space = 1.dp, las 31 barras caben sin activar el modo denso.

FinanceBarChart.kt · antes
// dispara modo denso con 31 días
BarChartDefaults.style(
    barColor = barColor,
    yAxisLabelsVisible = withYChart,
    zoomControlsVisible = false,
    selectionLineVisible = false,
)
FinanceBarChart.kt · después
BarChartDefaults.style(
    barColor = barColor,
    yAxisLabelsVisible = withYChart,
    zoomControlsVisible = false,
    selectionLineVisible = false,
    space = 1.dp,
    minBarWidth = 3.dp,
)
08 · primer resultado

Funcionando en Android e iOS, con HDCharts.

Compose Multiplatform puro: el mismo commonMain renderiza igual en ambas plataformas vía Skia. Pero esto todavía no es el final de la historia.

Line chart funcionando en Android
Android · Pixel emulator
App funcionando en iOS simulator
iOS · iPhone 16 simulator
09 · el mcp real

Así que lo construimos: klibs-mcp.

Dos tools, MCP Kotlin SDK, corriendo por stdio. Nada de scraping — consulta GitHub y Maven Central directo, la misma verificación que hicimos a mano pero automatizada.

search_kmp_candidates("charts")
bytebeats/compose-charts-desktop  (34★)
Tweener/chartopia  (26★)
carlosgub/kotlinm-charts  (23★)
Jeremy-Gitau/multiplot  (4★)
// tu propia lib, encontrada por el mismo tool...
// ...pero algo importante falta en esta lista
check_maven_central(dautovicharis, charts)
io.github.dautovicharis:charts:2.4.0
(latest of 9 published versions
 last updated 2026-08-01)

// el índice Solr de Maven Central mostraba
// solo 2 de las 9 versiones -- tuvimos que
// leer maven-metadata.xml directo para confiar en el dato
10 · el bug que casi repetimos

"En klibs.io no encuentro el mío, y tampoco los de +200 estrellas."

Esa fue la pregunta que destapó todo. Mi propia tool tenía el mismo problema que vinimos a resolver: un filtro rígido topic:kotlin-multiplatform excluía librerías reales que se etiquetan distinto.

AAY-chart · 681★

Topics: kmp, multiplatform

No usa el topic exacto kotlin-multiplatform — el filtro la descartaba entera.

HDCharts · 454★

Topics: compose-multiplatform

Ninguna variante de "multiplatform" ni "kmp" — la librería que terminamos usando, invisible para mi propio tool.

Y sobre kotlinm-charts: klibs.io exige "at least one artifact published to Maven Central" — tu lib vive en GitHub Packages, así que estructuralmente nunca podría entrar al catálogo.

11 · el fix revela algo mejor

Sin el filtro rígido, aparece un candidato que no habíamos visto.

Reemplazar topic:kotlin-multiplatform por una búsqueda de texto libre en name/description/topics cambió todo el resultado:

LibreríaStarsNota
patrykandpatrick/vico3158 ★ Invisible hasta arreglar el filtro
KoalaPlot/koalaplot-core782 ★ Tampoco aparecía antes
TheChance101/AAY-chart681 ★ Recuperada
HDCharts/charts454 ★ Recuperada — la que ya habíamos migrado
12 · vico vs hdcharts

Vico gana en los tres puntos que nos importaban.

Callback de selección

Público en Vico, interno en HDCharts

CartesianMarkerVisibilityListener expone onShown(marker, targets) con el valor real tocado. HDCharts tenía el mismo concepto, pero nunca lo exponía fuera de la librería.

Formatter de eje

Conectado en Vico, sin usar en HDCharts

CartesianValueFormatter.decimal(prefix = "$") sí llega al eje Y. HDCharts tenía una API idéntica en el papel, pero jamás estaba cableada a nada.

Targets KMP reales

android, iosArm64, iosSimulatorArm64, desktop, js, wasmJs

Confirmado en su build.gradle.kts — y usa el mismo plugin com.android.kotlin.multiplatform.library al que ya habíamos migrado PiggyBank.

3158★ y activo hoy

Último push: hoy mismo

Vico no es solo más popular — el fix del bug fue lo único que nos dejó verlo.

13 · resultado final

Overlay original recuperado, cero compromisos.

Con el callback público de Vico, el onOverlayData custom de PiggyBank volvió intacto — algo que HDCharts nunca hubiera permitido.

Overlay mostrando 27/08 $55.55 al tocar la barra
Tap → "27/08 $55.55"
Line chart mostrando el mes completo sin necesidad de scroll
Mes completo visible, sin scroll
14 · takeaways

Lo que este caso real le deja a la charla.

01

Stars ≠ feature parity

La librería más popular en un momento dado (681★) no tenía la interacción que sí tenía otra con menos estrellas. El ranking por popularidad no responde la pregunta real.

02

El código fuente es la única fuente de verdad

Confirmar "¿soporta tap-to-select de verdad?" tomó clonar repos y leer código interno — ninguna búsqueda de README lo hubiera resuelto.

03

Tu propia herramienta puede tener el mismo sesgo que buscas evitar

Un filtro rígido en klibs-mcp casi nos hace repetir el error de confiar en poca evidencia — y nos escondió la mejor opción del catálogo.

04

klibs.io no tiene MCP propio — todavía

Es un catálogo web sin API pública, y solo indexa lo publicado en Maven Central. Automatizar esta verificación significó construir la pieza que falta nosotros mismos.

gracias

¿Preguntas?

El caso completo — migración, hallazgos, MCP server y código — está en los repos.

github.com/carlosgub/PiggyBank
github.com/carlosgub/klibs-mcp
@carlosgub  GitHub · X · LinkedIn · YouTube · Medium