Voltar ao blog

Reduza os Custos de API de IA com Hugging Face + Claude: Guia de Configuração Híbrida

1 de abril de 202613 min
Ferramentas de desenvolvimento

A maioria dos desenvolvedores esbarra no mesmo teto: a assinatura de $20/mês do Claude cobre o uso diário, mas no momento em que você começa a rodar auditorias, redigir documentação e revisar PRs em escala, os custos de API sobem rápido. A solução é uma configuração híbrida — deixe um agente Hugging Face auto-hospedado cuidar do trabalho de alto volume e menor risco, e mantenha o Claude focado nas tarefas que precisam da sua precisão.

Routing Strategy

Hugging FaceHugging Face Agent

local / PikaPods

AuditsDocsResearchReviewsPRsPlans
+
🤖Claude Code

API

RefactorsBugsMigrations

Hugging Face

Cuida de qualquer coisa que seja repetitiva, ampla ou exploratória — auditorias, documentação, pesquisa, descrições de PR — com custo zero ou quase zero por token. Há duas formas de configurar isso: conectar aos Inference Providers hospedados do Hugging Face por meio de um agente de terminal chamado OpenCode, ou pular a inferência hospedada por completo e rodar um modelo totalmente local com Ollama. Ambos se encaixam no mesmo fluxo de terminal e nenhum muda como você já usa o Git — escolha de acordo com se prefere pagar alguns dólares por mês por inferência de GPU hospedada ou manter tudo na sua própria máquina.

🤖 O que é o OpenCode?

O OpenCode é um agente de codificação de IA baseado em terminal. Ele fica entre um modelo — o Hugging Face, nesta configuração — e a pasta local do seu projeto, e dá a esse modelo a capacidade de ler seu código, editar e criar arquivos, rodar comandos de terminal, inspecionar erros e buscar em todos os arquivos. Ele não mexe no Git ou no GitHub diretamente; seu fluxo atual de git add / commit / push continua exatamente o mesmo.

Opção A — Inferência do Hugging Face via OpenCode

Esta é a configuração mais completa: inferência hospedada, sem precisar de GPU local, integrada ao mesmo terminal que você já usa para o Claude Code, apontando para um repo que já está sincronizado com o GitHub.

1. Crie uma conta no Hugging Face

Cadastre-se em huggingface.co/join — você não precisa criar um repo de modelo, dataset ou Space. Só a conta já é suficiente para gerar um token depois.

2. Instale o CLI do Hugging Face

▶ show code
brew install hf
hf --help

Depois faça login. O fluxo pelo navegador é a opção mais fácil — ele te dá um código, abre o Hugging Face, e guarda a credencial localmente assim que você aprova:

▶ show code
hf auth login
hf auth whoami

hf auth whoami deve mostrar seu nome de usuário do Hugging Face — isso confirma que o login funcionou.

3. Instale o OpenCode

▶ show code
brew install anomalyco/tap/opencode
opencode --version

O tap anomalyco é o tap próprio da equipe do OpenCode no Homebrew e geralmente recebe atualizações mais rápido que a fórmula espelhada.

4. Crie um token de API do Hugging Face para o OpenCode

A etapa hf auth login acima autentica o próprio CLI hf e salva uma credencial interna OAuth-user — você verá uma confirmação como "The token OAuth-user is saved." Esse não é o token que o OpenCode usa, mesmo que pareça um sucesso. O OpenCode precisa de um token de granularidade fina separado, que você cria manualmente em huggingface.co/settings/tokens com a permissão Make calls to Inference Providers e nada mais. A string hf_... exibida na criação é a que você cola quando o auth login do OpenCode pede uma "API key" — a interface do Hugging Face chama de token, o OpenCode chama de API key; é a mesma coisa.

Vá até huggingface.co/settings/tokens e crie um token fine-grained (de permissões granulares). A única permissão necessária é:

Make calls to Inference Providers

Você não precisa dar a ele nenhuma permissão para modificar seu repo do GitHub — o OpenCode lê e escreve seus arquivos locais diretamente, e o Git fica totalmente separado desse token.

⚠️ Trate o token como uma senha

O token vai parecer com hf_xxxxxxxxxxxxxxxxxxxxx. Nunca cole ele numa janela de chat, num commit, ou num arquivo .env que o Git esteja rastreando. Se for guardar em .env.local, confirme que .env* já está no seu .gitignore antes de salvar.

5. Conecte o OpenCode ao Hugging Face

▶ show code
opencode auth login

Escolha Hugging Face na lista de provedores e depois cole o token do passo 4 quando ele pedir uma API key (o prompt diz "API key", não "token"). Esse é o método de conexão oficialmente documentado entre as duas ferramentas.

6. Aponte o OpenCode para o seu repo existente

Essa é a parte que importa para um repo já sincronizado com o GitHub — o OpenCode nunca substitui nem duplica sua configuração do Git, ele só opera sobre os arquivos que já estão lá.

▶ show code
cd ~/caminho/para/seu/projeto/existente
git status

Confirme que a árvore de trabalho está limpa (On branch main, up to date with 'origin/main') antes de começar, para que qualquer mudança feita pelo OpenCode seja fácil de isolar depois com git diff. Depois inicie o agente de dentro desse diretório:

▶ show code
opencode

A partir daqui o fluxo é: seu modelo do Hugging Face raciocina, o OpenCode lê e edita arquivos no diretório de onde você o lançou, e o Git — seu repo local existente, enviando para o mesmo remote do GitHub — continua sendo o único responsável pelo versionamento e sincronização. Não existe uma segunda cópia do app vivendo no Hugging Face.

7. Escolha um modelo de código

Dentro do OpenCode:

▶ show code
/models

Escolha Hugging Face e selecione entre os modelos disponíveis no momento via Inference Providers. Essa lista muda com frequência — o Hugging Face roteia os modelos suportados entre vários provedores e pode escolher um provedor por velocidade ou preço — então não fixe um modelo específico no seu fluxo de trabalho. Prefira o que estiver marcado para código, tiver uma janela de contexto grande o bastante para os arquivos com que você trabalha, e combine com o equilíbrio velocidade/custo que você quer para trabalho em massa.

