Omarchy: La distro de Arch Linux diseñada para trabajar sin ratón

Hace poco descubrí Omarchy, una distribución basada en Arch Linux que promete una experiencia de escritorio totalmente controlada por teclado. Si, como yo, llevas usando Linux desde tiempos inmemoriables (todavía recuerdo la primera Slackware en el 96) y valoras el pragmatismo por encima de la estética, esta guía te servirá para pasar de Ubuntu a una experiencia hacker real. Aquí te cuento mi experiencia instalándola y configurándola sin usar el ratón.

Dicho y hecho, en este post os voy a ir mostrando los problemas que me he ido encontrando hasta tener una distribución totalmente distinta de la que estoy acostumbrado.

Instalación

Lo primero que hay que hacer es bajarse el iso de omarchy que se puede encontrar en su web: https://omarchy.org/ como podéis ver en la foto hay un enlace directo para ello. Luego solo tenemos que generar un usb autoarrancable. Yo usé ballena etcher, pero podéis hacerlo con cualquier otro como unetbootin o incluso utilizar Ventoy (más recomendable éste último, la verdad) y configurar tu bios para que arranque desde ahí.

El proceso de instalación es sumamente sencillo, todo en modo texto, pero no se nospiden cosas raras. Eso si: IMPORTANTE, omarchy con este instalador requiere un disco completo, no vas a poder instalarlo en una partición por lo que si quieres hacer dual boot vas a necesitar tener un segundo disco físico en tu ordenador.

Primer arranque

Lo primero que se ve es que el gestor de arranque no es grub, es Limine y se instala en el disco el cual hayáis usado para instalarlo por lo que es posible, como me pasó a mi, que tengáis que modificar la BIOS para indicar que el disco de arranque ahora es el nuevo.

Luego se puede encadenar los arranques y dejar que Limine ponga otra entrada para el sistema que tengamos en el otro disco, pero eso es algo que todavía no he hecho y que probablemente termine haciendo en algún momento.

Configuración WiFi

Luego verás que te salen tres avisos en la parte superior, el primero para que configures la wifi (si no estás enchufado a una red, ya que si lo estas el asistente wifi ni aparece). Aquí ya verás el primer contraste grande…. Y es que el administrador de wifi aparece dentro de una terminal y no puedes usar el ratón… Luego verás que esto es normal, pero al principio choca un poco.

Actualización del sistema

Lo siguiente, una vez que tienes red, es actualizar el sistema. De nuevo una aplicación de consola que busca e instala todas las actualizaciones… Y ahora viene lo bueno…

Menú y atajos de teclado

Si pinchamos en el cuadrado de arriba a la izquierda en la barra (o hacemos super-alt-espacio) nos aparecerá el menu de omarchy donde verás estas cosas:

Desde ahí podrás acceder a las aplicaciones ya instaladas (Apps)

Pero lo que recomiendo primero es que uses la opción Learn y de ahí directo a los atajos de teclado que será lo más útil que te encontrarás (casi todo se puede hacer con el teclado sin tocar el ratón).

Otra cosa en la que es muy buena esta distribución es en los temas disponibles, hay muchos ya preconfigurados, pero hay muchos más en, por ejemplo https://omarchythemes.com/ y son bastante sencillos de instalar.

Desde git, por ejemplo

omarchy-theme-install https://github.com/row-huh/omarchy-ghost-pastel-theme

Instalar wireguard fue un poco más complicado, pero al final se consigue que funcione sin ningún interfaz gráfico, cosa que si que voy a echar de menos (pero no demasiado).

El cambio rápido de espacios de trabajo (super+numero) el poder mover cualquier ventana a cualquier espacio (shift+super+numero) el poder moverse entre espacios con super+tab es algo que solo cuando llevas tiempo con ello te das cuenta de lo potente que es y lo que te permite focalizarte en lo que estás haciendo quitando distracciones y ventanas huerfanas o minimizadas que teníamos con otras distribuciones. Por cierto, si quieres poner en Español el sistema tendrás que editar el archivo /etc/locale.conf y poner LANG=es_ES.UTF-8, descomentar en /etc/locale.gen la línea que contiene es_ES.UTF-8 y luego ejecutar sudo locale-gen. Con eso ya solo quedará que vuelvas a iniciar sesión.

Preguntas frecuentes sobre Omarchy

¿Qué es Omarchy?

