Workflows
Gratis — el motor enteroUn workflow es un disparador y una secuencia de pasos que se ejecutan sobre un contexto compartido. Todo ocurre en el dispositivo: no hay servidor que alquilar ni nada que mantener vivo en la nube. Los pasos ramifican, iteran y se llaman entre sí, se referencian la salida con expresiones, y reaccionan al fallo con reintento, topes de tiempo y una rama de error.

Cuatro formas de crear uno
El módulo abre en una pantalla de bienvenida. Tomes el camino que tomes, lo que acabas teniendo es el mismo workflow editable.
Plantillas
17 plantillas integradas en cuatro familias. Tocas Activar y obtienes una copia editable con identificador nuevo — no comparte nada con la original.
Descríbeselo a la IA
Escribes una frase. La respuesta del modelo se corrige donde se puede, pasa por el linter, se prueba en seco, y se te enseña el resultado antes de guardar nada.
El editor
Un árbol de pasos con bloques anidados, paleta de acciones con búsqueda, deshacer/rehacer, copiar y pegar pasos y un panel de problemas. En tablet la configuración del paso abre como panel lateral en vez de hoja.
Importar un fichero
Alguien comparte un .pcwf.json y lo abres. Llega apagado y con identificador nuevo, así que no se ejecuta nada hasta que lo hayas leído.
Disparadores (25)
Un workflow tiene un disparador principal y tantos extra como quieras, cada uno con su filtro. El filtro es tipado: cada disparador declara sus campos, y comparas campo contra valor con operadores —igual, contiene, empieza por, coincide, rutas glob—. No es buscar una subcadena en el texto del evento.
| Git | Git push · Git commit |
| Ficheros | Fichero guardado · creado · borrado · renombrado |
| Proyecto y build | Proyecto abierto · cerrado · Build terminado · Ejecución terminada · Comando de terminal terminado |
| Deploy y datos | Deploy completado · Deploy fallido · Consulta de base de datos ejecutada |
| Otros módulos | Respuesta de API Tester · Diseño exportado · El agente IA tocó un fichero · El agente IA terminó un turno |
| Desde el propio móvil | Acceso directo · Tile de ajustes rápidos · Texto compartido · Fichero compartido · App en primer plano |
| Encadenar y manual | Error detectado (otro workflow falló) · Manual o programado |
No todos los tipos tienen todavía quien los emita. En vez de esconderlos, el panel de problemas del editor te avisa cuando un workflow usa un disparador que hoy no se dispararía nunca — un disparador que existe y no se puede usar es peor si no se dice. También hay un botón de «capturar el siguiente evento»: haces la acción, y el editor te enseña la carga real que trae el disparador para que escribas el filtro contra algo real.

Acciones (15)
Las quince están cableadas a algo que se ejecuta de verdad, y un test se pone rojo nombrando cualquier tipo que se quede sin implementación. Un tipo sin nada detrás falla en voz alta en vez de dar éxito en silencio — eso era posible y ya no lo es.
| Acción | Qué hace | Salidas |
|---|---|---|
| Run terminal command | Ejecuta un comando en la terminal | command · exitCode · stdout · stderr · durationMs · timedOut |
| HTTP request | Llama a un endpoint; el cuerpo se parsea como JSON cuando lo es | status · body · json · headers · durationMs |
| Git operation | commit, push o pull | sha · branch · changedFiles · ahead · behind · text |
| Deploy | Dispara un deploy en el proveedor conectado | status · url · provider · projectName · logsTail · reason |
| Database query | Ejecuta una consulta contra la base de datos activa | rows · rowCount · columns |
| Database backup | Hace copia de la base de datos activa | path · sizeBytes |
| Read file | Lee un fichero del proyecto | content · sizeBytes · path |
| Write file | Escribe o añade a un fichero del proyecto | path · bytesWritten · created |
| File exists | Comprueba si una ruta existe | exists · isDirectory · sizeBytes |
| Open file | Abre un fichero en el editor, con línea opcional | path · line |
| AI analyze | Manda código o texto al asistente y captura la respuesta | text · model · tokens |
| AI generate | Genera código nuevo desde un prompt | text · model · tokens |
| Transform | Transforma un valor con los filtros de expresión — sin efectos secundarios | value |
| Set variable | Mete un valor en el contexto del run para pasos posteriores | name · value |
| Notification | Muestra una notificación con título y mensaje | shown |
Que un paso sea destructivo se calcula con sus parámetros delante, no por su tipo: git status no es git push, y crear un fichero nuevo no es sobrescribir uno. Etiquetar el tipo entero como destructivo obligaría a confirmar hasta un status, y pedir confirmación para todo enseña a aceptar sin leer.