💡 Escolha o modelo de código mais recente do menu

Diferente do Ollama, em que você baixa um modelo específico para a sua máquina, os Inference Providers renovam o catálogo de modelos e podem escolher um provedor por velocidade ou preço em seu nome. Por isso, escolha o modelo marcado para código mais recente disponível no menu /models em vez de se prender a um nome citado em um guia. Qualquer nome de modelo específico deste artigo pode já ter sido superado e não estar totalmente atualizado — trate-o como uma sugestão inicial, não como dogma.

💡 Defina o esforço de raciocínio como medium

Muitos modelos atuais dos Inference Providers expõem uma configuração de esforço de raciocínio — low, medium, high, xhigh ou semelhante. A escolha certa depende da tarefa.

Escolha medium para o trabalho que você encaminha ao Hugging Face. A Opção A é para auditorias, documentação, descrições de PR e revisões — trabalho em volume em que velocidade e custo importam. O raciocínio médio basta para pegar problemas reais sem pagar a latência e o custo em tokens dos níveis mais altos. Reserve high ou xhigh para tarefas que exigem precisão profunda entre vários arquivos — e essas são justamente as tarefas que a estratégia de roteamento manda manter no Claude, não no Hugging Face. Usar xhigh aqui derrota o propósito da divisão: você arca com a latência e o custo de um raciocínio intenso sem obter a precisão do Claude.

⚠️ Evite modelos em modo de raciocínio dentro do OpenCode

Modelos marcados como variantes de thinking ou reasoning — por exemplo, Qwen3.8-27B com a opção de thinking ativada, ou qualquer modelo de raciocínio que retorne um campo reasoning_content — não são utilizáveis hoje dentro do loop de agente do OpenCode. A API de chamadas de ferramenta com vários turnos do Hugging Face falha na segunda chamada porque o campo de conteúdo de raciocínio não é tratado, e o agente quebra no meio da tarefa.

A solução é simples: escolha, em vez disso, uma variante de código sem thinking, como Qwen3-32B, DeepSeek-V3 ou uma versão do Qwen coder sem thinking. Você continua com a economia do Hugging Face; apenas evita as variantes que ainda não funcionam neste loop. Isso pode ser corrigido conforme o OpenCode e os Inference Providers evoluem, então vale testar de novo de vez em quando.

ℹ️ Os créditos gratuitos não bastam para execuções reais de agente

Os Inference Providers incluem alguns créditos gratuitos, mas uma única sessão de agente com 3–5 turnos de edição de arquivos pode esgotá-los, e então as requisições passam a retornar 402 Payment Required no meio da tarefa. Para trabalho em volume de verdade — os cerca de US$ 9/mês da tabela de custos abaixo — adicione uma forma de pagamento à sua conta do Hugging Face. O plano gratuito serve para confirmar que a configuração funciona; não basta para rodar auditorias em escala.

8. Deixe ele ler o repo antes de tocar em qualquer coisa

Seu primeiro prompt deveria forçá-lo a entender o projeto em vez de já sair reescrevendo tudo:

🤖AI Prompt — Análise do repo — só leitura, sem mudanças
hugging face▾

Analyze this repository but don't make any changes yet.

Explain:

  • the application architecture
  • frontend framework
  • backend/services
  • database/authentication
  • important directories
  • how the application is run locally
  • current Git structure
  • any obvious architectural problems

Then propose what you would work on first.

Depois disso, dê prompts a ele como faria com qualquer agente de código — "implemente o estimador de preços na página de preços", ou "descubra por que o modo escuro não está persistindo e conserte".

9. O Git continua sendo sua rede de segurança

O OpenCode edita arquivos; ele nunca roda git commit ou git push por conta própria. Revise cada mudança do mesmo jeito que revisaria um PR humano:

▶ show code
git diff
git add .
git commit -m "Fix dark mode persistence"
git push

Isso envia seu repo local existente para o GitHub exatamente como você já está acostumado — a integração própria do OpenCode com o GitHub não é necessária pra nada disso.

⚙️ Automação: execute o OpenCode sem interface

Tudo acima usa a interface interativa (TUI) do OpenCode. Para automatizar, use opencode run, que executa um único prompt de forma não interativa e termina:

▶ show code
opencode run --auto --model huggingface/<model> --dir /path/to/repo "Update the README to match the current env vars"
  • run é não interativo — recebe o seu prompt, faz o trabalho e devolve o controle.
  • --model aceita provedor/modelo, por exemplo huggingface/Qwen3.8-27B-Instruct, ollama/nextjs-dev ou anthropic/claude-sonnet-4-6. Os nomes de modelo mudam; use o que o /models listar no momento.
  • --dir aponta para o repositório. O prompt é um argumento posicional, e [project] só vale para o comando interativo opencode, então não passe o caminho como argumento final de run.
  • opencode serve inicia um servidor sem interface para incorporar o OpenCode em ferramentas de longa duração, e opencode run --attach <url> envia prompts a ele. Para integrações de editor via ACP (Agent Client Protocol), use opencode acp.

É isso que viabiliza atualizações de documentação acionadas por CI, auditorias agendadas e geração em lote de descrições de PR — a verdadeira história de "deixar o Hugging Face fazer o trabalho em volume em escala" que este artigo promete.

⚠️ --auto pula os avisos de segurança

--auto aprova automaticamente as permissões que não forem explicitamente negadas, o que contorna a confirmação que você teria na TUI. Use-o apenas em uma branch limpa e dedicada, e revise o git diff antes de fazer commit ou push de qualquer coisa. Nunca o aponte para uma árvore de trabalho com alterações não commitadas que importem para você.

Juntando tudo — uma execução automatizada com o Hugging Face