Omarchy es una distribución Linux basada en Arch Linux que se centra en una experiencia minimalista y eficiente, priorizando el uso del teclado sobre el ratón y utilizando herramientas de terminal para la configuración.

¿Es difícil instalar Omarchy?

La instalación es sumamente sencilla y todo en modo texto, pero es menos interactiva que otras distribuciones. Requiere un disco completo, por lo que no es recomendada para dual boot si no tienes un segundo disco físico.

¿Puedo usar docker en Omarchy?

Sí, Omarchy viene con Docker y Docker Compose de serie, lo cual facilita mucho la vida a desarrolladores y usuarios avanzados.

¿es una distribución para usuarios avanzados?

Sí. Está pensada para usuarios que quieran aprender, personalizar su entorno y evitar el uso del ratón. No es recomendable para alguien que busca «instalar y usar» sin tocar nada.

Instalar una VPN

Una de las cosas que más tengo que hacer es conectar con la VPN de mi oficina o de mi casa (además del nordVPN que te lo puedes instalar directamente de los menús), como la VPN que uso es wireguard, os comento el procedimiento de instalación que usé (y me funciona perfectamente), básicamente lo podéis encontrar aqui: https://github.com/JacobusXIII/omarchy-wireguard-vpn-toggle

sudo yay -S wireguard-tools
sudo cp vpn.conf /etc/wireguard #Copia tus propias conf
curl -fsSL https://raw.githubusercontent.com/JacobusXIII/omarchy-wireguard-vpn-toggle/main/install.sh | bash

Eso te instalará un complemento en la barra superior para activar/desactivar la VPN. Si tienes varias configuraciones con el click derecho podrás elegir cual usar.

En mi caso las siguientes cosas que instalé eran para programar y todas se instalaron sin problemas y con las versiones más actualizadas (visual studio code y opencode entre ellas). Decir que omarchy ya viene con docker y docker compose de serie y con lazydocker para poder controlarlos visualmente, cosa que agradezco inmensamente.

En fin, que iré completando este post según vaya descubriendo más cosas sobre omarchy… Por ahora lo tengo instalado en mi PC de mi oficina e intentaré hacer el trabajo diario con él a ver si me encuentro algún problema importante.

Cómo instalar y usar modelos open-source localmente con Ollama

La inteligencia artificial no tiene por qué depender únicamente de servicios en la nube. Herramientas como Ollama nos permiten ejecutar modelos de lenguaje de código abierto directamente en nuestra máquina, sin enviar datos a terceros y con total control sobre el proceso.

En este artículo veremos cómo instalar Ollama, gestionar modelos y utilizarlos con herramientas de desarrollo como OpenCode y GitHub Copilot.

Sigue leyendo

Escribiendo código con una sola mano

Hace unos días he sufrido un desafortunado accidente que ha terminado con el 5º metatarso de mi mano izqierda fracturado. Eso significa que voy a estar de 3 a 8 semanas sin poder usar mi mano izquierda para nada.

El caso es que nunca pensé que echaría de menos tanto a mi mano izquierda pero, en serio, ahora me siento como menos capaz de hacer las mismas cosas que hacía antes, aunque no interviniese para nada la mano izquierda. Yo siempre he dicho que programar es un oficio de cabeza, no de teclas… Pero no veas cómo ayuda poder escribir rápido lo que estás pensando.

La mano izquierda es solo una herramienta, pero una que nos permite hacer mejor y más rápido lo que ya sabemos hacer… Casi como la IA.

Yo estoy suscrito a github copilot casi desde el principio (antes de que lo abriesen al público ya había hecho mis pruebas), como copiloto que te completa las líneas o que escribe por tí las aburridas funciones que le describes, o incluso que adivina lo siguiente que quieres hacer en el archivo en base a lo que ya has escrito antes, era fantástco, una herramienta de la que no te podías fiar 100% pero que te ahorraba muchas horas de búsquedas y pruebas. Pero es que el otro día probé el modo agente (usando claude sonnet 4) y la cabeza casi me estalla…

Había probado antes firebase studio de google, que intenta hacer un desarrollo completo de aplicación de manera visual y en base a instrucciones que le vas dando a la IA y, realmente, me gustó mucho el concepto, la pena es que solo sirve en ese modo para hacer aplicaciones React y yo necesitaba algo más flexible.. Y lo encontré en el modo agente de github copilot

Modo agente de copilot

