Saltar al contenido
Andrés Sanabria
Todos los proyectos

Armin

v0.5.0 · AppImage

Una app de escritorio local-first para repetición espaciada donde las tarjetas guardan sus prerrequisitos, con un servidor MCP que deja a los agentes autor decks.

Problema

Quería aprender con repetición espaciada y Anki no me dejaba. Hacer tarjetas se comía el tiempo que repasar debía ahorrarme, y la app agenda todas las tarjetas como si fueran independientes. El conocimiento no es independiente: HTML desbloquea CSS, y CSS y JavaScript desbloquean todo lo que viene después. Ninguna app de repetición espaciada que encontrara modela esa jerarquía, y por eso un backlog de repaso en un tema nuevo se siente abrumador. Lo es, porque la app te está mostrando tarjetas para las que no estás listo.

(Para el modelo de memoria detrás de la repetición espaciada, “How to remember anything” de Nicky Case sigue siendo la mejor explicación. Para el argumento de la jerarquía, este post fue el que me arregló el modelo mental.)

El gráfico de abajo es la forma contra la que Armin agenda: una tarjeta se vuelve repasable solo cuando las tarjetas de las que depende ya se aprendieron.

Grafo de temas de conocimiento que se desbloquean por prerrequisitos

Decisiones

Construir local-first con Electron

Elección

Una app de Electron con SQLite local; los datos nunca salen de la máquina.

Local-first es una decisión de aprendizaje, no solo de privacidad. Un hábito de repaso tiene que sobrevivir mañanas sin internet, y el corpus de tarjetas es del tipo de datos que el estudiante debería tener como archivos. Electron es pesado, y acepté ese costo por los módulos nativos y el empaquetado que no tuve que pelear.

Descartado

  • App webNo puede ser dueña de archivos locales y depende de la conectividad.
  • TauriBundle más pequeño, pero los módulos nativos de better-sqlite3 y el toolchain de Electron Forge eran el camino más rápido y seguro para publicar.

Dejar que los agentes autoren mazos vía MCP

Elección

Un servidor MCP local que expone herramientas de autoría: crear mazos y tarjetas, importar jerarquías completas con enlaces de prerrequisito, editar, archivar, borrar y leer el grafo.

El servidor habla stdio dentro de la app. La seguridad viene del grafo, no de restringir herramientas: los prerrequisitos se quedan dentro de un mazo, los self-edges y los ciclos se rechazan apenas se proponen, y la importación por lotes valida la jerarquía antes de escribir nada. Repasar sigue siendo humano a propósito. No existe una herramienta que responda un repaso por ti.

Descartado

  • Una API alojadaSaca los datos de la máquina, lo que derrota el propósito de la app.
  • Una superficie de solo lecturaUn agente que solo lee deja al humano escribiendo cada tarjeta, que es justo la tarea que el agente debería absorber.

Agendar con FSRS detrás de un candado de prerrequisitos

Elección

ts-fsrs para agendar, más un candado: una tarjeta prerrequisito queda asegurada solo cuando cada unidad de repaso que genera llega al estado Review con estabilidad sobre un piso.

El candado es lo que convierte el grafo de prerrequisitos en agenda. Una tarjeta bloqueada sale de la cola hasta que sus prerrequisitos están asegurados; al desbloquear vuelve la agenda normal, y los candados se recalculan transitivamente después de cada repaso. El piso de estabilidad se configura por mazo, así que el estudiante puede negociar rigor por ritmo.

Descartado

  • SM-2, el algoritmo de AnkiTrata todas las tarjetas igual sin importar cómo ha respondido el estudiante. FSRS se ajusta al historial real de repaso.

Publicar una plataforma, sin firma

Elección

Un AppImage para Linux, publicado en GitHub Releases y en el AUR, deliberadamente sin firma.

Un artefacto honesto vale más que tres con advertencias. El paquete del AUR reempaqueta el AppImage sin la dependencia de FUSE, que es la historia de distribución en Linux que de verdad me importa. El code-signing espera hasta que haya una razón para él.

Descartado

  • Pagar certificados de code-signingCuesta dinero que el proyecto no tiene, por advertencias en plataformas que no estoy publicando de todas formas.
  • Publicar también builds de Windows y macOSLa configuración de build existe para ambos, pero instaladores sin firma que nadie puede ejecutar sin pelear con su SO son ruido, no alcance.

Resultado

Página principal de Armin con la lista de mazos demo, conteos pendientes y botón de nuevo mazo
La página de mazos: mazos demo con conteos pendientes y nuevos, listos para repasar.
Grafo de prerrequisitos de Armin para el mazo Demo How the Web Works, con tarjetas que se desbloquean desde bits y bytes hasta HTTPS y CDNs
El grafo de prerrequisitos en acción: las tarjetas bloqueadas se desbloquean al asegurarse sus prerrequisitos.

La v0.5.0 se publica como AppImage en GitHub Releases y como armin-bin en el AUR. El CI corre lint, typecheck, pruebas unitarias, pruebas del servidor MCP y E2E con Playwright bajo xvfb en cada pull request. Code-signing y auto-actualización quedan aplazados juntos, a propósito.

Grabaciones

Armin02 / 03
Grabación — pendiente

Una app de escritorio local-first para repetición espaciada donde las tarjetas guardan sus prerrequisitos, con un servidor MCP que deja a los agentes autor decks.

Pregunta sobre mi trabajo