El outputType clásico sigue aceptando tres valores: apk, aab y both. Encima está outputs, una lista (también acepta texto con comas) que manda sobre él: apk, aab, xapk, apks, ipa, exe, msi, dmg, appimage. El workflow tiene un paso por formato condicionado a la lista, así que sólo corre el que pediste, y el campo platform (android, ios o both) decide si se lanzan los jobs de Android, los de iOS o los dos. Cuando platform es ios o both, el package.json del ZIP incluye @capacitor/ios para que el paso npx cap add ios no falle con "Could not find the ios platform". El campo GET /api/v1/build/:id devuelve outputs y formats, el segundo con lo que el artefacto confirma que existe de verdad.
Cada formato tiene su ruta en GET /api/download/:id/:fmt; sin sufijo se asume APK.
- APK —
GET /api/download/:id(o.../apk). Instalable directamente en un dispositivo. Con providerflutterlo compone el jobflutter-build; con providercordovael jobcordova-build; no el de Capacitor. - AAB —
GET /api/download/:id/aab. Lo que sube Play Console. Sólo aparece si lo pediste enoutputs. Con providerfluttersale del jobflutter-build; concordovase intenta con--packageType=bundle(si la versión de cordova-android no lo soporta en debug, el paso no bloquea y no hay AAB). - XAPK —
GET /api/download/:id/xapk. APK base másAndroidManifest.jsoncon paquete, versión y permisos. Sólo si pedistexapk. - APKS —
GET /api/download/:id/apks. Bundletool en modo universal, generado desde el AAB. Sólo si pedisteapks. - IPA —
GET /api/download/:id/ipa. Sólo existe si el build corrió enmacos-latestcon.p12,.mobileprovisiony contraseña enviados en el paso de firma iOS. Si no, no hay artefacto y el endpoint devuelve error. - EXE y MSI —
GET /api/download/:id/exey.../msi. EXE de Electron: job dewindows-latestconelectron-builder, sólo corre si pediste ese formato y el ZIP traedesktop/. EXE de Tauri: si el provider estauri, el jobtauri-buildsube el binario de Cargo con el artefacto-exeaunque no pidas formato de escritorio. MSI: sólo de Electron. - DMG —
GET /api/download/:id/dmg. Job demacos-latest, mismas condiciones que el EXE. - AppImage —
GET /api/download/:id/appimage. Job deubuntu-latest, mismas condiciones.
Un formato que no esté en la lista de arriba devuelve 404 con los formatos soportados. Los artefactos viven en GitHub Actions y caducan a los 30 minutos; el servidor los borra también en su limpieza automática. El historial (GET /api/history) conserva el enlace mientras dure la entrada local.
Además, el ZIP del proyecto está disponible sin compilar con POST /api/project, y con cualquier configuración: incluye build-config.json, main-manifest.xml, el código Java generado, los scripts de patch y el workflow.
- Desktop — si activas
desktopEnabledo pidesexe,msi,dmgoappimageenoutputs(el motor autoactivadesktopEnableden ese caso), aparecedesktop/con un proyecto Electron (package.json,main.js, README) y el selector "Desktop .EXE/.APP" del estudio escribe esa carpeta. Para que salga un binario hay que pedirexe,msi,dmgoappimageenoutputs: entonces el workflow lanzaelectron-builderen Windows, macOS o Linux según el formato.desktopPlatform(win,mac,both) se valida, se guarda enbuild-config.jsony lo usa el generador dedesktop/package.jsonpara fijar los targets deelectron-builder. - TWA —
twa-manifest.json,assetlinks.jsony un README con el comando de bubblewrap. La Trusted Web Activity real se construye fuera, con tus herramientas. react-nativeeionic— no generan nada más allá deprovider.json; el APK que sale es el de Capacitor.
-
Flutter (
provider: flutter) — el jobflutter-buildenubuntu-latestejecutaflutter createpara generar el host Android, encima coloca tu manifiesto, corrigeapplicationId/namespacea tu paquete, mueveMainActivity.kty compila conflutter build apk --release(másappbundlesi pedisteaab). Artefactos:-apky opcional-aab. El jobcompilede Capacitor se salta con este provider, así que no hay doble APK. -
Tauri (
provider: tauri) — el jobtauri-buildenwindows-latestcorrecargo build --release --manifest-path tauri/src-tauri/Cargo.tomly sube el binario como artefacto-exe. El proyecto Electron (desktop/) queda fuera con este provider para no pisarse el nombre de artefacto, y el APK Android lo sigue poniendo el jobcompile(sigue siendo Capacitor por debajo). -
Cordova (
provider: cordova) — el jobcordova-buildenubuntu-latestcorrecordova platform add androidsobre tuconfig.xmlreal, inyecta los permisos demain-manifest.xmlen el manifiesto de Cordova, copia el icono a losmipmap-*y ejecutacordova build android(artefacto-apkdebug;-aabopcional concontinue-on-error;-release-apksi subiste keystore, víabuild.json). El jobcompilede Capacitor se salta con este provider: el APK es de Cordova puro.
El workflow recibe el provider como input (provider), que el servidor manda en el workflow_dispatch junto a id, platform y outputs.
Con pwaEnabled activado (viene activado por defecto) el ZIP incluye www/manifest.webmanifest con nombre, colores e icono, y www/sw.js con caché offline y fallback a index.html. El registro del service worker y la etiqueta manifest se inyectan en tu index.html si no estaban.
No necesitas alojar nada en InteeBuild para esto: sube la carpeta www/ a tu hosting y la web queda instalable como PWA por sí sola. Desactívalo con pwaEnabled: false si tu sitio ya trae su propio manifest.
POST /api/listing devuelve texto listo para pegar en Play Console, generado con reglas locales y sin servicios externos:
curl -X POST /api/listing -H "Content-Type: application/json" \
-d '{"appName":"Mi Radio","url":"https://mi-radio.com","packageName":"com.miempresa.radio","permissions":{"foreground":true}}'La respuesta trae title (recortado a 30 caracteres), shortDescription (80), fullDescription (hasta 4000, con las características derivadas de tus permisos y flags de UI), keywords (100), category (Herramientas), packageName y version. Es un borrador: conviene reescribirlo antes de publicar.
También están POST /api/security-audit (puntuación textual con incidencias GDPR y de permisos) y GET /api/privacy-policy?appName=&package= (política genérica rellenada con tus datos).
GET /api/qr/:id devuelve una imagen PNG con el QR del enlace de descarga. La imagen la genera un servicio externo (api.qrserver.com); si no responde en 8 segundos, el endpoint devuelve 502 con el enlace de descarga en texto para que puedas mostrarlo tú.
La opción minify (o minify: true en la API) quita comentarios HTML y espacios sobrantes del código que se inyecta. No toca tu JavaScript y no es un minificador de producción: sirve para que el HTML embebido pese menos.
No hay build de iOS sin certificados de Apple (el job sólo valida en simulador; con .p12 y .mobileprovision sí exporta IPA), no hay tienda ni distribución propia, ni ningún plan de pago detrás de todo esto. Lo que sí hay son límites de uso del servidor: 10 builds por hora por IP y los tamaños de entrada detallados en production.md.