Puedes usarlo en cualquier proyecto que ya tengas en visual studio code o puedes empezar uno de cero y con unas pocas instrucciones puedes crear el tipo de proyecto que quieras, tanto de front como de back, en el lenguaje que quieras y con el framework que quieras… Y no, no es vibe coding como tal, es una herramienta más que te sirve para ir dando forma y corrigiendo el proyecto en un entorno controlado por ti.

Y lo más flipante es que te explica lo que va a hacer y las ventajas que te da… Y escribe documentación para acompañar… Y además en tu idioma. Solo por eso ya es una herramienta muy valiosa. Pero, lo que es más, te ayuda a comprender que cuanto más claros y detallados están los requisitos más fácil es que lo que obtengas se parezca a lo que querías (igual a nuestros clientes hay que ponerles a hacer vibe coding para que empiecen a aprender a pedirnos las cosas).

Otra cosa muy interesante es poder seguir el razonamiento para arreglar problemas de una manera natural (en azul lo que le digo yo)

La imagen corresponde a un proyecto todavía en marcha, sin embargo puedo poneros como ejemplo un programa que ha desarrollado 100% github copilot (con mi dirección y correcciones). Tenéis todo el código en el repositorio: https://github.com/yoprogramo/imaphp

Ultimamente me he dedicado mucho a hospedar mis propios servidores, aprovechando que estaba probando proxmox. Uno de los servicios qu quería probar era el de servidor de correo e instalé Stalwart, un sistema muy completo y que, a lo mejor, os explico un día como instalar. Tiene multitud de servicios, no solo el de SMTP, sino IMAP, POP, CalDAV, Antispam, etc… Pero algo que no tiene es un cliente webmail. Me puse a buscar a ver si encontraba alguno que no tuviese dependencias y no me gustó ninguno, así que dije.. ¿Qué carajo? Vamos a escribir uno.

Y me puse manos a la obra, decidí que quería que fuese lo más ligero posible y que pudiese ejecutarse en cualquier sitio (docker incluido) y comencé el proyecto de cero usando el modo agente del copilot.

Para poder probarlo de la manera rápida, montad este docker-compose.yml:

services:
  imap-client:
    image: yoprogramo/imaphp:1.0.0
    ports:
      - "8888:80"
    environment:
      - PHP_DISPLAY_ERRORS=Off
      - PHP_ERROR_REPORTING=E_ERROR
    volumes:
      - ./data:/var/www/html/data
    restart: always

Crea un directorio data y dale los permisos para que todo el mundo pueda escribir y lánza el compose:

docker compose up -d

Ahora simplemente accede a http://localhost:8888 (puedes cambiar el puerto en el compose) y verás que se te invita a dar de alta un servidor

Y luego ya podrás entrar con tu usuario imap

Y, finalmente, acceder a tu correo:

Y con esto un pequeño ejemplo del tipo de cosas que se pueden pedir a las IAs de programación actualmente… Pero esto corre que se las pela, lo bueno es que siempre necesitaras a un humano de verdad que entienda lo que está haciendo y cómo arreglarlo.

Cómo Configurar Login con Office 365 (Microsoft Entra ID) en Authentik

Como ya vimos en la anterior entrada es bastante sencillo instalar un sistema SSO como authentik en nuestra infraestructura. De todas formas, crear un login centralizado no es más que una manera de tener que recordar menos contraseñas, pero el objetivo final es no tener que recordar más que unas pocas para poder acceder a todos los servicios, ¿qué hacemos si ya tenemos cuenta en alguno de los servicios más populares como office 365 o google? Lo suyo sería poder hacer login con estas credenciales en cualquier servicio, sea online o sea auto hospedado. Por suerte, authentik puede hacer uso de estos servicios externos de autenticación de manera «relativamente» sencilla. En este post os voy a explicar paso a paso (que sobre todo la parte a realizar con office es un poco liosa) cómo integrar el login de office 365 con authentik y así poder usarlo para acceder a nuestras aplicaciones (eso ya lo explicaremos en próximos posts).

Para poder realizar este tutorial debes tener:

  • Servidor authentik instalado y configurado (con acceso como administrador)
  • Cuenta de administrador office365 de tu organización
  • Un poco de paciencia (esto nunca viene mal)

Paso 1: registrar una aplicación de microsoft entra

Entramos como administrador en portal.office.com

Pedimos que nos muestre todas las opciones (estos de MS suelen ocultarnos cosas)

Seleccionamos la opción Identidad (nos llevará a entra)