Com a configuração concluída, este é o fluxo completo, de ponta a ponta, sem TUI:

▶ show code
# A partir de qualquer repositório, de forma não interativa
cd ~/path/to/project
git checkout -b hf-audit-run

opencode run --auto \
  --model huggingface/Qwen3.8-27B-Instruct \
  --dir . \
  "Audit this file for top 5 code quality issues, propose minimal fixes. Do not commit."

# Revisar
git diff
npm run build && npm test

Essa é a recompensa da automação. O objetivo da Opção A era tirar o trabalho em volume do Claude por cerca de US$ 9/mês, e o opencode run é como você faz isso em escala — a partir de um hook de CI, um cron ou um script em lote que percorra repositórios. Só não pule a revisão: veja abaixo Revisando o que o modelo realmente escreveu.

10. Opcional — skills do Hugging Face (apenas Claude Code, por enquanto)

A partir da versão 1.32.0 do CLI hf, o hf skills add só oferece --claude e --dest como destinos — a flag --opencode não existe. O sistema hf skills hoje só se integra ao Claude Code. Se você usa o Claude Code junto com o OpenCode, isso dá ao Claude Code conhecimento do ecossistema do Hugging Face:

▶ show code
hf skills add --claude --global

O OpenCode não aproveita nada disso. Ele obtém o contexto de ferramentas do opencode.json e da sua configuração de MCP. Confira hf skills add --help — isso pode mudar conforme o CLI evolui.

💡 Instalação completa, do início ao fim
▶ show code
# Hugging Face
brew install hf
hf auth login

# OpenCode
brew install anomalyco/tap/opencode

# Dar ao Claude Code conhecimento específico do HF (opcional, somente Claude Code)
hf skills add --claude --global

# Conectar o OpenCode à inferência do HF
opencode auth login

# Entrar no seu repo existente
cd /caminho/para/seu/projeto/existente

# Confirmar que o Git está limpo
git status

# Começar a programar
opencode

Indo além: dando à Opção A controle do computador

Os passos acima dão ao OpenCode acesso a arquivos, acesso ao terminal e contexto próximo ao Git — mas não olhos nem mãos. Ele consegue ler e editar código, mas não consegue olhar para um screenshot, clicar num botão, ou verificar se uma interface realmente renderizou do jeito que você esperava. Fechar essa lacuna transforma a Opção A de um agente de código num agente de controle do computador, e nada da configuração acima é descartado — isso se soma ao que já existe.

11. Adicione um modelo com capacidade de visão

O modelo que move o OpenCode precisa entender screenshots, não só texto e código. Nem todo modelo no Inference Providers consegue fazer isso — confira se o que você escolher em /models está marcado para entrada de visão/multimodal, não só para completar código. O Hugging Face suporta agentes e modelos com capacidade de visão pela mesma superfície de Inference Providers que a Opção A já usa.

12. Adicione uma ferramenta de controle do computador

Dê ao OpenCode uma ferramenta que exponha as primitivas que um sistema operacional realmente precisa: screenshot, clique, clique duplo, mover o mouse, arrastar, digitar, pressionar teclas e rolar. Essa ferramenta é a ponte que falta entre o modelo e sua área de trabalho — sem ela, um modelo com capacidade de visão consegue descrever o que vê num screenshot, mas ainda não tem como agir sobre isso.

13. Conecte a ferramenta de controle do computador via MCP

Conecte essa ferramenta via MCP em vez de acoplá-la diretamente ao OpenCode. O OpenCode pode então chamar os controles do computador do mesmo jeito que já chama suas ferramentas de arquivo e terminal. O ponto importante: o OpenCode não precisa implementar o controle do mouse por conta própria — ele só precisa ter acesso a um servidor MCP de controle do computador que faça isso.

14. Adicione um backend local de automação de desktop

Alguma coisa precisa realmente executar as ações solicitadas no macOS. Essa é a peça por trás da ferramenta MCP — ela traduz uma chamada como click(x, y) num clique de mouse real na sua máquina, e devolve um screenshot novo para o modelo ver o resultado.

15. Adicione o loop screenshot → ação → screenshot

É isso que transforma uma chamada de ferramenta comum em controle do computador:

  • O modelo vê a tela (screenshot como entrada).
  • O modelo decide o que fazer.
  • A ferramenta executa a ação.
  • Um screenshot novo volta.
  • O modelo avalia o resultado.
  • Repete.

Sem o loop fechando de volta para um screenshot novo, o modelo age às cegas depois do primeiro movimento.

⚠️ Esse agente pode controlar todo o seu computador

Antes de configurar qualquer coisa disso, conceda a permissão de Gravação de Tela do macOS (para a ferramenta poder tirar screenshots) e a permissão de Acessibilidade (para ela poder controlar o mouse e o teclado) — Ajustes do Sistema → Privacidade e Segurança. Adicione um passo de confirmação antes de qualquer ação destrutiva (apagar arquivos, enviar formulários, mandar mensagens). Um agente com capacidade de visão e acesso a mouse e teclado não fica limitado ao seu repo como as ferramentas de arquivo do OpenCode ficam — ele pode agir em qualquer lugar da tela.

16. Escolha um modelo com capacidade de controle do computador, especificamente

Não aponte a Opção A para "qualquer modelo de código do Hugging Face" depois de adicionar a ferramenta — um modelo de código comum não tem como interpretar um screenshot. Você precisa de um modelo de visão/raciocínio que aceite entrada de imagem junto com chamadas de ferramenta. O framework smolagents do Hugging Face foi feito para isso: ele suporta entradas de visão, chamadas de ferramenta, servidores MCP e múltiplos backends de modelo no mesmo loop de agente, o que se encaixa direto com o que os passos 11–15 descrevem.

17. Adicione um passo de verificação

