Início Rápido
Em menos de 15 minutos você vai modelar um processo no Craft, gerar o projeto Spring Boot, implementar um handler e ver a primeira instância rodar no Monitor. O problema que ele resolve:
Uma fintech abre contas digitais. Hoje a análise de cada solicitação é manual e sem visibilidade: um formulário chega pelo site, alguém calcula um score de risco numa planilha, um analista de crédito olha o resultado e decide aprovar ou não — e não existe um lugar único onde se veja em que etapa cada solicitação está. Solicitações somem no meio do caminho. Ninguém sabe quantas. Ninguém sabe onde.
Você constrói primeiro a versão mínima, que já tira a análise da planilha. A partir daí, cada capítulo do Guia do Desenvolvedor pega este mesmo processo e adiciona uma peça — score baixo, analista que demora, cadastro inválido — até virar um sistema de abertura de conta observável de ponta a ponta.
Se ainda não sabe o que é o Kikwiflow nem por que usá-lo, comece por Kikwiflow. Termos em inglês (workflow, bean, worker, handler) são glosados na primeira aparição e estão reunidos no Glossário.
Pré-requisitos
O Initializr do Craft gera um projeto Spring Boot completo, com docker-compose.yml. Há dois
caminhos para rodá-lo — escolha um:
- Docker + IDE (recomendado) — Docker e Docker Compose instalados, e uma IDE. É o caminho mais
objetivo e rápido: você não instala Java, Maven nem MongoDB na máquina. Recomendamos o VS Code,
por causa da extensão Kikwiflow Craft para VS Code, que abre o
.kikwicomo diagrama (não como JSON cru) dentro do editor e tem o botão "Ir para o bean". - JDK + Maven + MongoDB — JDK 21+, Maven 3.9+, e um MongoDB acessível (o
docker-composedo projeto usamongo:7). Use este caminho se preferir não depender do Docker para rodar a aplicação.
O tutorial mostra os comandos nos dois caminhos onde eles diferem.
1. Modelar no Craft
Acesse o Kikwiflow Craft e crie um novo rascunho. Arraste da paleta, nessa ordem: um Start Event, uma Executable Task, uma External Task, e um End Event — conectando cada um ao seguinte (veja Construindo o fluxo no canvas se for a primeira vez que você abre o editor).
Configure os dois nós do meio:
- Calcular Score (Executable Task) → campo Executor:
calcularScoreTaskHandler. - Aprovar Abertura (External Task).

Abra Configurações do Processo e defina a Chave do Processo (ID) como abertura-de-conta —
é esse identificador, não o nome do arquivo, que o seu código vai usar para iniciar instâncias.

Entendendo o processo
-
Calcular Score é uma tarefa executável (
EXECUTABLE_TASK), ou seja, é uma tarefa que vai ser executada pela aplicação, pode ser um algoritimo que por exemplo lêcpferendaDeclaradae grava umscore, sem intervenção humana. -
Aprovar Abertura é uma tarefa externa (
EXTERNAL_TASK), ou seja, o processo pausa até que o analista de crédito revise o score e registre adecisao.
Este diagrama ao ser exportado vai gerar um arquivo '.kikwi', que nada mais é do que um grafo em JSON que vai servir de mapa para que o motor de execução entenda o que deve fazer e quando deve fazer.
Ver o .kikwi exportado (JSON)
{
"key": "novo-processo",
"name": "Novo Processo",
"version": 1,
"description": "",
"extensionProperties": {},
"flowNodes": {
"e34061ff-fac4-46c2-ba55-96d1d86d8689": {
"id": "e34061ff-fac4-46c2-ba55-96d1d86d8689",
"name": "Início",
"type": "DEFAULT_START_EVENT",
"commitBefore": false,
"commitAfter": false,
"outgoing": [
{
"id": "flow-207bf0b9-e03c-4ffe-a1de-ed629b6883fe",
"name": "",
"targetNodeId": "EXECUTABLE_4F492EA7",
"extensionProperties": {}
}
],
"layout": {
"x": 448,
"y": 360
},
"extensionProperties": {}
},
"EXECUTABLE_4F492EA7": {
"id": "EXECUTABLE_4F492EA7",
"name": "Calcular Score",
"type": "EXECUTABLE_TASK",
"executor": "calcularScoreTaskHandler",
"commitBefore": false,
"commitAfter": false,
"outgoing": [
{
"id": "flow-4fa741f3-c956-4178-a72f-83ac0c0a4d0e",
"name": "",
"targetNodeId": "EXTERNAL_F6659E57",
"extensionProperties": {}
}
],
"layout": {
"x": 512,
"y": 346
},
"extensionProperties": {}
},
"EXTERNAL_F6659E57": {
"id": "EXTERNAL_F6659E57",
"name": "Aprovar Abertura",
"type": "EXTERNAL_TASK",
"commitBefore": false,
"commitAfter": false,
"outgoing": [
{
"id": "flow-9b5662ae-61c2-4005-a94d-03813f18fe88",
"name": "",
"targetNodeId": "DEFAULT_555BEF2F",
"extensionProperties": {}
}
],
"layout": {
"x": 834,
"y": 346
},
"extensionProperties": {}
},
"DEFAULT_555BEF2F": {
"id": "DEFAULT_555BEF2F",
"name": "Fim",
"type": "DEFAULT_END_EVENT",
"commitBefore": false,
"commitAfter": false,
"outgoing": [],
"layout": {
"x": 1164,
"y": 360
},
"extensionProperties": {}
}
},
"defaultStartPoint": "e34061ff-fac4-46c2-ba55-96d1d86d8689"
}
Você não precisa ler isso como JSON. A extensão Kikwiflow Craft para VS Code abre qualquer
.kikwicomo o mesmo diagrama que você desenhou no Craft — e daí você pula do nó direto para o bean que o implementa.
O Craft identifica nós por UUID internamente (43ee89f9-...), não por nomes legíveis. Mas você pode editar o identificador destes nós
para uma melhor legibilidade humana em logs e ferramentas de observabilidade.
2. Gerar o projeto com o Initializr
Com o fluxo pronto, abra o Hub de Exportação (botão Export na barra do canvas) e escolha o modo Initializr. Preencha o modal:
| Campo | Valor |
|---|---|
groupId | com.empresa |
artifactId | conta-service |
name | conta-service |
packageName | com.empresa.processo |
| Java | 21 |
| Versão do Kikwi | deixe o padrão |
Clique em gerar. Toda a geração acontece no navegador — baixa um conta-service.zip. Descompacte
em algum lugar do seu workspace.

