<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Programação Archives - Leonardo Nascimento | Engenheiro de Software</title>
	<atom:link href="https://leonardonascimento.dev/categoria/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>https://leonardonascimento.dev/categoria/programacao/</link>
	<description>Especializado em backend, APIs e sistemas escaláveis. Experiência em arquitetura de sistemas, integrações, mensageria, performance e aplicações de alta disponibilidade.</description>
	<lastBuildDate>Thu, 29 Jan 2026 16:56:16 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://leonardonascimento.dev/wp-content/uploads/2021/05/cropped-programming-32x32.png</url>
	<title>Programação Archives - Leonardo Nascimento | Engenheiro de Software</title>
	<link>https://leonardonascimento.dev/categoria/programacao/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Como monitorar aplicação e servidor pelo WhatsApp (logs, erros e alertas)</title>
		<link>https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/</link>
					<comments>https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Thu, 29 Jan 2026 15:19:35 +0000</pubDate>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Produção]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Alertas]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[monitoramento]]></category>
		<category><![CDATA[notifish]]></category>
		<category><![CDATA[produção]]></category>
		<category><![CDATA[WhatsApp]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2290</guid>

					<description><![CDATA[<p>WhatsApp é um canal excelente para alerta porque ele tem uma característica que e-mail e dashboard não têm: chega onde você está. O problema é que a maioria das implementações vira bagunça rápido — alerta demais, duplicado, sem contexto, e em pouco tempo todo mundo ignora. A forma correta de fazer isso é tratar WhatsApp [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/">Como monitorar aplicação e servidor pelo WhatsApp (logs, erros e alertas)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>WhatsApp é um canal excelente para alerta porque ele tem uma característica que e-mail e dashboard não têm: <strong>chega onde você está</strong>. O problema é que a maioria das implementações vira bagunça rápido — alerta demais, duplicado, sem contexto, e em pouco tempo todo mundo ignora.</p>



<p>A forma correta de fazer isso é tratar WhatsApp como <strong><a href="https://leonardonascimento.dev/blog/updown-io-receba-notificacao-no-whatsapp-caso-seu-site-fique-indisponivel/" type="post" id="164">camada de notificação</a></strong>, não como sistema de monitoramento. Você continua monitorando com ferramentas e sinais confiáveis (uptime, métricas, logs, filas, erros), mas centraliza o envio e a governança dos alertas em um lugar só — e aí o <a href="http://notifish.com/" type="link" id="http://notifish.com/" target="_blank" rel="noreferrer noopener nofollow">Notifish </a>entra bem.</p>



<p>A ideia é simples: <strong>qualquer evento relevante → vira um “evento de notificação” → Notifish entrega no WhatsApp</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-o-que-vale-a-pena-mandar-para-o-whatsapp-e-o-que-nao-vale">O que vale a pena mandar para o WhatsApp (e o que não vale)</h2>



<p>WhatsApp deve receber só o que exige ação ou atenção rápida. Em produção, eu separo em três níveis:</p>



<p><strong>Crítico (manda sempre):</strong></p>



<ul class="wp-block-list">
<li>aplicação fora do ar / endpoint crítico fora</li>



<li>erro 5xx em alta (explosão de taxa de erro)</li>



<li>fila parou de consumir / backlog crescendo rápido</li>



<li>disco quase cheio / risco de indisponibilidade</li>



<li>falha em integração crítica (pagamento, mensagens, etc.)</li>
</ul>



<p><strong>Alerta (manda com filtro):</strong></p>



<ul class="wp-block-list">
<li>latência acima do normal por X minutos</li>



<li>aumento gradual de erros específicos</li>



<li>Redis indisponível (com fallback) ou lento</li>



<li>uso de CPU/memória alto por período sustentado</li>
</ul>



<p><strong>Informativo (geralmente não manda no WhatsApp):</strong></p>



<ul class="wp-block-list">
<li>deploy realizado</li>



<li>logs de rotina</li>



<li>warnings esporádicos</li>
</ul>



<p>O que destrói o canal é “alerta informativo demais”. WhatsApp é para <strong>sinal forte</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-arquitetura-recomendada-sem-gambiarra">Arquitetura recomendada (sem gambiarra)</h2>



<p>O melhor padrão é este:</p>



<ol class="wp-block-list">
<li>Você tem fontes de evento (monitoramento/observabilidade):</li>
</ol>



<ul class="wp-block-list">
<li>Uptime/health-check (aplicação)</li>



<li>Métricas do servidor (CPU, RAM, disco)</li>



<li>Logs (erros específicos, padrões)</li>



<li>Erros de aplicação (exceptions)</li>



<li>Filas (backlog, falhas, retries)</li>
</ul>



<ol start="2" class="wp-block-list">
<li>Um “gerador de eventos” cria um evento padronizado.</li>



<li>Você envia esse evento para o <a href="https://developers.notifish.com/" type="link" id="https://developers.notifish.com/" target="_blank" rel="noreferrer noopener nofollow"><strong>Notifish via API</strong>.</a></li>



<li>Você define roteamento, deduplicação e templates</li>
</ol>



<ul class="wp-block-list">
<li>para qual número/grupo enviar</li>



<li>se deve agrupar, deduplicar, aplicar rate limit</li>



<li>qual template usar (curto, completo, escalonamento)</li>
</ul>



<p>Esse desenho escala porque você não espalha envio de WhatsApp por todo sistema. Você centraliza.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-como-fica-uma-mensagem-boa-no-whatsapp">Como fica uma mensagem boa no WhatsApp</h2>



<p>Uma mensagem útil precisa ter contexto mínimo e ação sugerida:</p>



<ul class="wp-block-list">
<li><strong>Título curto</strong> (o que aconteceu)</li>



<li><strong>Ambiente</strong> (prod, staging)</li>



<li><strong>Serviço</strong> (api, worker, site)</li>



<li><strong>Sintoma</strong> (erro, timeout, backlog)</li>



<li><strong>Impacto</strong> (estimado)</li>



<li><strong>Link</strong> (dashboard/logs, se existir)</li>



<li><strong>Ação recomendada</strong> (1 linha)</li>
</ul>



<p>Exemplo de payload humano:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>ALERTA CRÍTICO</strong>: API 5xx alto<br>Ambiente: prod | Serviço: api<br>Erros 5xx: 18% (últimos 5 min)<br>Endpoint: /api/orders<br>Ação: verificar logs + dependência “Payments”</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-implementacao-via-api-com-notifish-modelo-pratico">Implementação via API com Notifish (modelo prático)</h2>



<p>Você pode integrar de dois jeitos:</p>



<h3 class="wp-block-heading" id="h-1-seu-sistema-envia-eventos-diretamente-laravel-cron-scripts">1) Seu sistema envia eventos diretamente (Laravel, cron, scripts)</h3>



<p>Bom quando você mesmo detecta (fila, logs, métricas internas).</p>



<h3 class="wp-block-heading" id="h-2-ferramentas-externas-chamam-o-notifish-uptime-monitoramento">2) Ferramentas externas chamam o Notifish (uptime/monitoramento)</h3>



<p>Bom para health-check e métricas do servidor (quando a ferramenta já faz o “detector”).</p>



<p>Como você pediu implementação via API, vou te mostrar um modelo que funciona bem</p>



<h3 class="wp-block-heading" id="h-payload-recomendado-evento">Payload recomendado (evento)</h3>



<p></p>



<pre class="wp-block-preformatted">{<br>  "message": "Sua mensagem de alerta",<br>  "identifier": "seu identificador único de disparo",<br>  "link": true,<br>  "typing": "composing",<br>  "delayMessage": 1200<br>}<br></pre>



<p><strong>Por que esse formato funciona:</strong></p>



<ul class="wp-block-list">
<li><strong>identifier</strong>: chave de deduplicação / idempotência do alerta</li>



<li><strong>message</strong>: texto já formatado com contexto (ambiente/serviço/ação)</li>



<li><strong>delayMessage/typing</strong>: ajustes de entrega (opcionais)</li>
</ul>



<h2 class="wp-block-heading">Exemplo em Laravel enviando evento ao Notifish</h2>



<pre class="wp-block-preformatted">class NotifishClient
{
    public function sendToGroups(string $message, string $identifier, bool $link = true, int $delayMs = 0, string $typing = 'composing'): void
    {
        $url = rtrim(config('services.notifish.base_url'), '/')
            . '/api/v2/' . config('services.notifish.instance')
            . '/whatsapp/message/groups';

        $payload = [
            'message' => $message,
            'identifier' => $identifier,
            'link' => $link,
            'typing' => $typing,
            'delayMessage' => $delayMs,
        ];

        $response = Http::withToken(config('services.notifish.token'))
            ->acceptJson()
            ->contentType('application/json')
            ->timeout(8)
            ->post($url, $payload);

        if (!$response->successful()) {
            logger()->error('Notifish send failed', [
                'status' => $response->status(),
                'body' => $response->body(),
                'identifier' => $identifier,
            ]);
        }
    }
}

</pre>



<h2 class="wp-block-heading">Regras importantes para não virar caos</h2>



<p>Se você fizer só “manda mensagem”, em 2 semanas o canal morre. Algumas regras que eu considero obrigatórias:</p>



<p><strong>1) Deduplicação</strong></p>



<ul class="wp-block-list">
<li>Todo alerta precisa de <code>dedupe_key</code>.</li>



<li>Se o mesmo alerta acontecer 100 vezes, você manda 1 e “atualiza”/agrupa.</li>
</ul>



<p><strong>2) Rate limit por severidade</strong></p>



<ul class="wp-block-list">
<li>Crítico: pode repetir, mas com intervalo mínimo (ex.: 5–10 min).</li>



<li>Alerta: intervalo maior (ex.: 15–30 min).</li>



<li>Informativo: geralmente fora do WhatsApp.</li>
</ul>



<p><strong>3) Idempotência</strong></p>



<ul class="wp-block-list">
<li>Eventos iguais devem produzir o mesmo estado.</li>



<li>Se a chamada repetir, não deve disparar em duplicidade.</li>
</ul>



<p><strong>4) Conteúdo curto</strong><br>WhatsApp é leitura rápida. Se precisar detalhe, coloque em <code>meta</code> e mande link para logs/dashboard quando possível.</p>



<p><strong>5) Escalonamento</strong><br>Se continuar crítico por X tempo, notifica outro grupo/gestor.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O que monitorar para disparar eventos úteis (fontes típicas)</h2>



<p>Você pode começar com estes gatilhos (são os que mais dão retorno):</p>



<ul class="wp-block-list">
<li><strong>Health-check HTTP</strong> (200/500, tempo de resposta, quedas)</li>



