[{"data":1,"prerenderedAt":701},["ShallowReactive",2],{"blog-pt-where-to-find-supabase-api-keys":3,"blog-index-pt":561},{"id":4,"title":5,"body":6,"category":514,"cover":515,"coverAlt":516,"description":517,"draft":518,"extension":519,"faq":520,"image":539,"keywords":540,"meta":548,"navigation":549,"ogTitle":550,"path":551,"published":552,"seo":553,"stem":554,"tldr":555,"updated":559,"__hash__":560},"blog_pt\u002Fblog\u002Fwhere-to-find-supabase-api-keys.md","Onde ficam as chaves de API do Supabase: anon, service_role e URL",{"type":7,"value":8,"toc":500},"minimark",[9,22,25,28,33,41,56,59,63,66,77,80,106,109,113,116,231,237,240,244,252,255,275,282,285,289,302,305,323,326,335,339,342,345,357,361,364,367,380,398,403,410,414,417,423,441,451,455,488],[10,11,12,13,17,18,21],"p",{},"Alguma coisa pediu a sua chave do Supabase. Um guia de instalação, uma thread de\nsuporte, ou uma IA para quem você mandou consertar o seu app. Você abre o\npainel, encontra uma página com um endereço e duas ou três chaves com nomes como\n",[14,15,16],"code",{},"anon"," e ",[14,19,20],{},"service_role",", e cada uma delas parece que pode ser a resposta.",[10,23,24],{},"Ou é a outra versão disso. Alguém abriu o seu site, apertou F12 e disse que uma\nchave está exposta. Agora você quer olhar a chave que essa pessoa encontrou, e\nnão sabe onde ela mora.",[10,26,27],{},"A maioria dos guias começa na página de chaves de API. Isso pressupõe que você\njá saiba qual projeto do Supabase é o seu, e esse é exatamente o passo que um\nbuilder fez por você e nunca explicou.",[29,30,32],"h2",{"id":31},"onde-ficam-as-chaves-de-api-do-supabase","Onde ficam as chaves de API do Supabase?",[10,34,35,36,40],{},"No painel, dentro do seu projeto, em ",[37,38,39],"strong",{},"Settings → API Keys",".",[10,42,43,44,47,48,51,52,55],{},"O caminho inteiro: entre no supabase.com, escolha o seu projeto na lista, abra\n",[37,45,46],{},"Settings"," na barra lateral esquerda e depois ",[37,49,50],{},"API Keys",". Quase todo guia e\ntoda captura de tela que você vai achar chamam essa página de\n",[37,53,54],{},"Settings → API",", porque era assim que ela se chamava até pouco tempo atrás. É\na mesma página e são os mesmos valores.",[10,57,58],{},"Tudo que está nela é uma de duas coisas. Um endereço, que diz onde o seu projeto\nmora. Ou uma chave, que decide o que uma requisição pode fazer depois que chega.\nA página lista as duas coisas juntas, numa coluna só, na mesma tipografia.",[29,60,62],{"id":61},"eu-nunca-configurei-o-supabase-qual-projeto-é-o-meu","Eu nunca configurei o Supabase. Qual projeto é o meu?",[10,64,65],{},"Leia o endereço que o seu app já está usando. A resposta está dentro dele.",[10,67,68,69,72,73,76],{},"Todo projeto do Supabase tem uma ",[37,70,71],{},"referência",": uma string curta e aleatória\nque também é a primeira parte do endereço do projeto,\n",[14,74,75],{},"https:\u002F\u002Fyourreference.supabase.co",". O seu app manda uma requisição para esse\nendereço a cada carregamento de página, então a string já está dentro do seu\napp, e é a mesma com que o painel identifica o seu projeto.",[10,78,79],{},"Três lugares onde achá-la sem perguntar a ninguém:",[81,82,83,90,100],"ul",{},[84,85,86,89],"li",{},[37,87,88],{},"No seu builder."," Lovable, Bolt, v0 e os outros mostram o projeto do\nSupabase conectado em algum lugar nas configurações ou no painel de\nintegrações do seu projeto.",[84,91,92,95,96,99],{},[37,93,94],{},"No seu navegador."," Abra o seu app no ar, aperte F12, vá para a aba Network\ne recarregue a página. As requisições que saem para alguma coisa com\n",[14,97,98],{},".supabase.co"," carregam a referência no próprio endereço.",[84,101,102,105],{},[37,103,104],{},"No código-fonte da página",", se o seu app escreve o endereço no HTML em vez\nde num arquivo de script.",[10,107,108],{},"Depois entre no supabase.com e compare essa referência com a sua lista de\nprojetos. Os builders conectam o Supabase pela sua própria conta, então o\nprojeto costuma estar num painel em que você se cadastrou uma vez e nunca usou.\nAssim que você entra num projeto a referência aparece na barra de endereços do\nnavegador, e é assim que você confirma que está no projeto certo antes de copiar\nqualquer coisa dele.",[29,110,112],{"id":111},"as-quatro-coisas-dessa-página","As quatro coisas dessa página",[10,114,115],{},"Um endereço e três chaves. Duas vão no seu app e duas nunca saem do painel.",[117,118,119,138],"table",{},[120,121,122],"thead",{},[123,124,125,129,132,135],"tr",{},[126,127,128],"th",{},"O que você vê",[126,130,131],{},"O que é",[126,133,134],{},"Para onde vai",[126,136,137],{},"Se vazar",[139,140,141,165,189,213],"tbody",{},[123,142,143,149,155,162],{},[144,145,146],"td",{},[37,147,148],{},"Project URL",[144,150,151,152,154],{},"O endereço do seu projeto, ",[14,153,75],{},". Diz onde, nunca quem.",[144,156,157],{},[158,159,161],"key-verdict",{"type":160},"safe","No seu app",[144,163,164],{},"Nada. Ela já vai para todo visitante a cada carregamento de página.",[123,166,167,176,182,186],{},[144,168,169,172,173],{},[37,170,171],{},"Publishable key"," ",[14,174,175],{},"sb_publishable_…",[144,177,178,179,181],{},"Diz qual é o projeto e não carrega permissão própria nenhuma. Chama-se ",[14,180,16],{}," num projeto antigo.",[144,183,184],{},[158,185,161],{"type":160},[144,187,188],{},"Nada sozinha. Ela lê exatamente o que as suas regras de Row Level Security permitem.",[123,190,191,199,204,210],{},[144,192,193,172,196],{},[37,194,195],{},"Secret key",[14,197,198],{},"sb_secret_…",[144,200,201,202,181],{},"Lê e escreve cada linha de cada tabela, digam o que disserem as suas regras. Chama-se ",[14,203,20],{},[144,205,206],{},[158,207,209],{"type":208},"danger","Só no servidor",[144,211,212],{},"Cada linha de cada tabela, para quem tiver achado.",[123,214,215,220,223,228],{},[144,216,217],{},[37,218,219],{},"JWT secret",[144,221,222],{},"Assina os tokens que dizem quem está logado. Chama-se JWT signing keys num projeto novo.",[144,224,225],{},[158,226,227],{"type":208},"Fica no Supabase",[144,229,230],{},"Alguém pode emitir um token afirmando ser qualquer um dos seus usuários, inclusive um administrador.",[232,233],"diagram",{"alt":234,"caption":235,"src":236},"Um painel de configurações com quatro linhas. A URL e a chave anon estão marcadas com um visto e seus valores aparecem inteiros. Abaixo de uma linha grossa, a chave service_role e o valor JWT estão marcados com um xis e seus valores cobertos por pontinhos.","Quatro valores, uma página. O Supabase não desenha linha nenhuma entre eles, e a máscara sobre os dois de baixo é a única pista que você ganha.","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Ffour-values-one-page-1600x720.png",[10,238,239],{},"Existe um atalho na própria página. O Supabase imprime a URL do projeto e a\nchave publicável onde você consegue ler, e cobre a chave secreta e o valor JWT\ncom pontinhos até você pedir para ver. As duas que ele cobre são justamente as\nduas que nunca vão no seu app.",[29,241,243],{"id":242},"onde-fica-a-url-do-meu-projeto-supabase","Onde fica a URL do meu projeto Supabase?",[10,245,246,247,249,250,40],{},"Em dois lugares, e você provavelmente já está olhando para um deles. O painel\nimprime ela no topo de ",[37,248,39],{},", com o rótulo Project URL. A barra\nde endereços do seu navegador mostra a mesma string sempre que o seu app fala com\no Supabase, no formato ",[14,251,75],{},[10,253,254],{},"No código ela usa um de três nomes, e os três guardam essa mesma string:",[81,256,257,263,269],{},[84,258,259,262],{},[14,260,261],{},"VITE_SUPABASE_URL"," num app construído com Vite, que cobre a maior parte do que\nLovable e Bolt produzem",[84,264,265,268],{},[14,266,267],{},"NEXT_PUBLIC_SUPABASE_URL"," num app Next.js",[84,270,271,274],{},[14,272,273],{},"SUPABASE_URL"," num servidor, numa edge function ou num script",[10,276,277,278,281],{},"O meio dela, ",[14,279,280],{},"yourreference",", é a referência do seu projeto. É a string pela qual\no painel identifica o projeto, e a que você compara quando tem vários projetos e\nnenhuma ideia de qual pertence a este app.",[10,283,284],{},"É um endereço mais do que um segredo, e é por isso que fica à vista ao lado da\nchave publicável.",[29,286,288],{"id":287},"onde-fica-a-chave-service_role-e-o-que-é-supabase_service_role_key","Onde fica a chave service_role, e o que é SUPABASE_SERVICE_ROLE_KEY?",[10,290,291,292,294,295,297,298,301],{},"Na mesma página que todo o resto. Abra ",[37,293,39],{}," e procure a linha\n",[14,296,20],{},", ou ",[14,299,300],{},"secret"," num projeto criado recentemente. Diferente da URL e da\nchave publicável, o valor dela fica atrás de um controle de revelar até você\npedir.",[10,303,304],{},"Esse controle é a única pista que o painel dá de que essa aqui é diferente, e vale\nlevar a sério: o Supabase cobre exatamente os valores que nunca podem chegar a um\nnavegador.",[10,306,307,310,311,314,315,318,319,322],{},[14,308,309],{},"SUPABASE_SERVICE_ROLE_KEY"," é um nome de variável mais do que uma segunda chave:\natrás dele está o valor que você acabou de revelar. Você vai encontrar num\narquivo ",[14,312,313],{},".env",", nas configurações de ambiente da sua hospedagem, ou nos segredos\nde uma edge function. O que importa é o prefixo na frente. Uma variável chamada\n",[14,316,317],{},"VITE_SUPABASE_SERVICE_ROLE_KEY"," ou ",[14,320,321],{},"NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY"," é\ncompilada dentro do JavaScript que seus visitantes baixam, então a chave fica\npública no momento em que você faz o deploy. Esses prefixos são instruções de\npublicar, não descuidos.",[10,324,325],{},"Onde ela cabe é numa edge function, num handler de webhook, num job agendado ou\nnum script de migração: em qualquer lugar onde o código roda numa máquina que\nvocê controla e nenhum visitante pode abrir o arquivo. Essa é a chave que ignora\nRow Level Security por completo, então lê cada linha de cada tabela digam o que\ndisserem as suas regras.",[10,327,328,329,334],{},"Se você não tem certeza de que a sua ficou no servidor, o nosso\n",[330,331,333],"a",{"href":332},"\u002Fsecurity-scanner","verificador de segurança de sites grátis"," lê o seu site no ar\npor fora e nomeia as chaves que encontra, em uns 20 segundos.",[29,336,338],{"id":337},"de-qual-chave-o-meu-app-precisa","De qual chave o meu app precisa?",[10,340,341],{},"Da URL do projeto e da chave publicável. Nada mais, nunca.",[10,343,344],{},"O seu app roda no navegador dos seus visitantes e fala com o Supabase de lá,\nentão os dois valores vão para todo visitante por construção. Isso não é um\nvazamento e nunca foi. O que impede um desconhecido de ler o seu banco inteiro\ncom uma chave publicável é o Row Level Security: as regras que decidem, linha\npor linha, quem pode ver o quê.",[10,346,347,348,352,353,40],{},"Então são essas regras que você precisa conferir quando fica preocupado, e\n",[330,349,351],{"href":350},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","ligá-las não é a mesma coisa que estar protegido",".\nA versão longa de por que uma chave é segura em público está em\n",[330,354,356],{"href":355},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","quais chaves de API são seguras no frontend",[29,358,360],{"id":359},"como-eu-sei-qual-chave-o-meu-app-levou-de-verdade","Como eu sei qual chave o meu app levou de verdade?",[10,362,363],{},"Pelo painel você não descobre. Ele lista as chaves que o seu projeto tem, não a\nque foi parar dentro do seu app.",[10,365,366],{},"São duas perguntas diferentes, e só a segunda pode te machucar. Um projeto pode\nter uma página de configurações completamente comum e mesmo assim ter a chave\nsecreta colada num arquivo que qualquer um consegue abrir. Para responder isso\nvocê tem que ler a chave que está de fato no app.",[10,368,369,172,372,375,376,379],{},[37,370,371],{},"Num projeto novo, leia os primeiros caracteres.",[14,373,374],{},"sb_publishable_"," é a que\npertence ali. ",[14,377,378],{},"sb_secret_"," é a que precisa de atenção hoje.",[10,381,382,172,385,387,388,390,391,394,395,40],{},[37,383,384],{},"Num projeto antigo, você tem que olhar dentro da chave.",[14,386,16],{}," e\n",[14,389,20],{}," são JWT: três blocos separados por pontos, e o do meio decodifica\npara texto perfeitamente legível. Ele carrega um campo ",[14,392,393],{},"role",", e essa única\npalavra é toda a diferença entre as duas.\n",[330,396,397],{"href":355},"Como ler isso",[232,399],{"alt":400,"caption":401,"src":402},"À esquerda, a página de configurações listando quatro valores, com as linhas anon e service_role destacadas. Duas linhas tracejadas saem dessas duas linhas e convergem para um único espaço destacado dentro de um bloco de código à direita, marcado com um ponto de interrogação.","O painel mostra quais chaves existem. Qual delas o seu app levou é uma pergunta que só o seu app pode responder.","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fwhat-exists-vs-what-shipped-1600x700.png",[10,404,405,406,40],{},"Se você prefere não passar o seu app na mão, o nosso scan gratuito lê o seu site\nno ar por fora e diz quais chaves ele consegue ver, junto com se as suas tabelas\nrespondem a um desconhecido que pergunta. Leva uns 20 segundos e não precisa de\nconta: ",[330,407,409],{"href":408},"\u002F#scan","escanear seu app",[29,411,413],{"id":412},"e-se-a-chave-secreta-já-estiver-no-meu-app","E se a chave secreta já estiver no meu app?",[10,415,416],{},"Resolva a chave em si antes de mexer em qualquer código, e no Supabase isso pode\nnão significar o que você espera.",[10,418,419,420,422],{},"O conselho de sempre é rotacionar: gerar uma chave nova, revogar a antiga, e o\nvalor que vazou para de funcionar. Isso continua valendo para as chaves novas.\nUm projeto pode ter várias chaves ",[14,421,378],{}," ao mesmo tempo e revogá-las uma\nde cada vez, então trocar uma não significa mais um minuto em que tudo que a\nusava está quebrado.",[10,424,425,426,432,433,435,436,440],{},"Para o par original não vale de jeito nenhum. As próprias notas de solução de\nproblemas do Supabase dizem que\n",[330,427,431],{"href":428,"rel":429},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Ftroubleshooting\u002Frotating-anon-service-and-jwt-secrets-1Jq6yd",[430],"nofollow","não é mais possível rotacionar os antigos segredos anon, service_role e JWT",".\nInutilizar uma chave ",[14,434,20],{}," antiga que vazou passa por criar as chaves\nnovas, mover seu app e seu código de servidor para elas, e só então desativar o\npar antigo. ",[330,437,439],{"href":438},"\u002Fblog\u002Fsupabase-new-api-keys","O que essa migração envolve"," são\nalguns passos no painel e um valor trocado no seu app, o que é bem mais\ntranquilo numa tarde calma do que no dia em que você precisa.",[442,443,445],"callout",{"type":444},"warn",[10,446,447,450],{},[37,448,449],{},"Apagar a chave do seu código não fecha a porta."," O valor antigo continua no\nseu histórico de versões, em qualquer deploy que você não reconstruiu desde\nentão, e na cópia em cache da sua página guardada por todo mundo que a carregou\nenquanto a chave estava ativa. Quem salvou uma dessas cópias ainda pode usá-la\namanhã contra o seu banco.",[29,452,454],{"id":453},"o-que-fazer-agora","O que fazer agora",[456,457,458],"key-takeaways",{},[81,459,460,469,472,482,485],{},[84,461,462,463,465,466,468],{},"Abra ",[37,464,39],{}," dentro do seu projeto. Se você não achar o projeto, tire a referência de ",[14,467,75],{}," e compare com a lista do seu painel.",[84,470,471],{},"Coloque a URL do projeto e a chave publicável no seu app. Essas duas, e nada mais.",[84,473,474,475,477,478,481],{},"Leia a chave que o seu app levou de verdade. ",[14,476,378],{}," na frente, ou ",[14,479,480],{},"\"role\": \"service_role\""," dentro de uma antiga, é o achado para tratar hoje.",[84,483,484],{},"Se tem uma chave secreta no seu frontend, inutilize antes de editar qualquer coisa. Num projeto antigo isso quer dizer criar as chaves novas e desativar o par antigo, e não existe um botão único para isso.",[84,486,487],{},"Dê uma olhada no Row Level Security já que você está no painel. Uma chave publicável só é segura por causa dessas regras, e sem elas ela lê o seu banco inteiro.",[10,489,490,491,495,496,40],{},"Se você prefere fazer isso como uma lista, o\n",[330,492,494],{"href":493},"\u002Fchecklist","checklist de segurança de 10 minutos"," cobre isso e as outras coisas\nque vale desligar num app recém-lançado, e temos um guia em linguagem simples\npara ",[330,497,499],{"href":498},"\u002Fis-your-supabase-app-safe","apps Supabase",{"title":501,"searchDepth":502,"depth":502,"links":503},"",3,[504,506,507,508,509,510,511,512,513],{"id":31,"depth":505,"text":32},2,{"id":61,"depth":505,"text":62},{"id":111,"depth":505,"text":112},{"id":242,"depth":505,"text":243},{"id":287,"depth":505,"text":288},{"id":337,"depth":505,"text":338},{"id":359,"depth":505,"text":360},{"id":412,"depth":505,"text":413},{"id":453,"depth":505,"text":454},"Noções de segurança","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcover-1200x630.png","Um painel de configurações: uma URL e uma chave anon à mostra, uma chave service_role e um valor JWT escondidos atrás de pontinhos.","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.",false,"md",[521,524,527,530,533,536],{"q":522,"a":523},"Onde fica a chave service_role no Supabase?","No painel, dentro do seu projeto, em Settings → API Keys. Num projeto antigo ela aparece com o nome service_role e fica escondida atrás de um botão para exibir; num projeto novo é uma chave secreta que começa com sb_secret_. Guias mais antigos chamam a mesma página de Settings → API.",{"q":525,"a":526},"Como é uma chave anon do Supabase?","Num projeto novo é uma string longa que começa com sb_publishable_. Num projeto antigo é um JWT: três blocos de caracteres separados por pontos, começando com eyJ, e com algumas centenas de caracteres no total. A chave service_role tem exatamente a mesma cara, e é por isso que as duas são confundidas.",{"q":528,"a":529},"A URL do meu projeto no Supabase é segredo?","Não. É o endereço para onde seu app manda cada requisição, então ela vai para todo visitante por construção e não existe versão do seu app em que ela esteja escondida. Encontrá-la não é um achado. Quem decide se um desconhecido consegue ler seus dados é o Row Level Security, não o fato de ele saber seu endereço.",{"q":531,"a":532},"Meu app foi construído para mim e eu nunca abri o Supabase. Como eu entro?","Ache primeiro a referência do seu projeto: a string curta e aleatória dentro do endereço que seu app já chama, https:\u002F\u002Fyourreference.supabase.co. Os builders conectam o Supabase pela sua própria conta, então o projeto costuma estar num painel em que você se cadastrou uma vez e nunca usou. Entre no supabase.com com essa conta e compare a referência com a lista de projetos.",{"q":534,"a":535},"Dá para rotacionar uma chave service_role que vazou?","Só se for uma das novas chaves sb_secret_, das quais você pode ter várias e revogar uma de cada vez. O Supabase disse que não é mais possível rotacionar os antigos segredos anon, service_role e JWT. Inutilizar uma chave antiga que vazou passa por criar as chaves novas, mover seu app e seu código de servidor para elas, e só então desativar o par antigo.",{"q":537,"a":538},"O que é SUPABASE_SERVICE_ROLE_KEY?","É o nome de variável de ambiente com que o seu código guarda a chave secreta, aquela que aparece como service_role num projeto antigo e como sb_secret_ num mais novo. O lugar dela é só a configuração do lado do servidor: uma edge function, um handler de webhook, um job agendado. Qualquer coisa com prefixo VITE_ ou NEXT_PUBLIC_ é compilada dentro do bundle do navegador, então uma chave service_role atrás de um desses nomes fica pública no momento do deploy.","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",[541,542,543,544,545,546,547],"onde fica a chave service_role do supabase","encontrar chave service_role supabase","encontrar chave anon supabase","chaves api supabase","formato chave anon supabase","url do projeto supabase","como pegar chave supabase",{},true,"Onde fica a chave service_role do Supabase?","\u002Fblog\u002Fwhere-to-find-supabase-api-keys","2026-08-28",{"title":5,"description":517},"blog\u002Fwhere-to-find-supabase-api-keys",[556,557,558],"Toda chave do Supabase, service_role incluída, fica numa página só: abra seu projeto no painel e depois Settings → API Keys.","Lá ficam quatro valores. A URL do projeto e a chave publicável vão no seu app; a chave secreta e o valor JWT nunca.","Essa página diz quais chaves existem. Ela não diz qual delas foi parar no seu app, e só a segunda pergunta pode te machucar.","2026-09-05","6cUuY5YbmCGzVhJz_XfoKiDqBDuhfBTU93bjIZ9eC3E",[562,568,573,579,585,591,598,604,610,616,617,623,629,635,641,647,653,659,665,670,675,681,686,691,697],{"path":563,"title":564,"description":565,"published":566,"category":514,"image":567,"draft":518},"\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":569,"title":570,"description":571,"published":559,"category":514,"image":572,"draft":518},"\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.","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":574,"title":575,"description":576,"published":577,"category":514,"image":578,"draft":518},"\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":580,"title":581,"description":582,"published":583,"category":514,"image":584,"draft":518},"\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 seu frontend não aceita nenhuma restrição de domínio. É um token ao portador, e quem a achar gasta o seu dinheiro.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":586,"title":587,"description":588,"published":589,"category":514,"image":590,"draft":518},"\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":592,"title":593,"description":594,"published":595,"category":596,"image":597,"draft":518},"\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","Backups","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":599,"title":600,"description":601,"published":602,"category":514,"image":603,"draft":518},"\u002Fblog\u002Freplit-secrets-explained","Como usar secrets no Replit, e o que ainda assim é publicado","Como usar secrets no Replit e o caso que a ferramenta não cobre: uma chave lida pelo código do navegador é publicada junto com o seu aplicativo.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":605,"title":606,"description":607,"published":608,"category":596,"image":609,"draft":518},"\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":611,"title":612,"description":613,"published":614,"category":514,"image":615,"draft":518},"\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":551,"title":5,"description":517,"published":552,"category":514,"image":539,"draft":518},{"path":618,"title":619,"description":620,"published":621,"category":514,"image":622,"draft":518},"\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":624,"title":625,"description":626,"published":627,"category":514,"image":628,"draft":518},"\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":630,"title":631,"description":632,"published":633,"category":596,"image":634,"draft":518},"\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":636,"title":637,"description":638,"published":639,"category":596,"image":640,"draft":518},"\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":642,"title":643,"description":644,"published":645,"category":514,"image":646,"draft":518},"\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":648,"title":649,"description":650,"published":651,"category":514,"image":652,"draft":518},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","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":654,"title":655,"description":656,"published":657,"category":596,"image":658,"draft":518},"\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":660,"title":661,"description":662,"published":663,"category":514,"image":664,"draft":518},"\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":666,"title":667,"description":668,"published":663,"category":514,"image":669,"draft":518},"\u002Fblog\u002Fsource-maps-exposed-in-production","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":438,"title":671,"description":672,"published":673,"category":514,"image":674,"draft":518},"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":676,"title":677,"description":678,"published":679,"category":596,"image":680,"draft":518},"\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":350,"title":682,"description":683,"published":684,"category":514,"image":685,"draft":518},"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":687,"title":688,"description":689,"published":684,"category":596,"image":690,"draft":518},"\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":692,"title":693,"description":694,"published":695,"category":596,"image":696,"draft":518},"\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":355,"title":698,"description":699,"published":695,"category":514,"image":700,"draft":518},"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",1788681839465]