Automatize tarefas no Android com os Workflows do Pocket Code: gatilhos por evento, agendamento cron no seu celular, retentativas e um editor visual — sem servidor, tudo no dispositivo.
Todo desenvolvedor acumula as mesmas pequenas tarefas repetitivas: rodar os testes depois de um push, fazer backup do banco de dados quando um deploy termina, formatar ao salvar, avisar a si mesmo quando um build falha. Num notebook, você cola tudo isso com runners de CI, jobs de cron e alguns scripts de shell num servidor em algum lugar. No celular, a resposta de sempre é "não dá". O Pocket Code muda isso com os Workflows — um motor de automação orientado a eventos que permite automatizar tarefas no Android inteiramente no dispositivo, sem servidor para alugar e sem nada para manter vivo na nuvem.
Um workflow é simples de descrever: um gatilho (um evento dentro da IDE, ou um agendamento) mais uma sequência de passos que rodam sobre um contexto compartilhado. Isso já basta para montar fluxos de dev de verdade — do tipo para o qual você normalmente levantaria um pipeline de CI — bem ao lado do seu editor, terminal e gerenciador de banco de dados.
Você nunca precisa começar de uma tela em branco. O módulo oferece três pontos de partida:
| Modo | Como você cria | Exemplo |
|---|---|---|
| Template | Toque em Ativar em um dos 8 templates prontos | "Pipeline CI/CD", "Auto-Deploy no Push", "Backup do BD no Deploy" |
| Gerar com IA | Digite um prompt e receba um esqueleto editável | "quando houver push para main, faça deploy e notifique" vira um workflow de 2 passos |
| Editor | Toque no botão "+" (FAB) para o formulário completo | Monte do zero com bindings e políticas de retentativa |
Ativar um template o clona em uma cópia editável com um ID novo, então você pode ajustá-lo sem tocar no original.
Os workflows escutam eventos que fluem pela IDE. O motor se inscreve no barramento de eventos interno do app e mapeia cada evento para um tipo de gatilho. São dez tipos de gatilho:
| Gatilho | Dispara em | Filtro típico |
|---|---|---|
| Push do Git | Um push concluído | branch ("main", "develop") |
| Commit do Git | Um novo commit | branch |
| Arquivo salvo | Um salvamento de arquivo no editor | extensão (".kt", ".ts") |
| App aberto | O app vindo para o primeiro plano | — |
| Comando de terminal finalizado | Um comando de terminal concluído | padrão do comando |
| Consulta de banco executada | Um resultado de consulta chegando | nome da tabela |
| Deploy concluído | Um deploy bem-sucedido | provedor ("vercel", "railway") |
| Deploy falhou | Um deploy com falha | provedor |
| Erro detectado | Outro workflow falhando | nome do workflow / padrão de erro |
| Manual | Nada — roda por agendamento ou manualmente | — |
Só entram na avaliação os workflows habilitados cujo tipo de gatilho corresponde, e um
filtro opcional restringe ainda mais com uma correspondência de substring sem diferenciar
maiúsculas de minúsculas — assim, um workflow de push do Git filtrado por main ignora todos
os outros branches.
É aqui que a "automação sem servidor" fica concreta. Um workflow com gatilho manual e um
agendamento anexado vira um job agendado. Nos bastidores, o agendador embrulha o
WorkManager do Android e oferece dois modos.
Agendamentos por intervalo usam uma requisição de trabalho periódica. O piso do
WorkManager é de 15 minutos, então valores menores são arredondados para cima. Os presets:
| Preset | Intervalo |
|---|---|
| A cada 15 minutos | 15 min |
| De hora em hora | 60 min |
| A cada 6 horas | 360 min |
Agendamentos por cron são a parte interessante. O Pocket Code traz seu próprio
parser de cron de 5 campos (minuto, hora, dia do mês, mês, dia da semana) — sem
biblioteca externa — com suporte a curingas *, valores únicos, listas N,M, intervalos
N-M e passos */N. Dois presets de cron vêm embutidos:
0 9 * * *0 9 * * 1Como a API periódica do WorkManager não consegue expressar cron de verdade, cada execução
de cron é agendada como um job único que rearma o próximo disparo ao terminar, mantendo
o cron vivo indefinidamente. O editor de agendamento mostra uma prévia
ao vivo do "Próximo disparo" calculada a partir da sua expressão, e fica vermelho com
"Expressão cron inválida" no instante em que o parse falha — feedback imediato antes de você
salvar. O parser propositalmente mantém as coisas simples nesta versão: nomes de mês e dia,
?, L, #, segundos e ano não são suportados.
Os agendamentos são persistidos e recolocados na fila na inicialização do app, para que a morte de um processo não esvazie silenciosamente a sua automação.
O editor é um formulário completo: nome, descrição, um botão de habilitar, um dropdown de gatilho com filtro opcional e uma lista vertical de cards de passo que você pode reordenar, editar ou excluir. Adicionar um passo abre um seletor dividido em Controle de fluxo (Esperar, Se / Senão) e Ações — oito tipos de ação, cada um com um rótulo legível e um formulário de configuração dinâmico:
| Ação | Campos do formulário |
|---|---|
| Executar comando | Comando |
| Notificação | Título, mensagem |
| Analisar com IA | Prompt, linguagem (opcional) |
| Gerar com IA | Prompt, linguagem (opcional) |
| Operação Git | Operação (commit/push/pull), branch, mensagem |
| Deploy | Branch (opcional) |
| Backup do banco | Comando (opcional) |
| Abrir arquivo | Caminho do arquivo, linha (opcional) |
Cada passo de ação também tem seções recolhíveis de Confiabilidade e Condicional (mais sobre elas abaixo). Nada chega ao banco de dados até você pressionar Salvar na barra superior — aplicar e cancelar operam sobre o estado local do editor, então você pode experimentar à vontade. Salvar só é habilitado depois que o workflow tem um nome e ao menos um passo.
O editor expõe Esperar e um nível de Se/Senão hoje. O próprio motor também executa passos de Loop, Paralelo e Try/Catch, mas um editor visual para eles é um próximo passo conhecido, e não uma funcionalidade já disponível — então trate-os como blocos de construção no nível do motor, não como algo que você possa arrastar do seletor ainda.
Os passos não rodam isolados — eles compartilham um contexto, e qualquer campo de valor pode
referenciar um passo anterior com um {{binding}}. A sintaxe:
| Expressão | Resolve para |
|---|---|
{{var.<name>}} | Uma variável de contexto |
{{step.<id>.status}} | O status de um passo |
{{step.<id>.output.<field>}} | Um campo da saída de um passo |
{{step.<id>.error}} | A mensagem de erro de um passo |
{{item.<alias>}} | O item atual dentro de um loop |
{{trigger.eventName}} | O evento que iniciou a execução |
Uma expressão que não resolve retorna uma string vazia de propósito, para que um binding a um passo que nunca rodou (digamos, em um ramo condicional pulado) não derrube a execução inteira. As condições se apoiam na mesma ideia: comparam valores resolvidos com igual, diferente, maior que, menor que, contém ou é-nulo, e os combinam com a lógica booleana usual de e/ou/não.
Uma automação em que você não pode confiar não é automação. Todo passo de ação suporta uma política de retentativa e um timeout, exibidos naquela seção recolhível de Confiabilidade:
| Configuração | Padrão |
|---|---|
| Máximo de tentativas | 1 (sem retentativa) |
| Estratégia de backoff | Exponencial |
| Atraso inicial | 500 ms |
| Atraso máximo | inicial × 30 |
| Timeout | nenhum |
O backoff vem nos sabores fixo, linear e exponencial (dobrando de forma exponencial: 500, 1000, 2000, 4000…), cada um limitado ao atraso máximo. Timeouts são timeouts de verdade — quando um dispara, o passo é marcado como expirado. Há também uma condição leve que você pode anexar a uma única ação: vincule-a a um valor, e aquele único passo é pulado quando o valor está vazio, é false, 0 ou nulo — assim você pode barrar um passo isolado sem envolvê-lo em um condicional completo.
Cada execução é persistida com um snapshot completo dos resultados de seus passos, o que
significa que o histórico sobrevive a travamentos. A linha do tempo de Execuções lista as
execuções da mais nova para a mais antiga com um ícone de status, timestamp, contagem de passos,
duração e uma prévia de erro em uma linha, caso algo tenha falhado. Tocar em uma execução abre um
detalhamento passo a passo: cor de status por passo (sucesso, falha, pulado, expirado, em
execução), a duração do passo, sua saída renderizada como pares chave=valor e qualquer string de
erro.
A retenção é automática — o repositório mantém as últimas 100 execuções por workflow e descarta qualquer coisa com mais de 30 dias, então o histórico continua útil sem crescer sem limite.
Oito templates prontos cobrem os casos comuns, para que você tenha uma automação funcionando com um toque — ativar um o clona em uma cópia editável, então ajustá-lo nunca toca no original:
main, faça deploy e notifique vocêprettier --write .)git add -A && git commit)main, rode os testes e avise você que o branch é protegidoSe você prefere não montar os passos à mão, o Gerador com IA transforma um prompt em um
workflow editável. Ele lê palavras-chave para inferir um gatilho ("push", "deploy failed", "error",
"save"…) e uma sequência de ações ("deploy", "backup", "test", "format", "notify"…), e então mostra
uma prévia que você pode Salvar e habilitar ou descartar. Um prompt como "quando houver push para
main, faça deploy e notifique" produz um workflow de dois passos ligado a um push do Git em main.
O gerador também tem um caminho apoiado por LLM que usa o provedor de IA configurado por
você e recorre silenciosamente ao parser heurístico se algo der errado — então você sempre recebe uma
prévia ou uma mensagem clara de "não foi possível inferir".
Definições de workflow, histórico de execuções e agendamentos vivem em um banco de dados local no
seu celular. As definições podem ter backup na nuvem para restauração, mas nada na nuvem é lido para
executar a sua automação — o motor roda localmente, ponto final. Histórico de execuções e agendamentos
não são sincronizados de forma alguma: o histórico é local do dispositivo, e os agendamentos são estado
do WorkManager específico de cada aparelho. Sua automação é sua, e roda onde você está.
O Pocket Code está a caminho da Google Play, trazendo um motor de automação completo — gatilhos, agendamento cron no celular, retentativas e um editor visual — para o mesmo app onde você escreve e publica o código. Faça o pré-cadastro para estar entre os primeiros a experimentá-lo no seu próprio dispositivo.
Baixe o app e comece a programar pelo seu celular.