{"id":51936352,"url":"https://github.com/rgiskard7/jylos","last_synced_at":"2026-07-28T15:01:34.922Z","repository":{"id":364371804,"uuid":"1259553110","full_name":"RGiskard7/jylos","owner":"RGiskard7","description":"Local-first knowledge management app with Markdown notes, wiki-links, backlinks, Canvas, Kanban, interactive graphs, plugins, themes, and SQLite or Markdown vault storage.","archived":false,"fork":false,"pushed_at":"2026-07-15T14:34:09.000Z","size":20798,"stargazers_count":22,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-07-15T15:09:27.089Z","etag":null,"topics":["backlinks","desktop-application","desktop-applications","java","javafx","knowledge-graph","knowledge-management","local-first","local-first-software","markdown","markdown-editor","markdown-notes","note-taking","obsidian-compatible","open-source","personal-knowledge-management","pkm","second-brain","sqlite","wiki-links"],"latest_commit_sha":null,"homepage":"https://rgiskard7.github.io/jylos/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RGiskard7.png","metadata":{"files":{"readme":"README.es.md","changelog":"changelog.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-04T16:11:17.000Z","updated_at":"2026-07-15T14:33:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/RGiskard7/jylos","commit_stats":null,"previous_names":["rgiskard7/jylos"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/RGiskard7/jylos","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RGiskard7%2Fjylos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RGiskard7%2Fjylos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RGiskard7%2Fjylos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RGiskard7%2Fjylos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RGiskard7","download_url":"https://codeload.github.com/RGiskard7/jylos/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RGiskard7%2Fjylos/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35996998,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-28T02:00:06.341Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backlinks","desktop-application","desktop-applications","java","javafx","knowledge-graph","knowledge-management","local-first","local-first-software","markdown","markdown-editor","markdown-notes","note-taking","obsidian-compatible","open-source","personal-knowledge-management","pkm","second-brain","sqlite","wiki-links"],"created_at":"2026-07-28T15:01:33.667Z","updated_at":"2026-07-28T15:01:34.901Z","avatar_url":"https://github.com/RGiskard7.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Jylos\n\n\u003cdiv align=\"center\"\u003e\n  \u003cstrong\u003eEspañol\u003c/strong\u003e |\n  \u003ca href=\"README.md\"\u003eEnglish\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"resources/images/banner.png\" alt=\"Banner de Jylos\" style=\"width: 100%; max-width: 100%;\"\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![Licencia: MIT](https://img.shields.io/badge/Licencia-MIT-yellow.svg)](LICENSE)\n[![Versión](https://img.shields.io/badge/versión-2.4.4-success.svg)](changelog.md)\n[![Java](https://img.shields.io/badge/Java-21+-orange.svg)](https://www.oracle.com/java/)\n[![JavaFX](https://img.shields.io/badge/JavaFX-23-blue.svg)](https://openjfx.io/)\n[![SQLite](https://img.shields.io/badge/SQLite-3-lightgrey.svg)](https://www.sqlite.org/)\n[![Maven](https://img.shields.io/badge/Maven-3.9+-red.svg)](https://maven.apache.org/)\n[![Plataforma](https://img.shields.io/badge/Plataforma-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey.svg)]()\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cstrong\u003eGestión del conocimiento local-first de escritorio: notas Markdown, wiki-links, backlinks, grafo de conocimiento interactivo, Kanban, archivos canvas, cifrado por nota, plugins y almacenamiento SQLite o bóveda Markdown.\u003c/strong\u003e\n\u003c/div\u003e\n\n## Descarga\n\nLos paquetes precompilados para las principales plataformas están disponibles en la [página de Releases](../../releases/latest):\n\n- **Windows** — instalador `.exe`, instalador `.msi`, ZIP portable\n- **Linux** — DEB/RPM (vía `jpackage`)\n- **macOS** — DMG cuando el empaquetado macOS esté activado; mientras tanto usa JBang, el uber-JAR o compila desde fuente\n- **Cualquier plataforma** — uber-JAR (requiere Java 21 + JavaFX 23 en `PATH`)\n- **Vía [JBang](https://www.jbang.dev/)** — un solo comando, sin compilar:\n  ```bash\n  jbang jylos@RGiskard7/jylos\n  ```\n  JBang descarga automáticamente Java 21 y los módulos JavaFX si hacen falta.\n\n## Índice\n\n- [Jylos](#jylos)\n  - [Descarga](#descarga)\n  - [Índice](#índice)\n  - [Por qué Jylos](#por-qué-jylos)\n  - [Resumen](#resumen)\n  - [Funcionalidades](#funcionalidades)\n    - [Núcleo](#núcleo)\n    - [Editor y vista previa](#editor-y-vista-previa)\n    - [Tablero Kanban](#tablero-kanban)\n    - [Notas privadas (cifrado)](#notas-privadas-cifrado)\n    - [Grafo de conocimiento](#grafo-de-conocimiento)\n    - [Bóveda, Git y adjuntos (modo filesystem)](#bóveda-git-y-adjuntos-modo-filesystem)\n    - [Productividad](#productividad)\n    - [UI/UX](#uiux)\n    - [Extensibilidad](#extensibilidad)\n  - [Capturas](#capturas)\n  - [Stack Tecnológico](#stack-tecnológico)\n  - [Requisitos](#requisitos)\n  - [Inicio Rápido](#inicio-rápido)\n    - [1) Clonar](#1-clonar)\n    - [2) Compilar](#2-compilar)\n    - [3) Ejecutar](#3-ejecutar)\n  - [Scripts y Comandos (Todos los SO)](#scripts-y-comandos-todos-los-so)\n    - [Matriz Build / Run](#matriz-build--run)\n    - [Tests y Gates de Calidad](#tests-y-gates-de-calidad)\n    - [Plugins (JAR externos)](#plugins-jar-externos)\n    - [Temas (externos)](#temas-externos)\n    - [Empaquetado (instaladores nativos)](#empaquetado-instaladores-nativos)\n    - [Ejecución Maven (desarrollo)](#ejecución-maven-desarrollo)\n  - [Estructura del Proyecto](#estructura-del-proyecto)\n  - [Configuración](#configuración)\n    - [Almacenamiento](#almacenamiento)\n    - [Iconos de la aplicación](#iconos-de-la-aplicación)\n    - [Temas](#temas)\n    - [Snippets CSS](#snippets-css)\n    - [Plugins](#plugins)\n  - [Documentación](#documentación)\n  - [Resolución de Problemas](#resolución-de-problemas)\n    - [Errores JavaFX Runtime](#errores-javafx-runtime)\n    - [JAR no encontrado](#jar-no-encontrado)\n    - [Java o Maven no encontrados](#java-o-maven-no-encontrados)\n    - [Warnings de parent-POM JavaFX](#warnings-de-parent-pom-javafx)\n  - [Hoja de Ruta](#hoja-de-ruta)\n  - [Contribución](#contribución)\n  - [Licencia](#licencia)\n\n## Por qué Jylos\n\nJylos es una aplicación de gestión del conocimiento local-first: notas Markdown, wiki-links, backlinks, grafo de conocimiento interactivo, tablero Kanban, cifrado opcional por nota, sistema de plugins y, a tu elección, almacenamiento en **SQLite** o en una **bóveda Markdown** plana en disco.\n\nLos flujos de trabajo que Obsidian popularizó — wiki-links, backlinks, navegación mediante grafo — fueron una inspiración directa para Jylos, y quien ya esté cómodo con ese estilo de toma de notas se encontrará en terreno familiar desde el primer momento. Jylos es, no obstante, una aplicación independiente: su propio código en Java/JavaFX, su propio modelo de almacenamiento (SQLite o bóveda Markdown plana), su propia arquitectura de plugins y sus propias decisiones de diseño. Es open-source y con licencia MIT. Cada persona elige la herramienta que mejor se adapte a su flujo de trabajo.\n\nEn concreto:\n\n- **Local-first y offline** — tus notas son ficheros `.md` planos (modo bóveda) o una única base de datos SQLite; los datos son tuyos, sin backend en la nube, sin cuenta, sin telemetría.\n- **Una app de escritorio enfocada** — un solo usuario, escrita en Java/JavaFX, funciona en Windows, macOS y Linux.\n- **Gratis y con licencia MIT** — un proyecto open-source para la comunidad.\n\n## Resumen\n\nJylos es una app Java 21 + JavaFX 23 inspirada en flujos tipo Obsidian:\n\n- Editor Markdown con **resaltado de sintaxis en vivo** (RichTextFX) y vista previa lado a lado (GFM, matemáticas KaTeX, emoji)\n- **Pestañas** para varias notas abiertas, con indicador de guardado en línea\n- Jerarquía de carpetas + etiquetas + favoritos + recientes + papelera\n- **Enlaces internos compatibles con Obsidian** (`[[wiki-links]]`, `[texto](nota.md)`) con clic en la vista previa\n- **Grafo de conocimiento** (vista global de la bóveda o grafo local alrededor de la nota abierta)\n- Panel de **backlinks** (notas que enlazan a la actual)\n- **Tablero Kanban** guardado dentro de una nota, y **modo concentración** sin distracciones\n- **Editor de Canvas**: abre y edita ficheros `.canvas` compatibles con Obsidian en un lienzo infinito con pan/zoom — crea/mueve/redimensiona/colorea nodos de texto, enlace y grupo, conecta y borra aristas (con flechas) y crea nuevos canvas; el guardado hace round-trip seguro (preserva campos desconocidos)\n- **Notas privadas**: cifrado opcional del cuerpo con AES-256 tras una contraseña maestra, con desbloqueo por-nota o global y protección frente a borrado\n- Paleta de comandos (`Ctrl+P`) y conmutador rápido (`Ctrl+O`)\n- Plugins externos (JAR en `jylos/plugins/`, desde `plugins-source/`) y temas (`themes/` → `jylos/themes/`)\n- Almacenamiento: **SQLite** (por defecto) o **bóveda Markdown** en disco (`.md` + frontmatter YAML; menú **Git** opcional)\n\n## Funcionalidades\n\n### Núcleo\n\n- Crear, editar, guardar, eliminar y restaurar notas\n- Carpetas y subcarpetas jerárquicas\n- Etiquetas con asignación/eliminación (SQLite y bóveda)\n- Favoritos y notas recientes\n- Papelera con restauración de notas y carpetas anidadas\n- **Búsqueda de texto completo** en títulos y cuerpos (navegación desde resultados)\n- Ordenación y vistas lista/cuadrícula (título, preview, fechas)\n\n### Editor y vista previa\n\n- Editor Markdown con **resaltado de sintaxis en vivo** (RichTextFX `CodeArea`: encabezados, negrita/cursiva, código, `[[wiki-links]]`, listas, citas, enlaces)\n- **Pestañas** para varias notas abiertas; **indicador de guardado en línea** (ámbar = sin guardar, verde = guardado)\n- **Autocompletado de `[[`** para títulos de nota; barra de formato (negrita, listas, enlaces, …)\n- Vista previa lado a lado con modos dividido / solo editor / solo preview\n- Markdown con tablas GFM, autolinks y tachado; resaltado de bloques de código en la vista previa (highlight.js)\n- **KaTeX** para `$…$`, `$$…$$` y delimitadores LaTeX (assets offline en el JAR)\n- Emoji en preview mediante glifos rasterizados (fiables en el WebView de JavaFX)\n- **Resolución de wiki-links** compartida con el grafo y los backlinks (`WikiLinkResolver`)\n- **Transclusión / embeds**: `![[Nota]]` (o `![[Nota#Encabezado]]`) incrusta el contenido renderizado de otra nota en la vista previa, con encabezado clicable; recursión acotada con detección de ciclos\n- **Rich links**: pega una URL para insertarla como tarjeta visual (título, descripción, miniatura, dominio) — la metadata se descarga en segundo plano; los enlaces externos abren en el navegador del sistema\n- **Modo concentración** (`Ctrl/Cmd+Shift+F`): oculta todo salvo el editor\n- Las proporciones de los paneles divididos se recuerdan entre sesiones\n\n### Tablero Kanban\n\n- Un tablero es una nota normal cuyo cuerpo Markdown contiene columnas (`## Encabezado`) y tarjetas de texto (`- tarjeta`), al estilo del plugin Kanban de Obsidian\n- Abrir con **Ver → Tablero Kanban** o **`Ctrl/Cmd+K`**; elige o crea tableros desde la barra\n- Añadir/renombrar/borrar columnas, crear/editar/borrar tarjetas y **arrastrar tarjetas entre columnas**\n- Una tarjeta puede enlazar a una nota (`[[Título]]`) o **convertirse en nota**\n- **Límites WIP** por columna (`[wip=N]`, el contador se pone rojo al superarse) y **colores** (`[color=#rrggbb]`) — ambos guardados en la línea de encabezado, configurables desde el menú de columna\n- Las tarjetas que referencian una imagen o PDF (`![…](foto.png)`, `[[escaneo.pdf]]`) muestran una **miniatura embebida** (primera página del PDF vía PDFBox)\n\n### Notas privadas (cifrado)\n\n- Marca una nota como privada para cifrar **solo su cuerpo** en reposo (AES-256-GCM) — desde **Herramientas → Hacer Nota Privada/Pública** (`Ctrl/Cmd+Shift+L`) o el menú contextual de la nota\n- Una única **contraseña maestra** las protege (clave derivada con PBKDF2; la contraseña nunca se guarda). Abrir una nota bloqueada pide desbloquear **solo esa nota**; **Herramientas → Desbloquear Notas Privadas** las revela todas, y **Bloquear Notas Privadas** vuelve a bloquear\n- Un **candado** marca las notas privadas en la lista y en el editor (cerrado = bloqueada, abierto = legible esta sesión)\n- Las notas privadas están **protegidas frente a borrado y exportación** — hazla normal primero\n- Funciona en **ambos** modos: columna dedicada en SQLite, flag `private:` en el frontmatter de la bóveda; los metadatos quedan legibles, así que una nota bloqueada se muestra como 🔒 sin la clave\n\n### Grafo de conocimiento\n\n- Overlay a pantalla completa: **Ver → Vista de Grafo**, botón en barra o **`Ctrl+G`** / paleta de comandos\n- **Grafo global**: todas las notas y aristas resueltas por wiki-links; nodos de **etiquetas** opcionales y aristas nota→etiqueta\n- **Grafo local**: nota actual y vecinos a N saltos\n- Simulación de fuerzas en **Canvas JavaFX** (repulsión Barnes–Hut, muelles, enfriamiento de alpha — en reposo no consume CPU)\n- Zoom/pan, arrastrar nodos, hover resalta vecinos, **clic en nota para abrirla**\n- Panel de ajustes: repulsión, fuerza/distancia de enlaces, gravedad central, huérfanos/enlaces no resueltos, flechas, color por carpeta, etiquetas/tamaño/grosor de línea\n\n### Bóveda, Git y adjuntos (modo filesystem)\n\n- Bóveda Markdown con layout opcional por carpetas; los archivos no-`.md` (PDF, imágenes) se abren con visores integrados\n- **Git** si la bóveda es un repositorio: estado, preparar/despreparar, commit con mensaje y sincronización push/pull — todo en el **panel Git Sync** unificado (menú **Git**)\n\n### Productividad\n\n- **Backlinks** en el panel derecho (wiki-links entrantes y enlaces Markdown internos)\n- **Nota diaria** y **nueva nota desde plantilla** (`{{title}}`, `{{date}}`, …)\n- Exportación por nota y **exportación masiva** de la bóveda a HTML/PDF\n- Importar/exportar notas individuales\n- **Importar una bóveda de Obsidian** (jerarquía de carpetas, frontmatter y etiquetas preservados; `.obsidian/` se omite) o un export **`.enex` de Evernote** (ENML convertido a Markdown, etiquetas conservadas, adjuntos marcados como placeholder) — menú Archivo\n- **Historial de versiones de nota** (Herramientas → Historial de la Nota, `Ctrl/Cmd+Shift+H`): snapshots locales antes de cada guardado (coalescidos, máximo 50 por nota), con visor de **diff** por líneas y **restauración** en un clic; los snapshots de notas privadas permanecen cifrados\n\n### UI/UX\n\n- Temas claro, oscuro y **sistema** (sigue el SO cuando eliges Sistema) + temas CSS externos\n- **Snippets CSS**: coloca ficheros `.css` en `snippets/` y actívalos en Preferencias para retocar la interfaz sobre el tema activo (estilo Obsidian)\n- Tema de ejemplo: Retro Phosphor (`themes/retro-phosphor/`)\n- Preferencias de botones lateral/editor (texto/iconos/auto)\n- Barra lateral centrada (carpetas, etiquetas, recientes, favoritos, papelera)\n- Interfaz en **inglés** y **español** (`i18n/messages*.properties`)\n- Iconos de barra/menús: fuente **Feather** y **Bootstrap Icons** vía Ikonli (`fth-*` / `bi-*` en FXML)\n\n### Extensibilidad\n\n- Plugins JAR en `jylos/plugins/` (`scripts/build-plugins.sh`; bytecode **Java 21**)\n- Gestor de plugins con IDs estables y carga/deshabilitado seguro\n- API de plugins: paleta de comandos, menús, paneles laterales, enhancers del preview, **botones de toolbar** y **hooks del editor** (`onBeforeTextInsert` / `onBeforeSave` / `onAfterSave`) — ver [docs/PLUGINS.md](docs/PLUGINS.md)\n- **Mermaid** integrado en preview (fuente en `plugins-source/`)\n- Catálogo de temas externos con fallback seguro\n\n## Capturas\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"resources/images/interfaz-17.png\" alt=\"\" style=\"width: 100%; max-width: 100%; margin-bottom: 1.5em; display: block;\"\u003e\n  \u003cimg src=\"resources/images/interfaz-18.png\" alt=\"\" style=\"width: 100%; max-width: 100%; margin-bottom: 1.5em; display: block;\"\u003e\n  \u003cimg src=\"resources/images/interfaz-21.png\" alt=\"\" style=\"width: 100%; max-width: 100%; margin-bottom: 1.5em; display: block;\"\u003e\n  \u003cimg src=\"resources/images/interfaz-22.png\" alt=\"\" style=\"width: 100%; max-width: 100%; margin-bottom: 1.5em; display: block;\"\u003e\n  \u003cimg src=\"resources/images/interfaz-8.png\" alt=\"\" style=\"width: 100%; max-width: 100%; margin-bottom: 1.5em; display: block;\"\u003e\n  \u003cimg src=\"resources/images/interfaz-9.png\" alt=\"\" style=\"width: 100%; max-width: 100%; margin-bottom: 1.5em; display: block;\"\u003e\n  \u003cimg src=\"resources/images/interfaz-10.png\" alt=\"\" style=\"width: 100%; max-width: 100%; margin-bottom: 1.5em; display: block;\"\u003e\n  \u003cimg src=\"resources/images/interfaz-11.png\" alt=\"\" style=\"width: 100%; max-width: 100%; margin-bottom: 1.5em; display: block;\"\u003e\n  \u003cimg src=\"resources/images/interfaz-12.png\" alt=\"\" style=\"width: 100%; max-width: 100%; margin-bottom: 1.5em; display: block;\"\u003e\n  \u003cimg src=\"resources/images/interfaz-13.png\" alt=\"\" style=\"width: 100%; max-width: 100%; margin-bottom: 1.5em; display: block;\"\u003e\n  \u003cimg src=\"resources/images/interfaz-14.png\" alt=\"\" style=\"width: 100%; max-width: 100%; margin-bottom: 1.5em; display: block;\"\u003e\n  \u003cimg src=\"resources/images/interfaz-15.png\" alt=\"\" style=\"width: 100%; max-width: 100%; display: block;\"\u003e\n\u003c/div\u003e\n\n## Stack Tecnológico\n\n- Java 21\n- JavaFX 23\n- Maven 3.9+\n- SQLite JDBC\n- CommonMark (vista previa Markdown)\n- RichTextFX (resaltado de sintaxis del editor)\n- Ikonli (iconos Feather + Bootstrap Icons)\n- PDFBox + OpenHTMLToPDF (exportar/visor PDF)\n- JUnit 5 + H2 (tests)\n\n## Requisitos\n\n1. Java JDK 21\n2. Maven 3.9+\n\nComprobación:\n\n```bash\njava -version\nmvn -version\n```\n\n## Inicio Rápido\n\n### 1) Clonar\n\n```bash\ngit clone https://github.com/RGiskard7/jylos.git\ncd jylos\n```\n\n### 2) Compilar\n\nDesde la raíz del repositorio (genera `jylos/target/jylos-\u003cversión\u003e-uber.jar`):\n\n```bash\n./scripts/build_all.sh\n```\n\n```powershell\n.\\scripts\\build_all.ps1\n```\n\nEquivalente Maven:\n\n```bash\nmvn -f jylos/pom.xml clean package -DskipTests\n```\n\n### 3) Ejecutar\n\n**Opción A — JBang (sin compilar):**\n\n```bash\njbang jylos@RGiskard7/jylos\n```\n\n**Opción B — Launcher** (configura el `--module-path` de JavaFX; requiere el uber-JAR del paso 2):\n\n```bash\n./scripts/launch-jylos.sh\n```\n\n```powershell\n.\\scripts\\launch-jylos.bat\n# o\n.\\scripts\\launch-jylos.ps1\n```\n\n`run_all.*` es un runner alternativo. `java -jar` sin module-path suele fallar con JavaFX.\n\n## Scripts y Comandos (Todos los SO)\n\nTodos los comandos asumen la **raíz del repositorio** (la carpeta que contiene `jylos/` y `scripts/`).\n\n### Matriz Build / Run\n\n| Propósito | Linux/macOS | Windows PowerShell | Windows CMD |\n|---|---|---|---|\n| Compilar app | `./scripts/build_all.sh` | `.\\scripts\\build_all.ps1` | N/A |\n| Ejecutar app (runner dev) | `./scripts/run_all.sh` | `.\\scripts\\run_all.ps1` | N/A |\n| Ejecutar app (launcher recomendado) | `./scripts/launch-jylos.sh` | `.\\scripts\\launch-jylos.ps1` | `.\\scripts\\launch-jylos.bat` |\n\n### Tests y Gates de Calidad\n\nLa política de testing y tipos de prueba está documentada en [docs/TESTING.md](docs/TESTING.md).\n\n```bash\nmvn -f jylos/pom.xml test\nmvn -f jylos/pom.xml clean test\n```\n\n```bash\n./scripts/smoke-phase-gate.sh\n./scripts/hardening-storage-matrix.sh\n```\n\n```powershell\n.\\scripts\\smoke-phase-gate.ps1\n.\\scripts\\hardening-storage-matrix.ps1\n```\n\n### Plugins (JAR externos)\n\n```bash\n./scripts/build-plugins.sh\n./scripts/build-plugins.sh --clean\n```\n\n```powershell\n.\\scripts\\build-plugins.ps1\n.\\scripts\\build-plugins.ps1 -Clean\n```\n\n### Temas (externos)\n\n```bash\n./scripts/build-themes.sh\n./scripts/build-themes.sh --clean\n./scripts/build-themes.sh --appdata\n```\n\n```powershell\n.\\scripts\\build-themes.ps1\n.\\scripts\\build-themes.ps1 -Clean\n.\\scripts\\build-themes.ps1 -AppData\n```\n\n### Empaquetado (instaladores nativos)\n\n**Requisitos:** **JDK 21+** completo (no JRE) con `jpackage` en `PATH`. Ejecutar desde la **raíz del repositorio**.\n\nCada script `package-*` compila el uber-JAR, opcionalmente `build-plugins.sh`, y llama a `jpackage`. Clase principal: `com.example.jylos.Launcher`.\n\n| Plataforma | Comando | Salida típica |\n|---|---|---|\n| macOS (DMG) | `./scripts/package-macos.sh` | `jylos/target/installers/Jylos-\u003cversión\u003e.dmg` |\n| Linux (deb/rpm) | `./scripts/package-linux.sh` | `jylos/target/installers/` |\n| Windows portable (app-image) | `.\\scripts\\package-windows.ps1` | `jylos\\target\\installers\\Jylos\\` |\n| Windows instalador .exe (WiX) | `.\\scripts\\package-windows-exe.ps1` | `jylos\\target\\installers\\Jylos-\u003cversión\u003e.exe` |\n| Windows instalador .msi (WiX) | `.\\scripts\\package-windows-msi.ps1` | `jylos\\target\\installers\\Jylos-\u003cversión\u003e.msi` |\n\n```bash\n./scripts/package-macos.sh\n./scripts/package-linux.sh\n```\n\n```powershell\n.\\scripts\\package-windows.ps1\n```\n\nIconos: ventana y diálogo Acerca de usan `jylos/src/main/resources/icons/app-icon.png`; instaladores usan `icon.{icns,ico,png}` (`app.properties` y [jylos/src/main/resources/icons/README.md](jylos/src/main/resources/icons/README.md)). Detalle: [docs/PACKAGING.md](docs/PACKAGING.md).\n\n### Ejecución Maven (desarrollo)\n\nPreferir los launchers para JavaFX. Con Maven:\n\n```bash\nmvn -f jylos/pom.xml javafx:run\n```\n\nO:\n\n```bash\nmvn -f jylos/pom.xml clean compile exec:java -Dexec.mainClass=\"com.example.jylos.Launcher\"\n```\n\n## Estructura del Proyecto\n\nRaíz del repositorio (contiene el módulo Maven `jylos/` y `scripts/`):\n\n```text\n\u003crepo-root\u003e/\n├── jylos/                              # módulo Maven (aplicación)\n│   ├── pom.xml\n│   ├── src/main/java/com/example/jylos/\n│   │   ├── config/                     # LoggerConfig\n│   │   ├── data/                       # modelos; DAOs (sqlite/, filesystem/)\n│   │   ├── event/                      # EventBus + eventos de dominio\n│   │   ├── exceptions/\n│   │   ├── git/                        # GitService (repositorios en bóveda)\n│   │   ├── graph/                      # GraphBuilder, GraphData, nodos/aristas\n│   │   ├── insights/                   # análisis de salud y reportes de conocimiento\n│   │   ├── plugin/                     # loader, manager, registros; mermaid/\n│   │   ├── search/                     # parser y servicio de búsqueda avanzada\n│   │   ├── service/                    # Note, Folder, Tag, Backlink, backup, …\n│   │   ├── ui/\n│   │   │   ├── controller/             # Main, Editor, Sidebar, Graph, Toolbar, …\n│   │   │   ├── components/             # CommandPalette, QuickSwitcher, diálogos Git/insights, canvas\n│   │   │   ├── preferences/            # estado persistido de preferencias UI\n│   │   │   ├── theme/                  # aplicación de temas, catálogos y snippets\n│   │   │   └── graph/                  # GraphCanvas (render del grafo)\n│   │   ├── util/                       # WikiLinkResolver, MarkdownPreview, NoteExporter\n│   │   └── workspace/                  # espacios de trabajo guardados\n│   ├── src/main/resources/\n│   │   ├── app.properties              # nombre, iconos, título de ventana\n│   │   ├── icons/                      # app-icon.png + icon.{ico,icns,png}\n│   │   └── com/example/jylos/\n│   │       ├── i18n/                   # messages.properties, messages_en/es\n│   │       ├── ui/css/                 # modern-theme.css, dark-theme.css\n│   │       ├── ui/view/                # FXML (MainView, EditorView, GraphView, …)\n│   │       └── ui/preview/             # KaTeX, highlight.js (offline en el JAR)\n│   ├── src/test/java/com/example/jylos/\n│   ├── plugins/                        # JAR de plugins en runtime (suele ignorarse en git)\n│   ├── themes/                         # temas externos instalados\n│   ├── snippets/                       # snippets CSS del usuario sobre el tema activo\n│   ├── data/                           # BD o bóveda en runtime (gitignored)\n│   ├── logs/\n│   └── backups/\n├── plugins-source/                     # fuentes → build-plugins → jylos/plugins/\n├── themes/                             # fuentes → build-themes → jylos/themes/\n├── resources/images/                   # banner y capturas del README\n├── scripts/                            # build, launch, package, smoke tests\n├── docs/                                # documentación técnica (docs/README.md)\n├── AGENTS.md\n├── changelog.md\n├── README.md\n└── README.es.md\n```\n\nNo forma parte de la app: `replica-grafo/` (experimento Typst/grafo opcional; ver [docs/README.md](docs/README.md)).\n\n## Configuración\n\n### Almacenamiento\n\n- **SQLite** (por defecto): `jylos/data/database.db`\n- **Bóveda filesystem**: carpeta de notas `.md` con frontmatter YAML; cambio en **Herramientas → Cambiar almacenamiento**. Cambiar de una bóveda filesystem a otra recarga la sesión **sin reiniciar**; cambiar entre **SQLite** y **filesystem** sigue requiriendo reinicio\n- Otros directorios runtime bajo `jylos/`: `logs/`, `backups/`, `plugins/`, `themes/`, `snippets/`\n\n### Iconos de la aplicación\n\n| Recurso | Ruta | Uso |\n|---------|------|-----|\n| Ventana + Acerca de | `jylos/src/main/resources/icons/app-icon.png` | `app.icon.window` en `app.properties` |\n| Instalador Windows | `icons/icon.ico` | `app.icon.windows` |\n| Instalador macOS | `icons/icon.icns` | `app.icon.macos` |\n| Instalador Linux | `icons/icon.png` | `app.icon.linux` |\n\nLos iconos de barra y menús son glifos **Feather** y **Bootstrap Icons** vía Ikonli (`fth-*` / `bi-*` en FXML), no ficheros en `icons/`.\n\n### Temas\n\nPaquetes en `themes/\u003cid\u003e/` (`theme.properties` + `theme.css`). En desarrollo: `./scripts/build-themes.sh` (copia a `jylos/themes/`). **App instalada:** copia la carpeta del tema a `~/Library/Application Support/Jylos/themes/\u003cid\u003e/` (macOS), `%APPDATA%\\Jylos\\themes\\\u003cid\u003e\\` (Windows) o `~/.config/Jylos/themes/\u003cid\u003e/` (Linux); detalle en [themes/README.md](themes/README.md).\n\n### Snippets CSS\n\nColoca ficheros `.css` en la carpeta `snippets/` para retocar la interfaz sobre el tema activo (estilo Obsidian), sin crear un tema completo. Actívalos en **Preferencias → Snippets CSS**; cada snippet activo se superpone **después** del tema, así que sus reglas tienen prioridad. Usa **Abrir carpeta** en ese diálogo para llegar al directorio (`\u003cappData\u003e/snippets`). El nombre de un snippet debe ser un fichero `.css` simple. Hay ejemplos listos para usar y adaptables al tema (Atom One, Nord, Solarized — cada uno con variante clara y oscura) en [snippets-examples/](snippets-examples/). Los snippets pueden ramificar con la clase `theme-dark` / `theme-light` que Jylos pone en el root de la escena (estilo Obsidian), y esas mismas capas de estilo se propagan también a diálogos tematizados y overlays de comandos como la paleta y el quick switcher.\n\n### Plugins\n\n- Compilar: `./scripts/build-plugins.sh` → `jylos/plugins/*.jar` (objetivo **Java 21**)\n- Activar/desactivar en **Herramientas → Gestionar plugins**\n\n## Documentación\n\n- [docs/es/README.md](docs/es/README.md) — índice\n- [docs/es/BUILD.md](docs/es/BUILD.md)\n- [docs/es/LAUNCH_APP.md](docs/es/LAUNCH_APP.md)\n- [docs/es/ARCHITECTURE.md](docs/es/ARCHITECTURE.md)\n- [docs/es/ARCHITECTURE_GUIDELINES.md](docs/es/ARCHITECTURE_GUIDELINES.md)\n- [docs/es/I18N.md](docs/es/I18N.md)\n- [docs/es/PLUGINS.md](docs/es/PLUGINS.md)\n- [docs/es/PACKAGING.md](docs/es/PACKAGING.md)\n- [docs/es/CICD.md](docs/es/CICD.md)\n- [docs/es/TESTING.md](docs/es/TESTING.md)\n- [docs/es/EVENT_BUS_CONTRACT.md](docs/es/EVENT_BUS_CONTRACT.md)\n- [docs/es/GIT.md](docs/es/GIT.md)\n- [docs/es/GRAPH.md](docs/es/GRAPH.md)\n- [docs/es/SEARCH.md](docs/es/SEARCH.md)\n- [docs/es/WORKSPACES.md](docs/es/WORKSPACES.md)\n- [AGENTS.md](AGENTS.md)\n- [changelog.md](changelog.md)\n\n## Resolución de Problemas\n\n### Errores JavaFX Runtime\n\nUsa `launch-jylos.*` (incluye module-path). Ejecuta `build_all` antes si falta el JAR.\n\n### JAR no encontrado\n\n```bash\n./scripts/build_all.sh\n```\n\n### Java o Maven no encontrados\n\nAsegura ambos en `PATH`:\n\n```bash\njava -version\nmvn -version\n```\n\n### Warnings de parent-POM JavaFX\n\nWarnings del tipo `Failed to build parent project for org.openjfx:javafx-*` son conocidos y no bloqueantes.\n\n## Hoja de Ruta\n\nLas siguientes áreas reflejan intereses reales para el desarrollo futuro del proyecto. No es una lista de compromisos — es una dirección abierta, y las contribuciones son bienvenidas.\n\n- **API HTTP local**: interfaz REST de lectura/escritura enlazada a `localhost` con autenticación Bearer, para integraciones con scripts (Alfred, Raycast, pipelines de shell) respetando las notas privadas\n- **CI/CD automatizado**: workflow de GitHub Actions para ejecutar los tests en cada PR y publicar builds por plataforma automáticamente al etiquetar una versión\n- **Profundidad de la API de plugins**: hooks de ciclo de vida más ricos y mejor documentación para facilitar el desarrollo de plugins de terceros\n- **Integración con el SO**: soporte de bandeja del sistema y empaquetado nativo más pulido por plataforma\n- **Feedback de la comunidad**: funcionalidades y correcciones derivadas del uso real y de pull requests\n\n## Contribución\n\n- Cambios pequeños e incrementales.\n- Ejecutar tests antes de PR.\n- Mantener compatibilidad SQLite/FileSystem y plugins.\n- Actualizar documentación cuando cambie comportamiento.\n\n## Licencia\n\n[Licencia MIT](LICENSE) — Copyright © 2025–2026 **Eduardo Díaz Sánchez**.\n\nPuedes usar, modificar y distribuir este software bajo los términos de la MIT; conserva el aviso de copyright y el texto de la licencia en copias o porciones sustanciales. Contacto: ed.dzsn@protonmail.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frgiskard7%2Fjylos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frgiskard7%2Fjylos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frgiskard7%2Fjylos/lists"}