Ramas, bucles y subflujos
Siete formas de paso, de las cuales seis son control de flujo. Las ramas se anidan dentro de ramas, así que lo que construyes es un árbol, no una línea recta.
Si / si no
Dos ramas. La condición es un árbol, no un hueco único: And, Or y Not se anidan, así que «pasaron los tests y la rama es main» es una condición, no dos workflows.
En paralelo
N ramas a la vez, juntadas de tres formas: cuando acaben todas, con la primera que termine, o con la primera que salga bien. Las dos últimas cancelan las ramas perdedoras para que dejen de provocar efectos.
Para cada
Itera una lista con un alias por elemento, un tope de seguridad de iteraciones, y un número opcional de iteraciones a la vez.
Intentar / si falla
Si algo del primer bloque falla, el segundo se ejecuta con el mensaje de error ligado a una variable que tú nombras.
Subflujo
Ejecuta otro workflow dentro de este run, con sus propias entradas. El hijo hereda la intersección de los permisos — no puede abrir lo que el padre cerró.
Espera
Pausa un tiempo — o hasta que ocurra un evento, con el tiempo como tope. «Espera a que acabe el deploy» en vez de «espera dos minutos y cruza los dedos».
Una condición en cualquier paso
Cada paso lleva una condición propia opcional: si es falsa el paso se salta, sin envolverlo en un si / si no entero.
Pasar datos entre pasos
Cualquier campo acepta un literal o una expresión entre llaves dobles. El editor ofrece un selector, así que no hace falta recordar identificadores de paso.
| Expresión | Resuelve a |
|---|---|
| {{var.name}} | Una entrada declarada o un valor que puso un paso |
| {{step.<id>.status}} | SUCCESS, FAILURE, SKIPPED, TIMED_OUT |
| {{step.<id>.output}} | El mapa de salida entero |
| {{step.<id>.output.json.items[0].name}} | Un campo de la salida, navegando dentro del JSON |
| {{step.<id>.error}} | El mensaje de error del paso |
| {{item.<alias>}} | El elemento de la iteración viva |
| {{trigger.<field>}} | La carga útil tipada del evento que lo disparó |
| {{secret.NAME}} | Un secreto guardado. Terminal — no se puede navegar dentro |
Filtros encadenables
lines · first · last · trim · upper · lower · length · json · default:"x" · split:"," · join · date:"HH:mm" · replace:a:b
Así, la primera línea de la salida de un comando es {{step.sh.output.stdout | lines | first | trim}}.
Cuando algo sale mal
La fiabilidad se ajusta por paso, y el workflow pone los valores por defecto que los pasos heredan.
Reintento
Número de intentos, con espera fija, lineal o exponencial y un tope para esa espera
Tope de tiempo
Cancela el paso y lo marca TIMED_OUT. Un timeout no se reintenta — vuelve tal cual
Si falla
Cortar el run o seguir. Seguir no tiñe el run: el paso queda en rojo y el run sale verde
Apagado
Un paso desactivado se salta sin ejecutarse. Es lo que quieres mientras depuras, en vez de borrarlo y volver a escribirlo
Y para el workflow entero
Tope del run
Un límite de tiempo para el run entero, no para un paso
Concurrencia
Qué hacer si llega un disparo con un run en vuelo: saltárselo, encolarlo, o cancelar el anterior
Política de error por defecto
El valor que heredan los pasos que no ponen el suyo
Retención
Cuánto historial guardar: 100 runs y 30 días por defecto, de 1 a 1.000 runs y de 1 a 365 días
Paso del resultado
Qué paso da la salida que es la respuesta del workflow cuando lo llama el agente IA
Expresiones estrictas
Apagado por defecto, así una referencia a una rama que no se ejecutó da cadena vacía en vez de tumbar el run. Encendido, es un error con motivo
Hay además un tope para toda la app: ocho runs a la vez. Por encima hacen cola, y un run rechazado o saltado se anota en el historial como cancelado diciendo cuál de los dos topes fue. No es silencioso.
Programación — cron en tu móvil
Cualquier workflow puede llevar uno o varios horarios: un intervalo, o una expresión cron de cinco campos con comodines, listas, rangos y pasos. Mientras escribes, la app te enseña el siguiente disparo o te dice que la expresión está mal. Los horarios sobreviven al cierre de la app y se vuelven a encolar al arrancar.
Zonas horarias y cambio de hora
Cada horario guarda su zona, y los días raros están resueltos y probados: en marzo, a la hora que no existe, dispara en el salto; en octubre, a la hora que ocurre dos veces, dispara una sola.
Ejecuciones perdidas
Tú eliges: saltarte lo que cayó con el dispositivo apagado, o recuperarlo una vez al volver. Una, no las cuarenta y ocho de un fin de semana largo.
Condiciones del dispositivo
Cualquier conexión, solo Wi-Fi o ninguna; solo mientras carga; no con la batería baja; solo con el dispositivo inactivo. Una condición retrasa el disparo, no lo cancela — y la pantalla lo dice.
El suelo de quince minutos
Android no ejecuta trabajo en segundo plano más a menudo que cada quince minutos. Un intervalo por debajo se sube y la app te da la cifra exacta. Un cron por debajo no lo sube nadie, así que lo único cierto es que no hay garantía — y eso es lo que dice la pantalla, en vez de un número que sería inventado.
El editor
Un árbol de pasos con deshacer y rehacer, atajos de teclado, copiar y pegar pasos, y arrastrar para reordenar. Su panel de problemas pasa 34 reglas de estructura, parámetros, expresiones, disparadores, bucles, fiabilidad, seguridad, subflujos y permisos. Solo los errores bloquean el guardado; los avisos no — quien cierra la red de un workflow suele hacerlo antes de quitar el paso que la usaba, y bloquear ahí le impediría terminar.
Probar un paso suelto
En vez de correr el workflow entero —con sus despliegues y sus notificaciones— cada vez que ajustas un parámetro, puedes ejecutar un paso suelto con los datos fijados como contexto. Un paso cuya implementación dice que no se puede simular no se simula: el botón pasa a decir «ejecutar este paso de verdad» y pregunta antes. Un botón que diga «correcto» sin haber ejecutado nada es peor que no tener botón.
Historial y actividad
Cada run se anota entero, con el resultado de cada paso, lo que tardó, cuántos intentos necesitó y su error si lo hubo. Sobrevive a los cierres y a los fallos de la app.
- •Una pestaña de Actividad con todos los workflows, filtrable por estado, por fecha, por workflow y por el texto del error
- •Detalle de cada run: paso a paso, con la salida en monoespaciada y el motivo por el que paró
- •El log en vivo se agrupa en ventanas de 100 ms antes de llegar a la pantalla — un git clone con su barra de progreso emite cientos de líneas por segundo
- •La retención la pones tú: 100 runs y 30 días por defecto
Permisos y secretos
Lo que un workflow puede hacer
Por workflow: salir a la red, escribir ficheros, ejecutar comandos, y una lista de dominios a los que puede llegar. Las implementaciones comprueban antes de tocar nada, y el rechazo dice qué permiso fue, qué iba a ejecutarse y dónde se cambia.
No es un cajón de arena, y la pantalla lo dice: quien pueda editar el workflow puede abrir el cinturón. Protege del descuido — un workflow que abriste a la IA, uno que te mandó otra persona, o la curl que alguien pegó «solo para probar» y se quedó ahí.
Secretos
Un almacén cifrado, por cuenta. Referencias un secreto como {{secret.NOMBRE}} y su valor no se vuelve a enseñar, ni siquiera en su propia pantalla.
- • Solo se resuelven en un run de verdad — una prueba en seco no los saca del almacén
- • El tapado cubre todos los valores guardados, no solo los que leyó un paso: si pegaste tu token a mano dentro de un comando, también sale tapado
- • Y ocurre antes de escribir en la base de datos, no al pintar — tapar al pintar llegaría tarde, el valor ya estaría en el fichero y en cualquier copia de seguridad
La lista blanca de dominios solo alcanza a los pasos HTTP: un paso de IA, de despliegue o de git va al servicio que tenga configurado, y la pantalla lo dice con esas palabras. Se compara el nombre del host, no la dirección a la que resuelve, así que no es protección contra SSRF. Aparte, toda ruta de fichero queda acotada a la raíz del proyecto.

