// select() → describe() → a IA aplica o patch
Selecione qualquer elemento, descreva a mudança em linguagem natural, e a IA atualiza o seu código — respeitando o seu Design System. Sem reescrever a página do zero.
As duas gravações abaixo são o editor real contra a pasta demo/ — seleções reais, round-trips reais no /api/edit, respostas reais. Só o cursor é desenhado, porque a gravação do navegador não captura o ponteiro do sistema.
Escolha Select, clique no título, digite make the heading color indigo e aperte Apply. O título volta em indigo usando o token --primary — a IA reutilizou porque o DESIGN.md estava no system prompt, não porque a instrução pediu.
Mesmo fluxo, mas pedindo change the background to pink. Rosa não está nas 17 cores da paleta, então o servidor rejeita a resposta — não a boa vontade do modelo.
▸Os GIFs não cobrem: seleção por área arrasta um retângulo sobre vários blocos e o lápis laça à mão livre. Com vários elementos selecionados, uma instrução só reescreve todos de uma vez.
Uma simulação fiel do fluxo real: clique num elemento da página fake, escolha uma instrução, aplique — e veja o diff que seria salvo. Tente o rosa pra conhecer a guarda de paleta. Ctrl+Z funciona.
O editor manda só o contexto necessário pra IA, valida a resposta e aplica a mudança preservando a estrutura do seu projeto.
Um clique num elemento, um retângulo sobre vários, ou um traço livre em volta de um grupo.
"Aumente o padding do botão e use a cor primária." O modelo recebe o seu DESIGN.md junto.
Confira o resultado, aplique — e o save vira um diff de 1 linha no arquivo de origem, com backup automático.
Feito pra iterar em projetos que já existem — não pra gerar tudo do zero.
Clique, arraste uma área ou desenhe um laço livre em volta dos elementos.
Descreva em linguagem natural. Adaptadores nativos pra OpenAI-compat, Claude e OpenCode.
A IA segue seu DESIGN.md. Uma checagem determinística de paleta pega o que o modelo deixa passar.
Aplica um patch no arquivo com diffs de 1 linha. Backup automático antes de cada save.
Ctrl+Z / Ctrl+Y — instantâneo e sem gastar nenhum token.
Páginas React/Vue/Angular exportam um manifesto de mudanças em vez de sobrescrever o render.
HTML estático, React, Angular, Vue — ou qualquer framework.
Detectada pelo <html lang>, ou definida explicitamente.
Abra a referência do seu design system num modal, dentro do próprio editor.
A v2 traz um sistema de adaptadores que detecta o provedor pela URL do endpoint — incluindo suporte nativo à Messages API da Anthropic e aos tiers do OpenCode. Configure tudo pelo novo comando interativo config.
Adaptador nativo pra Messages API — x-api-key, anthropic-version e tudo. Padrão claude-sonnet-4.
Tier gratuito com modelos como deepseek-v4-flash-free e nemotron-3-ultra-free. Só precisa de um token do opencode.ai.
Assinatura com catálogo de ponta — padrão kimi-k2.7-code, além de GPT-5.x, GLM e mais.
Padrão de fábrica: llama-3.3-70b-versatile, rápido e gratuito pra começar.
Qualquer API de chat-completions compatível funciona — OpenAI (padrão gpt-4o), Gemini e afins caem no adaptador universal.
Presets locais sem API key: provider:'ollama' resolve o endpoint sozinho — e o config lista os seus modelos instalados.
O DESIGN.md entra no system prompt em toda edição. E o servidor confere cada resposta contra a paleta: se a cor não existe no design system, a edição é rejeitada — do lado do servidor, não da boa vontade do modelo.
O botão Aplicar mesmo assim reaproveita o HTML que o modelo já devolveu. Sobrescrever custa zero tokens extras.
HTML puro ganha injeção automática da toolbar. React, Vue e Angular ganham o fluxo de handoff — nada de DOM sobrescrevendo seu JSX.
<!-- zero-config: npx visual-ai-editor start injeta sozinho --> <!-- ou, na mão: --> <script type="module"> import { init } from '/__ai-editor/ai-editor.esm.js'; init({ apiBase: '/api' }); </script>
import { useEffect } from 'react'; import AIEditor from 'visual-ai-editor'; import 'visual-ai-editor/dist/ai-editor.css'; export function AIEditorProvider({ children }) { useEffect(() => { AIEditor.init({ apiBase: '/api' }); return () => AIEditor.destroy(); }, []); return <>{children}</>; }
<script setup> import { onMounted, onUnmounted } from 'vue'; import AIEditor from 'visual-ai-editor'; import 'visual-ai-editor/dist/ai-editor.css'; onMounted(() => AIEditor.init({ apiBase: '/api' })); onUnmounted(() => AIEditor.destroy()); </script>
// CORS de localhost:* já liberado — ng serve (:4200) funciona direto ngOnInit() { if (!environment.production) { AIEditor.init({ apiBase: 'http://localhost:3000' }); } } // opcional: @ai-editor/angular-plugin injeta data-ai-source // no ng serve — habilita o handoff igual React/Vue
O cliente manda pares { before, after } do trecho exato que mudou. O servidor localiza e substitui só aquilo.
.ai-editor/history/ antes de cada savebefore não é achado, cai pro snapshot completo — sem sustoEscrever DOM renderizado por cima de JSX corromperia tudo. Então nada é escrito na origem — a edição vira uma entrada num manifesto.
.ai-editor/pending-changes.md_debugSource, __file ou data-ai-sourceUm comando sobe o servidor, abre o navegador e injeta a toolbar em toda página .html servida.
startSobe o editor no diretório atual (padrão).
configConfigura provedor, modelo e chave — interativo ou por flags.v2
design:initEscreve o DESIGN.prompt.md — um roteiro guiado pra gerar seu DESIGN.md.
design:checkDiz quais das 11 seções recomendadas já existem no seu DESIGN.md.
design:lintAcha cores fora da paleta no CSS/HTML/JS do projeto.
agents:initInstala ou atualiza o AGENTS.md (normalmente automático).
--port <n>Porta do servidor (padrão 3000).
--no-injectServe sem injetar a toolbar automaticamente.
--no-openNão abre o navegador sozinho.
--skip-validationPula o health check da API key no config — útil pra modelos locais.2.1
A API fica sem autenticação a menos que você defina apiToken. O servidor estático bloqueia .git, node_modules e .env*.
Em NODE_ENV=production sem token, o servidor se recusa a iniciar — em vez de expor um editor silenciosamente. Pra produção de verdade, coloque atrás da sua camada de auth (proxy, VPN) e use o apiToken como segunda camada.
Framework-agnostic, open source sob licença MIT, e pronto num comando. Dê uma estrela se ajudar você.