jumphp2installer: un instalador para tu software
jumphp2installer crea instaladores nativos de verdad para Windows, macOS y Linux, para tu juego, tu app JumPHP o cualquier software. Escribes un pequeño script YAML legible, y tus usuarios descargan un solo archivo. Les muestra un asistente (bienvenida, licencia, carpeta, opciones), instala siempre la última versión y añade un desinstalador. Es libre y de código abierto: github.com/davidnurdin/jumphp2installer.





Qué hace
- Un archivo por sistema:
Mi-App-setup.exe(Windows 10 y 11),Mi-App-setup-macos.zip(Mac Apple silicon e Intel),Mi-App-setup-linux-x86_64. No hay que instalar nada antes. - Siempre la última versión: el instalador lee tu script al arrancar. Un instalador descargado hace un año instala, por tanto, la versión de hoy.
- Un asistente con tus colores: tu nombre, tu icono, tu imagen lateral, tu color, tu licencia y tus textos. En inglés o en francés, según el idioma del ordenador.
- Los pasos habituales: descargar (con comprobación SHA-256), descomprimir (
.zip,.tar.gz), copiar, escribir un archivo, hacer ejecutable, lanzar un comando, crear accesos directos (escritorio, menú). - Un desinstalador de verdad: aparece en «Aplicaciones» de Windows y en el menú de Linux. Quita exactamente lo que creó la instalación, y nada más.
- Sin derechos de administrador: todo se instala para el usuario, en su propia carpeta de programas.
- También por línea de comandos:
--silentinstala sin ventana (despliegues, scripts, CI).
El script de instalación
Un archivo install.yaml dice lo que el instalador muestra (pages) y lo que hace (steps). El mismo
script sirve en los tres sistemas: las variables ({folder}, {platform}, {exe}…) y la clave os: se ocupan de
las diferencias.
app:
name: Mi App
publisher: Yo
website: https://ejemplo.es
icon: icon.png
banner: banner.png # la imagen a la izquierda del asistente (172 x 420)
accent: "#2f6fed"
version:
github: yo/mi-app # la última release de GitHub da {version}
pages:
- welcome
- license: LICENSE.txt
- folder: "{programs}/{app}"
- options:
desktop: Un acceso directo en el escritorio
- install
- finish: {run: "{folder}/mi-app{exe}"}
steps:
- download: https://github.com/yo/mi-app/releases/download/v{version}/mi-app-{platform}.zip
- extract: {strip: 1}
- executable: "{folder}/mi-app"
os: [linux, macos]
- shortcut: {target: "{folder}/mi-app{exe}", where: desktop}
if: desktop
- uninstaller
Las páginas
| Página | Lo que muestra |
|---|---|
welcome |
un texto de bienvenida (por defecto: «Bienvenido a la instalación de {app} {version}») |
license |
un archivo del paquete, que hay que aceptar para continuar |
folder |
la carpeta, con «Examinar…», el espacio necesario y el libre; avisa si la carpeta ya se usa |
options |
casillas, reutilizadas por los pasos (if: desktop) |
install |
la barra de progreso y el detalle |
finish |
el final, con una casilla «Iniciar {app}» (run, que puede cambiar según el sistema) |
Los pasos
| Paso | |
|---|---|
download |
una dirección, o un archivo del paquete; sha256 lo detiene todo si el archivo no es el correcto |
extract |
descomprime en {folder}; strip: 1 quita la carpeta raíz del archivo comprimido |
copy, mkdir, write, delete |
archivos y carpetas (delete solo toca la carpeta de instalación, la del usuario y la temporal) |
executable |
hace ejecutable un archivo (Linux, macOS) |
shortcut |
desktop, menu o both: .lnk en Windows, .desktop en Linux, un enlace en macOS |
run |
lanza un comando en la carpeta |
uninstaller |
instala el desinstalador y lo registra en el sistema |
Cada paso acepta if: (una opción marcada, o "!opción"), os: (windows, macos, linux) y label:.
La versión
| Escritura | {version} |
|---|---|
version: 1.4.0 |
fija |
version: {github: yo/mi-app} |
la última release del repositorio (su tag, sin la v) |
version: {latest: https://…/latest.json} |
lo que responde la dirección: {"version": "1.4.0"} o texto |
Las variables
| Variable | Windows | Linux | macOS |
|---|---|---|---|
{programs} |
%LOCALAPPDATA%\Programs |
~/.local/opt |
~/Applications |
{desktop}, {menu} |
escritorio, menú Inicio | escritorio, ~/.local/share/applications |
~/Desktop |
{platform} |
windows-x86_64 |
linux-x86_64 |
macos-arm64 / macos-x86_64 |
{exe} |
.exe |
(vacío) | (vacío) |
{folder}, {app}, {version}, {home}, {temp}, {os}, {arch}, {download} |
La referencia completa está en docs/installer/script.md.
Tres formas de publicarlo
1. En jumphp.net, sin instalar nada
En el estudio, «Nuevo instalador» abre un editor:
- el script YAML se comprueba mientras escribes (cada error con su línea);
- una vista previa del asistente se actualiza al lado;
- subes las imágenes, la licencia y los archivos pequeños del paquete.
Al publicarlo, el instalador recibe su página de descarga y sus tres enlaces, uno por sistema. Mientras no esté publicado, solo tú puedes probarlo.
2. En las releases de GitHub, sin servidor
El paquete (install.yaml y sus archivos) y sus instaladores se adjuntan a cada release de tu repositorio. Los
instaladores leen la última release, así que no hay nada que cambiar de una versión a otra. Un workflow lo hace
en cada release:
# .github/workflows/installer.yml
on:
release:
types: [published]
jobs:
installer:
uses: davidnurdin/jumphp2installer/.github/workflows/package.yml@main
with:
folder: installer # install.yaml y sus archivos
permissions:
contents: write
También puedes hacerlo a mano, desde un clon de jumphp2installer:
tools/github-release.sh yo/mi-app installer. Tus enlaces:
https://github.com/yo/mi-app/releases/latest/download/Mi-App-setup.exe.
Si tu repositorio publica varios productos (tags v* para uno, ide-v* para otro), la «última release» puede
ser del otro producto. En ese caso, sirve el paquete desde los archivos del repositorio
(https://raw.githubusercontent.com/…/installer/), con un version.json al lado. Es lo que hace
JumPHP IDE.
3. En tu propio servidor
El servidor de jumphp2installer es una app Symfony + MariaDB, en Docker (server/ del repositorio): cuentas,
editor, vista previa, páginas de descarga y estadísticas. Basta un docker compose up -d para arrancarlo. Una
simple página web estática también puede servir de servidor (una carpeta con install.yaml y sus archivos):
php tools/package-release.php mi-paquete/ https://mi-sitio.es/instalador/ bases/ salida/
Para un juego o una app JumPHP
bin/jumphp app:export mi-app --windows --macos (o export:standalone para un juego) produce un ejecutable por
sistema. Adjúntalos a una release y usa
el ejemplo jumphp-app.yaml.
Tu Claude sabe hacerlo: pídele «haz un instalador de mi juego» (el repositorio incluye un skill jumphp2installer).
Por línea de comandos
Mi-App-setup-linux-x86_64 --silent --folder=/opt/mi-app --no-option=desktop
Mi-App-setup.exe --silent
"C:\…\Mi App\uninstall.exe" --uninstall --silent
jumphp2installer-linux-x86_64 --check --script=install.yaml # comprobar un script
jumphp2installer-linux-x86_64 --script=install.yaml # probar el asistente con un script local
jumphp2installer-linux-x86_64 --make=Mi-App-setup.exe --server=github:yo/mi-app --from=jumphp2installer-windows-x86_64.exe
Cómo funciona
El instalador es a su vez una app JumPHP: una página HTML para el asistente, PHP para el trabajo y el PHP autónomo de StaticPHP. La dirección del paquete se escribe en el php.ini integrado del ejecutable, con un tamaño constante. Así, un servidor puede crear un instalador por paquete en una fracción de segundo, sin compilar nada. Las descargas y la extracción avanzan un poco en cada fotograma: la ventana nunca se congela. Antes de cada versión, GitHub Actions prueba el instalador de verdad en Linux, Windows y dos Mac (Apple silicon e Intel): instalación, accesos directos, entrada de desinstalación y después desinstalación.
Límites
- Los instaladores no están firmados: Windows SmartScreen y macOS Gatekeeper avisan la primera vez (en Mac: clic derecho › Abrir).
- Instalación solo para el usuario (sin Program Files, servicios ni asociaciones de archivos).
- Sin Linux ARM ni teléfonos.
- En Windows, hay que iniciarlo por su ruta larga, nunca por un nombre corto 8.3 (
C:\Users\RUNNER~1\…).