[{"data":1,"prerenderedAt":1194},["ShallowReactive",2],{"blog-de-supabase-auth-redirects-to-localhost":3,"blog-index-de":664},{"id":4,"title":5,"body":6,"category":621,"cover":622,"coverAlt":623,"description":624,"draft":625,"extension":626,"faq":627,"image":643,"keywords":644,"meta":652,"navigation":653,"ogTitle":654,"path":655,"published":656,"seo":657,"stem":658,"tldr":659,"updated":656,"__hash__":663},"blog_de\u002Fblog\u002Fsupabase-auth-redirects-to-localhost.md","Warum Supabase-E-Mail-Links auf localhost:3000 weiterleiten",{"type":7,"value":8,"toc":609},"minimark",[9,13,24,31,38,46,51,54,73,79,95,99,102,132,154,166,172,180,184,187,218,222,225,238,241,245,256,281,299,320,340,409,415,419,422,429,442,445,448,484,489,492,499,503,506,515,529,538,558,562,597],[10,11,12],"p",{},"Ein neuer Nutzer registriert sich in deiner Live-App, öffnet die\nBestätigungs-E-Mail und drückt auf den Knopf. Sein Browser öffnet eine Seite\nmit \"This site can't be reached\" und \"localhost refused to connect\" (so in\neinem englischen Chrome), über einer Adresse, die so beginnt:",[14,15,20],"pre",{"className":16,"code":18,"language":19},[17],"language-text","http:\u002F\u002Flocalhost:3000\u002F#access_token=…&expires_at=…&expires_in=…&refresh_token=…&sb=&token_type=bearer&type=signup\n","text",[21,22,18],"code",{"__ignoreMap":23},"",[10,25,26,27,30],{},"Nutzt deine App den PKCE-Ablauf, endet sie stattdessen auf ",[21,28,29],{},"?code=…",". Du hast\ndie App mit Lovable, Bolt, v0, Cursor, Claude Code oder Replit gebaut, in der\nVorschau lief sie tadellos, und die Anmeldung mit Passwort funktioniert immer\nnoch.",[10,32,33,34,37],{},"Eine Weiterleitung von Supabase auf localhost heißt: Supabase Auth, der Teil\nvon Supabase, der Leute anmeldet, hat seine Arbeit erledigt und die Person dann\nzur Site URL deines Projekts geschickt, und die steht noch auf\n",[21,35,36],{},"http:\u002F\u002Flocalhost:3000",". Diese Adresse bedeutet \"dieser Computer\". Auf dem\nComputer deines Nutzers ist dort nichts. Die Lösung sind zwei Einstellungen auf\neiner Seite deines Supabase-Dashboards.",[10,39,40,41,45],{},"Hier liegt der Teil, den die schnellen Lösungen im Netz falsch machen: ",[42,43,44],"strong",{},"Der\nPlatzhalter, der diese Meldung mit einer Zeile verschwinden lässt, ist auch\nder, mit dem der Link eines Fremden deine Nutzer schon angemeldet auf seine\nSeite schickt."," Die Einstellungen unten bringen die Links zum Laufen und\nhalten diese Tür zu.",[47,48,50],"h2",{"id":49},"was-bedeutet-eine-weiterleitung-von-supabase-auf-localhost","Was bedeutet eine Weiterleitung von Supabase auf localhost?",[10,52,53],{},"Sie bedeutet, dass Supabase die Person zur Standardadresse deines Projekts\ngeschickt hat, weil es keine bessere angenommen hat.",[10,55,56,57,64,65,68,69,72],{},"Jede E-Mail, die Supabase für dich verschickt, ob Bestätigung der\nRegistrierung, Magic Link, Zurücksetzen des Passworts oder Einladung, verlinkt\nzuerst auf die eigene Adresse deines Projekts. Supabases\n",[58,59,63],"a",{"href":60,"rel":61},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Fauth-email-templates",[62],"nofollow","Anleitung zu den E-Mail-Vorlagen","\nzeigt die Form:\n",[21,66,67],{},"https:\u002F\u002Fproject-ref.supabase.co\u002Fauth\u002Fv1\u002Fverify?token=…&type=email&redirect_to=https:\u002F\u002Fexample.com\u002Fpath",".\nDort prüft Supabase das Token und schickt den Browser dann weiter zu dem, was\n",[21,70,71],{},"redirect_to"," nennt.",[10,74,75,76,78],{},"Stell es dir als Wegweiser an Supabases Tür vor. Jede Person, die einen Link\nöffnet, wird an der Tür angemeldet und dann, den Schlüssel in der Hand, einen\nder Arme entlang weitergeschickt. Die Arme stellst du auf. Die Site URL ist der\nArm, den alle nehmen, wenn kein anderer passt, und bei einem neuen Projekt zeigt\ner auf ",[21,77,36],{},": die Werkstatt, in der die App gebaut wurde, auf\njedem anderen Rechner ein leerer Raum.",[10,80,81,82,87,88,91,92,94],{},"Supabases\n",[58,83,86],{"href":84,"rel":85},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Fredirect-urls",[62],"Anleitung zu Weiterleitungen","\nsagt, dass die Site URL die Standard-Weiterleitung festlegt, wenn im Code kein\n",[21,89,90],{},"redirectTo"," angegeben ist. Sie fordert dich auf, sie von\n",[21,93,36],{}," auf deine Produktionsadresse zu ändern, und nennt die\nEinstellung entscheidend für E-Mail-Bestätigungen und das Zurücksetzen von\nPasswörtern.",[47,96,98],{"id":97},"warum-übergeht-supabase-die-adresse-die-meine-app-verlangt-hat","Warum übergeht Supabase die Adresse, die meine App verlangt hat?",[10,100,101],{},"Weil diese Adresse nicht auf deiner Liste Redirect URLs steht, und Supabase\nfällt zurück, ohne es dir zu sagen.",[10,103,104,105,108,109,112,113,116,117,108,119,112,122,125,126,131],{},"Deine App kann angeben, wo Leute landen sollen. In Supabases\nJavaScript-Bibliothek ist das ",[21,106,107],{},"emailRedirectTo"," bei ",[21,110,111],{},"signUp"," und\n",[21,114,115],{},"signInWithOtp"," und ",[21,118,90],{},[21,120,121],{},"resetPasswordForEmail",[21,123,124],{},"signInWithOAuth",". Supabase Auth entscheidet dann in\n",[58,127,130],{"href":128,"rel":129},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fauth\u002Fblob\u002Fmaster\u002Finternal\u002Futilities\u002Frequest.go",[62],"einer kurzen Funktion",",\nin dieser Reihenfolge:",[133,134,135,142,148],"ol",{},[136,137,138,141],"li",{},[42,139,140],{},"Die Adresse, die deine App verlangt hat",", wenn sie zu einem Eintrag auf\ndeiner Liste Redirect URLs passt oder auf derselben Domain wie deine Site\nURL liegt.",[136,143,144,147],{},[42,145,146],{},"Die Adresse der Seite, von der die Anfrage kam",", so wie der Browser sie\ngemeldet hat, nach derselben Regel.",[136,149,150,153],{},[42,151,152],{},"Sonst die Site URL."," Supabase meldet keinen Fehler, und die Konsole\ndeiner App zeigt nichts.",[10,155,156,157,162,163,165],{},"Diese Entscheidung fällt, wenn die E-Mail verschickt wird, und die gewählte\nAdresse kommt in den Link. Öffnet jemand den Link, prüft Supabase diese Adresse\nnoch einmal gegen deine Einstellungen, so wie sie in diesem Moment sind.\nSupabases eigene\n",[58,158,161],{"href":159,"rel":160},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Ftroubleshooting\u002Fwhy-am-i-being-redirected-to-the-wrong-url-when-using-auth-redirectto-option-_vqIeO",[62],"Antwort in der Fehlersuche","\nfasst die Regel in einem Satz: Damit die übergebene Option ",[21,164,90],{},"\nfunktioniert, muss genau diese URL in der Einstellung Redirect URLs stehen.",[167,168],"diagram",{"alt":169,"caption":170,"src":171},"Ein E-Mail-Link erreicht einen Wegweiser mit drei Armen. Die ersten beiden, für die Adresse, die die App verlangt hat, und für die Seite, von der die Anfrage kam, werden je gegen eine Liste geprüft und durchgestrichen. Der dritte Arm, die Site URL, führt die Person zu einem Laptop mit dunklem Bildschirm und einem roten Kreuz.","Supabase versucht die Adresse, die deine App verlangt hat, dann die Seite, von der die Anfrage kam. Steht keine davon auf deiner Liste, entscheidet die Site URL.","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fthree-tries-1600x760.png",[10,173,174,175,179],{},"Dieselbe Einstellung entscheidet, wohin \"Sign in with Google\" die Leute\nzurückschickt, ein Google-Knopf, der auf localhost landet, hat also dieselbe\nUrsache. Bleibt ein Google-Knopf schon früher stehen, auf einer Seite mit\n\"Unsupported provider: provider is not enabled\", geht es dagegen um\n",[58,176,178],{"href":177},"\u002Fblog\u002Funsupported-provider-provider-is-not-enabled","einen Schalter in Supabase und eine Liste bei Google",".",[47,181,183],{"id":182},"warum-du-es-vor-dem-start-nicht-gesehen-hast","Warum du es vor dem Start nicht gesehen hast",[10,185,186],{},"Weil die beiden Wege, auf denen du getestet hast, die Site URL nie erreichen.",[188,189,190,196,202],"ul",{},[136,191,192,195],{},[42,193,194],{},"Die Anmeldung mit Passwort meldet Leute innerhalb der Seite an."," Kein\nE-Mail-Link und kein Weg durch Supabases Tür, also wird der Wegweiser nie\ngelesen.",[136,197,198,201],{},[42,199,200],{},"Wenn du mit Cursor oder Claude Code baust und dein Entwicklungsserver auf\nPort 3000 lief",", als du die E-Mail getestet hast, hat der Link deine eigene\nlokale Kopie geöffnet und sah aus, als hätte er funktioniert.",[136,203,204,207,208,213,214,217],{},[42,205,206],{},"Im eingebauten Backend von Lovable triffst du vielleicht nie darauf.","\nLovables ",[58,209,212],{"href":210,"rel":211},"https:\u002F\u002Fdocs.lovable.dev\u002Ffeatures\u002Fauthentication",[62],"Dokumentation zur Anmeldung","\nsagt, dass es die Site URL beim Veröffentlichen auf deine Adresse unter\n",[21,215,216],{},"lovable.app"," setzt und eine eigene Domain zu den Redirect URLs hinzufügt,\nwenn du sie verbindest. Dieselbe Seite sagt, dass Apps mit deinem eigenen\nSupabase-Projekt keine automatischen Aktualisierungen bekommen.",[47,219,221],{"id":220},"ist-das-konto-bestätigt-obwohl-die-seite-nicht-geladen-hat","Ist das Konto bestätigt, obwohl die Seite nicht geladen hat?",[10,223,224],{},"Ja, bei einer Bestätigung der Registrierung. Supabase bestätigt zuerst und\nschickt den Browser erst danach weiter.",[10,226,227,228,233,234,179],{},"In\n",[58,229,232],{"href":230,"rel":231},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fauth\u002Fblob\u002Fmaster\u002Finternal\u002Fapi\u002Fverify.go",[62],"dem Code, der den Link verarbeitet",",\nwird das Konto bestätigt, bevor die Weiterleitung hinausgeht. Die Seite, die\nnicht lädt, kommt, wenn die Arbeit schon erledigt ist. Sag der Person also,\ndass sie sich auf deiner Live-Seite mit dem Passwort anmelden kann, das sie\ngewählt hat. Dieselbe E-Mail noch einmal zu drücken hilft nicht: Der Link\nfunktioniert einmal, und der zweite Druck antwortet mit\n",[58,235,237],{"href":236},"\u002Fblog\u002Femail-link-is-invalid-or-has-expired","\"Email link is invalid or has expired\"",[10,239,240],{},"Ein Magic Link oder ein Zurücksetzen des Passworts ist etwas anderes. Diese\nAnmeldung ging nach localhost und blieb dort, also braucht die Person eine neue\nE-Mail, sobald du die Einstellungen korrigiert hast.",[47,242,244],{"id":243},"so-behebst-du-die-weiterleitung-von-supabase-auf-localhost","So behebst du die Weiterleitung von Supabase auf localhost",[10,246,247,248,251,252,255],{},"Ändere die Site URL und trag dann die anderen Adressen ein, zu denen du Leute\nschickst. Beides steht auf der Seite ",[42,249,250],{},"URL Configuration"," unter\n",[42,253,254],{},"Authentication"," in deinem Supabase-Dashboard.",[10,257,258,265,268,269,271,272,276,277,280],{},[42,259,260,261,264],{},"Setz die Site URL auf deine Live-Adresse, mit ",[21,262,263],{},"https:\u002F\u002F"," davor.",[21,266,267],{},"https:\u002F\u002Fyourapp.com",", vollständig geschrieben. Fehlt das ",[21,270,263],{},", liest\nSupabase sie als Pfad auf seiner eigenen Adresse, und die Person landet\nstattdessen bei deinem Supabase-Projekt mit\n",[58,273,275],{"href":274},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\"",". Jede\nAdresse auf dieser Domain wird danach unter jedem Pfad ohne Listeneintrag\nangenommen, ",[21,278,279],{},"https:\u002F\u002Fyourapp.com\u002Fwelcome"," funktioniert also, sobald die Site\nURL stimmt.",[10,282,283,286,287,290,291,294,295,298],{},[42,284,285],{},"Trag die anderen Adressen in Redirect URLs ein."," Die Version mit ",[21,288,289],{},"www",", wenn\nLeute sie benutzen, die veröffentlichte Adresse beim Builder\n(",[21,292,293],{},"https:\u002F\u002Fyourapp.lovable.app"," zum Beispiel), wenn Leute sich dort\nregistrieren, und sonst nichts. Ein Eintrag ist ein Muster, also deckt\n",[21,296,297],{},"https:\u002F\u002Fyourapp.com\u002F**"," jede Seite auf dieser einen Domain ab.",[10,300,301,304,305,308,309,311,312,315,316,319],{},[42,302,303],{},"Prüf, was dein Code verlangt."," Übergibt er ",[21,306,307],{},"window.location.origin",", ist die\nAdresse die, unter der die Seite geöffnet wurde, und jede Adresse, die dabei\nherauskommen kann, muss auf der Domain deiner Site URL oder auf der Liste\nliegen. Vergleich sie Zeichen für Zeichen: mit ",[21,310,289],{}," oder ohne, mit ",[21,313,314],{},"https","\noder ohne. Ein Eintrag ohne ",[21,317,318],{},"\u002F**"," am Ende passt auf genau diese Adresse und auf\nnichts darunter.",[10,321,322,325,326,329,330,332,333,335,336,339],{},[42,323,324],{},"Prüf deine E-Mail-Vorlagen."," Eine Vorlage, die ihren Link selbst aus\n",[21,327,328],{},"{{ .SiteURL }}"," baut, schickt alle zur Site URL, egal was deine App verlangt\nhat. Supabases Anleitung zu Weiterleitungen sagt, dass du bei Verwendung der\nOption ",[21,331,90],{}," in deinen E-Mail-Vorlagen womöglich ",[21,334,328],{}," durch\n",[21,337,338],{},"{{ .RedirectTo }}"," ersetzen musst.",[341,342,343,356],"table",{},[344,345,346],"thead",{},[347,348,349,353],"tr",{},[350,351,352],"th",{},"Was du siehst",[350,354,355],{},"Was du änderst",[357,358,359,371,379,387,398],"tbody",{},[347,360,361,368],{},[362,363,364,365],"td",{},"Jeder Link öffnet ",[21,366,367],{},"localhost:3000",[362,369,370],{},"Die Site URL",[347,372,373,376],{},[362,374,375],{},"Links öffnen deine Site URL statt der Adresse, die dein Code verlangt hat",[362,377,378],{},"Trag diese Adresse in Redirect URLs ein, Zeichen für Zeichen",[347,380,381,384],{},[362,382,383],{},"Die Live-Domain funktioniert, die veröffentlichte Adresse beim Builder nicht",[362,385,386],{},"Trag die veröffentlichte Adresse in Redirect URLs ein",[347,388,389,392],{},[362,390,391],{},"Ein Link öffnet deine Supabase-Adresse mit \"No API key found in request\"",[362,393,394,395,397],{},"Setz ",[21,396,263],{}," vor die Site URL",[347,399,400,403],{},[362,401,402],{},"Die Adresse, die deine App verlangt, steht auf der Liste, und der Link übergeht sie trotzdem",[362,404,405,406,408],{},"Das ",[21,407,328],{}," in der E-Mail-Vorlage",[10,410,411,412,414],{},"Registrier dich dann noch einmal mit einer Adresse, die du noch nicht benutzt\nhast. Eine E-Mail, die vor der Korrektur mit Supabases Standardlink verschickt\nund innerhalb ihrer Stunde geöffnet wird, landet jetzt auf deiner Live-Seite,\nweil Supabase die Adresse beim Öffnen des Links noch einmal prüft. Das gilt,\nsolange ",[21,413,36],{}," nicht mehr auf deiner Liste steht.",[47,416,418],{"id":417},"welche-redirect-urls-kann-man-gefahrlos-zulassen","Welche Redirect URLs kann man gefahrlos zulassen?",[10,420,421],{},"Die genauen Adressen, die dir gehören. Ein Platzhalter gehört zu\nVorschau-Deployments, und nur beschränkt auf dein eigenes Team oder Projekt.",[10,423,424,425,428],{},"Supabases Anleitung zu Weiterleitungen sagt es klar: Der \"Globstar\" (",[21,426,427],{},"**",") sei\nfür die lokale Entwicklung und für Vorschau-Adressen nützlich, in Produktion\nempfiehlt sie aber, für deine Site URL den genauen Weiterleitungspfad\nfestzulegen.",[10,430,431,432,437,438,441],{},"Der Grund ist das, was mit der Person mitreist. Im Standardablauf schreibt\nSupabase die neue Sitzung in die Adresse, zu der es sie schickt:\n",[58,433,436],{"href":434,"rel":435},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fauth\u002Fblob\u002Fmaster\u002Finternal\u002Ftokens\u002Fservice.go",[62],"der Code, der sie baut",",\nhängt ",[21,439,440],{},"#access_token=…&refresh_token=…"," an die Weiterleitungsadresse. Jede\nSeite unter dieser Adresse kann diese beiden Werte lesen, und mit ihnen ist sie\ndieser Nutzer. Beim Wegweiser entscheidet der Arm, wer den Schlüssel bekommt.",[10,443,444],{},"Ein Eintrag, der auf eine Adresse passt, die jemand anderes kontrolliert, ist\nalso ein Weg in die Konten deiner Nutzer. Jeder kann dein Projekt bitten, einem\ndeiner Nutzer einen Anmeldelink zu mailen, mit dem öffentlichen Schlüssel, der\nabsichtlich in deiner App steht, und seine eigene Seite als Ziel angeben. Die\nE-Mail, die ankommt, stammt wirklich von deiner App. Der PKCE-Ablauf ändert\ndaran nichts, weil die Person, die diesen Link geschrieben hat, die Anmeldung\ngestartet hat, und PKCE gibt die Sitzung dem, der sie gestartet hat.",[10,446,447],{},"Die Muster, die auf Adressen passen, die andere anlegen können:",[188,449,450,458,469],{},[136,451,452,457],{},[42,453,454,456],{},[21,455,427],{}," allein"," passt auf jede Adresse, die es gibt.",[136,459,460,465,466,179],{},[42,461,462],{},[21,463,464],{},"https:\u002F\u002F*.vercel.app\u002F**"," passt auf jedes Vercel-Deployment im Internet,\nund jeder kann eins anlegen. Supabases eigenes Beispiel enthält dein Team:\n",[21,467,468],{},"https:\u002F\u002F*-\u003Cteam-or-account-slug>.vercel.app\u002F**",[136,470,471,480,481,179],{},[42,472,473,476,477],{},[21,474,475],{},"https:\u002F\u002F*.lovable.app\u002F**",", ",[21,478,479],{},"https:\u002F\u002F*.netlify.app\u002F**"," und dieselbe Form\nauf der Domain jedes Builders tun dasselbe für diesen Builder. Supabases\nBeispiel für Netlify ist ebenfalls beschränkt:\n",[21,482,483],{},"https:\u002F\u002F**--my_org.netlify.app\u002F**",[167,485],{"alt":486,"caption":487,"src":488},"Zwei Wegweiser. Links enthält die Liste eine genaue Adresse, ein präparierter Link, der woandershin zeigt, wird abgewiesen, und die Person kommt mit dem Schlüssel an ihrem eigenen Haus an. Rechts enthält die Liste einen Platzhalter, der präparierte Link wird angenommen, und der Schlüssel geht an ein anderes, rot umrandetes Haus.","Ein genauer Eintrag schickt einen präparierten Link nach Hause. Ein Platzhalter, der auf die Apps anderer passt, lässt ihn die Anmeldung bei ihnen abliefern.","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fwho-gets-the-key-1600x760.png",[10,490,491],{},"Wenn du das gerade mit einem eingefügten Platzhalter behoben hast, sieh dir die\nListe heute noch einmal an.",[10,493,494,495,179],{},"Der Start ist auch der Moment, in dem die anderen Einstellungen, die erst in\nProduktion zählen, angeschaut werden. Unser kostenloser Scan liest deine\nLive-App von außen und meldet, was ein Fremder erreichen kann: Tabellen, die\njedem antworten, geheime Schlüssel im Code, den deine App verschickt, fehlende\nHeader, das Zertifikat. Er dauert etwa 20 Sekunden und braucht kein Konto:\n",[58,496,498],{"href":497},"\u002Fsecurity-scanner","scanne deine App",[47,500,502],{"id":501},"die-live-app-nach-dem-start-im-blick-behalten","Die Live-App nach dem Start im Blick behalten",[10,504,505],{},"Diese Einstellung wird einmal korrigiert. Was deine App an Besucher schickt,\nändert sich mit jedem Deploy, und dieser Teil lässt sich von außen beobachten.",[10,507,508],{},[42,509,510,514],{},[58,511,513],{"href":512},"\u002Fwebsite-monitoring","Reeve Monitor"," prüft deine Live-App weiter:",[188,516,517,520,523,526],{},[136,518,519],{},"ob sie erreichbar ist, alle 60 Sekunden, damit sich \"der Link geht nicht\" von \"die Seite ist weg\" unterscheiden lässt",[136,521,522],{},"alle neun Prüfungen jede Stunde, für bis zu drei Apps, einschließlich geheimer Schlüssel im Code, den deine App an Besucher schickt",[136,524,525],{},"eine Nachricht, wenn sich ein Ergebnis ändert, damit dich ein Problem, das mit einem späteren Deploy hinausgeht, erreicht, ohne dass du nachsehen musst",[136,527,528],{},"ein monatlicher Bericht in klarer Sprache über das, was er gesehen hat",[10,530,531],{},[42,532,533,537],{},[58,534,536],{"href":535},"\u002Fsupabase-backups","Reeve Care"," hält eine Kopie deiner Supabase-Datenbank,\nsamt Konten:",[188,539,540,543,546,549,552,555],{},[136,541,542],{},"eine verschlüsselte Kopie nach Zeitplan, auf Reeves eigenem Speicher in der EU, außerhalb deines Supabase-Kontos",[136,544,545],{},"das Auth-Schema, in dem die Konten deiner Nutzer liegen, damit sie mit allem anderen zurückkommen",[136,547,548],{},"jede Kopie geprüft, bevor sie zählt, durch Zählen der Zeilen in jeder Tabelle",[136,550,551],{},"auch deine hochgeladenen Dateien, sobald du einen Storage-Zugang verbindest",[136,553,554],{},"eine Wiederherstellung per Klick, mit einer Sicherheitskopie des aktuellen Stands vorab",[136,556,557],{},"alles, was Monitor tut",[47,559,561],{"id":560},"was-du-jetzt-tun-solltest","Was du jetzt tun solltest",[563,564,565],"key-takeaways",{},[188,566,567,573,579,591,594],{},[136,568,569,570,572],{},"Setz die Site URL auf der Seite URL Configuration auf deine Live-Adresse, ",[21,571,263],{}," eingeschlossen.",[136,574,575,576,578],{},"Trag die anderen genauen Adressen, zu denen du Leute schickst, in Redirect URLs ein, etwa die Version mit ",[21,577,289],{}," und die veröffentlichte Adresse beim Builder.",[136,580,581,582,584,585,587,588,590],{},"Sorg dafür, dass jede Adresse, die dein Code als ",[21,583,107],{}," oder ",[21,586,90],{}," übergibt, auf der Liste steht, und nimm ",[21,589,338],{}," in Vorlagen, die ihr folgen sollen.",[136,592,593],{},"Sag allen, die nach der Registrierung auf der localhost-Seite gelandet sind, dass ihr Konto bestätigt ist. Magic Links und das Zurücksetzen von Passwörtern brauchen eine neue E-Mail.",[136,595,596],{},"Beschränk Platzhalter auf Vorschauen deines Teams und lass nie jede App auf der Domain eines Builders zu.",[10,598,599,600,603,604,608],{},"Wenn Leute den neuen Link drücken und hören, er sei abgelaufen,\n",[58,601,602],{"href":236},"hat diese Meldung eine eigene Seite",".\nDie ",[58,605,607],{"href":606},"\u002Fchecklist","10-Minuten-Sicherheits-Checkliste"," deckt ab, was in einer\nfrisch gestarteten App sonst oft offen bleibt.",{"title":23,"searchDepth":610,"depth":610,"links":611},3,[612,614,615,616,617,618,619,620],{"id":49,"depth":613,"text":50},2,{"id":97,"depth":613,"text":98},{"id":182,"depth":613,"text":183},{"id":220,"depth":613,"text":221},{"id":243,"depth":613,"text":244},{"id":417,"depth":613,"text":418},{"id":501,"depth":613,"text":502},{"id":560,"depth":613,"text":561},"Sicherheitsgrundlagen","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcover-1200x630.png","Ein Wegweiser, dessen leuchtender Arm von dem Haus weg zeigt, zu dem er führen soll, hin zu einem Laptop mit dunklem Bildschirm.","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.",false,"md",[628,631,634,637,640],{"q":629,"a":630},"Warum öffnet meine Bestätigungs-E-Mail von Supabase localhost:3000?","Weil Supabase die Person zur Site URL deines Projekts geschickt hat, und die Site URL steht noch auf http:\u002F\u002Flocalhost:3000. Supabase nimmt sie immer dann, wenn die Adresse, die deine App verlangt hat, auf der Liste Redirect URLs fehlt oder deine App gar keine verlangt hat. Du änderst sie auf der Seite URL Configuration unter Authentication.",{"q":632,"a":633},"Ist das Konto bestätigt, wenn der Link localhost geöffnet hat?","Ja, bei einer Bestätigung der Registrierung. Supabase bestätigt die Adresse zuerst und schickt den Browser erst danach weiter, die gescheiterte Seite kommt also, wenn die Arbeit schon erledigt ist. Die Person kann sich auf deiner Live-Seite mit dem Passwort anmelden, das sie gewählt hat. Ein Magic Link oder ein Zurücksetzen des Passworts muss neu verschickt werden.",{"q":635,"a":636},"Ich habe meine Seite in Redirect URLs eingetragen, und es geht trotzdem auf localhost. Warum?","Der Eintrag muss Zeichen für Zeichen zu der Adresse passen, die Supabase angeboten wird: mit www oder ohne, mit https oder ohne, und der Pfad, denn ein Eintrag ohne \u002F** am Ende passt nur auf genau diese eine Adresse. Passen sie und der Link übergeht sie trotzdem, baut deine E-Mail-Vorlage ihren Link aus {{ .SiteURL }}. Und korrigier die Site URL selbst, denn auf sie fällt alles andere zurück.",{"q":638,"a":639},"Muss ich meine Site URL in die Liste Redirect URLs eintragen?","Nein. Supabase nimmt jede Adresse auf der eigenen Domain der Site URL ohne Listeneintrag an, unter jedem Pfad. Die Liste ist für die anderen Adressen: eine Version mit www, die veröffentlichte Adresse beim Builder, Vorschau-Deployments.",{"q":641,"a":642},"Darf ich in Supabase Redirect URLs einen Platzhalter benutzen?","Für Vorschauen, beschränkt auf dein eigenes Team oder Projekt, wie in Supabases eigenen Beispielen. Nie einen, der auf Adressen passt, die andere anlegen können, etwa jede App auf vercel.app oder lovable.app. Supabase empfiehlt für deine Seite in Produktion die genaue Adresse.","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcard-800x500.png",[645,646,647,648,649,650,651],"supabase redirect to localhost","supabase weiterleitung localhost","supabase magic link localhost 3000","supabase site url","supabase redirect urls","supabase bestätigungsmail falsche url","supabase redirect url platzhalter",{},true,"Supabase-E-Mail-Links leiten auf localhost:3000 weiter","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost","2026-11-02",{"title":5,"description":624},"blog\u002Fsupabase-auth-redirects-to-localhost",[660,661,662],"Eine Weiterleitung von Supabase auf localhost:3000 kommt von der Site URL auf der Seite URL Configuration. Ein Projekt beginnt mit http:\u002F\u002Flocalhost:3000, und jeder E-Mail-Link fällt darauf zurück, wenn die Adresse, die deine App verlangt, nicht auf der Liste Redirect URLs steht.","Wer einen Registrierungslink gedrückt hat, ist meist schon bestätigt. Supabase bestätigt das Konto, bevor es die Person weiterschickt, also kann sie sich auf deiner echten Seite anmelden.","Setz die Site URL auf deine Live-Adresse und trag die genauen Adressen ein, die du benutzt. Ein Platzhalter, der so weit reicht, dass er die App eines anderen trifft, lässt einen präparierten Link deine Nutzer angemeldet dorthin schicken.","SRL6JnUOdhq5NJQbtcouGhVaAATiBZ362xh7rbMCWw4",[665,671,676,682,688,694,700,706,707,712,718,725,731,737,743,749,755,761,767,773,779,785,791,797,803,809,815,821,827,833,839,845,851,857,862,868,874,880,886,892,898,904,910,916,922,928,933,939,945,951,957,963,969,975,981,987,993,999,1005,1011,1017,1023,1029,1035,1041,1047,1053,1059,1065,1071,1077,1083,1089,1095,1101,1107,1113,1119,1125,1131,1137,1143,1149,1155,1160,1166,1172,1178,1183,1189],{"path":666,"title":667,"description":668,"published":669,"category":621,"image":670,"draft":625},"\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":177,"title":672,"description":673,"published":674,"category":621,"image":675,"draft":625},"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":677,"title":678,"description":679,"published":680,"category":621,"image":681,"draft":625},"\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":683,"title":684,"description":685,"published":686,"category":621,"image":687,"draft":625},"\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":689,"title":690,"description":691,"published":692,"category":621,"image":693,"draft":625},"\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":695,"title":696,"description":697,"published":698,"category":621,"image":699,"draft":625},"\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":701,"title":702,"description":703,"published":704,"category":621,"image":705,"draft":625},"\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":655,"title":5,"description":624,"published":656,"category":621,"image":643,"draft":625},{"path":236,"title":708,"description":709,"published":710,"category":621,"image":711,"draft":625},"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":713,"title":714,"description":715,"published":716,"category":621,"image":717,"draft":625},"\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":719,"title":720,"description":721,"published":722,"category":723,"image":724,"draft":625},"\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":726,"title":727,"description":728,"published":729,"category":621,"image":730,"draft":625},"\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":732,"title":733,"description":734,"published":735,"category":621,"image":736,"draft":625},"\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":738,"title":739,"description":740,"published":741,"category":621,"image":742,"draft":625},"\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":744,"title":745,"description":746,"published":747,"category":621,"image":748,"draft":625},"\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":750,"title":751,"description":752,"published":753,"category":621,"image":754,"draft":625},"\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":756,"title":757,"description":758,"published":759,"category":621,"image":760,"draft":625},"\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":762,"title":763,"description":764,"published":765,"category":621,"image":766,"draft":625},"\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":768,"title":769,"description":770,"published":771,"category":621,"image":772,"draft":625},"\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":774,"title":775,"description":776,"published":777,"category":621,"image":778,"draft":625},"\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":780,"title":781,"description":782,"published":783,"category":621,"image":784,"draft":625},"\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":786,"title":787,"description":788,"published":789,"category":621,"image":790,"draft":625},"\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":792,"title":793,"description":794,"published":795,"category":621,"image":796,"draft":625},"\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":798,"title":799,"description":800,"published":801,"category":621,"image":802,"draft":625},"\u002Fblog\u002Fsupabase-bucket-not-found","Supabase \"Bucket not found\": die drei Dinge, die es bedeutet","Supabase \"Bucket not found\" ist eins von drei Dingen: ein öffentlicher Link zu einem privaten Bucket, ein ungenauer Name oder das falsche Projekt.","2026-10-17","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",{"path":804,"title":805,"description":806,"published":807,"category":621,"image":808,"draft":625},"\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":810,"title":811,"description":812,"published":813,"category":621,"image":814,"draft":625},"\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":816,"title":817,"description":818,"published":819,"category":621,"image":820,"draft":625},"\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":822,"title":823,"description":824,"published":825,"category":621,"image":826,"draft":625},"\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":828,"title":829,"description":830,"published":831,"category":621,"image":832,"draft":625},"\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":834,"title":835,"description":836,"published":837,"category":621,"image":838,"draft":625},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"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":840,"title":841,"description":842,"published":843,"category":621,"image":844,"draft":625},"\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":846,"title":847,"description":848,"published":849,"category":621,"image":850,"draft":625},"\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":852,"title":853,"description":854,"published":855,"category":621,"image":856,"draft":625},"\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":274,"title":858,"description":859,"published":860,"category":621,"image":861,"draft":625},"\"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":863,"title":864,"description":865,"published":866,"category":621,"image":867,"draft":625},"\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":869,"title":870,"description":871,"published":872,"category":621,"image":873,"draft":625},"\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":875,"title":876,"description":877,"published":878,"category":621,"image":879,"draft":625},"\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":881,"title":882,"description":883,"published":884,"category":621,"image":885,"draft":625},"\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":887,"title":888,"description":889,"published":890,"category":621,"image":891,"draft":625},"\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":893,"title":894,"description":895,"published":896,"category":621,"image":897,"draft":625},"\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":899,"title":900,"description":901,"published":902,"category":621,"image":903,"draft":625},"\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":905,"title":906,"description":907,"published":908,"category":621,"image":909,"draft":625},"\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":911,"title":912,"description":913,"published":914,"category":723,"image":915,"draft":625},"\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":917,"title":918,"description":919,"published":920,"category":723,"image":921,"draft":625},"\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":923,"title":924,"description":925,"published":926,"category":723,"image":927,"draft":625},"\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":929,"title":930,"description":931,"published":926,"category":621,"image":932,"draft":625},"\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":934,"title":935,"description":936,"published":937,"category":621,"image":938,"draft":625},"\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":940,"title":941,"description":942,"published":943,"category":621,"image":944,"draft":625},"\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":946,"title":947,"description":948,"published":949,"category":723,"image":950,"draft":625},"\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":952,"title":953,"description":954,"published":955,"category":621,"image":956,"draft":625},"\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":958,"title":959,"description":960,"published":961,"category":621,"image":962,"draft":625},"\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":964,"title":965,"description":966,"published":967,"category":621,"image":968,"draft":625},"\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":970,"title":971,"description":972,"published":973,"category":621,"image":974,"draft":625},"\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":976,"title":977,"description":978,"published":979,"category":621,"image":980,"draft":625},"\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":982,"title":983,"description":984,"published":985,"category":621,"image":986,"draft":625},"\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":988,"title":989,"description":990,"published":991,"category":621,"image":992,"draft":625},"\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":994,"title":995,"description":996,"published":997,"category":621,"image":998,"draft":625},"\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":1000,"title":1001,"description":1002,"published":1003,"category":723,"image":1004,"draft":625},"\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":1006,"title":1007,"description":1008,"published":1009,"category":723,"image":1010,"draft":625},"\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":1012,"title":1013,"description":1014,"published":1015,"category":723,"image":1016,"draft":625},"\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":1018,"title":1019,"description":1020,"published":1021,"category":621,"image":1022,"draft":625},"\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":1024,"title":1025,"description":1026,"published":1027,"category":621,"image":1028,"draft":625},"\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":1030,"title":1031,"description":1032,"published":1033,"category":621,"image":1034,"draft":625},"\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":1036,"title":1037,"description":1038,"published":1039,"category":621,"image":1040,"draft":625},"\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":1042,"title":1043,"description":1044,"published":1045,"category":621,"image":1046,"draft":625},"\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":1048,"title":1049,"description":1050,"published":1051,"category":621,"image":1052,"draft":625},"\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":1054,"title":1055,"description":1056,"published":1057,"category":621,"image":1058,"draft":625},"\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":1060,"title":1061,"description":1062,"published":1063,"category":621,"image":1064,"draft":625},"\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":1066,"title":1067,"description":1068,"published":1069,"category":621,"image":1070,"draft":625},"\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":1072,"title":1073,"description":1074,"published":1075,"category":621,"image":1076,"draft":625},"\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":1078,"title":1079,"description":1080,"published":1081,"category":723,"image":1082,"draft":625},"\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":1084,"title":1085,"description":1086,"published":1087,"category":621,"image":1088,"draft":625},"\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":1090,"title":1091,"description":1092,"published":1093,"category":723,"image":1094,"draft":625},"\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":1096,"title":1097,"description":1098,"published":1099,"category":621,"image":1100,"draft":625},"\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":1102,"title":1103,"description":1104,"published":1105,"category":621,"image":1106,"draft":625},"\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":1108,"title":1109,"description":1110,"published":1111,"category":621,"image":1112,"draft":625},"\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":1114,"title":1115,"description":1116,"published":1117,"category":621,"image":1118,"draft":625},"\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":1120,"title":1121,"description":1122,"published":1123,"category":723,"image":1124,"draft":625},"\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":1126,"title":1127,"description":1128,"published":1129,"category":723,"image":1130,"draft":625},"\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":1132,"title":1133,"description":1134,"published":1135,"category":621,"image":1136,"draft":625},"\u002Fblog\u002Fsupabase-storage-bucket-public","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":1138,"title":1139,"description":1140,"published":1141,"category":621,"image":1142,"draft":625},"\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":1144,"title":1145,"description":1146,"published":1147,"category":723,"image":1148,"draft":625},"\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":1150,"title":1151,"description":1152,"published":1153,"category":621,"image":1154,"draft":625},"\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":1156,"title":1157,"description":1158,"published":1153,"category":621,"image":1159,"draft":625},"\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":1161,"title":1162,"description":1163,"published":1164,"category":621,"image":1165,"draft":625},"\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":1167,"title":1168,"description":1169,"published":1170,"category":723,"image":1171,"draft":625},"\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":1173,"title":1174,"description":1175,"published":1176,"category":621,"image":1177,"draft":625},"\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":1179,"title":1180,"description":1181,"published":1176,"category":723,"image":1182,"draft":625},"\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":1184,"title":1185,"description":1186,"published":1187,"category":723,"image":1188,"draft":625},"\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":1190,"title":1191,"description":1192,"published":1187,"category":621,"image":1193,"draft":625},"\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",1794213638665]