Xenner

Bloc de notas desktop con skins TXT (Tauri + Solid + Rust)

Creador de notas desktop con Tauri 2 + SolidJS + TypeScript + Rust, cuya interfaz es 100% modificable por skins basadas en archivos TXT que el usuario edita. SkinEngine parsea clave="valor" a variables CSS, con skin default glassmorphism embebida y fallback total: una skin rota jamás cuelga la app. Especificación en docs/SKIN_SPEC.md.

2026 · En desarrollo

Captura de Xenner
Xenner — captura del proyecto.
01

Contexto y propósito

Xenner es un bloc de notas desktop (Tauri 2 + SolidJS + TS + Rust) donde toda la UI se personaliza con skins en archivos TXT que el usuario edita. El diseño es tolerante a fallos: una skin rota jamás cuelga la app.

El valor técnico: un SkinEngine tolerante a fallos + backend Rust mínimo + transparencia real de ventana para glassmorphism.

Propósito declarado: Ofrecer un bloc de notas desktop rápido donde el usuario controla toda la apariencia editando TXT simples, sin recompilar ni saber CSS avanzado.

02

Arquitectura

Frontend SolidJS con SkinEngine (TXT -> CSS vars --skin-*) + CRUD de notas (fase 1: localStorage). Backend Rust con scan_skins + lectura TXT tolerante a fallos. Ventana transparente Tauri para glassmorphism real.

skins/<nombre>/*.txt ──▶ Rust scan_skins/read_skin_file ──▶ SolidJS SkinEngine
config.txt (skinPath="webcore") ──▶ parse clave="valor" ──▶ CSS vars --skin-*
default glassmorphism EMBEBIDA ◀── fallback si falta/falla/corrupto ── app viva
  • Formato TXT: una variable por línea clave="valor" (comillas opcionales), # comentarios, última duplicada gana, desconocidas se ignoran, valores con !important/;/{} se descartan (anti-CSS-injection).
  • Por componente: background.txt, button.txt, note.txt, sidebar.txt, input.txt, toolbar.txt + skin.txt (manifiesto name/version/author). Claves comunes background/text/border/radius/blur/shadow/accent/font + propias (backgroundHover, itemActive, placeholder, focus...).
  • Aplicación: variables --skin-<comp>-<clave> en :root; componentes solo usan vars, nunca colores hardcodeados. Cambiar TXT + recargar = nueva apariencia.
  • Rust: scan_skins lista carpetas con skin.txt válido ([] si nada); lectura que nunca falla. Frontend: notas CRUD fase 1 en localStorage; ventana transparent:true + html,body{background:transparent} para blur real del SO (window-vibrancy en Win/Mac a futuro).
03

Stack detallado

CapaTecnologíaDetalle
UISolidJS + Vite 6 + TSSkinEngine + signals de notas
DesktopTauri 2 + Rustskin.rs, transparent window, opener
SkinsTXT planoEspecificación docs/SKIN_SPEC.md (fuente de verdad)
PersistencialocalStorage (fase 1)AppData + hot-reload de skins en roadmap
06

Datos y conexiones

xenner/skins/
  config.txt → skinPath="webcore"
  glass-default/ (ejemplo = default embebida)
  webcore/ (segunda skin ejemplo)
  <tu-skin>/skin.txt + *.txt
07

Autenticación y seguridad

  • Sin auth: app local. Higiene anti-inyección en parser TXT.
  • Riesgo documentado: transparent:true + Nvidia en Linux puede fallar (issue Tauri #14924) con conmutador previsto.
08

Frontend y rutas

  • Desktop de notas (lista + editor + selector de skin)
  • Componentes 100% var-driven; cambiar tema no toca código.
  • Flujo de desarrollo: revisar SKIN_SPEC → pnpm build / cargo check → commit en español.
09

Despliegue

Dónde: Desktop (Tauri bundle) + vite dev para UI

  • cd xenner && pnpm install && pnpm dev (:1420) para UI
  • cargo check -p xenner_lib en src-tauri para Rust
  • cargo build / tauri build solo cuando se pida (lento)
10

Metodología y decisiones

  • Spec-first: SKIN_SPEC.md manda sobre el código; si discrepan se corrige código.
  • Verificación con build real antes de dar por terminado un cambio.
  • Commits pequeños tras cada función (xenner: <tarea> — <detalle>).
11

Retos y soluciones

Skins de usuario que rompen CSSParser permisivo + default embebida + ignorar claves/valores peligrosos.
Blur real vs fakeTransparencia Tauri + CSS; backdrop-filter solo blurea DOM, el SO blurea el fondo.
12

Qué aprendí

  • Diseño de DSL mínimo usable por no-programadores.
  • Ventanas transparentes Tauri y composición del SO.
  • Contratos tolerantes a fallos.
13

Ejecutar en local

cd xenner && pnpm install
pnpm dev (UI) o pnpm build para verificar
Editar xenner/skins/<nombre>/*.txt y recargar; cambiar config.txt para alternar skins
14

Próximos pasos

  • Hot-reload de skins sin reinicio.
  • Skins de usuario en AppData.
  • window-vibrancy en Win/Mac + sincronización.
↗

Seguir explorando