# Distribuí un programa entero como un solo binario con synsema build

> Motor, programa, módulos, plantillas y assets en un único ejecutable sellado, con un techo de capacidades horneado adentro. Nada que instalar en el destino — desplegalo desde FROM scratch, o pasáselo a alguien como un archivo.

Published 2026-09-02 · https://synsema.org/es/blog/ship-one-binary-synsema-build


Distribuir un script es distribuir un runtime: el Python correcto, el Node correcto, los paquetes, el
entorno. `synsema build` saca el runtime de la ecuación. La salida es un archivo que contiene el
intérprete y tu programa, sellado con un checksum.

## Un comando

```sh
synsema build agent.syn -o agent                      # this platform
synsema build agent.syn -o agent --include data/       # bundle assets (dirs, one-level globs)
synsema build agent.syn -o agent --cap-set "stdout,net=api.example.com"   # bake a ceiling
synsema build agent.syn -o agent-linux --engine-binary ./synsema-linux-x86_64  # cross, with a donor engine
```

El binario ejecuta tu programa: su argv es `args()`, las plantillas que renderiza y los archivos que
incluiste se leen del bundle sin ninguna capacidad `file` (son parte del programa), y escribir sobre
una ruta del bundle se rechaza. Pesa 30–60 MB, como cualquier binario estático — a nadie le pesa el
CLI de Docker.

## El techo viaja con él

`--cap-set` y `--profile pure` quedan horneados y no se pueden levantar desde adentro. Si le pasás a
alguien un binario construido con `--cap-set "stdout,net=api.example.com"`, eso es todo lo que va a
poder tocar, diga lo que diga el código. `--profile pure` saca por completo el sistema de archivos,
los procesos, las bases de datos y los sockets. Un bundle adulterado se niega a correr.

## Desplegalo desde la nada

```dockerfile
FROM scratch
COPY agent /agent
ENTRYPOINT ["/agent"]
```

Sin imagen base, sin gestor de paquetes, sin shell en el contenedor. El motor sigue estando a mano
cuando lo necesitás — `agent --engine version`, `agent --engine run other.syn` — pero
`--engine update` se rechaza: un programa construido se reconstruye, no se parcha en el lugar.

## Servidores y apps de escritorio también

Agentes, jobs, CLIs, herramientas que le das a un equipo — y, desde 0.6.16, servidores:
`synsema build app.syn -o app --serve --bind 0.0.0.0 --port 8080` hornea el runtime del servidor y
las banderas de despliegue, y los montajes estáticos del bloque `serve` viajan dentro del archivo,
así que un sitio entero o una [app instalable](/es/blog/installable-app-pwa-native-push) es un solo
ejecutable. Desde 0.6.18 el mismo comando hace apps de escritorio: `--no-console` y `--icon` te dan
un `.exe` con tu ícono que abre en una ventana de app del navegador, y `--bundle` un `.app` de macOS
o una carpeta lanzadora de Linux — mirá [Distribuí tu app web como app de escritorio](/es/blog/desktop-app-one-binary-browser-window).

**Probalo:** [instalá Synsema](/es/install) y después `synsema build hello.syn -o hello && ./hello`.
La referencia del CLI, incluidos los artefactos WebAssembly para navegadores y TEEs, está en la
[documentación](https://synsema.dev/es/0.6.x/70-cli).

