# Fernando Moreira Costa > Desenvolvedor de software e engenheiro de IA, do dado à produção. Construo software de ponta a ponta há 15 anos, da interface ao dado, e hoje coloco agentes de IA e produtos com IA em produção. Na Liquid AI, respondi pela esteira de dados de financiamento imobiliário de mais de 20 incorporadoras, onde reduzi de cerca de cinco dias para até 30 minutos o tempo de preparar uma base e entregá-la na pipeline. Sustentei essa operação com um framework próprio de desenvolvimento assistido por IA, com guard-rails de segurança e portões de qualidade obrigatórios. Antes disso, seis anos em produtos de alta escala, como Itaú Unibanco, Pipefy e Skyone, e open source desde 2012. ## About Construo o produto, a esteira de dados e o padrão de engenharia que fazem a IA entregar resultado medido em produção, e não só em demonstração. - Availability: open - Aberto a projetos de escopo fechado e a novas posições sêniores, CLT ou PJ. - Updated: 2026-10-07 - Stack: TypeScript, Python, React, Next.js, Astro, Node.js, AWS, Google Cloud, Rust, Go ## Results - 5 dias → 30 min para preparar uma base de cliente e entregá-la na pipeline: Liquid AI. De cerca de cinco dias para até 30 minutos, trocando a execução manual caso a caso por extração e pré-normalização automatizadas por API e assistidas por IA. - 20+ incorporadoras na esteira de dados que operei: Liquid AI. Bases de financiamento imobiliário que viram indicador dentro do produto. - 0% → 92% de cobertura em pipelines que rodavam em produção sem teste: Liquid AI. 920 casos escritos em dois pipelines, que chegaram a 84% e 92%, com gate de cobertura no CI e deploy bloqueado quando a suíte falha. - 4.800+ casos de teste protegendo a engine de pré-normalização: Liquid AI. Unitários, integração, regressão e paridade, contra quebra silenciosa a cada mudança de transformação de dados. - 15 anos construindo software, de agência a banco: Desde 2010, com seis anos em produtos de alta escala: Itaú Unibanco, Pipefy e Skyone. - 2012 o ano em que comecei a publicar open source: 476 seguidores e 122 repositórios públicos no GitHub, com ferramentas em Rust publicadas no crates.io. ## Services - **Produto de ponta a ponta**: Para quem precisa tirar um produto do papel sem montar um time inteiro. Interface, backend, banco e infraestrutura, da oportunidade à produção, com teste escrito antes do código. Proof: https://nandomoreira.dev/portfolio/bragstack - **IA e dados em produção**: Para quem tem dado chegando em formatos diferentes e processo manual travando a operação. Esteiras de dados e agentes que automatizam o repetitivo, com suíte de regressão protegendo cada mudança. Proof: https://nandomoreira.dev/portfolio/financial-normalization - **Padrão de engenharia com IA**: Para times que já usam agentes de código, mas sem padrão nem controle. Um fluxo de desenvolvimento assistido por IA com TDD obrigatório, portões de qualidade e guard-rails de segurança executáveis. Proof: https://nandomoreira.dev/lab/amnesia-claude-code ## Work history - **AI Engineer • Full Cycle Developer** at Liquid AI (2025-11-01 – 2026-09-30) Respondi pela esteira de dados que transforma as bases das incorporadoras clientes em indicadores dentro dos produtos da Liquid, e pelo framework de desenvolvimento assistido por IA que sustentava a entrega de software. - Reduzi de cerca de cinco dias para até 30 minutos o intervalo entre receber uma base e entregá-la pré-normalizada na pipeline, com extração e pré-normalização automatizadas por API e assistidas por IA. - Concebi e construí o Play Manager, produto interno que virou a fonte da verdade da operação, com fase, responsável, prazo e saúde de cada base visíveis em um só lugar para o time e para a liderança. - Cobri de testes dois pipelines que rodavam em produção sem nenhum teste automatizado, 920 casos levando a cobertura de 0% para 84% e 92%, com gate no CI e deploy bloqueado quando a suíte falha. - Construí o framework interno de desenvolvimento assistido por IA sobre Claude Code, com 106 automações, 34 comandos, 19 agentes especializados, TDD obrigatório por ferramenta e 21 regras invioláveis de segurança. - Orquestrei três CLIs de IA com papéis separados, sob a regra de que quem escreve não julga, e o orquestrador é o único que valida contra os portões e versiona. - **Gerente de Tecnologia** at Norte Marketing (2025-08-01 – 2025-10-31) Liderei a área de tecnologia como principal referência técnica da equipe, respondendo por arquitetura, desenho técnico, documentação e gestão das entregas. - Implantei cultura ágil com Scrum adaptado, integrando Jira, Bitbucket e Confluence para dar previsibilidade às entregas. - Automatizei versionamento e deploys em pipelines na AWS, com linters e testes automatizados como portão de qualidade. - Implementei preview environments por Pull Request, encurtando o ciclo de validação do QA. - **Senior Frontend Developer** at Skyone Solutions (2024-12-01 – 2025-04-30) Aplicações React para produtos digitais de uso diário por milhares de usuários. - Construí design system e biblioteca de componentes reutilizáveis, reduzindo retrabalho entre squads. - Otimizei performance com foco em Core Web Vitals, SEO técnico e acessibilidade. - Conduzi code review, defini padrões de desenvolvimento e mentorei pessoas desenvolvedoras júnior e pleno. - **Engenheiro de Software Sênior** at Itaú Unibanco (2022-04-01 – 2024-06-30) Produtos em microfrontends para as páginas não logadas do banco, na interseção entre Marketing e Tecnologia. - Implementei personalização e testes A/B com VWO e Salesforce Interaction Studio para o público não autenticado. - Elevei acessibilidade, performance e clareza das jornadas públicas, em ambiente de altíssimo volume de acesso e forte exigência regulatória. - Traduzi demanda de marketing em arquitetura frontend sustentável, junto aos times de negócio. - **Senior Fullstack Developer** at Risknow.ai (2020-06-01 – 2021-11-30) Dashboards de inteligência de dados aplicada à jornada de crédito imobiliário, integrando APIs, microserviços e bots de WhatsApp que encurtaram o ciclo de avaliação e financiamento de imóveis. - **Senior Frontend Developer** at MedPrev (2019-09-01 – 2020-02-29) Interfaces reativas em Vue.js e Nuxt.js consumindo REST e GraphQL. - **Senior Frontend Developer** at Trackmob (2019-03-01 – 2019-08-31) Dashboards em Vue.js sobre Ruby on Rails para ONGs acompanharem o impacto das campanhas em tempo real. - **Senior Web Developer** at Nossa Causa (2018-08-01 – 2019-03-31) Sites responsivos e acessíveis para ONGs, atuando também como UX e analista no planejamento das soluções. - **Senior Web Developer** at Workshop Agência & Escola (2017-10-01 – 2018-07-31) Sites responsivos e acessíveis em WordPress para clientes institucionais. - **Senior Frontend Developer e UX Designer** at LojasKD Móveis (2016-09-01 – 2017-10-31) E-commerce em Symfony consumindo microserviços em Node.js, Python e PHP, com pesquisa com usuários e testes A/B depois da promoção para UX Designer. - **Front-end Developer Pleno** at Pipefy (2016-01-01 – 2016-08-31) Iniciei a nova interface da plataforma de gestão de processos. - **Front-end Developer Pleno** at MalaPronta.com (2015-01-01 – 2015-09-30) Modernizei para responsivo um layout de cinco anos e reduzi a carga do servidor limpando e minificando CSS e JavaScript. - **Desenvolvedor web** at Agência WX, IBPT, Salsa:Mobion, Totalize e Agência CGDW (2010-11-01 – 2014-05-31) Início de carreira em PHP, MySQL, WordPress e Magento: sites institucionais, lojas virtuais, CMSs proprietários e um page builder drag-and-drop para WordPress. ## Education - Tecnólogo, Sistemas para Internet at Universidade Positivo (2015-01-01 – 2016-12-31) - Técnico, Informática at Colégio Estadual do Paraná (2010-01-01 – 2011-12-31) ## Projects ### ABRACCE - URL: https://nandomoreira.dev/portfolio/abracce - collection: portfolio - tech: TypeScript, React Router - status: discontinued - Site institucional de uma organização sem fins lucrativos, feito para explicar a causa e receber apoio sem depender de rede social alheia. Construído em React Router no modo full-stack, para a mesma base servir as páginas de hoje e uma área autenticada no futuro, sem trocar de stack no caminho. Problem: Uma organização sem fins lucrativos precisava de presença própria para explicar a causa e receber apoio, sem depender de rede social alheia. Decisions: React Router em modo full-stack, para a mesma base servir páginas estáticas hoje e área autenticada depois, sem troca de stack no meio do caminho. Outcome: Ficou no ar em 2025. O domínio saiu do ar e o repositório é fechado, então não há link a oferecer. ### AI Bar - URL: https://nandomoreira.dev/lab/noctalia-aibar - collection: lab - tech: QML, JavaScript, Noctalia Shell, Vitest - Plugin para o Noctalia Shell que mostra na barra quanto do plano do Claude Code e do Grok já foi usado: a porcentagem da janela mais crítica, o tempo até ela reiniciar e uma barra de progresso. No painel, cada janela aparece com o ritmo de uso, adiantado ou atrasado em relação ao tempo que passou. Problem: Saber quanto do plano de uso do Claude Code e do Grok ainda restava exigia abrir uma página de cada serviço, e o limite costumava aparecer só quando já tinha estourado, no meio do trabalho. Decisions: Plugin do próprio shell, na barra que já fica à vista, seguindo a arquitetura do Daybar: a lógica toda em funções JavaScript puras testadas com Vitest, e o QML só como tela. As credenciais das CLIs são apenas lidas, nunca gravadas, copiadas ou renovadas, e o token vai só no cabeçalho da requisição. Uma requisição que falha mantém o último dado bom marcado como desatualizado, em vez de esvaziar a barra. O ritmo compara a porcentagem usada com a porcentagem do tempo que já passou na janela. Endpoints e armadilhas vieram do ai-usagebar, do Fabio Akita, sem reaproveitar o código. Outcome: Uso próprio no meu desktop com CachyOS, publicado em licença MIT, com 36 testes. Avisa uma vez quando uma janela passa de 97%. Testado no Noctalia 4.7.7; o port para o Noctalia v5 está planejado. - Repo: https://github.com/nandomoreirame/noctalia-aibar ### Amnesia - URL: https://nandomoreira.dev/lab/amnesia-claude-code - collection: lab - tech: Python, Claude Code - Camada de memória persistente e determinística para o Claude Code. Merge, deduplicação e validação saem do modelo e vão para um CLI em Python, então o resultado é o mesmo em toda execução e o agente para de responder com um dado lembrado errado. Uso diário no meu próprio fluxo de trabalho. Problem: Memória de agente delegada ao próprio modelo erra em merge e deduplicação, e o erro só aparece quando o agente já respondeu com o dado errado. Decisions: Operações de merge, dedup e validação num CLI Python, fora do modelo. O agente chama o CLI; o resultado é o mesmo em toda execução. Outcome: Uso próprio diário no fluxo de trabalho com Claude Code. Sem tração pública: o repositório é aberto e não tem estrelas. - Repo: https://github.com/nandomoreirame/amnesia-claude-code ### Ateliê éh Pique - URL: https://nandomoreira.dev/portfolio/atelie-eh-pique - collection: portfolio - tech: TypeScript, WordPress, PHP - status: discontinued - Loja de artes digitais para máquinas de corte, que tirou do atendimento manual a venda de cada arquivo. Vitrine e painel ficam separados, para a autora publicar sem depender de quem desenvolveu, e o painel roda num tema WordPress próprio em vez de uma plataforma de loja com mensalidade. Problem: Um ateliê de artes digitais para máquinas de corte vendia arquivo por atendimento manual, refazendo o mesmo envio a cada pedido. Decisions: Vitrine e painel separados, para a autora publicar sem depender de quem desenvolveu. Tema WordPress próprio no painel, em vez de plataforma de loja fechada, pelo custo mensal. Outcome: Ficou no ar durante 2025. Site e painel foram desligados; o repositório é fechado, então não há link a oferecer. ### BragStack - URL: https://nandomoreira.dev/portfolio/bragstack - collection: portfolio - tech: Next.js, TypeScript, Firebase, IA generativa - Registro de conquistas profissionais em dez segundos, em texto livre, com a IA estruturando tudo no formato STAR na hora de gerar o brag document. É um PWA mobile-first, porque a conquista acontece longe do editor, e está no ar em bragstack.app. Problem: Quem precisa de um brag document na avaliação não lembra o que fez seis meses antes, e registrar no momento custa mais atenção do que a conquista merece. Decisions: Captura em texto livre de dez segundos, com o custo de estruturar jogado para a IA na hora de gerar. PWA mobile-first porque a conquista acontece longe do editor. Outcome: No ar em bragstack.app. Repositório fechado, então a evidência é o produto rodando, não o código. - Live: https://bragstack.app ### CoachBot - URL: https://nandomoreira.dev/lab/coachbot-cli - collection: lab - tech: Shell, JSON - Coach antimotivacional para o terminal: a cada shell aberto, uma frase sarcástica num balão, dita por um robozinho em pixel art. São mais de cem frases em inglês e outras tantas em português, e instala com uma linha só. Problem: Frase motivacional no terminal é um clichê que ninguém lê depois do segundo dia. A versão sarcástica faz o contrário: arranca um sorriso justamente porque não leva o dia a sério. Decisions: Um script de shell sem dependência além do que já existe no sistema, com as frases em JSON separadas por idioma, para acrescentar uma língua sem tocar no código. O idioma sai de uma flag ou da variável COACHBOT_LANG, e o instalador de uma linha coloca tudo em ~/.local/bin. Funciona em bash, zsh, fish e PowerShell. Outcome: Projeto pequeno e de humor, em uso no meu próprio terminal. Duas estrelas no GitHub. - Repo: https://github.com/nandomoreirame/coachbot-cli ### Croonos Multi-Track - URL: https://nandomoreira.dev/portfolio/croonos - collection: portfolio - tech: Next.js, TypeScript - status: discontinued - Rastreamento de tempo e gestão de projetos para quem atende vários clientes ao mesmo tempo e perde a conta de onde as horas foram. Monorepo em Next.js, com rastreador e painel compartilhando os tipos do domínio, e registro por projeto desde o início, porque o dado que falta na hora não volta. Problem: Quem atende vários projetos ao mesmo tempo perde a conta de onde as horas foram, e reconstruir isso no fim do mês depende de memória. Decisions: Monorepo, para o rastreador e o painel compartilharem os tipos do domínio em vez de sincronizar contrato por API. Registro por projeto desde o início, e não relatório derivado depois, porque o dado que falta na hora não volta. Outcome: Ficou no ar no fim de 2025. Foi descontinuado e o repositório é fechado, então não há link a oferecer. ### Daybar - URL: https://nandomoreira.dev/lab/noctalia-daybar - collection: lab - tech: QML, JavaScript, Noctalia Shell, Google Calendar - Plugin para o Noctalia Shell que reúne o dia numa barra: um campo de captura rápida que entende texto livre ("comprar pão amanhã 9h" vira tarefa, "/e reunião sexta 15h-16h" vira evento no Google Calendar), além de checklist de hoje, pomodoro e timer (que também abrem numa janela própria ou fixos num canto da tela), favoritos com prévia da página e notas em Markdown. Problem: Registrar uma tarefa, um compromisso, um link ou uma ideia exigia abrir um app diferente para cada um e sair do que eu estava fazendo no desktop. Decisions: Plugin do próprio shell, em QML, em vez de um app à parte: tudo abre por atalho, a partir da barra. A captura identifica o tipo pelo prefixo (/e evento, /l lembrete, /n nota), por uma URL ou por uma conta. O Google Calendar é lido e escrito pelo khal e sincronizado pelo vdirsyncer, com as credenciais OAuth guardadas no keyring do sistema e não em arquivo. O pomodoro e o timer dividem a mesma aba e só um conta por vez: começar um pausa o outro, sem perder o tempo que faltava. Os dois também respondem à captura (/t 10m chá inicia um timer, /p inicia ou pausa o pomodoro) e saem do painel com um clique, numa janela do Niri ou num relógio pequeno fixo no canto da tela. Outcome: Uso próprio no meu desktop com CachyOS e Niri, publicado em licença MIT. Testado no Noctalia 4.7.7; ainda não roda no Noctalia v5, que tem outro sistema de plugins, e o port está planejado. - Repo: https://github.com/nandomoreirame/noctalia-daybar ### Desktop Sticky Notes - URL: https://nandomoreira.dev/lab/noctalia-desktop-sticky-notes - collection: lab - tech: QML, JavaScript, Noctalia Shell, Markdown, Vitest - Plugin para o Noctalia Shell que prende notas adesivas na área de trabalho como widgets: cada nota pode ser arrastada e redimensionada, tem cor de post-it e texto em Markdown, abre um editor ao clique e pode ficar ligada a um arquivo .md no disco, atualizando quando o arquivo muda. Problem: Lembretes rápidos ficavam espalhados entre arquivos e apps, longe da tela onde eu trabalho, e o Noctalia não tinha notas fixadas na própria área de trabalho. Decisions: Cada nota é uma instância de widget de desktop, com texto, cores, tamanho, posição e escala próprios, salvos nas configurações do Noctalia para sobreviver ao reinício do shell. O clique abre um painel com foco de teclado, porque um widget de desktop não recebe digitação. Uma nota pode apontar para um arquivo Markdown, que vira a fonte da verdade. A lógica em JavaScript é coberta por testes no Vitest; o renderizador de Markdown e o layout do editor vêm do plugin sticky-notes de sapjax, também MIT. Outcome: MVP funcionando no meu desktop, testado no Noctalia 4.7.7, em inglês e português. Publicado em licença MIT e ainda não enviado ao registro de plugins do Noctalia. - Repo: https://github.com/nandomoreirame/noctalia-desktop-sticky-notes ### Encantos Brincantes - URL: https://nandomoreira.dev/portfolio/encantos-brincantes - collection: portfolio - tech: Svelte, TypeScript - Vitrine de recursos lúdicos para educação infantil, que levou para a web uma venda que dependia de mensagem direta. Feita em Svelte com renderização estática, porque o conteúdo muda por lote e não por visita, o que mantém a hospedagem perto de custo zero. No ar em encantosbrincantes.com.br. Problem: Uma especialista em educação infantil vendia recursos lúdicos por mensagem direta, sem vitrine própria, o que limitava o alcance ao contato pessoal. Decisions: Svelte com renderização estática, porque o conteúdo muda por lote e não por visita, e o custo de hospedagem precisa ficar perto de zero. Sem CMS: a atualização passa pelo repositório, o que troca conveniência por não manter um painel para uma autora só. Outcome: No ar em encantosbrincantes.com.br desde o fim de 2025. Repositório fechado, então a evidência é o site publicado. - Live: https://www.encantosbrincantes.com.br ### FlipClock - URL: https://nandomoreira.dev/lab/flipclock-app - collection: lab - tech: Go, Fyne, OpenGL - Relógio de flip para o desktop, feito em Go com Fyne, com animação de virada em duas fases, modo tela cheia e um modo protetor de tela que cobre todos os monitores conectados. A fonte vai embutida no binário, então o app roda sem depender de nenhum arquivo externo. Problem: Os relógios de flip para desktop costumam ser página web aberta numa aba ou app pesado de outra plataforma. Eu queria um binário pequeno, nativo, que ficasse na bandeja e virasse protetor de tela em todos os monitores. Decisions: Go com Fyne, para um binário único sem runtime e com a mesma base em Linux e Windows. A fonte Bebas Neue vai embutida no executável, para o visual não depender do sistema. No modo protetor de tela, cada monitor ganha a própria janela, todas sincronizadas no mesmo segundo e fechadas juntas por qualquer tecla. No Wayland quem posiciona janela é o compositor, e o README documenta essa limitação em vez de escondê-la. Outcome: Duas releases publicadas, com pacotes .deb e .zip para Linux (x86_64 e ARM64) e .zip para Windows. Uso próprio no desktop. Três estrelas no GitHub, o que é interesse pontual e não tração. - Repo: https://github.com/nandomoreirame/flipclock-app ### FlipClock ASCII Screensaver - URL: https://nandomoreira.dev/lab/flipclock-screensaver-ascii - collection: lab - tech: Python, Shell, Hyprland - Protetor de tela para Hyprland que desenha a hora em ASCII grande dentro de um terminal em tela cheia, um por monitor, com transições do Terminal Text Effects a cada minuto. Entra pelo hypridle quando a máquina fica ociosa e sai no primeiro movimento. Problem: O Hyprland não tem protetor de tela, só bloqueio. Eu queria algo que aparecesse quando a máquina fica ociosa, combinasse com o terminal e não exigisse um app gráfico a mais rodando. Decisions: Um terminal em tela cheia por monitor, em vez de uma janela gráfica: o relógio é texto renderizado com pyfiglet, e as transições vêm do Terminal Text Effects, opcional. Três scripts pequenos separam as responsabilidades: detectar monitores e terminal, abrir uma janela em cada um, desenhar o quadro. A integração é pelo hypridle, e um arquivo de estado desliga o protetor sem desinstalar nada. Outcome: Uso próprio no desktop, com testes em pytest para o renderizador e em bats para os scripts de shell. Suporta ghostty, alacritty e kitty. - Repo: https://github.com/nandomoreirame/flipclock-screensaver-ascii ### Forja - URL: https://nandomoreira.dev/lab/forja - collection: lab - tech: Electron, React, TypeScript - Cliente desktop que reúne Claude Code, Codex e Gemini numa só interface, para não perder contexto alternando entre três terminais. Feito em Electron, React e TypeScript, com xterm.js para o terminal e uma camada de adaptação por CLI em vez de impor um protocolo comum às três. É o meu cliente principal no dia a dia. Problem: Alternar entre três CLIs de agente em terminais separados custa contexto a cada troca, e nenhuma delas mostra o estado das outras. Decisions: Começou em Tauri e Rust, pelo peso do binário. Em março de 2026 migrou para Electron: o terminal de cada sessão é um PTY, e gerenciar PTY pelo Node.js ficou mais simples e com um ecossistema maior do que pelo backend em Rust. Uma camada de adaptação por CLI, em vez de um protocolo comum imposto às três. Outcome: 11 estrelas no GitHub e uso diário próprio como cliente principal. - Repo: https://github.com/nandomoreirame/forja - Live: https://forja.web.app ### Forja Plugins - URL: https://nandomoreira.dev/lab/forja-plugins - collection: lab - tech: TypeScript, Vite, pnpm, Vitest - Registro oficial e monorepo de plugins do Forja: relógio, Pomodoro e tarefas em Markdown, sobre um SDK compartilhado com tipos da API de plugins. Cada plugin declara as permissões que usa, e um script gera o registro que o Forja consulta para instalar. Problem: O Forja precisava crescer sem que cada recurso novo entrasse no núcleo do app. Um sistema de plugins resolve isso só se houver plugins de verdade exercitando a API, e um jeito de distribuí-los. Decisions: Monorepo com pnpm, um plugin por pasta e um SDK compartilhado, para todos falarem a mesma API tipada. Cada plugin declara num manifest as permissões que pede (tema, notificações, leitura e escrita de arquivo), e um script valida os manifests antes do build. Os estilos usam só as variáveis CSS do Forja, para o plugin acompanhar o tema do app. O registro é um JSON gerado e publicado no GitHub Pages, com o link de download de cada versão. Outcome: Três plugins publicados, com vinte releases ao todo e testes em Vitest. O Pomodoro e as tarefas em Markdown aparecem na própria tela do Forja. - Repo: https://github.com/nandomoreirame/forja-plugins ### Gistbar - URL: https://nandomoreira.dev/lab/noctalia-gistbar - collection: lab - tech: QML, JavaScript, Noctalia Shell, GitHub CLI, Vitest - Plugin para o Noctalia Shell que traz os meus gists do GitHub para a barra: busca por descrição, nome de arquivo, linguagem e conteúdo, cópia pelo teclado, gist novo a partir da área de transferência, prévia e edição, tudo pelo gh CLI. Problem: São 95 gists acumulados, e achar um trecho exigia abrir o GitHub, lembrar em qual gist ele estava e copiar à mão. Criar um gist novo com o que estava na área de transferência também passava pelo navegador. Decisions: Plugin do próprio shell, na mesma arquitetura e no mesmo kit visual do Daybar: a lógica em funções JavaScript puras testadas com Vitest, o QML só como tela. Todo acesso ao GitHub passa pelo gh CLI, então o plugin nunca toca num token, e o conteúdo vai por stdin, nunca pela linha de comando. A busca ignora acento e cobre o conteúdo, que é o motivo de um gist existir, mas descrição e nome de arquivo pesam mais. O conteúdo fica em cache local com permissão 0600 e só é baixado de novo quando o gist muda. Gist novo nasce secreto, porque publicar por engano é a pior falha possível aqui. Outcome: Uso próprio no meu desktop com CachyOS, publicado em licença MIT, com 151 testes. Testado no Noctalia 4.7.7; o port para o Noctalia v5 está planejado. - Repo: https://github.com/nandomoreirame/noctalia-gistbar ### grab-sh - URL: https://nandomoreira.dev/lab/grab-sh - collection: lab - tech: Shell, Hyprland, Wayland - Script mínimo de screenshot para Wayland e Hyprland que copia direto para a área de transferência, sem salvar arquivo no disco. Dois atalhos de teclado: tela inteira ou uma área escolhida com a mira. Problem: As ferramentas de screenshot salvam um arquivo a cada captura, quando quase sempre o destino é colar a imagem numa conversa ou num documento. O resultado é uma pasta cheia de imagens que ninguém abre de novo. Decisions: Compor três ferramentas que já existem no Wayland (grim para capturar, slurp para escolher a área, wl-clipboard para copiar) em vez de escrever uma nova. Nada vai para o disco: cada captura sobrescreve a área de transferência. O instalador cria um link em ~/.local/bin, e dois binds do Hyprland fazem o resto. Outcome: Uso diário no meu desktop. Uma release publicada. É pequeno de propósito. - Repo: https://github.com/nandomoreirame/grab-sh ### Hypr Switcher - URL: https://nandomoreira.dev/lab/hypr-switcher - collection: lab - tech: Rust, Wayland, Hyprland - Alt+Tab visual para o Hyprland, que não traz um alternador de janelas próprio. Em Rust sobre a camada layer-shell do Wayland, para o overlay aparecer acima de tudo sem roubar o foco, e com a latência de abertura como critério principal, porque é ela que decide se a ferramenta é usada ou abandonada. Problem: O Hyprland não traz um alternador visual de janelas, e trocar entre workspaces às cegas custa mais tempo que a troca em si. Decisions: Camada layer-shell do Wayland em vez de uma janela comum, para o overlay aparecer acima de tudo sem roubar foco. Rust pela latência de abertura, que é o que decide se a ferramenta é usada ou abandonada. Outcome: Uso próprio diário no ambiente Hyprland. Três estrelas, a maior contagem entre as ferramentas de sistema do acervo recente. - Repo: https://github.com/nandomoreirame/hypr-switcher ### job-radar - URL: https://nandomoreira.dev/lab/job-radar - collection: lab - tech: Python, pytest, Discord, systemd - Varre sites de vagas, descarta o que não combina com o seu perfil e publica as compatíveis no Discord, rodando sozinho algumas vezes por dia. Python puro, sem dependências: filtros duros decidem o que passa, uma pontuação de 0 a 100 ordena o resto, e as qualificações saem do próprio currículo em markdown. Problem: Procurar vaga é rolar listas longas em vários sites, repetindo os mesmos cortes de senioridade, modalidade e salário a cada visita, e reencontrando a mesma vaga anunciada em duas fontes. Decisions: Filtros duros e pontuação separados: o filtro responde "eu me candidataria a isso?" e descarta, a pontuação só ordena o que sobrou, para uma vaga ruim não subir somando critérios secundários. As qualificações vêm do currículo, e não de uma lista paralela que envelheceria escondida. Quando nada passa, o canal recebe o funil da varredura, para silêncio nunca confundir "não achou" com "não rodou". Os testes de conector usam respostas reais gravadas, e os conectores respeitam robots.txt e pausam entre requisições. Outcome: Publicado no GitHub, com conectores para Gupy, repositórios de vagas no GitHub, Programathor e Sólides. Roda por timer do systemd ou cron. - Repo: https://github.com/nandomoreirame/job-radar ### Mousai - URL: https://nandomoreira.dev/portfolio/mousai - collection: portfolio - tech: Next.js, TypeScript - Mood boards minimalistas para artistas, compartilháveis por um código curto e sem exigir cadastro de quem visita. A interface sai do caminho para o acervo ser o centro, e não a ferramenta. Produto próprio em produção, no ar em mousai.gallery. Problem: Compartilhar um mood board costuma exigir conta no visitante ou um link preso a uma ferramenta genérica, e o ruído da plataforma compete com o material. Decisions: Boards organizados por autor, acessíveis por código curto, sem cadastro do visitante. UI minimalista para o acervo ser o centro, não a chrome da app. Outcome: No ar em mousai.gallery. Produto próprio em produção; o domínio é a evidência. - Live: https://mousai.gallery ### Normalização de dados financeiros - URL: https://nandomoreira.dev/portfolio/financial-normalization - collection: portfolio - tech: Python, DDD, Arquitetura hexagonal - status: confidential - Serviço que normaliza os dados financeiros heterogêneos das incorporadoras atendidas pela Liquid AI, mais de 20 bases ativas. A regra de cada incorporadora entra como adaptador numa arquitetura hexagonal, e não como desvio no núcleo. Reduziu de cerca de cinco dias para até 30 minutos o preparo de uma base, protegido por mais de 4.800 casos de teste. Problem: Cada incorporadora entrega dado financeiro num formato próprio, e a normalização manual não acompanha o número de bases ativas. Decisions: Domain-Driven Design com arquitetura hexagonal, para a regra de cada incorporadora entrar como adaptador e não como ramificação no núcleo. API Python de propósito único, com o frontend em repositório separado. Outcome: Em produção na Liquid AI, sobre as bases de mais de 20 incorporadoras. O intervalo entre receber uma base e entregá-la pré-normalizada na pipeline caiu de cerca de cinco dias para até 30 minutos, e uma suíte de mais de 4.800 casos de teste (unitários, integração, regressão e paridade) protege cada mudança de transformação contra quebra silenciosa. O código e os nomes das incorporadoras não são públicos. ### Plataforma de data insights - URL: https://nandomoreira.dev/portfolio/data-insights-platform - collection: portfolio - tech: Node.js, TypeScript, IA generativa - status: confidential - Plataforma de análise e transformação de dados com IA generativa, em produção paga na Liquid AI. Leva a IA para dentro do fluxo de análise, no lugar de dashboards estáticos que envelhecem a cada pergunta do negócio, e separa orquestração de execução para o modelo nunca ser o único caminho de confiar no resultado. Problem: Times de dados passam tempo demais em transformações repetitivas e em relatórios que mudam a cada pergunta do negócio. Decisions: Plataforma em Node.js com IA generativa no fluxo de análise, em vez de só dashboards estáticos. Separação entre orquestração e execução para o modelo não virar o único caminho de confiar no resultado. Outcome: Em produção paga na Liquid AI. O código e as métricas comerciais não são públicos. Este case amarra o bloco profissional ao posicionamento de IA em produto. ### PortfolioSnap - URL: https://nandomoreira.dev/portfolio/portfoliosnap - collection: portfolio - tech: Next.js, TypeScript, Google Gemini - Registro de atividades para professores de educação infantil, feito em segundos no momento da atividade, com a IA gerando o relatório pedagógico do mês já alinhado à BNCC. O alinhamento acontece na geração, então o professor não precisa saber o código da habilidade na hora. No ar em portfoliosnap.com.br. Problem: Professor de educação infantil registra atividade no fim do dia, quando já não lembra o detalhe, e o relatório mensal alinhado à BNCC é escrito à mão, turma por turma. Decisions: Registro curto no momento da atividade, com o custo de estruturar jogado para a geração do relatório. O alinhamento à BNCC entra na geração, não na captura, para o professor não precisar conhecer o código da habilidade na hora. Outcome: No ar em portfoliosnap.com.br. O domínio .app do mesmo produto está com o certificado quebrado, então a evidência é o .com.br. Repositório fechado. - Live: https://www.portfoliosnap.com.br ### rdo-solo - URL: https://nandomoreira.dev/lab/rdo-solo - collection: lab - tech: Rust, Ratatui, Shell, iptables, Next.js - Controlador de sessão solo para Red Dead Online e GTA Online, que bloqueia o tráfego peer-to-peer do jogo no gateway Linux por onde o console passa. Começou como script de iptables e ganhou uma TUI em Rust, com jogadores na sessão e GeoIP, e um painel web para ligar e desligar o modo solo pelo celular. Problem: Ficar sozinho numa sessão pública do jogo dependia do "tic-tac", desligar e religar o cabo de rede na hora certa, que é manual, impreciso e precisa ser repetido a cada sessão. Decisions: O bloqueio acontece no gateway, e não no console nem num PC: todo o tráfego do console passa por ali, então derrubar as portas UDP de P2P (6672 e 61455-61458) basta, e missões privadas do bando continuam funcionando. O valor está na topologia, não no binário. A TUI em Rust é compilada estática (musl) e enviada por SSH; o painel web em Next.js usa PIN e sessão assinada e foi pensado para rede local ou Tailscale, nunca para a internet aberta. Outcome: Ferramenta pessoal extraída de um dotfiles privado e publicada como está, em licença MIT. O próprio README avisa que bloquear o tráfego do jogo pode violar os termos de serviço da Rockstar e Take-Two. - Repo: https://github.com/nandomoreirame/rdo-solo ### Seu Ateliê Aqui - URL: https://nandomoreira.dev/portfolio/seu-atelie-aqui - collection: portfolio - tech: TypeScript, React - status: discontinued - Plataforma de anúncio de ateliês por proximidade geográfica, para quem procura um ateliê perto de casa e para quem hoje depende de grupo de mensagem para ser encontrado. A busca por distância é o eixo da navegação, e não um filtro secundário, porque é ela que decide a escolha nesse mercado. Problem: Quem procura um ateliê perto de casa não tem onde buscar por localização, e quem anuncia depende de grupo de mensagem para ser encontrado. Decisions: Busca por proximidade como eixo da navegação, e não como filtro secundário, porque a distância é o critério que decide a escolha nesse mercado. Outcome: Chegou a ficar no ar no fim de 2025. Foi desligada e o repositório é fechado, então não há link a oferecer. ### Sudadhara - URL: https://nandomoreira.dev/portfolio/sudadhara - collection: portfolio - tech: TypeScript, React - status: discontinued - Site institucional de uma terapeuta autônoma, que explica o método antes do primeiro contato em vez de deixar toda a explicação para a conversa inicial. Página única, com o contato direto logo depois do método e sem formulário nem agenda integrada, porque o volume de atendimentos não justificava a manutenção. Problem: Uma terapeuta autônoma dependia de indicação boca a boca e não tinha onde explicar o método antes do primeiro contato, o que jogava toda a explicação para a conversa inicial. Decisions: Página única com o método explicado antes da chamada para contato, em vez de um site de várias páginas que ninguém percorreria. Contato direto, sem formulário nem agenda integrada, porque o volume não justificava a manutenção. Outcome: Ficou no ar em 2025 sob o domínio próprio, que saiu do ar. O repositório é fechado, então não há link a oferecer. ### Tumodori - URL: https://nandomoreira.dev/lab/tumodori - collection: lab - tech: Rust, Ratatui - Pomodoro de terminal com dígitos grandes, legíveis de longe sem aproximar do monitor. Feito em Rust com Ratatui, para o cronômetro viver no mesmo lugar que o trabalho, e com os dígitos desenhados em bloco, para o tamanho não depender da fonte configurada no terminal de quem usa. Problem: Um cronômetro em janela de terminal comum exige aproximar do monitor para ler, o que quebra o foco que a técnica existe para proteger. Decisions: Ratatui em vez de uma GUI, para o cronômetro viver no mesmo lugar que o trabalho. Dígitos desenhados em bloco, não a fonte do terminal, para o tamanho não depender da configuração de quem usa. Outcome: Uso próprio diário. Duas estrelas no GitHub, o que é interesse pontual e não tração. - Repo: https://github.com/nandomoreirame/tumodori ## Posts - [Scratchpad no Niri: janelas que somem e voltam com um atalho](https://nandomoreira.dev/scratchpad-no-niri-janelas-que-somem-com-um-atalho): O Niri não sabe minimizar janela. Um script de 199 linhas e um workspace escondido fazem o WhatsApp, o Obsidian e o YouTube aparecerem e sumirem com uma tecla, e o Discord, o Spotify e o LocalSend voltarem para a bandeja. - [espanso: a substituição de texto do iPhone, agora no meu Linux](https://nandomoreira.dev/espanso-substituicao-de-texto-no-linux): Usei a Substituição de texto do macOS por anos e ainda uso no iPhone todo dia. No CachyOS com Niri, o espanso faz o mesmo em qualquer campo de texto, depois de três ajustes que a documentação não conta. - [De cinco dias para trinta minutos: IA numa esteira de ETL](https://nandomoreira.dev/de-cinco-dias-para-trinta-minutos): Como a preparação de uma base de dados passou de quase uma semana de trabalho manual para meia hora: automação por API, IA onde ela ajuda, testes onde ela pode errar e o prazo como regra do produto. - [job-radar: parei de rolar lista de vaga e deixei o Python descartar por mim](https://nandomoreira.dev/job-radar-radar-de-vagas-em-python-puro): Sete fontes de vagas, filtros que descartam antes da nota, o currículo como lista de qualificações e um canal do Discord que recebe só o que sobrou. Sem nenhuma dependência para rodar, e com o código aberto. - [Sem JavaScript no browser: criei um analytics para o meu site e acompanho pelo terminal, em Rust](https://nandomoreira.dev/analytics-sem-script-medindo-no-servidor-e-lendo-no-terminal): Eu queria só o básico de analytics, sem injetar script no site e sem mandar dado de visitante para ninguém. Acabou virando um middleware, um pixel de 1×1, um cookie que se chama __session e uma TUI em Rust. - [Meu estudo sobre as sessões do Red Dead Online: P2P, relays da Rockstar e o NAT duplo que eu mesmo criei](https://nandomoreira.dev/sessoes-do-red-dead-online-p2p-relays-e-nat-duplo): Passei dez dias olhando o tráfego do meu Xbox para entender como uma sessão do Red Dead Online se forma. Aprendi a separar jogador de relay numa captura, descobri que o meu gateway tinha derrubado o tipo de NAT para Moderado e que esconder o IP de casa custa um ajuste de MTU. - [rdo-solo: Red Dead Online sozinho pelo gateway de casa, agora com código aberto](https://nandomoreira.dev/rdo-solo-red-dead-online-sozinho-pelo-gateway): Abri o rdo-solo, o controlador que me deixa sozinho numa sessão pública de Red Dead Online no Xbox. O console passa por um gateway Linux, o gateway derruba o P2P do jogo, e dá para ligar e desligar pelo terminal, por uma TUI em Rust ou pelo celular. - [Memória para agentes: um backbone em quatro camadas](https://nandomoreira.dev/memoria-para-agentes-em-4-camadas): Como o Claude Code lembra decisões entre sessões sem carregar tudo no contexto: o que é sempre lido, o que só entra quando alguém pergunta, e a migração que só terminou quando um portão deixou. - [Criei quatro plugins para o Noctalia 100% com IA no meu CachyOS](https://nandomoreira.dev/criei-quatro-plugins-para-o-noctalia-100-com-ia-no-meu-cachyos): Quatro plugins para a barra e a área de trabalho do Noctalia: captura rápida e agenda, uso do plano do Claude Code e do Grok, gists do GitHub e notas adesivas. Todos feitos com IA, no fluxo RPI, e o que mais deu trabalho foi a interface. - [Fluxo RPI com três agentes: o Claude Code planeja, o Grok implementa e o Codex revisa](https://nandomoreira.dev/fluxo-rpi-claude-code-grok-codex): Pesquisa e plano antes de qualquer feature, como eu já trabalhava. O Claude Code conduz, o Grok escreve, o Codex revisa, e o teste vem antes do código mesmo quando isso deixa a IA mais lenta. - [Como eu construí meu novo site em 2026 que conversa com IA via MCP](https://nandomoreira.dev/como-construi-meu-site-que-conversa-com-ia-via-mcp): Casa de ferreiro, espeto de pau: um engenheiro de IA sem site que conversa com IA. Como reconstruí o meu, com servidor MCP, versão para máquina de cada página e sete portões automatizados. - [Customizando mensagem da tag noscript no Gatsby](https://nandomoreira.dev/customizando-a-mensagem-noscript-no-gatsby): Nesse artigo vou explicar como customizar a mensagem da tag noscript usando o recurso do próprio Gatsby para alterar o HTML base da aplicação. - [Como está você agora e como estará daqui 30 anos?](https://nandomoreira.dev/como-esta-voce-agora-e-como-estara-daqui-30-anos): Todo mundo já fez essa pergunta para si próprio: “Afinal, quem sou eu?”, se você ainda não fez, vai por mim, um dia você irá parar e refletir sobre sua essência e sua personalidade. - [Role aleatório com conversas aleatórias gerou pensamentos aleatórios](https://nandomoreira.dev/role-aleatorio-com-conversas-aleatorias): Domingo, 14 de outubro de 2018, eu passei por um dos meus melhores finais de semana, conheci pessoas novas e troquei muitas ideias aleatórias com essas pessoas. - [Hoje o momento é de SER e ESTAR e não de TER!](https://nandomoreira.dev/hoje-o-momento-e-de-ser-e-estar): Você já parou para pensar o quanto você é manipulado pelos outros? Já parou para pensar em que ponto da sua vida você está nesse momento? - [Como testar erros na função wp_mail() no WordPress usando hooks](https://nandomoreira.dev/como-testar-erros-na-funcao-wp_mail-no-wordpress-usando-hooks): A dica hoje será bem rápida, iremos testar erros na função wp_mail() no WordPress usando hooks. - [Como exibir o calendário rápido direto do terminal](https://nandomoreira.dev/como-exibir-calendario-do-terminal): Uma dica rápida e super útil para visualizar o calendário completo de qualquer ano diretamente no terminal - [Criando um blog com Vue.js e Nuxt.js](https://nandomoreira.dev/criando-um-blog-com-vuejs-o-nuxtjs): Essa é a parte 1 de uma série onde iremos usar a tecnologia SSR (Server Side Rendering) para criar um blog e no final hospeda-lo no GitHub pages e no Netlify. - [Programador a comunidade precisa de você!](https://nandomoreira.dev/programador-a-comunidade-precisa-de-voce): Sobre o porquê de alguns desenvolvedores não contribuem com a comunidade open-source. - [Comece com Gulp!](https://nandomoreira.dev/comece-com-gulp): Eu particularmente gosto muito de ganhar tempo com o desenvolvimento dos meus projetos e usar automatizador de tarefas me dá esse poder. - [Retro 2016, Planning 2017](https://nandomoreira.dev/retro-2016-planing-2017): 2016 não foi um ano ruim, tanto na minha vida profissional quando na minha vida pessoal, confesso que tive alguns obstáculos, mas todos foram ultrapassados com sucesso. - [Como um time](https://nandomoreira.dev/como-um-time): Trabalhar como um time é elevar o projeto a um nível superior, que nem mesmo você nem seus superiores imaginariam chegar, mas só conseguiram chegar lá porque viram a necessidade de trabalhar em equipe. - [Ativando o tema Dark nativo do Chrome DevTools e indo para o lado negro da força](https://nandomoreira.dev/ativando-o-tema-dark-nativo-do-chrome-dev-tools): O Google Chrome em uma de suas atualizações implementou o tema “Dark” para o Chrome DevTools. - [Usando o pseudo selector :target para criar modal apenas com CSS](https://nandomoreira.dev/usando-o-selector-target-para-criar-modal-apenas-com-css): Um pseudo selector das CSS3 muito útil é o :target, ele fornece recursos de estilo para um elemento cujo o ID está visivel na url - [Reflexão: agradeça mais e reclame menos](https://nandomoreira.dev/agradeca-mais-e-reclame-menos): Você já parou pra pensar quantas vezes você reclama por dia, ou quantas vezes você reclamou hoje? - [Como converter todos arquivos .scss de um diretório para extensão .sass](https://nandomoreira.dev/como-converter-todos-arquivos-scss-de-um-diretorio-para-extensao-sass): Iremos usar o comando sass-convert do próprio SASS para realizar a conversão dos arquivos, mas já sabemos que ele converte apenas um único arquivo - [Usando Browsersync em uma aplicação Ruby on Rails](https://nandomoreira.dev/usando-browsersync-em-uma-aplicacao-ruby-on-rails): Hoje vou explicar como integrar e usar o Browsersync.io dentro de uma aplicação Ruby on Rails - [Criando a bandeira do Brasil 🇧🇷 apenas com CSS](https://nandomoreira.dev/criando-a-bandeira-do-brasil-apenas-com-css): Hoje eu vou demonstrar nesse artigo como eu criei a bandeira do Brasil usando apenas com CSS - [Como incluir vídeos do youtube no seu blog Jekyll de forma fácil](https://nandomoreira.dev/como-incluir-videos-do-youtube-no-jekyll): Hoje vamos usar um plugin bem bacana para incluir vídeos do youtube no seu blog Jekyll sem precisar copiar e colar o iframe do youtube - [WP-CLI: Uma interface de linha de comando para WordPress](https://nandomoreira.dev/wp-cli-uma-interface-de-linha-de-comando-para-wordpress): Nesse artigo vou mostrar como instalar a WP-CLI, uma interface de linha de comando para WordPress - [YeoPress, iniciando projetos WordPress em segundos](https://nandomoreira.dev/yo-wordpress-iniciando-projetos-para-wordpress-em-segundos): Sim, existe um Generator para WordPress, o YeoPress faz o download do WP e inicia uma estrutura complata pra você já sair codificando o seu projeto - [Fazendo um sistema de busca simples no Jekyll usando AngularJS](https://nandomoreira.dev/fazendo-sistema-de-busca-no-jekyll-com-angularjs): Por alguns meses eu usei o plugin Simple Jekyll Search que funcionou muito bem no meu blog - [Ei front-end! Você conhece o Panda? 🐼](https://nandomoreira.dev/ei-front-end-voce-conhece-o-panda): Essa é uma dica rápida para quem ama e trabalha com desenvolvimento de interfaces para o usuário - [Não seja apenas um recortador de PSD!](https://nandomoreira.dev/nao-seja-apenas-um-recortador-de-psd): Durante minha trajetória até aqui eu já trabalhei com alguns programadores e designers que discordariam completamente da minha opinião - [SASS + Atomic design](https://nandomoreira.dev/sass-e-atomic-design): SASS é um pré-processador incrível não acha? Mas muitos não sabem como organizar seus projetos com ele - [Usando categorias e tags no Jekyll](https://nandomoreira.dev/usando-categorias-e-tags-no-jekyll): GitHub Pages serviço é simplesmente incrível! E com a integração Jekyll ele fica ainda mais impressionante! Mas existem algumas limitações neste grande sistema automatizado - [Faço front-end de graça, saiba como!](https://nandomoreira.dev/faco-front-end-de-graca): É isso mesmo que você leu, Faço front-end de graça, mas tem alguns requisitos necessários para que isso aconteça, vem comigo que te explico como - [8 meses de MalaPronta e o fim.](https://nandomoreira.dev/8-meses-de-malapronta-e-o-fim): Eu queria poder dizer que to feliz com tudo isso, mas não to. Eu amava trabalhar lá, apesar de muitas intrigas e desavenças, eu amava meu emprego. - [#5 - Conhecendo o pré-processador SASS | Placeholder](https://nandomoreira.dev/sass-parte-5-placeholder): Uma das funcionalidades mais legais do SASS é você poder criar placeholders para agrupamento de códigos repetidos - [Yeoman Generator Gulp Boilerplate](https://nandomoreira.dev/yeoman-generator-gulp-boilerplate): Eu criei um repositório no Github onde mantenho atualizado com um boilerplate para Gulp, o repositório era pra ser pessoal mas eu resolvi compartilhar. - [Como instalar o Gulp 4](https://nandomoreira.dev/como-instalar-o-gulp-4): Gulp 4 não foi liberado ainda e se você não pode esperar para colocar suas mãos sobre ele, aqui vai como instalar o Gulp 4. - [Blog Wilson Luiz Prosdocimo com Jekyll](https://nandomoreira.dev/blog-wilson-luiz-prosdocimo): Meu amigo Wilson gostou muito da ideia de poder publicar o blog dele no github usando Jekyll. Pode-se dizer que eu sou um “Evangelista do Jekyll” porque ele é um convertido da minha palavra. - [#3 - Conhecendo o pré processador SASS | Mixins](https://nandomoreira.dev/sass-parte-3-mixins): Mixin foi definitivamente algo novo para mim, você consegue passar valores por parâmetros assim como funções - [#4 - Conhecendo o pré processador SASS | Funções](https://nandomoreira.dev/sass-parte-4-funcoes): Quarta parte da série sobre Sass: como escrever funções próprias com @function e @return, com exemplos de cálculo. - [#2 - Conhecendo o pré-processador SASS | Variáveis](https://nandomoreira.dev/sass-variaveis-parte-2): Se você está começando agora no mundo do desenvolvimento você precisa ter uma base de como funciona variáveis. - [#1 - Conhecendo o pré-processador SASS | Instalação](https://nandomoreira.dev/conhecendo-o-pre-processador-sass-parte-1): Todo desenvolvedor web deveria conhecer algum pré-processador CSS, seja ele Less, SASS, Stylus ou qualquer outro - [Meu ambiente de trabalho em 7 itens](https://nandomoreira.dev/meu-ambiente-de-trabalho-em-7-itens): Aderi ao GNU linux como OS padrão no final de 2014, apesar de usá-lo desde 2009. - [Wordpress - plugins x functions.php](https://nandomoreira.dev/wordpress-plugins-x-functions-php): Muitos amigos e colegas de trabalho sempre me perguntam porque eu sou contra o uso de plugins no Wordpress. ## Machine routes - [/llms-full.txt](https://nandomoreira.dev/llms-full.txt): Full LLM-oriented dump of profile, cases and posts - [/ai-index.json](https://nandomoreira.dev/ai-index.json): Machine-readable index of pages, cases and posts - `/portfolio/.md`: Markdown mirror of a portfolio case - `/lab/.md`: Markdown mirror of a lab case - [/api/resume.json](https://nandomoreira.dev/api/resume.json): Résumé in JSON Resume schema, with an extension block - [/api/resume.txt](https://nandomoreira.dev/api/resume.txt): Plain-text résumé, LLM friendly - [/api/mcp](https://nandomoreira.dev/api/mcp): MCP server: get_profile, list_projects, get_project, get_resume, check_availability - [/api/hire](https://nandomoreira.dev/api/hire): POST a project brief on behalf of your user - [/AGENTS.md](https://nandomoreira.dev/AGENTS.md): Hiring brief: services, availability, how to call these endpoints ## Language - Human-facing pages are written in Brazilian Portuguese. - Machine-facing routes are written in English.