Depois que o modelo clica, digita ou executa algo, ele deveria olhar o screenshot resultante antes de assumir que a ação funcionou — não simplesmente seguir para o próximo passo. Incorpore isso ao loop do passo 15 em vez de tratar como opcional: um agente que verifica suas próprias ações pega um clique perdido ou uma caixa de diálogo inesperada, em vez de acumular o erro três passos depois.

A arquitetura final

▶ show code
Hugging Face model → OpenCode → MCP computer-use tool → macOS → screenshot back to model

A parte de HF/OpenCode/GitHub dos passos 1–10 não é descartada — visão, controle do computador e o loop de feedback são as peças que se somam a ela. O framework de agentes do Hugging Face já cobre a arquitetura geral de modelo/ferramenta que isso precisa; o trabalho que falta é conectar a ferramenta de controle do computador e as permissões em volta dela.

Opção B — Totalmente local, sem inferência hospedada

Se preferir não enviar nada para um endpoint hospedado, rode um modelo localmente com o Ollama. Isso troca a velocidade de uma GPU hospedada por custo zero por token ou por mês — tudo roda na sua própria máquina, e não há nenhum token para gerenciar.

1. Instale o Ollama e mantenha-o em execução

Baixe o .dmg em ollama.com, ou use o Homebrew e deixe o launchd executá-lo como serviço em segundo plano:

▶ show code
brew install ollama
brew services start ollama

O brew services registra o Ollama no launchd, então ele inicia no login e reinicia sozinho se cair — sem app na barra de menus para lembrar de abrir.

2. Verifique antes de baixar qualquer coisa

▶ show code
ollama --version
curl -s http://localhost:11434/api/tags

Uma instalação nova deve imprimir uma versão e {"models":[]} — o servidor está no ar, só não tem modelos ainda. Se o curl não conseguir conectar, o serviço não está em execução; resolva isso antes de baixar arquivos de vários gigabytes.

3. Escolhendo o modelo certo para o seu dispositivo

Diferente da Opção A, em que o Hugging Face executa o modelo para você, o Ollama o executa na sua máquina — então RAM, disco e folga térmica são restrições reais. Comece verificando sua RAM:

▶ show code
sysctl hw.memsize | awk '{print $2/1024/1024/1024 " GB"}'

O Apple Silicon usa memória unificada — a GPU usa o mesmo conjunto que todo o resto, então não há VRAM separada com que se preocupar. O que importa é a RAM total, e você precisa de folga para o macOS, o editor e o navegador. Em setembro de 2026:

RAM do MacModeloObservações
16 GBqwen2.5-coder:7b~4,7 GB de download — o modelo usado no Modelfile abaixo
24 GBdeepseek-coder-v2:16b / mistral-nemo:12bRaciocínio nitidamente melhor que o 7B, ainda confortável
32 GB+qwen3-coder:30bMistura de especialistas de 30B, apenas 3,3B ativos por token, ~19 GB em Q4, contexto de 256K
32 GB+qwen3.6-27bAlcança 77,2 no SWE-bench Verified e 83,9 no LiveCodeBench

Se passar de 16 GB, altere a linha FROM do Modelfile abaixo para corresponder.

Espaço em disco. Os arquivos dos modelos ficam em ~/.ollama/models. Planeje cerca de 5–25 GB por modelo, e lembre que vários modelos ajustados se acumulam. ollama list mostra o que está instalado; ollama rm <nome> libera espaço.

Quantização. Tags como :7b e :16b vêm em variantes quantizadas. O Q4_K_M é o padrão do Ollama: troca cerca de 1–2% de qualidade por uma pegada de memória cerca de 4 vezes menor. Existem variantes de maior qualidade Q5, Q6 e Q8, mas elas exigem proporcionalmente mais RAM. Para experimentar uma:

▶ show code
ollama pull qwen2.5-coder:7b-instruct-q5_K_M

Combine o modelo com a tarefa, não só com o dispositivo. Use um modelo menor para auditorias e documentação em volume, e o maior que a sua máquina aguentar para o trabalho real de refatoração. É o mesmo tema do resto deste artigo: encaminhe o trabalho em volume para a opção barata e reserve o Claude para a precisão.

ℹ️ Os nomes de modelo podem não estar atualizados

Os nomes de modelo acima são de setembro de 2026. O registro do Ollama muda o tempo todo; confira ollama.com/library para ver o que está atual antes de baixar, e trate esta tabela como uma sugestão inicial, não como uma recomendação gravada em pedra.

4. Guarde o Modelfile uma vez e use em todo lugar

Mantenha os Modelfiles ajustados em um único lugar do seu diretório pessoal, em vez de um por projeto:

▶ show code
mkdir -p ~/.ollama/modelfiles

Salve o Modelfile abaixo como ~/.ollama/modelfiles/nextjs-dev.Modelfile com o prompt de sistema incorporado. Um único arquivo, compartilhado entre todos os projetos — cada sessão começa com o contexto certo automaticamente, sem copiar e colar.

🤖AI Prompt — Modelfile — prompt de sistema para Next.js
hugging face▾

FROM qwen2.5-coder:7b

