material da comunidade 7 prompts na ordem do arquivo vazio ao CRM no ar use Opus 4.8 ou Opus 5
material da comunidade 7 prompts na ordem do arquivo vazio ao CRM no ar use Opus 4.8 ou Opus 5
crie o seu CRM
passo a passo
7 prompts, 1 tarde
Crie o seu CRM e nunca mais pague por um.
Não é um CRM de mentira pra postar print. É um pipeline comercial de verdade: kanban que arrasta, ficha de lead que salva sozinha, tarefa atrasada aparecendo em vermelho, relatório de time, login com e-mail e senha e o time inteiro vendo o mesmo quadro ao vivo. Você não vai escrever uma linha de código. Você vai copiar sete prompts, na ordem.
7 prompts prontospeça Opus 4.8 ou Opus 5banco e login de graçatermina no ar, com link
meu-crm · index.html
O destino. Esse é o CRM que você vai ter no fim da página. Print de verdade, tirado agora, do CRM rodando.
Esse é o passo que ninguém fala e é o que mais estraga projeto. Um CRM desse tem umas 1.300 linhas num arquivo só. O modelo precisa segurar o arquivo inteiro na cabeça pra mexer no relatório sem quebrar o kanban que ele escreveu meia hora antes. Modelo pequeno até começa bonito, e no terceiro prompt ele apaga o que tinha feito.
Use no mínimo o Opus 4.8. Se tiver Opus 5, use o Opus 5.
É a diferença entre o CRM ficar de pé de primeira e você passar a tarde consertando. No seletor de modelo, escolha Opus antes de colar o primeiro prompt e não troque no meio do caminho. Modelo mais leve serve pra conversar, não pra construir sistema.
Onde rodar: o mais confortável é o Claude Code, porque ele escreve o arquivo direto na sua pasta e você só atualiza a página pra ver. Dá pra fazer tudo pelo claude.ai também, colando os prompts na conversa e salvando o arquivo que ele devolve. O que não muda é a regra: uma conversa só pro projeto inteiro. Se você abrir chat novo no meio, ele perde o CRM de vista e começa a inventar.
Modelo em Opus, confirmado no seletor.
Uma conversa só, do prompt 01 ao 07.
Uma pasta vazia chamada meu-crm no seu computador.
Testar clicando depois de cada prompt, nunca acumular três pra testar no fim.
02
Prompt 01: o esqueleto que já arrasta
Esse é o prompt mais longo da página, e é de propósito. Ele carrega a régua visual inteira (cor, fonte, canto, tamanho de texto) e as regras de comportamento. Se você amassar essa parte, o resto sai com cara de trabalho de escola.
Repare em três exigências dentro dele que fazem toda a diferença: arrastar com HTML5 de verdade (não botão de mudar etapa), 26 leads de exemplo com datas relativas a hoje (pra sempre existir tarefa atrasada quando você abrir) e nada de TODO no código. Sem essa última linha, a IA entrega meia funcionalidade e escreve "aqui você implementa".
Prompt 01 · o esqueleto
Você é um engenheiro de front-end sênior. Vamos construir um CRM de pipeline comercial completo. Quero o resultado em UM ÚNICO arquivo index.html, com HTML, CSS e JavaScript no mesmo arquivo: sem framework, sem build, sem npm, sem dependência externa. Tem que abrir com dois cliques no navegador e funcionar.
CONTEXTO
Quem usa é um time comercial pequeno, de 2 a 6 pessoas, que hoje controla lead em planilha. A tela principal é um kanban: cada lead é um card, cada coluna é uma etapa do funil, e a pessoa arrasta o card quando o negócio anda.
VISUAL (isso não é sugestão, é a régua)
- Fundo geral #F5F5F7, superfícies em branco puro, texto principal #101828, texto secundário #667085.
- Cor de marca: roxo #4F46E5, usada em botão primário, item ativo do menu e destaque. Nada de gradiente, nada de sombra pesada, nada de emoji na interface.
- Fonte Inter pelo Google Fonts. Título de 24 a 30px com letter-spacing negativo. Corpo de 13.5 a 14px.
- Cantos de 12 a 14px em cards e painéis, 10px em botões. Borda de 1px #E7E7EC no lugar de sombra na maioria dos blocos.
- Ícones em SVG inline com traço de 1.8. Nunca biblioteca de ícone, nunca emoji.
ESTRUTURA DA TELA
1. Rail vertical fixo de 100px na esquerda: logo quadrada roxa em cima, depois os itens Pipeline, Visão geral, Contatos, Tarefas e Relatórios (ícone em cima, rótulo de 11px embaixo), e no rodapé um sino, uma engrenagem e o avatar do usuário.
2. Topbar: título "Pipeline", campo de busca com o texto "Buscar leads, contatos...", botão Filtrar, botão de escolher colunas visíveis e botão roxo "+ Novo lead".
3. Faixa de 4 KPIs dentro de um card só, separados por linha vertical: Leads ativos, Em negociação, Previsão de receita (soma em R$ dos leads em aberto) e Conversão (ganhos dividido por ganhos mais perdidos, em porcentagem). Cada KPI tem um pontinho colorido de status.
4. O kanban, com rolagem horizontal.
AS 6 ETAPAS, nessa ordem e com essas cores no cabeçalho da coluna
novos #94A3B8, qualificados #3B82F6, propostas #8B5CF6, negociacao #F59E0B, ganho #12B76A, perdido #EF4444.
O cabeçalho de cada coluna mostra o nome da etapa, a quantidade de leads e a soma em R$ daquela coluna. Logo abaixo, um "+ Adicionar lead" que abre o modal já com aquela etapa preenchida.
O CARD DO LEAD
Nome em negrito, serviço, origem, avatar circular com as iniciais do responsável (a cor sai do nome, então o mesmo nome tem sempre a mesma cor) e a data da próxima ação. Se a próxima ação já passou, a data aparece destacada em laranja. O card inteiro é clicável e arrastável.
ARRASTAR E SOLTAR DE VERDADE
Use HTML5 drag and drop (draggable, dragstart, dragover, drop). Ao soltar em outra coluna, o lead muda de etapa, a tela atualiza na hora e o app grava uma linha no histórico daquele lead no formato "Movido de Qualificados para Propostas" com a data de hoje.
DADOS
Cada lead é um objeto com: id, nome, email, tel, servico, origem, valor, responsavel, etapa, criado_em, acao (objeto com texto e data), notas (lista) e hist (lista).
Crie uma função seed() com 26 leads brasileiros realistas, espalhados pelas etapas, com valores entre R$ 4.000 e R$ 25.000 e com TODAS as datas calculadas a partir do dia de hoje (hoje mais ou menos X dias), nunca datas fixas no código, pra sempre existir lead atrasado, lead de hoje e lead da semana.
Serviços: Consultoria Estratégica, Implementação de CRM, Gestão de Tráfego, Automação de Marketing, Criação de Site, Social Media.
Origens: Site, Indicação, Redes sociais, Evento, Anúncio, WhatsApp.
Responsáveis: quatro nomes brasileiros.
Tudo salva em localStorage numa chave só. Se abrir sem dado salvo, roda o seed.
O QUE MAIS PRECISA FUNCIONAR NESSA PRIMEIRA ENTREGA
- Modal de novo lead com todos os campos e validação de nome obrigatório.
- Busca que filtra por nome, e-mail, serviço e responsável enquanto digito.
- Filtro por responsável e por origem.
- Ligar e desligar colunas visíveis, com a preferência salva.
- Atalhos de teclado: "/" foca a busca, "n" abre novo lead, Esc fecha o que estiver aberto.
- Um toast discreto no canto confirmando cada ação.
- Tudo formatado em português do Brasil: R$ 12.400 e datas em dd/mm.
REGRAS DE ENTREGA
- Nenhum TODO, nenhuma função vazia, nenhum trecho comentado com "aqui você implementa". Se está no plano, está funcionando de verdade.
- Não me explique o código linha a linha. Me entregue o arquivo inteiro, pronto pra salvar como index.html.
- No fim, liste em 5 linhas o que eu devo clicar pra confirmar que ficou de pé.
index.html · depois do prompt 01
Teste antes de seguir: arrasta um card de Novos pra Propostas, aperta "/" e digita um nome, aperta "n" e cria um lead. Se as três funcionarem, o esqueleto está de pé.
03
Prompt 02: a ficha do lead
O kanban impressiona, a ficha é o que faz o time usar. É aqui que o vendedor edita o valor sem abrir modal, marca a próxima ação, dispara o WhatsApp e deixa a nota da ligação. Duas coisas nesse prompt valem ouro: o histórico que o app escreve sozinho (ninguém preenche log à mão) e o botão de WhatsApp com a mensagem já montada com o primeiro nome do lead.
Prompt 02 · a ficha do lead
Continue no mesmo arquivo index.html. Agora construa a ficha do lead: um painel lateral que desliza da direita quando eu clico num card do kanban.
COMPORTAMENTO
- 420px de largura no computador, tela inteira no celular. Anima em 0.25s.
- Fecha no X, no Esc e no clique fora do painel.
- Enquanto o painel está aberto, o card correspondente no kanban fica com a borda roxa.
CONTEÚDO, NESSA ORDEM
1. Pílula com a etapa atual, na cor da etapa, e logo abaixo o nome do lead em tamanho grande.
2. Serviço e origem em cinza, embaixo do nome.
3. Bloco de campos, cada linha com ícone, rótulo à esquerda e valor à direita, TODOS editáveis ali mesmo, sem abrir modal: Valor (campo numérico que volta formatado em R$ ao sair), Responsável (select com o time), Etapa (select com as 6 etapas), Criado em (só leitura) e Próxima ação (campo de data).
4. Bloco "Próxima ação": mostra o texto da tarefa e a data. Se estiver atrasada, o bloco ganha fundo avermelhado. Dois botões embaixo: um roxo "Follow-up no WhatsApp", que abre wa.me com o telefone do lead e uma mensagem já escrita usando o primeiro nome dele, e um "Marcar como concluída", que limpa a ação e grava no histórico.
5. Bloco "Notas": um campo "Adicionar nota..." que ao apertar Enter grava a nota com a data, e a lista das anteriores da mais nova pra mais antiga, cada uma com botão de apagar.
6. Bloco "Histórico": linha do tempo só de leitura, com bolinha e data. O app escreve aqui sozinho toda vez que o lead muda de etapa, muda de responsável, muda de valor ou tem ação concluída. Eu nunca escrevo no histórico à mão.
7. No rodapé do painel, um "Apagar lead" discreto em vermelho, com confirmação antes.
REGRAS
- Toda edição salva na hora, sem botão de salvar, e atualiza o card do kanban e os KPIs imediatamente.
- Mudar a etapa pelo select tem que ter exatamente o mesmo efeito de arrastar o card, incluindo a linha no histórico.
- Se o lead não tiver telefone, o botão de WhatsApp aparece desabilitado com um aviso, nunca quebrado.
- Não quebre nada do que já funciona. No fim, me diga o que testar.
index.html · depois do prompt 02
Repare: o card do Marcos Silva ficou com a borda roxa no kanban enquanto a ficha dele está aberta. É um detalhe de 3 linhas de código que faz a tela parecer software pago.
04
Prompt 03: as quatro abas do dono
Vendedor vive no kanban. Dono vive nessas quatro abas. É o que transforma o quadro bonito em ferramenta de gestão: onde o funil trava, quem está com o quê, o que está atrasado hoje e quanto cada serviço traz de receita.
Peça tudo num prompt só. O modelo em Opus dá conta das quatro de uma vez e elas compartilham os mesmos cálculos, então separar em quatro conversas só cria divergência de número entre as telas.
Prompt 03 · visão geral, contatos, tarefas e relatórios
Continue no mesmo arquivo. Agora construa as outras quatro telas, todas trocando pelo rail da esquerda, sem recarregar a página. Todas usam os mesmos leads e respeitam o filtro que estiver ativo.
ABA "VISÃO GERAL"
- Funil por etapa em barras horizontais: nome da etapa, quantidade e valor total, com a barra proporcional à maior etapa. Cor da barra igual à cor da etapa.
- Donut de origem dos leads feito em SVG puro (nada de biblioteca de gráfico), com legenda ao lado mostrando origem, quantidade e porcentagem.
- Lista "Próximas ações": os 6 compromissos mais próximos, com nome do lead, tarefa e data. Atrasado em vermelho. Clicar abre a ficha daquele lead no kanban.
- Lista "Atividade recente": as últimas 8 linhas de histórico de todos os leads juntas, ordenadas da mais nova pra mais antiga.
ABA "CONTATOS"
Tabela limpa com avatar, nome, e-mail, telefone, serviço, responsável, etapa (pílula colorida) e valor. Ordenável ao clicar no cabeçalho, com a mesma busca do topo funcionando aqui. Clicar na linha abre a ficha do lead.
ABA "TAREFAS"
As próximas ações agrupadas em quatro blocos, nessa ordem: Atrasadas, Hoje, Próximos 7 dias e Depois. Cada tarefa é uma linha com checkbox, nome do lead, o que fazer e a data. Marcar o checkbox conclui a ação, escreve no histórico e some da lista com uma animação curta. O bloco de Atrasadas tem contador em vermelho no título.
ABA "RELATÓRIOS"
- Leads por etapa: barras com quantidade e valor.
- Desempenho do time: uma linha por responsável com leads ativos, ganhos, perdidos, taxa de conversão e receita ganha, ordenado por receita.
- Receita por serviço: os seis serviços ordenados por valor total, com barra proporcional.
- Botão "Exportar CSV" que baixa todos os leads visíveis num arquivo separado por vírgula, com cabeçalho em português e acento correto (UTF-8 com BOM, senão o Excel brasileiro estraga os acentos).
REGRAS
- Todo número dessas telas sai do mesmo array de leads. Não invente dado de exemplo separado, senão as telas divergem.
- Nada de biblioteca de gráfico. Barras em div e donut em SVG.
- Estado vazio tratado em toda lista: quando não houver nada, uma frase curta em cinza no lugar, nunca uma área em branco.
- Me entregue o arquivo completo e diga o que testar.
visão geral
relatórios
tarefas
contatos
05
Prompt 04: o banco e a trava de segurança
Até aqui tudo vive no seu navegador. Bonito, mas some se você limpar o cache e ninguém do time enxerga. Agora entra o banco de verdade, de graça, no Supabase.
Antes de colar qualquer prompt: crie a conta em supabase.com, crie um projeto, e guarde duas informações que ficam em Settings, API: a Project URL e a chave anon public. A chave anon pode aparecer no código do site, ela foi feita pra isso. O que protege o seu dado não é esconder a chave, é a trava do próximo bloco.
Esse aqui é o único passo em que eu te dou o código pronto no lugar do prompt, porque SQL de segurança não é hora de deixar a IA improvisar. Abra o SQL Editor do Supabase, cole tudo, clique em Run uma vez só.
SQL · cole no editor do Supabase
-- 1. AS TRÊS TABELAS
create table if not exists crm_workspaces (
id uuid primary key default gen_random_uuid(),
nome text not null,
codigo text not null unique,
criado_por uuid not null references auth.users(id) on delete cascade,
criado_em timestamptz not null default now()
);
create table if not exists crm_membros (
workspace_id uuid not null references crm_workspaces(id) on delete cascade,
user_id uuid not null references auth.users(id) on delete cascade,
nome text not null default '',
papel text not null default 'membro',
criado_em timestamptz not null default now(),
primary key (workspace_id, user_id)
);
create table if not exists crm_leads (
id uuid primary key default gen_random_uuid(),
workspace_id uuid not null references crm_workspaces(id) on delete cascade,
nome text not null,
email text not null default '',
tel text not null default '',
servico text not null default '',
origem text not null default '',
valor numeric not null default 0,
responsavel text not null default '',
etapa text not null default 'novos',
criado_em date not null default current_date,
acao jsonb,
notas jsonb not null default '[]'::jsonb,
hist jsonb not null default '[]'::jsonb,
atualizado_em timestamptz not null default now()
);
create index if not exists crm_leads_ws on crm_leads(workspace_id);
-- 2. QUEM É MEMBRO DE QUAL PIPELINE
-- security definer pra consulta de membro não entrar em recursão com a própria RLS
create or replace function crm_e_membro(w uuid) returns boolean
language sql stable security definer set search_path = public as $$
select exists (
select 1 from public.crm_membros m
where m.workspace_id = w and m.user_id = auth.uid()
)
$$;
-- 3. TRAVA LIGADA EM TUDO
alter table crm_workspaces enable row level security;
alter table crm_membros enable row level security;
alter table crm_leads enable row level security;
drop policy if exists crm_ws_sel on crm_workspaces;
drop policy if exists crm_ws_upd on crm_workspaces;
drop policy if exists crm_ws_del on crm_workspaces;
create policy crm_ws_sel on crm_workspaces for select using (crm_e_membro(id));
create policy crm_ws_upd on crm_workspaces for update using (criado_por = auth.uid()) with check (criado_por = auth.uid());
create policy crm_ws_del on crm_workspaces for delete using (criado_por = auth.uid());
drop policy if exists crm_mb_sel on crm_membros;
drop policy if exists crm_mb_upd on crm_membros;
drop policy if exists crm_mb_del on crm_membros;
create policy crm_mb_sel on crm_membros for select using (crm_e_membro(workspace_id));
create policy crm_mb_upd on crm_membros for update using (user_id = auth.uid()) with check (user_id = auth.uid());
create policy crm_mb_del on crm_membros for delete using (user_id = auth.uid());
drop policy if exists crm_leads_all on crm_leads;
create policy crm_leads_all on crm_leads for all
using (crm_e_membro(workspace_id)) with check (crm_e_membro(workspace_id));
-- 4. CRIAR PIPELINE E ENTRAR POR CÓDIGO DE CONVITE
create or replace function crm_criar_workspace(p_nome text, p_meu_nome text) returns json
language plpgsql security definer set search_path = public as $$
declare v_id uuid; v_cod text; v_nome text;
begin
if auth.uid() is null then raise exception 'sem sessao'; end if;
v_nome := coalesce(nullif(trim(p_nome),''),'Meu pipeline');
v_cod := upper(substr(replace(gen_random_uuid()::text,'-',''),1,6));
insert into crm_workspaces(nome, codigo, criado_por)
values (v_nome, v_cod, auth.uid()) returning id into v_id;
insert into crm_membros(workspace_id, user_id, nome, papel)
values (v_id, auth.uid(), coalesce(nullif(trim(p_meu_nome),''),'Eu'), 'dono');
return json_build_object('id', v_id, 'nome', v_nome, 'codigo', v_cod, 'papel', 'dono');
end $$;
create or replace function crm_entrar(p_codigo text, p_meu_nome text) returns json
language plpgsql security definer set search_path = public as $$
declare w record;
begin
if auth.uid() is null then raise exception 'sem sessao'; end if;
select * into w from crm_workspaces where codigo = upper(trim(p_codigo));
if not found then raise exception 'codigo invalido'; end if;
insert into crm_membros(workspace_id, user_id, nome, papel)
values (w.id, auth.uid(), coalesce(nullif(trim(p_meu_nome),''),'Eu'), 'membro')
on conflict (workspace_id, user_id) do update set nome = excluded.nome;
return json_build_object('id', w.id, 'nome', w.nome, 'codigo', w.codigo, 'papel', 'membro');
end $$;
-- 5. CARIMBO DE ATUALIZAÇÃO
create or replace function crm_touch() returns trigger
language plpgsql set search_path = public as $$
begin new.atualizado_em := now(); return new; end $$;
drop trigger if exists crm_leads_touch on crm_leads;
create trigger crm_leads_touch before update on crm_leads
for each row execute function crm_touch();
-- 6. TEMPO REAL NO QUADRO
alter publication supabase_realtime add table crm_leads;
O que essas quatro linhas de RLS fazem
Row Level Security é o banco decidindo, linha por linha, quem pode ver o quê. Com a política ligada, alguém pode pegar a sua chave anon, abrir o console e pedir todos os leads: o banco devolve zero, porque a pessoa não é membro do seu pipeline. Sem RLS, devolve tudo. É literalmente a diferença entre um CRM e um vazamento.
06
Prompt 05: login, time e tempo real
Agora o CRM deixa de ser seu e vira do time. Login por e-mail e senha, cada pipeline com um código de convite de 6 dígitos e o quadro sincronizando ao vivo: quando o outro vendedor arrasta um card, ele anda na sua tela sozinha.
Antes de colar, troque as duas linhas do topo pela sua URL e pela sua chave anon. E mantenha o modo demonstração: é ele que deixa você mostrar o CRM pra um cliente sem pedir cadastro.
Prompt 05 · login, time e realtime
Continue no mesmo arquivo. Agora ligue o CRM no Supabase, sem quebrar nada do que já funciona.
MINHAS CREDENCIAIS
URL: COLE_AQUI_A_SUA_PROJECT_URL
Chave anon: COLE_AQUI_A_SUA_CHAVE_ANON
Carregue o supabase-js pelo CDN da jsdelivr, direto no HTML. Continua sendo um arquivo só.
O BANCO JÁ EXISTE, com essas tabelas e funções (não crie tabela nem SQL, só use):
- crm_workspaces (id, nome, codigo, criado_por)
- crm_membros (workspace_id, user_id, nome, papel)
- crm_leads (id, workspace_id, nome, email, tel, servico, origem, valor, responsavel, etapa, criado_em, acao jsonb, notas jsonb, hist jsonb, atualizado_em)
- rpc crm_criar_workspace(p_nome, p_meu_nome) devolve json com id, nome, codigo e papel
- rpc crm_entrar(p_codigo, p_meu_nome) devolve o mesmo json
A RLS já está ligada: cada pessoa só enxerga os leads dos pipelines de que ela é membro.
TELA DE ENTRADA (aparece antes do app quando não tem sessão)
- Card centralizado, mesmo visual do resto, com abas Entrar e Criar conta (e-mail e senha).
- Um link discreto embaixo: "ou ver a demonstração sem cadastro", que entra no modo demonstração de hoje, com os 26 leads no localStorage e um selo "Modo demonstração" ao lado do título.
- Se a confirmação de e-mail estiver ligada no meu projeto, mostre uma mensagem explicando que precisa clicar no link do e-mail, com um botão de reenviar. Nunca deixe a pessoa parada olhando um erro cru.
DEPOIS DE ENTRAR, se a pessoa ainda não tem pipeline
Uma tela com duas escolhas:
1. Criar um pipeline: campo com o nome do pipeline, campo com o meu nome (que vira o responsável nos leads) e um checkbox "começar com 26 leads de exemplo". Chama crm_criar_workspace e, se o checkbox estiver marcado, insere o seed no banco.
2. Entrar num pipeline existente: campo do código de 6 dígitos e o meu nome. Chama crm_entrar. Se o código não existir, mostre "Código não existe. Confere com quem te chamou.", não o erro técnico.
Depois de criar, mostre o código do time num toast e deixe ele sempre visível no menu do usuário, com botão de copiar.
O APP LIGADO NA NUVEM
- Ao abrir, carrega os leads daquele workspace e a lista de membros (que vira a lista de responsáveis).
- Toda alteração de lead vira upsert na hora. Criar é insert, apagar é delete.
- Realtime: assine as mudanças da tabela crm_leads filtrando pelo workspace_id e atualize a tela quando outra pessoa mexer. Se o painel do lead estiver aberto, não deixe a atualização fechar o painel nem perder o que estou digitando.
- Quem está em mais de um pipeline escolhe qual abrir num seletor no menu do usuário, e o último fica lembrado.
- Botão de sair, que limpa a sessão e volta pra tela de entrada.
REGRAS
- O modo demonstração continua funcionando exatamente como hoje, só no localStorage, sem tocar no banco.
- Nunca mostre erro técnico do Supabase pra quem usa: traduza pra uma frase em português com o que fazer.
- Se a internet cair no meio de uma edição, avise no toast e mantenha o que a pessoa digitou na tela.
- Me entregue o arquivo completo e a lista do que testar, incluindo o teste de abrir em duas janelas ao mesmo tempo.
07
Prompt 06: o celular
Vendedor abre o CRM no celular, no carro, antes da reunião. Se essa tela estiver ruim, o time volta pro WhatsApp em uma semana. Kanban no celular não é o quadro espremido, é outra navegação.
Prompt 06 · celular
Continue no mesmo arquivo. Agora deixe o CRM realmente usável no celular. Trabalhe com a tela de 390px de largura como referência e não estrague nada do computador.
REGRAS DA VERSÃO MOBILE
- O rail da esquerda vira uma barra de navegação fixa embaixo, com os 5 ícones e rótulo pequeno.
- O kanban rola na horizontal com uma coluna por vez ocupando quase a tela toda (scroll-snap), e o cabeçalho da coluna mostra etapa, quantidade e valor.
- Arrastar card com o dedo é ruim, então no celular o card ganha um toque longo que abre um menu curto "Mover para" com as 6 etapas. O arrastar continua funcionando no computador.
- A ficha do lead abre em tela cheia, subindo de baixo pra cima, com o X grande no topo.
- A faixa de KPIs vira duas colunas por duas linhas.
- Os campos de formulário com no mínimo 16px de fonte, pra o iPhone não dar zoom sozinho ao focar.
- Nenhum elemento pode causar rolagem horizontal na página. A rolagem horizontal existe só dentro do kanban.
- Toda área clicável com no mínimo 44px de altura.
- Coloque as regras de @media no FIM do CSS, depois de todo o resto, pra não serem sobrescritas.
Depois de aplicar, me diga como testar isso no navegador do computador sem celular na mão.
390px
O antes. É assim que o quadro se vira sozinho no celular sem esse prompt: dá pra usar, mas é a tela do computador espremida. O prompt 06 é o que troca o rail por barra embaixo e faz cada coluna ocupar a tela.
08
Prompt 07: colocar no ar
Enquanto o arquivo está na sua pasta, ele não existe pro time. Colocar no ar é de graça e leva uns três minutos na Vercel. Você vai sair daqui com um link que qualquer pessoa abre.
Prompt 07 · deploy
Meu CRM está pronto num arquivo index.html. Quero ele no ar, de graça, num link que eu possa mandar pro meu time hoje.
Me guie pelo caminho mais curto usando a Vercel, com o passo a passo clicado, assumindo que eu nunca usei a ferramenta e que eu não sei o que é terminal:
1. O que eu clico pra criar a conta e subir a pasta.
2. Como eu confiro que subiu certo.
3. Como eu atualizo o site depois de mudar o arquivo.
4. Como eu ligo um domínio próprio nesse link, se eu tiver um.
Depois do site no ar, faça a checagem de produção comigo e me diga o que precisa ser ajustado no meu arquivo:
- O título da aba e o ícone estão com a cara do meu CRM ou ainda estão genéricos?
- Tem meta description e imagem de compartilhamento, pra quando eu mandar o link no WhatsApp?
- Alguma coisa que só funciona no meu computador e vai quebrar no ar?
- No Supabase, a URL do site no ar precisa entrar em alguma lista de endereços permitidos pro login funcionar? Se precisar, me diga exatamente onde clicar.
- Faça a última varredura: abrir o link numa aba anônima, criar uma conta nova do zero, criar um pipeline, criar um lead, arrastar, fechar e abrir de novo pra ver se salvou.
Me responda em passos numerados e curtos, sem termo técnico sem explicação.
o mesmo caminho serve praagenda de horáriospainel de tráfegorecuperador de Pixatendente de WhatsAppformulário conversacionalo mesmo caminho serve praagenda de horáriospainel de tráfegorecuperador de Pixatendente de WhatsAppformulário conversacional
09
Os 3 loops que separam o brinquedo do sistema
Todo mundo consegue fazer a IA cuspir um CRM. O que quase ninguém faz é o depois. Esses três loops você roda em ordem, na mesma conversa, e roda de novo sempre que mexer em alguma coisa grande. É aqui que o projeto passa de demonstração pra ferramenta que aguenta o time.
Loop 01 · caça-problema
Pare de construir. Agora você vai atacar o próprio trabalho.
Vire o usuário mais desastrado possível do meu CRM e vá atrás do que quebra. Percorra o arquivo inteiro procurando por:
- Campo obrigatório que aceita vazio, e campo de valor que aceita letra, número negativo ou 15 casas decimais.
- Nome com aspas, sinal de menor e maior ou emoji quebrando a tela (o famoso XSS por concatenação de HTML).
- Lead sem telefone, sem e-mail, sem responsável ou sem próxima ação: alguma tela quebra?
- Zero leads no pipeline: os cálculos dividem por zero? As barras somem? Os relatórios explodem?
- Datas: virada de mês, virada de ano, fuso horário, tarefa marcada como concluída duas vezes rápido.
- Arrastar um card pra fora de qualquer coluna, arrastar e soltar na mesma coluna, soltar dois cards ao mesmo tempo.
- Clicar duas vezes rápido em salvar, em apagar e em criar (duplicidade).
- Filtro ativo mais busca ativa mais coluna escondida ao mesmo tempo: os KPIs continuam batendo com o que aparece?
- Recarregar a página no meio de uma edição.
Escreva a lista numerada dos problemas que você encontrou, do mais grave pro mais bobo, cada um com o que acontece na prática e em que trecho do código está.
Não conserte nada ainda. Depois da lista, conserte um por um, na ordem, e diga o que mudou em cada correção.
Quando terminar, rode essa mesma varredura de novo do zero. Repita até uma varredura inteira voltar sem nenhum problema novo.
Loop 02 · refino visual
Agora compare o meu CRM com as ferramentas que cobram caro por isso: Linear, Notion, Pipedrive e HubSpot.
Liste 10 diferenças concretas de acabamento entre o que eu tenho e o que essas ferramentas fazem. Não quero "melhorar o design", quero item objetivo: respiro entre blocos, alinhamento de número à direita, peso e tamanho de fonte na hierarquia, estado de hover, estado de foco no teclado, estado vazio, estado de carregando, animação de entrada e saída, consistência de raio de canto e de sombra, contraste do texto cinza.
Regras do refino:
- Não invente nova cor nem nova fonte. O que existe é o que temos.
- Nada de emoji na interface e nada de sombra pesada.
- Menos é melhor: se uma tela tem três pesos de fonte, é porque cada um tem função.
- Todo estado de carregando é esqueleto cinza, nunca a palavra "carregando".
- Todo estado vazio tem uma frase curta e um botão do que fazer.
Aplique as 10, uma de cada vez, e me diga o que mudou. No fim, me mostre o antes e o depois em texto: o que a pessoa vai notar de diferente ao abrir.
Loop 03 · o invasor
Agora esquece que você construiu esse CRM. Você é uma pessoa mal intencionada que abriu o meu site, apertou F12 e achou a minha chave anon no código. Seu objetivo é roubar os leads do meu cliente.
Liste tudo que você tentaria, e para cada tentativa me diga o resultado real considerando o SQL de RLS que está no banco:
- Pedir a tabela de leads inteira sem estar logado.
- Criar uma conta qualquer e pedir os leads de outro workspace.
- Adivinhar ou vazar um workspace_id e usar direto na consulta.
- Inserir lead dentro do workspace de outra pessoa.
- Alterar o meu próprio papel de membro pra dono.
- Ler a tabela de membros pra descobrir e-mails de quem usa o sistema.
- Entrar num pipeline por força bruta nos códigos de convite de 6 dígitos.
- Chamar as funções crm_criar_workspace e crm_entrar com argumentos estranhos.
Para cada item, responda em três linhas: o que eu tentei, o que o banco devolveu e se isso é um buraco ou não.
Se alguma coisa passar, me entregue o SQL da correção pronto pra colar, e a explicação em português do que ele bloqueia.
No fim, me diga em uma frase o que ainda seria possível vazar mesmo com tudo certo, pra eu saber o meu risco de verdade.
10
Quando travar (e vai travar)
Trava todo mundo. A diferença é o que você faz na hora. O erro clássico é gritar "não funciona" e a IA sair chutando correção em cima de correção até o arquivo virar sopa. Cole esse prompt no lugar disso.
SOS · destravar sem piorar
Alguma coisa quebrou. Antes de mexer em qualquer linha, investigue.
O que está acontecendo: DESCREVA AQUI O QUE VOCÊ FEZ E O QUE ACONTECEU
O que eu esperava: DESCREVA AQUI O QUE DEVERIA TER ACONTECIDO
O que apareceu no console (F12, aba Console): COLE AQUI A MENSAGEM VERMELHA, OU ESCREVA "nada"
Siga exatamente esta ordem:
1. Diga em uma frase qual é a sua hipótese da causa, com o trecho do código que você suspeita.
2. Liste as outras duas causas possíveis, mesmo que você ache menos provável.
3. Me diga o teste mais rápido pra saber qual das três é a verdadeira, e o que eu devo ver na tela em cada caso.
4. Só depois que a causa estiver confirmada, faça a correção mínima. Não reescreva o arquivo inteiro, não aproveite pra "melhorar" outra coisa e não mude o visual.
5. Diga o que exatamente mudou e o que eu clico pra confirmar que voltou.
Se você não tiver certeza da causa, diga que não tem certeza e me peça a informação que falta. Chutar correção é proibido.
o que aparece
o que é, na real
Invalid login credentials
Senha errada ou a conta ainda não confirmou o e-mail. Confere a caixa de entrada e o spam antes de mexer no código.
new row violates row-level security policy
Você está tentando gravar num workspace de que não é membro, ou está sem sessão. É a trava funcionando, não é bug.
A consulta volta vazia, sem erro
Quase sempre RLS: você está logado, mas não é membro daquele pipeline. Confere a tabela crm_membros.
infinite recursion detected in policy
A política está consultando a própria tabela sem função security definer. É pra isso que existe a crm_e_membro.
O card volta pro lugar ao soltar
Faltou o preventDefault no dragover. Sem ele, o navegador não aceita o drop.
Some tudo ao atualizar a página
Está gravando só na memória. Ou o localStorage não está sendo escrito, ou o upsert no Supabase está falhando calado.
Acento vira caractere estranho no Excel
Falta o BOM no CSV exportado. Uma linha de código no export resolve.
A tela de login fica por cima de tudo
O elemento escondido continua na tela. Falta a regra que esconde de verdade o que está marcado como oculto.
As oito regras que fazem esse caminho funcionar
Nenhuma delas é sobre código. São sobre como você comanda. Quem segue termina com CRM no ar hoje, quem ignora termina com um arquivo quebrado e a sensação de que IA não dá conta.
Opus, sempre
No mínimo Opus 4.8, de preferência Opus 5. Modelo leve serve pra conversar, não pra segurar 1.300 linhas na cabeça sem apagar o que já funcionava.
Uma conversa só
Do prompt 01 ao 07 no mesmo chat. Chat novo no meio do projeto é IA sem memória do que construiu, inventando de novo.
Teste depois de cada prompt
Clica, arrasta, recarrega. Descobrir o erro no prompt 03 custa dois minutos. Descobrir no 07 custa a tarde.
Um arquivo até o fim
Enquanto der pra manter tudo num index.html, mantenha. Separar em vinte arquivos é pra depois que o produto está de pé.
Proibido TODO
Repita em todo prompt: nada de função vazia, nada de "aqui você implementa". Sem essa linha, você recebe meia entrega bonita.
Régua visual no prompt
Cor em hexadecimal, fonte com nome, tamanho em pixel, raio de canto. "Deixa bonito" devolve template genérico, sempre.
Salve versão que funciona
Antes de um prompt grande, copie o index.html pra um index-ok.html. É o seu ponto de retorno quando algo der errado.
Segurança não se improvisa
O SQL de RLS é o único trecho que você cola pronto. É a diferença entre um CRM e um banco de dados aberto na internet.
o mesmo caminho
Terminou o CRM. O próximo é o que você mais paga por mês.
O que você acabou de fazer não foi construir um CRM. Foi aprender a sequência: régua visual dentro do prompt, uma conversa só, banco com a trava ligada, os três loops e o deploy. Troque o que a ferramenta faz e a sequência continua a mesma.
Agenda de horários: troque o kanban por um calendário e o lead por um agendamento
Painel de tráfego: as mesmas quatro abas, comendo dado da conta de anúncio
Recuperador de Pix: o mesmo banco, com uma tabela a mais e um webhook
O SQL muda de nome de tabela. A RLS e os três loops são iguais em todas
Agora é copiar o primeiro e ir.
Sete prompts. Uma conversa. Um arquivo. No fim da tarde você manda um link pro seu time e o lead que ia morrer na planilha aparece em vermelho na tela de alguém.