Lo que la IA puede hacer aquí
Escribir uno desde una frase, o cambiar uno que ya tienes
La respuesta se corrige donde se puede, pasa el linter y la prueba en seco, y se te enseña antes de guardar nada. Cambiar uno existente fusiona la respuesta encima conservando identificador, interruptor y fecha, y te enseña el diff. Si no tienes modelo configurado hay un respaldo local — que es lo único que funciona para quien todavía no ha puesto su clave.
Workflows como herramientas del agente
Marcas «disponible para el agente de IA» en un workflow y el chat puede llamarlo. Seis herramientas en total: tres que leen (listar, obtener, ejecuciones) y tres que escriben (crear, cambiar, ejecutar) y pasan por la puerta de confirmación del agente.
El documento que se le manda al modelo no lleva valores de parámetros secretos — se sustituyen por un marcador.
Plantillas (17)
Un test es el linter de las plantillas: comprueba que cada disparador tenga emisor, que cada acción esté cableada, que cada clave de parámetro esté declarada, que cada expresión apunte a algo real, y que la prueba en seco de cada plantilla termine sin dejar el run en fallo. Una plantilla que no funciona no sale.
Clásicas · 8
Prettier al guardar · Auto-commit al guardar Kotlin · Lint del fichero que acabas de guardar · Tests y, si pasan, deploy · Auto-deploy al push a main · Tests tras el push a main · Test en cada commit · Copia de la base de datos tras el deploy
Flujo de datos · 3
Comprobación de salud por HTTP · Tres endpoints en paralelo · Notas de la versión desde el log de commits
Control de flujo · 3
Despliega o dime por qué no · Prueba cada módulo que tocaste · Protección de rama
Desde el móvil · 3
Compartir un enlace directo al proyecto · Copia nocturna · Tests de la rama en la que estás