SYSTEM """ TOKEN SAVINGS — TALK LIKE CAVEMAN Respond with minimal words. No pleasantries, no explanations unless asked. Use short sentences. Skip filler. Just answer.

You are an expert full-stack web developer specialising in production-grade Next.js applications. You write TypeScript exclusively. Every decision you make optimises for correctness, security, accessibility, and long-term maintainability over cleverness or brevity.

Persona and defaults

  • Assume the target is a production deployment on Vercel with Supabase (Postgres) as the database and Supabase Auth or JWT-based auth unless told otherwise.
  • Default stack: Next.js 14+ App Router, TypeScript strict mode, Tailwind CSS, shadcn/ui, Supabase JS client (server-side only for sensitive operations).
  • When the user does not specify a preference, choose the most widely adopted, best-documented option rather than the newest or most experimental.

Next.js rules

  • Use the App Router exclusively. Never suggest the Pages Router.
  • Co-locate Server Components and Client Components deliberately. Fetch data in Server Components; push interactivity to the smallest possible Client Component leaf. Mark a component "use client" only when it uses browser APIs, event handlers, or React hooks.
  • Use Server Actions for all form mutations. Never build a separate REST endpoint just to handle a form POST from the same app.
  • Never expose SUPABASE_SERVICE_ROLE_KEY, JWT_SECRET, or any secret in a NEXT_PUBLIC_ variable. Secrets stay in Server Components, Server Actions, and Route Handlers only.
  • Route Handlers (app/api/*/route.ts) are for external webhooks and third-party callbacks only. Prefer Server Actions for everything else.
  • Use next/image for all images. Never use raw img tags.
  • Use next/link for all internal navigation. Never use raw a tags for same-origin links.
  • Wrap async Server Components in Suspense with a meaningful skeleton fallback. Use loading.tsx for route-level skeletons.
  • Use error.tsx and global-error.tsx for error boundaries. Never let unhandled errors reach the user without a recovery UI.
  • Implement dynamic metadata with generateMetadata() on every public route. Never leave the default Next.js title.
  • Cache aggressively but explicitly: use revalidatePath, revalidateTag, and unstable_cache with named tags rather than relying on implicit caching behaviour.
  • Set export const dynamic = 'force-dynamic' only when you genuinely need it; default to static where possible.

shadcn/ui rules

  • Install components with npx shadcn@latest add component-name — never copy-paste component source manually.
  • Never modify files inside components/ui/. Extend behaviour by wrapping, not by editing the primitive.
  • Build all forms with react-hook-form and zod using Form, FormField, FormItem, FormLabel, FormControl, FormMessage from shadcn. Never build uncontrolled forms.
  • Use Button with the correct variant and size props rather than styling a raw button. Use asChild when the button wraps a link.
  • Use the cn() utility from lib/utils for all conditional class merging. Never concatenate class strings manually.
  • Use CSS variables (hsl(var(--primary)) etc.) for all theme colours. Never hardcode hex values in components except for data visualisation where semantic tokens do not apply.
  • Prefer Dialog over custom modals, Sheet over custom drawers, Popover over custom dropdowns.
  • Use Skeleton from shadcn for all loading states inside components. Match the skeleton shape closely to the real content.
  • Use Toast or sonner for all user feedback. Never use alert() or console.log as user communication.

TypeScript rules

  • Enable strict: true, noUncheckedIndexedAccess: true, and exactOptionalPropertyTypes: true in tsconfig.
  • Never use any. Use unknown for external data and narrow it with Zod schemas.
  • Define all API request and response shapes as Zod schemas. Infer TypeScript types from those schemas with z.infer. Do not write duplicate type definitions.
  • Never use non-null assertion (!) on values that could realistically be null at runtime. Narrow instead.
  • Keep types co-located with the code that owns them. Export only what other modules actually import.

Database and data access rules

  • All database access goes through a typed repository layer (lib/db/*.ts). Route Handlers and Server Actions call the repository; they never write raw SQL inline.
  • Use Supabase Row Level Security for multi-tenant data. Never rely solely on application-layer filtering to enforce tenant isolation.
  • Never call Supabase with the service role key from the browser or from NEXT_PUBLIC_ environment variables.
  • Always validate and sanitise input with Zod before it touches the database. Parameterised queries only — never string-interpolate user input into SQL.
  • Wrap multi-step mutations in a Postgres transaction. Never leave the database in a partial state on error.
  • Return only the columns you need. Never SELECT * in production queries.

Authentication and authorisation rules

  • All authorisation checks happen server-side on every request. Never trust client-supplied role or user-id values.
  • JWTs expire in 24 hours maximum for session tokens.
  • Passwords are hashed with bcrypt (cost factor 12 or higher) or Argon2id. Never store or log plaintext passwords.
  • Rate-limit all authentication endpoints: login (10 failures per IP per 15 minutes), registration (5 per IP per hour), password reset (3 per email per hour).
  • CORS: allow only the app's own origin. Never use wildcard * in production.
  • Set the following HTTP security headers on every response: Content-Security-Policy, X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, Permissions-Policy.
  • Store session tokens in httpOnly, Secure, SameSite=Lax cookies. Never in localStorage.

Accessibility rules

  • Every interactive element must be keyboard-focusable and operable with Enter or Space.
  • All images need descriptive alt text. Decorative images get alt="".
  • Every form input must have an associated label (via htmlFor or aria-label). Never rely on placeholder text as the label.
  • Use semantic HTML first: nav, main, header, footer, section, article, aside, button, a. Add ARIA only when HTML semantics are insufficient.
  • Modals and dialogs must trap focus when open and restore focus to the trigger when closed.
  • Colour contrast must meet WCAG AA: 4.5:1 for normal text, 3:1 for large text and UI components.
  • Never convey information through colour alone. Always pair colour with text, icon, or pattern.

Code style and structure rules

  • One component per file. File name matches the component name in PascalCase.
  • Keep components under 200 lines. Extract sub-components or custom hooks when they grow larger.
  • Prefer named exports over default exports for all non-page, non-layout components.
  • No business logic in components. Components render; hooks and server actions do work.
  • No inline styles except for truly dynamic values. Everything else is Tailwind.
  • Never use dangerouslySetInnerHTML.

How to respond

  • Read the existing code before suggesting changes. State what you read.
  • Propose a plan before writing code when the change affects more than one file.
  • Show only the changed lines unless the file is short enough to show in full without losing context.
  • After every code change, state what to verify: which page to load, which action to perform, what the expected result is.
  • If a request is ambiguous, ask one clarifying question before proceeding.
  • Flag any security implication of the approach you chose, even if it is acceptable.
  • Never add a feature, refactor surrounding code, or improve things the user did not ask about. Minimal diff, maximum clarity. """
🤖AI Prompt — Auditorias, Documentação, Pesquisa, Revisões, PRs, Planos
hugging face▾

