[{"data":1,"prerenderedAt":894},["ShallowReactive",2],{"blog-pt-supabase-permission-denied-for-table":3,"blog-index-pt":543},{"id":4,"title":5,"body":6,"category":503,"cover":504,"coverAlt":505,"description":506,"draft":507,"extension":508,"faq":509,"image":523,"keywords":524,"meta":531,"navigation":532,"ogTitle":533,"path":534,"published":535,"seo":536,"stem":537,"tldr":538,"updated":535,"__hash__":542},"blog_pt\u002Fblog\u002Fsupabase-permission-denied-for-table.md","Supabase \"permission denied for table\": o grant que falta",{"type":7,"value":8,"toc":491},"minimark",[9,18,26,31,34,57,60,70,73,76,80,87,107,151,154,160,163,201,205,208,215,224,228,231,237,240,246,261,266,273,277,280,296,299,350,354,357,365,368,392,396,401,435,442,446,484],[10,11,12,13,17],"p",{},"Se o seu app roda no Supabase, é provável que você tenha recebido um e-mail\nsobre 30 de outubro. Ele diz que nada muda nas tabelas que você já tem, e depois\nte entrega três comandos de SQL. Ou já é novembro: você pediu um recurso novo ao\nLovable, ao Bolt ou ao Cursor, a tela nova apareceu vazia, e em algum lugar do\nconsole está uma mensagem que diz ",[14,15,16],"code",{},"permission denied for table",". As duas coisas\nsão a mesma mudança do Supabase, vista de um lado e do outro da data.",[10,19,20,21,25],{},"Aqui está a parte que o e-mail deixa de fora: ",[22,23,24],"strong",{},"o SQL que ele mostra é metade da\ncorreção."," Rode essa metade sozinha, na tabela errada, e o seu app volta a\nfuncionar enquanto a tabela nova entrega as linhas a quem pedir.",[27,28,30],"h2",{"id":29},"o-que-significa-permission-denied-for-table-no-supabase","O que significa \"permission denied for table\" no Supabase?",[10,32,33],{},"Significa que o tipo de visitante que fez a requisição não recebeu acesso nenhum\nàquela tabela, então o banco recusou antes de olhar uma única linha.",[10,35,36,37,40,41,44,45,48,49,52,53,56],{},"O Supabase classifica cada requisição numa ",[22,38,39],{},"função"," (role, em inglês), que é o\ntipo de visitante de onde ela vem. ",[14,42,43],{},"anon"," é alguém que não fez login.\n",[14,46,47],{},"authenticated"," é alguém que fez. ",[14,50,51],{},"service_role"," é o seu próprio código de\nservidor usando a chave secreta. Um ",[22,54,55],{},"grant"," é o comando que dá a uma dessas\nfunções acesso a uma tabela no Postgres, o banco de dados sobre o qual o\nSupabase roda. Sem grant, sem acesso, não importa o que mais você tenha escrito.",[10,58,59],{},"Quando falta o grant, o Supabase responde assim, normalmente como um 401 ou um\n403:",[61,62,67],"pre",{"className":63,"code":65,"language":66},[64],"language-text","{\n  \"code\": \"42501\",\n  \"message\": \"permission denied for table comments\",\n  \"hint\": \"Grant the required privileges to the current role with: GRANT SELECT ON public.comments TO anon;\"\n}\n","text",[14,68,65],{"__ignoreMap":69},"",[10,71,72],{},"A dica é a parte útil. Ela diz qual função foi recusada e o comando exato que a\ndeixaria entrar.",[10,74,75],{},"Pense em cada tabela como uma sala. O grant é a porta, e existe uma porta\nseparada para cada função. O Row Level Security, as regras por linha que você\ntalvez já conheça, decide quais gavetas um visitante pode abrir depois de entrar.\n\"Permission denied for table\" quer dizer que alguém está parado diante de uma\nporta fechada. Essa pessoa nem chegou às suas regras.",[27,77,79],{"id":78},"o-que-muda-em-30-de-outubro","O que muda em 30 de outubro?",[10,81,82,83,86],{},"As tabelas novas no schema ",[14,84,85],{},"public",", a pasta de tabelas que o seu construtor usa\nquando ninguém diz o contrário, passam a chegar com as portas fechadas.",[10,88,89,90,92,93,95,96,98,99,106],{},"Até agora, o Supabase abria as três portas de toda tabela nova automaticamente:\nler, adicionar, alterar e apagar, para ",[14,91,43],{},", ",[14,94,47],{}," e ",[14,97,51],{},"\npor igual. Uma tabela ficava alcançável pelo seu app no momento em que passava a\nexistir, e as suas regras de Row Level Security eram a única coisa entre um\ndesconhecido e as linhas dela. O\n",[100,101,105],"a",{"href":102,"rel":103},"https:\u002F\u002Fsupabase.com\u002Fchangelog\u002F45329-breaking-change-tables-not-exposed-to-data-and-graphql-api-automatically",[104],"nofollow","changelog","\ndo Supabase explica o motivo sem rodeios: agentes e plataformas de IA agora\ncriam tabelas sem ninguém revisar a mudança, e os grants automáticos expunham\ntabelas que \"a developer forgot to protect\", que um desenvolvedor esqueceu de\nproteger.",[108,109,110,123],"table",{},[111,112,113],"thead",{},[114,115,116,120],"tr",{},[117,118,119],"th",{},"Data",[117,121,122],{},"O que aconteceu ou vai acontecer",[124,125,126,135,143],"tbody",{},[114,127,128,132],{},[129,130,131],"td",{},"28 de abril de 2026",[129,133,134],{},"Projetos novos passaram a poder recusar os grants automáticos na hora da criação.",[114,136,137,140],{},[129,138,139],{},"30 de maio de 2026",[129,141,142],{},"A ausência de grants automáticos começou a virar o padrão para projetos novos.",[114,144,145,148],{},[129,146,147],{},"30 de outubro de 2026",[129,149,150],{},"Os projetos existentes também deixam de recebê-los.",[10,152,153],{},"Se o seu projeto foi criado depois do fim de maio, ele talvez já funcione assim,\nporque o Supabase levou o novo padrão aos projetos novos ao longo das semanas\nseguintes a essa data.",[155,156],"diagram",{"alt":157,"caption":158,"src":159},"Uma linha do tempo com um marco em 2026-10-30. Antes dele, três tabelas estão com as portas abertas: duas têm um cadeado sobre as linhas, e a terceira não tem nenhum e suas linhas estão em âmbar. Depois dele, duas tabelas novas estão com as portas fechadas.","As tabelas que existem em 30 de outubro mantêm as portas que têm, inclusive uma que estava aberta a desconhecidos. Só as tabelas criadas depois começam com a porta fechada.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fbefore-and-after-october-30-1600x620.png",[10,161,162],{},"Três detalhes valem a pena antes da data:",[164,165,166,183,195],"ul",{},[167,168,169,175,176,95,179,182],"li",{},[22,170,171,172,174],{},"Só o schema ",[14,173,85],{},"."," O Storage e o login guardam as tabelas deles em\nschemas próprios, ",[14,177,178],{},"storage",[14,180,181],{},"auth",", e o Supabase diz que os grants e os\npadrões desses schemas continuam como estão.",[167,184,185,188,189,191,192,194],{},[22,186,187],{},"A chave secreta também é recusada."," Os grants automáticos cobriam o\n",[14,190,51],{}," também, então uma edge function (código de servidor que o\nSupabase roda para você) usando a sua chave secreta recebe o mesmo erro numa\ntabela nova até o ",[14,193,51],{}," ganhar um grant próprio.",[167,196,197,200],{},[22,198,199],{},"Uma tabela apagada e criada de novo é uma tabela nova."," Os grants pertencem\nà própria tabela e vão embora com ela quando ela é apagada. Se o seu construtor\nrecria uma tabela para alterá-la, a recriada começa com a porta fechada.",[27,202,204],{"id":203},"meu-app-vai-quebrar-em-30-de-outubro","Meu app vai quebrar em 30 de outubro?",[10,206,207],{},"Não no dia. Ele quebra na primeira vez que algo cria uma tabela nova sem criar\ntambém o grant.",[10,209,210,211,214],{},"Para a maioria de quem está lendo isto, esse algo é o construtor. Você pede uma\nseção de comentários. O construtor escreve uma migração, que é o arquivo de\nmudanças no banco que ele roda por você, e a migração cria uma tabela\n",[14,212,213],{},"comments",". Se ela também escrever os grants, você nunca vai ver esse erro. Se\nnão escrever, a tela de comentários não mostra nada, ou salvar um comentário\nfalha, ou aparece uma mensagem em vermelho, dependendo de como o seu app lida\ncom um erro. Todas as telas que você já tinha continuam funcionando.",[10,216,217,218,223],{},"O Supabase publica uma ",[100,219,222],{"href":220,"rel":221},"https:\u002F\u002Fsupabase.com\u002Fblog\u002Fsupabase-agent-skills",[104],"agent skill","\npara ferramentas de programação com IA que inclui o passo do grant. Se o seu\nconstrutor usa ou não depende do construtor, então o mais seguro é supor que a\npróxima tabela que ele criar pode chegar com a porta fechada.",[27,225,227],{"id":226},"é-seguro-rodar-o-grant-que-o-erro-sugere","É seguro rodar o GRANT que o erro sugere?",[10,229,230],{},"Só depois que a tabela estiver com o Row Level Security ligado e com uma regra\nescrita para ela. O grant decide quem passa pela porta. Nada nele decide quais\ngavetas a pessoa abre.",[10,232,233,234,236],{},"A chave que faz as requisições do seu app ao Supabase vai dentro do seu app,\nentão um grant para o ",[14,235,43],{}," quer dizer que qualquer visitante, com login ou\nsem, agora pode pedir linhas àquela tabela. Com uma regra no lugar, ele recebe\nas linhas que a regra permite. Com o Row Level Security desligado, ele recebe\ntodas as linhas da tabela, e nada no seu app vai parecer diferente.",[10,238,239],{},"O e-mail mostra três grants e para por aí. O próprio changelog do Supabase\nmostra três passos, e diz para tratá-los como uma unidade (\"treat these three\nsteps as a unit\"):",[61,241,244],{"className":242,"code":243,"language":66},[64],"-- 1. quem pode chegar à tabela\ngrant select on public.orders to authenticated;\ngrant select, insert, update, delete on public.orders to service_role;\n\n-- 2. ligar as regras por linha\nalter table public.orders enable row level security;\n\n-- 3. a regra em si\ncreate policy \"Customers read their own orders\"\n  on public.orders\n  for select\n  to authenticated\n  using (auth.uid() = user_id);\n",[14,245,243],{"__ignoreMap":69},[10,247,248,249,251,252,257,258,260],{},"Não há nenhuma linha para o ",[14,250,43],{}," nesse exemplo, e é de propósito. Ninguém sem\nlogin deveria chegar a uma tabela de pedidos, então a porta para desconhecidos\ncontinua fechada, e os clientes com login recebem só a leitura de que a tela\ndeles precisa. A regra, depois, restringe isso às linhas de cada um. O conselho\ndo próprio Supabase é\n",[100,253,256],{"href":254,"rel":255},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fapi\u002Fsecuring-your-api",[104],"dar a cada função o mínimo de que ela precisa",".\nUm grant para o ",[14,259,43],{}," cabe numa tabela cujas linhas são feitas para todo mundo,\ncomo os comentários embaixo de um post público.",[155,262],{"alt":263,"caption":264,"src":265},"Três faixas, cada uma com uma requisição do anon indo para a mesma tabela. Na primeira a porta está fechada e a seta para nela, com o código 42501. Na segunda a porta está aberta, a seta para numa barra de Row Level Security, e duas linhas da tabela se acendem. Na terceira a porta está aberta, a barra é só um contorno tracejado, e todas as linhas se acendem em âmbar.","O grant decide se uma requisição chega até a tabela. As regras atrás dele decidem quanto ela leva embora. Uma porta aberta sem regras atrás entrega a tabela inteira.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fthe-door-and-the-rules-1600x760.png",[10,267,268,269,174],{},"Se você quer ver de que lado dessa imagem as suas tabelas estão, o nosso\nescaneamento gratuito faz ao seu app no ar a pergunta que um desconhecido faria,\nconta as linhas que ele receberia sem buscar nenhuma delas, e leva uns 20\nsegundos, sem conta: ",[100,270,272],{"href":271},"\u002Fsecurity-scanner","escanear seu aplicativo",[27,274,276],{"id":275},"por-que-as-correções-de-row-level-security-não-mexem-nesse-erro","Por que as correções de Row Level Security não mexem nesse erro",[10,278,279],{},"Porque o grant é verificado primeiro. Uma requisição recusada na porta nunca\nchega às suas regras, então mudar as regras não muda nada no erro.",[10,281,282,283,286,287,291,292,295],{},"Isso importa porque o código é compartilhado. ",[14,284,285],{},"42501"," também é o que o Postgres\ndevolve quando o Row Level Security recusa um salvamento, como em\n",[100,288,290],{"href":289},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","new row violates row-level security policy",".\nUm assistente que se guia só pelo código pode partir para as correções que\npertencem àquele erro: desligar o Row Level Security, ou acrescentar uma regra\ncom ",[14,293,294],{},"using (true)",", que deixa todo mundo passar. Nenhuma das duas faz este erro\nsumir. As duas ficam para trás depois que o grant finalmente entra, e aí a porta\nestá aberta para gavetas sem tranca.",[10,297,298],{},"As palavras da mensagem distinguem os dois casos, mesmo que o número não\ndistinga:",[108,300,301,314],{},[111,302,303],{},[114,304,305,308,311],{},[117,306,307],{},"A mensagem diz",[117,309,310],{},"Qual tranca recusou",[117,312,313],{},"O que resolve",[124,315,316,328,340],{},[114,317,318,322,325],{},[129,319,320],{},[14,321,16],{},[129,323,324],{},"a porta (o grant)",[129,326,327],{},"um grant para a função que a dica aponta",[114,329,330,334,337],{},[129,331,332],{},[14,333,290],{},[129,335,336],{},"as regras",[129,338,339],{},"uma política que permita essa linha",[114,341,342,345,347],{},[129,343,344],{},"nenhum erro, e a lista vem vazia",[129,346,336],{},[129,348,349],{},"uma política de leitura para essa função",[27,351,353],{"id":352},"o-que-30-de-outubro-não-resolve","O que 30 de outubro não resolve",[10,355,356],{},"Nenhuma tabela que você já tem. Cada uma mantém exatamente o acesso que tem\nhoje, inclusive uma tabela que um desconhecido consegue ler neste momento.",[10,358,359,360,364],{},"A mudança é sobre tabelas que ainda não existem. Até agora toda tabela nova\nchegava com as portas abertas, então um app feito antes de 30 de outubro pode ter\numa em que ninguém nunca instalou as trancas: o Row Level Security nunca foi\nligado, ou\n",[100,361,363],{"href":362},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","foi ligado com uma regra que deixa todo mundo entrar",".\nO dia 30 de outubro deixa essas salas exatamente como estão.",[10,366,367],{},"Três lugares mostram onde você está:",[369,370,371,377,383],"ol",{},[167,372,373,376],{},[22,374,375],{},"A página de configurações da Data API",", que o e-mail traz em link. No\ndashboard ela fica em Integrations, depois Data API, e lista quais das suas\ntabelas estão alcançáveis.",[167,378,379,382],{},[22,380,381],{},"O Security Advisor",", que segundo o Supabase lista as tabelas que vale a\npena revisar antes da mudança.",[167,384,385,388,389,174],{},[22,386,387],{},"A vista de fora."," Nenhum dos dois primeiros diz o que um desconhecido\nrecebe de volta. Para isso você pergunta ao seu app no ar do jeito que um\ndesconhecido perguntaria, que é\n",[100,390,391],{"href":271},"o que o nosso escaneamento faz",[27,393,395],{"id":394},"como-o-reeve-vigia-as-tabelas-que-você-cria","Como o Reeve vigia as tabelas que você cria",[10,397,398],{},[22,399,400],{},"Depois de 30 de outubro, cada tabela que o seu construtor cria é uma decisão\nnova sobre quem passa pela porta. O Reeve confere a resposta de fora, e o\nMonitor continua conferindo.",[164,402,403,411,421],{},[167,404,405,408,409,174],{},[22,406,407],{},"O escaneamento gratuito"," pergunta a cada tabela que o seu app menciona\nquantas linhas um visitante sem login receberia, lê a contagem e para por aí,\nsem buscar nenhuma linha. Uns 20 segundos, sem conta:\n",[100,410,272],{"href":271},[167,412,413,416,417,420],{},[22,414,415],{},"O Reeve Monitor"," roda as nove verificações de hora em hora em até três apps\ne te manda um e-mail no dia em que a sua nota ",[22,418,419],{},"piora",", para que um deploy que\nabriu alguma coisa não fique esperando você aparecer para olhar.",[167,422,423,426,427,430,431,174],{},[22,424,425],{},"O Care"," roda as mesmas verificações e guarda uma cópia criptografada do seu\nbanco do ",[22,428,429],{},"Supabase"," fora da sua conta do Supabase, para que a correção de um\nassistente que recria uma tabela tenha uma cópia para onde voltar.\n",[100,432,434],{"href":433},"\u002Fsupabase-backups","Como a cópia é feita e restaurada",[10,436,437,438,174],{},"O que cada plano cobre está na ",[100,439,441],{"href":440},"\u002Fpricing","página de preços",[27,443,445],{"id":444},"o-que-fazer-antes-de-30-de-outubro","O que fazer antes de 30 de outubro",[447,448,449],"key-takeaways",{},[164,450,451,454,461,467,475,481],{},[167,452,453],{},"Deixe as tabelas que você já tem como estão, se tudo o que você quer é que o app continue funcionando. Elas mantêm os grants.",[167,455,456,457,460],{},"Peça ao seu construtor para escrever o grant, o ",[14,458,459],{},"enable row level security"," e uma política na mesma migração de cada tabela nova, como uma mudança só.",[167,462,463,464,466],{},"Quando o erro aparecer, leia qual função a dica aponta. ",[14,465,43],{}," quer dizer todos os visitantes do seu app.",[167,468,469,470,472,473,174],{},"Não dê nenhum grant ao ",[14,471,43],{}," numa tabela antes de o Row Level Security estar ligado e de haver uma regra escrita. Tabelas com pessoas ou pedidos em geral não precisam de grant nenhum para o ",[14,474,43],{},[167,476,477,478,480],{},"Recuse qualquer correção que desligue o Row Level Security ou acrescente ",[14,479,294],{}," para limpar um erro de permissão. Nenhuma das duas mexe nele.",[167,482,483],{},"Confira o que um desconhecido consegue ler das tabelas que você já tem. O dia 30 de outubro deixa essas tabelas como estão.",[10,485,486,487,490],{},"Comece pela tabela que um desconhecido mais gostaria de ler, em geral a que tem\npessoas dentro, e\n",[100,488,489],{"href":271},"escaneie seu aplicativo"," para ver o que ela entrega hoje.",{"title":69,"searchDepth":492,"depth":492,"links":493},3,[494,496,497,498,499,500,501,502],{"id":29,"depth":495,"text":30},2,{"id":78,"depth":495,"text":79},{"id":203,"depth":495,"text":204},{"id":226,"depth":495,"text":227},{"id":275,"depth":495,"text":276},{"id":352,"depth":495,"text":353},{"id":394,"depth":495,"text":395},{"id":444,"depth":495,"text":445},"Noções de segurança","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcover-1200x630.png","Uma fileira de portas para tabelas de um banco. As mais antigas estão abertas sobre linhas acesas, e a mais nova, no fim, está fechada.","A partir de 30 de outubro, uma tabela nova no Supabase responde \"permission denied for table\" até receber um grant. O e-mail mostra só metade.",false,"md",[510,513,515,517,520],{"q":511,"a":512},"Meu app no Supabase vai parar de funcionar em 30 de outubro?","Não. Toda tabela que existir em 30 de outubro mantém o acesso que tem, e o Supabase confirmou que esses grants não serão revogados. O que muda é a próxima tabela criada depois dessa data. Ela nasce inalcançável pelo seu app até alguém liberar o acesso, então a primeira coisa a quebrar é o primeiro recurso novo que precisar de uma tabela nova.",{"q":30,"a":514},"Significa que o tipo de visitante que fez a requisição não recebeu acesso nenhum àquela tabela, então o seu banco recusou antes de olhar uma única linha. A mensagem vem do Postgres, o banco de dados sobre o qual o Supabase roda, com o código 42501, e normalmente chega ao seu app como um 401 ou um 403. O Supabase acrescenta uma dica com o comando GRANT exato que deixaria esse visitante entrar.",{"q":227,"a":516},"Só depois que a tabela estiver com o Row Level Security ligado e com uma regra escrita para ela. Um grant para o anon deixa qualquer visitante do seu app pedir linhas à tabela, porque a chave que faz essas requisições vai dentro do seu app. Com uma regra no lugar, ele recebe as linhas que a regra permite. Sem regra e com o Row Level Security desligado, ele recebe todas.",{"q":518,"a":519},"Essa mudança afeta o Storage, o login ou as minhas edge functions?","O Storage e o login guardam as tabelas deles em schemas próprios, storage e auth, e o Supabase diz que os grants e os padrões desses schemas continuam como estão. As edge functions são outra história. Uma que usa a sua chave secreta ainda precisa de um grant em qualquer tabela nova, porque os grants automáticos que estão saindo cobriam o service_role além das duas funções que os seus visitantes usam.",{"q":521,"a":522},"Dá para ligar o comportamento antigo de novo?","O Supabase documenta um jeito, como configuração na página Data API do dashboard ou como SQL, e recomenda não fazer isso. Com ele ligado, toda tabela nova fica alcançável por qualquer visitante no momento em que passa a existir, e o Row Level Security é a única coisa entre um desconhecido e as linhas dela. Era assim que todo projeto funcionava antes da mudança.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",[525,526,527,528,529,530],"supabase permission denied for table","supabase grant tabelas novas","mudança supabase 30 de outubro data api","supabase 42501","supabase expor tabelas novas automaticamente","supabase default privileges schema public",{},true,"Supabase \"permission denied for table\" depois de 30 de outubro","\u002Fblog\u002Fsupabase-permission-denied-for-table","2026-09-26",{"title":5,"description":506},"blog\u002Fsupabase-permission-denied-for-table",[539,540,541],"A partir de 30 de outubro de 2026, uma tabela nova no seu projeto Supabase responde \"permission denied for table\" até alguém liberar o acesso a ela. As tabelas que você já tem continuam funcionando exatamente como hoje.","Um grant decide se uma requisição chega até a tabela. O Row Level Security continua decidindo quais linhas ela leva de volta. Dar acesso ao anon numa tabela sem regras deixa todas as linhas legíveis por qualquer pessoa.","A mudança não fecha nada que já esteja aberto. Confira hoje o que um desconhecido consegue ler, e de novo a cada tabela que você criar.","tpoOVbFwVjKbwvhLrnlGmKM0vn7DlJs6-8wuQO6W2U0",[544,550,556,562,568,574,580,586,592,598,604,610,616,623,629,634,635,641,647,653,659,665,671,677,683,689,695,701,707,713,719,725,731,737,743,749,755,761,767,773,779,785,791,797,803,809,814,820,826,832,838,844,850,856,861,867,873,878,883,889],{"path":545,"title":546,"description":547,"published":548,"category":503,"image":549,"draft":507},"\u002Fblog\u002Fbase44-security-scan","Scan de segurança do Base44: o que só ele enxerga","O scan de segurança do Base44 verifica sete tipos de problema por dentro. Esta é a metade que ele lê e mais ninguém, e a metade que ele nunca olha.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":551,"title":552,"description":553,"published":554,"category":503,"image":555,"draft":507},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Sua chave de API vazou. A ordem em que agir","Uma chave de API vazou e você não sabe o que fazer primeiro. Nem toda chave no seu frontend é um vazamento, e a ordem importa mais que a pressa.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":557,"title":558,"description":559,"published":560,"category":503,"image":561,"draft":507},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" sem desligar o RLS","\"Infinite recursion detected in policy for relation\" significa que a sua policy perguntou à tabela que ela protege. Veja como quebrar o círculo.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":563,"title":564,"description":565,"published":566,"category":503,"image":567,"draft":507},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" no Supabase, e a correção errada","\"No API key found in request\" significa que sua requisição chegou ao Supabase sem chave. Quase toda resposta aponta para as regras do seu banco.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":569,"title":570,"description":571,"published":572,"category":503,"image":573,"draft":507},"\u002Fblog\u002Fis-base44-safe","O Base44 é seguro? O que vimos em 5.442 apps Base44","O Base44 é seguro? Rodamos nove verificações em 5.442 apps Base44 no ar. Quase todas tiraram B por motivos que o dono nunca escolheu.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":575,"title":576,"description":577,"published":578,"category":503,"image":579,"draft":507},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Esconder uma chave de API: mova para uma Edge Function do Supabase","Esconder uma chave de API é tirá-la do navegador, e uma Edge Function do Supabase é o menor lugar para guardá-la. Dois passos em volta pesam mais.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":581,"title":582,"description":583,"published":584,"category":503,"image":585,"draft":507},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Seu arquivo .env está exposto? Os doze caminhos para testar","Seu arquivo .env está exposto no seu próprio servidor web? Doze endereços dizem isso em um minuto, e um acerto significa que tudo nele já é público.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":587,"title":588,"description":589,"published":590,"category":503,"image":591,"draft":507},"\u002Fblog\u002Fis-v0-safe","Segurança do v0: os 1.790 aplicativos v0 escaneados tiraram A","A segurança do v0 medida em 1.790 aplicativos v0 no ar: todos tiraram A. Só 17 citavam um banco de dados, e é sobretudo isso que esse A mede.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":593,"title":594,"description":595,"published":596,"category":503,"image":597,"draft":507},"\u002Fblog\u002Fis-bolt-safe","O Bolt é seguro? O que vimos em 1.123 aplicativos Bolt","O Bolt é seguro? Passamos 1.123 aplicativos Bolt no ar por nove verificações. A hospedagem saiu limpa. Os achados: chaves e tabelas abertas nos aplicativos.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":599,"title":600,"description":601,"published":602,"category":503,"image":603,"draft":507},"\u002Fblog\u002Fis-supabase-down-or-your-app","O Supabase caiu ou o problema é o seu app? Como saber","O Supabase caiu ou o problema é o seu app? Um projeto pausado, um banco cheio e um erro seu parecem iguais. Quatro verificações separam os casos.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":605,"title":606,"description":607,"published":608,"category":503,"image":609,"draft":507},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","O Supabase criptografa meus dados? Sim. Veja o que isso impede","O Supabase criptografa os dados? Sim: AES-256 em repouso, TLS em trânsito, SOC 2 e ISO 27001. O que cada um cobre, e o vazamento que nenhum deles impede.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":611,"title":612,"description":613,"published":614,"category":503,"image":615,"draft":507},"\u002Fblog\u002Fsupabase-free-plan-limits","Quanto custa o Supabase? Os limites do plano gratuito","Quanto custa o Supabase: o plano gratuito tem 500 MB de banco, 5 GB de egress e nenhum backup. O que acontece em cada limite e o que o Pro de $25 muda.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":617,"title":618,"description":619,"published":620,"category":621,"image":622,"draft":507},"\u002Fblog\u002Ftest-your-supabase-backup","Teste o backup do seu Supabase antes do dia em que precisar","Como testar o backup do seu Supabase: restaurar num projeto de teste, contar as linhas, entrar e procurar a linha que falta num arquivo cortado.","2026-09-28","Backups","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":624,"title":625,"description":626,"published":627,"category":621,"image":628,"draft":507},"\u002Fblog\u002Fsupabase-backup-github-action","Backup grátis do Supabase com uma GitHub Action, e a pegadinha","Um backup do Supabase com GitHub Action é grátis e serve para muitos apps. O workflow, a connection string certa e o egress de cada execução.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":630,"title":631,"description":632,"published":535,"category":621,"image":633,"draft":507},"\u002Fblog\u002Fdownload-your-supabase-backup","Por que você não consegue baixar seu backup do Supabase","Você não consegue baixar seu backup do Supabase num projeto atual, porque a cópia diária é um snapshot físico. Como conferir e como ter uma cópia só sua.","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":534,"title":5,"description":506,"published":535,"category":503,"image":523,"draft":507},{"path":636,"title":637,"description":638,"published":639,"category":503,"image":640,"draft":507},"\u002Fblog\u002Fopen-api-endpoint-exposed","Um endpoint de API aberto é um problema? Leia o JSON","Seu scan apontou um endpoint de API aberto. Se isso importa depende do que voltou, e a maioria dos que encontramos era da própria plataforma.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":642,"title":643,"description":644,"published":645,"category":503,"image":646,"draft":507},"\u002Fblog\u002Flovable-security-scan","Escaneamento de segurança do Lovable: o que ele não prova","Escaneamento de segurança do Lovable: o que o Quick scan e o Deep scan checam, quando cada um roda, e a única coisa que nenhum escaneamento por dentro prova.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":648,"title":649,"description":650,"published":651,"category":621,"image":652,"draft":507},"\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","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":654,"title":655,"description":656,"published":657,"category":503,"image":658,"draft":507},"\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":660,"title":661,"description":662,"published":663,"category":503,"image":664,"draft":507},"\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.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":666,"title":667,"description":668,"published":669,"category":503,"image":670,"draft":507},"\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":672,"title":673,"description":674,"published":675,"category":503,"image":676,"draft":507},"\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":678,"title":679,"description":680,"published":681,"category":503,"image":682,"draft":507},"\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":684,"title":685,"description":686,"published":687,"category":503,"image":688,"draft":507},"\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":690,"title":691,"description":692,"published":693,"category":503,"image":694,"draft":507},"\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":696,"title":697,"description":698,"published":699,"category":503,"image":700,"draft":507},"\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":702,"title":703,"description":704,"published":705,"category":621,"image":706,"draft":507},"\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":708,"title":709,"description":710,"published":711,"category":621,"image":712,"draft":507},"\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":714,"title":715,"description":716,"published":717,"category":621,"image":718,"draft":507},"\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":720,"title":721,"description":722,"published":723,"category":503,"image":724,"draft":507},"\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":726,"title":727,"description":728,"published":729,"category":503,"image":730,"draft":507},"\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":732,"title":733,"description":734,"published":735,"category":503,"image":736,"draft":507},"\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":738,"title":739,"description":740,"published":741,"category":503,"image":742,"draft":507},"\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":744,"title":745,"description":746,"published":747,"category":503,"image":748,"draft":507},"\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":750,"title":751,"description":752,"published":753,"category":503,"image":754,"draft":507},"\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":756,"title":757,"description":758,"published":759,"category":503,"image":760,"draft":507},"\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":762,"title":763,"description":764,"published":765,"category":503,"image":766,"draft":507},"\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":768,"title":769,"description":770,"published":771,"category":503,"image":772,"draft":507},"\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":774,"title":775,"description":776,"published":777,"category":503,"image":778,"draft":507},"\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":780,"title":781,"description":782,"published":783,"category":621,"image":784,"draft":507},"\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":786,"title":787,"description":788,"published":789,"category":503,"image":790,"draft":507},"\u002Fblog\u002Freplit-secrets-explained","Como usar secrets no Replit, e o que ainda assim é publicado","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.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":792,"title":793,"description":794,"published":795,"category":621,"image":796,"draft":507},"\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":798,"title":799,"description":800,"published":801,"category":503,"image":802,"draft":507},"\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":804,"title":805,"description":806,"published":807,"category":503,"image":808,"draft":507},"\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":289,"title":810,"description":811,"published":812,"category":503,"image":813,"draft":507},"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":815,"title":816,"description":817,"published":818,"category":503,"image":819,"draft":507},"\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":821,"title":822,"description":823,"published":824,"category":621,"image":825,"draft":507},"\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":827,"title":828,"description":829,"published":830,"category":621,"image":831,"draft":507},"\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":833,"title":834,"description":835,"published":836,"category":503,"image":837,"draft":507},"\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":839,"title":840,"description":841,"published":842,"category":503,"image":843,"draft":507},"\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":845,"title":846,"description":847,"published":848,"category":621,"image":849,"draft":507},"\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":851,"title":852,"description":853,"published":854,"category":503,"image":855,"draft":507},"\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":857,"title":858,"description":859,"published":854,"category":503,"image":860,"draft":507},"\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":862,"title":863,"description":864,"published":865,"category":503,"image":866,"draft":507},"\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":868,"title":869,"description":870,"published":871,"category":621,"image":872,"draft":507},"\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":362,"title":874,"description":875,"published":876,"category":503,"image":877,"draft":507},"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":879,"title":880,"description":881,"published":876,"category":621,"image":882,"draft":507},"\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":884,"title":885,"description":886,"published":887,"category":621,"image":888,"draft":507},"\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":890,"title":891,"description":892,"published":887,"category":503,"image":893,"draft":507},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","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",1791618971775]