[{"content":"CAVA es un visualizador de audio para terminal. Por defecto usa los colores del tema actual, pero permite cargar paletas de color desde archivos externos ubicados en ~/.config/cava/themes/.\nDescargar el tema # El tema Dracula para CAVA está disponible en varios repositorios de la comunidad. El archivo tiene extensión .cava y contiene solo la sección [color] con los gradientes definidos en hex.\nUn ejemplo del contenido:\n[color] gradient = 1 gradient_color_1 = \u0026#39;#8BE9FD\u0026#39; gradient_color_2 = \u0026#39;#9AEDFE\u0026#39; gradient_color_3 = \u0026#39;#CAA9FA\u0026#39; gradient_color_4 = \u0026#39;#BD93F9\u0026#39; gradient_color_5 = \u0026#39;#FF92D0\u0026#39; gradient_color_6 = \u0026#39;#FF79C6\u0026#39; gradient_color_7 = \u0026#39;#FF6E67\u0026#39; gradient_color_8 = \u0026#39;#FF5555\u0026#39; Guárdalo en:\n~/.config/cava/themes/dracula.cava Activar el tema # Abre el archivo de configuración principal, en mi caso mi editor de texto es Helix pero puede ser cualquiera:\nhelix ~/.config/cava/config Busca la sección [color] y agrega esta línea — asegúrate de que no esté comentada con ;:\n[color] theme = dracula.cava Solo el nombre del archivo, sin ruta ni comillas. CAVA busca automáticamente en ~/.config/cava/themes/.\nVerificar # Ejecuta CAVA con música sonando:\ncava Las barras deberían mostrar el gradiente de Dracula de azul a rojo. Si algo falla, CAVA muestra el error directamente en terminal indicando qué archivo no pudo abrir.\n","date":"29 abril 2026","externalUrl":null,"permalink":"/blog/cava-dracula/","section":"Blog","summary":"CAVA permite cargar temas de color desde archivos externos. Con un solo ajuste en el config se puede aplicar Dracula sin tocar los colores manualmente.","title":"Aplicar tema Dracula en CAVA","type":"blog"},{"content":" Linux, terminal y open source. Todo lo que voy aprendiendo en el camino. ","date":"29 abril 2026","externalUrl":null,"permalink":"/blog/","section":"Blog","summary":" Linux, terminal y open source. Todo lo que voy aprendiendo en el camino. ","title":"Blog","type":"blog"},{"content":"","date":"29 abril 2026","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"29 abril 2026","externalUrl":null,"permalink":"/tags/cava/","section":"Tags","summary":"","title":"Cava","type":"tags"},{"content":"","date":"29 abril 2026","externalUrl":null,"permalink":"/tags/cli/","section":"Tags","summary":"","title":"Cli","type":"tags"},{"content":"","date":"29 abril 2026","externalUrl":null,"permalink":"/tags/dracula/","section":"Tags","summary":"","title":"Dracula","type":"tags"},{"content":"","date":"29 abril 2026","externalUrl":null,"permalink":"/","section":"Graplo","summary":"","title":"Graplo","type":"page"},{"content":"","date":"29 abril 2026","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"","date":"29 abril 2026","externalUrl":null,"permalink":"/tags/rice/","section":"Tags","summary":"","title":"Rice","type":"tags"},{"content":"","date":"29 abril 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"29 abril 2026","externalUrl":null,"permalink":"/categories/terminal/","section":"Categories","summary":"","title":"Terminal","type":"categories"},{"content":"","date":"15 abril 2026","externalUrl":null,"permalink":"/tags/containers/","section":"Tags","summary":"","title":"Containers","type":"tags"},{"content":"","date":"15 abril 2026","externalUrl":null,"permalink":"/categories/contenedores/","section":"Categories","summary":"","title":"Contenedores","type":"categories"},{"content":"","date":"15 abril 2026","externalUrl":null,"permalink":"/tags/jellyfin/","section":"Tags","summary":"","title":"Jellyfin","type":"tags"},{"content":"Tenía Jellyfin corriendo con un podman run directo que funcionaba bien, pero llegó el momento de mover la biblioteca de medios a un nuevo disco. Ahí descubrí el problema: los contenedores de Podman son inmutables una vez creados. No podés editar volúmenes, puertos ni nombre sin borrar y recrear el contenedor desde cero.\nLa solución es podman-compose y un archivo compose.yml que se convierte en la fuente de verdad del contenedor.\nEl problema con podman run # Cuando creás un contenedor con podman run, las rutas y configuración quedan fijas. Si querés cambiar algo — un volumen, un puerto, el nombre — tenés que hacer:\npodman stop jellyfin podman rm jellyfin podman run ... # con los cambios Además, si en seis meses no recordás con qué flags lo creaste, tenés que hacer podman inspect para recuperar el comando original. No es práctico.\nLa solución: podman-compose # Con podman-compose toda la configuración vive en un archivo YAML. Querés cambiar algo, editas el archivo y en la próxima ejecución toma los cambios.\nInstalación # paru -S podman-compose El archivo compose.yml # Creo el archivo en una ubicación ordenada:\nmkdir -p ~/.config/containers/jellyfin El contenido en ~/.config/containers/jellyfin/compose.yml:\nservices: jellyfin: image: jellyfin/jellyfin container_name: jellyfin ports: - \u0026#34;8096:8096\u0026#34; volumes: - /home/graplo/.config/jellyfin:/config - /home/graplo/.cache/jellyfin:/cache - /mnt/vault/Music:/media/music - /mnt/vault/Movies:/media/movies Noto que no uso restart: unless-stopped. Jellyfin en mi caso lo arranco bajo demanda — no necesito que corra como demonio permanente consumiendo ~1GB de RAM cuando no lo uso.\nComandos básicos # Arrancar:\npodman-compose -f ~/.config/containers/jellyfin/compose.yml up -d Apagar:\npodman-compose -f ~/.config/containers/jellyfin/compose.yml down El flag -d es detached — corre en segundo plano sin bloquear la terminal.\nImportante: down para el contenedor y lo borra, pero no toca la imagen. No hay que volver a descargar los 1.55GB de Jellyfin cada vez.\nFunción Fish para uso diario # El comando completo es largo para escribirlo cada vez. Lo envuelvo en una función Fish:\nfunction jelly set compose_file ~/.config/containers/jellyfin/compose.yml if podman ps | grep -q jellyfin podman-compose -f $compose_file down echo \u0026#34;Jellyfin apagado\u0026#34; else podman-compose -f $compose_file up -d echo \u0026#34;Jellyfin encendido\u0026#34; end end Ahora con solo escribir jelly el contenedor se levanta o apaga según su estado actual.\nFlujo para actualizar Jellyfin # podman pull jellyfin/jellyfin # descarga la imagen más reciente jelly # apaga si está corriendo jelly # levanta con la nueva imagen Para limpiar imágenes viejas:\npodman image prune Por qué vale la pena # La ventaja principal no es técnica sino de mantenimiento: el compose.yml es documentación. En seis meses — o en una reinstalación — abrís ese archivo y sabés exactamente cómo está configurado Jellyfin sin tener que reconstruir el comando original de memoria.\n","date":"15 abril 2026","externalUrl":null,"permalink":"/blog/migrando-jellyfin-a-podman-compose/","section":"Blog","summary":"Cómo migrar Jellyfin de un podman run directo a podman-compose, incluyendo el compose.yml, una función Fish para arrancar y apagar con un solo comando, y el flujo para actualizar la imagen sin perder configuración.","title":"Migrando Jellyfin de podman run a podman-compose","type":"blog"},{"content":"","date":"15 abril 2026","externalUrl":null,"permalink":"/tags/podman/","section":"Tags","summary":"","title":"Podman","type":"tags"},{"content":"","date":"15 abril 2026","externalUrl":null,"permalink":"/tags/self-hosting/","section":"Tags","summary":"","title":"Self-Hosting","type":"tags"},{"content":"Jellyfin está disponible como Flatpak, pero tiene un demonio que queda corriendo en background. Con Podman podés correrlo solo cuando lo necesitás, sin servicios activos ni overhead innecesario.\nRequisitos previos # Podman debe estar instalado. En CachyOS está en los repos oficiales:\nparu -S podman Por defecto Podman no tiene registros de búsqueda configurados. Para poder buscar y descargar imágenes de Docker Hub, agrega esta línea al inicio de /etc/containers/registries.conf:\nsudo helix /etc/containers/registries.conf Helix es el editor que uso — podés usar cualquier otro: nano, vim, gedit, etc.\nunqualified-search-registries = [\u0026#34;docker.io\u0026#34;] Sin esto, Podman no sabe dónde buscar imágenes por nombre corto y hay que usar el nombre completo del registro en cada comando.\nDescargar la imagen # podman pull docker.io/jellyfin/jellyfin Jellyfin tiene imagen oficial en Docker Hub mantenida por su propio equipo. El proceso descarga la imagen y la almacena localmente — no hace falta repetirlo salvo para actualizar.\nCrear las carpetas de configuración # mkdir -p ~/.config/jellyfin ~/.cache/jellyfin Jellyfin guarda su configuración y base de datos en ~/.config/jellyfin. El cache va en ~/.cache/jellyfin. Ambas carpetas persisten entre reinicios del contenedor.\nCrear el contenedor # podman run -d \\ --name jellyfin \\ -p 8096:8096 \\ -v ~/.config/jellyfin:/config \\ -v ~/.cache/jellyfin:/cache \\ -v ~/Música:/media/musica \\ -v ~/Movies:/media/movies \\ docker.io/jellyfin/jellyfin Este comando solo se ejecuta una vez. Los -v mapean carpetas del sistema al contenedor — la configuración y tu media quedan fuera del contenedor, así que si lo borras no pierdes nada.\nEl puerto 8096 queda mapeado al mismo puerto del host. Jellyfin es accesible en http://localhost:8096.\nUso diario # Una vez creado el contenedor, para arrancarlo y pararlo:\npodman start jellyfin podman stop jellyfin Para simplificarlo con una función Fish:\nfunction jelly if podman ps | grep -q jellyfin podman stop jellyfin echo \u0026#34;Jellyfin apagado\u0026#34; else podman start jellyfin echo \u0026#34;Jellyfin encendido\u0026#34; end end Guárdala en ~/.config/fish/functions/jelly.fish y desde cualquier terminal basta con escribir jelly para alternar el estado.\nEsta función es específica para Fish shell. Si usás Bash o Zsh, el equivalente sería un alias o función con sintaxis diferente.\nActualizar Jellyfin # podman pull docker.io/jellyfin/jellyfin podman stop jellyfin podman rm jellyfin podman run -d \\ --name jellyfin \\ -p 8096:8096 \\ -v ~/.config/jellyfin:/config \\ -v ~/.cache/jellyfin:/cache \\ -v ~/Música:/media/musica \\ -v ~/Movies:/media/movies \\ docker.io/jellyfin/jellyfin El podman rm solo borra el contenedor, no los volúmenes. Tu configuración y media quedan intactas.\nComandos útiles # Para verificar que el contenedor está corriendo:\npodman ps Para ver todas las imágenes descargadas:\npodman images Para ver los logs de Jellyfin si algo falla:\npodman logs jellyfin Estos comandos son básicos en cualquier flujo de trabajo con Podman o Docker. podman ps sin argumentos muestra solo los contenedores activos — podman ps -a muestra todos, incluyendo los detenidos.\n","date":"8 abril 2026","externalUrl":null,"permalink":"/blog/jellyfin-podman-cachyos/","section":"Blog","summary":"Podman permite correr Jellyfin como contenedor bajo demanda, sin demonio ni servicios activos. Más ligero que el Flatpak y fácil de actualizar.","title":"Jellyfin con Podman en CachyOS","type":"blog"},{"content":"","date":"6 abril 2026","externalUrl":null,"permalink":"/tags/cargo/","section":"Tags","summary":"","title":"Cargo","type":"tags"},{"content":"Si usas Linux y te gusta el software de terminal, tarde o temprano vas a topar con un programa escrito en Rust que no está en los repos de tu distro. Ahí es donde entra Cargo.\nCargo es el gestor de paquetes oficial de Rust — equivalente a pip en Python o npm en Node. Permite instalar programas directamente desde crates.io, el repositorio central de la comunidad Rust, compilándolos en tu propia máquina.\nInstalar Rust # En CachyOS y Arch lo más limpio es instalar rustup, que gestiona las versiones de Rust:\nparu -S rustup rustup default stable rustup te permite cambiar entre versiones estables, beta o nightly según lo necesites. Con stable tienes todo lo que necesitás para el uso normal.\nInstalar un programa # cargo install nombre Cargo descarga el código fuente y lo compila en tu máquina. Dependiendo del programa y tu hardware puede tardar desde segundos hasta varios minutos. Los binarios quedan en ~/.cargo/bin/, que debería estar en tu PATH.\nListar los programas instalados # cargo install --list Muestra todos los programas instalados via cargo con sus versiones. Útil para saber qué tenés y qué versión está activa.\nActualizar todo # Cargo no tiene un comando de actualización nativo, pero existe cargo-update que lo añade. Solo necesitás instalarlo una vez:\ncargo install cargo-update A partir de ahí, para actualizar todos los programas instalados:\ncargo install-update -a El -a es de \u0026ldquo;all\u0026rdquo; — actualiza todo lo que encuentre desactualizado.\nDesinstalar # cargo uninstall nombre Elimina el binario de ~/.cargo/bin/. No uses rm directamente sobre los binarios — cargo lleva un registro interno y es mejor que lo gestione él.\nVer la versión de cargo # cargo --version Una cosa a tener en cuenta: instalar desde cargo compila el código en tu máquina, lo que significa que necesitás las dependencias de compilación instaladas. En la mayoría de casos cargo lo gestiona solo, pero algún programa puede pedir librerías del sistema que tendrás que instalar por separado.\n","date":"6 abril 2026","externalUrl":null,"permalink":"/blog/rust-bases-comandos/","section":"Blog","summary":"Cargo es el gestor de paquetes de Rust. Con él podés instalar programas de la comunidad directamente desde crates.io, sin repositorios ni PPAs.","title":"Cargo: instalar y gestionar programas escritos en Rust","type":"blog"},{"content":"","date":"6 abril 2026","externalUrl":null,"permalink":"/tags/rust/","section":"Tags","summary":"","title":"Rust","type":"tags"},{"content":"","date":"6 abril 2026","externalUrl":null,"permalink":"/tags/terminal/","section":"Tags","summary":"","title":"Terminal","type":"tags"},{"content":"","date":"4 abril 2026","externalUrl":null,"permalink":"/tags/firewall/","section":"Tags","summary":"","title":"Firewall","type":"tags"},{"content":"","date":"4 abril 2026","externalUrl":null,"permalink":"/tags/gui/","section":"Tags","summary":"","title":"Gui","type":"tags"},{"content":"","date":"4 abril 2026","externalUrl":null,"permalink":"/categories/homelab/","section":"Categories","summary":"","title":"Homelab","type":"categories"},{"content":"Si instalaste Jellyfin en CachyOS y funciona bien desde tu computadora pero no podés acceder desde el celular o la TV, el problema probablemente no es Jellyfin — es el firewall.\nVerificar que Jellyfin está corriendo # Primero confirmamos que Jellyfin realmente está escuchando en la red:\nss -tulpn Si ves algo así en la salida: 0.0.0.0:8096 users:((\u0026ldquo;jellyfin\u0026rdquo;\u0026hellip;))\nJellyfin está activo y escuchando en todas las interfaces de red. El problema está en otro lado.\nEl culpable: el firewall # CachyOS usa nftables como firewall, y por defecto tiene una política bastante estricta. Podés verlo con:\nsudo nft list ruleset Vas a encontrar algo como: chain input { type filter hook input priority 0; policy drop; }\nEse policy drop significa que todo el tráfico entrante que no tenga una regla explícita que lo permita se bloquea automáticamente. El flujo era este:\nCelular / TV ↓ Puerto 8096 ↓ Firewall (nftables) ↓ policy drop → bloqueado\nJellyfin nunca recibía la conexión.\nLa solución # Usamos ufw, una herramienta que simplifica la gestión del firewall, para abrir el puerto 8096 que usa Jellyfin:\nsudo ufw allow 8096/tcp Para verificar que el cambio quedó activo:\nsudo ufw status Probar desde otro dispositivo # Desde el celular o la TV abrí el navegador y entrá a: http://192.168.X.X:8096\nReemplazá la IP por la de tu computadora. Un detalle importante: Jellyfin usa HTTP por defecto, no HTTPS. Asegurate de no poner https:// o no va a conectar.\n","date":"4 abril 2026","externalUrl":null,"permalink":"/blog/jellyfin-puerto-bloqueado-cachyos/","section":"Blog","summary":"Jellyfin funciona pero no es accesible desde la red local. El problema no es Jellyfin, es el firewall.","title":"Jellyfin Puerto Bloqueado Cachyos","type":"blog"},{"content":"","date":"4 abril 2026","externalUrl":null,"permalink":"/categories/linux/","section":"Categories","summary":"","title":"Linux","type":"categories"},{"content":"","date":"4 abril 2026","externalUrl":null,"permalink":"/tags/red/","section":"Tags","summary":"","title":"Red","type":"tags"},{"content":"","date":"31 marzo 2026","externalUrl":null,"permalink":"/tags/calendario/","section":"Tags","summary":"","title":"Calendario","type":"tags"},{"content":"","date":"31 marzo 2026","externalUrl":null,"permalink":"/tags/khal/","section":"Tags","summary":"","title":"Khal","type":"tags"},{"content":"Khal puede manejar varios calendarios a la vez, cada uno con su propio color. Esto permite tener los feriados nacionales separados de los eventos personales, sin necesidad de sincronizarlos con Disroot.\nDescargar el .ics de Thunderbird # Thunderbird mantiene calendarios de feriados para muchos países en formato .ics listo para importar:\ncurl -o ~/Descargas/PeruHolidays.ics \u0026#34;https://www.thunderbird.net/media/caldata/autogen/PeruHolidays.ics\u0026#34; La lista completa de países está en thunderbird.net/en-US/calendar/holidays.\nCrear la carpeta local # mkdir -p ~/.local/share/khal/calendars/private/feriados Agregar el calendario en khal # En ~/.config/khal/config, dentro de la sección [calendars]:\n[[feriados]] path = /home/graplo/.local/share/khal/calendars/private/feriados type = calendar color = \u0026#39;#ffb86c\u0026#39; Importar el .ics # khal import --batch -a feriados ~/Descargas/PeruHolidays.ics La opción -a especifica el calendario destino. Sin --batch khal pregunta confirmación por cada evento — con feriados son muchos, así que --batch ahorra tiempo.\nPor qué no sincroniza con Disroot # Vdirsyncer solo conoce las carpetas que están en su config (~/.vdirsyncer/config). Como /feriados no está ahí, nunca la toca. Los feriados quedan locales, lo cual está bien — son datos estáticos que no cambian frecuentemente.\nDisroot ya tiene los feriados integrados como suscripción interna en su interfaz web, pero esa suscripción no es accesible vía CalDAV para vdirsyncer. La solución local con el .ics de Thunderbird es más simple y funciona igual de bien.\nActualizar los feriados # El .ics de Thunderbird cubre 2025-2028. Cuando expire, solo hay que repetir el proceso: descargar el nuevo archivo e importarlo. Khal preguntará si actualizar los eventos existentes — con --batch los sobreescribe automáticamente.\n","date":"31 marzo 2026","externalUrl":null,"permalink":"/blog/khal-feriados-peru/","section":"Blog","summary":"Calendario de feriados en Khal","title":"Khal Feriados Peru","type":"blog"},{"content":"","date":"30 marzo 2026","externalUrl":null,"permalink":"/categories/dms/","section":"Categories","summary":"","title":"DMS","type":"categories"},{"content":"Khal es un programa de calendario basado en la terminal (CLI) para sistemas operativos tipo Unix (Linux, macOS), diseñado para ser ligero, rápido y compatible con estándares iCalendar.\nPaquetes necesarios # sudo pacman -S vdirsyncer khal cronie vdirsyncer: El motor que conecta con Disroot y descarga los archivos .ics.\nkhal: La interfaz de calendario para tu terminal (el reemplazo limpio de calcurse).\ncronie: El demonio que se encarga de que todo se actualice solo cada 15 minutos.\nConfigurar khal primero # Es importante configurar khal antes que vdirsyncer, porque khal decide dónde guardar los calendarios localmente y vdirsyncer tiene que apuntar a esa misma ruta.\nkhal configure El asistente es interactivo:\nEn mi caso hice un calendario de 0 con el asistente para q cree la ruta q al final fue en ~/.local/share/khal/calendars/private/personal\nEn todo caso, khal crea su config en ~/.config/khal/config. Verifica la ruta exacta donde guarda los calendarios:\ncat ~/.config/khal/config Anota el path que aparece en [[private]] — esa es la ruta que necesitas para vdirsyncer.\nSi el wizard crashea, crea el config manualmente: # hx ~/.config/khal/config [calendars] [[private]] path = /home/TU_USUARIO/.local/share/khal/calendars/private/personal type = calendar [locale] timeformat = %H:%M dateformat = %Y-%m-%d longdateformat = %Y-%m-%d datetimeformat = %Y-%m-%d %H:%M longdatetimeformat = %Y-%m-%d %H:%M [default] default_calendar = private Configurar vdirsyncer # mkdir -p ~/.vdirsyncer hx ~/.vdirsyncer/config Usa la ruta que khal creó (con /personal al final, que es la colección que vdirsyncer va a crear):\n[general] status_path = \u0026#34;~/.local/share/vdirsyncer/status\u0026#34; [pair personal_sync] a = \u0026#34;disroot_remote\u0026#34; b = \u0026#34;disroot_local\u0026#34; collections = [\u0026#34;from a\u0026#34;, \u0026#34;from b\u0026#34;] conflict_resolution = \u0026#34;a wins\u0026#34; metadata = [\u0026#34;color\u0026#34;] [storage disroot_remote] type = \u0026#34;caldav\u0026#34; url = \u0026#34;https://cloud.disroot.org/remote.php/dav/\u0026#34; username = \u0026#34;TU_USUARIO\u0026#34; password = \u0026#34;TU_CONTRASEÑA_O_APP_PASSWORD\u0026#34; [storage disroot_local] type = \u0026#34;filesystem\u0026#34; path = \u0026#34;/home/TU_USUARIO/.local/share/khal/calendars/private/personal\u0026#34; fileext = \u0026#34;.ics\u0026#34; Clave: El path de disroot_local debe ser exactamente la misma ruta que tiene khal en su config. Si no coinciden, khal no va a ver los eventos.\nSincronización inicial # vdirsyncer discover personal_sync Va a preguntar si crear la colección personal localmente → responde y.\nLuego sincroniza:\nvdirsyncer sync Debería descargar tus archivos .ics de Disroot a la carpeta local.\nVerificar con khal # khal list today 2026-12-31 Importante: khal list sin argumentos solo muestra eventos de hoy. Si tus eventos son en días futuros, usa un rango de fechas como en el ejemplo de arriba.\nVista mensual:\nkhal calendar Auto-sync (opcional) # Para que vdirsyncer sincronice automáticamente cada 15 minutos:\ncrontab -e Agrega:\n*/15 * * * * /usr/bin/vdirsyncer sync Comandos útiles de khal # khal list # eventos de hoy khal list today 2026-04-30 # eventos en un rango khal calendar # vista mensual khal new # crear evento interactivo Troubleshooting # Error 401 Unauthorized en vdirsyncer discover: Usa una App Password de Disroot → https://cloud.disroot.org/settings/user/security\nkhal list no muestra nada: Tus eventos probablemente son en fechas futuras. Usa khal list today FECHA_FUTURA.\nkhal list: \u0026ldquo;personal is not valid for default_calendar\u0026rdquo;: El default_calendar debe coincidir con el nombre entre corchetes [[nombre]] en la sección [calendars] del config de khal.\nLas rutas no coinciden: La causa más común de que khal no muestre eventos. Verifica que path en khal y path en vdirsyncer apunten exactamente a la misma carpeta.\n","date":"30 marzo 2026","externalUrl":null,"permalink":"/blog/dms-integracion-calendario/","section":"Blog","summary":"Khal es un programa de calendario basado en la terminal (CLI) para sistemas operativos tipo Unix (Linux, macOS), diseñado para ser ligero, rápido y compatible con estándares iCalendar.\n","title":"Dms Integracion con Calendario","type":"blog"},{"content":"","date":"30 marzo 2026","externalUrl":null,"permalink":"/tags/open-source/","section":"Tags","summary":"","title":"Open Source","type":"tags"},{"content":"","date":"30 marzo 2026","externalUrl":null,"permalink":"/categories/cachyos/","section":"Categories","summary":"","title":"Cachyos","type":"categories"},{"content":" El problema es el Keyring # En cachyos-keyring es un paquete esencial en Cahyos Linux que contiene las llaves PGP firmadas por los desarrolladores y mantenedores de la distribución. Pero en este caso parecia como q no las reconocía.\nProblema en cuestión # paru -Syu error: cachyos: la firma de «CachyOS \u0026lt;admin@cachyos.org\u0026gt;» no es válida [sudo] contraseña para graplo: error: cachyos: la firma de «CachyOS \u0026lt;admin@cachyos.org\u0026gt;» no es válida :: Sincronizando las bases de datos de los paquetes... cachyos-v3 127,4 KiB 357 KiB/s 00:00 [------------------------------------------] 100% cachyos-core-v3 está actualizado cachyos-extra-v3 está actualizado cachyos 528,0 KiB 1390 KiB/s 00:00 [------------------------------------------] 100% core está actualizado extra está actualizado multilib está actualizado error: cachyos-v3: la firma de «CachyOS \u0026lt;admin@cachyos.org\u0026gt;» no es válida error: cachyos: la firma de «CachyOS \u0026lt;admin@cachyos.org\u0026gt;» no es válida error: no se han podido sincronizar todas las bases de datos (error inesperado) Se soluciona con: # sudo pacman -Sy cachyos-keyring Lo q me aparece en pantalla # sudo pacman -Sy cachyos-keyring error: cachyos-v3: la firma de «CachyOS \u0026lt;admin@cachyos.org\u0026gt;» no es válida error: cachyos: la firma de «CachyOS \u0026lt;admin@cachyos.org\u0026gt;» no es válida :: Sincronizando las bases de datos de los paquetes... cachyos-v3 127,4 KiB 1053 KiB/s 00:00 [------------------------------------------] 100% cachyos-core-v3 está actualizado cachyos-extra-v3 está actualizado cachyos 528,0 KiB 2,86 MiB/s 00:00 [------------------------------------------] 100% core está actualizado extra está actualizado multilib está actualizado advertencia: cachyos-keyring-20240331-1 está actualizado -- reinstalándolo resolviendo dependencias... buscando conflictos entre paquetes... Paquete (1) Versión antigua Versión nueva Diferencia neta cachyos/cachyos-keyring 20240331-1 20240331-1 0,00 MiB Tamaño total de la instalación: 0,00 MiB Tamaño neto tras actualizar: 0,00 MiB :: ¿Continuar con la instalación? [S/n] s (1/1) comprobando las claves del depósito [------------------------------------------] 100% (1/1) verificando la integridad de los paquetes [------------------------------------------] 100% (1/1) cargando los archivos de los paquetes [------------------------------------------] 100% (1/1) comprobando conflictos entre archivos [------------------------------------------] 100% :: Ejecutando los «hooks» de preinstalación... (1/2) Performing snapper pre snapshots for the following configurations... ==\u0026gt; root: 652 (2/2) Waiting for limine-snapper-sync to finish... :: Procesando los cambios de los paquetes... (1/1) reinstalando cachyos-keyring [------------------------------------------] 100% ==\u0026gt; Añadiendo las claves de cachyos.gpg... ==\u0026gt; Actualizando la base de datos de claves de confianza... gpg: siguiente comprobación de base de datos de confianza el: 2026-10-21 :: Ejecutando los «hooks» de posinstalación... (1/3) Arming ConditionNeedsUpdate... (2/3) Checking which packages need to be rebuilt (3/3) Performing snapper post snapshots for the following configurations... ==\u0026gt; root: 653 Entonces q ha pasado: # Ya está claro. La reinstalación del keyring fue lo que lo solucionó — al reinstalar corrió el hook de posinstalación que dice Añadiendo las claves de cachyos.gpg y Actualizando la base de datos de claves de confianza, eso es lo que regeneró las firmas locales.\n","date":"30 marzo 2026","externalUrl":null,"permalink":"/blog/cachyos-no-actualiza/","section":"Blog","summary":"El problema es el Keyring # En cachyos-keyring es un paquete esencial en Cahyos Linux que contiene las llaves PGP firmadas por los desarrolladores y mantenedores de la distribución. Pero en este caso parecia como q no las reconocía.\n","title":"Cachyos No Actualiza","type":"blog"},{"content":"","date":"30 marzo 2026","externalUrl":null,"permalink":"/tags/problemas/","section":"Tags","summary":"","title":"Problemas","type":"tags"},{"content":"","date":"29 marzo 2026","externalUrl":null,"permalink":"/tags/editor-de-texto/","section":"Tags","summary":"","title":"Editor De Texto","type":"tags"},{"content":"Helix es un editor de texto modal y moderno para terminal, escrito en Rust, diseñado para ser rápido y eficiente.\nObjetivo # Evitar el desplazamiento horizontal (scroll lateral) y mejorar la lectura de líneas largas en el editor, haciendo que el texto \u0026ldquo;salte\u0026rdquo; automáticamente al borde de la ventana.\nConfiguración aplicada en ~/.config/helix/config.toml # [editor] # Activa el ajuste de línea automático soft-wrap.enable = true # Define el carácter que aparece al inicio de la línea de continuación soft-wrap.wrap-indicator = \u0026#34;↪ \u0026#34; # Mantiene la sangría de la línea original en el salto soft-wrap.wrap-at-text-width = true text-width = 110 text-width = 110\nPuedes cambiar \u0026rsquo;text-width = 110\u0026rsquo; al valor q te resulte comodo\n","date":"29 marzo 2026","externalUrl":null,"permalink":"/blog/helix-salto-de-linea/","section":"Blog","summary":"Helix es un editor de texto modal y moderno para terminal, escrito en Rust, diseñado para ser rápido y eficiente.\n","title":"Helix -  Salto De Linea","type":"blog"},{"content":"","date":"29 marzo 2026","externalUrl":null,"permalink":"/categories/software/","section":"Categories","summary":"","title":"Software","type":"categories"},{"content":" Rmpc es un cliente moderno y rápido para Music Player Daemon (MPD). Escrito en Rust, está diseñado para funcionar en la terminal (TUI) de sistemas Linux. Se caracteriza por ser altamente configurable, tener soporte para carátulas de álbumes y ofrecer una experiencia de navegación de tres columnas tipo ranger.\nInstalar paquetes necesarios # sudo pacman -S --needed mpd mpc rustup rmpc Opcional (extras recomendados): # sudo pacman -S --needed cava ffmpeg yt-dlp ueberzugpp Crear configuración de MPD (modo usuario) # Crear carpeta:\nmkdir -p ~/.config/mpd Crear archivo:\nYo uso Helix (hx) pero puede ser el q gustes como nano, o cualquier editor de texto\nhx ~/.config/mpd/mpd.conf Contenido mínimo funcional: # music_directory \u0026#34;~/Música\u0026#34; playlist_directory \u0026#34;~/.config/mpd/playlists\u0026#34; db_file \u0026#34;~/.local/share/mpd/database\u0026#34; log_file \u0026#34;~/.local/share/mpd/log\u0026#34; state_file \u0026#34;~/.local/share/mpd/state\u0026#34; sticker_file \u0026#34;~/.local/share/mpd/sticker.sql\u0026#34; bind_to_address \u0026#34;127.0.0.1\u0026#34; port \u0026#34;6600\u0026#34; auto_update \u0026#34;yes\u0026#34; restore_paused \u0026#34;yes\u0026#34; audio_output { type \u0026#34;pipewire\u0026#34; name \u0026#34;PipeWire Sound Server\u0026#34; } Crear directorios y archivos necesarios # Aun q existan no sobreescribe solo actualiza la fecha de modificación\nmkdir -p ~/.config/mpd/playlists mkdir -p ~/.local/share/mpd touch ~/.local/share/mpd/database touch ~/.local/share/mpd/log touch ~/.local/share/mpd/state touch ~/.local/share/mpd/sticker.sql Activar MPD como servicio de usuario # systemctl --user enable --now mpd Verificar: # systemctl --user status mpd Debe mostrar:\nActive: active (running) Activar MPD como servicio de usuario # systemctl --user enable --now mpd Verificar: # systemctl --user status mpd Debe mostrar:\nActive: active (running) Indexar música (primera vez) # mpc update Probar conexión:\nmpc status Ejecutar rmpc # rmpc Flujo final # MPD (daemon audio) ↓ mpc (control CLI) ↓ rmpc (interfaz TUI)","date":"26 marzo 2026","externalUrl":null,"permalink":"/blog/rmpc-installation/","section":"Blog","summary":" Rmpc es un cliente moderno y rápido para Music Player Daemon (MPD). Escrito en Rust, está diseñado para funcionar en la terminal (TUI) de sistemas Linux. Se caracteriza por ser altamente configurable, tener soporte para carátulas de álbumes y ofrecer una experiencia de navegación de tres columnas tipo ranger.\n","title":"rmpc - instalación","type":"blog"},{"content":"","date":"26 marzo 2026","externalUrl":null,"permalink":"/tags/tui/","section":"Tags","summary":"","title":"TUI","type":"tags"},{"content":" Puedes ver los temas disponibles con: # bat --list-themes Y probar uno específico: En mi caso dracula # bat --theme=\u0026#34;Dracula\u0026#34; ~/.config/fish/config.fish Para hacerlo permanete lo ponemos ~/.config/fish/config.fish # set -Ux BAT_THEME Dracula Para saber cual theme esta en el momento # echo $BAT_THEME ","date":"25 marzo 2026","externalUrl":null,"permalink":"/blog/bat-dracula-theme/","section":"Blog","summary":"Puedes ver los temas disponibles con: # bat --list-themes Y probar uno específico: En mi caso dracula # bat --theme=\"Dracula\" ~/.config/fish/config.fish Para hacerlo permanete lo ponemos ~/.config/fish/config.fish # set -Ux BAT_THEME Dracula Para saber cual theme esta en el momento # echo $BAT_THEME","title":"bat - Dracula Theme","type":"blog"},{"content":"Logseq es una aplicación de toma de notas y gestión del conocimiento de código abierto, centrada en la privacidad, que funciona sobre archivos locales de texto plano (Markdown o Org-mode). Destaca por su sistema de enlaces bidireccionales, lo que permite conectar ideas y visualizar relaciones entre notas en forma de grafo.\nInstalar el theme Dracula # Usar los tres puntos he instalar el tema de la tienda. Nada dificil, pero el tema esta imcompleto, varias partes del programa estan mal. Donde ponerlo # ```bash cd ~/Documentos/logseq/logseq/custom.css ``` igual depende de donde tengan su su Logseq.\nEl custom css # :root { --ls-font-family: \u0026#34;Ubuntu\u0026#34;, sans-serif; --ls-font-family-ui: \u0026#34;Ubuntu\u0026#34;, sans-serif; --ls-font-family-code: \u0026#34;JetBrainsMonoNL Nerd Font Mono\u0026#34;, monospace; } .cm-s-default, .CodeMirror, .CodeMirror pre { font-family: \u0026#34;JetBrainsMonoNL Nerd Font Mono\u0026#34;, monospace !important; } /* 2. CONFIGURACIÓN INTEGRAL TEMA DRACULA */ :root, .dark-theme, [data-theme=\u0026#34;dark\u0026#34;] { --ls-primary-background-color: #282a36 !important; /* Centro */ --ls-secondary-background-color: #21222c !important; /* Laterales más oscuros */ --ls-tertiary-background-color: #383a59 !important; --ls-primary-text-color: #f8f8f2 !important; --ls-secondary-text-color: #bd93f9 !important; /* Púrpura Dracula */ --ls-selection-background-color: #44475a !important; --ls-selection-text-color: #ffffff !important; --ls-block-bullet-color: #6272a4 !important; } /* 3. ARREGLO DE BARRAS LATERALES (Izquierda y Derecha) */ #left-sidebar, #left-sidebar .left-sidebar-inner, .left-menu-item, #right-sidebar, .left-sidebar-inner { background-color: #21222c !important; } #left-sidebar .header, #left-sidebar .item-content, #left-sidebar .nav-content-item, #right-sidebar .sidebar-item { color: #f8f8f2 !important; } #left-sidebar .nav-content-item:hover { background-color: #44475a !important; } /* 4. REFUERZO PARA EL EDITOR Y CUERPO CENTRAL */ .cp__sidebar-main-content, #main-content-container { background-color: #282a36 !important; } /* REPARACIÓN DEL TÍTULO (Para que vuelva a ser Púrpura) */ .title, h1.title, .ls-page-title, h1 { color: #bd93f9 !important; /* Aquí devolvemos el morado a \u0026#34;Audio - set up\u0026#34; */ font-weight: bold !important; } .ls-block, .ls-block-properties, .block-content { color: #f8f8f2 !important; } /* Color para los links [[ ]] y tags # */ .page-ref, .ls-tag { color: #8be9fd !important; /* Cyan */ } /* Color para los TODOs */ .todo { color: #ff79c6 !important; /* Rosa */ } /* BOTÓN COPY CODE - ESTILO DRACULA */ .copy-code-button, button[title=\u0026#34;Copy code\u0026#34;] { background-color: #44475a !important; color: #f8f8f2 !important; border: 1px solid #6272a4 !important; border-radius: 4px !important; padding: 4px 8px !important; font-size: 12px !important; transition: all 0.2s ease !important; } .copy-code-button:hover, button[title=\u0026#34;Copy code\u0026#34;]:hover { background-color: #bd93f9 !important; color: #282a36 !important; border-color: #bd93f9 !important; } /* BLOQUES DE CÓDIGO - MEJOR CONTRASTE */ .CodeMirror, pre code { background-color: #21222c !important; color: #f8f8f2 !important; border: 1px solid #44475a !important; border-radius: 4px !important; padding: 8px !important; } cada bloque está explicado\n","date":"25 marzo 2026","externalUrl":null,"permalink":"/blog/logseq-dracula/","section":"Blog","summary":"Logseq es una aplicación de toma de notas y gestión del conocimiento de código abierto, centrada en la privacidad, que funciona sobre archivos locales de texto plano (Markdown o Org-mode). Destaca por su sistema de enlaces bidireccionales, lo que permite conectar ideas y visualizar relaciones entre notas en forma de grafo.\n","title":"Logseq - Dracula theme - arreglo","type":"blog"},{"content":"","date":"25 marzo 2026","externalUrl":null,"permalink":"/tags/markdown/","section":"Tags","summary":"","title":"Markdown","type":"tags"},{"content":"","date":"25 marzo 2026","externalUrl":null,"permalink":"/tags/torrent/","section":"Tags","summary":"","title":"Torrent","type":"tags"},{"content":"TUI para buscar y descargar torrents desde la terminal, powered by Jackett.\nInstalación # paru -S jackett-bin paru -S torrra Configuración de torrra en ~/.config/torrra/config.toml: # [general] download_path = \u0026#34;/home/graplo/Descargas\u0026#34; download_in_external_client = false use_transmission = false transmission_user = \u0026#34;\u0026#34; transmission_pass = \u0026#34;\u0026#34; theme = \u0026#34;dracula\u0026#34; timeout = 10 max_retries = 3 use_cache = true cache_ttl = 300 [indexers] default = \u0026#34;jackett\u0026#34; [indexers.jackett] url = \u0026#34;http://localhost:9117\u0026#34; api_key = \u0026#34;TU_API_KEY\u0026#34; Iniciar Jackett # sudo systemctl start jackett si queremos parar el demonio jackett # sudo systemctl stop jackett Interfaz web de Jackett en http://localhost:9117: # Copiar API key al config.toml Agregar trackers (The Pirate Bay, YTS, etc.) Usar torrra # torrra Alternativa para no escribir toda la palabra torrra # alias rrr=\u0026#34;torrra\u0026#34; funcsave rrr con funcsave es para que se quede el comando permanente.\nCon eso solo se pone rrr en la terminal: # rrr ","date":"25 marzo 2026","externalUrl":null,"permalink":"/blog/torrra-primeros-pasos/","section":"Blog","summary":"TUI para buscar y descargar torrents desde la terminal, powered by Jackett.\nInstalación # paru -S jackett-bin paru -S torrra Configuración de torrra en ~/.config/torrra/config.toml: # [general] download_path = \"/home/graplo/Descargas\" download_in_external_client = false use_transmission = false transmission_user = \"\" transmission_pass = \"\" theme = \"dracula\" timeout = 10 max_retries = 3 use_cache = true cache_ttl = 300 [indexers] default = \"jackett\" [indexers.jackett] url = \"http://localhost:9117\" api_key = \"TU_API_KEY\" Iniciar Jackett # sudo systemctl start jackett si queremos parar el demonio jackett # sudo systemctl stop jackett Interfaz web de Jackett en http://localhost:9117: # Copiar API key al config.toml Agregar trackers (The Pirate Bay, YTS, etc.) Usar torrra # torrra Alternativa para no escribir toda la palabra torrra # alias rrr=\"torrra\" funcsave rrr con funcsave es para que se quede el comando permanente.\n","title":"Torrra - Primeros Pasos","type":"blog"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"Si usás Borg para tus backups, probablemente conocés bien ese comando largo que tenés guardado en algún lado para no olvidarlo:\nborg create --progress --stats \\ /ruta/backup::\u0026#34;home-{now:%Y-%m-%d}\u0026#34; ~/ \\ --exclude ~/.cache/ \\ --exclude ~/.local/share/Trash \\ --exclude ~/.local/share/Steam \\ --exclude ~/Descargas Funciona perfecto, pero escribirlo cada vez es tedioso y fácil de equivocarse. La solución es simple — un script que lo haga por vos.\nEl script # Creá el archivo en ~/.local/bin/borg_backup:\n#!/usr/bin/env bash set -euo pipefail BACKUP_PATH=\u0026#34;/ruta/a/tu/repositorio/borg\u0026#34; now=$(date +\u0026#34;%Y-%m-%d\u0026#34;) borg create --progress --stats \u0026#34;$BACKUP_PATH::home-${now}\u0026#34; \\ --exclude \u0026#34;$HOME/.cache/\u0026#34; \\ --exclude \u0026#34;$HOME/.local/share/Trash\u0026#34; \\ --exclude \u0026#34;$HOME/.local/share/Steam\u0026#34; \\ --exclude \u0026#34;$HOME/Descargas\u0026#34; \\ \u0026#34;$HOME\u0026#34; borg prune --keep-last 7 \u0026#34;$BACKUP_PATH\u0026#34; Hacelo ejecutable:\nchmod +x ~/.local/bin/borg_backup Ahora en vez del comando largo, solo escribís:\nborg_backup Qué hace cada parte # set -euo pipefail hace que el script se detenga inmediatamente si algo falla, en vez de continuar silenciosamente con errores.\nnow=$(date +\u0026quot;%Y-%m-%d\u0026quot;) captura la fecha del día automáticamente — cada backup queda nombrado como home-2026-04-05, home-2026-04-06, etc.\nborg prune --keep-last 7 limpia los backups viejos al terminar, conservando solo los 7 más recientes. Sin esto el repositorio crece indefinidamente.\nVer los backups creados # Para listar todos los backups en el repositorio:\nborg list /ruta/a/tu/repositorio/borg Verás algo así: home-2026-03-30 Sun, 2026-03-30 11:00:00 home-2026-03-31 Mon, 2026-03-31 11:00:00 home-2026-04-01 Tue, 2026-04-01 11:00:00 home-2026-04-05 Sat, 2026-04-05 12:34:17\nSi tenés la variable BACKUP_PATH exportada en tu shell, podés usarla directamente:\nborg list $BACKUP_PATH Por qué $HOME y no ~/ # Dentro de scripts bash, ~/ no siempre se expande correctamente cuando va entre comillas. $HOME es más explícito y fiable — apunta al mismo lugar pero sin ambigüedad.\nEn un próximo post veremos cómo instalar y configurar Borg desde cero para quien recién empieza.\n","externalUrl":null,"permalink":"/projects/borg-script-simple/","section":"Proyectos","summary":"Del comando largo que nunca recordás al script que corre solo. Cómo automatizar tus backups con Borg.","title":"Automatizar backups con Borg desde la terminal","type":"projects"},{"content":"","externalUrl":null,"permalink":"/tags/backup/","section":"Tags","summary":"","title":"Backup","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/bash/","section":"Tags","summary":"","title":"Bash","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/borg/","section":"Tags","summary":"","title":"Borg","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/configuracion/","section":"Tags","summary":"","title":"Configuracion","type":"tags"},{"content":"Usuario de Linux desde hace años, con un recorrido que va de Ubuntu a Fedora hasta CachyOS. No soy desarrollador, pero contribuyo activamente al open source: desde temas visuales hasta mejoras en herramientas que uso a diario.\nEscribo sobre lo que aprendo: configuraciones, herramientas de terminal, flujos de trabajo en Wayland, y todo lo que tenga que ver con hacer Linux más tuyo.\n","externalUrl":null,"permalink":"/author/","section":"Graplo","summary":"Usuario de Linux desde hace años, con un recorrido que va de Ubuntu a Fedora hasta CachyOS. No soy desarrollador, pero contribuyo activamente al open source: desde temas visuales hasta mejoras en herramientas que uso a diario.\n","title":"Graplo","type":"author"},{"content":"Khal soporta personalización de colores en su interfaz TUI (ikhal) mediante una sección [palette] en el config. Lo que descubrí es que el formato completo acepta hasta 5 valores por entrada, lo que permite usar colores hex exactos de Dracula en terminales modernos como Ghostty.\nEl formato completo # La documentación oficial dice:\nkey = foreground, background, mono, foreground_high, background_high Los dos primeros (foreground, background) son para terminales en \u0026ldquo;low color mode\u0026rdquo; — solo soportan los 16 colores ANSI básicos. Los últimos dos (foreground_high, background_high) son para \u0026ldquo;high color mode\u0026rdquo; donde se pueden usar colores hex. El campo mono es para terminales monocromáticos.\nLos colores hex deben ir entre comillas simples: '#bd93f9'. Sin comillas el # se interpreta como comentario y el color se ignora silenciosamente.\nKeys disponibles # Los keys válidos están definidos en khal/ui/colors.py. Los más útiles:\nheader, footer, today, today focus, date header, date header focused, date header selected, dayname, monthname, alert, mark, button, button focused, eventcolumn, eventcolumn focus, reveal focus, popupbg, caption, editbx, edit, edit focus Si no puedes cambiar el color de algún elemento, la documentación recomienda abrir un issue en GitHub — no todos los elementos son temizables desde el config.\nEl color del calendario vs la palette # Hay dos sistemas de color independientes en khal:\ncolor en [[calendario]] — colorea los eventos de ese calendario. Acepta hex directamente sin comillas especiales. Este color se usa también como fondo del panel de detalle en ikhal. [palette] — controla los colores de la interfaz de ikhal (barra de fechas, encabezados, botones, etc.). Acepta los 16 colores ANSI en low color mode y hex en high color mode. Theme Dracula completo # [palette] header = white, black, \u0026#39;\u0026#39;, \u0026#39;#f8f8f2\u0026#39;, \u0026#39;#282a36\u0026#39; footer = white, black, \u0026#39;\u0026#39;, \u0026#39;#f8f8f2\u0026#39;, \u0026#39;#282a36\u0026#39; today = light magenta, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;#f8f8f2\u0026#39;, \u0026#39;#bd93f9\u0026#39; today focus = light magenta, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;#282a36\u0026#39;, \u0026#39;#ff79c6\u0026#39; date header = light gray, black, \u0026#39;\u0026#39;, \u0026#39;#6272a4\u0026#39;, \u0026#39;#282a36\u0026#39; date header focused = black, dark blue, \u0026#39;\u0026#39;, \u0026#39;#282a36\u0026#39;, \u0026#39;#bd93f9\u0026#39; date header selected = light gray, dark gray, \u0026#39;\u0026#39;, \u0026#39;#f8f8f2\u0026#39;, \u0026#39;#44475a\u0026#39; dayname = light cyan, black, \u0026#39;\u0026#39;, \u0026#39;#8be9fd\u0026#39;, \u0026#39;#282a36\u0026#39; monthname = light magenta, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;#bd93f9\u0026#39;, \u0026#39;\u0026#39; alert = white, dark red, \u0026#39;\u0026#39;, \u0026#39;#f8f8f2\u0026#39;, \u0026#39;#ff5555\u0026#39; mark = black, light green, \u0026#39;\u0026#39;, \u0026#39;#282a36\u0026#39;, \u0026#39;#50fa7b\u0026#39; button = black, light cyan, \u0026#39;\u0026#39;, \u0026#39;#282a36\u0026#39;, \u0026#39;#8be9fd\u0026#39; button focused = white, light blue, \u0026#39;\u0026#39;, \u0026#39;#282a36\u0026#39;, \u0026#39;#bd93f9\u0026#39; eventcolumn = light cyan, black, \u0026#39;\u0026#39;, \u0026#39;#8be9fd\u0026#39;, \u0026#39;#282a36\u0026#39; eventcolumn focus = light cyan, dark gray, \u0026#39;\u0026#39;, \u0026#39;#8be9fd\u0026#39;, \u0026#39;#44475a\u0026#39; reveal focus = black, light cyan, \u0026#39;\u0026#39;, \u0026#39;#282a36\u0026#39;, \u0026#39;#8be9fd\u0026#39; popupbg = white, black, \u0026#39;\u0026#39;, \u0026#39;#f8f8f2\u0026#39;, \u0026#39;#282a36\u0026#39; caption = white, black, \u0026#39;\u0026#39;, \u0026#39;#f8f8f2\u0026#39;, \u0026#39;#282a36\u0026#39; editbx = light gray, black, \u0026#39;\u0026#39;, \u0026#39;#f8f8f2\u0026#39;, \u0026#39;#282a36\u0026#39; edit = light gray, black, \u0026#39;\u0026#39;, \u0026#39;#f8f8f2\u0026#39;, \u0026#39;#282a36\u0026#39; edit focus = black, dark blue, \u0026#39;\u0026#39;, \u0026#39;#282a36\u0026#39;, \u0026#39;#bd93f9\u0026#39; Colores de los calendarios # [[personal]] color = \u0026#39;#8be9fd\u0026#39; [[feriados]] color = \u0026#39;#ffb86c\u0026#39; Nota sobre los colores ANSI en Ghostty con Dracula # Los 16 colores ANSI se renderizan diferente según el terminal. En Ghostty con paleta Dracula, dark blue (ANSI 4) aparece como el morado/azul Dracula — no como azul puro. Esto es útil para los campos de low color mode, pero puede sorprender si vienes de otro terminal.\nPara ver cómo se mapean los 16 colores en tu terminal:\nfor i in (seq 0 15); printf \u0026#34;\\033[48;5;%sm %s \\033[0m\\n\u0026#34; $i $i; end ","externalUrl":null,"permalink":"/projects/khal-dracula/","section":"Proyectos","summary":"Theme Dracula para khal con soporte hex","title":"Khal Dracula","type":"projects"},{"content":" Música generada con IA, fotografía callejera, diseño en Inkscape y contribuciones al open source. ","externalUrl":null,"permalink":"/projects/","section":"Proyectos","summary":" Música generada con IA, fotografía callejera, diseño en Inkscape y contribuciones al open source. ","title":"Proyectos","type":"projects"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]