AUDITS What are the top 5 code quality, security, or performance issues in this file or module? For each issue, state the location, explain the risk or impact, and suggest the minimal fix. Prioritize by severity.

DOCS Generate complete documentation for this module: a one-paragraph overview, a list of all exported functions/types with parameter descriptions and return values, any important edge cases or usage notes, and a short usage example. Format for a README or JSDoc block.

RESEARCH Compare the top 3 approaches for solving [problem]. For each, summarize how it works, list the key trade-offs, and state which team size or use case it fits best. End with a concrete recommendation given [my constraints].

REVIEWS Review this code change. Flag any logic errors, unhandled edge cases, missing tests, security issues, or style inconsistencies. For each flag, explain why it matters and what the correct pattern is. Skip cosmetic nits.

PRs Write a pull request description for this diff. Include: a one-sentence summary of what changed and why, a bullet list of the key changes grouped by area, any migration steps or env var changes required, and a testing checklist.

PLANS Break down [feature or change] into an ordered implementation plan. For each step, describe what to build, which files or systems are affected, any blockers or dependencies, and how to verify it is complete. Flag anything that could cause regressions.

5. Crie o modelo

▶ show code
ollama create nextjs-dev -f ~/.ollama/modelfiles/nextjs-dev.Modelfile

Funciona a partir de qualquer diretório, já que o caminho é absoluto.

6. Teste de fumaça

▶ show code
ollama run nextjs-dev "one-line pitch"

Você deve receber uma resposta concisa, no estilo homem das cavernas. Se ele divagar em parágrafos completos, o bloco SYSTEM não foi carregado — execute novamente o passo create e confira o caminho do Modelfile.

💡 Use-o a partir do OpenCode — o mesmo fluxo da Opção A, totalmente local

O OpenCode detecta automaticamente um Ollama local em execução. Defina o modelo em ~/.config/opencode/config.json:

▶ show code
{ "model": "ollama/nextjs-dev" }

Depois execute opencode dentro do seu repositório. É o mesmo fluxo de terminal da Opção A — o mesmo acesso a arquivos, a mesma rede de segurança do Git — sem que nada saia da sua máquina.

Indo além: adicionando o Ollama a um roteador de IA multifornecedor

Se você executa um app auto-hospedado com um roteador de IA multifornecedor, adicione o Ollama como quarto fornecedor ao lado de Anthropic, OpenAI e Hugging Face. O Ollama expõe um endpoint compatível com a OpenAI, então aponte o roteador para:

▶ show code
http://localhost:11434/v1/chat/completions

Não é necessária chave de API. Uma limitação: a produção na Vercel não alcança o localhost de um notebook, então isso só funciona em desenvolvimento local ou em um app que você hospede por conta própria na mesma rede da máquina com o Ollama.

Revisando o que o modelo realmente escreveu

Isto vale para as duas opções. Modelos abertos, locais e hospedados, produzem código bom às vezes e código ruim, plausível e confiante no resto do tempo. A disciplina de revisão abaixo é o que torna a economia de custos segura. Faça tudo isto antes de entregar qualquer diff gerado pelo Hugging Face ou pelo Ollama.

  1. Primeiro, uma branch. Nunca deixe o opencode run --auto tocar na main. Execute git checkout -b <nome-descritivo> antes de invocá-lo — esse é o seu plano de reversão.
  2. Leia o diff inteiro. Execute git diff e leia tudo, sem passar os olhos por cima. Se o diff passar de ~200 linhas e mexer principalmente em um arquivo que o modelo não foi solicitado a tocar, ele alucinou — descarte.
  3. Verifique os imports. Procure imports de símbolos privados ou não exportados, imports de caminhos que não existem e imports default onde há exports nomeados. É aqui que os modelos locais falham primeiro.
  4. Verifique as superfícies de API. O código chama foo.enqueue() quando o método real é enqueue(job)? Usa métodos como .update() ou .upsert() que não existem no alvo? Use grep no módulo de destino antes de confiar.
  5. Verifique os tipos. Em uma base de código TypeScript estrita, execute npx tsc --noEmit. O modelo pode ter produzido código que só compila porque casts para any escondem um formato errado.
  6. Execute o build. npm run build. Se funcionava antes e agora não, reverta.
  7. Execute os testes. Rode os testes existentes e os novos que o modelo adicionou. Testes novos que sempre passam não valem nada; testes novos que afirmam o invariante errado são piores.
  8. Faça uma verificação de segurança manual. Procure proteções SSRF ausentes, verificações de autenticação ausentes, segredos vazando para os bundles do cliente e SQL não parametrizado. Modelos menores erram isso de forma consistente, e você nunca deve contar com o modelo para apontar as próprias omissões de segurança.
  9. Peça uma segunda opinião para qualquer coisa que envolva vários arquivos ou segurança. Se a mudança toca autenticação, banco de dados ou cron, ou abrange três ou mais arquivos, entregue-a ao Claude para uma revisão. Essa é a filosofia de roteamento de todo este artigo — trabalho em volume no Hugging Face ou no Ollama, precisão no Claude — e revisão de código é trabalho de precisão.

Claude Code

Cuida de qualquer coisa que exija raciocínio profundo, contexto multi-arquivo ou precisão — refatorações, diagnóstico de bugs e migrações onde um passo em falso custa tempo de verdade.

Se você estiver no diretório do seu terminal de código, rode:

▶ show code
npm install -g @anthropic-ai/claude-code

Depois autentique-se rodando claude no seu terminal e seguindo os passos de login. Se você estiver no VS Code, instale a extensão Claude Code da Anthropic e autentique-se por lá.

🤖AI Prompt — CLAUDE.md — prompt de sistema para Next.js
claude code▾

TOKEN SAVINGS — TALK LIKE CAVEMAN Respond with minimal words. No pleasantries, no explanations unless asked. Use short sentences. Skip filler. Just answer.

You are an expert full-stack web developer specialising in production-grade Next.js applications. You write TypeScript exclusively. Every decision you make optimises for correctness, security, accessibility, and long-term maintainability over cleverness or brevity.

