Código abierto — licencia MIT

Un solo comando. Cualquier paquete. Cualquier distro.

Zero Layer es un gestor de paquetes universal para Linux. Instala software de 13 ecosistemas distintos en cualquier distribución traduciendo los binarios al instalar, no al ejecutar.

curl -Lo zl https://github.com/polpo21/zero_layer/releases/latest/download/zl-x86_64-unknown-linux-gnu

Un único binario. Sin runtime, sin demonio, sin dependencias.

Toma los paquetes de
  • pacman
  • AUR
  • apt
  • dnf
  • zypper
  • apk
  • xbps
  • portage
  • nix
  • flatpak
  • snap
  • AppImage
  • GitHub
fuentes de paquetes
13
sobrecarga en ejecución
0ms
pruebas, CI en verde
357
demonios en segundo plano
0

El problema

El empaquetado en Linux está fragmentado por diseño

Cada distribución trae su propio formato, sus repositorios y su idea de dónde deben ir los archivos. El software que quieres suele estar empaquetado, pero no para tu sistema.

El paquete existe, pero no para ti

Una herramienta está en el AUR, o solo como .deb, o solo como release de GitHub. Tu distro la empaquetó hace dos años, o nunca. Acabas compilando a mano o quedándote sin ella.

Los apaños cuestan rendimiento

Contenedores, máquinas virtuales y capas de compatibilidad resuelven esto añadiendo una capa. Y la pagas para siempre: latencia de arranque, memoria, disco y un runtime que debe seguir ejecutándose.

Las instalaciones manuales se pudren en silencio

Soltar un tarball en /opt funciona hasta que una biblioteca se mueve. Nada registra los archivos, nada conoce las dependencias y nada puede deshacerlo limpiamente.

La idea

Traducir una vez, al instalar

Un binario de Linux no está atado a una distribución: está atado a unos pocos hechos concretos, es decir, qué enlazador dinámico lo carga y dónde viven sus bibliotecas compartidas. Ambos están escritos dentro del archivo ELF y ambos se pueden reescribir.

Zero Layer lee esos campos con goblin y los reescribe con elb para que apunten al enlazador y a las rutas reales de tu sistema. Lo hace una sola vez, durante la instalación.

A partir de ahí el binario es sencillamente un binario nativo en tu máquina. Sin shim, sin script envoltorio, sin sandbox y sin proceso supervisor. De ahí el nombre: la capa es cero.

  • Ningún runtime de contenedores que instalar o mantener activo
  • Ninguna penalización de rendimiento: es el mismo código máquina
  • Los archivos acaban en directorios normales que puedes inspeccionar
  • Todo queda registrado y cada instalación se puede revertir
/usr/bin/rgELF 64-bit LSB · x86-64

compilado para Arch

PT_INTERP
/usr/lib/ld-linux-x86-64.so.2
RUNPATH
—
NEEDED
libpcre2-8.so.0 · libc.so.6

adaptado a esta máquina

PT_INTERP
/lib64/ld-linux-x86-64.so.2
RUNPATH
$ORIGIN/../lib:~/.local/share/zl/lib
NEEDED
libpcre2-8.so.0 · libc.so.6

El mismo código máquina. Solo sabe dónde vive ahora.

Filosofía

Seis principios detrás de cada decisión

Zero Layer tiene criterio propio. Estas son las reglas a las que se somete el código.

Cero sobrecarga tras instalar

Todo el trabajo de traducción ocurre una sola vez, durante la instalación. Después no queda nada entre tu programa y el kernel.

Detectar, nunca suponer

Arquitectura, enlazador dinámico, libc, directorios de bibliotecas y estructura del sistema de archivos se sondean del sistema en ejecución en lugar de fijarse en el código.

Atómico o nada

Cada instalación se ejecuta dentro de una transacción que registra lo que tocó. Un fallo en cualquier punto revierte la operación entera.

Un binario, sin bibliotecas del sistema

redb en lugar de SQLite, elb en lugar de patchelf, rustls en lugar de OpenSSL. Escrito en Rust; las pocas piezas nativas (compresión, criptografía) van compiladas dentro, así que no hay nada más que instalar.

La fuente la eliges tú

Cuando un paquete existe en varios ecosistemas, Zero Layer los muestra todos y te deja elegir. Nunca decide por ti en silencio.

Reversible por defecto

Historial, reversión, detección de huérfanos y simulación son funciones centrales, no añadidos. Siempre puedes ver qué pasó y deshacerlo.

Cómo funciona

Qué ocurre cuando escribes install