Seleccionamos la opción Registro de aplicaciones

Y seleccionamos Nuevo registro

Y rellenamos los datos básicos (yo voy a llamar authentik a la nueva aplicación)

Hemos elegido que solo se pueda entrar con cuentas de nuestra organización, que será lo normal, aunque si queremos que cualquiera que tenga una cuenta de office365 pueda hacer logn tendremos que escoger una de las otras opciones. Atento a la ui de redirección, en principio tendrá el formato https://<direccion-de-tu-authentik>/source/oauth/callback/<nombre-de-fuente> Si no lo configuras ahora lo podrás hacer después cuando termines la configuración en authentik.

Anotamos los datos que vamos a necesitar de la aplicación y creamos un nuevo secreto:

Es muy importante que copiemos el valor del secreto que lo vamos a necesitar luego

El valor del secreto no se va a poder copiar en otro momento, mejor que lo guardes ahora.

Con esto hemos terminado (en principio) con la configuración necesaria en el portal de office. Lo que hemos hecho, básicamente, es configurar los endpoints de oauth2 que podemos consultar en la opción.

Paso 2: crear un nuevo login social

Las siguientes acciones las haremos como administrador en nuestro servidor authentik

El primer paso es crear un inicio de sesión federado

del tipo azure AD

Ahora deberemos introducir todos los datos que hemos guardado al crear la aplicación en entra:

Los endpoint serán como estos (revisar los que vimos en la pantalla del portal de office):

Cambiaremos la URL del perfil a https://graph.microsoft.com/oidc/userinfo

Y damos a terminar por ahora. Esto nos configura el método para entrar usando las credenciales de Microsoft, pero todavía nos falta un par de cosas para que sea útil del todo.

Paso 3: mapeo de atributos

Ahora necesitamos hacer la equivalencia entre los atributos que vienen de office con los que nosotros vamos a utilizar en nuestro directorio, para eso crearemos una política de expresión:

La llamamos (por ejemplo) azure-ad-mapping y ponemos este contenido:

# save existing prompt data
current_prompt_data = context.get('prompt_data', {})
# make sure we are used in an oauth flow
if 'oauth_userinfo' not in context:
  ak_logger.warning(f"Missing expected oauth_userinfo in context. Context{context}")
  return False
oauth_data = context['oauth_userinfo']
# map fields directly to user left hand are the field names provided by
# the microsoft graph api on the right the user field names as used by authentik
required_fields_map = {
  'name': 'username',
  'email': 'email',
  'given_name': 'name'
}
missing_fields = set(required_fields_map.keys()) - set(oauth_data.keys())
if missing_fields:
  ak_logger.warning(f"Missing expected fields. Missing fields {missing_fields}.")
  return False
for oauth_field, user_field in required_fields_map.items():
  current_prompt_data[user_field] = oauth_data[oauth_field]
# Define fields that should be mapped as extra user attributes
attributes_map = {
  'name': 'upn',
  'sub': 'sn',
  'name': 'name'
}
missing_attributes = set(attributes_map.keys()) - set(oauth_data.keys())
if missing_attributes:
  ak_logger.warning(f"Missing attributes: {missing_attributes}.")
  return False
# again make sure not to overwrite existing data
current_attributes = current_prompt_data.get('attributes', {})
for oauth_field, user_field in attributes_map.items():
  current_attributes[user_field] = oauth_data[oauth_field]
current_prompt_data['attributes'] = current_attributes
context['prompt_data'] = current_prompt_data
return True

Paso 4: configurar el flujo de alistamiento

Queremos que cualquiera que tenga cuenta en el dominio office pueda entrar a nuestras aplicaciones, por lo que necesitamos registrar los usuarios nuevos cuando entran por primera vez, para ello vamos a crear uun flujo nuevo.

Le ponemos un nombre

Y una vez creado, editarlo, ir a la sección d Vinculaciones de Políticas / Grupos / Usuarios y ahí a Bind existing policy

Y ahí ligar defaultsource-enrollment-if-sso

Ir ahora a vinculos de etapa -> Bind Existing stage

Añadir default-source-enrollment-write (orden 0) y default-source-enrollment-login (orden 10)

Desplegar luego la etapa con orden cero y añadir una política existente azur-ad-mapping que creamos antes:

Por último editarmos la fuente que creamos al principio (Directory -> Federation ..) y le añadimos en la configuración de flujo el flujo de inscrpción a azure-ad-enrollment (o el nombre que le hayamos puesto)

