[{"data":1,"prerenderedAt":991},["ShallowReactive",2],{"blog-de-supabase-bucket-not-found":3,"blog-index-de":460},{"id":4,"title":5,"body":6,"category":417,"cover":418,"coverAlt":419,"description":420,"draft":421,"extension":422,"faq":423,"image":439,"keywords":440,"meta":448,"navigation":449,"ogTitle":5,"path":450,"published":451,"seo":452,"stem":453,"tldr":454,"updated":451,"__hash__":459},"blog_de\u002Fblog\u002Fsupabase-bucket-not-found.md","Supabase \"Bucket not found\": die drei Dinge, die es bedeutet",{"type":7,"value":8,"toc":404},"minimark",[9,13,16,27,30,38,43,46,49,75,78,100,104,107,112,118,121,132,135,141,145,163,166,169,175,179,182,191,194,209,214,218,221,224,227,238,242,245,255,269,272,276,279,291,299,303,306,315,333,342,359,363,391],[10,11,12],"p",{},"Deine App zeigt ein kaputtes Bild, wo ein Foto sein sollte. Oder ein Upload\nscheitert, und die Meldung, die zurückkommt, ist drei Wörter lang: \"Bucket not\nfound\". Dann öffnest du Supabase, gehst zu Storage, und der Bucket steht genau\nda in der Liste.",[10,14,15],{},"Öffne die Adresse des Bildes in einem eigenen Tab, und Storage antwortet so:",[17,18,23],"pre",{"className":19,"code":21,"language":22},[20],"language-text","{\n  \"statusCode\": \"404\",\n  \"code\": \"NoSuchBucket\",\n  \"error\": \"Bucket not found\",\n  \"message\": \"Bucket not found\"\n}\n","text",[24,25,21],"code",{"__ignoreMap":26},"",[10,28,29],{},"Das ist der Body, den der Quellcode von Supabase Storage heute baut, gelesen am\n17. Oktober 2026. Supabase \"Bucket not found\" deckt mit diesem einen Body drei\nverschiedene Situationen ab, und in der ersten liegt der Bucket genau dort, wo\ndu ihn gelassen hast.",[10,31,32,33,37],{},"Und hier liegt Ratgeber um Ratgeber falsch: ",[34,35,36],"strong",{},"die erste Lösung, die du findest,\nist, den Bucket öffentlich zu machen, und wenn sie funktioniert, dann weil damit\njede Datei in diesem Bucket ebenfalls öffentlich wird."," Bei zwei der drei\nUrsachen ändert sie überhaupt nichts. Bei der übrigen tauscht sie ein kaputtes\nBild gegen einen Bucket, aus dem jeder lesen kann, der die Adresse einer Datei\nhat.",[39,40,42],"h2",{"id":41},"was-bedeutet-supabase-bucket-not-found","Was bedeutet Supabase \"Bucket not found\"?",[10,44,45],{},"Storage hat nach einem Bucket mit genau dem Namen aus deiner Anfrage gesucht, in\ndem Projekt, das deine Anfrage erreicht hat, und keinen gefunden, den es dieser\nAnfrage ausliefern würde.",[10,47,48],{},"Der letzte Teil steht da, weil ein Bucket mehr als eine Tür hat und jede Tür die\nFrage auf ihre eigene Weise stellt. Der Quellcode von Storage zeigt drei davon:",[50,51,52,63,69],"ul",{},[53,54,55,58,59,62],"li",{},[34,56,57],{},"Eine öffentliche Dateiadresse",", wie ",[24,60,61],{},"getPublicUrl"," sie baut. Diese Tür\nzählt nur Buckets, die als öffentlich markiert sind, also ist ein privater\nBucket hier \"nicht gefunden\", obwohl es ihn gibt.",[53,64,65,68],{},[34,66,67],{},"Ein Upload."," Diese Tür zählt jeden Bucket im Projekt, private\neingeschlossen. \"Nicht gefunden\" heißt hier, dass dieser Name in diesem\nProjekt wirklich fehlt.",[53,70,71,74],{},[34,72,73],{},"Eine Anfrage nach der Dateiliste eines Buckets."," Diese Tür sagt nie\n\"Bucket not found\". Ein Bucket, den es nicht gibt, antwortet mit einer leeren\nListe, derselben Antwort wie ein leerer Bucket, und das sehen wir von außen\njedes Mal, wenn unser Scanner fragt.",[10,76,77],{},"Die erste Aufgabe ist also herauszufinden, durch welche Tür die gescheiterte\nAnfrage kam.",[10,79,80,83,84,87,88,91,92,95,96,99],{},[34,81,82],{},"Die zwei Zahlen in dieser Meldung widersprechen sich, und das bringt die\nFehlerbehandlung durcheinander."," Der Body sagt ",[24,85,86],{},"\"statusCode\": \"404\"",", während\ndie Anfrage selbst mit dem HTTP-Status 400 scheitert. Storage schickt diesen\nFehler mit einer 400 und behält seine eigene 404 im Body. Die Bibliothek\nsupabase-js reicht beides an deinen Code weiter: ",[24,89,90],{},"error.status"," ist 400 und\n",[24,93,94],{},"error.statusCode"," ist ",[24,97,98],{},"\"404\"",". Code, den dein Builder geschrieben hat, um eine\n404 abzufangen, lässt diesen Fehler einfach vorbei.",[39,101,103],{"id":102},"ursache-1-ein-öffentlicher-link-zu-einem-privaten-bucket","Ursache 1: ein öffentlicher Link zu einem privaten Bucket",[10,105,106],{},"Das ist die Ursache hinter kaputten Bildern. Die Adresse wurde für einen\nöffentlichen Bucket gebaut, und der Bucket ist privat.",[10,108,109,111],{},[24,110,61],{}," fragt Supabase gar nichts. Es setzt die Adresse deines Projekts,\nden Bucket-Namen und den Dateinamen zu einem Link zusammen, in deiner App, und\ngibt ihn zurück. Der Hinweis über dieser Funktion in Supabases eigener\nClient-Bibliothek sagt das in zwei Sätzen:",[113,114,115],"blockquote",{},[10,116,117],{},"Diese Funktion prüft nicht, ob der Bucket öffentlich ist. Wird eine\nöffentliche URL für einen Bucket erzeugt, der nicht öffentlich ist, kannst du\ndie Datei nicht herunterladen.",[10,119,120],{},"Später fragt der Browser eines Besuchers nach diesem Link, und Storage sucht den\nBucket nur unter den öffentlichen Buckets. Ein privater Bucket fällt bei dieser\nSuche genauso durch wie ein fehlender, und die Antwort lautet \"Bucket not\nfound\".",[10,122,123,124,127,128,131],{},"Du erkennst diese Ursache am Link selbst. Eine öffentliche Dateiadresse enthält\n",[24,125,126],{},"\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002F",", gefolgt vom Bucket-Namen. Trägt dieser Bucket in\n",[34,129,130],{},"Storage → Buckets"," keine Markierung als öffentlich, konnte sich der Link nie\nöffnen, egal wie der Name geschrieben ist.",[10,133,134],{},"Neue Buckets starten privat, die Einstellung verhält sich also wie vorgesehen.\nPassiert ist, dass Code für einen öffentlichen Bucket geschrieben und auf einen\nprivaten gerichtet wurde, von dir oder von deinem Builder.",[136,137],"diagram",{"alt":138,"caption":139,"src":140},"Ein Lager voller Bilder mit einem Schloss-Abzeichen und zwei Öffnungen in der linken Wand. Eine Karte mit getPublicUrl schickt einen bernsteinfarbenen Pfeil zur oberen Öffnung, über der ein Kreuz steht und vor der ein Riegel liegt. Eine Karte mit createSignedUrl schickt einen türkisen Pfeil zur unteren Öffnung, deren Riegel angehoben ist, und ein Bild verlässt das Lager auf der anderen Seite in Richtung einer Person neben einem Haken.","Ein privater Bucket, zwei Arten, nach einer Datei zu fragen. Die öffentliche Adresse wird an der Tür abgewiesen, der signierte Link wird zur selben Datei durchgelassen.","\u002Fblog\u002Fsupabase-bucket-not-found\u002Ftwo-doors-1600x720.png",[39,142,144],{"id":143},"ursache-2-ein-name-der-nicht-ganz-der-name-des-buckets-ist","Ursache 2: ein Name, der nicht ganz der Name des Buckets ist",[10,146,147,148,151,152,155,156,159,160,162],{},"Storage vergleicht den Bucket-Namen Zeichen für Zeichen, also sind ",[24,149,150],{},"Avatars"," und\n",[24,153,154],{},"avatars"," zwei verschiedene Buckets, und ",[24,157,158],{},"avatar"," und ",[24,161,154],{}," ebenso.",[10,164,165],{},"Im Quellcode von Storage ist die Suche ein schlichter Gleichheitsvergleich auf\ndie id des Buckets. Großbuchstaben zählen, ein fehlender Buchstabe zählt, und\nein Bindestrich, wo der Bucket einen Unterstrich hat, zählt. Jeder dieser Fälle\nkommt als dieselben drei Wörter zurück.",[10,167,168],{},"Eine App, die mit einem KI-Werkzeug gebaut wurde, kann hier landen, ohne dass\nsich irgendwer vertippt hat. Der Code, der eine Datei hochlädt oder anzeigt,\nentsteht in einem Schritt, und der Bucket, den er nennt, soll in einem anderen\nangelegt werden. Lief dieser zweite Schritt nie, oder lief er mit einem leicht\nanderen Namen, fragt der Code nach einem Bucket, den niemand angelegt hat.",[10,170,171,172,174],{},"Die Prüfung braucht zwei Listen. Öffne ",[34,173,130],{}," und notier dir den\nNamen jedes Buckets genau so, wie er dort steht. Dann sag deinem Builder in\neinfachen Worten: Liste jeden Storage-Bucket-Namen auf, den diese App benutzt,\nund zeig mir, wo jeder davon benutzt wird. Jeder Name auf seiner Liste, der auf\ndeiner fehlt, ist der, der scheitert.",[39,176,178],{"id":177},"ursache-3-der-bucket-liegt-in-einem-anderen-projekt","Ursache 3: der Bucket liegt in einem anderen Projekt",[10,180,181],{},"Deine App spricht mit genau einem Supabase-Projekt, dem in ihrer\nSupabase-Adresse, und ein Bucket, der in irgendeinem anderen Projekt angelegt\nwurde, existiert für deine App schlicht nicht.",[10,183,184,185,190],{},"Am deutlichsten zeigt sich diese Ursache bei einem Upload. Bei einem Upload\nsucht Storage den Bucket im ganzen Projekt, ohne deine Zugriffsregeln\nanzuwenden, also ist \"Bucket not found\" bei einem Upload nie ein\nBerechtigungsproblem. Wenn der Bucket existiert und deine Regeln die Datei\nablehnen, antwortet Storage mit\n",[186,187,189],"a",{"href":188},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","einer anderen Meldung über Row-Level Security",".\n\"Bucket not found\" bei einem Upload heißt also, dass dieser Name in dem Projekt\nfehlt, in das deine App schreibt.",[10,192,193],{},"Es gibt ganz gewöhnliche Wege zu zwei Projekten: ein Testprojekt neben dem\nLive-Projekt, eine Kopie der App, die mit einem frischen Projekt verbunden\nwurde, ein Projekt, das jemand von Hand angelegt hat, um etwas auszuprobieren.\nDer Bucket landet in dem, das gerade im Dashboard offen war.",[10,195,196,197,200,201,204,205,208],{},"Die Prüfung ist ein Vergleich zweier kurzer Zeichenfolgen. Die Supabase-Adresse\ndeiner App sieht aus wie ",[24,198,199],{},"https:\u002F\u002F\u003Cref>.supabase.co",", und der Teil vor\n",[24,202,203],{},".supabase.co"," ist die Referenz des Projekts. Die Adresse deines Dashboards\nträgt dieselbe Referenz nach ",[24,206,207],{},"\u002Fproject\u002F",". Weichen die beiden ab, schaust du auf\nein Projekt, während deine App mit einem anderen spricht.",[136,210],{"alt":211,"caption":212,"src":213},"Links ein App-Fenster mit einem türkisen Pfeil in das Projekt, dessen Referenz zu seiner eigenen passt. Dieses Projekt enthält zwei blasse Buckets und eine gestrichelte Umrisslinie, wo ein dritter sein sollte, markiert mit einem bernsteinfarbenen Kreuz. Rechts daneben enthält ein separates Projekt mit einer anderen Referenz den Bucket selbst, türkis hervorgehoben, ohne Verbindung zur App.","Den Bucket gibt es. Er wurde im rechten Projekt angelegt, und jede Anfrage deiner App geht an das linke.","\u002Fblog\u002Fsupabase-bucket-not-found\u002Ftwo-projects-1600x700.png",[39,215,217],{"id":216},"solltest-du-den-bucket-öffentlich-machen-um-es-zu-beheben","Solltest du den Bucket öffentlich machen, um es zu beheben?",[10,219,220],{},"Nur wenn jede Datei im Bucket für jeden gedacht ist, der ihre Adresse hat, und\nnur bei der ersten Ursache. Bei einem falschen Namen oder einem falschen Projekt\nändert der Schalter gar nichts.",[10,222,223],{},"Ein öffentlicher Bucket tut eine Sache, und Supabases Dokumentation beschreibt\nsie in einer Zeile: Jeder, der die Adresse einer Datei besitzt, kann sie\nöffnen. Eine Anmeldung kommt dabei nicht vor. Supabases eigene Beispiele dafür\nsind Profilbilder, öffentliche Medien und Inhalte von Blogbeiträgen, und Logos\noder Produktfotos gehören in dieselbe Gruppe.",[10,225,226],{},"Für Rechnungen, Ausweisscans, Exporte oder alles, was einer Person gehört, ist\nes die falsche Einstellung. Der Schalter gilt für den ganzen Bucket und für\njede Datei, die später dort landet, auch für Dateien aus einer Funktion, die du\nnoch gar nicht gebaut hast.",[10,228,229,230,233,234,237],{},"Dieselbe Abkürzung hat einen Zwilling auf der Seite der Regeln, und den messen\nwir. Eine Regel auf ",[24,231,232],{},"storage.objects",", die nur den Bucket nennt, lässt\nDownloads für alle funktionieren und gibt außerdem die Liste der Namen im Bucket\nheraus. Wir haben 8.435 lebende Apps gescannt, die ein Supabase-Projekt nennen.\nBei 4.703 davon hat die Bucket-Prüfung eine Antwort bekommen, und ",[34,235,236],{},"792 haben\nunsere Listenanfrage mit den Namen dessen beantwortet, was drinlag",", ohne dass\njemand angemeldet war. Das ist etwa eine von sechs der Apps, die wir fragen\nkonnten. Ist ein Bucket öffentlich und seine Liste ebenfalls offen, dann ist\njeder Name auf dieser Liste ein funktionierender Link.",[39,239,241],{"id":240},"wie-du-eine-private-datei-zeigst-ohne-sie-öffentlich-zu-machen","Wie du eine private Datei zeigst, ohne sie öffentlich zu machen",[10,243,244],{},"Gib der Seite einen signierten Link: eine Adresse, die für eine Anzahl Sekunden\nfunktioniert, die du festlegst, und danach aufhört zu funktionieren.",[10,246,247,248,251,252,254],{},"Supabases Dokumentation nennt zwei Wege, eine Datei aus einem privaten Bucket zu\nholen. Der eine ist ein Download, der die Sitzung der angemeldeten Person\nmitschickt. Der andere ist ",[24,249,250],{},"createSignedUrl",", das einen Link baut, \"auf den für\neine begrenzte Zeit zugegriffen werden kann\". Dieser zweite tritt überall an die\nStelle von ",[24,253,61],{},", wo eine Seite ein Bild zeigt.",[10,256,257,258,261,262,264,265,268],{},"Auch ein signierter Link unterliegt deinen Regeln. Bevor Storage irgendetwas\nsigniert, prüft sein Quellcode, ob die anfragende Person diese Datei lesen darf,\nalso braucht ein privater Bucket eine ",[24,259,260],{},"select","-Regel auf ",[24,263,232],{},", die\nfestlegt, wer was lesen darf.\n",[186,266,267],{"href":188},"Der Upload-Fehler erklärt, wie solche Regeln geschrieben werden",",\nauch, warum eine Leseregel, die nur den Bucket nennt, zugleich seine Liste\nöffnet.",[10,270,271],{},"Um das an deinen Builder zu geben, in einfachen Worten: Ersetze für den Bucket\nhinter dem Fehler \"Bucket not found\" getPublicUrl durch createSignedUrl, lass\nden Bucket privat und füge eine Storage-Policy hinzu, mit der jede Person nur\ndie Dateien lesen kann, die sie sehen soll. Lade dann die Seite mit dem kaputten\nBild neu.",[39,273,275],{"id":274},"was-deine-buckets-fremden-gerade-zeigen","Was deine Buckets Fremden gerade zeigen",[10,277,278],{},"Zwei Ansichten im Dashboard sagen dir, was du eingestellt hast, und eine Prüfung\nvon außen sagt dir, was ein Fremder bekommt.",[10,280,281,283,284,287,288,290],{},[34,282,130],{}," zeigt, welche Buckets öffentlich sind. Frag dich bei jedem\nöffentlichen, ob jede Datei darin etwas ist, das du einem Fremden zeigen\nwürdest. ",[34,285,286],{},"Storage → Policies"," zeigt die Regeln. Eine ",[24,289,260],{},"-Regel, deren\neinzige Bedingung der Bucket-Name ist, lässt jeden diesen Bucket lesen, seine\nDateiliste eingeschlossen.",[10,292,293,294,298],{},"Unser kostenloser Scan fragt dein Live-Projekt nach der Dateiliste jedes\nBuckets, nur mit dem Schlüssel, der ohnehin im Code deiner App steht, so wie es\nein Fremder tun würde, und sagt dir, welche Buckets mit Namen geantwortet haben.\nEr liest Namen und lädt nie eine Datei herunter. Er dauert etwa 20 Sekunden und\nbraucht kein Konto: ",[186,295,297],{"href":296},"\u002Fsecurity-scanner","scanne deine App",".",[39,300,302],{"id":301},"wie-deine-dateien-dort-bleiben-wo-du-sie-abgelegt-hast","Wie deine Dateien dort bleiben, wo du sie abgelegt hast",[10,304,305],{},"Nach der heutigen Korrektur können sich noch zwei Dinge bewegen: Jemand legt\neine Einstellung um, während er einem anderen Fehler nachgeht, und eine Datei,\ndie jemand gebraucht hat, wird gelöscht.",[10,307,308],{},[34,309,310,314],{},[186,311,313],{"href":312},"\u002Fwebsite-monitoring","Reeve Monitor"," prüft weiter von außen:",[50,316,317,320,323,330],{},[53,318,319],{},"die vollständige Sicherheitsprüfung, erneut nach Zeitplan, die Prüfung der Bucket-Auflistung eingeschlossen",[53,321,322],{},"ob deine App erreichbar ist",[53,324,325,326,329],{},"eine Nachricht, wenn sich ein Ergebnis ",[34,327,328],{},"ändert",", damit ein Bucket, der über Nacht aufgegangen ist, nicht wartet, bis du hinschaust",[53,331,332],{},"ein monatlicher Bericht in einfacher Sprache über das, was er gesehen hat",[10,334,335],{},[34,336,337,341],{},[186,338,340],{"href":339},"\u002Fsupabase-backups","Reeve Care"," hält eine Kopie von dem, was drinliegt:",[50,343,344,347,350,353,356],{},[53,345,346],{},"eine verschlüsselte Kopie deiner Supabase-Datenbank nach Zeitplan, auf Reeves eigenem Speicher in der EU, außerhalb deines Supabase-Kontos",[53,348,349],{},"jede Kopie geprüft, bevor sie zählt, durch Zählen der Zeilen in jeder Tabelle",[53,351,352],{},"auch deine hochgeladenen Dateien, sobald du einen Storage-Zugang verbindest",[53,354,355],{},"eine Wiederherstellung per Klick, mit einer Sicherheitskopie des aktuellen Stands vorab",[53,357,358],{},"alles, was Monitor tut",[39,360,362],{"id":361},"was-heute-zu-tun-ist","Was heute zu tun ist",[364,365,366],"key-takeaways",{},[50,367,368,374,377,380,383],{},[53,369,370,371,373],{},"Öffne den gescheiterten Link in einem eigenen Tab. Enthält die Adresse ",[24,372,126],{}," und ist der Bucket privat, ist es die erste Ursache.",[53,375,376],{},"Kopier den Namen des Buckets aus Storage → Buckets und vergleich ihn, Großbuchstaben eingeschlossen, mit dem Namen, den deine App benutzt.",[53,378,379],{},"Vergleich die Projektreferenz in der Supabase-Adresse deiner App mit der in der Adresse deines Dashboards.",[53,381,382],{},"Lass einen Bucket privat, außer jede Datei darin ist für jeden gedacht, der ihre Adresse hat, und liefere private Dateien über signierte Links aus.",[53,384,385,386,261,388,390],{},"Lies jede ",[24,387,260],{},[24,389,232],{},". Eine, die nur den Bucket nennt, gibt auch die Dateiliste heraus.",[10,392,393,394,398,399,403],{},"Fang mit der Anfrage an, die gescheitert ist, denn die Tür, durch die sie kam,\nsagt dir, welche der drei Ursachen du prüfen musst. Die\n",[186,395,397],{"href":396},"\u002Fchecklist","10-Minuten-Sicherheitscheckliste"," deckt ab, was eine frisch\ngestartete App sonst gern offen lässt, und\n",[186,400,402],{"href":401},"\u002Fblog\u002Fsupabase-storage-bucket-public","was ein öffentlicher Bucket preisgibt","\nist die nächste Lektüre, falls sich einer deiner Buckets als öffentlich\nherausgestellt hat.",{"title":26,"searchDepth":405,"depth":405,"links":406},3,[407,409,410,411,412,413,414,415,416],{"id":41,"depth":408,"text":42},2,{"id":102,"depth":408,"text":103},{"id":143,"depth":408,"text":144},{"id":177,"depth":408,"text":178},{"id":216,"depth":408,"text":217},{"id":240,"depth":408,"text":241},{"id":274,"depth":408,"text":275},{"id":301,"depth":408,"text":302},{"id":361,"depth":408,"text":362},"Sicherheitsgrundlagen","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcover-1200x630.png","Ein Regal mit Buckets, einer mit Schloss. Davor ein bernsteinfarbenes Adressschild, dessen gestrichelte Linie vor einer Sperre endet.","Supabase \"Bucket not found\" ist eins von drei Dingen: ein öffentlicher Link zu einem privaten Bucket, ein ungenauer Name oder das falsche Projekt.",false,"md",[424,427,430,433,436],{"q":425,"a":426},"Warum sagt Supabase, mein Bucket wird nicht gefunden, obwohl ich ihn sehe?","Weil Storage je nach Anfrage auf unterschiedliche Weise nach einem Bucket sucht. Eine öffentliche Dateiadresse, wie getPublicUrl sie baut, wird nur unter öffentlichen Buckets gesucht, also gilt ein privater Bucket, den du im Dashboard siehst, dort als nicht gefunden. Kam der Fehler dagegen von einem Upload, dann passt der Name in deinem Code zu keinem Bucket in dem Projekt, mit dem deine App verbunden ist.",{"q":428,"a":429},"Unterscheidet Supabase bei Bucket-Namen zwischen Groß- und Kleinschreibung?","Ja. Storage vergleicht den Namen Zeichen für Zeichen, also sind Avatars und avatars zwei verschiedene Buckets, und avatar und avatars ebenso. Kopier den Namen aus Storage → Buckets in deinem Dashboard und vergleich ihn mit dem Namen, den deine App benutzt.",{"q":431,"a":432},"Soll ich meinen Bucket öffentlich machen, um \"Bucket not found\" zu beheben?","Nur wenn jede Datei darin für jeden gedacht ist, der ihre Adresse hat, etwa Profilbilder oder Produktfotos. Öffentlich heißt, dass jeder mit der Adresse einer Datei diese Datei ohne Anmeldung öffnen kann. Den Fehler behebt das nur, wenn ein öffentlicher Link für einen privaten Bucket gebaut wurde; ein falscher Name oder ein falsches Projekt bleibt so oder so kaputt. Für Dateien, die einer Person gehören, lass den Bucket privat und nimm einen signierten Link.",{"q":434,"a":435},"Wie zeige ich eine Datei aus einem privaten Bucket an?","Mit einem signierten Link. createSignedUrl baut eine Adresse, die für eine Anzahl Sekunden funktioniert, die du festlegst, und danach nicht mehr, und sie tritt überall an die Stelle von getPublicUrl, wo eine Seite die Datei zeigt. Wer den Link anfordert, muss die Datei lesen dürfen, also braucht der Bucket eine select-Regel auf storage.objects, die festlegt, wer was lesen darf.",{"q":437,"a":438},"Warum sagt der Fehler 404, wenn die Anfrage mit 400 gescheitert ist?","Supabase Storage schickt diesen Fehler mit dem HTTP-Status 400 und legt seinen eigenen Status, 404, als statusCode in den Body. In supabase-js kommt das als error.status 400 und error.statusCode \"404\" an, und deshalb lässt Code, der auf eine 404 wartet, diesen Fehler einfach durch.","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",[441,442,443,444,445,446,447],"supabase bucket not found","supabase storage bucket not found","bucket not found getpublicurl","supabase öffentliche url bucket not found","supabase upload bucket not found","supabase storage 404","supabase signierte url privater bucket",{},true,"\u002Fblog\u002Fsupabase-bucket-not-found","2026-10-17",{"title":5,"description":420},"blog\u002Fsupabase-bucket-not-found",[455,456,457,458],"Supabase \"Bucket not found\" heißt, dass Storage nach einem Bucket mit genau diesem Namen gesucht hat, in dem Projekt, das deine Anfrage erreicht hat, und keinen gefunden hat, den es dieser Anfrage ausliefern würde. Der Bucket kann trotzdem in deinem Dashboard stehen.","Ein Link, den getPublicUrl für einen privaten Bucket gebaut hat, liefert beim Öffnen genau diesen Fehler, weil Storage solche Links nur aus öffentlichen Buckets bedient.","Bei einem Upload heißt es, dass der Name in diesem Projekt fehlt. Prüf die Schreibweise und die Großbuchstaben, dann, auf welches Projekt deine App zeigt.","Den Bucket öffentlich zu machen beendet die Meldung und lässt jeden, der die Adresse einer Datei hat, diese Datei öffnen. Für Dateien, die einer Person gehören, nimm einen signierten Link.","C7eOA92tq1EwPS2M7b4WCeCi1Y4_d90UX14BzwzmlIc",[461,467,473,479,485,491,497,503,509,515,521,528,534,540,546,552,558,564,570,576,582,588,594,600,601,607,613,619,625,631,636,642,648,654,660,666,672,678,684,690,696,702,708,714,720,726,731,737,743,749,755,761,767,773,779,785,791,797,803,809,815,821,827,833,839,845,851,857,863,869,875,881,887,893,899,905,911,917,923,929,934,940,946,952,957,963,969,975,980,986],{"path":462,"title":463,"description":464,"published":465,"category":417,"image":466,"draft":421},"\u002Fblog\u002Fmax-client-connections-reached","Supabase \"max client connections reached\" erklärt","Supabase \"max client connections reached\": Der Pooler hat keinen Platz für noch einen Client. Der Port in deinem Connection String setzt das Limit.","2026-11-09","\u002Fblog\u002Fmax-client-connections-reached\u002Fcard-800x500.png",{"path":468,"title":469,"description":470,"published":471,"category":417,"image":472,"draft":421},"\u002Fblog\u002Funsupported-provider-provider-is-not-enabled","Supabase-Fehler: \"Unsupported provider: provider is not enabled\"","\"Unsupported provider: provider is not enabled\" heißt: Google-Login ist in deinem Supabase-Projekt aus. Die Lösung, und was bei redirect_uri_mismatch hilft.","2026-11-08","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcard-800x500.png",{"path":474,"title":475,"description":476,"published":477,"category":417,"image":478,"draft":421},"\u002Fblog\u002Fviolates-foreign-key-constraint","Supabase-Fehler \"violates foreign key constraint\" beim Einfügen","Supabase \"insert or update on table violates foreign key constraint\": Deine Zeile zeigt auf eine, die es nicht gibt. Welche, warum, und die Lösung.","2026-11-07","\u002Fblog\u002Fviolates-foreign-key-constraint\u002Fcard-800x500.png",{"path":480,"title":481,"description":482,"published":483,"category":417,"image":484,"draft":421},"\u002Fblog\u002Fnull-value-violates-not-null-constraint","Supabase-Fehler \"null value in column violates not-null constraint\"","Supabase \"null value in column violates not-null constraint\": Eine Pflichtspalte kam leer an. Woher die Null kommt, und die Lösung.","2026-11-06","\u002Fblog\u002Fnull-value-violates-not-null-constraint\u002Fcard-800x500.png",{"path":486,"title":487,"description":488,"published":489,"category":417,"image":490,"draft":421},"\u002Fblog\u002Fauth-session-missing","Supabase \"Auth session missing!\": wo die Sitzung geblieben ist","\"Auth session missing!\" heißt: supabase-js fand keine angemeldete Sitzung und fragte Supabase gar nicht erst. Wo die Sitzung blieb, und die Lösung je Fall.","2026-11-05","\u002Fblog\u002Fauth-session-missing\u002Fcard-800x500.png",{"path":492,"title":493,"description":494,"published":495,"category":417,"image":496,"draft":421},"\u002Fblog\u002Finvalid-claim-missing-sub-claim","Supabase \"invalid claim: missing sub claim\": niemand ist angemeldet","\"invalid claim: missing sub claim\" heißt: Supabase Auth bekam ein echtes Token ohne Nutzer darin, deinen Projektschlüssel statt einer Sitzung.","2026-11-04","\u002Fblog\u002Finvalid-claim-missing-sub-claim\u002Fcard-800x500.png",{"path":498,"title":499,"description":500,"published":501,"category":417,"image":502,"draft":421},"\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function","\"Failed to send a request to the Edge Function\": der echte Grund","\"Failed to send a request to the Edge Function\" heißt: Der Browser hat keine lesbare Antwort bekommen. Seine Konsole sagt, warum, und ob deine Funktion lief.","2026-11-03","\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function\u002Fcard-800x500.png",{"path":504,"title":505,"description":506,"published":507,"category":417,"image":508,"draft":421},"\u002Fblog\u002Fsupabase-auth-redirects-to-localhost","Warum Supabase-E-Mail-Links auf localhost:3000 weiterleiten","Leitet Supabase auf localhost:3000 um, ist die Site URL unverändert, oder deine Adresse fehlt in Redirect URLs. Die Lösung und der Platzhalter, den du meidest.","2026-11-02","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcard-800x500.png",{"path":510,"title":511,"description":512,"published":513,"category":417,"image":514,"draft":421},"\u002Fblog\u002Femail-link-is-invalid-or-has-expired","Supabase \"Email link is invalid or has expired\" bei einem neuen Link","Bei einem Link von vor einer Minute heißt Supabases \"Email link is invalid or has expired\" meist: Ein Mailfilter hat ihn zuerst benutzt. Prüfen und beheben.","2026-11-01","\u002Fblog\u002Femail-link-is-invalid-or-has-expired\u002Fcard-800x500.png",{"path":516,"title":517,"description":518,"published":519,"category":417,"image":520,"draft":421},"\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout","Supabase \"canceling statement due to statement timeout\" erklärt","Supabase \"canceling statement due to statement timeout\": Eine Abfrage lief länger als ihre Rolle darf, 3 Sekunden für Besucher. Prüf zuerst die RLS-Regel.","2026-10-31","\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout\u002Fcard-800x500.png",{"path":522,"title":523,"description":524,"published":525,"category":526,"image":527,"draft":421},"\u002Fblog\u002Fdatabase-error-deleting-user","\"Database error deleting user\" in Supabase und was mitgelöscht wird","\"Database error deleting user\" in Supabase heißt: Deine Datenbank hat das Löschen abgelehnt. Der Grund steht im Log, die Lösung entscheidet, was mitgeht.","2026-10-30","Backups","\u002Fblog\u002Fdatabase-error-deleting-user\u002Fcard-800x500.png",{"path":529,"title":530,"description":531,"published":532,"category":417,"image":533,"draft":421},"\u002Fblog\u002Fstripe-webhook-no-signatures-found","\"No signatures found matching the expected signature\" bei Supabase","Ein Stripe-Webhook in einer Supabase Edge Function meldet \"No signatures found matching the expected signature\"? Zwei Ursachen. Prüfe weiter.","2026-10-29","\u002Fblog\u002Fstripe-webhook-no-signatures-found\u002Fcard-800x500.png",{"path":535,"title":536,"description":537,"published":538,"category":417,"image":539,"draft":421},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" in Supabase: die drei Ursachen","Supabase sagt \"Invalid login credentials\" bei falschem Passwort, unbekannter E-Mail und Google-Konto. So erkennst du, welcher Fall es ist.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":541,"title":542,"description":543,"published":544,"category":417,"image":545,"draft":421},"\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code","\"Edge Function returned a non-2xx status code\": der echte Fehler","\"Edge Function returned a non-2xx status code\" heißt: Deine Supabase-Funktion hat mit einem Fehler geantwortet. So liest du den echten.","2026-10-27","\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code\u002Fcard-800x500.png",{"path":547,"title":548,"description":549,"published":550,"category":417,"image":551,"draft":421},"\u002Fblog\u002Fcertificate-not-trusted","Zertifikat nicht vertrauenswürdig: drei Ursachen außer Ablauf","Zertifikat nicht vertrauenswürdig, obwohl das Datum stimmt? Es nennt eine andere Adresse, hat sich selbst signiert oder seiner Kette fehlt ein Glied.","2026-10-26","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",{"path":553,"title":554,"description":555,"published":556,"category":417,"image":557,"draft":421},"\u002Fblog\u002Finvalid-input-syntax-for-type-uuid","Supabase \"invalid input syntax for type uuid\": was im Zitat steht","Supabase \"invalid input syntax for type uuid\" heißt: Deine App hat etwas geschickt, das keine ID ist. Zitat lesen, Abfrage zurückhalten, Spalte behalten.","2026-10-25","\u002Fblog\u002Finvalid-input-syntax-for-type-uuid\u002Fcard-800x500.png",{"path":559,"title":560,"description":561,"published":562,"category":417,"image":563,"draft":421},"\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint","Supabase \"duplicate key value violates unique constraint\" erklärt","Supabase \"duplicate key value violates unique constraint\" heißt: Der Wert ist schon vergeben. Spalte finden, Lösung wählen, Wert vom Bildschirm fernhalten.","2026-10-24","\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint\u002Fcard-800x500.png",{"path":565,"title":566,"description":567,"published":568,"category":417,"image":569,"draft":421},"\u002Fblog\u002Fsupabase-relation-does-not-exist","Supabase \"relation does not exist\", obwohl die Tabelle da ist","Supabase \"relation does not exist\" oder PGRST205: Keine Tabelle passt zu Name und Schema deiner Abfrage. Vier Prüfungen, und was eine Freigabe öffnet.","2026-10-23","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcard-800x500.png",{"path":571,"title":572,"description":573,"published":574,"category":417,"image":575,"draft":421},"\u002Fblog\u002Fsupabase-function-not-found","Supabase PGRST202: \"Could not find the function in the schema cache\"","Supabase \"Could not find the function in the schema cache\" nennt die Argumente, die deine App geschickt hat. Vergleich sie mit der Funktion.","2026-10-22","\u002Fblog\u002Fsupabase-function-not-found\u002Fcard-800x500.png",{"path":577,"title":578,"description":579,"published":580,"category":417,"image":581,"draft":421},"\u002Fblog\u002Fsupabase-schema-cache-column-error","Supabase PGRST204: \"Could not find the column in the schema cache\"","Supabase \"Could not find the column in the schema cache\" heißt meist: Der Name passt nicht. Vier Prüfungen und der Einzeiler zum Neuladen.","2026-10-21","\u002Fblog\u002Fsupabase-schema-cache-column-error\u002Fcard-800x500.png",{"path":583,"title":584,"description":585,"published":586,"category":417,"image":587,"draft":421},"\u002Fblog\u002Fsupabase-email-rate-limit-exceeded","Supabase \"Email Rate Limit Exceeded\": zwei Limits, ein Fehlercode","Supabase \"Email Rate Limit Exceeded\" begrenzt jede E-Mail deines Projekts: 2 pro Stunde beim eingebauten Absender. Was zählt und wie du es anhebst.","2026-10-20","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcard-800x500.png",{"path":589,"title":590,"description":591,"published":592,"category":417,"image":593,"draft":421},"\u002Fblog\u002Fsupabase-users-logged-out","Supabase \"Invalid Refresh Token: Refresh Token Not Found\": 3 Ursachen","Supabase \"Invalid Refresh Token: Refresh Token Not Found\" meldet deine Nutzer ab. Drei Ursachen, und wie das Auth-Log sie trennt.","2026-10-19","\u002Fblog\u002Fsupabase-users-logged-out\u002Fcard-800x500.png",{"path":595,"title":596,"description":597,"published":598,"category":417,"image":599,"draft":421},"\u002Fblog\u002Fpermission-denied-for-schema-public","Supabase \"permission denied for schema public\": drei Ursachen","Supabase \"permission denied for schema public\" heißt: Ein Grant auf das Schema fehlt. Was ihn entfernt hat und welche Zeile ihn zurückbringt.","2026-10-18","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcard-800x500.png",{"path":450,"title":5,"description":420,"published":451,"category":417,"image":439,"draft":421},{"path":602,"title":603,"description":604,"published":605,"category":417,"image":606,"draft":421},"\u002Fblog\u002Fsupabase-invalid-jwt","Supabase invalid JWT: Welcher Schlüssel streikt hier?","Ein Supabase invalid JWT ist PGRST301: ein signiertes Token hat die Prüfung nicht bestanden. In neueren Projekten ist das die Sitzung, nicht der API-Schlüssel.","2026-10-16","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",{"path":608,"title":609,"description":610,"published":611,"category":417,"image":612,"draft":421},"\u002Fblog\u002Fsupabase-single-row-error","Supabase \"multiple (or no) rows returned\" heißt meist: keine Zeilen","Supabase gibt PGRST116 zurück, \"JSON object requested, multiple (or no) rows returned\", wenn die Abfrage nichts fand. Versteckte Zeilen wirken fehlend.","2026-10-15","\u002Fblog\u002Fsupabase-single-row-error\u002Fcard-800x500.png",{"path":614,"title":615,"description":616,"published":617,"category":417,"image":618,"draft":421},"\u002Fblog\u002Fdatabase-error-saving-new-user","\"Database error saving new user\" in Supabase: wo du nachsiehst","\"Database error saving new user\" heißt: etwas an deiner Supabase-Registrierung ist fehlgeschlagen. Der echte Fehler steht in deinen Logs.","2026-10-14","\u002Fblog\u002Fdatabase-error-saving-new-user\u002Fcard-800x500.png",{"path":620,"title":621,"description":622,"published":623,"category":417,"image":624,"draft":421},"\u002Fblog\u002Fwhat-is-supabase","Was ist Supabase? Die Datenbank, die dein Builder ausgesucht hat","Was ist Supabase: die Datenbank, der Login und der Dateispeicher hinter deiner App. Supabase betreibt die Server, die Regeln zu deinen Zeilen gehören dir.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":626,"title":627,"description":628,"published":629,"category":417,"image":630,"draft":421},"\u002Fblog\u002Faws-access-key-exposed-in-frontend","Ein offengelegter AWS-Schlüssel im Frontend ist kein OpenAI-Key","Ein im Frontend offengelegter AWS-Zugriffsschlüssel liest und schreibt deinen Speicher. Die Lösung ist meist eine presigned URL, kein neuer Schlüssel.","2026-10-12","\u002Fblog\u002Faws-access-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":188,"title":632,"description":633,"published":634,"category":417,"image":635,"draft":421},"\"Row-level security policy for table objects\" beim Upload","\"New row violates row-level security policy for table objects\" heißt: Deinem Upload fehlt eine insert-Regel. Ein öffentlicher Bucket fügt keine hinzu.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":637,"title":638,"description":639,"published":640,"category":417,"image":641,"draft":421},"\u002Fblog\u002Fbase44-security-scan","Base44 Security Scan: das, was nur er sehen kann","Der Base44 Security Scan prüft sieben Arten von Problemen von innen. Hier ist die Hälfte, die er liest und sonst niemand, und die Hälfte, die er nie ansieht.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":643,"title":644,"description":645,"published":646,"category":417,"image":647,"draft":421},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Dein API-Key wurde geleakt. Die richtige Reihenfolge","Ein API-Key wurde geleakt und du weißt nicht, was zuerst zu tun ist. Nicht jeder Key im Frontend ist ein Leck, und die Reihenfolge zählt mehr als das Tempo.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":649,"title":650,"description":651,"published":652,"category":417,"image":653,"draft":421},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" ohne RLS abzuschalten","\"Infinite recursion detected in policy for relation\" heißt: Deine Policy hat die Tabelle gefragt, die sie schützt. So brichst du den Kreis.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":655,"title":656,"description":657,"published":658,"category":417,"image":659,"draft":421},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" in Supabase, und die falsche Lösung","\"No API key found in request\" heißt, deine Supabase-Anfrage kam ohne Schlüssel an. Die meisten Antworten zeigen stattdessen auf deine Datenbankregeln.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":661,"title":662,"description":663,"published":664,"category":417,"image":665,"draft":421},"\u002Fblog\u002Fis-base44-safe","Ist Base44 sicher? Was 5.442 echte Base44-Apps zeigten","Ist Base44 sicher? Wir haben 5.442 laufende Base44-Apps mit neun Checks geprüft. Fast alle bekamen ein B, aus Gründen, die der Inhaber nie gewählt hat.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":667,"title":668,"description":669,"published":670,"category":417,"image":671,"draft":421},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","API-Schlüssel verstecken: ab in eine Supabase Edge Function","Einen API-Schlüssel verstecken heißt, ihn aus dem Browser zu nehmen. Eine Supabase Edge Function ist der kleinste Ort dafür, und zwei Schritte zählen mehr.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":673,"title":674,"description":675,"published":676,"category":417,"image":677,"draft":421},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Ist deine .env-Datei öffentlich? Zwölf Pfade zum Prüfen","Ist deine .env-Datei auf deinem eigenen Webserver öffentlich? Zwölf Adressen sagen es dir, und ein Treffer heißt: alles darin ist längst öffentlich.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":679,"title":680,"description":681,"published":682,"category":417,"image":683,"draft":421},"\u002Fblog\u002Fis-v0-safe","v0-Sicherheit: alle 1.790 gescannten v0-Apps bekamen ein A","v0-Sicherheit, gemessen an 1.790 laufenden v0-Apps: Jede bekam ein A. Nur 17 nannten eine Datenbank, und genau das misst das A vor allem.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":685,"title":686,"description":687,"published":688,"category":417,"image":689,"draft":421},"\u002Fblog\u002Fis-bolt-safe","Ist Bolt sicher? Was 1.123 echte Bolt-Apps zeigten","Ist Bolt sicher? Wir haben 1.123 laufende Bolt-Apps mit neun Checks geprüft. Das Hosting war sauber. Die Funde waren Schlüssel und offene Tabellen in den Apps.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":691,"title":692,"description":693,"published":694,"category":417,"image":695,"draft":421},"\u002Fblog\u002Fis-supabase-down-or-your-app","Ist Supabase down oder liegt es an deiner App? So erkennst du es","Ist Supabase down oder liegt es an deiner App? Ein pausiertes Projekt, eine volle Datenbank und ein eigener Fehler sehen gleich aus. Vier Prüfungen helfen.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":697,"title":698,"description":699,"published":700,"category":417,"image":701,"draft":421},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Verschlüsselt Supabase meine Daten? Ja. Wovor das schützt","Verschlüsselt Supabase Daten? Ja: AES-256 im Ruhezustand, TLS bei der Übertragung, SOC 2 und ISO 27001. Was jedes abdeckt und welches Leck keines stoppt.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":703,"title":704,"description":705,"published":706,"category":417,"image":707,"draft":421},"\u002Fblog\u002Fsupabase-free-plan-limits","Supabase Gratis-Tarif: die Limits und was an jedem passiert","Die Limits des Supabase-Gratis-Tarifs: 500 MB Datenbank, 5 GB Egress und keine Backups. Was an jeder Grenze passiert und was $25 für Pro ändern.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":709,"title":710,"description":711,"published":712,"category":526,"image":713,"draft":421},"\u002Fblog\u002Ftest-your-supabase-backup","Teste dein Supabase-Backup, bevor du es brauchst","So testest du dein Supabase-Backup: in ein Übungsprojekt einspielen, Zeilen zählen, anmelden und die Zeile suchen, die einer abgeschnittenen Datei fehlt.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":715,"title":716,"description":717,"published":718,"category":526,"image":719,"draft":421},"\u002Fblog\u002Fsupabase-backup-github-action","Kostenloses Supabase-Backup per GitHub Action, mit Haken","Eine Supabase-Backup-GitHub-Action kostet nichts und passt für viele Apps. Der Workflow, der richtige Connection String und das Egress pro Lauf.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":721,"title":722,"description":723,"published":724,"category":526,"image":725,"draft":421},"\u002Fblog\u002Fdownload-your-supabase-backup","Warum du dein Supabase-Backup nicht herunterladen kannst","Dein Supabase-Backup kannst du auf aktuellen Projekten nicht herunterladen, weil die Tageskopie physisch ist. Wie du es prüfst und selbst eine Kopie hältst.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":727,"title":728,"description":729,"published":724,"category":417,"image":730,"draft":421},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": der fehlende Grant","Ab 30. Oktober antwortet eine neue Supabase-Tabelle mit \"permission denied for table\", bis du Zugriff erteilst. Der Grant aus der E-Mail ist die halbe Lösung.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":732,"title":733,"description":734,"published":735,"category":417,"image":736,"draft":421},"\u002Fblog\u002Fopen-api-endpoint-exposed","Ist ein offener API-Endpunkt ein Sicherheitsproblem? Sieh ins JSON","Dein Scan hat einen offenen API-Endpunkt gemeldet. Ob das zählt, hängt davon ab, was zurückkam, und die meisten hier gehörten der Plattform.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":738,"title":739,"description":740,"published":741,"category":417,"image":742,"draft":421},"\u002Fblog\u002Flovable-security-scan","Lovable Security Scan: das Eine, was er nicht beweist","Lovable Security Scan: was Quick Scan und Deep Scan prüfen, wann welcher läuft, und das Eine, was kein Scan von innen beweisen kann.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":744,"title":745,"description":746,"published":747,"category":526,"image":748,"draft":421},"\u002Fblog\u002Fsupabase-backup-auth-users","Warum in deinem Supabase-Dump keine Nutzer stehen","Führe supabase db dump allein aus und du bekommst die Form deiner Datenbank und keine einzige Zeile, und das auth-Schema mit deinen Nutzern fehlt ganz.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":750,"title":751,"description":752,"published":753,"category":417,"image":754,"draft":421},"\u002Fblog\u002Fdomain-and-certificate-expiry","Domain abgelaufen, Website offline: was jetzt passiert","Deine Domain ist abgelaufen und deine Website ist offline. Welche Frist jetzt läuft, warum das Zertifikat das kleinere Problem ist, und wie du beides prüfst.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":756,"title":757,"description":758,"published":759,"category":417,"image":760,"draft":421},"\u002Fblog\u002Fis-lovable-safe","Ist Lovable sicher? Was 18.554 echte Lovable-Apps zeigten","Ist Lovable sicher? Wir haben 18.554 laufende Lovable-Apps mit neun Checks geprüft. Die Plattform war die sauberste von fünf. Die Funde saßen in den Apps.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":762,"title":763,"description":764,"published":765,"category":417,"image":766,"draft":421},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Die Sicherheits-Checkliste für Vibe-Coding, in neun Prüfungen","Eine Sicherheits-Checkliste für Vibe-Coding mit neun Punkten, die jeder von außen an deiner Live-App nachprüfen kann, jeder mit einem Test in einer Zeile.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":768,"title":769,"description":770,"published":771,"category":417,"image":772,"draft":421},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Ein geheimer Stripe-Schlüssel im Frontend kann Geld bewegen","Ein geheimer Stripe-Schlüssel im Frontend kann erstatten, abbuchen und jeden Kundendatensatz lesen, den du hast. Dein pk_live_-Schlüssel gehört dorthin.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":774,"title":775,"description":776,"published":777,"category":417,"image":778,"draft":421},"\u002Fblog\u002Fvite-and-next-public-env-vars","Vite-Env-Variablen offengelegt: der Präfix heißt veröffentlichen","Vite-Env-Variablen offengelegt: Deine App hat getan, was der Präfix verlangt. VITE_ und NEXT_PUBLIC_ heißen veröffentlichen, und die KI kannte den Preis nie.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":780,"title":781,"description":782,"published":783,"category":417,"image":784,"draft":421},"\u002Fblog\u002Fbase44-source-maps","Base44-Sicherheit: was ein Scan meldet und was du ändern kannst","Base44-Sicherheit auf 5.438 gescannten Apps: Drei Befunde auf fast jeder gehören der Plattform, die Source Map ist das Base44-Badge, und deine Liste ist kurz.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":786,"title":787,"description":788,"published":789,"category":417,"image":790,"draft":421},"\u002Fblog\u002Fis-cursor-ai-safe","Ist Cursor AI sicher? Editor, Code und die App, die du veröffentlichst","Ist Cursor AI sicher? Drei Fragen in einer Suche: was Cursor behält, was sein Code falsch macht und ob deine veröffentlichte App offen steht.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":792,"title":793,"description":794,"published":795,"category":417,"image":796,"draft":421},"\u002Fblog\u002Fis-replit-safe","Ist Replit sicher? Was wir in 3.042 Replit-Apps gefunden haben","Ist Replit sicher? Wir haben 3.042 laufende Replit-Apps mit neun externen Checks geprüft. Die Funde saßen in der veröffentlichten App, nicht im Hosting.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":798,"title":799,"description":800,"published":801,"category":526,"image":802,"draft":421},"\u002Fblog\u002Fsupabase-storage-backup","Supabase Storage Backup: deine Datenbankkopie hat keine Dateien","Ein Supabase Storage Backup ist eine eigene Aufgabe. Datenbank-Backups enthalten die Liste deiner Dateien und keine davon, also bleibt jeder Upload kaputt.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":804,"title":805,"description":806,"published":807,"category":526,"image":808,"draft":421},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Supabase Point-in-Time Recovery: Kosten und Grenzen","Supabase Point-in-Time Recovery spult deine Datenbank auf jede Sekunde der letzten Woche zurück. $100 im Monat zusätzlich zu Pro, und nur die Datenbank.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":810,"title":811,"description":812,"published":813,"category":526,"image":814,"draft":421},"\u002Fblog\u002Fsupabase-project-paused-recover","Supabase-Projekt pausiert? Deine Daten sind noch da","Supabase hat dein Projekt nach einer Woche ohne Aktivität pausiert. Gelöscht ist nichts, Wiederherstellen steht neben dem Namen, und du hast ein Jahr.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":816,"title":817,"description":818,"published":819,"category":417,"image":820,"draft":421},"\u002Fblog\u002Fsafest-ai-app-builder","Welcher KI-App-Builder ist am sichersten? 30.998 Apps im Test","Welcher KI-App-Builder ist am sichersten? Wir haben 30.998 aktive Apps von Lovable, Base44, Replit, v0 und Bolt gescannt. Der Builder entscheidet das nicht.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":822,"title":823,"description":824,"published":825,"category":417,"image":826,"draft":421},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Row Level Security für jede Supabase-Tabelle aktivieren und prüfen","Row Level Security in Supabase ohne Policy sperrt eine Tabelle komplett. Eine Policy ohne den Schalter bringt gar nichts. Hier ist das SQL, und der Test.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":828,"title":829,"description":830,"published":831,"category":417,"image":832,"draft":421},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": was die Warnung übersieht","Supabase meldet \"RLS disabled in public\" als Fehler. Zur Lese-Policy, die deine Tabelle genauso offen lässt, sagt der Advisor gar nichts.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":834,"title":835,"description":836,"published":837,"category":417,"image":838,"draft":421},"\u002Fblog\u002Frotate-supabase-service-role-key","Geleakten Supabase-service_role-Schlüssel richtig tauschen","Supabase sagt: erst das Leck schließen. Andere Anleitungen: sofort tauschen. Was richtig ist, hängt davon ab, wohin dein service_role-Schlüssel gelangt ist.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":840,"title":841,"description":842,"published":843,"category":417,"image":844,"draft":421},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Vibe-Coding-Security-Scanner im Vergleich, unserer eingeschlossen","Der beste Vibe-Coding-Security-Scanner hängt an drei Fragen, die keine Funktionsliste beantwortet. Acht Tools im Vergleich, mit Preisen und unseren Lücken.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":846,"title":847,"description":848,"published":849,"category":417,"image":850,"draft":421},"\u002Fblog\u002Fsupabase-security-checker","Supabase Security Checker: die fünf Prüfungen selbst machen","Ein Supabase Security Checker liest deine veröffentlichte App statt deiner Projekteinstellungen. Hier sind die fünf Prüfungen und wie du jede selbst ausführst.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":852,"title":853,"description":854,"published":855,"category":417,"image":856,"draft":421},"\u002Fblog\u002Fvibe-coding-security-scanner","Vibe-Coding-Security-Scanner: was ein URL-Scan übersieht","Ein Vibe-Coding-Security-Scanner liest deine laufende App von außen. Was das abdeckt, die vier Dinge, die er nicht sehen kann, und wie du das Ergebnis liest.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":858,"title":859,"description":860,"published":861,"category":417,"image":862,"draft":421},"\u002Fblog\u002Fmissing-security-headers","Fehlende Sicherheitsheader: wann sie wirklich zählen","Fehlende Sicherheitsheader ist unser häufigster Befund. Wogegen sie schützen, und wann sie die unwichtigste Zeile in deinem Bericht sind.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":864,"title":865,"description":866,"published":867,"category":417,"image":868,"draft":421},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Dein OpenAI-API-Schlüssel liegt im Frontend. Tausch ihn aus.","Ein OpenAI-API-Schlüssel im Frontend lässt sich an keine Domain binden. Tausch ihn heute, leg den Aufruf hinter deinen Server und begrenze das Budget.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":870,"title":871,"description":872,"published":873,"category":417,"image":874,"draft":421},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","API-Schlüssel im Frontend: was 30.998 Apps wirklich ausliefern","Ein API-Schlüssel im Frontend ist meistens ein Google-Maps-Schlüssel. Wir haben 30.998 aktive Vibe-Coding-Apps gescannt und gezählt, was wirklich austritt.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":876,"title":877,"description":878,"published":879,"category":526,"image":880,"draft":421},"\u002Fblog\u002Fsupabase-backup-tools-compared","Supabase-Backup-Tools im Vergleich, unseres eingeschlossen","Vier Arten von Supabase-Backup-Tool, was jedes wirklich kopiert und wann eine kostenlose GitHub Action jeden Anbieter schlägt, uns eingeschlossen.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":882,"title":883,"description":884,"published":885,"category":417,"image":886,"draft":421},"\u002Fblog\u002Freplit-secrets-explained","Secrets in Replit nutzen, und was trotzdem veröffentlicht wird","Secrets in Replit nutzen: anlegen, auslesen und die zwei Gründe beheben, warum undefined zurückkommt. Dazu die Schlüssel, die das Werkzeug nicht schützt.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":888,"title":889,"description":890,"published":891,"category":526,"image":892,"draft":421},"\u002Fblog\u002Fback-up-supabase-free-tier","Supabase Gratis-Tarif: Backup ohne Terminal selbst machen","Im Supabase Gratis-Tarif gibt es keine Backups, die Kopie musst du selbst machen. Wie das im Dashboard geht und was der CSV-Weg auslässt.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":894,"title":895,"description":896,"published":897,"category":417,"image":898,"draft":421},"\u002Fblog\u002Fis-supabase-secure","Ist Supabase sicher? Ja. Dein Projekt ist eine eigene Frage","Ist Supabase sicher? Die Plattform ist auditiert, verschlüsselt und pentestet. Supabase schreibt selbst auf, wo das aufhört und deine Einstellungen anfangen.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":900,"title":901,"description":902,"published":903,"category":417,"image":904,"draft":421},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Wo du deine Supabase API-Keys findest: anon, service_role, URL","Projekt-URL, anon-Schlüssel und service_role-Schlüssel liegen auf einer Seite im Dashboard. Wo sie ist, und welcher der vier Werte in deine App gehört.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":906,"title":907,"description":908,"published":909,"category":417,"image":910,"draft":421},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy in Supabase: was jetzt?","\"New row violates row-level security policy\" heißt, Supabase hat einen Schreibvorgang abgelehnt. Die schnelle Lösung öffnet die Tabelle wieder für alle.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":912,"title":913,"description":914,"published":915,"category":417,"image":916,"draft":421},"\u002Fblog\u002Fcors-wildcard-security-risk","Ist eine CORS-Wildcard ein Sicherheitsrisiko? Meist nicht.","Ist eine CORS-Wildcard ein Sicherheitsrisiko? Meist ist sie die Voreinstellung deines Builders und gibt nichts preis, was dein Server nicht ohnehin herausgab.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":918,"title":919,"description":920,"published":921,"category":526,"image":922,"draft":421},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Supabase Branching ist kein Backup. Es geht nur vorwärts.","Warum Supabase Branching kein Backup ist: Ein Branch startet ohne deine Daten, und ein Merge bringt nur das Schema. Wofür es gut ist und was stattdessen hilft.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":924,"title":925,"description":926,"published":927,"category":526,"image":928,"draft":421},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Supabase-Backup wiederherstellen, und was danach kaputt ist","Wie du ein Supabase-Backup aus dem Dashboard oder aus einer Dump-Datei wiederherstellst, was ersetzt wird und warum die App danach kaputt sein kann.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":401,"title":930,"description":931,"published":932,"category":417,"image":933,"draft":421},"Dein Supabase-Storage-Bucket ist öffentlich. Ist das ein Problem?","Ein öffentlicher Supabase-Storage-Bucket heißt: Wer die URL einer Datei hat, kann sie öffnen. Er heißt nicht, dass jemand den Inhalt auflisten darf.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":935,"title":936,"description":937,"published":938,"category":417,"image":939,"draft":421},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Ist ein Google-API-Schlüssel im Frontend ein Problem?","Ein Google-API-Schlüssel im Frontend ist der Fund unseres Scanners Nummer eins, und meistens unbedenklich. Eine kostenlose Einstellung entscheidet darüber.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":941,"title":942,"description":943,"published":944,"category":526,"image":945,"draft":421},"\u002Fblog\u002Fai-agent-deleted-my-database","Ein KI-Agent hat meine Supabase-Daten gelöscht. Was hole ich zurück?","Ein KI-Agent hat Daten aus deiner Datenbank gelöscht. Was du zurückholst, stand schon vorher fest, und die nächsten Minuten entscheiden über den Rest.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":947,"title":948,"description":949,"published":950,"category":417,"image":951,"draft":421},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Kann jeder deine Supabase-Datenbank lesen? 3.680 Apps im Test","Kann jeder deine Supabase-Datenbank ohne Login lesen? Wir haben 30.998 aktive Apps aus KI-Buildern gescannt und gemessen, wie oft die Antwort ja lautet.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":953,"title":954,"description":955,"published":950,"category":417,"image":956,"draft":421},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source-Maps öffentlich: deine App veröffentlicht ihren Quellcode","Eine öffentliche Source-Map lässt jeden den Originalcode deiner App lesen, Kommentare inklusive. Der 30-Sekunden-Check, und was wirklich zählt.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":958,"title":959,"description":960,"published":961,"category":417,"image":962,"draft":421},"\u002Fblog\u002Fsupabase-new-api-keys","Supabase publishable key: ist er derselbe wie der anon key?","Supabase hat anon und service_role durch öffentliche und geheime Schlüssel ersetzt. Welcher gehört in deine App, und welcher nie?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":964,"title":965,"description":966,"published":967,"category":526,"image":968,"draft":421},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Sichert Supabase meine Datenbank? Das hängt von deinem Tarif ab.","Sichert Supabase deine Datenbank? Auf bezahlten Tarifen täglich, im Gratis-Tarif gar nicht. So findest du heraus, was du hast und was es nicht abdeckt.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":970,"title":971,"description":972,"published":973,"category":417,"image":974,"draft":421},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security ist an. Die Tabelle ist trotzdem offen.","Supabase Row Level Security anzuschalten schützt keine Tabelle. Erst deine Policies tun das, und die, die deine App repariert hat, lässt oft alle herein.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":976,"title":977,"description":978,"published":973,"category":526,"image":979,"draft":421},"\u002Fblog\u002Fversion-history-is-not-a-backup","Der Versionsverlauf ist kein Backup. Er holt keine Tabelle zurück.","Lovable und Bolt führen einen Versionsverlauf für deinen Code. Deine Datenbank ist ein eigener Dienst, und ein Rücksprung holt deine Daten nicht zurück.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":981,"title":982,"description":983,"published":984,"category":526,"image":985,"draft":421},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Drei Wege, eine Supabase-Datenbank zu sichern, und was fehlt","Das Dashboard, pg_dump und ein verwalteter Dienst. Was jeder Weg wirklich sichert, was er stillschweigend auslässt und welcher den Kontoverlust übersteht.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":987,"title":988,"description":989,"published":984,"category":417,"image":990,"draft":421},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Welche API-Schlüssel im Frontend sicher sind, und welche nicht","Dein Supabase-anon-Schlüssel darf öffentlich sein. Der service_role-Schlüssel nicht. Er ignoriert jede Regel, die du setzt. So erkennst du den Unterschied.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1794213638772]