Entre tu comando y un binario funcionando hay ocho etapas. Cada una es observable con -v y cualquier fallo lo revierte todo.

  1. Resolución

    Encuentra el paquete y recorre recursivamente su árbol de dependencias detectando ciclos. Si falta una dependencia en la fuente principal, se consultan todas las demás activas y eliges tú.

    resolución entre fuentes
  2. Comprobación de conflictos

    Se revisan cinco categorías antes de escribir nada: propiedad de archivos, nombres de binarios, sonames de bibliotecas, conflictos declarados y restricciones de versión.

    5 tipos de conflicto
  3. Descarga

    Los paquetes se obtienen directamente de sus repositorios nativos en cuatro hilos paralelos, con barras de progreso y reintentos automáticos con espera creciente.

    4 hilos · reintentos
  4. Verificación

    Se exigen sumas SHA256 y se comprueban las firmas GPG cuando la fuente las proporciona. Una firma no verificable se informa de forma distinta a una incorrecta.

    SHA256 + GPG
  5. Extracción

    El formato del archivo se detecta y se descomprime — deb, rpm, tar, zst, xz, nar, squashfs, zip o AppImage — y luego se normaliza a una estructura FHS estándar.

    9 formatos de archivo
  6. Parcheo

    Cada binario ELF se analiza y después se reescriben su intérprete y su RUNPATH para tu sistema. Los paquetes con varios binarios se parchean en paralelo; los estáticos se dejan intactos, como corresponde.

    goblin + elb
  7. Instalación

    Los archivos se colocan de forma atómica dentro de una transacción que anota cada archivo, directorio, enlace y fila de base de datos que crea. Cualquier error lo deshace todo.

    atómico · reversión
  8. Registro

    Archivos, dependencias, propiedad y la propia operación se escriben en una base de datos embebida: es lo que después hace posibles why, size, doctor y rollback.

    redb + grafo

Capacidades

Un gestor de paquetes completo, no una demo

Todo lo que esperas de las herramientas de tu distro, más lo que nunca tuvieron.

Traducción nativa de binarios

Los binarios ELF se analizan con goblin y se parchean con elb al instalar. El enlazador dinámico y el RUNPATH se reescriben para tu sistema, así que después los paquetes corren a plena velocidad nativa.

  • goblin
  • elb
  • PT_INTERP
  • RUNPATH

13 fuentes en paralelo

Todas las fuentes activas se consultan a la vez, los resultados se puntúan por relevancia y las variantes binarias del AUR se detectan automáticamente.

Transacciones atómicas

Una instalación se completa o no deja rastro. Nunca queda un estado a medio escribir.

Diagnóstico incorporado

doctor, audit, why, size, diff e history responden las preguntas que los gestores de paquetes suelen dejar en el aire.

  • zl doctor
  • zl why
  • zl size
  • zl audit
  • zl diff

Multiversión y entornos

Instala versiones en paralelo y cambia entre ellas, o levanta un entorno efímero que desaparece al salir del shell.

Consciente de la seguridad

Sumas y firmas a la entrada, consulta de CVE en OSV.dev a la salida, y anclaje para congelar lo que no quieras que se mueva.

Fuentes

Trece ecosistemas, una sola interfaz

Cada fuente es un plugin que implementa el mismo trait. Activa las que quieras en cada máquina o filtra por comando con --from.

  • pacmanArch Linux
  • aurArch User Repository
  • aptDebian · Ubuntu
  • dnfFedora · RHEL
  • zypperopenSUSE · SLES
  • apkAlpine Linux
  • xbpsVoid Linux
  • portageGentoo binhost
  • nixnixpkgs
  • flatpakFlathub
  • snapSnapcraft Store
  • appimageAppImageHub
  • githubGitHub Releases
  • Ver el estado de los plugins

La disponibilidad de una fuente depende de que el upstream sea accesible. El repositorio registra el estado real de cada plugin.

Comandos

La interfaz, de principio a fin

Un binario, veinticinco comandos, autocompletado para bash, zsh y fish.

$ zl install firefox                 # pick from every source
$ zl install firefox --from pacman   # force one source
$ zl install sharkdp/bat --from github
$ zl install python --version 3.12  # side by side
$ zl remove firefox --cascade       # drop orphaned deps
$ zl --dry-run install firefox     # preview only
$ zl run neofetch                   # run without installing

Bajo el capó

Hecho para ser aburrido donde importa

Estructura predecible en disco, un código en Rust con el mínimo imprescindible de código nativo y una batería de pruebas que corre en cada push.

Dónde acaba cada cosa

Todo vive bajo un único directorio que es tuyo. Añade bin al PATH y no se toca nada más del sistema.

Restricciones de diseño

  • Binario único, sin bibliotecas del sistema que instalar
  • RUNPATH en vez de RPATH, para que LD_LIBRARY_PATH siga funcionando
  • Hilos en lugar de un runtime asíncrono
  • Todo se detecta del sistema en ejecución
  • La reversión es un camino de primera clase, no un caso de error
  • Cero avisos de clippy, formateado, protegido por CI
~/.local/share/zl/
├── bin/        symlinks — add to PATH
├── lib/        shared libraries
├── share/      data files
├── etc/        configuration
├── packages/   one dir per name-version
├── cache/      downloads
├── envs/       ephemeral environments
└── zl.redb     package database

El stack

  • Rust 2024
  • goblin
  • elb
  • redb
  • petgraph
  • clap
  • reqwest + rustls
  • indicatif
  • quick-xml
  • sha2
  • zstd
  • tar
  • cpio