<li><strong>Taxa de erro</strong> (5xx e exceções por minuto)</li>



<li><strong>Fila</strong> (backlog, jobs failed, tempo médio)</li>



<li><strong>Banco</strong> (conexões, queries lentas, timeouts)</li>



<li><strong>Redis</strong> (latência, indisponibilidade, memória/eviction)</li>



<li><strong>Servidor</strong> (disco, load alto sustentado)</li>



<li><strong>Integrações externas</strong> (timeout e falha por janela)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Monitorar “pelo WhatsApp” não é substituir observabilidade por chat. É transformar sinais importantes em alertas acionáveis, com governança. O Notifish entra como a peça que centraliza o envio e impede que cada sistema invente seu próprio jeito de notificar.</p>



<p>Se você faz dedupe, rate limit, severidade e contexto mínimo, o WhatsApp vira um canal confiável — e não um spam de produção.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/">Como monitorar aplicação e servidor pelo WhatsApp (logs, erros e alertas)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Arquitetura de uma API REST em Laravel preparada para produção</title>
		<link>https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/</link>
					<comments>https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Wed, 28 Jan 2026 22:44:00 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Dicas & Truques]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[api rest]]></category>
		<category><![CDATA[arquitetura de software]]></category>
		<category><![CDATA[autenticação api]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[ci/cd]]></category>
		<category><![CDATA[clean architecture]]></category>
		<category><![CDATA[desenvolvimento backend]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker compose]]></category>
		<category><![CDATA[documentação api]]></category>
		<category><![CDATA[engenharia de software]]></category>
		<category><![CDATA[github actions]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[laravel sanctum]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[projeto para portfólio]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[repository pattern]]></category>
		<category><![CDATA[service layer]]></category>
		<category><![CDATA[swagger]]></category>
		<category><![CDATA[testes automatizados]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2358</guid>

					<description><![CDATA[<p>Em processos seletivos técnicos, não basta entregar código funcional. Cada vez mais, empresas avaliam arquitetura, decisões técnicas, organização do projeto, automação e capacidade de escalar a solução. Este artigo detalha a arquitetura de uma API REST desenvolvida em Laravel para gerenciamento de tarefas, criada como parte de um teste técnico, mas estruturada como um projeto [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/">Arquitetura de uma API REST em Laravel preparada para produção</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Em processos seletivos técnicos, não basta entregar código funcional. Cada vez mais, empresas avaliam <strong>arquitetura, decisões técnicas, organização do projeto, automação e capacidade de escalar a solução</strong>.</p>



<p>Este artigo detalha a arquitetura de uma <strong><a href="https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/" type="post" id="2290">API REST</a> desenvolvida em Laravel para gerenciamento de tarefas</strong>, <a href="https://github.com/leonardop21/laravel-task" type="link" id="https://github.com/leonardop21/laravel-task" target="_blank" rel="noreferrer noopener nofollow">criada como parte de um teste técnico,</a> mas estruturada como um projeto <strong>pronto para produção</strong>, seguindo boas práticas amplamente utilizadas em ambientes corporativos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-visao-geral-da-solucao">Visão geral da solução</h2>



<p>A aplicação consiste em uma <strong>API RESTful para gerenciamento de tarefas</strong>, com suporte a:</p>



<ul class="wp-block-list">
<li>Autenticação via Bearer Token (Laravel Sanctum)</li>



<li>CRUD completo de tarefas</li>



<li>Marcação de tarefas como concluídas</li>



<li>Cache de consultas com Redis</li>



<li>Banco de dados PostgreSQL</li>



<li>Documentação interativa via Swagger</li>



<li>Ambiente Dockerizado (dev, test e prod)</li>



<li>Testes automatizados</li>



<li>Pipeline de CI/CD com GitHub Actions</li>
</ul>



<p>O foco não foi apenas “fazer funcionar”, mas <strong>pensar a aplicação como um produto escalável e previsível</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-decisao-arquitetural-api-stateless-e-autenticacao">Decisão arquitetural: API stateless e autenticação</h2>



<p>A API foi construída como <strong>stateless</strong>, utilizando <strong>Bearer Token via Laravel Sanctum</strong>.</p>



<h3 class="wp-block-heading" id="h-beneficios-dessa-abordagem">Benefícios dessa abordagem:</h3>



<ul class="wp-block-list">
<li>Facilidade de integração com frontends (SPA, mobile, terceiros)</li>



<li>Independência de sessão</li>



<li>Escalabilidade horizontal</li>



<li>Compatibilidade com gateways, load balancers e proxies</li>
</ul>



<p>A autenticação é desacoplada do fluxo de negócio, o que facilita manutenção e evolução futura.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-postgresql-como-banco-principal">PostgreSQL como banco principal</h2>



<p>A escolha do <strong>PostgreSQL</strong> não foi aleatória. Ele é amplamente utilizado em ambientes corporativos por oferecer:</p>



<ul class="wp-block-list">
<li>Confiabilidade transacional</li>



<li>Suporte avançado a índices</li>



<li>Tipos de dados ricos</li>



<li>Excelente desempenho em cenários complexos</li>
</ul>



<p>Isso torna a aplicação preparada para crescer sem precisar trocar a base de dados no curto ou médio prazo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-redis-como-camada-de-cache">Redis como camada de cache</h2>



<p>Para reduzir carga no banco e melhorar tempo de resposta, foi implementado <strong>cache com Redis</strong>, com TTL de 120 segundos nas consultas mais comuns.</p>



<h3 class="wp-block-heading" id="h-beneficios-diretos">Benefícios diretos:</h3>



<ul class="wp-block-list">
<li>Redução de queries repetitivas</li>



<li>Menor latência</li>



<li>Melhor desempenho sob carga</li>



<li>Escalabilidade em leitura</li>
</ul>



<p>Essa abordagem demonstra preocupação com <strong>performance real</strong>, não apenas com lógica funcional.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-arquitetura-limpa-repository-pattern-service-layer">Arquitetura limpa: Repository Pattern + Service Layer</h2>



<p><a href="https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/" type="post" id="2348">A aplicação segue princípios de <strong>Clean Architecture</strong></a>, separando responsabilidades de forma clara:</p>



<ul class="wp-block-list">
<li><strong>Controllers</strong>: recebem requisições e retornam respostas</li>



<li><strong>Services</strong>: concentram regras de negócio</li>



<li><strong>Repositories</strong>: isolam o acesso a dados</li>



<li><strong>Models</strong>: representam as entidades</li>
</ul>



<h3 class="wp-block-heading" id="h-vantagens-dessa-separacao">Vantagens dessa separação:</h3>



<ul class="wp-block-list">
<li>Código mais legível</li>



<li>Facilidade de testes</li>



<li>Menor acoplamento</li>



<li>Evolução segura do domínio</li>
</ul>



<p>Essa estrutura é comum em times maduros e projetos de longo prazo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-docker-como-base-do-ambiente">Docker como base do ambiente</h2>



<p>Toda a aplicação roda em <strong>Docker</strong>, com ambientes bem definidos:</p>



<h3 class="wp-block-heading" id="h-desenvolvimento">Desenvolvimento</h3>



<ul class="wp-block-list">
<li>Código em volume</li>



<li>Hot reload</li>



<li>PostgreSQL + Redis + Nginx</li>



<li>Testes executados automaticamente</li>
</ul>



<h3 class="wp-block-heading" id="h-producao">Produção</h3>



<ul class="wp-block-list">
<li>Build otimizado</li>



<li>Código embutido na imagem</li>



<li>Assets compilados no build</li>



<li>Sem dependência de volume</li>
</ul>



<p>Essa separação reduz o clássico problema de “funciona na minha máquina” e aproxima o ambiente local da produção.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-testes-automatizados-como-parte-do-fluxo">Testes automatizados como parte do fluxo</h2>



<p>A aplicação conta com <strong>testes unitários e de feature</strong>, executados de três formas:</p>



<ul class="wp-block-list">
<li>Localmente no ambiente dev</li>



<li>Isoladamente via Docker</li>



<li>Automaticamente no CI/CD</li>
</ul>



<p>Isso garante:</p>



<ul class="wp-block-list">
<li>Segurança para refatorações</li>



<li>Detecção precoce de bugs</li>



<li>Confiança na entrega contínua</li>
</ul>



<p>Testes não são tratados como opcional, mas como <strong>parte da arquitetura</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-ci-cd-com-github-actions">CI/CD com GitHub Actions</h2>



<p>Cada push ou pull request dispara um workflow que:</p>



<ol class="wp-block-list">
<li>Sobe toda a stack Docker (app, banco, cache)</li>



<li>Executa migrations</li>



<li>Roda a suíte completa de testes</li>



<li>Bloqueia o merge em caso de falha</li>
</ol>



<p>Esse processo simula um pipeline real de empresas que operam com <strong>entrega contínua e qualidade de código como requisito</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-documentacao-com-swagger">Documentação com Swagger</h2>



<p>A API possui <strong>documentação interativa via Swagger</strong>, acessível após subir a aplicação.</p>



<p>Isso permite:</p>



<ul class="wp-block-list">
<li>Testes manuais rápidos</li>



<li>Onboarding mais fácil</li>



<li>Comunicação clara entre backend e frontend</li>



<li>Uso por terceiros sem dependência de documentação externa</li>
</ul>



<p>Documentação é tratada como parte do produto, não como etapa posterior.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-beneficios-dessa-arquitetura-em-um-contexto-profissional">Benefícios dessa arquitetura em um contexto profissional</h2>



<p>Essa abordagem entrega vantagens claras em ambientes reais:</p>



<ul class="wp-block-list">
<li>Código organizado e previsível</li>



<li>Facilidade de manutenção</li>



<li>Escalabilidade técnica</li>



<li>Padronização de ambientes</li>



<li>Menor risco em deploys</li>



<li>Base sólida para crescimento</li>
</ul>



<p>Não se trata apenas de uma API de tarefas, mas de <strong>um modelo replicável para aplicações reais</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-o-que-esse-projeto-demonstra-tecnicamente">O que esse projeto demonstra tecnicamente</h2>



<p>Esse projeto evidencia competências como:</p>



<ul class="wp-block-list">
<li><a href="http://leonardonascimento.dev/categoria/laravel">Domínio de Laravel além do básico</a></li>



<li>Conhecimento de arquitetura backend</li>



<li>Uso consciente de cache e banco</li>



<li>Experiência com Docker e ambientes reais</li>



<li>Cultura de testes</li>



<li>Automação de CI/CD</li>



<li>Pensamento orientado a produto e escala</li>
</ul>



<p>São exatamente esses pontos que diferenciam um desenvolvedor <strong>pleno/sênior</strong> em processos seletivos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-conclusao">Conclusão</h2>



<p>Mais do que cumprir um teste técnico, o objetivo deste projeto foi demonstrar <strong>capacidade de pensar sistemas como um todo</strong>, indo além do CRUD simples.</p>



<p>Arquitetura, automação, testes e previsibilidade são o que tornam uma aplicação sustentável — e é isso que empresas buscam quando contratam profissionais para projetos de longo prazo.</p>



<p></p>



<p><a href="https://github.com/leonardop21/laravel-task" target="_blank" rel="noreferrer noopener nofollow">Link do teste prático</a></p>
<p>The post <a href="https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/">Arquitetura de uma API REST em Laravel preparada para produção</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como identificar um projeto WordPress mal feito em 10 minutos</title>
		<link>https://leonardonascimento.dev/blog/como-identificar-um-projeto-wordpress-mal-feito-em-10-minutos/</link>
					<comments>https://leonardonascimento.dev/blog/como-identificar-um-projeto-wordpress-mal-feito-em-10-minutos/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Sun, 25 Jan 2026 11:50:00 +0000</pubDate>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[auditoria wordpress]]></category>
		<category><![CDATA[desenvolvimento wordpress]]></category>
		<category><![CDATA[performance web]]></category>
		<category><![CDATA[projetos wordpress]]></category>
		<category><![CDATA[seo técnico]]></category>
		<category><![CDATA[wordpress profissional]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2345</guid>

					<description><![CDATA[<p>Você não precisa ser especialista nem passar horas auditando código para saber se um projeto WordPress foi mal executado. Em poucos minutos — às vezes em segundos — já dá para identificar sinais claros de problema técnico, dívida acumulada e decisões erradas. Este texto é um guia direto, prático e baseado em experiência real para [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/como-identificar-um-projeto-wordpress-mal-feito-em-10-minutos/">Como identificar um projeto WordPress mal feito em 10 minutos</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Você não precisa ser especialista nem passar horas auditando código para saber se um projeto <a href="https://leonardonascimento.dev/blog/o-que-e-lighthouse-e-como-usar-para-melhorar-seu-site/" type="post" id="2318">WordPress </a>foi mal executado. Em poucos minutos — às vezes em segundos — já dá para identificar sinais claros de problema técnico, dívida acumulada e decisões erradas. Este texto é um guia direto, prático e baseado em experiência real para reconhecer um WordPress mal feito antes que ele vire dor de cabeça.</p>



<h2 class="wp-block-heading" id="h-spoiler-quando-e-ruim-os-sinais-aparecem-rapido">Spoiler: quando é ruim, os sinais aparecem rápido</h2>



<p><a href="https://leonardonascimento.dev/categoria/wordpress">Projetos WordPress mal feitos <strong>não falham em silêncio</strong></a>. Eles deixam rastros.<br>O problema é que muita gente não sabe onde olhar.</p>



<p>Em 10 minutos, você consegue ter uma boa noção se está diante de:</p>



<ul class="wp-block-list">
<li>Um projeto profissional ou uma bomba-relógio disfarçada de site bonito</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-abra-o-site-no-celular-primeiro-minuto"> Abra o site no celular (primeiro minuto)</h2>



<p>Antes de qualquer ferramenta, <strong>abra no mobile</strong>.</p>



<p>Sinais clássicos de problema:</p>



<ul class="wp-block-list">
<li>Site lento para carregar</li>



<li>Layout “pulando”</li>



<li>Texto pequeno ou mal espaçado</li>



<li>Elementos quebrados</li>
</ul>



<p>Se o site já sofre no mobile, o problema geralmente é estrutural — não é “só ajuste fino”.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-inspecione-o-html-2-minutos"> Inspecione o HTML (2 minutos)</h2>



<p>Clique com o botão direito → <em>Inspecionar</em>.</p>



<p>Se você vê:</p>



<ul class="wp-block-list">
<li>Camadas infinitas de <code>&lt;div></code></li>



<li>Classes genéricas e repetidas</li>



<li>Estrutura semântica inexistente</li>



<li>Conteúdo principal perdido no meio do código</li>
</ul>



<p>Isso indica <strong>HTML inflado</strong>, típico de projetos feitos no <em>arrastar e soltar</em>.</p>



<p>HTML ruim é sinal de:</p>



<ul class="wp-block-list">
<li>SEO fraco</li>



<li>Performance ruim</li>



<li>Manutenção difícil</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-veja-quantos-arquivos-css-e-js-sao-carregados-1-minuto">Veja quantos arquivos CSS e JS são carregados (1 minuto)</h2>



<p>Abra a aba <strong>Network</strong> do navegador.</p>



<p>Red flags claras:</p>



<ul class="wp-block-list">
<li>15, 20, 30 arquivos CSS</li>



<li>JS sendo carregado em todas as páginas, sem necessidade</li>



<li>Scripts de plugins que nem aparecem na tela</li>
</ul>



<p>Quanto mais dependência global, <strong>pior a saúde do projeto</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-cheque-a-hierarquia-de-titulos-h1-h2-h3-1-minuto">Cheque a hierarquia de títulos (H1, H2, H3) (1 minuto)</h2>



<p>Use qualquer extensão simples ou até o próprio inspector.</p>



<p>Problemas comuns:</p>



<ul class="wp-block-list">
<li>Mais de um H1</li>



<li>H1 usado como elemento visual</li>



<li>Pulando de H2 para H4</li>



<li>Headings usados só para “aumentar fonte”</li>
</ul>



<p>Isso é um tiro no pé para SEO e acessibilidade.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-abra-o-painel-administrativo-2-minutos"> Abra o painel administrativo (2 minutos)</h2>



<p>Se você tem acesso ao admin, a verdade aparece rápido.</p>



<p>Sinais de alerta:</p>



<ul class="wp-block-list">
<li>15, 30, 50 plugins ativos</li>



<li>Plugins com funções sobrepostas</li>



<li>Plugins abandonados ou sem atualização</li>



<li>Tudo resolvido com plugin, nada com código</li>
</ul>



<p>Projeto bom usa plugin como <strong>ferramenta</strong>, não como muleta.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-de-uma-olhada-no-banco-de-dados-1-minuto">Dê uma olhada no banco de dados (1 minuto)</h2>



<p>Mesmo sem aprofundar, alguns sinais gritam:</p>



<ul class="wp-block-list">
<li>Tabelas demais para um site simples</li>



<li>Prefixos estranhos</li>



<li>Plugins que criaram dezenas de tabelas</li>



<li>Lixo acumulado de plugins removidos</li>
</ul>



<p>Quando um site institucional tem mais de 200 tabelas, <strong>algo está muito errado</strong>. (História real)</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-veja-como-o-cache-esta-sendo-tratado-1-minuto">Veja como o cache está sendo tratado (1 minuto)</h2>



<p>Perguntas simples:</p>



<ul class="wp-block-list">
<li>Tem cache?</li>



<li>Cache é de página, objeto, CDN?</li>



<li>Limpa cache a cada acesso?</li>
</ul>



<p>Cache mal configurado é quase tão ruim quanto não ter cache nenhum.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-observe-como-o-site-reage-a-pequenas-mudancas">Observe como o site reage a pequenas mudanças</h2>



<p>Esse é um teste indireto, mas poderoso.</p>



<p>Pergunte:</p>



<ul class="wp-block-list">
<li>Atualizar um plugin quebra layout?</li>



<li>Trocar tema é inviável?</li>



<li>Qualquer ajuste exige “rezar”?</li>
</ul>



<p>Se sim, o projeto não foi pensado para evoluir.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-o-padrao-por-tras-de-tudo-isso">O padrão por trás de tudo isso</h2>



<p>Projetos WordPress mal feitos geralmente compartilham a mesma origem:</p>



<ul class="wp-block-list">
<li>Pressa</li>



<li>Preço baixo</li>



<li>Soluções visuais</li>



<li>Falta de base técnica</li>
</ul>



<p>O site até funciona, mas <strong>vive no limite</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-importante-wordpress-nao-e-o-problema">Importante: WordPress não é o problema</h2>



<p>WordPress bem utilizado:</p>



<ul class="wp-block-list">
<li>É rápido</li>



<li>Escala</li>



<li>É estável</li>



<li>Aguenta tráfego</li>



<li>É fácil de manter</li>
</ul>



<p>O problema nunca foi o CMS.<br>O problema é <strong>como ele é usado</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Identificar um projeto WordPress mal feito cedo:</p>



<ul class="wp-block-list">
<li>Evita retrabalho</li>



<li>Evita prejuízo</li>



<li>Evita desgaste com cliente</li>



<li>Evita promessas que não podem ser cumpridas</li>
</ul>



<p>E a melhor parte:<br><strong>você não precisa de ferramenta cara, só de olhar técnico</strong>.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/como-identificar-um-projeto-wordpress-mal-feito-em-10-minutos/">Como identificar um projeto WordPress mal feito em 10 minutos</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/como-identificar-um-projeto-wordpress-mal-feito-em-10-minutos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>10 inteligências artificiais que você não pode ignorar em 2026</title>
		<link>https://leonardonascimento.dev/blog/10-inteligencias-artificiais-que-voce-nao-pode-ignorar-em-2026/</link>
					<comments>https://leonardonascimento.dev/blog/10-inteligencias-artificiais-que-voce-nao-pode-ignorar-em-2026/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Fri, 23 Jan 2026 21:25:00 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Seo & Marketing]]></category>
		<category><![CDATA[automação]]></category>
		<category><![CDATA[ferramentas de ia]]></category>
		<category><![CDATA[futuro da tecnologia]]></category>
		<category><![CDATA[ia 2026]]></category>
		<category><![CDATA[inovação digital]]></category>
		<category><![CDATA[inteligência artificial]]></category>
		<category><![CDATA[sites de ia]]></category>
		<category><![CDATA[tecnologia 2025]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2335</guid>

					<description><![CDATA[<p>De assistentes que escrevem códigos a geradores de vídeos e músicas em segundos, essas inteligências artificiais estão definindo o ritmo da inovação digital. Conheça as ferramentas que estão revolucionando a produtividade, a criação de conteúdo e o próprio jeito de trabalhar.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/10-inteligencias-artificiais-que-voce-nao-pode-ignorar-em-2026/">10 inteligências artificiais que você não pode ignorar em 2026</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>De assistentes que escrevem códigos a geradores de vídeos e músicas em segundos, essas inteligências artificiais estão definindo o ritmo da inovação digital. Conheça as ferramentas que estão revolucionando a produtividade, a criação de conteúdo e o próprio jeito de trabalhar.</p>



<p><strong>1. Claude.ai — o cérebro que resolve tudo</strong><br>Criado pela Anthropic, o Claude é o rival direto do ChatGPT, e muitos juram que ele é ainda mais “humano”. Capaz de entender contextos complexos, revisar textos longos e até analisar documentos inteiros, o Claude virou o companheiro ideal para quem precisa de precisão e agilidade.</p>



<p><strong>2. Ranked.ai — o impulso para o topo do Google</strong><br>Essa IA é uma bênção para quem vive de SEO. Ela analisa, sugere e otimiza o conteúdo do seu site para conquistar posições valiosas nos resultados de busca. O melhor? Faz isso praticamente sozinha, com atualizações em tempo real.</p>



<p><strong>3. Syllaby.io — vídeos prontos para bombar</strong><br>Quer transformar roteiros em conteúdo de vídeo automático? O Syllaby faz isso com maestria. Ele cria, edita e entrega vídeos completos com narração e legenda, otimizados para TikTok, Reels e Shorts. Um aliado de peso para criadores e marcas.</p>



<p><strong>4. Replit.com — código sem complicação</strong><br>Mais do que um simples editor, o Replit é um ambiente de desenvolvimento guiado por IA. Ele escreve código, corrige bugs e até explica o que você está fazendo errado. É como ter um mentor de programação disponível 24 horas.</p>



<p><strong>5. Manus.im — o superagente inteligente</strong><br>Considerada uma das plataformas mais versáteis, o Manus é um agente de IA que centraliza tarefas: pesquisa, escrita, automação e até integração entre apps. Tudo num só lugar, com interface intuitiva e resultados rápidos.</p>



<p><strong>6. Suno.com — música em segundos</strong><br>Aqui, criatividade e tecnologia tocam juntos. O Suno permite criar faixas completas em poucos cliques, combinando estilos e vozes realistas. Ideal para trilhas de vídeos, podcasts ou simplesmente para quem quer experimentar novos sons.</p>



<p><strong>7. Fliki.ai — texto que vira vídeo</strong><br>Pegue um texto simples e veja ele se transformar em conteúdo visual dinâmico. O Fliki gera vídeos curtos, prontos para redes sociais, com narração natural e variedade de estilos. Um presente para quem quer produção rápida sem perder qualidade.</p>



<p><strong>8. CloudXLR.com — o construtor de apps definitivo</strong><br>Essa plataforma é o sonho de empreendedores e desenvolvedores. A CloudXLR usa IA para montar aplicativos completos, desde o design até a lógica interna, sem exigir uma linha de código manual.</p>



<p><strong>9. Genspark.ai — o superagente da produtividade</strong><br>Genspark é como um estagiário genial: escreve, pesquisa, planeja, organiza e ainda gera relatórios. Ele funciona como uma central de automação pessoal, perfeita para quem gerencia muitas tarefas ao mesmo tempo.</p>



<p><strong>10. Fastread.io — eBooks na velocidade da luz</strong><br>Produzir um livro digital nunca foi tão rápido. O Fastread cria, formata e finaliza eBooks a partir de poucos tópicos, com estrutura profissional e linguagem envolvente.</p>



<p>Bônus extra</p>



<ul class="wp-block-list">
<li><strong>Perplexity</strong> — busca com IA que realmente responde, citando fontes.</li>



<li><strong>ElevenLabs</strong> — vozes artificiais extremamente naturais.</li>



<li><strong>Pika</strong> — geração de vídeos criativos com IA generativa.</li>
</ul>
<p>The post <a href="https://leonardonascimento.dev/blog/10-inteligencias-artificiais-que-voce-nao-pode-ignorar-em-2026/">10 inteligências artificiais que você não pode ignorar em 2026</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/10-inteligencias-artificiais-que-voce-nao-pode-ignorar-em-2026/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>O que é Lighthouse e como usar para melhorar seu site</title>
		<link>https://leonardonascimento.dev/blog/o-que-e-lighthouse-e-como-usar-para-melhorar-seu-site/</link>
					<comments>https://leonardonascimento.dev/blog/o-que-e-lighthouse-e-como-usar-para-melhorar-seu-site/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Wed, 21 Jan 2026 23:20:00 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Frontend]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Produção]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Seo & Marketing]]></category>
		<category><![CDATA[core web vitals]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[lighthouse]]></category>
		<category><![CDATA[otimização de sites]]></category>
		<category><![CDATA[performance web]]></category>
		<category><![CDATA[seo técnico]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2318</guid>

					<description><![CDATA[<p>Performance, acessibilidade e boas práticas deixaram de ser “detalhes técnicos” e passaram a impactar diretamente tráfego, conversão e experiência do usuário. Para ajudar a medir esses pontos de forma objetiva, o Google criou o Google Lighthouse. Mais do que uma nota colorida, o Lighthouse é uma ferramenta de diagnóstico. Saber usá-lo corretamente evita decisões erradas [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/o-que-e-lighthouse-e-como-usar-para-melhorar-seu-site/">O que é Lighthouse e como usar para melhorar seu site</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Performance, acessibilidade e boas práticas deixaram de ser “detalhes técnicos” e passaram a impactar diretamente tráfego, conversão e experiência do usuário. Para ajudar a medir esses pontos de forma objetiva, o Google criou o <strong>Google Lighthouse</strong>.</p>



<p>Mais do que uma nota colorida, o Lighthouse é uma ferramenta de diagnóstico. Saber usá-lo corretamente evita decisões erradas e otimizações inúteis.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-o-que-e-o-lighthouse">O que é o Lighthouse</h2>



<p>O Lighthouse é uma ferramenta automatizada de auditoria de páginas web. Ele analisa uma URL e gera um relatório com métricas e recomendações em cinco áreas principais:</p>



<ul class="wp-block-list">
<li><strong>Performance</strong></li>



<li><strong>Acessibilidade</strong></li>



<li><strong>Boas práticas</strong></li>



<li><strong>SEO</strong></li>



<li><strong>Progressive Web App (PWA)</strong></li>
</ul>



<p>O objetivo não é apenas pontuar o site, mas mostrar <strong>onde estão os gargalos reais</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-onde-o-lighthouse-esta-disponivel">Onde o Lighthouse está disponível</h2>



<p>Você pode usar o Lighthouse de várias formas:</p>



<ul class="wp-block-list">
<li><strong>Chrome DevTools</strong> (nativo do navegador)</li>



<li><strong>Linha de comando (CLI)</strong></li>



<li><strong>CI/CD</strong> (auditorias automatizadas)</li>



<li><strong>Ferramentas online baseadas no Lighthouse</strong></li>
</ul>



<p>Para a maioria dos casos, o DevTools já resolve bem.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-como-rodar-o-lighthouse-pelo-chrome">Como rodar o Lighthouse pelo Chrome</h2>



<ol class="wp-block-list">
<li>Abra o site no Chrome</li>



<li>Pressione <code>F12</code> ou <code>Ctrl + Shift + I</code></li>



<li>Vá até a aba <strong>Lighthouse</strong></li>



<li>Escolha o tipo de dispositivo (Mobile ou Desktop)</li>



<li>Clique em <strong>Generate report</strong></li>
</ol>



<p>Em poucos segundos, o relatório é gerado.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-as-metricas-mais-importantes-e-o-que-elas-significam">As métricas mais importantes (e o que elas significam)</h2>



<h3 class="wp-block-heading" id="h-performance">Performance</h3>



<p>Avalia tempo de carregamento e resposta da página. Algumas métricas-chave:</p>



<ul class="wp-block-list">
<li><strong>LCP (Largest Contentful Paint)</strong><br>Mede quando o maior elemento visível aparece. Impacta diretamente a percepção de velocidade.</li>



<li><strong>INP (Interaction to Next Paint)</strong><br>Avalia a resposta do site às interações do usuário.</li>



<li><strong>CLS (Cumulative Layout Shift)</strong><br>Mede instabilidade visual (elementos “pulando” na tela).</li>
</ul>



<p>Essas métricas fazem parte do <strong>Core Web Vitals</strong>, usados pelo Google como sinal de experiência.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="h-acessibilidade">Acessibilidade</h3>



<p>Verifica se o site pode ser usado por pessoas com limitações visuais, motoras ou cognitivas. Exemplos de checagem:</p>



<ul class="wp-block-list">
<li>contraste de cores</li>



<li>textos alternativos em imagens</li>



<li>labels em formulários</li>



<li>estrutura semântica do HTML</li>
</ul>



<p>Mesmo que não seja um requisito legal em todos os casos, acessibilidade melhora usabilidade para todos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="h-boas-praticas">Boas práticas</h3>



<p>Aqui entram problemas mais técnicos, como:</p>



<ul class="wp-block-list">
<li>uso de APIs inseguras</li>



<li>imagens com proporções erradas</li>



<li>erros de console</li>



<li>bibliotecas desatualizadas</li>
</ul>



<p>É uma área que ajuda a manter o site saudável ao longo do tempo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="h-seo">SEO</h3>



<p>O Lighthouse não substitui ferramentas avançadas de SEO, mas valida o básico:</p>



<ul class="wp-block-list">
<li>meta tags essenciais</li>



<li>indexabilidade</li>



<li>uso correto de links</li>



<li>estrutura mínima de conteúdo</li>
</ul>



<p>Se o site falha aqui, dificilmente terá bom desempenho orgânico.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-o-erro-mais-comum-otimizar-so-para-a-nota">O erro mais comum: otimizar só para a nota</h2>



<p>Muita gente usa o Lighthouse como competição de pontuação. Isso é um erro.</p>



<p>Um site pode ter nota 100 e ainda assim:</p>



<ul class="wp-block-list">
<li>carregar dados desnecessários</li>



<li>ter arquitetura ruim</li>



<li>sofrer em cenários reais de tráfego</li>
</ul>



<p>O relatório deve ser lido como <strong>ferramenta de diagnóstico</strong>, não como objetivo final.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-mobile-vs-desktop-sempre-priorize-mobile">Mobile vs Desktop: sempre priorize mobile</h2>



<p>O Google avalia sites com <strong>mobile-first indexing</strong>. Isso significa que:</p>



<ul class="wp-block-list">
<li>o relatório mobile é mais relevante</li>



<li>problemas no mobile impactam mais SEO</li>



<li>otimizações devem começar pelo mobile</li>
</ul>



<p>Um site rápido no desktop e lento no celular está em desvantagem.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-lighthouse-em-producao-e-ci-cd">Lighthouse em produção e CI/CD</h2>



<p>Em projetos mais maduros, o Lighthouse pode rodar automaticamente:</p>



<ul class="wp-block-list">
<li>antes de deploy</li>



<li>após mudanças críticas</li>



<li>em pipelines de CI/CD</li>
</ul>



<p>Isso ajuda a evitar regressões de performance e garante que melhorias não sejam perdidas com o tempo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-limitacoes-do-lighthouse">Limitações do Lighthouse</h2>



<p>Apesar de poderoso, o Lighthouse tem limites:</p>



<ul class="wp-block-list">
<li>roda em ambiente controlado</li>



<li>não reflete todos os cenários reais</li>



<li>não substitui métricas de usuários reais (RUM)</li>
</ul>



<p>O ideal é combiná-lo com dados reais de uso, como relatórios de experiência de campo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-quando-o-lighthouse-faz-mais-diferenca">Quando o Lighthouse faz mais diferença</h2>



<p>Ele é especialmente útil para:</p>



<ul class="wp-block-list">
<li>identificar gargalos iniciais de performance</li>



<li>validar mudanças estruturais</li>



<li>educar times sobre impacto técnico</li>



<li>criar baseline de qualidade</li>
</ul>



<p>Não é uma bala de prata, mas é um excelente ponto de partida.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>O Lighthouse não serve para “tirar nota alta”, mas para <strong>entender como o site se comporta</strong> do ponto de vista do usuário. Quando usado com critério, ele direciona otimizações que realmente fazem diferença.</p>



<p>Ignorá-lo pode custar performance, experiência e visibilidade. Usá-lo mal pode custar tempo. O valor está em interpretar os dados, não apenas executá-los.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/o-que-e-lighthouse-e-como-usar-para-melhorar-seu-site/">O que é Lighthouse e como usar para melhorar seu site</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/o-que-e-lighthouse-e-como-usar-para-melhorar-seu-site/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Fluxo n8n: API, WhatsApp, Log (com dedupe e tratamento de erro)</title>
		<link>https://leonardonascimento.dev/blog/fluxo-n8n-api-whatsapp-log-com-dedupe-e-tratamento-de-erro/</link>
					<comments>https://leonardonascimento.dev/blog/fluxo-n8n-api-whatsapp-log-com-dedupe-e-tratamento-de-erro/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Tue, 20 Jan 2026 22:30:00 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[automação]]></category>
		<category><![CDATA[integrações]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[n8n]]></category>
		<category><![CDATA[webhooks]]></category>
		<category><![CDATA[WhatsApp]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2316</guid>

					<description><![CDATA[<p>O cenário (realista) Você quer receber um evento via API (Webhook), enviar uma mensagem no WhatsApp via Notifish e registrar o resultado (sucesso/erro) em log. Esse fluxo é útil para: Pré-requisitos Aqui vou usar a opção A (mais “produção”). Parte 1 — Contrato da API (Webhook) Você vai expor um endpoint no n8n, por exemplo: [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/fluxo-n8n-api-whatsapp-log-com-dedupe-e-tratamento-de-erro/">Fluxo n8n: API, WhatsApp, Log (com dedupe e tratamento de erro)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="h-o-cenario-realista">O cenário (realista)</h2>



<p>Você quer receber um evento via API (Webhook), enviar uma mensagem no WhatsApp via <a href="https://notifish.com/" type="link" id="https://notifish.com/" target="_blank" rel="noreferrer noopener nofollow">Notifish </a>e registrar o resultado (sucesso/erro) em log.</p>



<p>Esse fluxo é útil para:</p>



<ul class="wp-block-list">
<li>alertas operacionais</li>



<li>notificações de deploy</li>



<li>falhas de integração</li>



<li>notificações de sistema para grupos</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Pré-requisitos</h2>



<ol class="wp-block-list">
<li><a href="https://leonardonascimento.dev/tag/n8n/" type="post_tag" id="267">n8n rodando e acessível</a></li>



<li>endpoint do Notifish (o seu padrão):<br><code>POST https://meu-dominio.notifish.com/api/v2/{INSTANCE_UUID}/whatsapp/message/groups</code><br>com header <code>Authorization: Bearer ...</code></li>



<li>um lugar para log<br>Vou te dar 2 opções:</li>
</ol>



<ul class="wp-block-list">
<li><strong>A)</strong> log em arquivo via HTTP (endpoint seu) — mais profissional</li>



<li><strong>B)</strong> log no próprio n8n (Execution data) + uma planilha/banco (se preferir)</li>
</ul>



<p>Aqui vou usar a opção <strong>A</strong> (mais “produção”).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Parte 1 — Contrato da API (Webhook)</h1>



<p>Você vai expor um endpoint no <a href="https://leonardonascimento.dev/blog/n8n-o-que-e-como-funciona-e-quando-faz-sentido-usar/" type="post" id="2313">n8n</a>, por exemplo:</p>



<pre class="wp-block-code"><code>POST https://SEU_N8N/webhook/notify
</code></pre>



<p>Payload recomendado (simples e suficiente):</p>



<pre class="wp-block-code"><code>{
  "title": "API 5xx alto",
  "message": "Erros 5xx acima do normal em /api/orders",
  "url": "https://seu-dashboard",
  "identifier": "prod:api:5xx",
  "delayMessage": 0
}
</code></pre>



<p>Repare que já mandamos <code>identifier</code>. Isso permite deduplicar e evitar spam.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Parte 2 — Dedupe (anti-spam) usando Redis (opcional, mas recomendado)</h1>



<p>Se você tiver Redis (muito comum), dá para usar um passo “check” antes do envio.</p>



<ul class="wp-block-list">
<li>chave: <code>dedupe:{identifier}</code></li>



<li>TTL: 300s (5 minutos) por exemplo<br>Se existir, você não envia.</li>
</ul>



<p>Se você não tiver Redis, dá para deduplicar com “Data Store” do n8n ou com um endpoint seu.</p>



<p>Vou te passar o fluxo com <strong>Data Store do n8n</strong> (não depende de infra extra).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Parte 3 — Enviar WhatsApp via Notifish</h1>



<p>O <a href="https://notifish.com/" target="_blank" rel="noreferrer noopener nofollow">Notifish </a>recebe:</p>



<pre class="wp-block-code"><code>{
  "message": "...",
  "identifier": "...",
  "link": true,
  "typing": "composing",
  "delayMessage": 1200
}
</code></pre>



<p>A gente vai montar isso no n8n.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Parte 4 — Registrar Log</h1>



<p>Depois do envio (sucesso ou falha), registramos em um endpoint de log. Exemplo:</p>



<pre class="wp-block-code"><code>POST https://seu-sistema.com/api/logs/notifish
</code></pre>



<p>Log recomendado:</p>



<pre class="wp-block-code"><code>{
  "identifier": "prod:api:5xx",
  "status": "success",
  "http_status": 200,
  "provider": "notifish",
  "payload": { ... },
  "response": { ... },
  "created_at": "2026-01-22T00:00:00-03:00"
}
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">NODES DO WORKFLOW (passo a passo)</h1>



<h2 class="wp-block-heading">1) Webhook (Trigger)</h2>



<ul class="wp-block-list">
<li>Method: <strong>POST</strong></li>



<li>Path: <strong>notify</strong></li>



<li>Response: JSON (200)</li>
</ul>



<h2 class="wp-block-heading">2) Function (Normalize)</h2>



<p>Cria um formato consistente e monta a mensagem final do WhatsApp:</p>



<ul class="wp-block-list">
<li>título + mensagem + url</li>



<li>garante identifier</li>



<li>define delayMessage</li>
</ul>



<h2 class="wp-block-heading">3) Data Store (Get)</h2>



<p>Busca <code>identifier</code> na datastore (dedupe).</p>



<h2 class="wp-block-heading">4) IF (Já enviou?)</h2>



<p>Se já existe registro recente, responde 200 “ignored” e não envia.</p>



<h2 class="wp-block-heading">5) HTTP Request (Notifish)</h2>



<p>POST no endpoint do Notifish com Bearer Token.</p>



<h2 class="wp-block-heading">6) Data Store (Set)</h2>



<p>Salva <code>identifier</code> com TTL (ex.: 300s) para dedupe.</p>



<h2 class="wp-block-heading">7) HTTP Request (Log Success)</h2>



<p>Envia log para seu endpoint.</p>



<h2 class="wp-block-heading">8) Error Trigger / Catch (Log Error)</h2>



<p>Se Notifish falhar, manda log com status <code>error</code>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">JSON do workflow para importar no n8n</h1>



<p>Abaixo um workflow base. Você só precisa trocar:</p>



<ul class="wp-block-list">
<li><code>NOTIFISH_INSTANCE_UUID</code></li>



<li><code>NOTIFISH_TOKEN</code></li>



<li><code>LOG_ENDPOINT_URL</code></li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Import: n8n → Workflows → Import from file/clipboard</p>
</blockquote>



<pre class="wp-block-code"><code>{
  "name": "API → Notifish WhatsApp → Log (com dedupe)",
  "nodes": &#91;
    {
      "parameters": {
        "path": "notify",
        "httpMethod": "POST",
        "responseMode": "lastNode",
        "options": {}
      },
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": &#91;260, 300]
    },
    {
      "parameters": {
        "functionCode": "const body = $json;\n\nconst title = body.title || 'Notificação';\nconst msg = body.message || '';\nconst url = body.url || '';\n\nconst identifier = body.identifier || `generic:${Date.now()}`;\nconst delayMessage = body.delayMessage ?? 0;\n\nconst whatsappMessage = `*${title}*\\n\\n${msg}${url ? `\\n\\n${url}` : ''}`;\n\nreturn &#91;{\n  identifier,\n  delayMessage,\n  notifishPayload: {\n    message: whatsappMessage,\n    identifier,\n    link: true,\n    typing: 'composing',\n    delayMessage\n  },\n  original: body\n}];"
      },
      "name": "Normalize",
      "type": "n8n-nodes-base.function",
      "typeVersion": 2,
      "position": &#91;520, 300]
    },
    {
      "parameters": {
        "operation": "get",
        "key": "={{$json.identifier}}"
      },
      "name": "Dedupe Get",
      "type": "n8n-nodes-base.dataStore",
      "typeVersion": 1,
      "position": &#91;760, 300]
    },
    {
      "parameters": {
        "conditions": {
          "boolean": &#91;
            {
              "value1": "={{$json.value !== undefined &amp;&amp; $json.value !== null}}",
              "value2": true
            }
          ]
        }
      },
      "name": "Já enviou?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": &#91;980, 300]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\"status\":\"ignored\",\"reason\":\"dedupe\",\"identifier\":\"{{$json.identifier}}\"}",
        "options": {}
      },
      "name": "Return Ignored",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1,
      "position": &#91;1210, 200]
    },
    {
      "parameters": {
        "url": "https://meu-dominio.notifish.com/api/v2/NOTIFISH_INSTANCE_UUID/whatsapp/message/groups",
        "method": "POST",
        "authentication": "none",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": &#91;
            {
              "name": "Authorization",
              "value": "Bearer NOTIFISH_TOKEN"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Accept",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "contentType": "json",
        "jsonBody": "={{$json.notifishPayload}}",
        "options": {
          "timeout": 8000
        }
      },
      "name": "Send Notifish",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": &#91;1210, 380]
    },
    {
      "parameters": {
        "operation": "set",
        "key": "={{$json.identifier}}",
        "value": "={{JSON.stringify({sentAt: new Date().toISOString()})}}"
      },
      "name": "Dedupe Set",
      "type": "n8n-nodes-base.dataStore",
      "typeVersion": 1,
      "position": &#91;1450, 380]
    },
    {
      "parameters": {
        "url": "LOG_ENDPOINT_URL",
        "method": "POST",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": &#91;
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "contentType": "json",
        "jsonBody": "={{ {\n  identifier: $json.identifier,\n  status: 'success',\n  provider: 'notifish',\n  response: $json,\n  created_at: new Date().toISOString()\n} }}"
      },
      "name": "Log Success",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": &#91;1690, 380]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\"status\":\"sent\",\"identifier\":\"{{$json.identifier}}\"}",
        "options": {}
      },
      "name": "Return OK",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1,
      "position": &#91;1910, 380]
    }
  ],
  "connections": {
    "Webhook": {
      "main": &#91;
        &#91;
          {
            "node": "Normalize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize": {
      "main": &#91;
        &#91;
          {
            "node": "Dedupe Get",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dedupe Get": {
      "main": &#91;
        &#91;
          {
            "node": "Já enviou?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Já enviou?": {
      "main": &#91;
        &#91;
          {
            "node": "Return Ignored",
            "type": "main",
            "index": 0
          }
        ],
        &#91;
          {
            "node": "Send Notifish",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Notifish": {
      "main": &#91;
        &#91;
          {
            "node": "Dedupe Set",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dedupe Set": {
      "main": &#91;
        &#91;
          {
            "node": "Log Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Success": {
      "main": &#91;
        &#91;
          {
            "node": "Return OK",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false
}
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Observações importantes (produção)</h2>



<h3 class="wp-block-heading">1) Dedupe com Data Store não tem TTL nativo</h3>



<p>Ele salva “para sempre” se você não limpar. Em produção, o ideal é:</p>



<ul class="wp-block-list">
<li>usar Redis para TTL real, ou</li>



<li>incluir timestamp e limpar por job diário</li>
</ul>



<p>Se você quiser, eu te mando a versão com Redis (TTL real).</p>



<h3 class="wp-block-heading">2) Log endpoint</h3>



<p>Se você não tiver endpoint pronto, você pode logar em:</p>



<p id="h-">ou até em um arquivo via API sua</p>



<p>PostgreSQL/MySQL via node de banco</p>



<p>Google Sheets (rápido)</p>



<p></p>
<p>The post <a href="https://leonardonascimento.dev/blog/fluxo-n8n-api-whatsapp-log-com-dedupe-e-tratamento-de-erro/">Fluxo n8n: API, WhatsApp, Log (com dedupe e tratamento de erro)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/fluxo-n8n-api-whatsapp-log-com-dedupe-e-tratamento-de-erro/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>N8N: o que é, como funciona e quando faz sentido usar</title>
		<link>https://leonardonascimento.dev/blog/n8n-o-que-e-como-funciona-e-quando-faz-sentido-usar/</link>
					<comments>https://leonardonascimento.dev/blog/n8n-o-que-e-como-funciona-e-quando-faz-sentido-usar/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Tue, 20 Jan 2026 01:14:00 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[apis]]></category>
		<category><![CDATA[automação]]></category>
		<category><![CDATA[integrações]]></category>
		<category><![CDATA[low-code]]></category>
		<category><![CDATA[n8n]]></category>
		<category><![CDATA[workflows]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2313</guid>

					<description><![CDATA[<p>Automação deixou de ser algo exclusivo de grandes sistemas. Hoje, boa parte das aplicações depende de fluxos que conectam APIs, bancos, filas, serviços externos e ações internas. O desafio não é mais se automatizar, mas como fazer isso sem criar mais complexidade do que o necessário. É nesse contexto que ferramentas como o n8n ganham [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/n8n-o-que-e-como-funciona-e-quando-faz-sentido-usar/">N8N: o que é, como funciona e quando faz sentido usar</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Automação deixou de ser algo exclusivo de grandes sistemas. Hoje, boa parte das aplicações depende de fluxos que conectam APIs, bancos, filas, serviços externos e ações internas. O desafio não é mais <em>se</em> automatizar, mas <strong>como fazer isso sem criar mais complexidade do que o necessário</strong>.</p>



<p>É nesse contexto que ferramentas como o <strong>n8n</strong> ganham espaço.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-o-que-e-o-n8n">O que é o n8n</h2>



<p>O n8n é uma ferramenta de automação baseada em <strong>workflows</strong>, onde cada fluxo representa uma sequência de ações encadeadas. Essas ações podem envolver chamadas HTTP, processamento de dados, decisões condicionais, integração com serviços externos ou execução de lógica personalizada.</p>



<p>Diferente de scripts isolados ou cron jobs espalhados, o n8n centraliza esse tipo de automação em um único lugar, com <strong>visibilidade e controle</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-como-o-n8n-funciona-na-pratica">Como o n8n funciona na prática</h2>



<p>O funcionamento do n8n se baseia em três conceitos principais:</p>



<h3 class="wp-block-heading" id="h-1-nodes-nos">1) Nodes (nós)</h3>



<p>Cada node representa uma ação específica: receber um webhook, chamar uma API, transformar dados, enviar uma mensagem, salvar em banco, entre outros.</p>



<h3 class="wp-block-heading" id="h-2-workflows">2) Workflows</h3>



<p>Um workflow é o encadeamento desses nodes. Ele define:</p>



<ul class="wp-block-list">
<li>onde o fluxo começa</li>



<li>quais decisões são tomadas</li>



<li>quais ações acontecem em sequência</li>
</ul>



<h3 class="wp-block-heading" id="h-3-execucoes">3) Execuções</h3>



<p>Toda vez que um workflow roda, o n8n registra a execução. Isso permite:</p>



<ul class="wp-block-list">
<li>ver entradas e saídas</li>



<li>identificar erros</li>



<li>reprocessar execuções</li>
</ul>



<p>Essa rastreabilidade é um dos pontos fortes da ferramenta.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-onde-o-n8n-costuma-ser-usado">Onde o n8n costuma ser usado</h2>



<p>Na prática, o n8n aparece com frequência em cenários como:</p>



<ul class="wp-block-list">
<li>integração entre sistemas que não se conversam nativamente</li>



<li>automação de processos manuais repetitivos</li>



<li>consumo e envio de webhooks</li>



<li>sincronização de dados entre APIs</li>



<li>orquestração de tarefas assíncronas</li>
</ul>



<p>Ele não substitui código em todos os casos, mas reduz bastante a necessidade de escrever lógica repetitiva.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-n8n-nao-e-low-code-magico">n8n não é “low-code mágico”</h2>



<p>Um erro comum é achar que o n8n elimina a necessidade de conhecimento técnico. Na realidade, ele <strong>expõe a complexidade de forma visual</strong>, mas não a remove.</p>



<p>Para usar bem o n8n, é importante entender:</p>



<ul class="wp-block-list">
<li>HTTP</li>



<li>APIs REST</li>



<li>autenticação (tokens, headers, OAuth)</li>



<li>formatos de dados (JSON)</li>



<li>tratamento de erros</li>
</ul>



<p>Sem isso, o fluxo até pode funcionar, mas fica frágil.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-a-diferenca-entre-automacao-e-orquestracao">A diferença entre automação e orquestração</h2>



<p>Automação simples executa tarefas. Orquestração coordena sistemas.</p>



<p>O n8n se destaca quando usado como <strong>orquestrador</strong>:</p>



<ul class="wp-block-list">
<li>recebe eventos</li>



<li>decide o que fazer</li>



<li>chama serviços na ordem correta</li>



<li>lida com falhas e exceções</li>
</ul>



<p>Quando bem aplicado, ele vira um ponto central de integração, não apenas um “gatilho”.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-quando-faz-sentido-usar-n8n">Quando faz sentido usar n8n</h2>



<p>O n8n costuma ser uma boa escolha quando:</p>



<ul class="wp-block-list">
<li>há muitas integrações externas</li>



<li>a lógica muda com frequência</li>



<li>manter código para cada integração ficou caro</li>



<li>é importante visualizar e auditar fluxos</li>
</ul>



<p>Ele também é útil para prototipação, desde que exista cuidado para não deixar soluções provisórias virarem definitivas sem revisão.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-quando-nao-faz-sentido">Quando não faz sentido</h2>



<p>Nem tudo precisa de n8n. Em alguns casos, ele adiciona mais uma camada desnecessária.</p>



<p>Exemplos:</p>



<ul class="wp-block-list">
<li>lógica extremamente simples e estável</li>



<li>processamento pesado ou de alta performance</li>



<li>fluxos críticos que exigem controle fino de memória ou tempo</li>
</ul>



<p>Nesses cenários, código direto costuma ser mais adequado.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-n8n-em-producao-pontos-de-atencao">n8n em produção: pontos de atenção</h2>



<p>Rodar n8n em produção exige alguns cuidados:</p>



<ul class="wp-block-list">
<li>persistência de dados (banco configurado corretamente)</li>



<li>controle de acesso</li>



<li>versionamento de workflows</li>



<li>monitoramento de falhas</li>



<li>cuidado com loops e execuções em massa</li>
</ul>



<p>Sem isso, a automação vira fonte de problemas, não de solução.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-o-papel-do-n8n-na-arquitetura-moderna">O papel do n8n na arquitetura moderna</h2>



<p>O n8n não é o “coração” do sistema, mas funciona bem como <strong>camada de integração</strong>. Ele conecta serviços, traduz formatos e orquestra eventos, enquanto a regra de negócio principal permanece no backend.</p>



<p>Essa separação ajuda a manter o sistema mais flexível e adaptável a mudanças.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>O n8n é uma ferramenta poderosa quando usada com consciência. Ele não substitui engenharia de software, mas resolve muito bem um problema específico: <strong>orquestrar integrações e automações de forma clara e controlada</strong>.</p>



<p>Quando entra como solução pensada, reduz complexidade. Quando entra como atalho, costuma cobrar seu preço depois.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/n8n-o-que-e-como-funciona-e-quando-faz-sentido-usar/">N8N: o que é, como funciona e quando faz sentido usar</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/n8n-o-que-e-como-funciona-e-quando-faz-sentido-usar/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Quando o WhatsApp vira canal operacional (e não só meio de envio)</title>
		<link>https://leonardonascimento.dev/blog/quando-o-whatsapp-vira-canal-operacional-e-nao-so-meio-de-envio/</link>
					<comments>https://leonardonascimento.dev/blog/quando-o-whatsapp-vira-canal-operacional-e-nao-so-meio-de-envio/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Sun, 18 Jan 2026 16:19:16 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[alertas de sistema]]></category>
		<category><![CDATA[integrações]]></category>
		<category><![CDATA[monitoramento]]></category>
		<category><![CDATA[notificações]]></category>
		<category><![CDATA[operação]]></category>
		<category><![CDATA[whatsapp em produção]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2310</guid>

					<description><![CDATA[<p>Durante muito tempo, o WhatsApp foi visto apenas como um canal de comunicação direta: mensagens, avisos, campanhas pontuais. Em ambientes técnicos e operacionais, porém, ele começou a assumir outro papel — o de canal de visibilidade em tempo real. Essa mudança não aconteceu por moda, mas por necessidade. O problema de depender apenas de dashboards [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/quando-o-whatsapp-vira-canal-operacional-e-nao-so-meio-de-envio/">Quando o WhatsApp vira canal operacional (e não só meio de envio)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Durante muito tempo, o WhatsApp foi visto apenas como um canal de comunicação direta: mensagens, avisos, campanhas pontuais. Em ambientes técnicos e operacionais, porém, ele começou a assumir outro papel — o de <strong><a href="http://notifish.com/?utm_source=leonardo.dev" target="_blank" rel="noreferrer noopener nofollow">canal de visibilidade em tempo real</a></strong>.</p>



<p>Essa mudança não aconteceu por moda, mas por necessidade.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-o-problema-de-depender-apenas-de-dashboards">O problema de depender apenas de dashboards</h2>



<p>Sistemas modernos produzem dados o tempo todo: logs, eventos, erros, métricas, status de filas, integrações externas. Em teoria, tudo isso deveria ser acompanhado por dashboards bem configurados.</p>



<p>Na prática, dashboards só funcionam quando alguém está olhando para eles. Em incidentes reais, o que costuma acontecer é diferente: o problema aparece primeiro no efeito, não na métrica. Quando alguém percebe, o impacto já aconteceu.</p>



<p>É nesse ponto que canais ativos, como o WhatsApp, começam a fazer sentido.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-alertar-nao-e-o-mesmo-que-informar">Alertar não é o mesmo que informar</h2>



<p>Um erro comum ao levar dados para o WhatsApp é tentar transformar o canal em espelho do sistema: enviar tudo, o tempo todo. O resultado costuma ser o oposto do esperado — excesso de mensagens, ruído e alertas ignorados.</p>



<p>O valor real está em <strong>selecionar o que importa</strong>, formatar bem a mensagem e entregar no momento certo. Não é sobre volume, é sobre contexto.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-a-importancia-de-mensagens-legiveis">A importância de mensagens legíveis</h2>



<p><a href="https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/" type="post" id="2290">Alertas técnicos mal formatados são tão inúteis quanto a ausência deles</a>. Mensagens longas demais, payloads em JSON ou textos sem hierarquia não ajudam na tomada de decisão.</p>



<p>Em ambientes maduros, o WhatsApp recebe mensagens curtas, diretas e com contexto suficiente para entender:</p>



<ul class="wp-block-list">
<li>o que aconteceu</li>



<li>onde aconteceu</li>



<li>se exige ação imediata</li>
</ul>



<p>Sem isso, o canal perde credibilidade rapidamente.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-quando-a-simplicidade-vira-vantagem">Quando a simplicidade vira vantagem</h2>



<p>Algumas soluções optam por formatos extremamente estruturados, cheios de campos e metadados. Isso funciona bem para sistemas internos, mas não necessariamente para canais humanos.</p>



<p>Ferramentas como o <a href="http://notifish.com/?utm_source=leonardo.dev" type="link" id="http://notifish.com/?utm_source=leonardo.dev" target="_blank" rel="noreferrer noopener nofollow"><strong>Notifish</strong> </a>seguem uma abordagem mais simples: recebem uma mensagem já pronta para leitura, com um identificador básico e controle de entrega. Isso desloca a inteligência para quem envia, não para quem recebe.</p>



<p>Na prática, isso facilita integração com sistemas existentes sem exigir grandes adaptações.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-um-padrao-que-aparece-em-operacoes-reais">Um padrão que aparece em operações reais</h2>



<p>Em operações com volume significativo, o <a href="https://leonardonascimento.dev/blog/updown-io-receba-notificacao-no-whatsapp-caso-seu-site-fique-indisponivel/" type="post" id="164">WhatsApp </a>costuma ser usado para:</p>



<ul class="wp-block-list">
<li>alertas críticos de produção</li>



<li>falhas de integração externa</li>



<li>eventos que exigem ação humana</li>



<li>confirmações de processos assíncronos</li>
</ul>



<p>Ele não substitui logs, métricas ou ferramentas de observabilidade. Ele <strong>complementa</strong>, cobrindo o espaço entre o evento técnico e a reação humana.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-o-risco-de-transformar-alerta-em-ruido">O risco de transformar alerta em ruído</h2>



<p>Sempre que um novo canal é adicionado, surge o risco de exagero. Alertar tudo é quase tão ruim quanto não alertar nada.</p>



<p>Operações estáveis costumam ter regras claras:</p>



<ul class="wp-block-list">
<li>poucos tipos de alerta</li>



<li>mensagens bem definidas</li>



<li>identificação para evitar duplicidade</li>



<li>silêncio como padrão</li>
</ul>



<p>Quando o WhatsApp segue essa lógica, ele se mantém útil. Quando vira canal genérico, é rapidamente ignorado.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-integracao-como-parte-da-arquitetura-nao-como-atalho">Integração como parte da arquitetura, não como atalho</h2>



<p>Outro ponto importante é tratar a integração com WhatsApp como parte da arquitetura do sistema, e não como um remendo. Isso significa:</p>



<ul class="wp-block-list">
<li>decidir onde o alerta nasce</li>



<li>quem é responsável por enviá-lo</li>



<li>quando ele deve ser disparado</li>



<li>e quando <strong>não</strong> deve</li>
</ul>



<p>Sem esse cuidado, qualquer ferramenta vira apenas mais uma dependência.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-conclusao">Conclusão</h2>



<p>O WhatsApp deixou de ser apenas um meio de comunicação informal e passou a ocupar um espaço relevante em operações técnicas. Quando usado com critério, ele encurta o tempo entre o problema e a reação.</p>



<p>Ferramentas que respeitam essa lógica — simples na entrada, claras na saída — tendem a se encaixar melhor em sistemas reais. Não por prometerem mais, mas por <strong>atrapalharem menos</strong>.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/quando-o-whatsapp-vira-canal-operacional-e-nao-so-meio-de-envio/">Quando o WhatsApp vira canal operacional (e não só meio de envio)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/quando-o-whatsapp-vira-canal-operacional-e-nao-so-meio-de-envio/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como fazer o primeiro disparo na Evolution API</title>
		<link>https://leonardonascimento.dev/blog/como-fazer-o-primeiro-disparo-na-evolution-api/</link>
					<comments>https://leonardonascimento.dev/blog/como-fazer-o-primeiro-disparo-na-evolution-api/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Sat, 17 Jan 2026 22:06:00 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[api v2]]></category>
		<category><![CDATA[automação]]></category>
		<category><![CDATA[disparo de mensagem]]></category>
		<category><![CDATA[evolution api]]></category>
		<category><![CDATA[integrações]]></category>
		<category><![CDATA[whatsapp api]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2307</guid>

					<description><![CDATA[<p>Depois de instalar a Evolution API (via Orion), muita gente trava no mesmo ponto: “ok, está rodando… e agora?”.O primeiro disparo envolve 3 passos obrigatórios, sempre nessa ordem: Se pular qualquer um deles, não funciona. 1️⃣ Confirmar dados básicos da instalação Você precisa ter em mãos: Esses dois dados são usados em todas as chamadas. [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/como-fazer-o-primeiro-disparo-na-evolution-api/">Como fazer o primeiro disparo na Evolution API</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><a href="https://leonardonascimento.dev/blog/como-instalar-docker-portainer-e-evolution-api/" type="post" id="2304">Depois de instalar a Evolution API (via Orion)</a>, muita gente trava no mesmo ponto: <em>“ok, está rodando… e agora?”</em>.<br>O primeiro disparo envolve <strong>3 passos obrigatórios</strong>, sempre nessa ordem:</p>



<ol class="wp-block-list">
<li>criar a instância</li>



<li>conectar o WhatsApp (QR Code)</li>



<li>enviar a mensagem</li>
</ol>



<p>Se pular qualquer um deles, não funciona.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-1-confirmar-dados-basicos-da-instalacao">1️⃣ Confirmar dados básicos da instalação</h2>



<p>Você precisa ter em mãos:</p>



<ul class="wp-block-list">
<li><strong>Server URL</strong><br>Exemplo: <code>https://api.seudominio.com</code></li>



<li><strong>API Key global</strong> (gerada pelo Orion na instalação)</li>
</ul>



<p>Esses dois dados são usados em <strong>todas</strong> as chamadas.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-2-criar-a-instancia-obrigatorio">2️⃣ Criar a instância (obrigatório)</h2>



<p>Na Evolution API v2, <strong>não existe envio sem instância</strong>.</p>



<h3 class="wp-block-heading" id="h-endpoint">Endpoint</h3>



<pre class="wp-block-code"><code>POST /instance/create
</code></pre>



<h3 class="wp-block-heading" id="h-exemplo-com-curl">Exemplo com <code>curl</code></h3>



<pre class="wp-block-code"><code>curl -X POST https://api.seudominio.com/instance/create \
  -H "apikey: SUA_API_KEY_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "instanceName": "primeira-instancia"
  }'
</code></pre>



<h3 class="wp-block-heading" id="h-resposta-esperada">Resposta esperada</h3>



<p>Algo semelhante a:</p>



<pre class="wp-block-code"><code>{
  "instance": {
    "instanceName": "primeira-instancia",
    "status": "created"
  }
}
</code></pre>



<p>Se deu erro aqui, <strong>pare</strong>. O resto não vai funcionar.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-3-conectar-o-whatsapp-qr-code">3️⃣ Conectar o WhatsApp (QR Code)</h2>



<p>Depois da instância criada, você precisa <strong>conectar o número</strong>.</p>



<h3 class="wp-block-heading" id="h-gerar-qr-code">Gerar QR Code</h3>



<pre class="wp-block-code"><code>GET /instance/connect/{instanceName}
</code></pre>



<pre class="wp-block-code"><code>curl -X GET https://api.seudominio.com/instance/connect/primeira-instancia \
  -H "apikey: SUA_API_KEY_AQUI"
</code></pre>



<p>A resposta vem com o <strong>QR Code em base64</strong> ou link.</p>



<p>Abra no navegador ou use o <strong>manager</strong> do Orion:</p>



<pre class="wp-block-code"><code>https:&#47;&#47;api.seudominio.com/manager
</code></pre>



<p>Escaneie com o WhatsApp do celular.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="h-verificar-status-da-instancia">Verificar status da instância</h3>



<p>Antes de enviar mensagem, confirme que está conectada.</p>



<pre class="wp-block-code"><code>GET /instance/connectionState/{instanceName}
</code></pre>



<pre class="wp-block-code"><code>curl -X GET https://api.seudominio.com/instance/connectionState/primeira-instancia \
  -H "apikey: SUA_API_KEY_AQUI"
</code></pre>



<p>Status esperado:</p>



<pre class="wp-block-code"><code>{
  "state": "open"
}
</code></pre>



<p>Se não estiver <code>open</code>, <strong>não adianta tentar enviar mensagem</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-4-primeiro-disparo-de-mensagem-texto-simples">4️⃣ Primeiro disparo de mensagem (texto simples)</h2>



<p>Agora sim.</p>



<h3 class="wp-block-heading" id="h-endpoint-v2-para-texto">Endpoint v2 para texto</h3>



<pre class="wp-block-code"><code>POST /message/sendText/{instanceName}
</code></pre>



<h3 class="wp-block-heading" id="h-exemplo-real">Exemplo real</h3>



<pre class="wp-block-code"><code>curl -X POST https://api.seudominio.com/message/sendText/primeira-instancia \
  -H "apikey: SUA_API_KEY_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "number": "559999999999",
    "text": "Olá! Este é meu primeiro disparo pela Evolution API v2."
  }'
</code></pre>



<p>⚠️ <strong>Formato do número</strong></p>



<ul class="wp-block-list">
<li>Sempre com <strong>DDI + DDD + número</strong></li>



<li>Sem <code>+</code>, sem espaço, sem traço</li>
</ul>



<p>Exemplo válido:</p>



<pre class="wp-block-code"><code>5591999999999
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-5-o-que-acontece-se-nao-enviar">5️⃣ O que acontece se não enviar?</h2>



<p>Os erros mais comuns no primeiro disparo:</p>



<h3 class="wp-block-heading" id="h-instancia-nao-conectada">❌ Instância não conectada</h3>



<p>Resposta típica:</p>



<pre class="wp-block-code"><code>instance not connected
</code></pre>



<h3 class="wp-block-heading" id="h-numero-invalido">❌ Número inválido</h3>



<ul class="wp-block-list">
<li>faltou DDI</li>



<li>tem <code>+</code></li>



<li>tem espaço</li>
</ul>



<h3 class="wp-block-heading" id="h-api-key-errada">❌ API Key errada</h3>



<p>Resposta:</p>



<pre class="wp-block-code"><code>Unauthorized
</code></pre>



<h3 class="wp-block-heading" id="h-endpoint-errado-v1-v2">❌ Endpoint errado (v1 ≠ v2)</h3>



<p>Na v2:</p>



<pre class="wp-block-code"><code>/message/sendText/{instance}
</code></pre>



<p>Na v1 era diferente. Não misture.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-6-teste-rapido-pelo-manager-opcional">6️⃣ Teste rápido pelo Manager (opcional)</h2>



<p>Se quiser validar sem curl:</p>



<ol class="wp-block-list">
<li>Acesse: <code>https://api.seudominio.com/manager</code></li>



<li>Escolha a instância</li>



<li>Vá em <strong>Send Message</strong></li>



<li>Envie um texto simples</li>
</ol>



<p>Se funciona no manager e não via API, o problema é <strong>payload ou headers</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-7-proximos-disparos-possiveis-depois-do-primeiro">7️⃣ Próximos disparos possíveis (depois do primeiro)</h2>



<p>Depois que o texto simples funciona, você pode evoluir para:</p>



<ul class="wp-block-list">
<li>imagem</li>



<li>vídeo</li>



<li>áudio</li>



<li>botão</li>



<li>lista</li>



<li>disparos em massa</li>



<li>integração com Laravel, n8n, Notifish etc.</li>
</ul>



<p>Mas <strong>sempre valide texto primeiro</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-resumo-rapido-ordem-correta">Resumo rápido (ordem correta)</h2>



<p>1️⃣ criar instância<br>2️⃣ conectar WhatsApp<br>3️⃣ confirmar <code>state = open</code><br>4️⃣ enviar <code>sendText</code></p>



<p>Se seguir isso, <strong>funciona</strong>.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/como-fazer-o-primeiro-disparo-na-evolution-api/">Como fazer o primeiro disparo na Evolution API</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/como-fazer-o-primeiro-disparo-na-evolution-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Na minha máquina funciona. Vamos levar sua máquina para o usuário então</title>
		<link>https://leonardonascimento.dev/blog/na-minha-maquina-funciona-vamos-levar-sua-maquina-para-o-usuario-entao/</link>
					<comments>https://leonardonascimento.dev/blog/na-minha-maquina-funciona-vamos-levar-sua-maquina-para-o-usuario-entao/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Sat, 10 Jan 2026 21:35:00 +0000</pubDate>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Produção]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[ambiente de produção]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[produção]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2277</guid>

					<description><![CDATA[<p>Todo desenvolvedor já disse ou ouviu essa frase: “Na minha máquina funciona”. Em ambiente local, com poucos dados, sem concorrência real e sem dependências instáveis, quase tudo funciona. O problema é que produção não tem nada a ver com o seu computador. Quando alguém usa “funciona local” como argumento técnico, geralmente está ignorando o contexto [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/na-minha-maquina-funciona-vamos-levar-sua-maquina-para-o-usuario-entao/">Na minha máquina funciona. Vamos levar sua máquina para o usuário então</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Todo desenvolvedor já disse ou ouviu essa frase: <em>“Na minha máquina funciona”</em>. Em ambiente local, com poucos dados, sem concorrência real e sem dependências instáveis, quase tudo funciona. O problema é que <strong>produção não tem nada a ver com o seu computador</strong>.</p>



<p>Quando alguém usa “funciona local” como argumento técnico, geralmente está ignorando o contexto em que o sistema realmente vai operar. E é exatamente aí que os problemas começam.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Em local, você tem controle total. O banco está limpo, a latência é praticamente zero, não existem requisições concorrentes, não há retries, não há jobs acumulados, não há serviços externos oscilando. Você executa uma ação, olha o resultado e segue em frente. É um ambiente artificialmente perfeito.</p>



<p>Produção é o oposto disso.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>A primeira diferença aparece com <strong>concorrência</strong>. Localmente, você clica uma vez. Em produção, dezenas ou centenas de usuários fazem a mesma ação ao mesmo tempo. Jobs rodam em paralelo. Requests competem por recursos. Código que nunca apresentou problema começa a gerar condição de corrida, duplicidade de execução e dados inconsistentes. Nada disso aparece no teste local simples.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Outra diferença crítica é <strong>latência</strong>. Em local, chamadas HTTP e queries são praticamente instantâneas. Em produção, uma API externa pode demorar segundos para responder, ou responder de forma intermitente. Um banco pode ficar lento sob carga. Um cache pode expirar no pior momento. Código que assume resposta imediata funciona local, mas degrada ou trava em produção.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Existe também a questão do <strong>volume de dados</strong>. Local costuma ter poucos registros. Produção tem milhares ou milhões. Queries que pareciam inofensivas passam a consumir tempo e recursos. Loops simples viram gargalo. Processamentos que eram aceitáveis começam a estourar timeout. O problema não é o código “errado”, é o código <strong>não preparado para escala</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Dependências externas são outro ponto ignorado em ambiente local. Muitas vezes você testa com mock, sandbox ou serviço estável. Em produção, serviços externos falham, ficam lentos ou retornam dados inesperados. Se o sistema não foi desenhado para lidar com isso, o erro externo vira indisponibilidade interna.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Local também não expõe problemas de <strong>observabilidade</strong>. Em produção, quando algo dá errado, você precisa responder rápido: o que aconteceu, quando, com qual dado, em qual fluxo. Código que “funciona local” mas não gera logs úteis transforma qualquer incidente em uma investigação longa e cara.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Outro ponto comum é <strong>configuração e ambiente</strong>. Local costuma ter permissões amplas, cache limpo, variáveis simples. Produção tem múltiplos ambientes, secrets, variáveis diferentes, limites de recurso e regras de segurança. Código que assume configuração fixa funciona local e quebra fora dele.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Existe ainda o fator <strong>tempo</strong>. Local você testa agora. Produção roda por semanas ou meses. Vazamentos de memória, acúmulo de jobs, crescimento de filas e degradação progressiva só aparecem com o tempo. “Funciona local” raramente considera isso.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Nada disso significa que testar local não importa. Significa que <strong>teste local valida comportamento</strong>, não valida operação. Ele é necessário, mas está longe de ser suficiente.</p>



<p>Código pronto para produção é aquele que:</p>



<ul class="wp-block-list">
<li>lida bem com concorrência</li>



<li>assume latência e falha</li>



<li>escala com dados reais</li>



<li>é observável</li>



<li>se comporta de forma previsível sob estresse</li>
</ul>



<p>Sem isso, o “funciona local” vira apenas uma falsa sensação de segurança.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>“Funciona local” não é critério de qualidade. É apenas o primeiro degrau. Produção cobra decisões que local nunca vai cobrar: resiliência, previsibilidade e responsabilidade técnica.</p>



<p>Quando alguém entende isso, muda a forma de escrever código. Quando não entende, continua apagando incêndio e se perguntando por que algo que “funcionava perfeitamente” começou a falhar sem explicação.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/na-minha-maquina-funciona-vamos-levar-sua-maquina-para-o-usuario-entao/">Na minha máquina funciona. Vamos levar sua máquina para o usuário então</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/na-minha-maquina-funciona-vamos-levar-sua-maquina-para-o-usuario-entao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
