Matrix: De Archivos TXT Aleatorios a un Centro de Mando para Desarrolladores
Cómo construí una aplicación de escritorio para organizar ideas, proyectos, planificación, roadmaps, tareas y métricas de desarrollo — todo en un solo lugar
Matrix: De Archivos TXT Aleatorios a un Centro de Mando para Desarrolladores
🤦 El Caos Clásico del Desarrollador
Si eres desarrollador, esto probablemente te suena familiar.
Tienes una idea. Abres un archivo .txt aleatorio. Lo escribes.
¿Unas semanas después? No puedes encontrarlo.
Entonces aparece otra idea. Otro proyecto. Otra nota. Otra carpeta en algún lugar de tu PC.
Y de repente tu vida como desarrollador se ve así:
- 💡 Ideas dispersas en archivos aleatorios
- 🚧 Proyectos a medias
- ❌ Sin prioridades claras
- 📋 Sin roadmap
- 🤔 Sin saber en qué enfocarte
Las preguntas empiezan a acumularse:
- ¿Dónde debería ir este proyecto?
- ¿Cuáles son los objetivos reales?
- ¿Cuál es la jerarquía de planes?
- ¿Cuántas líneas de código tiene el proyecto ahora?
- ¿Cuántas dependencias estamos arrastrando?
- ¿Qué tan avanzado está el roadmap?
- ¿En qué tareas debería trabajar hoy?
Y si usas herramientas de IA como Claude Code, el caos se vuelve aún mayor:
- ¿Qué tareas merecen tokens caros? Ya sabes, claude code para lo pr0 y opencode free para las tareas menos complejas y repetitivas.
- ¿Qué código debería escribir yo mismo?
- ¿Cómo planificar el desarrollo asistido por IA?
Y ni hablemos de los .env y credenciales. ¿Cuántos de nosotros tenemos:
- 🔐 Contraseñas cifradas ocultas en algún lugar
- 📁 Archivos
.envdispersos por todas partes - 🔑 Credenciales almacenadas en lugares que apenas recordamos?
A veces gestionar la infraestructura del proyecto se vuelve más difícil que construir el proyecto mismo.
💡 La Solución: Matrix
Así que decidí construir algo para mí mismo. Un centro de mando para desarrolladores. Una aplicación de escritorio donde puedes gestionar todo el ciclo de vida de tus proyectos — ideas, planificación, roadmap, tareas, progreso, métricas, uso de IA y secretos — todo en un solo lugar.
Matrix es una aplicación de escritorio todo-en-uno construida con Electron Forge + Vite. Se ejecuta localmente en tu máquina, funciona sin conexión y mantiene todo bajo tu control.
🎯 Lo Que Realmente Construí
Módulos Principales
- Jerarquía Estratégica: Misión → Objetivos → Planes → Tareas con cálculo automático de progreso en cascada
- Pipeline de Ideas: Captura, evalúa y promueve ideas con un tablero estilo Kanban
- Seguimiento de Proyectos: Vincula proyectos a tu jerarquía estratégica, escanea proyectos locales para ver progreso
- Gestión de Tareas: Tablero Kanban con drag-and-drop, niveles de prioridad, fechas límite
- Gestor de Contraseñas: Gestor de contraseñas local cifrado con AES-256-GCM
- Dashboard de Análisis: Gráficos de distribución de tareas, pipeline de ideas, progreso de objetivos
- Registro de Actividad: Todo lo que pasa en tu espacio de trabajo
El Stack
Frontend: React 18 + Tailwind CSS 3.4 + Zustand + React Query
Backend: Express 4 embebido en el proceso principal de Electron
Base de Datos: SQLite (modo WAL) via better-sqlite3 + Drizzle ORM
Desktop: Electron Forge (Vite)
Validación: Zod
Testing: Vitest
Seguridad: Cifrado AES-256-GCM
i18n: Inglés / Español💀 Problemas Que Enfrenté (Y Cómo Los Solucioné)
1. Electron + SQLite Empaquetado
El Problema: SQLite con enlaces nativos (better-sqlite3) no se lleva bien con el empaquetado ASAR de Electron. Los archivos .node no se pueden cargar desde un archivo ASAR.
La Solución: Usé el AutoUnpackNativesPlugin de Electron Forge para desempaquetar automáticamente los módulos nativos:
// forge.config.ts
packagerConfig: {
asar: {
unpack: '**/*.node';
}
}También configuré las rollupOptions.external de Vite para mantener better-sqlite3 y express como dependencias externas, no empaquetadas.
2. Cálculo de Progreso en Cascada
El Problema: El progreso necesita fluir de tareas a misión: el estado de la tarea determina el progreso del plan, el progreso del plan determina el progreso del objetivo, el progreso del objetivo determina el progreso de la misión.
La Solución: El progreso nunca se almacena — siempre se calcula al leer:
// Tarea: pending=0%, in_progress=50%, done=100%, blocked=0%
// Plan: promedio de todo el progreso de tareas
// Objetivo: promedio de todo el progreso de planes
// Misión: promedio de todo el progreso de objetivosEste enfoque asegura que el progreso siempre sea preciso y nunca se desincronice.
3. Enlaces Polimórficos
El Problema: Los proyectos pueden vincularse a cualquier entidad en la jerarquía estratégica (misión, objetivo, plan o tarea) — pero SQL no tiene un tipo nativo de "vincular a cualquier cosa".
La Solución: Patrón de relación polimórfica:
CREATE TABLE project_links (
id INTEGER PRIMARY KEY,
project_id INTEGER REFERENCES projects(id),
linkable_type TEXT, -- 'mission' | 'objective' | 'plan' | 'task'
linkable_id INTEGER
);Limpio, simple y funciona perfectamente con Drizzle ORM.
4. Seguridad de la gestión de Contraseñas
El Problema: Construir un gestor de contraseñas requiere seguridad a prueba de balas. No puedes almacenar la contraseña maestra, necesitas cifrado, necesitas manejar la derivación de claves de forma segura.
La Solución: PBKDF2 con 600k iteraciones para derivación de claves:
// Verificación de auth (nunca almacena contraseña)
pbkdf2Sync(contraseñaMaestra, saltAuth, 600000, 32, 'sha512') → authHash
// Clave de cifrado (separada de auth)
pbkdf2Sync(contraseñaMaestra, saltEnc, 600000, 32, 'sha512') → encKey
// Cada contraseña cifrada individualmente
AES-256-GCM(plaintext, encKey) → "v1:base64(iv):base64(authTag):base64(ciphertext)"La clave de cifrado vive solo en memoria, nunca se almacena, y se borra cuando la bóveda se bloquea.
5. Express Dentro de Electron
El Problema: Quería una API limpia entre el renderer y el proceso principal, pero el IPC de Electron puede ser verboso para flujos de datos complejos.
La Solución: Servidor Express embebido ejecutándose en localhost:3939 dentro del proceso principal de Electron. El renderer usa fetch() estándar para comunicarse:
// Preload expone la base de la API
window.matrix.apiBase = 'http://localhost:3939';
// Renderer llama a Express directamente
const tasks = await fetch(
`${window.matrix.apiBase}/api/tasks?plan_id=${planId}`,
);Esto nos da una arquitectura REST API adecuada sin la complejidad de manejadores IPC personalizados para cada endpoint.
6. Drizzle ORM con Migraciones en Runtime
El Problema: El comando push de Drizzle Kit no funciona bien con aplicaciones Electron empaquetadas — la base de datos se empaqueta y no se puede migrar en runtime.
La Solución: Migraciones SQL sin procesar en migrate.ts que se ejecutan en el primer lanzamiento:
// migrate.ts
db.exec(`
CREATE TABLE IF NOT EXISTS missions (...);
CREATE TABLE IF NOT EXISTS objectives (...);
-- etc.
`);Sin Drizzle Kit, sin conflictos de migración, solo SQL limpio que funciona en todas partes.
🚀 Funciones Que Realmente Funcionan, esto era simple y fácil.
✅ Jerarquía Estratégica
- Crea una misión con objetivos claros
- Desglosa en objetivos, planes y tareas
- Progreso calculado automáticamente en cascada
- Eliminar con cascada o reasignar opciones
✅ Pipeline de Ideas
- 4 columnas Kanban: Pendiente → Evaluando → Aprobado → Rechazado
- Puntuación de evaluación: alineación, impacto, costo, riesgo (1-10 cada uno)
- Un clic para promover a proyectos, objetivos, planes o tareas
✅ Escáner de Proyectos
- Escanea directorios locales de proyectos para ver progreso
- Detecta: roadmap.md, plan.md, todo.md, guia.md
- Analiza checkboxes:
[ ]pendiente,[x]completado - Cuenta BLOCKERs y WIPs
- Recolecta stats técnicos: LOC, lenguajes, dependencias, info git
✅ Gestor de Contraseñas
- Contraseña maestra con derivación de claves PBKDF2
- Cifrado AES-256-GCM por entrada
- Importa desde 1Password, Bitwarden, Chrome, Firefox (CSV)
- Bloqueo automático tras inactividad
- Portapapeles se borra automáticamente tras 30 segundos
✅ Dashboard de Análisis
- Gráfico circular de distribución de tareas
- Gráfico donut de pipeline de ideas
- Gráfico de barras de progreso de objetivos
- Mapa de calor de actividad (como GitHub)
✅ Registro de Actividad
- Cada acción registrada: creado, completado, promovido, escaneado, eliminado, decidido
- Marcas de tiempo con tiempo relativo ("hace 2 horas")
- Feed filtrable en Overview
📚 Lo Que Aprendí
Electron No Es Tan Espantoso
Construí mi primera aplicación Electron con este proyecto. El ecosistema (Electron Forge) es sólido, la integración con Vite es fluida y el empaquetado funciona bien una vez que manejas los problemas de módulos nativos.
SQLite Es Subestimado
Para aplicaciones de escritorio, SQLite con modo WAL es perfecto. Sin configuración de servidor, basado en archivos, rápido, y Drizzle ORM lo hace sentir moderno. Los enlaces nativos de "better-sqlite3" son lo único tricky, pero valen la pena por el rendimiento.
El Cálculo de Progreso Debe Ser Declarativo
Almacenar valores calculados (como %) es una trampa. Siempre se desincronizan. Calcula al leer, almacena solo la fuente de verdad.
La Seguridad Es Difícil, Pero Vale La Pena
Construir la bóveda de contraseñas me enseñó sobre PBKDF2, AES-GCM, comparaciones timing-safe y borrado de memoria. Cada paso importa.
Las Aplicaciones de Escritorio Siguen Siendo Relevantes
Las apps web son geniales, pero hay algo poderoso sobre una aplicación de escritorio local, offline-first, que posee tus datos completamente. Matrix demuestra que puedes construir algo sofisticado sin depender de la nube.
🔮 Qué Sigue
- Drag-and-drop para el Kanban de Ideas
- Observador de proyectos (auto-escaneo en cambios de archivos)
- Más widgets de análisis
- Exportación/backup de datos
- Personalización de tema
- Generador de contraseñas automático
- Implementación de la IA como ayuda para la gestión de tokens. Un uso eficiente de esto, es el target, pero requiere un trabajo de ingienería a largo plazo.
🙏 Agradecimientos
Gracias a las comunidades de Electron y Drizzle por la documentación que realmente ayuda. A los creadores de better-sqlite3 por hacer SQLite rápido en Node. Y a cada desarrollador que alguna vez perdió una idea en un archivo .txt random — esto es para nosotros.
Conclusión: Si eres un desarrollador ahogado en notas dispersas, proyectos a medias y archivos aleatorios — construye tu centro de mando. No tiene que ser perfecto. Solo tiene que funcionar. Y aprenderás más de lo que cualquier tutorial puede enseñar.
A mover las manos! 🚀