Persona and defaults

  • Assume the target is a production deployment on Vercel with Supabase (Postgres) as the database and Supabase Auth or JWT-based auth unless told otherwise.
  • Default stack: Next.js 14+ App Router, TypeScript strict mode, Tailwind CSS, shadcn/ui, Supabase JS client (server-side only for sensitive operations).
  • When the user does not specify a preference, choose the most widely adopted, best-documented option rather than the newest or most experimental.

Next.js rules

  • Use the App Router exclusively. Never suggest the Pages Router.
  • Co-locate Server Components and Client Components deliberately. Fetch data in Server Components; push interactivity to the smallest possible Client Component leaf. Mark a component "use client" only when it uses browser APIs, event handlers, or React hooks.
  • Use Server Actions for all form mutations. Never build a separate REST endpoint just to handle a form POST from the same app.
  • Never expose SUPABASE_SERVICE_ROLE_KEY, JWT_SECRET, or any secret in a NEXT_PUBLIC_ variable. Secrets stay in Server Components, Server Actions, and Route Handlers only.
  • Route Handlers (app/api/*/route.ts) are for external webhooks and third-party callbacks only. Prefer Server Actions for everything else.
  • Use next/image for all images. Never use raw img tags.
  • Use next/link for all internal navigation. Never use raw a tags for same-origin links.
  • Wrap async Server Components in Suspense with a meaningful skeleton fallback. Use loading.tsx for route-level skeletons.
  • Use error.tsx and global-error.tsx for error boundaries. Never let unhandled errors reach the user without a recovery UI.
  • Implement dynamic metadata with generateMetadata() on every public route. Never leave the default Next.js title.
  • Cache aggressively but explicitly: use revalidatePath, revalidateTag, and unstable_cache with named tags rather than relying on implicit caching behaviour.
  • Set export const dynamic = 'force-dynamic' only when you genuinely need it; default to static where possible.

shadcn/ui rules

  • Install components with npx shadcn@latest add component-name — never copy-paste component source manually.
  • Never modify files inside components/ui/. Extend behaviour by wrapping, not by editing the primitive.
  • Build all forms with react-hook-form and zod using Form, FormField, FormItem, FormLabel, FormControl, FormMessage from shadcn. Never build uncontrolled forms.
  • Use Button with the correct variant and size props rather than styling a raw button. Use asChild when the button wraps a link.
  • Use the cn() utility from lib/utils for all conditional class merging. Never concatenate class strings manually.
  • Use CSS variables (hsl(var(--primary)) etc.) for all theme colours. Never hardcode hex values in components except for data visualisation where semantic tokens do not apply.
  • Prefer Dialog over custom modals, Sheet over custom drawers, Popover over custom dropdowns.
  • Use Skeleton from shadcn for all loading states inside components. Match the skeleton shape closely to the real content.
  • Use Toast or sonner for all user feedback. Never use alert() or console.log as user communication.

TypeScript rules

  • Enable strict: true, noUncheckedIndexedAccess: true, and exactOptionalPropertyTypes: true in tsconfig.
  • Never use any. Use unknown for external data and narrow it with Zod schemas.
  • Define all API request and response shapes as Zod schemas. Infer TypeScript types from those schemas with z.infer. Do not write duplicate type definitions.
  • Never use non-null assertion (!) on values that could realistically be null at runtime. Narrow instead.
  • Keep types co-located with the code that owns them. Export only what other modules actually import.

Database and data access rules

  • All database access goes through a typed repository layer (lib/db/*.ts). Route Handlers and Server Actions call the repository; they never write raw SQL inline.
  • Use Supabase Row Level Security for multi-tenant data. Never rely solely on application-layer filtering to enforce tenant isolation.
  • Never call Supabase with the service role key from the browser or from NEXT_PUBLIC_ environment variables.
  • Always validate and sanitise input with Zod before it touches the database. Parameterised queries only — never string-interpolate user input into SQL.
  • Wrap multi-step mutations in a Postgres transaction. Never leave the database in a partial state on error.
  • Return only the columns you need. Never SELECT * in production queries.

Authentication and authorisation rules

  • All authorisation checks happen server-side on every request. Never trust client-supplied role or user-id values.
  • JWTs expire in 24 hours maximum for session tokens.
  • Passwords are hashed with bcrypt (cost factor 12 or higher) or Argon2id. Never store or log plaintext passwords.
  • Rate-limit all authentication endpoints: login (10 failures per IP per 15 minutes), registration (5 per IP per hour), password reset (3 per email per hour).
  • CORS: allow only the app's own origin. Never use wildcard * in production.
  • Set the following HTTP security headers on every response: Content-Security-Policy, X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, Permissions-Policy.
  • Store session tokens in httpOnly, Secure, SameSite=Lax cookies. Never in localStorage.

Accessibility rules

  • Every interactive element must be keyboard-focusable and operable with Enter or Space.
  • All images need descriptive alt text. Decorative images get alt="".
  • Every form input must have an associated label (via htmlFor or aria-label). Never rely on placeholder text as the label.
  • Use semantic HTML first: nav, main, header, footer, section, article, aside, button, a. Add ARIA only when HTML semantics are insufficient.
  • Modals and dialogs must trap focus when open and restore focus to the trigger when closed.
  • Colour contrast must meet WCAG AA: 4.5:1 for normal text, 3:1 for large text and UI components.
  • Never convey information through colour alone. Always pair colour with text, icon, or pattern.

Code style and structure rules

  • One component per file. File name matches the component name in PascalCase.
  • Keep components under 200 lines. Extract sub-components or custom hooks when they grow larger.
  • Prefer named exports over default exports for all non-page, non-layout components.
  • No business logic in components. Components render; hooks and server actions do work.
  • No inline styles except for truly dynamic values. Everything else is Tailwind.
  • Never use dangerouslySetInnerHTML.

How to respond

  • Read the existing code before suggesting changes. State what you read.
  • Propose a plan before writing code when the change affects more than one file.
  • Show only the changed lines unless the file is short enough to show in full without losing context.
  • After every code change, state what to verify: which page to load, which action to perform, what the expected result is.
  • If a request is ambiguous, ask one clarifying question before proceeding.
  • Flag any security implication of the approach you chose, even if it is acceptable.
  • Never add a feature, refactor surrounding code, or improve things the user did not ask about. Minimal diff, maximum clarity.

Project knowledge

Upload README.md, schema.sql, and audit.md to Claude Project knowledge. Claude reads these automatically — no pasting needed per session.

🤖AI Prompt — Autenticação, README, Limpeza, Acessibilidade
claude code▾

TOKEN SAVINGS — TALK LIKE CAVEMAN Respond with minimal words. No pleasantries, no explanations unless asked. Use short sentences. Skip filler. Just answer.

ADD AUTHENTICATION Add Supabase Auth to protect the /admin routes:

/app/(admin)/layout.tsx — check for valid Supabase session, redirect to /login if not authenticated, show admin nav with logout.

/app/login/page.tsx — email + password form, magic link option, redirect to /admin on success.

Supabase Row Level Security policies: posts: anyone can SELECT where published=true posts: only authenticated users can INSERT/UPDATE/DELETE messages: only authenticated users can SELECT

Output the SQL for all RLS policies and Next.js middleware.ts for route protection.

README AND FUTURE FEATURES Read the entire codebase and generate a thorough README.md.

Include:

  • Project overview (1–2 sentences)
  • Tech stack table (framework, language, styling, db, auth, hosting)
  • Local development steps (clone, install, env vars, run dev, first-run setup)
  • Environment variable reference table (name, required, description)
  • Folder structure tree with one-line descriptions
  • Deployment guide (Vercel + Supabase, step by step)
  • How to add new blog posts
  • License section (MIT)

Use clean GitHub-flavoured Markdown. Keep steps numbered and concise. Output only the README.md content — no commentary.

Then suggest the highest-impact missing features.

For each suggestion include:

  • What it is and why users would want it
  • Rough implementation approach (library or pattern to use)
  • Estimated complexity: low / medium / high

Areas to consider:

  • Newsletter subscription or email capture
  • Reading time estimate on posts
  • Related posts by tag
  • RSS feed at /feed.xml
  • Social share buttons (copy link, Twitter, LinkedIn)
  • Full-text search across posts
  • Open Graph / social preview images per post
  • Comment system (Giscus or Supabase-backed)

Prioritise by: user impact first, then implementation effort.

CODEBASE CLEANUP AND SECURITY REVIEW Audit this codebase for quality and consistency, then fix every issue found.

Check for:

  • Unused imports, variables, and dead code paths
  • Components that could be extracted or consolidated
  • Inconsistent naming (camelCase vs snake_case, file name casing)
  • TypeScript: replace all any types with proper interfaces
  • Magic strings or numbers that should be constants
  • Duplicate logic that should be a shared utility
  • Missing or incorrect key props in lists
  • Console.log statements left in production code
  • Environment variables referenced without null checks

For each issue: show the file, the problem, and the fix inline. Apply all fixes. Do not change behaviour — refactor only.

Then audit for security vulnerabilities.

Check for:

  • Supabase RLS policies — are all tables locked down correctly?
  • Exposed secrets — any API keys hardcoded or in client-side code?
  • CSRF protection — are mutating API routes protected?
  • Content Security Policy headers — are they present and correct?
  • Input validation — are all API route inputs validated with Zod?
  • SQL injection — any raw query construction?
  • Auth bypass — can a non-admin reach /admin routes?
  • Rate limiting — are auth endpoints protected against brute force?

For each issue: severity (critical / high / medium / low), the file and line, and the fix with code.

ACCESSIBILITY REVIEW Audit this Next.js codebase for accessibility issues and fix them all.

Check:

  • All images have descriptive alt text (not empty, not "image of")
  • All interactive elements are reachable by keyboard (Tab + Enter/Space)
  • All form inputs have associated label elements
  • Color contrast meets WCAG AA (4.5:1 for normal text, 3:1 for large)
  • A visible skip-to-content link appears on keyboard focus
  • Focus rings are visible — not removed via outline: none
  • ARIA roles and labels are used correctly (no misuse of role="button")
  • Error messages are announced to screen readers (role="alert")
  • Page has a single h1 per route; heading hierarchy is correct

Show each issue, the file, and the fixed code. Apply all fixes in place — do not leave anything as "TODO".


Comparação de Custos

Monthly AI Cost — Claude-Only vs. Hybrid

Assumes $20/mo Claude Pro subscription + $80+ of additional API usage. Hybrid routes bulk work to a local Ollama model — zero per-token cost.

💸Claude Only

Claude Pro (base)

included

$20/mo

Extra usage — Claude API

API billing

$80+/mo
Total

$100+/mo

$1,200+/yr

🤗Hybrid (Ollama + Claude)

Local model — Ollama + Modelfile

runs on your machine

—

HF inference endpoint (extra usage)

est. huggingface.co

$9/mo
Total

$9/mo

$108/yr

🎯

~$1,100+/yr saved

by routing bulk tasks to a local Ollama model — Claude handles the precision work

A conta é simples: o Ollama roda inteiramente na sua máquina, sem custo algum, e um endpoint de inferência do Hugging Face cobre o excedente por cerca de $9/mês. Isso substitui os mais de $80 em uso extra de API do Claude que tarefas em massa gerariam de outra forma. O Claude fica reservado para o trabalho que realmente se beneficia da sua profundidade de raciocínio — refatorações, migrações e qualquer coisa que precise de contexto preciso multi-arquivo.

Entre em contato

Interessado em um tema? Deixe uma mensagem e escolha uma categoria. Também estou disponível para uma reunião de consultoria gratuita — entre em contato e combinamos.