Paso 5: hacer que se vea en el login

Pues ya solo nos faltaría hacer que aparezca una opción para hacer login con este proveedor, esto se hace editando el flujo default-authentication-flow

Y editas la etapa

Y añades desde las fuentes disponibles a Fuentes seleccionadas

Ahora cuando entres en tu authentik ya te aparecerá la opción nueva para acceder. La primera vez que accedas debes aprobar unos permisos especiales a Microsoft:

Ha sido un proceso un poco largo, pero ahora ya tenéis centralizada la información de seguridad y cualquier aplicación que pueda conectarse a authentik podrá usar los usuarios de nuestro dominio… Ahora queda que lo probéis vosotros.

El mejor gestor de fotos autohospedado

Durante mucho tiempo he ido guardando las fotos que hacía, primero con varias cámaras digitales, posteriormente con distintos móviles en un directorio (o varios) de mi ordenador (posteriormente de alguno de los NAS que he montado). Preservar las fotos es algo que es muy importante para mi, son recuerdos enlatados que te permiten revivir los buenos (o no tan buenos) momentos del pasado y que sería traumático perder del todo.

El caso es que para poder clasificarlas, al menos por fecha, he estado usando varias opciones, google nos permitía guardar las fotos en una resolución menguante, aunque decía que así eran ilimitadas, hubo un momento en que Amazon ofreció lo mismo, pero se perdió en la bruma del tiempo, flickr y 500px se volvieron de pago y solo eran para fotos públicas. Finalmente termine utilizando el programa shotwell para ubuntu que me permitía importar las fotos nuevas y guardarlas en local… Synology también tenía su propio programa de fotografías pero era… muy malo.

Hasta que finalmente descubrí immich. Este sistema, open source completo, te permite guardar, organizar y gestionar tus fotos y videos fácilmente sin sacrificar privacidad. Te comento aquí los pasos más sencillos para tenerlo funcionando:

Básicamente tienes que tener un host o máquina virtual que tenga, al menos, 4Gb de memoria, un montón de disco duro para guardar todas las imágenes, docker y docker compose instalados.

Luego hay ciertas cosas que podrías querer hacer con IA y para las que podría venir bien tener una tarjeta gráfica… Pero eso es otra historia que no vamos a contar aquí.

Este sería el docker-compose.yml


name: immich

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - '2283:2283'
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false

  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    restart: always
    healthcheck:
      disable: false

  redis:
    container_name: immich_redis
    image: docker.io/valkey/valkey:8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always

  database:
    container_name: immich_postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: '--data-checksums'
    volumes:
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    restart: always

volumes:
  model-cache:

Luego hay que crear un .env con los valores personalizados para nuestra instalación:


UPLOAD_LOCATION=./library
DB_DATA_LOCATION=./postgres
TZ=Europe/Madrid
IMMICH_VERSION=release
DB_PASSWORD=pon-aqui-un-password-para-postgres
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

Obviamente elige el directorio que quieras para la bbdd y de donde vas a guardar las fotos y… Ya estaría.

docker compose up -d

Y ya tendrías una instalación vacía de immich lista para empezar a jugar. Lo primero que tendrás que hacer es crear la primera cuenta del sistema, que será de administración conectando con http://<dir-ip>:2283. A partir de ese momento ya podrás empezar a subir fotos como si no hubiese un mañana… De hecho puedes subir directorios enteros. Eso si, el tratamiento de las fotos tarda un poco porque se dedica a recopilar los datos internos de las fotos y a reconocer caras (para que luego puedas navegar por ellas), pero una vez que ya ha cogido ritmo cada foto subida va más rápido.

¿Qué más?

Es muy recomendable usar la aplicación móvil para sincronizar las fotos del teléfono con immich automáticamente, os dejo las direcciones para Android y iphone:

Cuando arranquéis la app os pedirá que pongáis la dirección de vuestro servidor (si tenéis una ip local solo funcionará dentro de vuestra red) y luego os pedirá que os autentiqueis momento a partir del cual ya podréis hacer copia de seguridad de los albumes que queráis de vuestro móvil (yo solo subo los de la cámara, whatsapp y demás no son demasiado «preservables»).

Y con esto ya estaría todo (salvo que queráis poner un proxy inverso para acceder desde fuera de vuestra red o un tunel de cloudflare o similar)… Eso si, reservad disco suficiente porque vais a necesitarlo…