[{"data":1,"prerenderedAt":1110},["ShallowReactive",2],{"blog-de-supabase-email-rate-limit-exceeded":3,"blog-index-de":580},{"id":4,"title":5,"body":6,"category":535,"cover":536,"coverAlt":537,"description":538,"draft":539,"extension":540,"faq":541,"image":560,"keywords":561,"meta":569,"navigation":570,"ogTitle":5,"path":571,"published":572,"seo":573,"stem":574,"tldr":575,"updated":572,"__hash__":579},"blog_de\u002Fblog\u002Fsupabase-email-rate-limit-exceeded.md","Supabase \"Email Rate Limit Exceeded\": zwei Limits, ein Fehlercode",{"type":7,"value":8,"toc":522},"minimark",[9,18,28,31,43,48,51,54,73,91,110,116,124,128,131,188,200,207,212,216,219,234,237,241,249,252,258,265,287,291,294,318,321,346,353,357,364,370,373,384,389,393,396,402,412,416,419,428,446,455,475,479,516],[10,11,12,13,17],"p",{},"Du probierst dein Registrierungsformular aus, bevor du die App teilst. Du\nregistrierst dich mit deiner eigenen Adresse, dann mit ",[14,15,16],"code",{},"du+2@gmail.com",", dann\nnoch einmal, um zu sehen, ob die Bestätigungsmail gut aussieht. Einer dieser\nVersuche bleibt hier stehen:",[19,20,25],"pre",{"className":21,"code":23,"language":24},[22],"language-text","AuthApiError: email rate limit exceeded\n","text",[14,26,23],{"__ignoreMap":27},"",[10,29,30],{},"Supabase \"Email Rate Limit Exceeded\" heißt, dass dein Projekt sein Kontingent an\nE-Mails für diese Stunde aufgebraucht hat. Supabase Auth, der Teil von Supabase,\nder Leute anmeldet, hat deshalb keine weitere verschickt. Beim E-Mail-Dienst, mit\ndem jedes Projekt startet, liegt dieses Kontingent bei zwei E-Mails pro Stunde für\ndas ganze Projekt.",[10,32,33,34,38,39,42],{},"Hier liegt der Teil, den man leicht falsch versteht: ",[35,36,37],"strong",{},"Der Fehlercode deckt zwei\nverschiedene Limits ab."," Supabases eigene Liste der Auth-Fehlercodes beschreibt\n",[14,40,41],{},"over_email_send_rate_limit"," als \"Too many emails have been sent to this email\naddress.\" Das stimmt für eines davon. Derselbe Code kommt auch zurück, wenn das\nganze Projekt am Ende ist, egal an wen die E-Mail ging. Eine andere Adresse zu\nversuchen ändert also nichts. Und der übliche Rat, \"verbinde deinen eigenen\nSMTP-Server\", ist nur die halbe Lösung, denn Supabase startet einen neu\nverbundenen E-Mail-Server bei 30 E-Mails pro Stunde.",[44,45,47],"h2",{"id":46},"was-bedeutet-email-rate-limit-exceeded-in-supabase","Was bedeutet \"Email rate limit exceeded\" in Supabase?",[10,49,50],{},"Dein Projekt hat in dieser Stunde so viele E-Mails verschickt, wie Supabase Auth\nerlaubt, und die nächste wurde abgelehnt.",[10,52,53],{},"Stell dir das Kontingent als Briefmarkenbogen vor. Supabase gibt jedem Projekt\neine feste Zahl Marken pro Stunde, und jede E-Mail, die Supabase Auth verschickt,\nverbraucht eine, egal welche Art von E-Mail es ist und an wen sie geht:",[55,56,57,61,64,67,70],"ul",{},[58,59,60],"li",{},"der Bestätigungslink, nachdem sich jemand registriert hat",[58,62,63],{},"ein Magic Link oder ein Einmalcode zum Anmelden",[58,65,66],{},"ein Passwort-Reset",[58,68,69],{},"eine Einladung, die du über die Seite Users verschickst",[58,71,72],{},"die Bestätigung, wenn jemand seine E-Mail-Adresse ändert",[10,74,75,76,78,79,82,83,90],{},"Ist der Bogen leer, antwortet Supabase Auth mit HTTP 429, was \"zu viele Anfragen\"\nbedeutet, mit dem Code ",[14,77,41],{}," und der Meldung ",[14,80,81],{},"email rate limit exceeded",". Diese Wörter stammen aus\n",[84,85,89],"a",{"href":86,"rel":87},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fauth\u002Fblob\u002Fmaster\u002Finternal\u002Fapi\u002Fmail.go",[88],"nofollow","dem Code des Supabase-Auth-Servers selbst",".",[10,92,93,94,97,98,103,104,109],{},"Beim eingebauten Absender, dem E-Mail-Dienst, mit dem ein neues Projekt startet,\nhat der Bogen ",[35,95,96],{},"zwei Marken pro Stunde",". Das ist die Zahl auf Supabases\n",[84,99,102],{"href":100,"rel":101},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Frate-limits",[88],"Seite zu den Rate Limits",", als\nwir sie am 20. Oktober 2026 gelesen haben, und Supabases\n",[84,105,108],{"href":106,"rel":107},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Fauth-smtp",[88],"Anleitung zu eigenem SMTP"," sagt\nüber diese Zahl, sie \"can change without notice\". Bei zwei pro Stunde sind eine\nRegistrierung und ein Passwort-Reset schon das ganze Kontingent der Stunde.",[111,112],"diagram",{"alt":113,"caption":114,"src":115},"Vier Arten von E-Mail, für ein neues Konto, einen Anmeldelink, ein Passwort-Reset und eine Einladung, bedienen sich alle an einem Bogen mit zwei Marken pro Stunde. Zwei Umschläge gehen frankiert hinaus. Die anderen zwei bleiben ohne Marke an einer Schranke stehen.","Jede E-Mail, die Supabase Auth verschickt, verbraucht eine Marke vom selben Bogen. Beim eingebauten Absender hat der Bogen zwei pro Stunde.","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fone-sheet-every-email-1600x760.png",[10,117,118,119,123],{},"Kann sich niemand mehr anmelden, oder ist die ganze App leer, hast du ein anderes\nProblem, und\n",[84,120,122],{"href":121},"\u002Fblog\u002Fis-supabase-down-or-your-app","ist Supabase ausgefallen oder deine App"," ist\nder richtige Anfang.",[44,125,127],{"id":126},"zwei-limits-teilen-sich-einen-fehlercode","Zwei Limits teilen sich einen Fehlercode",[10,129,130],{},"Die Meldung sagt dir, welches Limit du erreicht hast. Der Code ist bei beiden\nderselbe:",[132,133,134,153],"table",{},[135,136,137],"thead",{},[138,139,140,144,147,150],"tr",{},[141,142,143],"th",{},"Die Meldung",[141,145,146],{},"Was begrenzt wird",[141,148,149],{},"Was gezählt wird",[141,151,152],{},"Der Standard",[154,155,156,172],"tbody",{},[138,157,158,163,166,169],{},[159,160,161],"td",{},[14,162,81],{},[159,164,165],{},"Das ganze Projekt",[159,167,168],{},"Jede E-Mail, die Supabase Auth verschickt, pro Stunde",[159,170,171],{},"2 pro Stunde beim eingebauten Absender, 30, wenn du zum ersten Mal deinen eigenen verbindest",[138,173,174,179,182,185],{},[159,175,176],{},[14,177,178],{},"For security purposes, you can only request this after N seconds.",[159,180,181],{},"Eine Adresse",[159,183,184],{},"Dieselbe Art von E-Mail, erneut an dieselbe Adresse",[159,186,187],{},"Eine alle 60 Sekunden",[10,189,190,191,193,194,199],{},"Beide antworten mit HTTP 429 und ",[14,192,41],{},". Supabases\n",[84,195,198],{"href":196,"rel":197},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Fdebugging\u002Ferror-codes",[88],"Liste der Auth-Fehlercodes","\nbittet dich, Fehler an ihrem Code zu erkennen und \"not string matching on error\nmessages\". Für den Code deiner App ist das richtig, und es lässt hier eine Lücke:\nNur die Meldung sagt, welches Limit du erreicht hast. Lies also die Meldung, um zu\nverstehen, was passiert ist, und lass deine App auf den Code reagieren.",[10,201,202,203,206],{},"Sagt deine App nur \"etwas ist schiefgelaufen\", steht die genaue Meldung in der\nAntwort auf die fehlgeschlagene Anfrage, im Tab Netzwerk der Entwicklertools\ndeines Browsers. Ein Code ",[14,204,205],{},"over_request_rate_limit"," ist ein drittes Limit, für\nAnfragen von einer IP-Adresse, und laut Supabases Liste kann er auf einen Fehler in\ndeiner App hinweisen, der zu viele davon schickt.",[111,208],{"alt":209,"caption":210,"src":211},"Zwei Felder. Im linken ist der Markenbogen des Projekts leer, und drei Umschläge an drei verschiedene Personen bleiben stehen. Im rechten hat eine Person schon einen Umschlag bekommen, und ein zweiter an dieselbe Person wartet neben einer Uhr mit 60 Sekunden. Beide Felder führen zum selben Fehlercode, over_email_send_rate_limit, mit Status 429.","Ein leerer Bogen und eine Wartezeit von 60 Sekunden sind verschiedene Ablehnungen, und Supabase meldet beide mit demselben Code.","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Ftwo-refusals-one-code-1600x720.png",[44,213,215],{"id":214},"warum-steht-da-you-can-only-request-this-after-0-seconds","Warum steht da \"you can only request this after 0 seconds\"?",[10,217,218],{},"Weil von der Wartezeit weniger als eine Sekunde übrig war. Das Limit pro Adresse\nerlaubt eine E-Mail jeder Art an dieselbe Adresse alle 60 Sekunden: eine\nBestätigung nach der Registrierung, ein Passwort-Reset, ein Magic Link oder Code.\nFragst du früher erneut an, rechnet Supabase Auth aus, wie lange es noch dauert,\nund schreibt das in die Meldung.",[10,220,221,222,229,230,233],{},"Es zählt in ganzen Sekunden und lässt den Rest weg. Die Funktion im Auth-Server,\ndie diese Meldung schreibt\n(",[84,223,226],{"href":224,"rel":225},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fauth\u002Fblob\u002Fmaster\u002Finternal\u002Fapi\u002Ferrors.go",[88],[14,227,228],{},"errors.go","),\nteilt die verbleibende Zeit durch eine Sekunde, also wird aus 0,8 Sekunden eine\n",[14,231,232],{},"0",". Versuch es einen Moment später noch einmal, dann geht es durch, solange die\nStundengrenze des Projekts noch eine Marke hat.",[10,235,236],{},"Diese Wartezeit tut, wofür sie gedacht ist. Sie sorgt dafür, dass ein Knopf zum\nerneuten Senden, zwanzigmal gedrückt, keine zwanzig E-Mails verschickt. Lass sie\nbei 60 Sekunden und lass dein Formular sie erklären.",[44,238,240],{"id":239},"die-stundengrenze-und-für-wen-sie-gedacht-ist","Die Stundengrenze, und für wen sie gedacht ist",[10,242,243,244,248],{},"Der eingebaute Absender ist zum Ausprobieren von Supabase da, und Supabase sagt\ndas in seiner ",[84,245,247],{"href":106,"rel":246},[88],"SMTP-Anleitung",".\nDort steht, wofür der Dienst gedacht ist: \"Exploring and getting started with\nSupabase Auth\", \"Setting up and testing email templates with the members of the\nproject's team\" und \"Building toy projects, demos or any non-mission-critical\napplication\". Dazu kommt \"No SLA guarantee on message delivery or uptime\".",[10,250,251],{},"Dieselbe Anleitung hat eine zweite Regel, und sie entscheidet, wer welchen Fehler\nsieht. Bis du deinen eigenen E-Mail-Server verbindest, gilt: Supabase Auth \"will\nrefuse to deliver messages to addresses that are not part of the project's team\".\nEin Kunde, der\nsich mit seiner eigenen Adresse registriert, wird abgewiesen, bevor überhaupt eine\nMarke gezählt wird, mit einer anderen Meldung:",[19,253,256],{"className":254,"code":255,"language":24},[22],"Email address \"customer@example.com\" cannot be used as it is not authorized\n",[14,257,255],{"__ignoreMap":27},[10,259,260,261,264],{},"Das ist HTTP 400 mit dem Code ",[14,262,263],{},"email_address_not_authorized",", und im Code des\nAuth-Servers läuft diese Prüfung vor beiden Limits. Wenn die Registrierung bei dir\nfunktioniert und bei allen anderen scheitert, liegt es daran.",[10,266,267,268,270,271,274,275,278,279,282,283,286],{},"Beim eingebauten Absender trifft ",[14,269,81],{}," also vor allem dich\nund dein Team, beim Testen. Wenn der Auth-Server prüft, ob eine Adresse zu deinem\nTeam gehört, ignoriert er alles zwischen einem ",[14,272,273],{},"+"," und dem ",[14,276,277],{},"@",". Damit zählen\n",[14,280,281],{},"du+test1@gmail.com"," und ",[14,284,285],{},"du+test2@gmail.com"," beide als du, und jede\nTest-Registrierung verbraucht eine von denselben zwei Marken.",[44,288,290],{"id":289},"wie-erhöhe-ich-das-e-mail-limit-in-supabase","Wie erhöhe ich das E-Mail-Limit in Supabase?",[10,292,293],{},"Verbinde deinen eigenen E-Mail-Anbieter und erhöhe dann das Limit, das Supabase\ndarauf setzt. Das sind zwei getrennte Schritte, und den zweiten übersehen viele.",[295,296,297,306,312],"ol",{},[58,298,299,302,303,90],{},[35,300,301],{},"Such dir einen Versanddienst aus und hol dir seine SMTP-Daten."," Supabases\nAnleitung nennt Resend, AWS SES, Postmark, Twilio SendGrid, ZeptoMail und\nBrevo und sagt, dass jeder Dienst funktioniert, der SMTP unterstützt. Du\nbrauchst Host, Port, Benutzernamen und Passwort, dazu eine Absenderadresse wie\n",[14,304,305],{},"no-reply@deinedomain.de",[58,307,308,311],{},[35,309,310],{},"Schalte eigenes SMTP ein",", in den Authentication-Einstellungen deines\nProjekts, und trag diese Daten ein. Ab dann verschickt Supabase an jede\nAdresse.",[58,313,314,317],{},[35,315,316],{},"Erhöhe das E-Mail-Limit"," auf der Seite Rate Limits, ebenfalls unter\nAuthentication. Laut Anleitung bekommt ein neu verbundener Server \"a low\nrate-limit of 30 messages per hour\", um seinen Ruf zu schützen, und du änderst\nes dort. Stell es auf das, was dein Anbieter erlaubt und was deine\ngeschäftigste Stunde braucht.",[10,319,320],{},"Drei weitere Dinge aus derselben Anleitung gehören zu dieser Änderung:",[55,322,323,329,335],{},[58,324,325,328],{},[35,326,327],{},"Richte DKIM, DMARC und SPF ein",", für deine Absenderdomain, bei deinem\nAnbieter. Supabase sagt, das \"will significantly increase the deliverability of\nyour messages\".",[58,330,331,334],{},[35,332,333],{},"Schalte CAPTCHA für Registrierungen ein."," Die Anleitung nennt Bots, die\nListen von Adressen registrieren, \"a common source of abuse\", und jede dieser\nRegistrierungen ist eine E-Mail aus deiner Stunde. CAPTCHA nennt sie \"the most\neffective way\", sie zu stoppen.",[58,336,337,340,341,345],{},[35,338,339],{},"Prüf, ob deine Nutzer abgemeldet werden."," Laut Anleitung zwingen kurze\nSitzungen \"active users to sign in frequently, increasing the number of\nmessages\", und wenn sich deine Nutzer per E-Mail-Link anmelden, kostet jede\nunerwartete Abmeldung eine Marke.\n",[84,342,344],{"href":343},"\u002Fblog\u002Fsupabase-users-logged-out","Warum Supabase-Nutzer abgemeldet werden","\nerklärt die Ursachen.",[10,347,348,349,90],{},"Für die anderen Grenzen, an die ein kostenloses Projekt stößt, siehe\n",[84,350,352],{"href":351},"\u002Fblog\u002Fsupabase-free-plan-limits","was der kostenlose Supabase-Plan enthält",[44,354,356],{"id":355},"den-fehler-im-registrierungsformular-abfangen","Den Fehler im Registrierungsformular abfangen",[10,358,359,360,363],{},"Fang ihn an seinem Code ab und sag der Person in klaren Worten, was sie tun soll.\nDer JavaScript-Client von Supabase hängt den Code des Servers als ",[14,361,362],{},"error.code"," an\nden Fehler, den er zurückgibt, also ist die Prüfung eine Zeile:",[19,365,368],{"className":366,"code":367,"language":24},[22],"const { error } = await supabase.auth.signUp({ email, password })\n\nif (error?.code === 'over_email_send_rate_limit') {\n  \u002F\u002F anzeigen: \"Wir konnten deine E-Mail gerade nicht senden. Bitte versuch es in einer Minute erneut.\"\n}\n",[14,369,367],{"__ignoreMap":27},[10,371,372],{},"Bitte deinen Builder, ob das Lovable, Bolt, v0, Cursor, Claude Code oder Replit\nist, um drei Dinge:",[55,374,375,378,381],{},[58,376,377],{},"dieselbe Prüfung in jedem Formular, das E-Mails verschickt: Registrierung,\n\"Passwort vergessen\", Anmeldung per E-Mail-Link und \"erneut senden\"",[58,379,380],{},"eine Meldung, die die Person bittet, es gleich noch einmal zu versuchen, an der\nStelle des rohen Fehlers oder eines Formulars, das stumm nichts tut",[58,382,383],{},"den Knopf zum erneuten Senden nach jedem Versand 60 Sekunden lang deaktiviert,\ndamit ihn niemand in die Wartezeit pro Adresse hineindrückt",[10,385,386,387,90],{},"Verzichte auf automatische Wiederholungen. Solange der Bogen leer ist, wird jede\nWiederholung abgelehnt, und Anfragen zur Registrierung sind zusätzlich pro\nIP-Adresse begrenzt, standardmäßig auf 30 alle 5 Minuten. Eine\nWiederholungsschleife kann auch dieses Limit auslösen, und das antwortet mit\n",[14,388,205],{},[44,390,392],{"id":391},"was-du-nicht-ändern-solltest-solange-registrierungen-hängen","Was du nicht ändern solltest, solange Registrierungen hängen",[10,394,395],{},"Die E-Mail-Bestätigung, und von wo die E-Mails verschickt werden. Zwei Abkürzungen\nlassen den Fehler verschwinden und stellen dich schlechter.",[10,397,398,401],{},[35,399,400],{},"Lass die E-Mail-Bestätigung an."," Schaltest du \"Confirm email\" aus, verschicken\nRegistrierungen gar nichts mehr, und der Fehler ist weg. Supabases SMTP-Anleitung\nführt \"Do not disable email confirmations under pressure\" unter ihren\nSchutzmaßnahmen auf, weil ohne Bestätigung jemand ein Konto im Namen einer anderen\nPerson anlegen kann.",[10,403,404,407,408,90],{},[35,405,406],{},"Halte die E-Mails aus dem Browser heraus."," Bittest du einen Assistenten, \"die\nBestätigung einfach mit Resend zu verschicken\", kann er den API-Schlüssel des\nAnbieters in den Frontend-Code deiner App schreiben, wo jeder Besucher ihn lesen\nund in deinem Namen Mails verschicken kann. Verschick E-Mails über die\nSMTP-Einstellungen von Supabase oder eine serverseitige Funktion, nie mit einem\nSchlüssel in der Seite. Wenn du nicht sicher bist, ob einer hineingerutscht ist:\nUnser kostenloser Scan liest den Code, den deine Live-App an jeden Besucher\nschickt, und meldet die geheimen Schlüssel, die er darin findet. Er dauert etwa 20\nSekunden und braucht kein Konto: ",[84,409,411],{"href":410},"\u002Fsecurity-scanner","scanne deine App",[44,413,415],{"id":414},"ein-auge-auf-die-app-während-du-den-e-mail-versand-umbaust","Ein Auge auf die App, während du den E-Mail-Versand umbaust",[10,417,418],{},"Zwei Dinge können schiefgehen, während du den E-Mail-Versand neu verdrahtest: Ein\nSchlüssel landet im Code deiner App, und eine Nachricht wie \"niemand kann sich\nregistrieren\" schickt dich auf die Suche nach einem Ausfall.",[10,420,421],{},[35,422,423,427],{},[84,424,426],{"href":425},"\u002Fwebsite-monitoring","Reeve Monitor"," prüft weiter von außen:",[55,429,430,433,436,443],{},[58,431,432],{},"ob deine App erreichbar ist, jede Minute geprüft, damit du sofort weißt, ob eine Beschwerde über die Registrierung ein Ausfall ist oder etwas Engeres",[58,434,435],{},"die vollständige Sicherheitsprüfung jede Stunde, für bis zu drei Apps, einschließlich geheimer Schlüssel im Code, den deine App an Besucher schickt",[58,437,438,439,442],{},"eine Nachricht, wenn sich ein Ergebnis ",[35,440,441],{},"ändert",", damit dich ein Schlüssel, der mit einem späteren Deploy hinausgeht, erreicht, ohne dass du nachsehen musst",[58,444,445],{},"ein monatlicher Bericht in klarer Sprache über das, was er gesehen hat",[10,447,448],{},[35,449,450,454],{},[84,451,453],{"href":452},"\u002Fsupabase-backups","Reeve Care"," bewahrt eine Kopie deiner Supabase-Datenbank auf:",[55,456,457,460,463,466,469,472],{},[58,458,459],{},"eine verschlüsselte Kopie nach Zeitplan, auf Reeves eigenem Speicher in der EU, außerhalb deines Supabase-Kontos",[58,461,462],{},"das Auth-Schema, in dem jedes Konto liegt, das sich registrieren konnte",[58,464,465],{},"jede Kopie geprüft, bevor sie zählt, indem die Zeilen jeder Tabelle gezählt werden",[58,467,468],{},"auch deine hochgeladenen Dateien, sobald du einen Storage-Zugang verbindest",[58,470,471],{},"eine Wiederherstellung mit einem Klick, vor der eine Sicherheitskopie des aktuellen Stands angelegt wird",[58,473,474],{},"alles, was Monitor macht",[44,476,478],{"id":477},"was-du-jetzt-tun-solltest","Was du jetzt tun solltest",[480,481,482],"key-takeaways",{},[55,483,484,494,501,504,507,513],{},[58,485,486,487,489,490,493],{},"Lies die Meldung und nicht nur den Code: ",[14,488,81],{}," ist die Stundengrenze des Projekts, ",[14,491,492],{},"For security purposes…"," die Wartezeit von 60 Sekunden für eine Adresse.",[58,495,496,497,500],{},"Sehen Kunden ",[14,498,499],{},"Email address … cannot be used as it is not authorized",", läuft dein Projekt noch über den eingebauten Absender von Supabase, der nur an dein Team verschickt.",[58,502,503],{},"Verbinde deinen eigenen SMTP-Anbieter und erhöhe dann das E-Mail-Limit auf der Seite Rate Limits, das bei 30 pro Stunde beginnt.",[58,505,506],{},"Richte DKIM, DMARC und SPF bei deinem Anbieter ein und schalte CAPTCHA für Registrierungen ein.",[58,508,509,510,512],{},"Lass jedes Formular, das E-Mails verschickt, auf ",[14,511,41],{}," prüfen, eine klare Meldung zeigen und den Knopf zum erneuten Senden 60 Sekunden lang sperren.",[58,514,515],{},"Lass die E-Mail-Bestätigung an und leg nie den Schlüssel eines E-Mail-Anbieters in dein Frontend.",[10,517,518,519,521],{},"Fang mit der Meldung in der fehlgeschlagenen Antwort an, denn sie sagt dir, welches\nder beiden Limits du erreicht hast. Und sobald die E-Mails über deinen eigenen\nAnbieter rausgehen, ",[84,520,411],{"href":410},", um zu prüfen, dass kein\nSchlüssel mitgekommen ist.",{"title":27,"searchDepth":523,"depth":523,"links":524},3,[525,527,528,529,530,531,532,533,534],{"id":46,"depth":526,"text":47},2,{"id":126,"depth":526,"text":127},{"id":214,"depth":526,"text":215},{"id":239,"depth":526,"text":240},{"id":289,"depth":526,"text":290},{"id":355,"depth":526,"text":356},{"id":391,"depth":526,"text":392},{"id":414,"depth":526,"text":415},{"id":477,"depth":526,"text":478},"Sicherheitsgrundlagen","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcover-1200x630.png","Ein Briefmarkenbogen, aus dem jede Marke schon herausgerissen ist, neben einem Stapel verschlossener Umschläge ohne Marke in der Ecke.","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.",false,"md",[542,545,548,551,554,557],{"q":543,"a":544},"Was bedeutet \"email rate limit exceeded\" in Supabase?","Dein Projekt hat in dieser Stunde so viele E-Mails verschickt, wie Supabase Auth erlaubt, also wurde die nächste abgelehnt. Gezählt wird jede E-Mail, die Auth verschickt, an wen auch immer: Bestätigungen nach der Registrierung, Magic Links, Passwort-Resets und Einladungen. Beim eingebauten Absender sind es 2 pro Stunde. Mit einem eigenen SMTP-Anbieter legst du die Zahl selbst fest.",{"q":546,"a":547},"Warum steht da, ich könne es erst nach 0 Sekunden erneut anfordern?","Weil von den 60 Sekunden Wartezeit weniger als eine übrig war. Supabase Auth zählt die Restzeit in ganzen Sekunden und lässt den Rest weg, also lautet die letzte Sekunde 0. Versuch es einen Moment später noch einmal, dann geht die E-Mail raus, solange die Stundengrenze noch Platz hat.",{"q":549,"a":550},"Wie viele E-Mails kann Supabase für mich verschicken?","Beim eingebauten Absender 2 pro Stunde für das ganze Projekt, und nur an Leute in deinem Supabase-Team. Supabase sagt, dass sich diese Zahl ohne Ankündigung ändern kann. Mit einem eigenen SMTP-Anbieter gibt es keine feste Zahl: Supabase beginnt bei 30 pro Stunde, und du erhöhst sie auf der Seite Rate Limits.",{"q":552,"a":553},"Brauche ich einen eigenen SMTP-Anbieter?","Ja, sobald sich irgendjemand außerhalb deines Teams per E-Mail registriert. Der eingebaute Absender lehnt Adressen ab, die nicht in deinem Team sind, und Supabase beschreibt ihn als gedacht zum Ausprobieren, zum Testen von Vorlagen und für Demos. Resend, AWS SES, Postmark, SendGrid, ZeptoMail und Brevo gehören zu den Diensten, die laut Supabase damit funktionieren.",{"q":555,"a":556},"Wie verhindere ich, dass das mein Registrierungsformular kaputt macht?","Prüf den Code am Fehler, bevor irgendetwas auf dem Bildschirm landet. Ist es over_email_send_rate_limit, zeig eine klare Meldung, die bittet, es in einer Minute erneut zu versuchen, und lass den Knopf zum erneuten Senden nach jedem Versand 60 Sekunden lang deaktiviert, damit niemand ihn in die Wartezeit hineindrückt.",{"q":558,"a":559},"Warum bekommen meine Kunden \"Email address not authorized\"?","Weil dein Projekt noch über den eingebauten Absender von Supabase verschickt, der nur an Mitglieder deiner Supabase-Organisation zustellt. Alle anderen werden mit dem Code email_address_not_authorized abgelehnt. Ein eigener SMTP-Anbieter behebt das, und es ist dieselbe Änderung, die auch die Stundengrenze aufhebt.","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcard-800x500.png",[562,563,41,564,565,566,567,568],"email rate limit exceeded supabase","supabase email rate limit exceeded","for security purposes you can only request this after","supabase smtp limit","supabase bestätigungsmail kommt nicht an","supabase magic link wird nicht gesendet","email address not authorized supabase",{},true,"\u002Fblog\u002Fsupabase-email-rate-limit-exceeded","2026-10-20",{"title":5,"description":538},"blog\u002Fsupabase-email-rate-limit-exceeded",[576,577,578],"Supabase \"Email Rate Limit Exceeded\" heißt: Dein Projekt hat in dieser Stunde so viele E-Mails verschickt, wie es darf. Beim eingebauten Absender sind das 2 pro Stunde, und jede Bestätigung nach der Registrierung, jeder Magic Link und jedes Passwort-Reset zählt.","Derselbe Code, over_email_send_rate_limit, kommt auch als \"For security purposes, you can only request this after N seconds\" zurück, eine Wartezeit von 60 Sekunden für eine Adresse. Nur die Meldung unterscheidet die beiden.","Ein eigener SMTP-Anbieter hebt die Stundengrenze auf, sobald du auch das Limit auf der Seite Rate Limits erhöhst, das dort bei 30 pro Stunde beginnt. Die 60 Sekunden bleiben, und dein Formular sollte sie erklären.","854hHdE6igNncVy6vSjvNkLku7APd81JIVnSGIVPepI",[581,587,593,599,605,611,617,623,629,635,641,648,654,660,666,672,678,684,690,696,702,703,708,714,720,726,732,738,744,750,756,762,768,774,780,786,792,798,804,810,815,821,826,832,838,844,849,855,861,867,873,879,885,891,897,903,909,915,921,927,933,939,945,951,957,963,969,975,981,987,993,999,1005,1011,1017,1023,1029,1035,1041,1047,1053,1059,1065,1071,1076,1082,1088,1094,1099,1105],{"path":582,"title":583,"description":584,"published":585,"category":535,"image":586,"draft":539},"\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":588,"title":589,"description":590,"published":591,"category":535,"image":592,"draft":539},"\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":594,"title":595,"description":596,"published":597,"category":535,"image":598,"draft":539},"\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":600,"title":601,"description":602,"published":603,"category":535,"image":604,"draft":539},"\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":606,"title":607,"description":608,"published":609,"category":535,"image":610,"draft":539},"\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":612,"title":613,"description":614,"published":615,"category":535,"image":616,"draft":539},"\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":618,"title":619,"description":620,"published":621,"category":535,"image":622,"draft":539},"\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":624,"title":625,"description":626,"published":627,"category":535,"image":628,"draft":539},"\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":630,"title":631,"description":632,"published":633,"category":535,"image":634,"draft":539},"\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":636,"title":637,"description":638,"published":639,"category":535,"image":640,"draft":539},"\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":642,"title":643,"description":644,"published":645,"category":646,"image":647,"draft":539},"\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":649,"title":650,"description":651,"published":652,"category":535,"image":653,"draft":539},"\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":655,"title":656,"description":657,"published":658,"category":535,"image":659,"draft":539},"\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":661,"title":662,"description":663,"published":664,"category":535,"image":665,"draft":539},"\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":667,"title":668,"description":669,"published":670,"category":535,"image":671,"draft":539},"\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":673,"title":674,"description":675,"published":676,"category":535,"image":677,"draft":539},"\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":679,"title":680,"description":681,"published":682,"category":535,"image":683,"draft":539},"\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":685,"title":686,"description":687,"published":688,"category":535,"image":689,"draft":539},"\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":691,"title":692,"description":693,"published":694,"category":535,"image":695,"draft":539},"\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":697,"title":698,"description":699,"published":700,"category":535,"image":701,"draft":539},"\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":571,"title":5,"description":538,"published":572,"category":535,"image":560,"draft":539},{"path":343,"title":704,"description":705,"published":706,"category":535,"image":707,"draft":539},"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":709,"title":710,"description":711,"published":712,"category":535,"image":713,"draft":539},"\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":715,"title":716,"description":717,"published":718,"category":535,"image":719,"draft":539},"\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":721,"title":722,"description":723,"published":724,"category":535,"image":725,"draft":539},"\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":727,"title":728,"description":729,"published":730,"category":535,"image":731,"draft":539},"\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":733,"title":734,"description":735,"published":736,"category":535,"image":737,"draft":539},"\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":739,"title":740,"description":741,"published":742,"category":535,"image":743,"draft":539},"\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":745,"title":746,"description":747,"published":748,"category":535,"image":749,"draft":539},"\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":751,"title":752,"description":753,"published":754,"category":535,"image":755,"draft":539},"\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":757,"title":758,"description":759,"published":760,"category":535,"image":761,"draft":539},"\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":763,"title":764,"description":765,"published":766,"category":535,"image":767,"draft":539},"\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":769,"title":770,"description":771,"published":772,"category":535,"image":773,"draft":539},"\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":775,"title":776,"description":777,"published":778,"category":535,"image":779,"draft":539},"\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":781,"title":782,"description":783,"published":784,"category":535,"image":785,"draft":539},"\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":787,"title":788,"description":789,"published":790,"category":535,"image":791,"draft":539},"\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":793,"title":794,"description":795,"published":796,"category":535,"image":797,"draft":539},"\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":799,"title":800,"description":801,"published":802,"category":535,"image":803,"draft":539},"\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":805,"title":806,"description":807,"published":808,"category":535,"image":809,"draft":539},"\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":121,"title":811,"description":812,"published":813,"category":535,"image":814,"draft":539},"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":816,"title":817,"description":818,"published":819,"category":535,"image":820,"draft":539},"\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":351,"title":822,"description":823,"published":824,"category":535,"image":825,"draft":539},"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":827,"title":828,"description":829,"published":830,"category":646,"image":831,"draft":539},"\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":833,"title":834,"description":835,"published":836,"category":646,"image":837,"draft":539},"\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":839,"title":840,"description":841,"published":842,"category":646,"image":843,"draft":539},"\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":845,"title":846,"description":847,"published":842,"category":535,"image":848,"draft":539},"\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":850,"title":851,"description":852,"published":853,"category":535,"image":854,"draft":539},"\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":856,"title":857,"description":858,"published":859,"category":535,"image":860,"draft":539},"\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":862,"title":863,"description":864,"published":865,"category":646,"image":866,"draft":539},"\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":868,"title":869,"description":870,"published":871,"category":535,"image":872,"draft":539},"\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":874,"title":875,"description":876,"published":877,"category":535,"image":878,"draft":539},"\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":880,"title":881,"description":882,"published":883,"category":535,"image":884,"draft":539},"\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":886,"title":887,"description":888,"published":889,"category":535,"image":890,"draft":539},"\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":892,"title":893,"description":894,"published":895,"category":535,"image":896,"draft":539},"\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":898,"title":899,"description":900,"published":901,"category":535,"image":902,"draft":539},"\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":904,"title":905,"description":906,"published":907,"category":535,"image":908,"draft":539},"\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":910,"title":911,"description":912,"published":913,"category":535,"image":914,"draft":539},"\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":916,"title":917,"description":918,"published":919,"category":646,"image":920,"draft":539},"\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":922,"title":923,"description":924,"published":925,"category":646,"image":926,"draft":539},"\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":928,"title":929,"description":930,"published":931,"category":646,"image":932,"draft":539},"\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":934,"title":935,"description":936,"published":937,"category":535,"image":938,"draft":539},"\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":940,"title":941,"description":942,"published":943,"category":535,"image":944,"draft":539},"\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":946,"title":947,"description":948,"published":949,"category":535,"image":950,"draft":539},"\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":952,"title":953,"description":954,"published":955,"category":535,"image":956,"draft":539},"\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":958,"title":959,"description":960,"published":961,"category":535,"image":962,"draft":539},"\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":964,"title":965,"description":966,"published":967,"category":535,"image":968,"draft":539},"\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":970,"title":971,"description":972,"published":973,"category":535,"image":974,"draft":539},"\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":976,"title":977,"description":978,"published":979,"category":535,"image":980,"draft":539},"\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":982,"title":983,"description":984,"published":985,"category":535,"image":986,"draft":539},"\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":988,"title":989,"description":990,"published":991,"category":535,"image":992,"draft":539},"\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":994,"title":995,"description":996,"published":997,"category":646,"image":998,"draft":539},"\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":1000,"title":1001,"description":1002,"published":1003,"category":535,"image":1004,"draft":539},"\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":1006,"title":1007,"description":1008,"published":1009,"category":646,"image":1010,"draft":539},"\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":1012,"title":1013,"description":1014,"published":1015,"category":535,"image":1016,"draft":539},"\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":1018,"title":1019,"description":1020,"published":1021,"category":535,"image":1022,"draft":539},"\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":1024,"title":1025,"description":1026,"published":1027,"category":535,"image":1028,"draft":539},"\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":1030,"title":1031,"description":1032,"published":1033,"category":535,"image":1034,"draft":539},"\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":1036,"title":1037,"description":1038,"published":1039,"category":646,"image":1040,"draft":539},"\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":1042,"title":1043,"description":1044,"published":1045,"category":646,"image":1046,"draft":539},"\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":1048,"title":1049,"description":1050,"published":1051,"category":535,"image":1052,"draft":539},"\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":1054,"title":1055,"description":1056,"published":1057,"category":535,"image":1058,"draft":539},"\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":1060,"title":1061,"description":1062,"published":1063,"category":646,"image":1064,"draft":539},"\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":1066,"title":1067,"description":1068,"published":1069,"category":535,"image":1070,"draft":539},"\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":1072,"title":1073,"description":1074,"published":1069,"category":535,"image":1075,"draft":539},"\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":1077,"title":1078,"description":1079,"published":1080,"category":535,"image":1081,"draft":539},"\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":1083,"title":1084,"description":1085,"published":1086,"category":646,"image":1087,"draft":539},"\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":1089,"title":1090,"description":1091,"published":1092,"category":535,"image":1093,"draft":539},"\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":1095,"title":1096,"description":1097,"published":1092,"category":646,"image":1098,"draft":539},"\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":1100,"title":1101,"description":1102,"published":1103,"category":646,"image":1104,"draft":539},"\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":1106,"title":1107,"description":1108,"published":1103,"category":535,"image":1109,"draft":539},"\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",1794213638757]