Alternativa sem gerar o projeto inteiro: exporte só o
.kikwi(modo JSON do Hub) parasrc/main/resources/processes/de um projeto que você já tem; os stubs de bean você cria a partir do próprio nó, pelo botão "Ir para o bean" da extensão do VS Code.
3. O projeto gerado
Descompactado, o conta-service tem esta forma:
conta-service/
pom.xml # Java 21, os starters do Kikwiflow (motor, MongoDB, query, REST, Monitor)
Dockerfile # build multi-stage (Maven → JRE 21), expõe 8081
docker-compose.yml # a aplicação (porta 8081) + um MongoDB (mongo:7)
.dockerignore
README.md # abra este primeiro — cobre os caminhos Docker e Maven
src/main/resources/
application.yml # config do projeto (abaixo)
processes/
abertura-de-conta.kikwi # ← o processo que você desenhou, já embutido
src/main/java/com/empresa/processo/
ContaServiceApplication.java
executors/
CalcularScoreTaskHandler.java # ← stub gerado a partir do executor; corpo // TODO
O .kikwi do passo 1 já vem em src/main/resources/processes/, e cada executor referenciado no
processo já tem uma classe stub em executors/ — anotada com @Component("<nome>"), implementando a
interface certa, com o corpo do método marcado como // TODO.
O que o Initializr adiciona ao pom.xml
| Dependência | Papel | Documentação |
|---|---|---|
spring-boot-starter / spring-boot-starter-web | Contexto Spring + o Tomcat que serve a API REST e os assets estáticos do Monitor. | docs do Spring Boot |
kikwi-spring-boot-starter | O motor em si + a auto-configuração Spring Boot (execução, navegação, retry, timers). Traz kikwi-core, kikwi-model e o parser Jackson transitivamente — você não os declara. | Motor de Execução |
kikwi-runtime-persistence-mongodb-spring-boot-starter | Persistência do estado de cada instância em MongoDB, com commitWork transacional. Alternativa para começar sem infra: kikwi-in-memory-spring-boot-starter (nada sobrevive a um restart) — ver Instalação e Setup. | Persistência e Consistência |
kikwi-runtime-query-spring-boot-starter | O lado de leitura: busca de instâncias e histórico de eventos que a API de gestão consulta. | Busca Avançada de Instâncias |
kikwi-management-rest-spring-boot-starter | A API REST + SSE de gestão: definições, instâncias, completar tarefas externas, retry de incidentes, correlação de eventos. | Referência da API REST |
kikwi-monitor-spring-boot-starter | Embute a interface do Kikwiflow Monitor no próprio processo da aplicação, em /monitor-ui/. Depende do starter de management REST. | Kikwiflow Monitor |
O application.yml que vem no projeto:
server:
port: ${SERVER_PORT:8081}
spring:
application:
name: conta-service
threads:
virtual:
enabled: true
data:
mongodb:
uri: ${MONGODB_URI:mongodb://localhost:27017}
database: conta_service_db
auto-index-creation: true
kikwiflow:
process-definition:
auto-deploy:
enabled: true # registra todo .kikwi em resources/processes/ na subida
path: "classpath*:processes/**/*.kikwi"
security:
deploy-enabled: true # sem isto, nenhum processo é implantado
execution:
task-acquisition-interval-millis: 1000 # … demais chaves de tuning: ver Configuração Essencial
retry:
default-retry-interval: PT1M
pulse:
sse-endpoints:
enabled: true
4. Implementar o TaskHandler
O executor: "calcularScoreTaskHandler" declarado em Calcular Score precisa de um bean Spring
com esse nome — o Initializr já gerou a classe vazia. Abra
src/main/java/com/empresa/processo/executors/CalcularScoreTaskHandler.java e preencha o corpo:
package com.empresa.processo.executors;
import io.kikwiflow.execution.api.context.ExecutionContext;
import io.kikwiflow.execution.api.handler.TaskHandler;
import io.kikwiflow.model.execution.ProcessVariable;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
@Component("calcularScoreTaskHandler")
public class CalcularScoreTaskHandler implements TaskHandler {
@Override
public void handle(ExecutionContext execution) {
String cpf = execution.getVariable("cpf").value().toString();
BigDecimal rendaDeclarada = new BigDecimal(
execution.getVariable("rendaDeclarada").value().toString());
int score = calcular(cpf, rendaDeclarada);
execution.setVariable("score", new ProcessVariable("score", score));
}
private int calcular(String cpf, BigDecimal rendaDeclarada) {
// Regra de exemplo, determinística: quanto maior a renda, maior o score (teto 1000).
int base = rendaDeclarada.divide(BigDecimal.TEN).intValue();
return Math.min(base, 1000);
}
}
O nome passado a @Component("...") precisa bater exatamente com executor no JSON — é assim
que o motor resolve qual bean invocar quando o fluxo alcança aquele nó (detalhes em
Tarefas Executáveis).
5. Subir e executar
Da raiz do conta-service:
- Docker (recomendado)
- Maven local
docker compose up --build
Sobe o MongoDB (mongo:7) e a aplicação num passo só — não precisa de Java, Maven ou Mongo
instalados localmente.
Com um MongoDB já acessível em localhost:27017:
export MONGODB_URI=mongodb://localhost:27017
export SERVER_PORT=8081
mvn spring-boot:run
Nos dois casos, no log de inicialização você vê o processo ser implantado:
✓ Processo implantado: abertura-de-conta (v1)
A aplicação responde em http://localhost:8081, e o Monitor embarcado em
http://localhost:8081/monitor-ui/.
6. Operar no Monitor
Acesse http://localhost:8081/monitor-ui/. O processo abertura-de-conta aparece na lista, ainda
sem nenhuma execução.
Iniciar uma instância — abra o processo e clique no botão de play na barra flutuante superior. No formulário, deixe a chave de negócio (business key) em branco — o Monitor gera uma — e informe o conjunto inicial de variáveis (o payload): os dados que a solicitação "traz do site":
| Variável | Tipo | Valor |
|---|---|---|
cpf | String | 111.111.111-11 |
rendaDeclarada | Number | 8000 |
Ao confirmar, a instância nasce, Calcular Score roda na hora (é síncrona), grava score = 800, e
o processo para em Aprovar Abertura — uma EXTERNAL_TASK não avança sozinha, ela espera. É
exatamente esse estado de espera, visível e nomeado, que substitui o "ninguém sabe onde cada
solicitação está" do problema original.

Completar a tarefa humana — clique no card de Aprovar Abertura. No mundo real, é aqui que o
analista de crédito olha o score e decide. No editor de variáveis do modal, adicione:
| Variável | Tipo | Valor |
|---|---|---|
decisao | String | APROVADA |
Clique em Completar e Avançar. O Monitor mostra o fluxo avançando em tempo real: a instância
chega ao Fim e conclui — visível, do início ao fim, sem grep em log nenhum.
Para onde ir depois
Esse processo é deliberadamente pequeno — uma execução, uma espera, sem decisões, sem prazos, sem
tratamento de erro. O Guia do Desenvolvedor pega este mesmo
processo e faz ele crescer, capítulo a capítulo. Comece por Anatomia de um
Processo para entender a forma de um .kikwi, ou pule direto
para a pergunta que te trouxe aqui:
| Pergunta | Veja |
|---|---|
| "E se o score for baixo — quero mandar para uma mesa de análise?" | Decisões e Gateways |
| "E se o analista não decidir em 48h?" | Timers e Prazos |
| "E se o CPF vier com formato inválido?" | Tratando Erros de Negócio |
| "E se a consulta ao bureau falhar?" | Tarefas Executáveis |
| "Como testo tudo isso sem subir infraestrutura?" | Testando Seus Handlers |
| "Consulta ao bureau e coleta de documentos são independentes — posso rodar em paralelo?" | Processamento Paralelo |
Para montar o pom.xml à mão ou entender a escolha de persistência, veja Instalação e
Setup.