[{"data":1,"prerenderedAt":790},["ShallowReactive",2],{"blog-es-supabase-storage-backup":3,"blog-index-es":442},{"id":4,"title":5,"body":6,"category":397,"cover":398,"coverAlt":399,"description":400,"draft":401,"extension":402,"faq":403,"image":419,"keywords":420,"meta":430,"navigation":431,"ogTitle":432,"path":433,"published":434,"seo":435,"stem":436,"tldr":437,"updated":434,"__hash__":441},"blog_es\u002Fblog\u002Fsupabase-storage-backup.md","Supabase storage backup: tu copia de la base no tiene archivos",{"type":7,"value":8,"toc":385},"minimark",[9,13,21,24,29,45,53,61,65,68,82,88,91,95,98,107,110,116,124,137,141,144,147,166,176,193,206,213,217,220,226,238,243,246,268,274,278,281,287,290,294,318,322,325,330,362,370,377],[10,11,12],"p",{},"Configuraste copias de seguridad para tu app de Lovable o Bolt, o pagas el\nplan de Supabase que las toma, y la palabra hizo su trabajo: dejaste de\npreocuparte. Luego una restauración, o una mudanza a un proyecto nuevo, y la\napp vuelve con una imagen rota donde antes estaba cada foto de perfil. Cada\ntabla y cada fila están ahí. Las fotos no, y con ellas cada factura, cada\nexportación y cada adjunto que un usuario haya subido alguna vez.",[10,14,15,16,20],{},"Aquí está la parte que la palabra copia esconde: ",[17,18,19],"strong",{},"un Supabase storage backup\nes una tarea aparte, porque una copia de la base de datos contiene una fila por\ncada archivo que subieron tus usuarios y ninguno de los archivos."," La fila está\nen tu base de datos. El archivo está en Storage, un servicio aparte, y ninguna\ncopia de la base de datos, en ningún plan, entra ahí. Este artículo explica\ncómo tomar esa segunda copia y en qué orden vuelven las dos mitades, que es la\nparte que sale mal incluso cuando tienes las dos.",[10,22,23],{},"Ayuda pensar en una biblioteca. El catálogo es un cajón de fichas, una por cada\nlibro, y cada una dice en qué estantería está el libro. Los libros están en las\nestanterías. Una copia de la base de datos copia el cajón.",[25,26,28],"h2",{"id":27},"supabase-hace-copia-de-mis-archivos-de-storage","¿Supabase hace copia de mis archivos de Storage?",[10,30,31,32,39,40,44],{},"No, en ningún plan. La\n",[33,34,38],"a",{"href":35,"rel":36},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fbackups",[37],"nofollow","documentación de copias de seguridad","\nde Supabase dice que las copias no contienen los archivos guardados a través de\nla API de Storage, solo sus metadatos en la base de datos, y el\n",[33,41,43],{"href":42},"\u002Fblog\u002Fsupabase-point-in-time-recovery","point-in-time recovery"," es una función\nde la base de datos, así que la misma frase lo cubre.",[10,46,47,48,52],{},"Lo que cada copia sí contiene es la lista. Supabase mantiene en tu base de\ndatos Postgres una tabla llamada ",[49,50,51],"code",{},"storage.objects",", con una fila por archivo en\ncada bucket: en qué bucket está, su ruta, quién lo subió, cuánto ocupa y cuándo\nllegó. Esa tabla se copia junto con todo lo demás, y precisamente por eso un\nproyecto restaurado parece tan completo. Cada ficha está en el cajón.",[10,54,55,56,60],{},"Los bytes de cada archivo están en otro sitio. Viven en el almacenamiento de\nobjetos, un servicio aparte junto a tu base de datos, y una herramienta que\ncopia una base de datos nunca lo lee. El\n",[33,57,59],{"href":58},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","plan gratuito no toma copias automáticas de ningún tipo",",\nasí que ahí la pregunta ni se plantea; a partir de Pro, la copia diaria tiene\ntus filas y ninguno de tus uploads.",[25,62,64],{"id":63},"dónde-guarda-supabase-tus-archivos","Dónde guarda Supabase tus archivos",[10,66,67],{},"En dos sitios, y una copia de la base de datos llega a uno de ellos.",[10,69,70,71,73,74,77,78,81],{},"Cuando un usuario sube un avatar, tu app le entrega el archivo a Storage.\nStorage escribe los bytes en el almacenamiento de objetos bajo el nombre del\nbucket y la ruta, y en la misma operación escribe una fila en\n",[49,72,51],{}," que lo describe. Tu app guarda entonces esa ruta en una de sus\npropias tablas, digamos una fila de ",[49,75,76],{},"profiles"," con una columna ",[49,79,80],{},"avatar_url",", y\nconstruye un enlace a partir de ella cada vez que hace falta la imagen.",[10,83,84,85,87],{},"Así que una imagen subida son tres cosas: los bytes en el almacenamiento de\nobjetos, la fila en ",[49,86,51],{}," que mantiene Storage, y la ruta en tu\npropia tabla. Una copia de la base de datos lleva las dos últimas. Restáurala y\ntu app tiene cada ruta y Storage tiene cada fila, y el enlace que construyen\nentre las dos apunta a un lugar donde no hay nada.",[10,89,90],{},"Por eso el fallo es tan silencioso. Cada fila concuerda con todas las demás,\ncada recuento cuadra, y cada comprobación que lee la base de datos pasa,\nincluido el paso de verificación de la mayoría de las herramientas de copia,\nporque los archivos nunca estuvieron dentro de lo que se comprobaba.",[25,92,94],{"id":93},"cómo-se-ve-una-restauración-con-solo-la-mitad","Cómo se ve una restauración con solo la mitad",[10,96,97],{},"Un proyecto que pasa todas las comprobaciones y muestra una imagen rota en cada\nsitio donde debería aparecer un archivo.",[10,99,100,101,106],{},"La restauración informa de un éxito porque hizo lo que se le pidió: las tablas\nhan vuelto y los recuentos de filas cuadran. Abre el panel y Storage lista cada\nbucket y cada archivo que contiene, con tamaños y fechas, porque ese listado se\nlee de la tabla que la restauración devolvió. La propia\n",[33,102,105],{"href":103,"rel":104},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmigrating-within-supabase\u002Fdashboard-restore",[37],"guía de Supabase para restaurar una copia del panel en un proyecto nuevo","\ndescribe exactamente este estado: los buckets y los metadatos de los archivos\naparecen, y los objetos que hay detrás no.",[10,108,109],{},"La forma en que te enteras es de lo más corriente. La página del equipo muestra\nuna fila de iconos de imagen rota donde estaban los avatares. Un cliente\nresponde al correo de la factura del mes pasado para decir que el enlace abre\nun error. Alguien hace clic en un archivo en el explorador de Storage y la\ndescarga falla. La ficha dice estantería cuatro, tercero por la izquierda, y la\nestantería cuatro está vacía.",[111,112],"diagram",{"alt":113,"caption":114,"src":115},"Una copia guardada alimenta un contorno de proyecto punteado. Dentro, una tabla de tres filas encendidas lleva una marca de verificación, y cada fila está unida por una línea fina a un marco de imagen dibujado punteado y vacío. Los marcos están tachados.","La restauración devolvió cada fila que describe un archivo. Los archivos que esas filas describen nunca estuvieron en la copia.","\u002Fblog\u002Fsupabase-storage-backup\u002Fthe-list-came-back-1600x620.png",[10,117,118,119,123],{},"Nada te avisa antes de ese momento, porque cada aviso que tienes está conectado\na la base de datos.\n",[33,120,122],{"href":121},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Cómo restaurar una copia de Supabase","\nrepasa las cinco formas en que una restauración vuelve rota, y los archivos son\nla fila de esa tabla que no tiene arreglo, salvo que hayas hecho una copia de\nellos.",[10,125,126,127,131,132,136],{},"Ya que tienes abierta la página de Storage, conviene saber qué le muestra a un\ndesconocido. Nuestro escaneo gratuito lee tu app en vivo desde fuera y le pide\na cada bucket su lista de archivos usando nada más que la clave que ya está en\nel código de tu app. En agosto de 2026 obtuvo una lista de 792 de las 27.269\napps que pudo comprobar, una cifra de\n",[33,128,130],{"href":129},"\u002Fresearch\u002Fvibe-coded-app-security-2026","nuestra propia investigación",". Lee\nnombres y nunca descarga un archivo, tarda unos 20 segundos y no necesita\ncuenta: ",[33,133,135],{"href":134},"\u002Fsecurity-scanner","escanea tu app",".",[25,138,140],{"id":139},"cómo-hago-copia-de-un-bucket-de-supabase-storage","¿Cómo hago copia de un bucket de Supabase Storage?",[10,142,143],{},"A través del endpoint compatible con S3, con un solo comando que copia un bucket\nentero a una carpeta que tú guardas.",[10,145,146],{},"Supabase Storage habla el protocolo S3, lo que significa que las herramientas\ncorrientes construidas para el almacenamiento de Amazon funcionan contra el\ntuyo. Este es el único paso de este artículo que ocurre en una línea de\ncomandos, y merece la pena hacerlo una vez a mano para que sepas de qué está\nhecha la copia.",[148,149,150,154,157],"ol",{},[151,152,153],"li",{},"En tu panel de Supabase, abre los ajustes de Storage y activa el protocolo\nS3. Esa misma página muestra la URL del endpoint y la región de tu proyecto;\ncópialas de ahí y no de aquí.",[151,155,156],{},"En esa página, crea un par de claves de acceso S3. El secreto se muestra una\nsola vez, así que guárdalo en un gestor de contraseñas antes de cerrar el\ndiálogo.",[151,158,159,160,165],{},"Instala la ",[33,161,164],{"href":162,"rel":163},"https:\u002F\u002Faws.amazon.com\u002Fcli\u002F",[37],"línea de comandos de AWS",", dale las\ndos claves como perfil y ejecuta una sincronización por bucket:",[167,168,173],"pre",{"className":169,"code":171,"language":172},[170],"language-text","aws s3 sync s3:\u002F\u002Favatars .\u002Fsupabase-files\u002Favatars \\\n  --endpoint-url https:\u002F\u002F\u003Cproject-ref>.storage.supabase.co\u002Fstorage\u002Fv1\u002Fs3 \\\n  --region \u003Cregion>\n","text",[49,174,171],{"__ignoreMap":175},"",[10,177,178,179,182,183,188,189,192],{},"Vuelve a ejecutarlo mañana y solo copiará lo que cambió. ",[49,180,181],{},"rclone"," hace el mismo\ntrabajo si lo prefieres; en un bucket grande, la\n",[33,184,187],{"href":185,"rel":186},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Ftroubleshooting\u002Frclone-error-s3-protocol-error-received-listing-v1-with-istruncated-set-no-nextmarker-and-no-contents-e64d34",[37],"nota de resolución de problemas","\nde Supabase dice que pases ",[49,190,191],{},"--s3-list-version 2",", o el listado puede detenerse\nantes de tiempo.",[10,194,195,196,201,202,136],{},"Dos cosas sobre esa clave. La\n",[33,197,200],{"href":198,"rel":199},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fstorage\u002Fs3\u002Fauthentication",[37],"página de autenticación S3","\nde Supabase dice que una clave de acceso S3 tiene acceso completo a todos los\nbuckets y se salta Row Level Security, así que su sitio es un servidor o tu\npropia máquina, y nunca tu app. Y puede escribir además de leer, porque Supabase\nno emite ninguna clave de solo lectura para Storage; quien la tenga puede borrar\narchivos con la misma facilidad con que los copia. Trátala como tratarías\n",[33,203,205],{"href":204},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","tu clave service_role",[10,207,208,209,212],{},"Luego pon la carpeta en algún sitio fuera de tu cuenta de Supabase, por\n",[33,210,211],{"href":58},"la misma razón por la que una copia de la base de datos debería vivir fuera",":\nun proyecto suspendido o un acceso perdido se lleva consigo cada copia guardada\ndentro de esa cuenta.",[25,214,216],{"id":215},"primero-los-archivos-o-primero-las-filas","¿Primero los archivos, o primero las filas?",[10,218,219],{},"Primero la base de datos, luego los archivos, y los archivos vuelven a través de\nStorage para que sea Storage quien escriba las filas.",[10,221,222,223,225],{},"Cada upload que pasa por Storage, desde tu app, desde el endpoint S3 o desde la\nCLI de Supabase, hace dos cosas en una sola operación: guarda los bytes y\nescribe la fila de ",[49,224,51],{}," que los describe. El libro se coloca en la\nestantería y la ficha la escribe la misma mano. Devuelve los archivos por ese\ncamino y las filas llegan con ellos, y las dos cosas no pueden discrepar.",[10,227,228,229,231,232,237],{},"La otra dirección no tiene ningún mecanismo así. Copiar de vuelta filas de\n",[49,230,51],{}," con una herramienta de base de datos escribe fichas y no\ncoloca nada. Además complica el paso siguiente: por defecto Storage rechaza un\nupload a una ruta que ya tiene fila, con un error que dice que el recurso ya\nexiste, y la\n",[33,233,236],{"href":234,"rel":235},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fstorage\u002Fuploads",[37],"guía de subidas"," de Supabase\ndice que se supera activando la sobrescritura. Así que cuando la restauración\nde la base de datos ya ha devuelto las filas, que es lo que la propia guía de\nmigración de Supabase te hace hacer, la copia de archivos que viene después\ntiene que poder sobrescribir.",[111,239],{"alt":240,"caption":241,"src":242},"Dos carriles. En el de arriba, una copia guardada entra directamente en una base de datos y enciende tres filas, mientras un contenedor dibujado bajo la flecha sigue punteado y vacío, y el carril está tachado. En el de abajo, tres imágenes entran primero en el contenedor, una flecha continúa desde el contenedor hasta la base de datos, y las mismas tres filas se encienden a medida que llegan las imágenes. El carril de abajo lleva una marca de verificación.","Un archivo que llega a través de Storage escribe su propia fila. Una fila que llega a través de la base de datos no trae ningún archivo consigo.","\u002Fblog\u002Fsupabase-storage-backup\u002Fthrough-storage-or-around-it-1600x620.png",[10,244,245],{},"El orden, entonces:",[148,247,248,254,265],{},[151,249,250,251,136],{},"Restaura la base de datos, como describe\n",[33,252,253],{"href":121},"ese artículo",[151,255,256,257,260,261,264],{},"Copia los archivos de vuelta a través de Storage, con ",[49,258,259],{},"aws s3 sync"," en el\nsentido contrario (primero la carpeta, después el bucket) o con\n",[49,262,263],{},"supabase storage cp -r",", y con la sobrescritura activada. Un bucket que ya\nno existe hay que crearlo antes, con el mismo nombre y el mismo ajuste de\npúblico.",[151,266,267],{},"Abre un archivo, y después varios más.",[10,269,270,271,273],{},"La versión más limpia de esto se salta por completo la reproducción de\n",[49,272,51],{}," en el paso de la base de datos y deja que los uploads\nescriban cada fila desde cero, de modo que nunca haya que sobrescribir nada.\nAsí lo hace nuestra propia restauración. Requiere filtrar la copia antes de\nreproducirla, lo cual es un paso para la herramienta que hace la restauración.",[25,275,277],{"id":276},"cómo-comprobar-que-tienes-las-dos-cosas","Cómo comprobar que tienes las dos cosas",[10,279,280],{},"Abriendo archivos, porque cada lista que puedes sacar se lee de la tabla.",[10,282,283,284,286],{},"El explorador de archivos del panel, una consulta sobre ",[49,285,51],{}," y el\nrecuento de filas de un informe de copia describen todos el cajón, y después de\nuna restauración de solo la base de datos el cajón está perfecto. La única\npetición que toca la estantería es una petición del archivo en sí.",[10,288,289],{},"Así que después de una restauración, y después de la primera copia que tomes,\nabre archivos. Elige un puñado de cada bucket, incluidos los más antiguos, y\nábrelos a través de la app como lo haría un usuario. Un archivo que se abre ha\nvuelto. Un archivo que da error nunca estuvo ahí, diga lo que diga la lista.",[25,291,293],{"id":292},"qué-hacer-esta-semana","Qué hacer esta semana",[295,296,297],"key-takeaways",{},[298,299,300,303,309,312,315],"ul",{},[151,301,302],{},"Abre Storage en tu panel de Supabase y anota cada bucket y, a grandes rasgos, qué contiene. Todo lo que un usuario subió vive ahí y en ninguna copia de la base de datos.",[151,304,305,306,308],{},"Activa el protocolo S3, crea una clave de acceso y ejecuta un ",[49,307,259],{}," por bucket a una carpeta fuera de tu cuenta de Supabase. Guarda el secreto en un gestor de contraseñas; puede borrar con la misma facilidad con que copia.",[151,310,311],{},"Vuelve a ejecutar la sincronización con una periodicidad que vayas a cumplir, sea un recordatorio en el calendario o una tarea en un servidor.",[151,313,314],{},"Apunta el orden de restauración en algún sitio donde lo encuentres: primero la base de datos, luego los archivos a través de Storage con la sobrescritura activada.",[151,316,317],{},"Restaura una vez en un proyecto desechable y abre diez archivos, para que la primera vez que sepas si la copia funciona no sea durante una caída.",[25,319,321],{"id":320},"dónde-encaja-reeve-care","Dónde encaja Reeve Care",[10,323,324],{},"Care copia los archivos junto con la base de datos, en el orden que describe\neste artículo, y los devuelve de la misma forma.",[111,326],{"alt":327,"caption":328,"src":329},"Un panel de Reeve Care con dos filas. En la primera, una base de datos y una imagen están dentro de un contorno de cuenta punteado. La base de datos sale como un archivo guardado que se cierra con candado, se relee a través de una lupa y recibe una marca de verificación, numerado uno, y solo entonces la imagen sale como un segundo archivo guardado, numerado dos. En la segunda fila, una tarjeta con un botón envía una copia de vuelta a la cuenta, numerada uno, y una segunda copia a lo largo de una flecha que atraviesa un contenedor por el camino, numerada dos.","La copia de la base de datos se relee y pasa antes de que se copien los archivos. A la vuelta, la base de datos va primero, y los archivos regresan a través de Storage.","\u002Fblog\u002Fsupabase-storage-backup\u002Fcare-database-then-files-1600x560.png",[298,331,332,338,344,350,356],{},[151,333,334,337],{},[17,335,336],{},"Los archivos que subieron tus usuarios también se copian",", en cuanto conectas los buckets de Storage de tu app de Supabase. Es una segunda clave, pedida por separado, porque la clave que Supabase emite para Storage puede escribir además de leer, y preferimos pedirla antes que mezclarla con la clave de la base de datos, que no puede.",[151,339,340,343],{},[17,341,342],{},"La copia de archivos se ejecuta después de que la copia de la base de datos se haya releído y verificado",", nunca al lado, de modo que un punto de restauración nunca reclama archivos que no copió. Una copia que se quedó sin tiempo se marca como parcial, con los recuentos reales.",[151,345,346,349],{},[17,347,348],{},"Cada punto de restauración registra qué ruta contenía qué archivo."," Una base de datos devuelta al martes recibe los archivos del martes, y un archivo que sigue en su sitio se deja en paz.",[151,351,352,355],{},[17,353,354],{},"La restauración devuelve los archivos a través de Storage",", de modo que cada fila la escribe el upload que lleva el archivo. Nada de lo que existe hoy se sobrescribe ni se borra, lo que significa que pulsar el botón en pleno pánico no puede destruir lo que intentabas salvar.",[151,357,358,361],{},[17,359,360],{},"Restaurar es un botón",", y toma una instantánea del estado actual antes de empezar, de modo que la propia restauración tiene un deshacer.",[10,363,364,365,369],{},"Care empieza en $49 al mes para una app. Es un precio de lista, y la\n",[33,366,368],{"href":367},"\u002Fpricing","página de precios"," a veces está por debajo de la cifra de aquí y\nnunca por encima.",[10,371,372,373,136],{},"Cómo se toma, se comprueba y se devuelve una copia, archivos incluidos, está\ndibujado paso a paso en la\n",[33,374,376],{"href":375},"\u002Fsupabase-backups","página de copias de seguridad de Supabase",[10,378,379,380,384],{},"Antes de cerrar esta pestaña, abre Storage en tu panel y cuenta los buckets.\nCada uno es un conjunto de archivos que ninguna copia tomada por Supabase va a\ncontener jamás, y el comando de sincronización de arriba es todo lo que hace\nfalta para cambiarlo. Si además un bucket resultó ser listable,\n",[33,381,383],{"href":382},"\u002Fblog\u002Fsupabase-storage-bucket-public","lo que un desconocido saca de esa lista","\nes lo siguiente que leer.",{"title":175,"searchDepth":386,"depth":386,"links":387},3,[388,390,391,392,393,394,395,396],{"id":27,"depth":389,"text":28},2,{"id":63,"depth":389,"text":64},{"id":93,"depth":389,"text":94},{"id":139,"depth":389,"text":140},{"id":215,"depth":389,"text":216},{"id":276,"depth":389,"text":277},{"id":292,"depth":389,"text":293},{"id":320,"depth":389,"text":321},"Backups","\u002Fblog\u002Fsupabase-storage-backup\u002Fcover-1200x630.png","Una base de datos con tres filas, cada una unida por una línea fina a una imagen colocada en una bandeja aparte al lado.","Un Supabase storage backup es una tarea aparte. Las copias de la base guardan la lista de tus archivos y ninguno de ellos, así que cada upload queda roto.",false,"md",[404,407,410,413,416],{"q":405,"a":406},"¿Supabase hace copia de mis buckets de Storage?","No. Supabase lo dice en su propia página de copias de seguridad: las copias de la base de datos no contienen los archivos guardados a través de la API de Storage, solo las filas de la base de datos que los describen. Eso vale para las copias diarias de los planes de pago y para el point-in-time recovery. El plan gratuito no toma copias automáticas de ningún tipo, así que ahí la pregunta ni se plantea. Tus archivos necesitan una copia propia en cualquier plan.",{"q":408,"a":409},"¿El point-in-time recovery cubre Supabase Storage?","No. El point-in-time recovery rebobina la base de datos, y Storage es un servicio aparte del que la base de datos solo guarda rutas. Un proyecto rebobinado al martes apunta a lo que haya hoy en los buckets, y un archivo borrado el miércoles sigue borrado después de una recuperación que salió perfecta.",{"q":411,"a":412},"¿Cómo descargo todos los archivos de un bucket de Supabase?","A través del endpoint compatible con S3. Activa el protocolo S3 en los ajustes de Storage de tu panel, crea un par de claves de acceso y apunta la línea de comandos de AWS o rclone al endpoint y la región que aparecen en esa misma página. Un solo comando de sincronización copia un bucket entero a una carpeta que tú guardas. El panel descarga un archivo cada vez, lo que sirve para un logo y no lleva a nada con un bucket.",{"q":414,"a":415},"¿Qué es storage.objects?","Una tabla de tu base de datos Postgres con una fila por cada archivo de cada bucket: en qué bucket está, su ruta, quién lo subió, su tamaño y tipo, y cuándo llegó. Es el índice. Los bytes del archivo no están ahí, y por eso una copia de la base de datos puede listar cada archivo que tienes sin contener ninguno.",{"q":417,"a":418},"Si restauro mi base de datos, ¿vuelven mis archivos?","No. La restauración devuelve las filas de storage.objects, así que el panel lista cada archivo y tu app dibuja cada enlace, y cada uno abre un error porque el archivo que hay detrás nunca estuvo en la copia. Los archivos hay que devolverlos por separado, a través de Storage, desde una copia que hayas tomado de ellos.","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",[421,422,423,424,425,426,427,428,429],"supabase storage backup","respaldar bucket de supabase storage","supabase hace backup de storage","supabase storage objects backup","backup de archivos supabase","restaurar supabase storage","supabase s3 storage backup","descargar todos los archivos de un bucket supabase","supabase storage disaster recovery",{},true,"Supabase storage backup: tu copia no tiene archivos","\u002Fblog\u002Fsupabase-storage-backup","2026-09-14",{"title":5,"description":400},"blog\u002Fsupabase-storage-backup",[438,439,440],"Un Supabase storage backup es una tarea distinta de la copia de la base de datos. Cada copia que Supabase toma, en cualquier plan, contiene la fila que describe cada archivo subido y ninguno de los archivos en sí.","Restaura solo la base de datos y tendrás una app que funciona, en la que cada avatar, factura y upload abre un error, porque el archivo al que apunta nunca estuvo en la copia.","El endpoint compatible con S3 es la forma de sacar los archivos. El camino de vuelta pasa por el propio Storage, que escribe la fila correspondiente a medida que llega cada archivo, de modo que la lista y los archivos no pueden discrepar.","_VBM93nPSlcvnqAtqLsPPfXEwecaiBiV9HuBJcaIi7E",[443,450,456,462,468,474,480,486,492,498,504,510,516,522,528,534,539,545,551,557,563,569,575,581,587,593,599,605,606,611,617,623,629,635,641,647,653,659,665,671,677,683,689,695,701,707,713,719,725,730,735,741,747,753,758,764,769,775,780,786],{"path":444,"title":445,"description":446,"published":447,"category":448,"image":449,"draft":401},"\u002Fblog\u002Fbase44-security-scan","Escaneo de seguridad de Base44: lo que solo él ve","El escaneo de seguridad de Base44 revisa siete tipos de problema desde dentro. Esta es la mitad que lee y nadie más puede leer, y la mitad que nunca mira.","2026-10-10","Fundamentos de seguridad","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":451,"title":452,"description":453,"published":454,"category":448,"image":455,"draft":401},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Tu clave API se filtró. El orden en el que hay que actuar","Una clave API se filtró y no sabes por dónde empezar. No todas las claves de tu frontend lo son, y el orden importa más que la velocidad.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":457,"title":458,"description":459,"published":460,"category":448,"image":461,"draft":401},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" sin desactivar RLS","\"Infinite recursion detected in policy for relation\" significa que tu policy preguntó a la tabla que protege. Así se rompe el círculo.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":463,"title":464,"description":465,"published":466,"category":448,"image":467,"draft":401},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" en Supabase, y el arreglo equivocado","\"No API key found in request\" significa que tu petición llegó a Supabase sin clave. Casi todas las respuestas apuntan a las reglas de tu base de datos.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":469,"title":470,"description":471,"published":472,"category":448,"image":473,"draft":401},"\u002Fblog\u002Fis-base44-safe","¿Es seguro Base44? Lo que vimos en 5.442 apps Base44","¿Es seguro Base44? Pasamos nueve comprobaciones a 5.442 apps Base44 en producción. Casi todas sacaron B por motivos que su dueño nunca eligió.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":475,"title":476,"description":477,"published":478,"category":448,"image":479,"draft":401},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Ocultar una clave API: muévela a una Edge Function de Supabase","Ocultar una clave API significa sacarla del navegador, y una Edge Function de Supabase es el sitio más pequeño donde ponerla. Dos pasos importan más.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":481,"title":482,"description":483,"published":484,"category":448,"image":485,"draft":401},"\u002Fblog\u002Fenv-file-exposed-on-your-server","¿Tu archivo .env está expuesto? Las doce rutas a revisar","¿Tu archivo .env está expuesto en tu propio servidor web? Doce direcciones te lo dicen, y un acierto significa que todo lo que contiene ya es público.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":487,"title":488,"description":489,"published":490,"category":448,"image":491,"draft":401},"\u002Fblog\u002Fis-v0-safe","Seguridad de v0: las 1.790 aplicaciones escaneadas sacaron una A","Seguridad de v0, medida en 1.790 aplicaciones v0 en vivo: todas sacaron A. Solo 17 nombraban una base de datos, y eso es casi todo lo que mide la A.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":493,"title":494,"description":495,"published":496,"category":448,"image":497,"draft":401},"\u002Fblog\u002Fis-bolt-safe","¿Es seguro Bolt? Lo que vimos en 1.123 aplicaciones Bolt","¿Es seguro Bolt? Pasamos 1.123 aplicaciones Bolt en vivo por nueve comprobaciones. El hosting salió limpio. Los hallazgos eran claves y tablas abiertas dentro.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":499,"title":500,"description":501,"published":502,"category":448,"image":503,"draft":401},"\u002Fblog\u002Fis-supabase-down-or-your-app","¿Supabase está caído o es tu app? Cómo distinguirlo","¿Supabase está caído o es tu app? Un proyecto pausado, una base de datos llena y un fallo tuyo parecen lo mismo. Cuatro comprobaciones los separan.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":505,"title":506,"description":507,"published":508,"category":448,"image":509,"draft":401},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","¿Supabase cifra mis datos? Sí. Esto es lo que detiene","¿Supabase cifra los datos? Sí: AES-256 en reposo, TLS en tránsito, SOC 2 e ISO 27001. Qué cubre cada uno, y la fuga que ninguno de ellos detiene.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":511,"title":512,"description":513,"published":514,"category":448,"image":515,"draft":401},"\u002Fblog\u002Fsupabase-free-plan-limits","¿Cuánto cuesta Supabase? Los límites del plan gratuito","Los límites del plan gratuito de Supabase: 500 MB de base de datos, 5 GB de egress y ningún backup. Qué pasa en cada uno y qué cambia Pro por $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":517,"title":518,"description":519,"published":520,"category":397,"image":521,"draft":401},"\u002Fblog\u002Ftest-your-supabase-backup","Prueba tu backup de Supabase antes del día que lo necesites","Cómo probar tu backup de Supabase: restaurarlo en un proyecto de prueba, contar filas, iniciar sesión y buscar la línea que le falta a un archivo cortado.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":523,"title":524,"description":525,"published":526,"category":397,"image":527,"draft":401},"\u002Fblog\u002Fsupabase-backup-github-action","Backup gratis de Supabase con una GitHub Action, y la trampa","Un backup de Supabase con GitHub Action es gratis y sirve a muchas apps. El workflow, el connection string correcto y el egress de cada ejecución.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":529,"title":530,"description":531,"published":532,"category":397,"image":533,"draft":401},"\u002Fblog\u002Fdownload-your-supabase-backup","Por qué no puedes descargar tu backup de Supabase","No puedes descargar tu backup de Supabase en un proyecto actual: la copia diaria es una instantánea física. Cómo comprobarlo y tener tu propia copia.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":535,"title":536,"description":537,"published":532,"category":448,"image":538,"draft":401},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": el grant que falta","Desde el 30 de octubre, una tabla nueva de Supabase responde \"permission denied for table\" hasta que le das acceso. El grant del email es la mitad del arreglo.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":540,"title":541,"description":542,"published":543,"category":448,"image":544,"draft":401},"\u002Fblog\u002Fopen-api-endpoint-exposed","¿Un endpoint de API abierto es un problema? Mira el JSON","Tu escaneo señaló un endpoint de API abierto. Que importe depende de lo que devolvió, y la mayoría de los que encontramos eran de la plataforma.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":546,"title":547,"description":548,"published":549,"category":448,"image":550,"draft":401},"\u002Fblog\u002Flovable-security-scan","Escaneo de seguridad de Lovable: lo que no puede probar","Escaneo de seguridad de Lovable: qué revisan el Quick scan y el Deep scan, cuándo corre cada uno, y lo único que ningún escaneo desde dentro puede probar.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":552,"title":553,"description":554,"published":555,"category":397,"image":556,"draft":401},"\u002Fblog\u002Fsupabase-backup-auth-users","Por qué tu dump de Supabase no tiene usuarios dentro","Ejecuta supabase db dump por sí solo y obtienes la forma de tu base de datos y ninguna de sus filas, sin el esquema auth donde viven tus usuarios.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":558,"title":559,"description":560,"published":561,"category":448,"image":562,"draft":401},"\u002Fblog\u002Fdomain-and-certificate-expiry","Dominio caducado, web caída: qué pasa a partir de ahora","Tu dominio caducó y tu web está caída. Aquí tienes el reloj que acaba de arrancar, por qué el certificado es el menor problema, y cómo comprobar ambos.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":564,"title":565,"description":566,"published":567,"category":448,"image":568,"draft":401},"\u002Fblog\u002Fis-lovable-safe","¿Es seguro Lovable? Lo que vimos en 18.554 aplicaciones Lovable","¿Es seguro Lovable? Pasamos 18.554 aplicaciones Lovable por nueve comprobaciones. La plataforma fue la más limpia de cinco. Los hallazgos estaban dentro.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":570,"title":571,"description":572,"published":573,"category":448,"image":574,"draft":401},"\u002Fblog\u002Fvibe-coded-app-security-checklist","La lista de seguridad del vibe coding, en nueve comprobaciones","Una lista de seguridad del vibe coding con nueve puntos, cada uno verificable en tu app desde fuera por cualquiera, y cada uno con una prueba de una línea.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":576,"title":577,"description":578,"published":579,"category":448,"image":580,"draft":401},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Una clave secreta de Stripe en tu frontend puede mover dinero","Una clave secreta de Stripe expuesta en tu frontend puede reembolsar, cobrar y leer cada ficha de cliente que tienes. Tu clave pk_live_ sí debe estar ahí.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":582,"title":583,"description":584,"published":585,"category":448,"image":586,"draft":401},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variables de entorno de Vite expuestas: el prefijo dice publica esto","Variables de entorno de Vite expuestas en tu app: hicieron lo que pedía el prefijo. VITE_ y NEXT_PUBLIC_ significan publica esto, y la IA nunca supo el coste.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":588,"title":589,"description":590,"published":591,"category":448,"image":592,"draft":401},"\u002Fblog\u002Fbase44-source-maps","Seguridad en Base44: qué marca un escaneo y qué te toca arreglar a ti","Seguridad en Base44 en 5.438 apps escaneadas: tres hallazgos en casi todas son de la plataforma, el source map es la insignia de Base44 y lo tuyo es poco.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":594,"title":595,"description":596,"published":597,"category":448,"image":598,"draft":401},"\u002Fblog\u002Fis-cursor-ai-safe","¿Es seguro Cursor AI? El editor, el código y la app que publicaste","¿Es seguro Cursor AI? Tres preguntas en una búsqueda: qué guarda Cursor, en qué falla el código que escribe y si la app que publicaste está abierta.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":600,"title":601,"description":602,"published":603,"category":448,"image":604,"draft":401},"\u002Fblog\u002Fis-replit-safe","¿Es seguro Replit? Lo que vimos en 3.042 aplicaciones Replit en vivo","¿Es seguro Replit? Pasamos 3.042 aplicaciones Replit en vivo por nueve comprobaciones externas. Los hallazgos estaban en la aplicación publicada, no en el host.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":433,"title":5,"description":400,"published":434,"category":397,"image":419,"draft":401},{"path":42,"title":607,"description":608,"published":609,"category":397,"image":610,"draft":401},"Point-in-time recovery de Supabase: precio y límites","El point-in-time recovery de Supabase rebobina tu base de datos a cualquier segundo de la última semana. Cuesta $100 al mes sobre Pro y solo cubre la base.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":612,"title":613,"description":614,"published":615,"category":397,"image":616,"draft":401},"\u002Fblog\u002Fsupabase-project-paused-recover","¿Proyecto de Supabase pausado? Tus datos siguen ahí","Supabase pausó tu proyecto tras una semana sin actividad. No se ha borrado nada, Restaurar está junto al nombre y tienes un año antes de que eso cambie.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":618,"title":619,"description":620,"published":621,"category":448,"image":622,"draft":401},"\u002Fblog\u002Fsafest-ai-app-builder","¿Qué builder de apps con IA es más seguro? 30.998 apps escaneadas","¿Qué builder de apps con IA es más seguro? Escaneamos 30.998 apps activas de Lovable, Base44, Replit, v0 y Bolt. El builder no es lo que decide tu nota.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":624,"title":625,"description":626,"published":627,"category":448,"image":628,"draft":401},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Activa Row Level Security en cada tabla de Supabase y compruébalo","Activar Row Level Security en Supabase sin política cierra la tabla del todo. Una política sin el interruptor no hace nada. Aquí tienes el SQL y la prueba.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":630,"title":631,"description":632,"published":633,"category":448,"image":634,"draft":401},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": lo que el aviso no ve","Supabase marca \"RLS disabled in public\" como error. No dice nada de la política de lectura que deja tu tabla igual de abierta a cualquiera.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":636,"title":637,"description":638,"published":639,"category":448,"image":640,"draft":401},"\u002Fblog\u002Frotate-supabase-service-role-key","Cómo rotar una clave service_role de Supabase filtrada","Supabase dice que primero cierres la fuga. Otras guías dicen que rotes ya. Cuál es lo correcto depende de dónde se filtró tu clave service_role.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":642,"title":643,"description":644,"published":645,"category":448,"image":646,"draft":401},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Escáneres de seguridad vibe coding comparados, el nuestro incluido","El mejor escáner de seguridad para vibe coding depende de tres preguntas que ninguna lista de funciones responde. Diez herramientas, con precios.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":648,"title":649,"description":650,"published":651,"category":448,"image":652,"draft":401},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: haz tú mismo las cinco comprobaciones","Un Supabase security checker lee tu app publicada en lugar de la configuración de tu proyecto. Estas son las cinco comprobaciones y cómo hacer cada una.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":654,"title":655,"description":656,"published":657,"category":448,"image":658,"draft":401},"\u002Fblog\u002Fvibe-coding-security-scanner","Escáner de seguridad para vibe coding: qué se le escapa","Un escáner de seguridad para vibe coding lee tu app en vivo desde fuera. Qué cubre eso, las cuatro cosas que no puede ver y cómo leer el resultado.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":660,"title":661,"description":662,"published":663,"category":448,"image":664,"draft":401},"\u002Fblog\u002Fmissing-security-headers","Faltan cabeceras de seguridad: cuándo importa de verdad","Que falten cabeceras de seguridad es el hallazgo que más imprime nuestro escáner. Contra qué protegen y cuándo son la línea menos urgente de tu informe.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":666,"title":667,"description":668,"published":669,"category":448,"image":670,"draft":401},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Tu clave de API de OpenAI está expuesta en tu frontend. Rótala.","Una clave de API de OpenAI expuesta en tu frontend no se puede atar a un dominio. Rótala hoy, mueve la llamada a tu servidor y limita el gasto.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":672,"title":673,"description":674,"published":675,"category":448,"image":676,"draft":401},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Clave de API expuesta en el frontend: qué llevan 30.998 apps","Una clave de API expuesta en tu frontend suele ser una clave de Google Maps. Escaneamos 30.998 apps vibe-coded y contamos qué secretos se filtran de verdad.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":678,"title":679,"description":680,"published":681,"category":397,"image":682,"draft":401},"\u002Fblog\u002Fsupabase-backup-tools-compared","Herramientas de backup de Supabase comparadas, la nuestra incluida","Cuatro tipos de herramienta de backup de Supabase, qué copia cada una y cuándo una GitHub Action gratuita le gana a pagar a cualquiera, nosotros incluidos.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":684,"title":685,"description":686,"published":687,"category":448,"image":688,"draft":401},"\u002Fblog\u002Freplit-secrets-explained","Cómo usar secrets en Replit, y qué se publica de todos modos","Cómo usar secrets en Replit: añadir uno, leerlo y arreglar las dos causas del undefined. Y las claves que la herramienta Secrets no puede mantener privadas.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":690,"title":691,"description":692,"published":693,"category":397,"image":694,"draft":401},"\u002Fblog\u002Fback-up-supabase-free-tier","Backups del plan gratuito de Supabase: cómo hacer uno sin terminal","No hay backups en el plan gratuito de Supabase: la copia tienes que hacerla tú. Cómo sacarla desde el panel y qué deja fuera la vía CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":696,"title":697,"description":698,"published":699,"category":448,"image":700,"draft":401},"\u002Fblog\u002Fis-supabase-secure","¿Supabase es seguro? Sí. Tu proyecto es otra pregunta","¿Supabase es seguro? La plataforma está auditada, cifrada y sometida a pentests. Su propia documentación dice dónde termina eso y empiezan tus ajustes.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":702,"title":703,"description":704,"published":705,"category":448,"image":706,"draft":401},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Dónde están tus claves API de Supabase: anon, service_role y URL","La URL del proyecto, la clave anon y la clave service_role están en una sola página del panel. Aquí tienes dónde está, y cuál de los cuatro va en tu app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":708,"title":709,"description":710,"published":711,"category":448,"image":712,"draft":401},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy en Supabase. ¿Y ahora?","\"New row violates row-level security policy\" significa que Supabase rechazó una escritura. El arreglo rápido vuelve a abrir la tabla para cualquiera.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":714,"title":715,"description":716,"published":717,"category":448,"image":718,"draft":401},"\u002Fblog\u002Fcors-wildcard-security-risk","¿Es un comodín CORS un riesgo de seguridad? Casi nunca.","¿Es un comodín CORS un riesgo de seguridad? Casi siempre es el ajuste por defecto de tu builder y no entrega nada que tu servidor no diera ya a cualquiera.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":720,"title":721,"description":722,"published":723,"category":397,"image":724,"draft":401},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Supabase branching no es un backup. Solo va hacia adelante.","Por qué el branching de Supabase no es un backup: una rama arranca sin tus datos y un merge solo mueve el esquema. Para qué sirve y qué usar en su lugar.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":121,"title":726,"description":727,"published":728,"category":397,"image":729,"draft":401},"Cómo restaurar un backup de Supabase, y qué se rompe después","Cómo restaurar un backup de Supabase desde el panel o desde un archivo de volcado, qué reemplaza la restauración y por qué tu app puede seguir rota al terminar.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":382,"title":731,"description":732,"published":733,"category":448,"image":734,"draft":401},"Tu bucket de Supabase Storage es público. ¿Es un problema?","Un bucket público de Supabase Storage significa que quien tenga la URL de un archivo puede abrirlo. No significa que alguien pueda listar lo que hay dentro.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":736,"title":737,"description":738,"published":739,"category":448,"image":740,"draft":401},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","¿Es un problema una clave de API de Google en tu frontend?","Una clave de API de Google en tu frontend es la clave que más encuentra nuestro escáner, y casi siempre no pasa nada. Un ajuste gratuito decide cuál es cuál.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":742,"title":743,"description":744,"published":745,"category":397,"image":746,"draft":401},"\u002Fblog\u002Fai-agent-deleted-my-database","Un agente de IA borró mis datos de Supabase. ¿Qué puedo recuperar?","Un agente de IA borró datos de tu base. Lo que puedes recuperar ya estaba decidido antes de que se ejecutara, y los próximos minutos deciden el resto.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":748,"title":749,"description":750,"published":751,"category":448,"image":752,"draft":401},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","¿Puede cualquiera leer tu base de datos Supabase? 3.680 apps","¿Puede cualquiera leer tu base de datos Supabase sin iniciar sesión? Escaneamos 30.998 apps activas hechas con builders de IA y medimos cuántas dicen que sí.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":754,"title":755,"description":756,"published":751,"category":448,"image":757,"draft":401},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source maps expuestos: tu app está publicando su código original","Un source map expuesto deja que cualquiera lea el código original de tu app, comentarios incluidos. La comprobación de 30 segundos y lo que de verdad importa.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":759,"title":760,"description":761,"published":762,"category":448,"image":763,"draft":401},"\u002Fblog\u002Fsupabase-new-api-keys","Las nuevas claves de API de Supabase: ¿cuál va en tu app?","Supabase sustituyó anon y service_role por claves publicables y secretas. ¿Cuál pertenece a tu app y cuál no debe estar nunca?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":58,"title":765,"description":766,"published":767,"category":397,"image":768,"draft":401},"¿Supabase respalda mi base de datos? Depende de tu plan.","¿Supabase respalda tu base de datos? A diario en los planes de pago, y nada en el gratuito. Cómo saber cuál tienes y qué es lo que esa copia no cubre.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":770,"title":771,"description":772,"published":773,"category":448,"image":774,"draft":401},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security está activado. Tu tabla sigue pública.","Activar Supabase Row Level Security no protege una tabla. Lo hacen tus políticas, y la que arregló tu app rota puede dejar entrar a cualquiera.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":776,"title":777,"description":778,"published":773,"category":397,"image":779,"draft":401},"\u002Fblog\u002Fversion-history-is-not-a-backup","El historial de versiones no es un backup. No recupera una tabla.","Lovable y Bolt guardan un historial de versiones de tu código. Tu base de datos es un servicio aparte, y volver atrás no te devuelve tus datos.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":781,"title":782,"description":783,"published":784,"category":397,"image":785,"draft":401},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Tres formas de respaldar una base Supabase, y qué falta en cada una","El panel, pg_dump y un servicio gestionado. Qué guarda de verdad cada uno, qué deja fuera sin avisar y cuál sobrevive a perder la cuenta.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":204,"title":787,"description":788,"published":784,"category":448,"image":789,"draft":401},"Qué claves de API son seguras en el navegador y cuáles no","Tu clave anon de Supabase está pensada para ser pública. Tu clave service_role no, y se salta todas las reglas que pongas. Cómo distinguirlas.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1791618971540]