Compartir uno
Un workflow viaja como un fichero .pcwf.json. Lo que no viaja: el historial, las salidas fijadas, los horarios y el interruptor. Lo que llega llega apagado y con identificador nuevo.
Los valores de parámetros marcados como secretos se vacían antes de escribir el fichero — y se listan, para que quien lo abra sepa qué tiene que rellenar. Una referencia {{secret.NOMBRE}} sí viaja: es un nombre, no el secreto, y vaciarla rompería el workflow de forma irreparable. Un fichero que no es nuestro, uno dañado y uno escrito por una versión más nueva dan tres mensajes distintos, porque son tres cosas distintas y solo una tiene salida.
Lo que cuesta dinero
El motor es gratis, sin asteriscos
Los 25 disparadores, las 15 acciones, ramas, bucles, subflujos, cron, permisos, secretos, el historial entero, exportar, las plantillas, y exponer un workflow como herramienta del agente IA — todo eso está en el plan gratuito.
Pro: pedirle a la IA que escriba o cambie uno
Es lo único de pago, y el límite vive en el chat, no aquí. Dejar que el agente ejecute un workflow que ya marcaste como disponible es gratis — esa herramienta es lo único que hace que la casilla signifique algo. El historial y exportar también son gratis: cobrar por ellos sería quitárselos a quien ya los tiene, y exportar es la única forma de sacar tu trabajo de la app.
Lo que no hay
Conviene saberlo antes de planear contando con ello.
| Disparador por webhook | Fuera de alcance: exige backend, push y un modelo de secretos que llegue al servidor |
| Alarmas exactas | El suelo son quince minutos y la app lo dice, en vez de pedirte otro permiso |
| Workflows en el Marketplace | Ni instalar ni publicar. Hoy compartir un workflow es compartir el fichero |
| Selector de zona horaria | Cada horario guarda su zona y resuelve el cambio de hora, pero los nuevos toman la del dispositivo |
| Un lienzo de grafo | Las ramas son un árbol anidado, no nodos que cableas en un lienzo: no hay switch de N salidas ni merge arbitrario |
| Anti-SSRF en la lista blanca de dominios | Se compara el nombre del host, no la dirección a la que resuelve |
El módulo en cifras
25
Tipos de disparador
15
Acciones, todas cableadas
7
Formas de paso
17
Plantillas
34
Reglas del linter
13
Filtros de expresión
6
Herramientas del agente IA
8
Runs a la vez en toda la app
Siguiente
Configuración