[{"data":1,"prerenderedAt":584},["ShallowReactive",2],{"blog-pt-replit-secrets-explained":3,"blog-index-pt":342},{"id":4,"title":5,"body":6,"category":299,"cover":300,"coverAlt":301,"description":302,"draft":303,"extension":304,"faq":305,"image":320,"keywords":321,"meta":328,"navigation":329,"ogTitle":330,"path":331,"published":332,"seo":333,"stem":334,"tldr":335,"updated":340,"__hash__":341},"blog_pt\u002Fblog\u002Freplit-secrets-explained.md","Como usar secrets no Replit, e o que ainda assim é publicado",{"type":7,"value":8,"toc":288},"minimark",[9,13,21,24,33,38,41,80,83,90,94,97,100,103,107,110,113,116,122,136,147,160,167,171,174,184,190,195,205,208,212,215,218,221,232,238,246,250,276],[10,11,12],"p",{},"Em algum ponto entre construir o seu aplicativo e publicá-lo, o Replit disse para\nvocê parar de colocar a chave de API no código. Então você foi procurar como usar\nsecrets no Replit, moveu a chave para a ferramenta Secrets e o aviso sumiu.\nDepois alguém disse que a chave continua visível no seu aplicativo publicado, e\nas duas coisas parecem verdadeiras ao mesmo tempo.",[10,14,15,16,20],{},"São. Esta é a parte que a maioria dos conselhos sobre o assunto deixa de fora:\n",[17,18,19],"strong",{},"a ferramenta Secrets decide onde um valor fica guardado. O seu código decide\npara onde ele é levado."," São duas perguntas separadas, e só a primeira tem\nalguma coisa a ver com a ferramenta.",[10,22,23],{},"No Replit isso morde com mais força, porque a metade do seu aplicativo que roda\nna máquina do Replit e a metade que roda no notebook do visitante ficam no mesmo\nprojeto, muitas vezes em arquivos vizinhos. Nada no editor traça uma linha entre\nelas.",[10,25,26,27,32],{},"Entre 12 e 14 de agosto de 2026 rodamos as mesmas nove verificações externas em\n30.998 aplicativos no ar, dos quais 3.042 publicados no Replit. Em 219 desses\naplicativos do Replit havia algo com formato de chave dentro do código que um\nvisitante baixa. No conjunto da amostra, a maior parte do que essa verificação\nencontra é uma chave do Google, que com restrição costuma estar tudo bem. As que\nnão estão são justamente aquelas que uma ferramenta de secrets deveria ter\nevitado. Os números completos estão no\n",[28,29,31],"a",{"href":30},"\u002Fresearch\u002Fvibe-coded-app-security-2026","nosso relatório de varredura",".",[34,35,37],"h2",{"id":36},"como-uso-secrets-no-replit","Como uso secrets no Replit?",[10,39,40],{},"Abra a ferramenta Secrets, adicione um nome e um valor e leia esse valor no seu\ncódigo como variável de ambiente. Leva cerca de um minuto.",[42,43,44,52,64,67,77],"ol",{},[45,46,47,48,51],"li",{},"No seu projeto, abra ",[17,49,50],{},"Secrets",". Fica na lista de ferramentas, e procurar a\npalavra naquele painel encontra a ferramenta.",[45,53,54,55,58,59,63],{},"Escolha ",[17,56,57],{},"+ New secret",". Dê a ele um nome em maiúsculas com sublinhados, como\n",[60,61,62],"code",{},"OPENAI_API_KEY",". Esse nome é o que o seu código vai usar, então importa mais\ndo que parece.",[45,65,66],{},"Cole o valor no segundo campo e salve. O Replit criptografa o valor e o mantém\nfora dos arquivos do projeto.",[45,68,69,70,73,74,32],{},"Leia o valor no código. Em JavaScript é ",[60,71,72],{},"process.env.OPENAI_API_KEY",", e em\nPython é ",[60,75,76],{},"os.getenv(\"OPENAI_API_KEY\")",[45,78,79],{},"Volte e apague o valor de onde ele estava antes.",[10,81,82],{},"O passo cinco é o que as pessoas pulam, e é dele que depende se tudo isso serviu\npara alguma coisa. Criar um secret não remove a cópia que você já tinha. Uma\nchave colada em um arquivo semana passada continua naquele arquivo, continua no\nhistórico do projeto e continua dentro de cada cópia do seu aplicativo publicada\ndesde então.",[10,84,85,86,89],{},"Um arquivo ",[60,87,88],{},".env"," faz o mesmo trabalho da ferramenta Secrets, com uma diferença\nque pesa: ele é um arquivo, então viaja junto com o projeto quando alguém faz um\nfork ou o liga a um repositório.",[34,91,93],{"id":92},"os-secrets-do-replit-são-seguros","Os secrets do Replit são seguros?",[10,95,96],{},"Para o que fazem, sim. O valor está criptografado, fica fora do seu código fonte,\ne as três formas mais comuns de uma chave escapar são todas fechadas por isso:\nvocê compartilha o projeto com alguém, você o liga a um repositório, ou alguém\nassiste você trabalhando.",[10,98,99],{},"Pense nisso como uma gaveta trancada. O que está na gaveta fica fora da vista de\nquem lê os seus arquivos. O que a gaveta não consegue decidir é o que o seu\naplicativo faz com o conteúdo depois que o seu próprio código a abriu e saiu\nandando.",[10,101,102],{},"E um aplicativo Replit publicado sai andando com bastante coisa. Todo visitante\nque carrega o seu site recebe a metade da frente inteira, porque um navegador não\nconsegue desenhar uma página que não recebeu. Se o código que abre a gaveta é\ncódigo que vai para os visitantes, o valor que ele tirou viaja junto.",[34,104,106],{"id":105},"qual-metade-do-seu-aplicativo-lê-a-chave","Qual metade do seu aplicativo lê a chave?",[10,108,109],{},"A metade que roda na máquina do Replit consegue ler um secret com segurança. A\nmetade que roda no navegador do visitante não consegue, e o jeito habitual de\nfazer funcionar é também o jeito pelo qual a chave se torna pública.",[10,111,112],{},"O seu código de servidor é a parte que o Replit executa: uma rota Express, um\nhandler em Python, uma função que fala com a OpenAI ou com a Stripe e devolve uma\nresposta ao seu aplicativo. Ela lê um secret, usa o valor, e o valor nunca sai da\nmáquina.",[10,114,115],{},"O seu código de navegador é tudo o que o notebook do visitante executa. Em um\nprojeto React é a maior parte do que você vem editando. Ele é compilado em um\npacote de JavaScript e baixado inteiro por qualquer pessoa que abra o seu site.",[117,118],"diagram",{"alt":119,"caption":120,"src":121},"Um cofre fechado de valores dentro de uma moldura tracejada que representa a máquina do Replit, com dois caminhos saindo dela. O caminho de cima chega a um servidor que permanece dentro da moldura, onde o valor continua desenhado como pontos ocultos e recebe um sinal de confirmação. O caminho de baixo chega a uma janela de navegador marcada VITE_, depois atravessa a moldura e termina em uma pessoa segurando o mesmo valor como uma barra legível, riscada.","Uma gaveta, dois leitores. O valor vai para onde for o código que a abriu.","\u002Fblog\u002Freplit-secrets-explained\u002Fwhich-half-reads-it-1600x760.png",[10,123,124,127,128,131,132,135],{},[60,125,126],{},"process.env"," não existe em um navegador, então o código de navegador que o lê\nnão recebe nada. Para o valor chegar, alguém o renomeia: ",[60,129,130],{},"VITE_OPENAI_API_KEY"," em\num projeto Vite, ou ",[60,133,134],{},"NEXT_PUBLIC_OPENAI_API_KEY"," em um de Next.js. Funciona na\nhora, porque esse prefixo é uma instrução à ferramenta de build para escrever o\nvalor dentro do pacote. A própria documentação do Vite diz isso com todas as\nletras e desaconselha colocar chaves de API ali exatamente por esse motivo.",[10,137,138,139,142,143,146],{},"Então a verificação mais rápida deste artigo é uma busca. Abra o seu projeto e\nprocure por ",[60,140,141],{},"VITE_"," e ",[60,144,145],{},"NEXT_PUBLIC_",". Cada ocorrência é um valor que a sua\nferramenta de build tem ordem de publicar.",[10,148,149,150,154,155,159],{},"Para algumas isso está certo. Uma chave publicável do Supabase foi feita para\nficar em um navegador, e uma chave do Google Maps com uma\n",[28,151,153],{"href":152},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","restrição de referenciador"," também.\nEstá errado para tudo o que gasta dinheiro ou lê um banco de dados sem perguntar\nquem está batendo, e\n",[28,156,158],{"href":157},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","distinguir as duas"," leva cerca\nde um minuto por chave.",[10,161,162,163,32],{},"Se você prefere ver o que o seu aplicativo publicado está entregando antes de ir\narquivo por arquivo, a nossa varredura gratuita lê o seu site por fora e diz o\nque consegue encontrar ali. Leva cerca de 20 segundos e não precisa de conta:\n",[28,164,166],{"href":165},"\u002Fsecurity-scanner","escaneie seu aplicativo",[34,168,170],{"id":169},"por-que-meu-secret-do-replit-não-funciona","Por que meu secret do Replit não funciona?",[10,172,173],{},"Dois motivos, e de onde você está eles produzem o mesmo sintoma: um valor vazio e\num aplicativo que não funciona.",[10,175,176,179,180,183],{},[17,177,178],{},"O código que o lê roda no navegador."," Ali não existe ambiente algum para ler,\nentão ",[60,181,182],{},"process.env.SUA_CHAVE"," está vazio e vai continuar assim. Isso não é um\nproblema de configuração, e recriar o secret quantas vezes quiser não muda nada.\nA chamada que precisa da chave tem de mudar para a metade servidora do seu\naplicativo.",[10,185,186,189],{},[17,187,188],{},"O seu aplicativo publicado está rodando uma versão mais antiga."," O Replit\nmantém dois conjuntos de valores, os do seu workspace e aqueles com que o seu\naplicativo publicado roda. Eles se sincronizam, então um secret que você adiciona\nnormalmente chega ao deployment. O que o aplicativo no ar realmente usa, porém, é\no que estava lá na última vez que você publicou. Adicione um secret depois e o\naplicativo em funcionamento não saberá nada dele até você publicar de novo.",[117,191],{"alt":192,"caption":193,"src":194},"Dois painéis lado a lado. No painel do editor o cofre fechado guarda um valor preenchido e a prévia ao lado recebe um sinal de confirmação. No painel do aplicativo publicado o mesmo cofre tem um espaço vazio, o aplicativo no ar ao lado está riscado, e embaixo aparece a palavra undefined.","O mesmo nome nos dois lugares. O aplicativo no ar roda com os valores que existiam na última vez que você publicou.","\u002Fblog\u002Freplit-secrets-explained\u002Ftwo-stores-one-name-1600x560.png",[10,196,197,198,201,202,204],{},"O guia do próprio Replit para um aplicativo que funciona no editor e quebra\ndepois de publicado começa exatamente neste ponto, então vale abrir os secrets de\ndeployment e ler os nomes antes de dar qualquer coisa como quebrada. Um nome\nescrito ",[60,199,200],{},"OPENAI_KEY"," de um lado e ",[60,203,62],{}," do outro produz o mesmo valor\nvazio de um secret que não existe.",[10,206,207],{},"Uma implantação que falha à meia-noite é quando o atalho é tomado. Colar o valor\ndireto no código desbloqueia em segundos, o aplicativo volta, e a chave fica no\nseu pacote publicado a partir daquele momento.",[34,209,211],{"id":210},"a-chave-já-está-no-meu-aplicativo-publicado-e-agora","A chave já está no meu aplicativo publicado. E agora?",[10,213,214],{},"Gire a chave, antes de mudar qualquer código. No painel do provedor, gere uma\nchave nova e revogue a antiga.",[10,216,217],{},"Essa ordem importa porque a rotação é o único passo que faz o valor exposto parar\nde funcionar. Editar o seu código o tira da versão atual e o deixa no histórico\ndo projeto, e não faz absolutamente nada quanto às cópias do seu pacote que já\nforam baixadas, guardadas em cache e rastreadas. O seu aplicativo ser pequeno\ntambém não ajuda: rastreadores automáticos leem sites públicos atrás de cadeias\ncom formato de chave o tempo todo, sem a menor ideia de quem você é.",[10,219,220],{},"Depois, nesta ordem:",[42,222,223,226,229],{},[45,224,225],{},"Coloque a chave nova em Secrets e leia o valor só a partir de código de\nservidor.",[45,227,228],{},"Mova a chamada que precisava dela. Tudo o que fala com a OpenAI, a Anthropic,\na Stripe ou com o seu banco de dados usando uma chave administrativa pertence\natrás de uma rota que o seu aplicativo chama, para que o navegador pergunte ao\nseu servidor e o seu servidor guarde a chave.",[45,230,231],{},"Confira as páginas de uso e de cobrança do provedor no período em que a chave\nantiga esteve pública. A rotação para o que acontece de agora em diante e não\ndiz nada sobre o que já aconteceu.",[10,233,234,235,237],{},"Chaves de provedores de modelos são as primeiras a conferir no Replit.\n",[60,236,62],{}," é o exemplo a que a documentação do próprio Replit recorre\nquando mostra como adicionar um secret, e não existe variante publicável de uma\nchave da OpenAI ou da Anthropic. Cada uma delas cobra direto da sua conta.",[10,239,240,241,245],{},"Mais um lugar para olhar já que você está por aqui: se o seu projeto publica\n",[28,242,244],{"href":243},"\u002Fblog\u002Fsource-maps-exposed-in-production","source maps",", um visitante consegue ler\nesse pacote como os arquivos originais que você escreveu, com os seus próprios\nnomes de variável ainda neles.",[34,247,249],{"id":248},"o-que-fazer-esta-semana","O que fazer esta semana",[251,252,253],"key-takeaways",{},[254,255,256,259,267,270,273],"ul",{},[45,257,258],{},"Mova todas as chaves para a ferramenta Secrets e depois apague as cópias que ficaram em arquivos. Criar um secret não remove o valor antigo.",[45,260,261,262,142,264,266],{},"Procure ",[60,263,141],{},[60,265,145],{}," no seu projeto. Cada ocorrência é um valor que a sua ferramenta de build publica de propósito, e cada uma precisa ser uma chave que podia ser publicada.",[45,268,269],{},"Para qualquer uma que não seja, mova a chamada que a usa para a sua metade servidora, para que o navegador pergunte ao seu aplicativo e o seu aplicativo guarde a chave.",[45,271,272],{},"Se um secret aparece vazio no aplicativo publicado mas funciona no editor, publique de novo e confira o nome nos seus secrets de deployment antes de mexer no código.",[45,274,275],{},"Gire no provedor tudo o que já saiu, antes de tocar no código. Depois leia a página de cobrança das semanas em que a chave esteve pública.",[10,277,278,279,283,284,32],{},"Faça a busca primeiro. Leva um minuto, não precisa instalar nada e diz quais das\nchaves do seu projeto já são públicas. A\n",[28,280,282],{"href":281},"\u002Fchecklist","lista de segurança de 10 minutos"," cobre o resto do que vale\nconfirmar em um aplicativo recém-lançado, e o guia em linguagem simples para esta\nplataforma é\n",[28,285,287],{"href":286},"\u002Fis-your-replit-app-safe","o seu aplicativo Replit é seguro?",{"title":289,"searchDepth":290,"depth":290,"links":291},"",3,[292,294,295,296,297,298],{"id":36,"depth":293,"text":37},2,{"id":92,"depth":293,"text":93},{"id":105,"depth":293,"text":106},{"id":169,"depth":293,"text":170},{"id":210,"depth":293,"text":211},{"id":248,"depth":293,"text":249},"Noções de segurança","\u002Fblog\u002Freplit-secrets-explained\u002Fcover-1200x630.png","O logotipo do Replit, uma seta até um cofre fechado de valores ocultos e outra seta até o aplicativo em funcionamento que os lê.","Como usar secrets no Replit: adicionar um, ler de volta e resolver as duas causas do undefined. E as chaves que a ferramenta Secrets não consegue proteger.",false,"md",[306,308,311,314,317],{"q":93,"a":307},"Para o que fazem, sim. O Replit criptografa os valores e os mantém fora dos seus arquivos, então compartilhar o projeto, ligá-lo a um repositório ou transmitir enquanto você trabalha já não entrega a chave a quem está olhando. O que a ferramenta não consegue decidir é para onde o seu aplicativo leva o valor depois. Uma chave lida por código que roda na máquina do Replit fica no Replit. A mesma chave lida por código que roda no navegador do visitante fica embutida no que você publica, e tê-la guardado antes em Secrets não muda nada disso.",{"q":309,"a":310},"Por que meu secret do Replit aparece como undefined?","Duas causas, e de onde você está elas parecem idênticas. Ou o código que o lê roda no navegador, onde não existe ambiente algum para ler e process.env não tem nada dentro, ou o seu aplicativo publicado está rodando uma versão implantada antes de você criar o secret. Para o segundo caso, publique de novo: um aplicativo no ar usa os valores que existiam na última vez que ele saiu.",{"q":312,"a":313},"Posso usar um secret no meu frontend em React no Replit?","Você pode colocar um valor ali, e ele não será secreto. O código React roda na máquina do visitante, então tudo o que ele lê precisa ser enviado para lá primeiro. As ferramentas de build deixam isso explícito com um prefixo: o Vite só expõe ao código do navegador as variáveis começadas por VITE_, e o Next.js só as NEXT_PUBLIC_. Adicionar o prefixo é como se faz uma chave funcionar no frontend, e é também o momento em que essa chave se torna pública. Chaves publicáveis pertencem ali. Tudo o que gasta dinheiro ou lê um banco de dados pertence ao servidor.",{"q":315,"a":316},"Preciso adicionar meus secrets de novo quando publico?","Normalmente não, porque os secrets de deployment se sincronizam com os do seu workspace, mas o valor que o aplicativo no ar usa é o que estava presente na sua última publicação. Um secret adicionado depois chega ao deployment na publicação seguinte. O guia do próprio Replit para um aplicativo que funciona no editor e falha depois de publicado começa aqui, então se algo faltou na implantação, abra os secrets de deployment e confira se o nome está lá e escrito igual.",{"q":318,"a":319},"Colei uma chave de API em um arquivo antes de descobrir a ferramenta Secrets. Basta apagar o arquivo?","Não. Gire a chave no provedor primeiro, que é o que realmente fecha a porta, e depois mova o valor para Secrets. Apagar uma linha de código a tira da versão atual e não do histórico do projeto, nem de qualquer cópia do seu aplicativo publicado que alguém já tenha. A rotação é o único passo que faz o valor antigo parar de funcionar, e costuma levar cerca de um minuto no painel do provedor.","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",[322,323,324,325,326,327],"como usar secrets no replit","replit secrets","replit secrets não funciona","os secrets do replit são seguros","variáveis de ambiente replit","secret replit",{},true,"Como usar secrets no Replit","\u002Fblog\u002Freplit-secrets-explained","2026-08-31",{"title":5,"description":302},"blog\u002Freplit-secrets-explained",[336,337,338,339],"Como usar secrets no Replit: abra a ferramenta Secrets, adicione um nome e um valor e leia esse valor no código como variável de ambiente.","Isso mantém a chave fora dos seus arquivos. Não a mantém fora do aplicativo publicado, porque o que o código do navegador lê fica embutido no que cada visitante baixa.","O sinal é o nome. Uma variável começada por VITE_ ou NEXT_PUBLIC_ foi colocada no navegador de propósito pela sua ferramenta de build.","Um secret vazio no aplicativo publicado quase sempre significa que a versão no ar foi publicada antes de você criá-lo. Publique de novo.","2026-09-21","9h_pb1JvhqcIWI6qsSO1neIJy1cPdUx8KYorTU7LnMc",[343,350,356,361,367,373,379,385,391,397,403,409,415,421,427,433,439,445,451,457,463,469,475,481,482,488,494,500,506,512,518,524,530,535,541,547,551,557,563,569,574,580],{"path":344,"title":345,"description":346,"published":347,"category":348,"image":349,"draft":303},"\u002Fblog\u002Fsupabase-backup-auth-users","Por que seu dump do Supabase não tem usuários dentro","Rode supabase db dump sozinho e você recebe a forma do seu banco e nenhuma das linhas dele, sem o schema auth onde seus usuários moram.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":351,"title":352,"description":353,"published":354,"category":299,"image":355,"draft":303},"\u002Fblog\u002Fdomain-and-certificate-expiry","Domínio expirado, site fora do ar: o que acontece agora","Seu domínio expirou e seu site está fora do ar. O relógio que começa a correr, por que o certificado é o problema menor, e como conferir os dois.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":357,"title":358,"description":359,"published":340,"category":299,"image":360,"draft":303},"\u002Fblog\u002Fis-lovable-safe","O Lovable é seguro? O que vimos em 18.554 aplicativos Lovable","O Lovable é seguro? Passamos 18.554 aplicativos Lovable no ar por nove verificações. A plataforma foi a mais limpa de cinco. Os achados estavam nos aplicativos.","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":362,"title":363,"description":364,"published":365,"category":299,"image":366,"draft":303},"\u002Fblog\u002Fvibe-coded-app-security-checklist","O checklist de segurança do vibe coding, em nove verificações","Um checklist de segurança do vibe coding com nove itens, cada um verificável no seu app de fora por qualquer pessoa, e cada um com um teste de uma linha.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":368,"title":369,"description":370,"published":371,"category":299,"image":372,"draft":303},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Uma chave secreta da Stripe no frontend pode mover dinheiro","Uma chave secreta da Stripe exposta no seu frontend pode reembolsar, cobrar e ler cada ficha de cliente que você tem. Sua chave pk_live_ é que deve estar aí.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":374,"title":375,"description":376,"published":377,"category":299,"image":378,"draft":303},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variáveis de ambiente do Vite expostas: o prefixo diz publique isto","Variáveis de ambiente do Vite expostas no seu app: fizeram o que o prefixo pediu. VITE_ e NEXT_PUBLIC_ significam publique isto, e a IA nunca soube o custo.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":380,"title":381,"description":382,"published":383,"category":299,"image":384,"draft":303},"\u002Fblog\u002Fbase44-source-maps","Segurança no Base44: o que um scan aponta e o que é seu para corrigir","Segurança no Base44 em 5.438 apps escaneados: três achados em quase todos são da plataforma, o source map é o selo do Base44, e a sua parte é uma lista curta.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":386,"title":387,"description":388,"published":389,"category":299,"image":390,"draft":303},"\u002Fblog\u002Fis-cursor-ai-safe","O Cursor AI é seguro? O editor, o código e o app que você publicou","O Cursor AI é seguro? Três perguntas em uma busca: o que o Cursor guarda, o que o código que ele escreve erra, e se o app que você publicou está aberto.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":392,"title":393,"description":394,"published":395,"category":299,"image":396,"draft":303},"\u002Fblog\u002Fis-replit-safe","O Replit é seguro? O que vimos em 3.042 aplicativos Replit no ar","O Replit é seguro? Passamos 3.042 aplicativos Replit no ar por nove verificações externas. Os achados estavam no aplicativo publicado, não no host.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":398,"title":399,"description":400,"published":401,"category":348,"image":402,"draft":303},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: sua cópia do banco não tem nenhum arquivo","Um Supabase storage backup é uma tarefa à parte. Os backups do banco guardam a lista dos seus arquivos e nenhum deles, então cada upload fica quebrado.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":404,"title":405,"description":406,"published":407,"category":348,"image":408,"draft":303},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery do Supabase: preço e limites","O point-in-time recovery do Supabase rebobina seu banco para qualquer segundo da última semana. Custa $100 por mês além do Pro e cobre só o banco.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":410,"title":411,"description":412,"published":413,"category":348,"image":414,"draft":303},"\u002Fblog\u002Fsupabase-project-paused-recover","Projeto Supabase pausado? Seus dados continuam lá","O Supabase pausou seu projeto depois de uma semana sem atividade. Nada foi apagado, Restaurar fica ao lado do nome e você tem um ano antes disso mudar.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":416,"title":417,"description":418,"published":419,"category":299,"image":420,"draft":303},"\u002Fblog\u002Fsafest-ai-app-builder","Qual builder de apps com IA é mais seguro? 30.998 apps testados","Qual builder de apps com IA é mais seguro? Escaneamos 30.998 apps no ar do Lovable, Base44, Replit, v0 e Bolt. O builder não é o que decide sua nota.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":422,"title":423,"description":424,"published":425,"category":299,"image":426,"draft":303},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Ative Row Level Security em toda tabela do Supabase e comprove","Ativar Row Level Security no Supabase sem política fecha a tabela por completo. Uma política sem a chave ligada não faz nada. Aqui está o SQL, e o teste.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":428,"title":429,"description":430,"published":431,"category":299,"image":432,"draft":303},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": o que o aviso não vê","O Supabase marca \"RLS disabled in public\" como erro. Ele não diz nada sobre a política de leitura que deixa a sua tabela igualmente aberta.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":434,"title":435,"description":436,"published":437,"category":299,"image":438,"draft":303},"\u002Fblog\u002Frotate-supabase-service-role-key","Como rotacionar uma chave service_role do Supabase vazada","O Supabase manda fechar o vazamento primeiro. Outros guias mandam rotacionar agora. O que vale depende de para onde a sua chave service_role vazou.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":440,"title":441,"description":442,"published":443,"category":299,"image":444,"draft":303},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Scanners de segurança para vibe coding comparados, o nosso incluído","O melhor scanner de segurança para vibe coding depende de três perguntas que nenhuma lista de recursos responde. Dez ferramentas comparadas, com preços.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":446,"title":447,"description":448,"published":449,"category":299,"image":450,"draft":303},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: faça você mesmo as cinco verificações","Um Supabase security checker lê o seu app publicado em vez das configurações do projeto. Aqui estão as cinco verificações e como fazer cada uma sozinho.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":452,"title":453,"description":454,"published":455,"category":299,"image":456,"draft":303},"\u002Fblog\u002Fvibe-coding-security-scanner","Scanner de segurança para vibe coding: o que ele não vê","Um scanner de segurança para vibe coding lê seu app no ar, de fora. O que isso cobre, as quatro coisas que ele não consegue ver e como ler o resultado.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":458,"title":459,"description":460,"published":461,"category":299,"image":462,"draft":303},"\u002Fblog\u002Fmissing-security-headers","Cabeçalhos de segurança faltando: quando isso importa","Cabeçalhos de segurança faltando é o achado que nosso scanner mais imprime. Contra o que eles protegem e quando são a linha menos urgente do relatório.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":464,"title":465,"description":466,"published":467,"category":299,"image":468,"draft":303},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Sua chave de API da OpenAI está exposta no frontend. Troque-a.","Uma chave de API da OpenAI exposta no frontend não pode ser presa a um domínio. Troque-a hoje, mova a chamada para o seu servidor e limite o gasto.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":470,"title":471,"description":472,"published":473,"category":299,"image":474,"draft":303},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Chave de API exposta no frontend: o que 30.998 apps entregam","Uma chave de API exposta no seu frontend costuma ser uma chave do Google Maps. Escaneamos 30.998 apps vibe-coded e contamos quais segredos vazam de verdade.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":476,"title":477,"description":478,"published":479,"category":348,"image":480,"draft":303},"\u002Fblog\u002Fsupabase-backup-tools-compared","Ferramentas de backup do Supabase comparadas, a nossa incluída","Quatro tipos de ferramenta de backup do Supabase, o que cada uma copia de verdade e quando uma GitHub Action gratuita ganha de pagar, nós inclusive.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":331,"title":5,"description":302,"published":332,"category":299,"image":320,"draft":303},{"path":483,"title":484,"description":485,"published":486,"category":348,"image":487,"draft":303},"\u002Fblog\u002Fback-up-supabase-free-tier","Backups do plano gratuito do Supabase: como fazer sem terminal","No plano gratuito do Supabase não existe backup nenhum: a cópia é você que faz. Como fazer uma pelo painel e o que a rota do CSV deixa para trás.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":489,"title":490,"description":491,"published":492,"category":299,"image":493,"draft":303},"\u002Fblog\u002Fis-supabase-secure","O Supabase é seguro? É. Seu projeto é outra pergunta","O Supabase é seguro? A plataforma é auditada, criptografada e passa por pentests. A documentação deles diz onde isso termina e começam suas configurações.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":495,"title":496,"description":497,"published":498,"category":299,"image":499,"draft":303},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Onde ficam as chaves de API do Supabase: anon, service_role e URL","A URL do projeto, a chave anon e a chave service_role ficam todas numa página do painel. Aqui está onde ela fica, e qual dos quatro valores vai no seu app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":501,"title":502,"description":503,"published":504,"category":299,"image":505,"draft":303},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy no Supabase. E agora?","\"New row violates row-level security policy\" significa que o Supabase recusou uma escrita. O conserto rápido reabre a tabela para qualquer um.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":507,"title":508,"description":509,"published":510,"category":299,"image":511,"draft":303},"\u002Fblog\u002Fcors-wildcard-security-risk","Um curinga CORS é um risco de segurança? Quase nunca.","Um curinga CORS é um risco de segurança? Em geral é o padrão do seu builder e não entrega nada que o seu servidor já não desse a qualquer um que pedisse.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":513,"title":514,"description":515,"published":516,"category":348,"image":517,"draft":303},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Branching do Supabase não é backup. Ele só anda para a frente.","Por que o branching do Supabase não é backup: um branch começa sem os seus dados e um merge só leva o esquema. Para que ele serve e o que usar no lugar.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":519,"title":520,"description":521,"published":522,"category":348,"image":523,"draft":303},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Como restaurar um backup do Supabase, e o que quebra depois","Como restaurar um backup do Supabase pelo painel ou por um arquivo de dump, o que a restauração substitui e por que o seu app pode continuar quebrado no fim.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":525,"title":526,"description":527,"published":528,"category":299,"image":529,"draft":303},"\u002Fblog\u002Fsupabase-storage-bucket-public","Seu bucket do Supabase Storage é público. Isso é um problema?","Um bucket público do Supabase Storage significa que quem tem a URL de um arquivo pode abri-lo. Não significa que alguém possa listar o que está lá dentro.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":152,"title":531,"description":532,"published":533,"category":299,"image":534,"draft":303},"Uma chave de API do Google no frontend é um problema?","Uma chave de API do Google exposta no seu frontend é a chave que nosso scanner mais encontra, e quase sempre está tudo bem. Um ajuste gratuito decide isso.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":536,"title":537,"description":538,"published":539,"category":348,"image":540,"draft":303},"\u002Fblog\u002Fai-agent-deleted-my-database","Um agente de IA apagou meus dados do Supabase. O que eu recupero?","Um agente de IA apagou dados do seu banco. O que você recupera já estava decidido antes de ele rodar, e os próximos minutos decidem o resto.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":542,"title":543,"description":544,"published":545,"category":299,"image":546,"draft":303},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Qualquer um consegue ler seu banco Supabase? Testamos 3.680 apps","Qualquer um consegue ler seu banco de dados Supabase sem fazer login? Escaneamos 30.998 apps no ar criadas com builders de IA e medimos quantas dizem que sim.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":243,"title":548,"description":549,"published":545,"category":299,"image":550,"draft":303},"Source maps expostos: seu app está publicando o código original","Um source map exposto deixa qualquer um ler o código original do seu app, comentários incluídos. A verificação de 30 segundos e o que importa de verdade.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":552,"title":553,"description":554,"published":555,"category":299,"image":556,"draft":303},"\u002Fblog\u002Fsupabase-new-api-keys","As novas chaves de API do Supabase: qual vai no seu app?","O Supabase trocou anon e service_role por chaves publicáveis e secretas. Qual delas pertence ao seu app e qual nunca deve estar lá?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":558,"title":559,"description":560,"published":561,"category":348,"image":562,"draft":303},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","O Supabase faz backup do meu banco de dados? Depende do plano.","O Supabase faz backup do seu banco de dados? Todo dia nos planos pagos, e nada no gratuito. Como descobrir o que você tem e o que essa cópia não cobre.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":564,"title":565,"description":566,"published":567,"category":299,"image":568,"draft":303},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","O Supabase Row Level Security está ligado. A tabela continua pública.","Ligar o Supabase Row Level Security não protege uma tabela. Quem protege são as políticas, e a que consertou o seu app pode deixar qualquer um entrar.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":570,"title":571,"description":572,"published":567,"category":348,"image":573,"draft":303},"\u002Fblog\u002Fversion-history-is-not-a-backup","O histórico de versões não é backup. Ele não desfaz um delete.","Lovable e Bolt guardam um histórico de versões do seu código. Seu banco de dados é um serviço à parte, e voltar atrás não traz os seus dados de volta.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":575,"title":576,"description":577,"published":578,"category":348,"image":579,"draft":303},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Três formas de fazer backup de um banco Supabase, e o que falta","O painel, o pg_dump e um serviço gerenciado. O que cada um salva de verdade, o que deixa de fora sem avisar e qual sobrevive a perder a conta.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":157,"title":581,"description":582,"published":578,"category":299,"image":583,"draft":303},"Quais chaves de API são seguras no navegador e quais não são","Sua chave anon do Supabase foi feita para ser pública. Sua chave service_role não, e ela ignora todas as regras que você criar. Como diferenciar as duas.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150955895]