Comparación

En qué se diferencia de las alternativas

Los contenedores y los formatos universales resuelven el mismo problema aislando el software. Zero Layer lo resuelve adaptándolo.

Tool Enfoque Coste en ejecución Coste en disco Requiere demonio
Zero Layer Parchea binarios al instalar Ninguno Bibliotecas compartidas, deduplicadas No
Docker / Podman Imagen completa del SO por app Sobrecarga de proceso y espacios de nombres Capas de imagen por app Sí
Flatpak Runtimes incluidos Sandbox e indirección de portales Un runtime por familia de apps Sí
Snap Squashfs y confinamiento Capa de montaje y confinamiento Imagen comprimida por app Sí
Tarball manual Descomprimir y confiar Ninguno Lo que hayas copiado No

La instalación manual empata con Zero Layer en sobrecarga y pierde en todo lo demás: nada queda registrado, nada resuelve dependencias y nada puede deshacerlo.

Primeros pasos

Funcionando en menos de un minuto

Una descarga y una línea en el perfil de tu shell. No hace falta un gestor de paquetes para instalar el gestor de paquetes.

La v0.3.1 ya está publicada, con binarios precompilados para x86_64 y aarch64, glibc y musl. Todo lo descrito en esta página va incluido: no hace falta compilar nada. Notas de la versión →

  1. Instala el binario

    Descarga la última versión para tu arquitectura. Usa la segunda forma si prefieres no usar sudo.

    $ curl -Lo zl https://github.com/polpo21/zero_layer/releases/latest/download/zl-x86_64-unknown-linux-gnu
    $ chmod +x zl && sudo mv zl /usr/local/bin/
    
    # or, without sudo:
    $ mkdir -p ~/.local/bin && mv zl ~/.local/bin/
    
    # other builds: zl-x86_64-unknown-linux-musl,
    # zl-aarch64-unknown-linux-gnu, zl-aarch64-unknown-linux-musl
  2. Añádelo al PATH

    Zero Layer enlaza los ejecutables que instala en su propio directorio bin.

    # bash (~/.bashrc) or zsh (~/.zshrc)
    export PATH="$HOME/.local/share/zl/bin:$PATH"
    
    # fish
    fish_add_path ~/.local/share/zl/bin
  3. Instala algo

    Omite --from y Zero Layer buscará en todas las fuentes activas para que elijas.

    $ zl install ripgrep
    $ zl install sharkdp/bat --from github
    $ zl doctor                # confirm everything is healthy

¿Prefieres compilarlo tú? Necesitas Rust 1.90 o superior. cargo build --release →

FAQ

Preguntas razonables

¿Sustituye al gestor de paquetes de mi distribución?
No, ni lo pretende. Zero Layer instala en tu carpeta personal y nunca toca rutas del sistema, así que pacman, apt o dnf siguen gestionando el sistema base igual que antes. Úsalo para el software que tu distro no empaqueta.
¿Necesito root?
No. La instalación por defecto vive por completo bajo ~/.local/share/zl. Root solo entra en juego si decides poner el binario zl en /usr/local/bin, y eso es opcional.
¿De verdad no hay sobrecarga?
Sí, porque tras la instalación no queda nada ejecutándose. El binario parcheado es código máquina normal que ejecuta directamente el kernel: sin sandbox, sin supervisor, sin traducción en ejecución. El trabajo se hace una vez, al instalar.
¿Y si un paquete necesita una biblioteca que no tengo?
Las dependencias se resuelven de forma recursiva antes de descargar nada y, si falta alguna en la fuente principal, se buscan en todas las demás activas. Tras instalar, una comprobación final avisa de cualquier biblioteca compartida que siga sin localizarse.
¿Qué pasa si una instalación falla a medias?
No queda nada. Cada instalación corre dentro de una transacción que registra los archivos, directorios, enlaces y entradas de base de datos creados, y cualquier fallo los deshace todos. También puedes previsualizar cualquier operación con --dry-run.
¿Qué distribuciones soporta?
En principio todas. En lugar de mantener una lista, Zero Layer detecta en tiempo de ejecución la arquitectura, el enlazador dinámico, la libc, los directorios de bibliotecas y la estructura del sistema de archivos, incluidas merged-usr, NixOS, Guix, GoboLinux y Termux.
¿Está listo para producción?
Es software joven en desarrollo activo, y lo dice con franqueza: el repositorio registra qué plugins están verificados contra sus upstreams reales y cuáles siguen en reparación. La ruta principal de instalación está cubierta por 357 pruebas que condicionan cada commit.
¿Cómo lo desinstalo?
Borra el directorio. Todo lo que Zero Layer instala — paquetes, base de datos, caché, enlaces — vive en una sola carpeta, así que eliminarla borra cualquier rastro.

Instala lo que sea, donde sea

Gratuito y de código abierto con licencia MIT. Sin cuenta, sin telemetría, sin demonio.