[{"data":1,"prerenderedAt":1385},["ShallowReactive",2],{"blog-it-supabase-relation-does-not-exist":3,"blog-index-it":859},{"id":4,"title":5,"body":6,"category":815,"cover":816,"coverAlt":817,"description":818,"draft":819,"extension":820,"faq":821,"image":837,"keywords":838,"meta":848,"navigation":849,"ogTitle":5,"path":850,"published":851,"seo":852,"stem":853,"tldr":854,"updated":851,"__hash__":858},"blog_it\u002Fblog\u002Fsupabase-relation-does-not-exist.md","Supabase \"relation does not exist\" quando la tabella c'è",{"type":7,"value":8,"toc":802},"minimark",[9,18,28,35,38,43,61,72,75,148,181,192,196,199,208,245,302,314,317,325,336,340,353,356,403,419,425,438,443,449,453,456,464,470,484,491,494,500,517,520,526,534,539,543,549,552,558,565,580,584,597,609,612,618,625,643,648,652,655,666,675,679,682,692,715,724,742,746,795],[10,11,12,13,17],"p",{},"Il tuo builder ha aggiunto una tabella ",[14,15,16],"code",{},"invoices",". La vedi nel Table Editor, con\nle sue righe, e la pagina che dovrebbe elencarle resta vuota. La console del\nbrowser mostra questo:",[19,20,25],"pre",{"className":21,"code":23,"language":24},[22],"language-text","{\n  \"code\": \"PGRST205\",\n  \"details\": null,\n  \"hint\": \"Perhaps you meant the table 'public.Invoices'\",\n  \"message\": \"Could not find the table 'public.invoices' in the schema cache\"\n}\n","text",[14,26,23],{"__ignoreMap":27},"",[10,29,30,31,34],{},"Supabase \"relation does not exist\" significa che Postgres non ha trovato nessuna\ntabella né vista con esattamente quel nome negli schemi percorsi dalla query.\nPGRST205 è la stessa risposta data da PostgREST, la parte di Supabase che\ntrasforma le chiamate ",[14,32,33],{},"supabase.from(...)"," della tua app in query al database,\nprima ancora che la query arrivi a Postgres.",[10,36,37],{},"La soluzione che gira per questo errore è aggiungere lo schema a Exposed schemas\nnelle impostazioni del progetto. Risolve una delle quattro cause qui sotto. Lascia\nanche che chiunque abbia la chiave pubblica della tua app raggiunga ogni tabella di\nquello schema, quindi leggi che cosa apre prima di attivarla.",[39,40,42],"h2",{"id":41},"che-cosa-significa-relation-does-not-exist-in-supabase","Che cosa significa \"relation does not exist\" in Supabase?",[10,44,45,46,49,50,60],{},"Il database ha cercato una tabella con esattamente quel nome, negli schemi che\ndoveva percorrere, e non ne ha trovata nessuna. \"Relation\" è la parola di Postgres\nper qualunque cosa da cui escono righe, una tabella o una vista. Il codice\ndell'errore è ",[14,47,48],{},"42P01",", che\n",[51,52,56,57],"a",{"href":53,"rel":54},"https:\u002F\u002Fgithub.com\u002Fpostgres\u002Fpostgres\u002Fblob\u002Fmaster\u002Fsrc\u002Fbackend\u002Futils\u002Ferrcodes.txt",[55],"nofollow","Postgres chiama ",[14,58,59],{},"undefined_table",".",[10,62,63,64,67,68,71],{},"Pensa al tuo database come a un edificio. Ogni schema è un piano: ",[14,65,66],{},"public"," è il\npiano terra, e ",[14,69,70],{},"auth",", dove Supabase tiene i tuoi utenti, è un altro. Ogni tabella\nè una stanza con il suo nome sulla porta. Una query che dà solo il nome di una\nstanza la cerca ai piani elencati nel suo percorso di ricerca. Le richieste della\ntua app salgono con un ascensore, e l'ascensore si ferma solo ai piani che il tuo\nprogetto espone. L'errore significa che nessuno ha trovato una porta con quel nome\nai piani che ha controllato.",[10,73,74],{},"La formulazione che vedi dipende da dove è girata la query:",[76,77,78,91],"table",{},[79,80,81],"thead",{},[82,83,84,88],"tr",{},[85,86,87],"th",{},"Dove è girata la query",[85,89,90],{},"Che cosa torna",[92,93,94,108,122,134],"tbody",{},[82,95,96,100],{},[97,98,99],"td",{},"Il SQL Editor, una migrazione, una funzione o un trigger",[97,101,102,105,106],{},[14,103,104],{},"relation \"invoices\" does not exist",", codice ",[14,107,48],{},[82,109,110,113],{},[97,111,112],{},"La tua app, con PostgREST 13 o successivo",[97,114,115,105,118,121],{},[14,116,117],{},"Could not find the table 'public.invoices' in the schema cache",[14,119,120],{},"PGRST205",", HTTP 404",[82,123,124,127],{},[97,125,126],{},"La tua app, con un PostgREST più vecchio",[97,128,129,130,133],{},"una lettura riceve ",[14,131,132],{},"relation \"public.invoices\" does not exist",", HTTP 404, e un insert un errore vuoto",[82,135,136,139],{},[97,137,138],{},"La tua app, che chiede uno schema che il progetto non espone",[97,140,141,105,144,147],{},[14,142,143],{},"Invalid schema: billing",[14,145,146],{},"PGRST106",", HTTP 406",[10,149,150,151,156,157,159,160,165,166,168,169,174,175,180],{},"Il ",[51,152,155],{"href":153,"rel":154},"https:\u002F\u002Fgithub.com\u002FPostgREST\u002Fpostgrest\u002Fblob\u002Fmain\u002FCHANGELOG.md",[55],"changelog di PostgREST","\ndata la formulazione nuova alla versione 13.0.0, uscita l'8 maggio 2025:\n\"Querying non-existent table now returns ",[14,158,120],{}," error\". Prima, come ha\n",[51,161,164],{"href":162,"rel":163},"https:\u002F\u002Fgithub.com\u002FPostgREST\u002Fpostgrest\u002Fissues\u002F3697",[55],"spiegato uno dei suoi maintainer nell'issue #3697",",\nuna lettura andava a Postgres senza controlli e tornava come ",[14,167,48],{},". La\n",[51,170,173],{"href":171,"rel":172},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fdatabase\u002Fhardening-data-api",[55],"guida di Supabase alla protezione della Data API","\ndice che puoi controllare la versione di PostgREST del tuo progetto nella\nDashboard. ",[51,176,179],{"href":177,"rel":178},"https:\u002F\u002Fgithub.com\u002FPostgREST\u002Fpostgrest\u002Fblob\u002Fmain\u002Fsrc\u002Flibrary\u002FPostgREST\u002FError.hs",[55],"Il codice di PostgREST","\nfissa il resto: il suggerimento di PGRST205, quando c'è, nomina la tabella più\nsimile che conosce sullo stesso piano.",[10,182,183,184,187,188,60],{},"Se invece il messaggio dice ",[14,185,186],{},"permission denied for table",", la tabella è stata\ntrovata e la tua app è stata respinta alla porta. Quello ha\n",[51,189,191],{"href":190},"\u002Fblog\u002Fsupabase-permission-denied-for-table","un'altra soluzione",[39,193,195],{"id":194},"causa-1-il-nome-sulla-porta-ha-una-maiuscola","Causa 1: il nome sulla porta ha una maiuscola",[10,197,198],{},"Il nome deve coincidere esattamente, maiuscole comprese, e due degli strumenti che\nusi trattano le maiuscole in modo diverso dal terzo.",[10,200,201,202,207],{},"La\n",[51,203,206],{"href":204,"rel":205},"https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fsql-syntax-lexical.html",[55],"documentazione di Postgres","\nriassume la regola in una frase: \"Quoting an identifier also makes it\ncase-sensitive, whereas unquoted names are always folded to lower case.\" Gli altri\ndue tengono quello che hai scritto:",[209,210,211,227],"ul",{},[212,213,214,215,220,221,224,225],"li",{},"il Table Editor di Supabase crea la tabella con esattamente il nome che le dai.\n",[51,216,219],{"href":217,"rel":218},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fsupabase\u002Fblob\u002Fmaster\u002Fpackages\u002Fpg-meta\u002Fsrc\u002Fpg-meta-tables.ts",[55],"Il suo codice","\nmette il nome tra virgolette quando servono, quindi ",[14,222,223],{},"Invoices"," resta ",[14,226,223],{},[212,228,229,230,237,238,241,242,244],{},"PostgREST mette tra virgolette doppie ogni nome che la tua app invia\n(",[51,231,234],{"href":232,"rel":233},"https:\u002F\u002Fgithub.com\u002FPostgREST\u002Fpostgrest\u002Fblob\u002Fmain\u002Fsrc\u002Flibrary\u002FPostgREST\u002FQuery\u002FSqlFragment.hs",[55],[14,235,236],{},"pgFmtIdent","),\nquindi ",[14,239,240],{},".from('invoices')"," chiede ",[14,243,16],{}," e nient'altro",[76,246,247,260],{},[79,248,249],{},[82,250,251,254,257],{},[85,252,253],{},"Come è stata creata la tabella",[85,255,256],{},"In SQL, scrivi",[85,258,259],{},"Nella tua app, scrivi",[92,261,262,281],{},[82,263,264,273,277],{},[97,265,266,269,270,272],{},[14,267,268],{},"create table invoices",", o ",[14,271,223],{}," scritto in SQL senza virgolette",[97,274,275],{},[14,276,16],{},[97,278,279],{},[14,280,240],{},[82,282,283,291,297],{},[97,284,285,269,288,290],{},[14,286,287],{},"create table \"Invoices\"",[14,289,223],{}," scritto nel Table Editor",[97,292,293,296],{},[14,294,295],{},"\"Invoices\"",", virgolette comprese",[97,298,299],{},[14,300,301],{},".from('Invoices')",[10,303,304,305,307,308,310,311,313],{},"La seconda riga produce questo errore da entrambi i lati. La tua app chiama\n",[14,306,240],{}," e riceve PGRST205, con il nome vero nel suggerimento, come nel\nmessaggio in cima a questa pagina. Oppure l'app funziona, e una funzione o una\npolicy che nomina ",[14,309,223],{}," senza virgolette fallisce con\n",[14,312,104],{},", perché Postgres ha portato il nome in\nminuscolo prima di cercare.",[10,315,316],{},"Per vedere ogni tabella con quel nome, a qualunque piano e con qualunque\ncombinazione di maiuscole, esegui questo nel SQL Editor:",[19,318,323],{"className":319,"code":321,"language":322,"meta":27},[320],"language-sql","select table_schema, table_name\nfrom information_schema.tables\nwhere table_name ilike 'invoices';\n","sql",[14,324,321],{"__ignoreMap":27},[10,326,327,328,330,331,335],{},"La soluzione che non tocca niente dei tuoi dati sta nel codice: scrivi\n",[14,329,295],{}," con le sue virgolette in SQL, e le maiuscole esatte nell'app.\nRinominare la tabella invece rompe ogni schermata che usa ancora il nome vecchio.\n",[51,332,334],{"href":333},"\u002Fblog\u002Fsupabase-schema-cache-column-error","La versione per colonne di questo errore","\nha la stessa trappola per i nomi delle colonne.",[39,337,339],{"id":338},"causa-2-la-tabella-è-a-un-altro-piano","Causa 2: la tabella è a un altro piano",[10,341,342,343,345,346,349,350,352],{},"La tua app cerca in ",[14,344,66],{}," se non le dici altro, quindi una tabella in\nqualunque altro schema per lei non c'è. Per questo il messaggio dice\n",[14,347,348],{},"public.invoices",": ",[14,351,66],{}," è il piano dove è andato l'ascensore.",[10,354,355],{},"Succede in tre modi:",[209,357,358,371,380],{},[212,359,360,361,364,365,368,369],{},"il tuo builder ha creato la tabella in uno schema suo, come ",[14,362,363],{},"billing"," o\n",[14,366,367],{},"private",", e l'app chiama un semplice ",[14,370,240],{},[212,372,373,374,377,378],{},"lo schema è scritto dentro il nome, come ",[14,375,376],{},".from('billing.invoices')",". PostgREST\nlegge l'intera stringa come un solo nome di tabella e la cerca in ",[14,379,66],{},[212,381,382,383,168,386,391,392,394,395,398,399],{},"la tabella è ",[14,384,385],{},"auth.users",[51,387,390],{"href":388,"rel":389},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Fmanaging-user-data",[55],"guida di Supabase sui dati degli utenti","\ndice: \"For security, the Auth schema is not exposed in the auto-generated API.\"\nLa sua risposta è una tabella tua in ",[14,393,66],{},", ",[14,396,397],{},"profiles"," nel suo esempio,\nriempita da un trigger quando qualcuno si registra, e\n",[51,400,402],{"href":401},"\u002Fblog\u002Fdatabase-error-saving-new-user","quel trigger può fallire a modo suo",[10,404,405,406,409,410,415,416,418],{},"Una tabella a un altro piano si legge con ",[14,407,408],{},".schema('billing').from('invoices')",", e\nquello schema deve comparire in Exposed schemas nelle impostazioni API del\nprogetto, come mostra la\n",[51,411,414],{"href":412,"rel":413},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fapi\u002Fusing-custom-schemas",[55],"guida di Supabase sugli schemi personalizzati",".\nFinché non c'è, la risposta diventa ",[14,417,146],{},":",[19,420,423],{"className":421,"code":422,"language":24},[22],"{\n  \"code\": \"PGRST106\",\n  \"details\": null,\n  \"hint\": \"Only the following schemas are exposed: public, graphql_public\",\n  \"message\": \"Invalid schema: billing\"\n}\n",[14,424,422],{"__ignoreMap":27},[10,426,427,428,431,432,437],{},"Il suggerimento elenca i piani a cui l'ascensore si ferma davvero. PostgREST 12\nformula lo stesso errore in un altro modo, con l'elenco dentro il messaggio:\n",[14,429,430],{},"The schema must be one of the following: public, graphql_public",". È il testo che\nproduce ",[51,433,436],{"href":434,"rel":435},"https:\u002F\u002Fgithub.com\u002FPostgREST\u002Fpostgrest\u002Fblob\u002Fv12.2.12\u002Fsrc\u002FPostgREST\u002FError.hs",[55],"il suo codice per quella versione",",\ne il changelog ha spostato il nome dello schema nel messaggio con la 13.0.7.",[10,439,440,441,60],{},"La tua chiave segreta sale con lo stesso ascensore. L'esposizione è\nun'impostazione dell'API, quindi il codice server che usa supabase-js con quella\nchiave riceve lo stesso ",[14,442,146],{},[444,445],"diagram",{"alt":446,"caption":447,"src":448},"Un edificio in sezione con tre piani, public in basso, billing in mezzo e auth in alto, e il vano di un ascensore a destra. L'ascensore si ferma a public, dove la porta invoices è un posto vuoto tratteggiato che porta a una targa con PGRST205 e 404. La sua fermata a billing, dove c'è la porta invoices, è un vuoto tratteggiato color ambra che porta a una targa con PGRST106 e 406. Il piano auth non ha nessuna fermata.","L'ascensore si ferma solo ai piani esposti. Una tabella a un altro piano manca da public, e chiedere quel piano per nome viene rifiutato finché non è esposto.","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fthe-lift-stops-at-public-1600x760.png",[39,450,452],{"id":451},"che-cosa-apre-esporre-uno-schema","Che cosa apre esporre uno schema?",[10,454,455],{},"L'ascensore comincia a fermarsi a quel piano, e con i permessi che dà la guida di\nSupabase ogni visitatore riceve una chiave di ogni stanza che c'è. La Row Level\nSecurity è allora l'unica cosa che decide che cosa ciascuno può leggere o\ncambiare.",[10,457,458,459,463],{},"La ",[51,460,462],{"href":412,"rel":461},[55],"guida sugli schemi personalizzati","\nha due passaggi. Il primo è l'impostazione Exposed schemas. Il secondo è un blocco\ndi SQL, e le sue prime due righe sono:",[19,465,468],{"className":466,"code":467,"language":322,"meta":27},[320],"GRANT USAGE ON SCHEMA myschema TO anon, authenticated, service_role;\nGRANT ALL ON ALL TABLES IN SCHEMA myschema TO anon, authenticated, service_role;\n",[14,469,467],{"__ignoreMap":27},[10,471,472,475,476,479,480,483],{},[14,473,474],{},"anon"," è il ruolo dietro ogni richiesta di chi non ha fatto l'accesso. ",[14,477,478],{},"ALL","\nsignifica leggere, aggiungere, cambiare e cancellare. Il blocco continua con\n",[14,481,482],{},"ALTER DEFAULT PRIVILEGES",", che dà lo stesso accesso a ogni tabella creata in\nseguito a quel piano.",[10,485,486,487,490],{},"È sicuro dove la Row Level Security, le regole per riga che Supabase controlla a\nogni richiesta, è attivata e scritta per ogni tabella. La\n",[51,488,173],{"href":171,"rel":489},[55],"\ndice: \"Tables created through the Supabase Dashboard have RLS enabled by default.\nEnable RLS explicitly for tables created in the SQL Editor or through another\ntool.\" Uno schema che il tuo builder ha preparato in SQL può contenere tabelle\ndove è spenta. Esposta con quei permessi, una tabella così consegna ogni riga a\nchiunque abbia la tua chiave pubblica, e accetta anche le sue modifiche.",[10,492,493],{},"Controlla prima di esporre:",[19,495,498],{"className":496,"code":497,"language":322,"meta":27},[320],"select tablename, rowsecurity\nfrom pg_tables\nwhere schemaname = 'billing';\n",[14,499,497],{"__ignoreMap":27},[10,501,502,503,506,507,511,512,516],{},"Ogni riga che dice ",[14,504,505],{},"false"," è una tabella senza nessuna regola.\n",[51,508,510],{"href":509},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Attivare la Row Level Security su ogni tabella","\nspiega come attivarla e scrivere la prima regola, e\n",[51,513,515],{"href":514},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","\"RLS disabled in public\""," spiega la regola\ndi lettura aperta che lascia una tabella altrettanto raggiungibile anche con la Row\nLevel Security attiva.",[10,518,519],{},"Puoi anche dare meno permessi della guida. Un piano con una tabella che leggono\nsolo gli utenti che hanno fatto l'accesso ha bisogno di due righe:",[19,521,524],{"className":522,"code":523,"language":322,"meta":27},[320],"grant usage on schema billing to authenticated;\ngrant select on billing.invoices to authenticated;\n",[14,525,523],{"__ignoreMap":27},[10,527,528,529,533],{},"Se le tue tabelle rispondono a uno sconosciuto è una cosa che si controlla da\nfuori. La nostra ",[51,530,532],{"href":531},"\u002Fsecurity-scanner","scansione gratuita"," legge la tua app online\ncon la stessa chiave pubblica che riceve un visitatore, ti dice quali tabelle\nrestituiscono righe e non richiede un account.",[444,535],{"alt":536,"caption":537,"src":538},"Il piano billing disegnato due volte. A sinistra l'ascensore lì non si ferma e tre porte sono chiuse. A destra l'ascensore si ferma lì e tutte e tre le porte sono aperte: due stanze hanno un lucchetto sulle loro righe, la terza non ne ha e le sue righe sono color ambra.","Esporre un piano con i permessi della guida apre ogni porta che c'è. La Row Level Security è il lucchetto di ogni stanza, e una stanza senza lucchetto è aperta a chiunque abbia la tua chiave pubblica.","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fexposing-opens-every-room-1600x700.png",[39,540,542],{"id":541},"esporre-lo-schema-o-spostare-la-tabella","Esporre lo schema o spostare la tabella?",[10,544,545,546,548],{},"Decidi in base a chi legge la tabella. Una tabella che la tua app legge dal\nbrowser ha bisogno di un permesso per il ruolo che la legge e della Row Level\nSecurity con una regola, ovunque si trovi. Spostarla in ",[14,547,66],{}," ti risparmia il\npassaggio dell'esposizione, e nient'altro.",[10,550,551],{},"Se la sposti:",[19,553,556],{"className":554,"code":555,"language":322,"meta":27},[320],"alter table billing.invoices set schema public;\n",[14,557,555],{"__ignoreMap":27},[10,559,560,561,564],{},"La tabella tiene i suoi permessi e le sue regole. Una funzione il cui corpo nomina\n",[14,562,563],{},"billing.invoices"," fallisce poi con questo stesso errore, perché il corpo tiene il\nnome così come è stato scritto.",[10,566,567,568,570,571,575,576,579],{},"Una tabella che serve solo al codice server può restare a un piano dove\nl'ascensore non va mai. Una funzione in ",[14,569,66],{}," può fare con lei l'unico lavoro di\ncui la tua app ha bisogno, e\n",[51,572,574],{"href":573},"\u002Fblog\u002Fsupabase-function-not-found","chiamare una funzione Supabase"," spiega come\ntogliere ",[14,577,578],{},"execute"," ai visitatori che non hanno fatto l'accesso.",[39,581,583],{"id":582},"causa-3-una-funzione-con-il-percorso-di-ricerca-vuoto","Causa 3: una funzione con il percorso di ricerca vuoto",[10,585,586,587,590,591,593,594,596],{},"Una funzione impostata su ",[14,588,589],{},"search_path = ''"," non percorre nessun piano, quindi\nogni tabella che usa ha bisogno del suo schema davanti: ",[14,592,348],{},", mai un\n",[14,595,16],{}," da solo.",[10,598,599,600,608],{},"Il Security Advisor di Supabase chiede proprio questa impostazione. Il suo\n",[51,601,604,605],{"href":602,"rel":603},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fsplinter\u002Fblob\u002Fmain\u002Fdocs\u002F0011_function_search_path_mutable.md",[55],"avviso ",[14,606,607],{},"function_search_path_mutable","\ndice: \"We recommend pinning functions' search_path to an empty string\". La stessa\npagina finisce così: \"once you set the search_path = '' all references to\ntables\u002Ffunctions\u002Fviews\u002Fetc in your function's body must be qualified with a\nschema name.\"",[10,610,611],{},"Quindi l'avviso si risolve con una riga, e la funzione fallisce poi sul primo nome\ndi tabella senza schema:",[19,613,616],{"className":614,"code":615,"language":322,"meta":27},[320],"create or replace function public.count_invoices()\nreturns bigint\nlanguage plpgsql\nset search_path = ''\nas $$\nbegin\n  return (select count(*) from invoices);  -- relation \"invoices\" does not exist\nend;\n$$;\n",[14,617,615],{"__ignoreMap":27},[10,619,620,621,624],{},"Scrivi ",[14,622,623],{},"from public.invoices"," e torna a funzionare. Tieni l'impostazione: serve a\nimpedire che chi chiama la funzione faccia puntare un nome senza schema a una\ntabella sua.",[10,626,627,628,631,632,634,635,639,640,60],{},"Chiamata dalla tua app con ",[14,629,630],{},".rpc()",", l'errore attraversa PostgREST come ",[14,633,48],{},"\ncon HTTP 404, lo stato che\n",[51,636,638],{"href":177,"rel":637},[55],"il codice di PostgREST","\ndà a una tabella sconosciuta. Un trigger sulle nuove registrazioni che fallisce\ncosì compare come\n",[51,641,642],{"href":401},"\"Database error saving new user\"",[444,644],{"alt":645,"caption":646,"src":647},"Due ricerche da una funzione segnata search_path = ''. Quella in alto chiede invoices senza piano, trova un elenco di piani vuoto e finisce su una targa con 42P01. Quella in basso chiede public.invoices, va dritta alla porta invoices del piano public ed è spuntata.","Con il percorso di ricerca vuoto non c'è nessun piano da percorrere, quindi solo un indirizzo completo trova la stanza.","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fan-empty-search-path-1600x620.png",[39,649,651],{"id":650},"causa-4-la-tabella-non-è-ancora-in-quel-progetto","Causa 4: la tabella non è ancora in quel progetto",[10,653,654],{},"La tabella esiste in un altro database, o solo nel tuo codice.",[10,656,657,658,662,663,665],{},"Un account Supabase può contenere più progetti, e\n",[51,659,661],{"href":660},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","un branch è un progetto a sé"," con il\nsuo database. Una tabella creata nel SQL Editor del progetto sbagliato è una\nstanza in un altro edificio.\n",[51,664,334],{"href":333},"\nmostra come confrontare il riferimento del progetto nell'indirizzo Supabase della\ntua app con quello nella dashboard.",[10,667,668,669,674],{},"Se costruisci con Lovable, ripercorri la chat cercando SQL che ti è stato chiesto\ndi approvare. La\n",[51,670,673],{"href":671,"rel":672},"https:\u002F\u002Fdocs.lovable.dev\u002Fintegrations\u002Fsupabase",[55],"documentazione Supabase di Lovable","\ndice che \"writes the SQL, shows it to you, and asks for your approval in the\nproject chat before running it\". Finché non approvi, la tabella esiste solo nel\ncodice che la legge.",[39,676,678],{"id":677},"spostare-una-tabella-da-cui-dipende-la-tua-app","Spostare una tabella da cui dipende la tua app",[10,680,681],{},"Tieni una copia del database di prima dello spostamento, e vieni a saperlo quando\ncambia qualcosa di ciò che la tua app espone.",[10,683,684],{},[685,686,687,691],"strong",{},[51,688,690],{"href":689},"\u002Fsupabase-backups","Reeve Care"," conserva una copia del tuo database Supabase:",[209,693,694,697,703,706,709,712],{},[212,695,696],{},"una copia cifrata secondo un calendario, sullo spazio di archiviazione di Reeve nell'UE, fuori dal tuo account Supabase",[212,698,699,700,702],{},"ogni schema che hai creato, ",[14,701,66],{}," e gli altri, con le loro tabelle e righe com'erano prima della tua modifica",[212,704,705],{},"ogni copia verificata prima di contare, contando le righe di ogni tabella",[212,707,708],{},"anche i tuoi file caricati, appena colleghi una credenziale di Storage",[212,710,711],{},"un ripristino con un clic, con una copia di sicurezza dello stato attuale presa prima",[212,713,714],{},"tutto quello che fa Monitor",[10,716,717],{},[685,718,719,723],{},[51,720,722],{"href":721},"\u002Fwebsite-monitoring","Reeve Monitor"," continua a controllare da fuori:",[209,725,726,729,732,739],{},[212,727,728],{},"se la tua app è raggiungibile, controllato ogni minuto",[212,730,731],{},"il controllo di sicurezza completo ogni ora, su un massimo di tre app",[212,733,734,735,738],{},"un messaggio quando un risultato ",[685,736,737],{},"cambia",", così un deploy che cambia ciò che la tua app espone ti raggiunge senza che tu debba andare a guardare",[212,740,741],{},"un report mensile, in linguaggio semplice, di quello che ha visto",[39,743,745],{"id":744},"che-cosa-fare-adesso","Che cosa fare adesso",[747,748,749],"key-takeaways",{},[209,750,751,758,761,774,783,792],{},[212,752,753,754,757],{},"Leggi il messaggio: il nome tra virgolette è quello che è stato chiesto, e ",[14,755,756],{},"public."," davanti è lo schema che è stato percorso.",[212,759,760],{},"Confronta il nome con il Table Editor, maiuscole comprese. Una tabella con una maiuscola nel nome vuole le virgolette doppie in SQL.",[212,762,763,764,767,768,770,771,60],{},"Trova in quale schema si trova la tabella con la query su ",[14,765,766],{},"information_schema.tables",", e chiama una tabella fuori da ",[14,769,66],{}," con ",[14,772,773],{},".schema('nome').from(...)",[212,775,776,777,780,781,60],{},"Prima di esporre uno schema, esegui la query su ",[14,778,779],{},"pg_tables"," e attiva la Row Level Security su ogni tabella che dice ",[14,782,505],{},[212,784,785,786,788,789,60],{},"Dentro una funzione con ",[14,787,589],{},", scrivi ogni tabella come ",[14,790,791],{},"public.nome",[212,793,794],{},"Controlla che il progetto che la tua app chiama sia quello in cui hai creato la tabella.",[10,796,797,798,801],{},"Comincia dai due nomi nel messaggio, la tabella e lo schema davanti, perché dicono\nesattamente quale porta è stata chiesta e a quale piano. Prima di spostare,\nrinominare o esporre qualcosa che le persone usano,\n",[51,799,800],{"href":689},"tieni una copia del database"," di prima della modifica.",{"title":27,"searchDepth":803,"depth":803,"links":804},3,[805,807,808,809,810,811,812,813,814],{"id":41,"depth":806,"text":42},2,{"id":194,"depth":806,"text":195},{"id":338,"depth":806,"text":339},{"id":451,"depth":806,"text":452},{"id":541,"depth":806,"text":542},{"id":582,"depth":806,"text":583},{"id":650,"depth":806,"text":651},{"id":677,"depth":806,"text":678},{"id":744,"depth":806,"text":745},"Basi della sicurezza","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcover-1200x630.png","Un edificio in sezione accanto al vano di un ascensore. L'ascensore è al piano terra, e la sua fermata un piano più su è un vuoto tratteggiato color ambra.","Supabase \"relation does not exist\" o PGRST205: nessuna tabella ha quel nome in quello schema. Quattro controlli, e che cosa apre esporre uno schema.",false,"md",[822,825,828,831,834],{"q":823,"a":824},"Perché Supabase dice che la mia tabella non esiste?","Perché nello schema percorso dalla query non c'è nessuna tabella con esattamente quel nome. Controlla quattro cose in ordine: le maiuscole del nome, lo schema in cui si trova la tabella (la tua app cerca in public se non le dici altro), il progetto con cui parla la tua app, e se la query gira dentro una funzione con il search_path vuoto, dove ogni tabella ha bisogno del suo schema davanti.",{"q":826,"a":827},"Che cosa significa \"the schema must be one of the following\"?","È l'errore PGRST106 nella formulazione delle versioni più vecchie di PostgREST. La tua app ha chiesto uno schema che il progetto non espone, per esempio con .schema('nome'), e l'elenco che segue sono gli schemi esposti. Le versioni più recenti dicono \"Invalid schema: nome\" e mettono lo stesso elenco nel suggerimento. Esporre lo schema lo risolve, ed è una decisione da prendere con cognizione.",{"q":829,"a":830},"È sicuro esporre uno schema in Supabase?","Solo quando ogni tabella che contiene ha la Row Level Security attivata e una regola scritta. La guida di Supabase sugli schemi personalizzati dà ad anon, il ruolo di ogni visitatore che non ha fatto l'accesso, accesso completo a ogni tabella dello schema, comprese quelle create dopo. La sua guida alla sicurezza aggiunge che le tabelle create nel SQL Editor non hanno la Row Level Security per impostazione predefinita.",{"q":832,"a":833},"Le maiuscole contano nel nome di una tabella Supabase?","Sì. Un nome scritto in SQL senza virgolette doppie viene portato in minuscolo, mentre il Table Editor e supabase-js tengono le maiuscole esattamente come sono state scritte. Una tabella creata come Invoices si scrive \"Invoices\", tra virgolette, in SQL, e .from('Invoices') nella tua app.",{"q":835,"a":836},"Conviene spostare la tabella in public?","Spostarla risolve la metà dell'errore che riguarda lo schema e niente della sicurezza: una tabella che la tua app legge dal browser ha bisogno di un permesso per il ruolo che la legge e della Row Level Security con una regola, ovunque si trovi. Una tabella che serve solo al codice server può restare in uno schema non esposto, raggiunta da una funzione in public che fa l'unico lavoro di cui la tua app ha bisogno.","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcard-800x500.png",[839,840,841,842,843,844,845,846,847],"relation does not exist supabase","supabase relation does not exist","could not find the table in the schema cache","pgrst205","42p01","the schema must be one of the following","pgrst106","supabase schema non esposto","supabase tabella non trovata api",{},true,"\u002Fblog\u002Fsupabase-relation-does-not-exist","2026-10-23",{"title":5,"description":818},"blog\u002Fsupabase-relation-does-not-exist",[855,856,857],"Supabase \"relation does not exist\" (codice Postgres 42P01) significa che negli schemi percorsi dalla query non c'è nessuna tabella né vista con esattamente quel nome. Dalla tua app, su un progetto recente, lo stesso problema si legge \"Could not find the table in the schema cache\" (PGRST205).","Controlla prima il nome lettera per lettera, maiuscole comprese, poi lo schema, poi il progetto. Dentro una funzione con il search_path vuoto, ogni tabella ha bisogno del suo schema davanti: public.invoices.","Esporre uno schema fa sparire l'errore e lascia che l'API raggiunga ogni tabella che contiene, quindi controlla la Row Level Security di ciascuna prima di farlo.","8TudBlQHha5E3VZA692bjalMj2A8P-PIvw2qW-DJG54",[860,866,872,878,884,890,896,902,908,914,920,927,933,939,945,951,957,963,964,969,974,980,986,992,998,1004,1010,1015,1021,1027,1033,1039,1045,1051,1057,1063,1069,1075,1081,1087,1093,1099,1105,1111,1117,1123,1127,1133,1139,1145,1151,1157,1163,1169,1175,1181,1187,1193,1199,1205,1211,1217,1222,1227,1233,1239,1245,1251,1257,1263,1269,1275,1281,1287,1293,1299,1305,1311,1316,1322,1328,1334,1340,1346,1351,1357,1363,1369,1374,1380],{"path":861,"title":862,"description":863,"published":864,"category":815,"image":865,"draft":819},"\u002Fblog\u002Fmax-client-connections-reached","Supabase \"max client connections reached\", spiegato","Supabase \"max client connections reached\": il pooler non ha posto per un altro client. La porta nella tua stringa di connessione decide il limite.","2026-11-09","\u002Fblog\u002Fmax-client-connections-reached\u002Fcard-800x500.png",{"path":867,"title":868,"description":869,"published":870,"category":815,"image":871,"draft":819},"\u002Fblog\u002Funsupported-provider-provider-is-not-enabled","Errore Supabase: \"Unsupported provider: provider is not enabled\"","\"Unsupported provider: provider is not enabled\": Google è disattivato nel tuo progetto Supabase. Come attivarlo e risolvere redirect_uri_mismatch.","2026-11-08","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcard-800x500.png",{"path":873,"title":874,"description":875,"published":876,"category":815,"image":877,"draft":819},"\u002Fblog\u002Fviolates-foreign-key-constraint","Errore Supabase \"violates foreign key constraint\" all'inserimento","Supabase \"insert or update on table violates foreign key constraint\": la tua riga punta a una riga che non c'è. Quale, perché, e la soluzione.","2026-11-07","\u002Fblog\u002Fviolates-foreign-key-constraint\u002Fcard-800x500.png",{"path":879,"title":880,"description":881,"published":882,"category":815,"image":883,"draft":819},"\u002Fblog\u002Fnull-value-violates-not-null-constraint","Errore Supabase \"null value in column violates not-null constraint\"","Supabase \"null value in column violates not-null constraint\": una colonna obbligatoria è arrivata vuota. Da dove viene il null, e la soluzione.","2026-11-06","\u002Fblog\u002Fnull-value-violates-not-null-constraint\u002Fcard-800x500.png",{"path":885,"title":886,"description":887,"published":888,"category":815,"image":889,"draft":819},"\u002Fblog\u002Fauth-session-missing","Supabase \"Auth session missing!\": dove è finita la sessione","\"Auth session missing!\" è supabase-js che non trova nessuna sessione e non arriva nemmeno a chiedere a Supabase. Dove è finita la sessione, e la correzione.","2026-11-05","\u002Fblog\u002Fauth-session-missing\u002Fcard-800x500.png",{"path":891,"title":892,"description":893,"published":894,"category":815,"image":895,"draft":819},"\u002Fblog\u002Finvalid-claim-missing-sub-claim","Supabase \"invalid claim: missing sub claim\": nessun utente connesso","\"invalid claim: missing sub claim\": Supabase Auth ha ricevuto un token autentico senza alcun utente, la chiave del progetto al posto di una sessione.","2026-11-04","\u002Fblog\u002Finvalid-claim-missing-sub-claim\u002Fcard-800x500.png",{"path":897,"title":898,"description":899,"published":900,"category":815,"image":901,"draft":819},"\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function","\"Failed to send a request to the Edge Function\": la causa vera","\"Failed to send a request to the Edge Function\": il browser non ha ricevuto una risposta leggibile. La sua console dice perché e se la tua funzione è partita.","2026-11-03","\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function\u002Fcard-800x500.png",{"path":903,"title":904,"description":905,"published":906,"category":815,"image":907,"draft":819},"\u002Fblog\u002Fsupabase-auth-redirects-to-localhost","Perché i link email di Supabase reindirizzano a localhost:3000","Se Supabase reindirizza a localhost:3000, la Site URL non è mai stata cambiata o il tuo indirizzo manca in Redirect URLs. La soluzione, e il jolly da evitare.","2026-11-02","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcard-800x500.png",{"path":909,"title":910,"description":911,"published":912,"category":815,"image":913,"draft":819},"\u002Fblog\u002Femail-link-is-invalid-or-has-expired","Supabase \"Email link is invalid or has expired\" su un link nuovo","Su un link inviato un minuto fa, \"Email link is invalid or has expired\" di Supabase di solito vuol dire che un filtro della posta l'ha usato prima.","2026-11-01","\u002Fblog\u002Femail-link-is-invalid-or-has-expired\u002Fcard-800x500.png",{"path":915,"title":916,"description":917,"published":918,"category":815,"image":919,"draft":819},"\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout","Supabase \"canceling statement due to statement timeout\", spiegato","Supabase \"canceling statement due to statement timeout\": una query ha superato il limite del suo ruolo, 3 secondi per un visitatore. Guarda la policy RLS.","2026-10-31","\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout\u002Fcard-800x500.png",{"path":921,"title":922,"description":923,"published":924,"category":925,"image":926,"draft":819},"\u002Fblog\u002Fdatabase-error-deleting-user","\"Database error deleting user\" su Supabase, e cosa porta con sé","\"Database error deleting user\" su Supabase: il tuo database ha rifiutato la cancellazione. La causa è nei log, e la soluzione decide cos'altro sparisce.","2026-10-30","Backups","\u002Fblog\u002Fdatabase-error-deleting-user\u002Fcard-800x500.png",{"path":928,"title":929,"description":930,"published":931,"category":815,"image":932,"draft":819},"\u002Fblog\u002Fstripe-webhook-no-signatures-found","\"No signatures found matching the expected signature\" su Supabase","Un webhook Stripe in una Edge Function di Supabase dice \"No signatures found matching the expected signature\"? Due cause. Non smettere di verificare.","2026-10-29","\u002Fblog\u002Fstripe-webhook-no-signatures-found\u002Fcard-800x500.png",{"path":934,"title":935,"description":936,"published":937,"category":815,"image":938,"draft":819},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" in Supabase: le tre cause","Supabase dice \"Invalid login credentials\" per una password sbagliata, un'email sconosciuta e un account Google. Come capire quale.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":940,"title":941,"description":942,"published":943,"category":815,"image":944,"draft":819},"\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code","\"Edge Function returned a non-2xx status code\": l'errore vero","\"Edge Function returned a non-2xx status code\" vuol dire che la tua funzione Supabase ha risposto con un errore. Ecco dove leggere quello vero.","2026-10-27","\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code\u002Fcard-800x500.png",{"path":946,"title":947,"description":948,"published":949,"category":815,"image":950,"draft":819},"\u002Fblog\u002Fcertificate-not-trusted","Certificato non attendibile: tre cause oltre alla scadenza","Certificato non attendibile anche se la data è giusta? Nomina un altro indirizzo, si è firmato da solo o alla sua catena manca un anello. Come capirlo.","2026-10-26","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",{"path":952,"title":953,"description":954,"published":955,"category":815,"image":956,"draft":819},"\u002Fblog\u002Finvalid-input-syntax-for-type-uuid","Supabase \"invalid input syntax for type uuid\": leggi le virgolette","Supabase \"invalid input syntax for type uuid\": la tua app ha inviato qualcosa che non è un id. Leggi le virgolette, ferma la query, tieni la colonna.","2026-10-25","\u002Fblog\u002Finvalid-input-syntax-for-type-uuid\u002Fcard-800x500.png",{"path":958,"title":959,"description":960,"published":961,"category":815,"image":962,"draft":819},"\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint","Supabase \"duplicate key value violates unique constraint\", spiegato","Supabase \"duplicate key value violates unique constraint\": il valore è già preso. Trova la colonna, scegli una correzione, tieni il valore fuori schermo.","2026-10-24","\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint\u002Fcard-800x500.png",{"path":850,"title":5,"description":818,"published":851,"category":815,"image":837,"draft":819},{"path":573,"title":965,"description":966,"published":967,"category":815,"image":968,"draft":819},"Supabase PGRST202: \"Could not find the function in the schema cache\"","Supabase \"Could not find the function in the schema cache\" riporta i nomi degli argomenti inviati dalla tua app. Confrontali con la funzione.","2026-10-22","\u002Fblog\u002Fsupabase-function-not-found\u002Fcard-800x500.png",{"path":333,"title":970,"description":971,"published":972,"category":815,"image":973,"draft":819},"Supabase PGRST204: \"Could not find the column in the schema cache\"","Supabase \"Could not find the column in the schema cache\" di solito è un nome che non torna. Quattro controlli in ordine e la riga che ricarica.","2026-10-21","\u002Fblog\u002Fsupabase-schema-cache-column-error\u002Fcard-800x500.png",{"path":975,"title":976,"description":977,"published":978,"category":815,"image":979,"draft":819},"\u002Fblog\u002Fsupabase-email-rate-limit-exceeded","Supabase \"Email Rate Limit Exceeded\": due limiti, un solo codice","Supabase \"Email Rate Limit Exceeded\" limita ogni email del tuo progetto: 2 all'ora con il mittente integrato. Cosa conta e come alzarlo.","2026-10-20","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcard-800x500.png",{"path":981,"title":982,"description":983,"published":984,"category":815,"image":985,"draft":819},"\u002Fblog\u002Fsupabase-users-logged-out","Supabase \"Invalid Refresh Token: Refresh Token Not Found\": 3 cause","Supabase \"Invalid Refresh Token: Refresh Token Not Found\" disconnette i tuoi utenti. Tre cause, e come il log di Auth le distingue.","2026-10-19","\u002Fblog\u002Fsupabase-users-logged-out\u002Fcard-800x500.png",{"path":987,"title":988,"description":989,"published":990,"category":815,"image":991,"draft":819},"\u002Fblog\u002Fpermission-denied-for-schema-public","Supabase \"permission denied for schema public\": tre cause","Supabase \"permission denied for schema public\" indica un grant mancante sullo schema. Cosa lo ha tolto, e la riga che lo rimette.","2026-10-18","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcard-800x500.png",{"path":993,"title":994,"description":995,"published":996,"category":815,"image":997,"draft":819},"\u002Fblog\u002Fsupabase-bucket-not-found","Supabase \"Bucket not found\": le tre cose che può voler dire","Supabase \"Bucket not found\" è una di tre cose: un link pubblico a un bucket privato, un nome non esattamente uguale o il progetto sbagliato.","2026-10-17","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",{"path":999,"title":1000,"description":1001,"published":1002,"category":815,"image":1003,"draft":819},"\u002Fblog\u002Fsupabase-invalid-jwt","Supabase invalid JWT: quale chiave ha smesso di funzionare?","Un errore Supabase invalid JWT è PGRST301: un token firmato non ha superato la verifica. Su un progetto recente riguarda la sessione, non la chiave API.","2026-10-16","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",{"path":1005,"title":1006,"description":1007,"published":1008,"category":815,"image":1009,"draft":819},"\u002Fblog\u002Fsupabase-single-row-error","Supabase \"multiple (or no) rows returned\" quasi sempre è nessuna","Supabase restituisce PGRST116, \"JSON object requested, multiple (or no) rows returned\", quando la query non ha trovato nulla. Una riga nascosta sembra assente.","2026-10-15","\u002Fblog\u002Fsupabase-single-row-error\u002Fcard-800x500.png",{"path":401,"title":1011,"description":1012,"published":1013,"category":815,"image":1014,"draft":819},"\"Database error saving new user\" su Supabase: dove guardare","\"Database error saving new user\" vuol dire che qualcosa attaccato alla registrazione Supabase è fallito. L'errore vero sta nei tuoi log.","2026-10-14","\u002Fblog\u002Fdatabase-error-saving-new-user\u002Fcard-800x500.png",{"path":1016,"title":1017,"description":1018,"published":1019,"category":815,"image":1020,"draft":819},"\u002Fblog\u002Fwhat-is-supabase","Cos'è Supabase? Il database che ha scelto il tuo builder","Cos'è Supabase: il database, il login e l'archivio file dietro la tua app. Supabase manda avanti i server; le regole su chi legge le tue righe sono tue.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":1022,"title":1023,"description":1024,"published":1025,"category":815,"image":1026,"draft":819},"\u002Fblog\u002Faws-access-key-exposed-in-frontend","Una chiave AWS esposta nel frontend non è come una chiave OpenAI","Una chiave di accesso AWS esposta nel tuo frontend legge e scrive il tuo storage. La soluzione di solito è una presigned URL, non una chiave nuova.","2026-10-12","\u002Fblog\u002Faws-access-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":1028,"title":1029,"description":1030,"published":1031,"category":815,"image":1032,"draft":819},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" in upload","\"New row violates row-level security policy for table objects\" vuol dire che al tuo upload manca una regola insert. Rendere pubblico il bucket non ne aggiunge.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":1034,"title":1035,"description":1036,"published":1037,"category":815,"image":1038,"draft":819},"\u002Fblog\u002Fbase44-security-scan","Scansione di sicurezza Base44: ciò che vede solo lei","La scansione di sicurezza Base44 controlla sette tipi di problema dall’interno. Ecco la metà che legge e che nessun altro legge, e quella che non guarda mai.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":1040,"title":1041,"description":1042,"published":1043,"category":815,"image":1044,"draft":819},"\u002Fblog\u002Fapi-key-leaked-what-to-do","La tua chiave API è trapelata. L'ordine in cui muoverti","Una chiave API è trapelata e non sai da cosa cominciare. Non tutte le chiavi nel frontend lo sono, e l'ordine conta più della velocità.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":1046,"title":1047,"description":1048,"published":1049,"category":815,"image":1050,"draft":819},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" senza disattivare RLS","\"Infinite recursion detected in policy for relation\" significa che la tua policy ha interrogato la tabella che protegge. Ecco come rompere il cerchio.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":1052,"title":1053,"description":1054,"published":1055,"category":815,"image":1056,"draft":819},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" su Supabase, e la correzione sbagliata","\"No API key found in request\" significa che la tua richiesta è arrivata a Supabase senza chiave. Quasi tutte le risposte indicano le regole del database.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":1058,"title":1059,"description":1060,"published":1061,"category":815,"image":1062,"draft":819},"\u002Fblog\u002Fis-base44-safe","Base44 è sicuro? Cosa abbiamo trovato in 5.442 app","Base44 è sicuro? Abbiamo passato nove controlli su 5.442 app Base44 online. Quasi tutte hanno preso B, per motivi che il proprietario non ha mai scelto.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":1064,"title":1065,"description":1066,"published":1067,"category":815,"image":1068,"draft":819},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Nascondere una chiave API: spostala in una Edge Function Supabase","Nascondere una chiave API vuol dire toglierla dal browser, e una Edge Function Supabase è il posto più piccolo dove metterla. Due passaggi contano di più.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":1070,"title":1071,"description":1072,"published":1073,"category":815,"image":1074,"draft":819},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Il tuo file .env è esposto? I dodici percorsi da provare","Il tuo file .env è esposto sul tuo server web? Dodici indirizzi te lo dicono, e una risposta significa che tutto quello che contiene è già pubblico.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":1076,"title":1077,"description":1078,"published":1079,"category":815,"image":1080,"draft":819},"\u002Fblog\u002Fis-v0-safe","Sicurezza di v0: tutte le 1.790 app v0 analizzate hanno preso A","La sicurezza di v0 misurata su 1.790 app v0 online: tutte hanno preso A. Solo 17 nominavano un database, ed è soprattutto questo che misura quella A.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":1082,"title":1083,"description":1084,"published":1085,"category":815,"image":1086,"draft":819},"\u002Fblog\u002Fis-bolt-safe","Bolt è sicuro? Cosa abbiamo trovato in 1.123 app Bolt","Bolt è sicuro? Abbiamo passato 1.123 app Bolt online per nove controlli. L’hosting era pulito. I rilievi erano chiavi e tabelle aperte dentro le app.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":1088,"title":1089,"description":1090,"published":1091,"category":815,"image":1092,"draft":819},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase è down o è la tua app? Come capirlo","Supabase è down o è la tua app? Un progetto in pausa, un database pieno e un tuo errore sembrano la stessa cosa. Quattro controlli li separano.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":1094,"title":1095,"description":1096,"published":1097,"category":815,"image":1098,"draft":819},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Supabase crittografa i miei dati? Sì. Ecco da cosa protegge","Supabase crittografa i dati? Sì: AES-256 a riposo, TLS in transito, SOC 2 e ISO 27001. Cosa copre ciascuno, e la fuga di dati che nessuno di questi ferma.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":1100,"title":1101,"description":1102,"published":1103,"category":815,"image":1104,"draft":819},"\u002Fblog\u002Fsupabase-free-plan-limits","Supabase: prezzi e limiti del piano gratuito, uno per uno","Prezzi e limiti del piano gratuito di Supabase: 500 MB di database, 5 GB di egress e nessun backup. Cosa succede a ogni soglia e cosa cambia Pro a $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":1106,"title":1107,"description":1108,"published":1109,"category":925,"image":1110,"draft":819},"\u002Fblog\u002Ftest-your-supabase-backup","Testa il tuo backup di Supabase prima del giorno in cui serve","Come testare il tuo backup di Supabase: ripristinarlo in un progetto di prova, contare le righe, accedere e cercare la riga che manca a un file troncato.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":1112,"title":1113,"description":1114,"published":1115,"category":925,"image":1116,"draft":819},"\u002Fblog\u002Fsupabase-backup-github-action","Backup gratis di Supabase con una GitHub Action, e il tranello","Un backup di Supabase con una GitHub Action è gratis e va bene per molte app. Il workflow, la connection string giusta e l'egress di ogni esecuzione.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":1118,"title":1119,"description":1120,"published":1121,"category":925,"image":1122,"draft":819},"\u002Fblog\u002Fdownload-your-supabase-backup","Perché non puoi scaricare il tuo backup di Supabase","Non puoi scaricare il tuo backup di Supabase su un progetto recente, perché la copia giornaliera è uno snapshot fisico. Come verificarlo e tenere una copia tua.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":190,"title":1124,"description":1125,"published":1121,"category":815,"image":1126,"draft":819},"Supabase \"permission denied for table\": il grant mancante","Dal 30 ottobre una nuova tabella di Supabase risponde \"permission denied for table\" finché non concedi l'accesso. Il grant della mail è metà della soluzione.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":1128,"title":1129,"description":1130,"published":1131,"category":815,"image":1132,"draft":819},"\u002Fblog\u002Fopen-api-endpoint-exposed","Un endpoint API aperto è un problema di sicurezza? Leggi il JSON","La tua scansione ha segnalato un endpoint API aperto. Quanto conti dipende da che cosa è tornato, e la maggior parte di quelli trovati era della piattaforma.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":1134,"title":1135,"description":1136,"published":1137,"category":815,"image":1138,"draft":819},"\u002Fblog\u002Flovable-security-scan","Scansione di sicurezza Lovable: cosa non può dimostrare","Scansione di sicurezza Lovable: cosa controllano Quick scan e Deep scan, quando parte ciascuno, e l’unica cosa che nessuna scansione dall’interno dimostra.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":1140,"title":1141,"description":1142,"published":1143,"category":925,"image":1144,"draft":819},"\u002Fblog\u002Fsupabase-backup-auth-users","Perché nel tuo dump Supabase non ci sono utenti","Lancia supabase db dump da solo e ottieni la forma del tuo database e nessuna delle sue righe, senza lo schema auth in cui vivono i tuoi utenti.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":1146,"title":1147,"description":1148,"published":1149,"category":815,"image":1150,"draft":819},"\u002Fblog\u002Fdomain-and-certificate-expiry","Dominio scaduto, sito offline: cosa succede adesso","Il tuo dominio è scaduto e il sito è offline. Il conto alla rovescia che parte, perché il certificato è il problema minore, e come controllarli entrambi.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":1152,"title":1153,"description":1154,"published":1155,"category":815,"image":1156,"draft":819},"\u002Fblog\u002Fis-lovable-safe","Lovable è sicuro? Cosa abbiamo trovato in 18.554 app Lovable","Lovable è sicuro? Abbiamo passato 18.554 app Lovable online per nove controlli. La piattaforma è risultata la più pulita di cinque. I rilievi stavano nelle app.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":1158,"title":1159,"description":1160,"published":1161,"category":815,"image":1162,"draft":819},"\u002Fblog\u002Fvibe-coded-app-security-checklist","La checklist di sicurezza del vibe coding, in nove controlli","Una checklist di sicurezza del vibe coding in nove voci, ognuna verificabile dall’esterno sulla tua app dal vivo, e ognuna con un test di una riga.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":1164,"title":1165,"description":1166,"published":1167,"category":815,"image":1168,"draft":819},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Una chiave segreta Stripe nel frontend può muovere denaro","Una chiave segreta Stripe esposta nel tuo frontend può rimborsare, addebitare e leggere ogni scheda cliente che hai. La tua chiave pk_live_ ci sta bene.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":1170,"title":1171,"description":1172,"published":1173,"category":815,"image":1174,"draft":819},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variabili d’ambiente Vite esposte: il prefisso vuol dire pubblica","Variabili d’ambiente Vite esposte: la tua app ha fatto ciò che il prefisso chiedeva. VITE_ e NEXT_PUBLIC_ vogliono dire pubblica, e l’IA non sapeva il costo.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":1176,"title":1177,"description":1178,"published":1179,"category":815,"image":1180,"draft":819},"\u002Fblog\u002Fbase44-source-maps","Sicurezza Base44: cosa segnala uno scan e cosa tocca a te sistemare","Sicurezza Base44 su 5.438 app scansionate: tre segnalazioni su quasi tutte sono della piattaforma, la source map è il badge di Base44, la tua parte è corta.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":1182,"title":1183,"description":1184,"published":1185,"category":815,"image":1186,"draft":819},"\u002Fblog\u002Fis-cursor-ai-safe","Cursor AI è sicuro? L’editor, il codice e l’app che hai pubblicato","Cursor AI è sicuro? Tre domande in una ricerca: cosa tiene Cursor, cosa sbaglia il codice che scrive, e se l’app che hai pubblicato è aperta.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":1188,"title":1189,"description":1190,"published":1191,"category":815,"image":1192,"draft":819},"\u002Fblog\u002Fis-replit-safe","Replit è sicuro? Cosa abbiamo trovato in 3.042 app Replit online","Replit è sicuro? Abbiamo passato 3.042 app Replit online per nove controlli esterni. I rilievi stavano nell’app pubblicata, non nell’host.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":1194,"title":1195,"description":1196,"published":1197,"category":925,"image":1198,"draft":819},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: la copia del database non ha nessun file","Un Supabase storage backup è un lavoro a parte. I backup del database tengono la lista dei tuoi file e nessuno dei file, quindi ogni upload resta rotto.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":1200,"title":1201,"description":1202,"published":1203,"category":925,"image":1204,"draft":819},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery di Supabase: prezzo e limiti","Il point-in-time recovery di Supabase riavvolge il database a qualsiasi secondo della settimana scorsa. $100 al mese oltre a Pro, e copre solo il database.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":1206,"title":1207,"description":1208,"published":1209,"category":925,"image":1210,"draft":819},"\u002Fblog\u002Fsupabase-project-paused-recover","Progetto Supabase in pausa? I tuoi dati sono ancora lì","Supabase ha messo in pausa il tuo progetto dopo una settimana senza attività. Non è cancellato niente, Ripristina è accanto al nome e hai un anno di tempo.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":1212,"title":1213,"description":1214,"published":1215,"category":815,"image":1216,"draft":819},"\u002Fblog\u002Fsafest-ai-app-builder","Qual è il builder di app con IA più sicuro? 30.998 app testate","Qual è il builder di app con IA più sicuro? Abbiamo scansionato 30.998 app online di Lovable, Base44, Replit, v0 e Bolt. Non è il builder a decidere il voto.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":509,"title":1218,"description":1219,"published":1220,"category":815,"image":1221,"draft":819},"Attiva Row Level Security su ogni tabella Supabase, poi verificalo","Attivare Row Level Security su Supabase senza una policy chiude del tutto la tabella. Una policy senza il flag non fa nulla. Ecco lo SQL, e la verifica.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":514,"title":1223,"description":1224,"published":1225,"category":815,"image":1226,"draft":819},"Supabase \"RLS disabled in public\": cosa non vede l'avviso","Supabase segnala \"RLS disabled in public\" come errore. Non dice nulla della policy di lettura che lascia la tua tabella altrettanto aperta.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":1228,"title":1229,"description":1230,"published":1231,"category":815,"image":1232,"draft":819},"\u002Fblog\u002Frotate-supabase-service-role-key","Come ruotare una chiave service_role Supabase trapelata","Supabase dice di chiudere prima la falla. Altre guide dicono di ruotare subito. Quale sia giusto dipende da dove è finita la tua chiave service_role.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":1234,"title":1235,"description":1236,"published":1237,"category":815,"image":1238,"draft":819},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Scanner di sicurezza per vibe coding a confronto, il nostro incluso","Il miglior scanner di sicurezza per vibe coding dipende da tre domande che nessun elenco di funzioni affronta. Otto strumenti a confronto, con i prezzi.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":1240,"title":1241,"description":1242,"published":1243,"category":815,"image":1244,"draft":819},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: i cinque controlli da fare da soli","Un Supabase security checker legge la tua app pubblicata invece delle impostazioni del progetto. Ecco i cinque controlli che esegue e come farli da solo.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":1246,"title":1247,"description":1248,"published":1249,"category":815,"image":1250,"draft":819},"\u002Fblog\u002Fvibe-coding-security-scanner","Scanner di sicurezza per vibe coding: cosa si perde","Uno scanner di sicurezza per vibe coding legge la tua app dal vivo, da fuori. Cosa copre, le quattro cose che non può vedere e come leggere il risultato.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":1252,"title":1253,"description":1254,"published":1255,"category":815,"image":1256,"draft":819},"\u002Fblog\u002Fmissing-security-headers","Intestazioni di sicurezza mancanti: quando contano","Le intestazioni di sicurezza mancanti sono il rilievo che il nostro scanner stampa più spesso. Da cosa proteggono e quando sono la riga meno urgente.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":1258,"title":1259,"description":1260,"published":1261,"category":815,"image":1262,"draft":819},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","La tua chiave API OpenAI è esposta nel frontend. Ruotala.","Una chiave API OpenAI esposta nel frontend non si può legare a nessun dominio. Ruotala oggi, sposta la chiamata sul tuo server e metti un tetto di spesa.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":1264,"title":1265,"description":1266,"published":1267,"category":815,"image":1268,"draft":819},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Chiave API esposta nel frontend: cosa spediscono 30.998 app","Una chiave API esposta nel tuo frontend è quasi sempre una chiave di Google Maps. Abbiamo scansionato 30.998 app vibe-coded e contato cosa esce davvero.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":1270,"title":1271,"description":1272,"published":1273,"category":925,"image":1274,"draft":819},"\u002Fblog\u002Fsupabase-backup-tools-compared","Strumenti di backup Supabase a confronto, il nostro incluso","Quattro tipi di strumento di backup Supabase, cosa copia davvero ognuno, e il caso in cui una GitHub Action gratuita batte il pagare chiunque, noi inclusi.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":1276,"title":1277,"description":1278,"published":1279,"category":815,"image":1280,"draft":819},"\u002Fblog\u002Freplit-secrets-explained","Come usare i secret su Replit, e cosa viene comunque pubblicato","Come usare i secret su Replit: aggiungerne uno, rileggerlo e risolvere le due cause dell'undefined. E le chiavi che lo strumento non riesce a proteggere.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":1282,"title":1283,"description":1284,"published":1285,"category":925,"image":1286,"draft":819},"\u002Fblog\u002Fback-up-supabase-free-tier","Backup del piano gratuito Supabase: farne uno senza terminale","Sul piano gratuito Supabase non esistono backup: la copia la fai tu. Come farne uno dalla dashboard e che cosa si lascia dietro la via del CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":1288,"title":1289,"description":1290,"published":1291,"category":815,"image":1292,"draft":819},"\u002Fblog\u002Fis-supabase-secure","Supabase è sicuro? Sì. Il tuo progetto è un'altra questione","Supabase è sicuro? La piattaforma è certificata, cifrata e sottoposta a pentest. La loro documentazione dice dove finisce quello e iniziano le tue impostazioni.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":1294,"title":1295,"description":1296,"published":1297,"category":815,"image":1298,"draft":819},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Dove trovare le chiavi API di Supabase: anon, service_role e URL","L'URL del progetto, la chiave anon e la chiave service_role stanno su una pagina della dashboard. Ecco dove si trova e quale dei quattro va nella tua app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":1300,"title":1301,"description":1302,"published":1303,"category":815,"image":1304,"draft":819},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy su Supabase. E adesso?","\"New row violates row-level security policy\" significa che Supabase ha rifiutato una scrittura. La soluzione veloce riapre la tabella a chiunque.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":1306,"title":1307,"description":1308,"published":1309,"category":815,"image":1310,"draft":819},"\u002Fblog\u002Fcors-wildcard-security-risk","Un wildcard CORS è un rischio di sicurezza? Quasi mai.","Un wildcard CORS è un rischio di sicurezza? Di solito è il valore predefinito del tuo builder e non consegna nulla che il tuo server non desse già a chiunque.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":660,"title":1312,"description":1313,"published":1314,"category":925,"image":1315,"draft":819},"Il branching di Supabase non è un backup. Va solo in avanti.","Perché il branching di Supabase non è un backup: un branch parte senza i tuoi dati e un merge sposta solo lo schema. A cosa serve davvero e cosa usare invece.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":1317,"title":1318,"description":1319,"published":1320,"category":925,"image":1321,"draft":819},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Come ripristinare un backup Supabase, e cosa si rompe dopo","Come ripristinare un backup Supabase dalla dashboard o da un file di dump, che cosa sostituisce il ripristino e perché la tua app può restare rotta lo stesso.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":1323,"title":1324,"description":1325,"published":1326,"category":815,"image":1327,"draft":819},"\u002Fblog\u002Fsupabase-storage-bucket-public","Il tuo bucket Supabase Storage è pubblico. È un problema?","Un bucket Supabase Storage pubblico significa che chi ha l'URL di un file può aprirlo. Non significa che qualcuno possa elencare quello che c'è dentro.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":1329,"title":1330,"description":1331,"published":1332,"category":815,"image":1333,"draft":819},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Una chiave API Google nel frontend è un problema?","Una chiave API Google esposta nel frontend è la chiave che il nostro scanner trova più spesso, e di solito va bene così. Lo decide una impostazione gratuita.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":1335,"title":1336,"description":1337,"published":1338,"category":925,"image":1339,"draft":819},"\u002Fblog\u002Fai-agent-deleted-my-database","Un agente IA ha cancellato i miei dati Supabase. Cosa recupero?","Un agente IA ha cancellato dati dal tuo database. Quello che puoi recuperare era già deciso prima che partisse, e i prossimi minuti decidono il resto.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":1341,"title":1342,"description":1343,"published":1344,"category":815,"image":1345,"draft":819},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Chiunque può leggere il tuo database Supabase? 3.680 app testate","Chiunque può leggere il tuo database Supabase senza fare login? Abbiamo scansionato 30.998 app online create con i builder IA e misurato quante rispondono sì.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":1347,"title":1348,"description":1349,"published":1344,"category":815,"image":1350,"draft":819},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source map esposte: la tua app sta pubblicando il codice originale","Una source map esposta permette a chiunque di leggere il codice originale della tua app, commenti inclusi. Il controllo da 30 secondi e cosa conta davvero.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":1352,"title":1353,"description":1354,"published":1355,"category":815,"image":1356,"draft":819},"\u002Fblog\u002Fsupabase-new-api-keys","Supabase publishable key: è la stessa della anon key?","Supabase ha sostituito anon e service_role con chiavi pubblicabili e segrete. Quale sta bene nella tua app, e quale non deve starci mai?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":1358,"title":1359,"description":1360,"published":1361,"category":925,"image":1362,"draft":819},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Supabase fa il backup del mio database? Dipende dal tuo piano.","Supabase fa il backup del tuo database? Ogni giorno sui piani a pagamento, mai su quello gratuito. Come capire cosa hai e cosa quella copia non copre.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":1364,"title":1365,"description":1366,"published":1367,"category":815,"image":1368,"draft":819},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security è attivo. La tabella resta pubblica.","Attivare Supabase Row Level Security non protegge una tabella. Lo fanno le policy, e quella che ha rimesso in piedi la tua app può far entrare chiunque.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":1370,"title":1371,"description":1372,"published":1367,"category":925,"image":1373,"draft":819},"\u002Fblog\u002Fversion-history-is-not-a-backup","La cronologia delle versioni non è un backup dei tuoi dati.","Lovable e Bolt tengono una cronologia delle versioni del codice. Il tuo database è un servizio a parte, e tornare indietro non ti restituisce i dati.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":1375,"title":1376,"description":1377,"published":1378,"category":925,"image":1379,"draft":819},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Tre modi per fare il backup di un database Supabase, e cosa manca","Il pannello, pg_dump e un servizio gestito. Che cosa salva davvero ciascuno, cosa lascia fuori senza dirlo e quale sopravvive alla perdita dell'account.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":1381,"title":1382,"description":1383,"published":1378,"category":815,"image":1384,"draft":819},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Quali chiavi API sono sicure nel browser e quali no","La tua chiave anon di Supabase è fatta per essere pubblica. La chiave service_role no, e ignora ogni regola che imposti. Come distinguerle.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1794213651760]