[{"data":1,"prerenderedAt":1091},["ShallowReactive",2],{"blog-uk-unsupported-provider-provider-is-not-enabled":3,"blog-index-uk":560},{"id":4,"title":5,"body":6,"category":518,"cover":519,"coverAlt":520,"description":521,"draft":522,"extension":523,"faq":524,"image":540,"keywords":541,"meta":548,"navigation":549,"ogTitle":550,"path":551,"published":552,"seo":553,"stem":554,"tldr":555,"updated":552,"__hash__":559},"blog_uk\u002Fblog\u002Funsupported-provider-provider-is-not-enabled.md","Помилка Supabase: \"Unsupported provider: provider is not enabled\"",{"type":7,"value":8,"toc":507},"minimark",[9,13,24,31,38,41,46,49,52,84,87,96,102,106,109,120,124,133,155,170,203,221,224,309,313,316,332,347,361,364,369,373,376,382,405,412,416,419,428,442,451,471,475,495],[10,11,12],"p",{},"Ви додаєте до застосунку кнопку \"Увійти через Google\" і натискаєте її. Замість\nвибору акаунта Google браузер показує ось це:",[14,15,20],"pre",{"className":16,"code":18,"language":19},[17],"language-text","{\"code\":400,\"error_code\":\"validation_failed\",\"msg\":\"Unsupported provider: provider is not enabled\"}\n","text",[21,22,18],"code",{"__ignoreMap":23},"",[10,25,26,27,30],{},"В адресному рядку ваш проєкт Supabase, щось на зразок\n",[21,28,29],{},"https:\u002F\u002Fabcdefghij.supabase.co\u002Fauth\u002Fv1\u002Fauthorize?provider=google&redirect_to=…",".\nВи зробили застосунок у Lovable, Bolt, v0, Cursor, Claude Code чи Replit,\nкнопка прийшла разом із кодом, і в тому коді нічого не схоже на помилку.",[10,32,33,34,37],{},"\"Unsupported provider: provider is not enabled\" означає, що Supabase Auth,\nчастина Supabase, яка впускає людей, має Google вимкненим у проєкті, з яким\nговорить ваш застосунок. Виправлення складається з одного перемикача і двох\nзначень, які дає Google. Після цього Google перевіряє власний список, і саме з\nнього береться наступна помилка, ",[21,35,36],{},"redirect_uri_mismatch",".",[10,39,40],{},"Пастка в цьому другому списку. Адреса, яка здається для нього правильною, це\nадреса вашого власного застосунку, і Google її ніколи не використовує, бо\nGoogle нікого до вашого застосунку не відправляє.",[42,43,45],"h2",{"id":44},"що-означає-unsupported-provider-provider-is-not-enabled","Що означає \"Unsupported provider: provider is not enabled\"?",[10,47,48],{},"Це означає, що Supabase відмовився починати вхід через Google, бо в проєкті, який\nотримав запит, Google вимкнено.",[10,50,51],{},"Вхід через Google це подорож туди й назад через дві рецепції. Ваш застосунок\nвідправляє людину на рецепцію Supabase. Supabase відправляє її на рецепцію\nGoogle, щоб довести, хто вона, Google повертає її до Supabase, а Supabase\nвідправляє додому, у ваш застосунок, уже з виконаним входом. Кожна рецепція\nвідправляє людей лише туди, куди дозволяють її власні налаштування. Це\nповідомлення означає, що на рецепції Supabase віконце Google зачинене.",[10,53,54,55,62,63,66,67,70,71,74,75,78,79,37],{},"У\n",[56,57,61],"a",{"href":58,"rel":59},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fauth\u002Fblob\u002Fmaster\u002Finternal\u002Fapi\u002Fexternal.go",[60],"nofollow","вихідному коді","\nSupabase Auth запит до ",[21,64,65],{},"\u002Fauth\u002Fv1\u002Fauthorize"," спершу шукає провайдера, і будь-яка\nпроблема з ним повертається як 400, з кодом ",[21,68,69],{},"validation_failed"," і\n",[21,72,73],{},"Unsupported provider:"," перед причиною. ",[21,76,77],{},"provider is not enabled"," це\n",[56,80,83],{"href":81,"rel":82},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fauth\u002Fblob\u002Fmaster\u002Finternal\u002Fconf\u002Fconfiguration.go",[60],"перше, що перевіряє цей пошук",[10,85,86],{},"Отже, Google запиту не бачив, і ніщо в консолі Google цього не пояснить. Ваш\nзастосунок помилки теж не бачить: JavaScript-бібліотека Supabase відправляє на\nцю адресу весь браузер, тож сторінка, яка ламається, належить Supabase, а\nконсоль вашого застосунку лишається порожньою.",[10,88,89,90,95],{},"Те саме повідомлення зʼявляється з GitHub, Apple чи будь-яким іншим вимкненим\nпровайдером, і перемикач на тому самому місці. Застосунки на вбудованому бекенді\nLovable налаштовано інакше:\n",[56,91,94],{"href":92,"rel":93},"https:\u002F\u002Fdocs.lovable.dev\u002Ffeatures\u002Fauthentication",[60],"документація з автентифікації","\nLovable описує Google як \"managed by Lovable with no setup, or your own Google\nCloud OAuth credentials.\" Цей допис для застосунків на вашому власному проєкті\nSupabase, хоч би яким інструментом їх зроблено.",[97,98],"diagram",{"alt":99,"caption":100,"src":101},"Браузер виходить із застосунку й доходить до Supabase, де перемикач Google вимкнено. Шлях далі до Google пунктирний і перекреслений, а до браузера повертається 400.","Supabase відповідає раніше, ніж Google про щось питають, тож помилка належить Supabase, і виправляють її в Supabase.","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fwhere-it-stops-1600x760.png",[42,103,105],{"id":104},"чи-це-правильний-проєкт-supabase","Чи це правильний проєкт Supabase?",[10,107,108],{},"Перевірте це, перш ніж щось змінювати, бо сторінка помилки називає проєкт, який\nвідповів.",[10,110,111,112,115,116,119],{},"Адреса на сторінці помилки починається з посилання на ваш проєкт, послідовності\nлітер перед ",[21,113,114],{},".supabase.co",". Відкрийте панель Supabase і погляньте на її власний\nадресний рядок: те саме посилання стоїть після ",[21,117,118],{},"\u002Fproject\u002F",". Якщо вони різні, ваш\nзастосунок говорить з іншим проєктом, наприклад тим, який для вас створив\nбілдер, чи копією, яку ви зробили для тестів. Саме в тому проєкті й треба\nувімкнути Google.",[42,121,123],{"id":122},"як-виправити-unsupported-provider-provider-is-not-enabled","Як виправити \"Unsupported provider: provider is not enabled\"",[10,125,126,127,132],{},"Створіть OAuth-клієнт у Google, а потім увімкніть Google у Supabase з двома\nзначеннями, які він дасть. У\n",[56,128,131],{"href":129,"rel":130},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Fsocial-login\u002Fauth-google",[60],"посібнику Supabase про вхід через Google","\nє всі кроки; ось вони в тому порядку, в якому їх просять дві консолі. Назви\nпунктів наведено англійською, як в обох інтерфейсах.",[10,134,135,139,140,143,144,147,148,151,152,37],{},[136,137,138],"strong",{},"У Supabase спершу скопіюйте URL зворотного виклику."," Перейдіть в\n",[136,141,142],{},"Authentication",", далі ",[136,145,146],{},"Sign In \u002F Providers",", і відкрийте ",[136,149,150],{},"Google",". Там є\nCallback URL із кнопкою копіювання. Він має такий вигляд:\n",[21,153,154],{},"https:\u002F\u002F\u003Cproject-ref>.supabase.co\u002Fauth\u002Fv1\u002Fcallback",[10,156,157,160,161,166,167,37],{},[136,158,159],{},"У Google Cloud створіть клієнт."," На сторінці\n",[56,162,165],{"href":163,"rel":164},"https:\u002F\u002Fconsole.cloud.google.com\u002Fauth\u002Fclients",[60],"Clients"," у Google Auth Platform\nстворіть OAuth client ID типу ",[136,168,169],{},"Web application",[171,172,173,184,190],"ul",{},[174,175,176,177,180,181,37],"li",{},"У ",[136,178,179],{},"Authorized JavaScript origins"," додайте адресу вашого застосунку, наприклад ",[21,182,183],{},"https:\u002F\u002Fyourapp.com",[174,185,176,186,189],{},[136,187,188],{},"Authorized redirect URIs"," вставте URL зворотного виклику, скопійований у Supabase.",[174,191,192,193,196,197,202],{},"Натисніть ",[136,194,195],{},"Create"," і одразу скопіюйте Client ID та Client Secret. ",[56,198,201],{"href":199,"rel":200},"https:\u002F\u002Fsupport.google.com\u002Fcloud\u002Fanswer\u002F15549257",[60],"Довідка Google про OAuth-клієнти"," попереджає: \"you will only be able to view and download the full client secret once, at the time of its creation.\"",[10,204,205,208,209,212,213,216,217,220],{},[136,206,207],{},"Поверніться в Supabase й увімкніть."," Увімкніть ",[136,210,211],{},"Enable Sign in with Google",",\nвставте Client ID у ",[136,214,215],{},"Client IDs",", а секрет у ",[136,218,219],{},"Client Secret (for OAuth)",", і\nзбережіть. Без Client ID панель не збереже Google увімкненим, а от із порожнім\nполем секрету збереже. В описі цього поля сказано, що секрет потрібен для \"the\nOAuth flow on the web\", а кнопка у вебзастосунку саме такий потік і запускає.",[10,222,223],{},"Потім натисніть свою кнопку ще раз. Якщо повідомлення досі починається з\n\"Unsupported provider\", його кінець підкаже, чого бракує:",[225,226,227,243],"table",{},[228,229,230],"thead",{},[231,232,233,237,240],"tr",{},[234,235,236],"th",{},"Повідомлення закінчується на",[234,238,239],{},"Що це означає",[234,241,242],{},"Що змінити",[244,245,246,259,272,289],"tbody",{},[231,247,248,253,256],{},[249,250,251],"td",{},[21,252,77],{},[249,254,255],{},"Google вимкнено в проєкті, який відповів",[249,257,258],{},"Увімкнути його в цьому проєкті",[231,260,261,266,269],{},[249,262,263],{},[21,264,265],{},"missing OAuth client ID",[249,267,268],{},"Google увімкнено без збереженого Client ID",[249,270,271],{},"Вставити Client ID",[231,273,274,279,282],{},[249,275,276],{},[21,277,278],{},"missing OAuth secret",[249,280,281],{},"Google увімкнено, а поле секрету порожнє",[249,283,284,285,288],{},"Вставити секрет або натиснути ",[136,286,287],{},"Add Secret"," на клієнті в Google, якщо секрету у вас уже немає",[231,290,291,296,299],{},[249,292,293],{},[21,294,295],{},"Provider … could not be found",[249,297,298],{},"Ваш код просить провайдера, якого в Supabase немає",[249,300,301,302,305,306],{},"Указати ",[21,303,304],{},"google"," як провайдера в ",[21,307,308],{},"signInWithOAuth",[42,310,312],{"id":311},"чому-далі-google-відповідає-redirect_uri_mismatch","Чому далі Google відповідає redirect_uri_mismatch",[10,314,315],{},"Бо вашого URL зворотного виклику немає в списку клієнта саме в тому вигляді, у\nякому його надсилає Supabase.",[10,317,318,319,321,322,327,328,331],{},"Це друга рецепція. Коли Supabase починає вхід, він передає людину до Google із\nзапискою, куди її повернути: на URL зворотного виклику вашого проєкту. Google\nзвіряє цю записку з ",[136,320,188],{}," клієнта, який ви створили. Його\n",[56,323,326],{"href":324,"rel":325},"https:\u002F\u002Fdevelopers.google.com\u002Fidentity\u002Fprotocols\u002Foauth2\u002Fweb-server",[60],"документація з OAuth","\nописує збій одним рядком: \"The ",[21,329,330],{},"redirect_uri"," passed in the authorization\nrequest does not match an authorized redirect URI for the OAuth client ID.\"",[10,333,334,335,338,339,342,343,346],{},"Збіг має бути точним. На тій самій сторінці сказано: \"the ",[21,336,337],{},"http"," or ",[21,340,341],{},"https","\nscheme, case, and trailing slash ('\u002F') must all match.\" Тож запис, який\nзакінчується на ",[21,344,345],{},"\u002Fauth\u002Fv1\u002Fcallback\u002F",", зі скісною рискою в кінці, не збігається з\nадресою, яку надсилає Supabase.",[10,348,349,352,353,356,357,37],{},[136,350,351],{},"Адреса вашого власного застосунку в цьому списку нічого не робить."," Google\nповертає людей до Supabase, тож єдина адреса, яку він перевіряє, це зворотний\nвиклик Supabase. Адреса вашого застосунку належить до списку іншої рецепції,\nRedirect URLs у Supabase, і саме він вирішує, куди Supabase відправить людей\nнаприкінці. Коли цей список неправильний, люди повертаються з виконаним входом на\n",[21,354,355],{},"localhost:3000",", і\n",[56,358,360],{"href":359},"\u002Fblog\u002Fsupabase-auth-redirects-to-localhost","про це є окремий допис",[10,362,363],{},"Після збереження дайте Google трохи часу. Його довідка про OAuth-клієнти каже:\n\"It may take 5 minutes to a few hours for changes made to these settings to take\neffect.\"",[97,365],{"alt":366,"caption":367,"src":368},"Список Google містить адресу зворотного виклику Supabase і повертає людину до Supabase. Запис з адресою самого застосунку перекреслено. Список Supabase містить адресу застосунку й відправляє людину додому.","Кожна рецепція перевіряє свій список. Списку Google потрібен зворотний виклик Supabase, списку Supabase потрібен ваш застосунок.","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Ftwo-lists-1600x760.png",[42,370,372],{"id":371},"де-місце-client-secret","Де місце Client Secret",[10,374,375],{},"У панелі Supabase, і більше ніде. Коду вашого застосунку він не потрібен\nніколи.",[10,377,378,379,381],{},"Client ID публічний: він їде в адресі сторінки входу Google, де його може\nпрочитати будь-хто. Client Secret доводить Google, що запит іде з вашого боку, і\nв цій схемі він є лише в Supabase. Коли ваш застосунок викликає\n",[21,380,308],{},", бібліотека відправляє браузер до Supabase, і вже Supabase\nAuth говорить із Google, використовуючи секрет.",[10,383,384,385,388,389,392,393,397,398,400,401,404],{},"Тож якщо білдер поклав секрет у код вашого застосунку чи в змінну, назва якої\nпочинається з ",[21,386,387],{},"VITE_"," або ",[21,390,391],{},"NEXT_PUBLIC_",", він є в браузері кожного відвідувача.\n",[56,394,396],{"href":395},"\u002Fblog\u002Fvite-and-next-public-env-vars","Ці змінні публічні за задумом",". Довідка\nGoogle каже про це прямо: \"Never add client secrets directly in your code or\ncheck them into version control systems such as Git or Subversion.\" Замініть\nйого на сторінці клієнта в консолі Google: натисніть ",[136,399,287],{},", вставте\nновий секрет у Supabase, потім ",[136,402,403],{},"Disable"," для старого і видаліть його. Приберіть\nстаре значення і з коду.",[10,406,407,408,37],{},"Щоб перевірити, що ваш робочий застосунок віддає відвідувачам, білдер відкривати\nне треба. Наш безкоштовний скан читає ваш робочий застосунок так, як це робить\nбраузер відвідувача, і повідомляє про секретні ключі, які розпізнає, а також про\nтаблиці, що відповідають будь-кому, і відсутні заголовки. Це займає близько 20\nсекунд і не потребує акаунта: ",[56,409,411],{"href":410},"\u002Fsecurity-scanner","проскануйте свій застосунок",[42,413,415],{"id":414},"як-доглядати-застосунок-у-який-тепер-входять-люди","Як доглядати застосунок, у який тепер входять люди",[10,417,418],{},"Щойно люди входять через Google, їхні облікові записи живуть у вашому проєкті\nSupabase, а застосунок, у який вони входять, змінюється з кожним деплоєм.",[10,420,421],{},[136,422,423,427],{},[56,424,426],{"href":425},"\u002Fwebsite-monitoring","Reeve Monitor"," і далі перевіряє ваш робочий застосунок:",[171,429,430,433,436,439],{},[174,431,432],{},"чи він доступний, кожні 60 секунд",[174,434,435],{},"усі девʼять перевірок щогодини, до трьох застосунків, разом із секретними ключами в коді, який ваш застосунок надсилає відвідувачам",[174,437,438],{},"повідомлення, коли результат змінюється, щоб ключ, який пішов із пізнішим деплоєм, дійшов до вас без того, щоб ви самі йшли дивитися",[174,440,441],{},"щомісячний звіт простою мовою про те, що він бачив",[10,443,444],{},[136,445,446,450],{},[56,447,449],{"href":448},"\u002Fsupabase-backups","Reeve Care"," тримає копію вашої бази даних Supabase разом\nз обліковими записами:",[171,452,453,456,459,462,465,468],{},[174,454,455],{},"зашифрована копія за розкладом, у власному сховищі Reeve в ЄС, поза вашим обліковим записом Supabase",[174,457,458],{},"схема auth, де Supabase тримає кожного користувача й ідентичність Google, з якою він увійшов, щоб вони повернулися разом з усім іншим",[174,460,461],{},"кожна копія перевірена, перш ніж зарахуватися, підрахунком рядків у кожній таблиці",[174,463,464],{},"ваші вивантажені файли теж, щойно ви підключите доступ до Storage",[174,466,467],{},"відновлення в один клік, із безпечною копією поточного стану, зробленою заздалегідь",[174,469,470],{},"усе, що робить Monitor",[42,472,474],{"id":473},"що-зробити-зараз","Що зробити зараз",[476,477,478],"key-takeaways",{},[171,479,480,483,486,489,492],{},[174,481,482],{},"Прочитайте посилання на проєкт на сторінці помилки й увімкніть Google саме в цьому проєкті, в Authentication, Sign In \u002F Providers.",[174,484,485],{},"Створіть у Google клієнт типу Web application, з вашим URL зворотного виклику Supabase в Authorized redirect URIs, точно так, як його показує Supabase.",[174,487,488],{},"Вставте Client ID і Client Secret у розділ Google в Supabase і збережіть.",[174,490,491],{},"Якщо Google відповідає redirect_uri_mismatch, порівняйте дві адреси літера в літеру, а тоді дайте зміні в Google кілька хвилин.",[174,493,494],{},"Тримайте Client Secret лише в Supabase. Якщо він колись потрапив у код вашого застосунку, додайте новий у Google і вимкніть старий.",[10,496,497,498,501,502,506],{},"Якщо люди проходять Google, а потім опиняються не на тій сторінці,\n",[56,499,500],{"href":359},"допис про переспрямування","\nпродовжує звідти. ",[56,503,505],{"href":504},"\u002Fchecklist","10-хвилинний чекліст безпеки"," охоплює, що ще\nпереглянути перед запуском.",{"title":23,"searchDepth":508,"depth":508,"links":509},3,[510,512,513,514,515,516,517],{"id":44,"depth":511,"text":45},2,{"id":104,"depth":511,"text":105},{"id":122,"depth":511,"text":123},{"id":311,"depth":511,"text":312},{"id":371,"depth":511,"text":372},{"id":414,"depth":511,"text":415},{"id":473,"depth":511,"text":474},"Основи безпеки","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcover-1200x630.png","Список налаштувань, з якого висунуто одного провайдера: перемикач вимкнено й обведено бурштиновим, обидва поля для ключів порожні.","\"Unsupported provider: provider is not enabled\": вхід через Google вимкнено у вашому проєкті Supabase. Як увімкнути та виправити redirect_uri_mismatch.",false,"md",[525,528,531,534,537],{"q":526,"a":527},"Чому вхід через Google відкриває сторінку з JSON і validation_failed?","Ваш застосунок відправив браузер на адресу \u002Fauth\u002Fv1\u002Fauthorize вашого проєкту Supabase, і Supabase відповів там, замість того щоб передати людину до Google. На сторінці написано {\"code\":400,\"error_code\":\"validation_failed\",\"msg\":\"Unsupported provider: provider is not enabled\"}. Ваш застосунок цієї відповіді не отримує, тому його консоль нічого не показує. Увімкніть Google в Authentication, Sign In \u002F Providers.",{"q":529,"a":530},"Google увімкнено, а помилка лишилася. Чому?","Найчастіше ваш застосунок говорить з іншим проєктом Supabase, ніж той, який ви змінили. Адреса на сторінці помилки починається з посилання на проєкт, літер перед .supabase.co; порівняйте його з посиланням в адресному рядку вашої панелі. Якщо вони збігаються, прочитайте кінець повідомлення: \"missing OAuth secret\" означає, що поле Client Secret досі порожнє.",{"q":532,"a":533},"Що вписати в Authorized redirect URIs для Supabase?","URL зворотного виклику вашого проєкту, https:\u002F\u002F\u003Cproject-ref>.supabase.co\u002Fauth\u002Fv1\u002Fcallback, скопійований із пункту Google на сторінці Sign In \u002F Providers. Google повертає людей до Supabase, а Supabase відправляє їх до вашого застосунку. Тому адреса вашого застосунку належить до списку Redirect URLs у Supabase.",{"q":535,"a":536},"Чи треба публікувати застосунок у Google або додавати тестових користувачів?","Ні, якщо вхід просить лише імʼя, адресу пошти й профіль, а саме стільки Supabase і просить у Google, доки ваш код не додає scopes. Сторінка Google про аудиторію застосунку каже, що користувачам такого застосунку не треба бути в списку тестових. Попросіть більше, наприклад доступ до Drive, і тестові обмеження почнуть діяти.",{"q":538,"a":539},"У мене власний домен для Supabase. Який URL зворотного виклику потрібен Google?","Обидва. Посібник Supabase про власні домени радить додати зворотний виклик власного домену, наприклад https:\u002F\u002Fapi.example.com\u002Fauth\u002Fv1\u002Fcallback, у консолі провайдера, на додачу до зворотного виклику supabase.co самого проєкту.","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcard-800x500.png",[542,543,544,545,546,547],"unsupported provider provider is not enabled","supabase вхід через google не працює","supabase google login not working","redirect_uri_mismatch supabase","supabase google oauth callback url","supabase увійти через google",{},true,"Помилка Supabase: Unsupported provider: provider is not enabled","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled","2026-11-08",{"title":5,"description":521},"blog\u002Funsupported-provider-provider-is-not-enabled",[556,557,558],"\"Unsupported provider: provider is not enabled\" означає, що в проєкті Supabase, куди ваш застосунок відправив людину, вхід через Google вимкнено. Увімкніть його в Authentication, Sign In \u002F Providers, у тому самому проєкті.","Далі Google перевіряє власний список. URL зворотного виклику Supabase має стояти в Authorized redirect URIs вашого OAuth-клієнта літера в літеру, інакше Google відповідає redirect_uri_mismatch.","Client Secret вводять у панелі Supabase і більше ніде. Коду вашого застосунку він не потрібен ніколи.","SXV_-RZXITtvjRYzA541IhoKlgnAW0aCLtF6wWGk55w",[561,567,568,574,580,586,592,598,603,609,615,622,628,634,640,646,652,658,664,670,676,682,688,694,700,706,712,718,724,730,736,742,748,754,760,766,772,778,784,790,796,802,808,814,820,826,831,837,843,849,855,861,867,873,878,884,890,896,902,908,914,920,926,932,938,944,950,956,962,968,974,980,986,992,998,1004,1010,1016,1022,1028,1034,1040,1046,1052,1057,1063,1069,1075,1080,1086],{"path":562,"title":563,"description":564,"published":565,"category":518,"image":566,"draft":522},"\u002Fblog\u002Fmax-client-connections-reached","Supabase \"max client connections reached\": пояснення","Supabase \"max client connections reached\": у пулера немає місця ще для одного клієнта. Ліміт визначає порт у вашому рядку підключення.","2026-11-09","\u002Fblog\u002Fmax-client-connections-reached\u002Fcard-800x500.png",{"path":551,"title":5,"description":521,"published":552,"category":518,"image":540,"draft":522},{"path":569,"title":570,"description":571,"published":572,"category":518,"image":573,"draft":522},"\u002Fblog\u002Fviolates-foreign-key-constraint","Помилка Supabase \"violates foreign key constraint\" під час вставки","Supabase \"insert or update on table violates foreign key constraint\": ваш рядок посилається на рядок, якого немає. Який, чому і як це виправити.","2026-11-07","\u002Fblog\u002Fviolates-foreign-key-constraint\u002Fcard-800x500.png",{"path":575,"title":576,"description":577,"published":578,"category":518,"image":579,"draft":522},"\u002Fblog\u002Fnull-value-violates-not-null-constraint","Помилка Supabase \"null value in column violates not-null constraint\"","Supabase \"null value in column violates not-null constraint\": обовʼязковий стовпець прийшов порожнім. Звідки взявся null і як це виправити.","2026-11-06","\u002Fblog\u002Fnull-value-violates-not-null-constraint\u002Fcard-800x500.png",{"path":581,"title":582,"description":583,"published":584,"category":518,"image":585,"draft":522},"\u002Fblog\u002Fauth-session-missing","Supabase \"Auth session missing!\": куди поділася сесія","\"Auth session missing!\" означає, що supabase-js не знайшла жодної сесії й навіть не спитала Supabase. Куди поділася сесія і як це виправити.","2026-11-05","\u002Fblog\u002Fauth-session-missing\u002Fcard-800x500.png",{"path":587,"title":588,"description":589,"published":590,"category":518,"image":591,"draft":522},"\u002Fblog\u002Finvalid-claim-missing-sub-claim","Supabase \"invalid claim: missing sub claim\": ніхто не ввійшов","\"invalid claim: missing sub claim\": Supabase Auth отримав справжній токен без жодного користувача, ключ проєкту замість сесії.","2026-11-04","\u002Fblog\u002Finvalid-claim-missing-sub-claim\u002Fcard-800x500.png",{"path":593,"title":594,"description":595,"published":596,"category":518,"image":597,"draft":522},"\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function","\"Failed to send a request to the Edge Function\": справжня причина","\"Failed to send a request to the Edge Function\": браузер не отримав відповіді, яку можна прочитати. Його консоль каже, чому, і чи ваша функція запускалася.","2026-11-03","\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function\u002Fcard-800x500.png",{"path":359,"title":599,"description":600,"published":601,"category":518,"image":602,"draft":522},"Чому Supabase перенаправляє посилання з листів на localhost:3000","Якщо Supabase перенаправляє на localhost:3000, Site URL так і не змінили або вашої адреси немає в Redirect URLs. Як виправити і якої маски уникати.","2026-11-02","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcard-800x500.png",{"path":604,"title":605,"description":606,"published":607,"category":518,"image":608,"draft":522},"\u002Fblog\u002Femail-link-is-invalid-or-has-expired","Supabase \"Email link is invalid or has expired\" на новому посиланні","На посиланні, надісланому хвилину тому, \"Email link is invalid or has expired\" у Supabase зазвичай означає, що поштовий фільтр використав його першим.","2026-11-01","\u002Fblog\u002Femail-link-is-invalid-or-has-expired\u002Fcard-800x500.png",{"path":610,"title":611,"description":612,"published":613,"category":518,"image":614,"draft":522},"\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout","Supabase \"canceling statement due to statement timeout\": пояснення","Supabase \"canceling statement due to statement timeout\": запит перевищив ліміт своєї ролі, 3 секунди для відвідувача. Спершу перевірте політику RLS.","2026-10-31","\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout\u002Fcard-800x500.png",{"path":616,"title":617,"description":618,"published":619,"category":620,"image":621,"draft":522},"\u002Fblog\u002Fdatabase-error-deleting-user","\"Database error deleting user\" у Supabase і що зникає разом","\"Database error deleting user\" у Supabase: ваша база відмовилася видаляти. Причина в логах, а виправлення вирішує, що ще буде видалено.","2026-10-30","Backups","\u002Fblog\u002Fdatabase-error-deleting-user\u002Fcard-800x500.png",{"path":623,"title":624,"description":625,"published":626,"category":518,"image":627,"draft":522},"\u002Fblog\u002Fstripe-webhook-no-signatures-found","\"No signatures found matching the expected signature\" у Supabase","Вебхук Stripe в Edge Function Supabase пише \"No signatures found matching the expected signature\"? Причин дві. Не вимикайте перевірку.","2026-10-29","\u002Fblog\u002Fstripe-webhook-no-signatures-found\u002Fcard-800x500.png",{"path":629,"title":630,"description":631,"published":632,"category":518,"image":633,"draft":522},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" у Supabase: три причини","Supabase відповідає \"Invalid login credentials\" на неправильний пароль, невідому пошту й акаунт Google. Як зрозуміти, що саме.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":635,"title":636,"description":637,"published":638,"category":518,"image":639,"draft":522},"\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code","\"Edge Function returned a non-2xx status code\": справжня помилка","\"Edge Function returned a non-2xx status code\" означає, що ваша функція Supabase відповіла помилкою. Ось де прочитати справжню.","2026-10-27","\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code\u002Fcard-800x500.png",{"path":641,"title":642,"description":643,"published":644,"category":518,"image":645,"draft":522},"\u002Fblog\u002Fcertificate-not-trusted","Сертифікат не довірений: три причини, крім закінчення строку","Сертифікат не довірений, хоча дата в порядку? Він називає іншу адресу, підписав сам себе або в його ланцюжку бракує ланки. Як зрозуміти, що саме.","2026-10-26","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",{"path":647,"title":648,"description":649,"published":650,"category":518,"image":651,"draft":522},"\u002Fblog\u002Finvalid-input-syntax-for-type-uuid","Supabase \"invalid input syntax for type uuid\": що в лапках","Supabase \"invalid input syntax for type uuid\" означає, що застосунок надіслав щось, що не є id. Прочитайте лапки, притримайте запит, залиште колонку.","2026-10-25","\u002Fblog\u002Finvalid-input-syntax-for-type-uuid\u002Fcard-800x500.png",{"path":653,"title":654,"description":655,"published":656,"category":518,"image":657,"draft":522},"\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint","Supabase \"duplicate key value violates unique constraint\": пояснення","Supabase \"duplicate key value violates unique constraint\": значення вже зайняте. Знайдіть стовпець, оберіть виправлення й сховайте значення від очей.","2026-10-24","\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint\u002Fcard-800x500.png",{"path":659,"title":660,"description":661,"published":662,"category":518,"image":663,"draft":522},"\u002Fblog\u002Fsupabase-relation-does-not-exist","Supabase \"relation does not exist\", хоча таблиця на місці","Supabase \"relation does not exist\" або PGRST205: жодна таблиця не має такої назви в цій схемі. Чотири перевірки, і на що зважити, відкриваючи схему.","2026-10-23","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcard-800x500.png",{"path":665,"title":666,"description":667,"published":668,"category":518,"image":669,"draft":522},"\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\" показує назви аргументів, які надіслав ваш застосунок. Порівняйте їх із функцією.","2026-10-22","\u002Fblog\u002Fsupabase-function-not-found\u002Fcard-800x500.png",{"path":671,"title":672,"description":673,"published":674,"category":518,"image":675,"draft":522},"\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\" зазвичай означає, що назва не збігається. Чотири перевірки і рядок для перезавантаження.","2026-10-21","\u002Fblog\u002Fsupabase-schema-cache-column-error\u002Fcard-800x500.png",{"path":677,"title":678,"description":679,"published":680,"category":518,"image":681,"draft":522},"\u002Fblog\u002Fsupabase-email-rate-limit-exceeded","Supabase \"Email Rate Limit Exceeded\": два ліміти, один код помилки","Supabase \"Email Rate Limit Exceeded\" обмежує кожен лист вашого проєкту: 2 на годину з вбудованим відправником. Що враховується і як підняти ліміт.","2026-10-20","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcard-800x500.png",{"path":683,"title":684,"description":685,"published":686,"category":518,"image":687,"draft":522},"\u002Fblog\u002Fsupabase-users-logged-out","Supabase \"Invalid Refresh Token: Refresh Token Not Found\": 3 причини","Supabase \"Invalid Refresh Token: Refresh Token Not Found\" виводить ваших користувачів із системи. Три причини і як лог Auth їх розрізняє.","2026-10-19","\u002Fblog\u002Fsupabase-users-logged-out\u002Fcard-800x500.png",{"path":689,"title":690,"description":691,"published":692,"category":518,"image":693,"draft":522},"\u002Fblog\u002Fpermission-denied-for-schema-public","Supabase \"permission denied for schema public\": три причини","Supabase \"permission denied for schema public\" означає, що бракує GRANT на схему. Що його прибрало і який рядок його повертає.","2026-10-18","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcard-800x500.png",{"path":695,"title":696,"description":697,"published":698,"category":518,"image":699,"draft":522},"\u002Fblog\u002Fsupabase-bucket-not-found","Supabase \"Bucket not found\": три речі, які це може означати","Supabase \"Bucket not found\" означає одне з трьох: публічне посилання на приватний бакет, неточну назву або не той проєкт.","2026-10-17","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",{"path":701,"title":702,"description":703,"published":704,"category":518,"image":705,"draft":522},"\u002Fblog\u002Fsupabase-invalid-jwt","Supabase invalid JWT: який ключ перестав працювати?","Помилка Supabase invalid JWT — це PGRST301: підписаний токен не пройшов перевірку. У новому проєкті йдеться про сесію, а не про ключ API.","2026-10-16","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",{"path":707,"title":708,"description":709,"published":710,"category":518,"image":711,"draft":522},"\u002Fblog\u002Fsupabase-single-row-error","Supabase \"multiple (or no) rows returned\" майже завжди означає нуль","Supabase повертає PGRST116, \"JSON object requested, multiple (or no) rows returned\", коли запит нічого не знайшов. Прихований рядок має вигляд відсутнього.","2026-10-15","\u002Fblog\u002Fsupabase-single-row-error\u002Fcard-800x500.png",{"path":713,"title":714,"description":715,"published":716,"category":518,"image":717,"draft":522},"\u002Fblog\u002Fdatabase-error-saving-new-user","\"Database error saving new user\" у Supabase: де шукати","\"Database error saving new user\" означає, що щось причеплене до вашої реєстрації в Supabase впало. Справжня помилка лежить у ваших логах.","2026-10-14","\u002Fblog\u002Fdatabase-error-saving-new-user\u002Fcard-800x500.png",{"path":719,"title":720,"description":721,"published":722,"category":518,"image":723,"draft":522},"\u002Fblog\u002Fwhat-is-supabase","Що таке Supabase? База даних, яку обрав ваш білдер","Що таке Supabase: база даних, вхід і сховище файлів за вашим застосунком. Supabase тримає сервери, а правила про те, хто читає ваші рядки, ваші.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":725,"title":726,"description":727,"published":728,"category":518,"image":729,"draft":522},"\u002Fblog\u002Faws-access-key-exposed-in-frontend","Відкритий у фронтенді ключ AWS це не те саме, що ключ OpenAI","Ключ доступу AWS, відкритий у вашому фронтенді, читає і пише ваше сховище. Рішення зазвичай presigned URL, а не новий ключ.","2026-10-12","\u002Fblog\u002Faws-access-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":731,"title":732,"description":733,"published":734,"category":518,"image":735,"draft":522},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" при вивантаженні","\"New row violates row-level security policy for table objects\" означає, що вашому вивантаженню бракує правила insert. Публічний бакет його не додає.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":737,"title":738,"description":739,"published":740,"category":518,"image":741,"draft":522},"\u002Fblog\u002Fbase44-security-scan","Сканування безпеки Base44: те, що бачить лише воно","Сканування безпеки Base44 перевіряє сім видів проблем зсередини. Ось половина, яку читає тільки воно, і половина, на яку воно ніколи не дивиться.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":743,"title":744,"description":745,"published":746,"category":518,"image":747,"draft":522},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Ваш API-ключ витік. Порядок дій","API-ключ витік, і ви не знаєте, що робити першим. Не кожен ключ у вашому фронтенді є витоком, а порядок важить більше за швидкість.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":749,"title":750,"description":751,"published":752,"category":518,"image":753,"draft":522},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" без вимкнення RLS","\"Infinite recursion detected in policy for relation\" означає, що ваша policy запитала таблицю, яку вона захищає. Ось як розірвати коло.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":755,"title":756,"description":757,"published":758,"category":518,"image":759,"draft":522},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" у Supabase, і хибне виправлення","\"No API key found in request\" означає, що запит дійшов до Supabase без ключа. Більшість відповідей натомість вказують на правила вашої бази.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":761,"title":762,"description":763,"published":764,"category":518,"image":765,"draft":522},"\u002Fblog\u002Fis-base44-safe","Чи безпечний Base44? Дані 5 442 застосунків","Чи безпечний Base44? Ми прогнали дев’ять перевірок на 5 442 робочих застосунках Base44. Майже всі отримали B з причин, яких власник ніколи не обирав.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":767,"title":768,"description":769,"published":770,"category":518,"image":771,"draft":522},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Сховати ключ API: перенесіть його в Supabase Edge Function","Сховати ключ API означає прибрати його з браузера, а Supabase Edge Function це найменше місце, куди його покласти. Два кроки поруч важать більше.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":773,"title":774,"description":775,"published":776,"category":518,"image":777,"draft":522},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Чи відкритий ваш файл .env? Дванадцять шляхів для перевірки","Чи відкритий ваш файл .env на вашому власному вебсервері? Дванадцять адрес скажуть це за хвилину, а влучання означає, що все в ньому вже публічне.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":779,"title":780,"description":781,"published":782,"category":518,"image":783,"draft":522},"\u002Fblog\u002Fis-v0-safe","Безпека v0: усі 1 790 просканованих застосунків v0 отримали A","Безпека v0 на 1 790 живих застосунках v0: усі отримали A. Лише 17 згадували базу даних, і саме це здебільшого вимірює оцінка A.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":785,"title":786,"description":787,"published":788,"category":518,"image":789,"draft":522},"\u002Fblog\u002Fis-bolt-safe","Чи безпечний Bolt? Що показали 1 123 застосунки Bolt","Чи безпечний Bolt? Ми прогнали 1 123 живі застосунки Bolt через дев’ять перевірок. Хостинг був чистим. Знахідки: ключі й відкриті таблиці в самих застосунках.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":791,"title":792,"description":793,"published":794,"category":518,"image":795,"draft":522},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase не працює чи проблема у вашому застосунку? Як розрізнити","Supabase не працює чи зламався ваш застосунок? Пауза, повна база й ваша власна помилка виглядають однаково. Чотири перевірки їх розрізняють.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":797,"title":798,"description":799,"published":800,"category":518,"image":801,"draft":522},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Чи шифрує Supabase мої дані? Так. Ось від чого це захищає","Чи шифрує Supabase дані? Так: AES-256 у стані спокою, TLS під час передавання, SOC 2 та ISO 27001. Що покриває кожне і який витік не зупиняє жодне.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":803,"title":804,"description":805,"published":806,"category":518,"image":807,"draft":522},"\u002Fblog\u002Fsupabase-free-plan-limits","Ліміти безкоштовного тарифу Supabase і що стається на кожному","Ліміти безкоштовного тарифу Supabase: 500 МБ бази, 5 ГБ egress і жодних резервних копій. Що стається на кожній межі і що змінює Pro за $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":809,"title":810,"description":811,"published":812,"category":620,"image":813,"draft":522},"\u002Fblog\u002Ftest-your-supabase-backup","Перевірте резервну копію Supabase до того, як вона знадобиться","Як перевірити резервну копію Supabase: відновити в тестовий проєкт, порахувати рядки, увійти й знайти рядок, якого бракує обрізаному файлу.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":815,"title":816,"description":817,"published":818,"category":620,"image":819,"draft":522},"\u002Fblog\u002Fsupabase-backup-github-action","Безкоштовна резервна копія Supabase через GitHub Action і підступ","Резервна копія Supabase через GitHub Action безкоштовна й годиться багатьом застосункам. Робочий процес, потрібний рядок підключення та egress.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":821,"title":822,"description":823,"published":824,"category":620,"image":825,"draft":522},"\u002Fblog\u002Fdownload-your-supabase-backup","Чому ви не можете завантажити резервну копію Supabase","Завантажити резервну копію Supabase на сучасному проєкті не вийде: щоденна копія там фізична. Як це перевірити і як тримати власну копію.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":827,"title":828,"description":829,"published":824,"category":518,"image":830,"draft":522},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": бракує GRANT","З 30 жовтня нова таблиця в Supabase відповідає \"permission denied for table\", доки ви не дасте доступ. Лист показує лише половину виправлення.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":832,"title":833,"description":834,"published":835,"category":518,"image":836,"draft":522},"\u002Fblog\u002Fopen-api-endpoint-exposed","Чи є відкритий API-ендпоінт проблемою безпеки? Читайте JSON","Ваше сканування позначило відкритий API-ендпоінт. Чи це важливо, залежить від того, що повернулося, і більшість знайдених належали платформі.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":838,"title":839,"description":840,"published":841,"category":518,"image":842,"draft":522},"\u002Fblog\u002Flovable-security-scan","Сканування безпеки Lovable: чого воно не доведе","Сканування безпеки Lovable: що перевіряють Quick scan і Deep scan, коли запускається кожне, і єдине, чого не доведе жодне сканування зсередини.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":844,"title":845,"description":846,"published":847,"category":620,"image":848,"draft":522},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":850,"title":851,"description":852,"published":853,"category":518,"image":854,"draft":522},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":856,"title":857,"description":858,"published":859,"category":518,"image":860,"draft":522},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":862,"title":863,"description":864,"published":865,"category":518,"image":866,"draft":522},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":868,"title":869,"description":870,"published":871,"category":518,"image":872,"draft":522},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":395,"title":874,"description":875,"published":876,"category":518,"image":877,"draft":522},"Змінні оточення Vite відкриті: префікс означає опублікувати це","Змінні оточення Vite відкриті у вашому застосунку, бо так просив префікс. VITE_ і NEXT_PUBLIC_ означають опублікувати це, а ШІ, який їх додав, не знав ціни.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":879,"title":880,"description":881,"published":882,"category":518,"image":883,"draft":522},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":885,"title":886,"description":887,"published":888,"category":518,"image":889,"draft":522},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":891,"title":892,"description":893,"published":894,"category":518,"image":895,"draft":522},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":897,"title":898,"description":899,"published":900,"category":620,"image":901,"draft":522},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":903,"title":904,"description":905,"published":906,"category":620,"image":907,"draft":522},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery у Supabase: ціна та межі","Point-in-time recovery у Supabase відмотує базу на будь-яку секунду за останній тиждень. Коштує $100 на місяць понад Pro і покриває лише базу даних.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":909,"title":910,"description":911,"published":912,"category":620,"image":913,"draft":522},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":915,"title":916,"description":917,"published":918,"category":518,"image":919,"draft":522},"\u002Fblog\u002Fsafest-ai-app-builder","Який білдер застосунків з ШІ найбезпечніший? 30 998 тестів","Який білдер застосунків з ШІ найбезпечніший? Ми просканували 30 998 живих застосунків з Lovable, Base44, Replit, v0 і Bolt. Оцінку вирішує не білдер.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":921,"title":922,"description":923,"published":924,"category":518,"image":925,"draft":522},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Увімкніть Row Level Security на кожній таблиці Supabase і перевірте","Row Level Security у Supabase без політики закриває таблицю повністю. Політика без увімкненого перемикача не робить нічого. Ось SQL, і ось перевірка.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":927,"title":928,"description":929,"published":930,"category":518,"image":931,"draft":522},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": чого не бачить попередження","Supabase позначає \"RLS disabled in public\" як помилку. Про політику читання, яка лишає вашу таблицю так само відкритою, він не каже нічого.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":933,"title":934,"description":935,"published":936,"category":518,"image":937,"draft":522},"\u002Fblog\u002Frotate-supabase-service-role-key","Як замінити злитий ключ service_role у Supabase","Supabase каже спершу закрити витік. Інші посібники кажуть міняти негайно. Що правильно, залежить від того, куди саме потрапив ваш ключ service_role.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":939,"title":940,"description":941,"published":942,"category":518,"image":943,"draft":522},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Вісім інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":945,"title":946,"description":947,"published":948,"category":518,"image":949,"draft":522},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":951,"title":952,"description":953,"published":954,"category":518,"image":955,"draft":522},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":957,"title":958,"description":959,"published":960,"category":518,"image":961,"draft":522},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":963,"title":964,"description":965,"published":966,"category":518,"image":967,"draft":522},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Ваш ключ API OpenAI відкритий у фронтенді. Замініть його.","Ключ API OpenAI, відкритий у фронтенді, не можна прив'язати до домену. Замініть його сьогодні, перенесіть виклик на свій сервер і обмежте витрати.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":969,"title":970,"description":971,"published":972,"category":518,"image":973,"draft":522},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Ключ API у фронтенді: що насправді віддають 30 998 застосунків","Ключ API, відкритий у вашому фронтенді, зазвичай є ключем Google Maps. Ми просканували 30 998 vibe-coded застосунків і порахували, що витікає насправді.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":975,"title":976,"description":977,"published":978,"category":620,"image":979,"draft":522},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":981,"title":982,"description":983,"published":984,"category":518,"image":985,"draft":522},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":987,"title":988,"description":989,"published":990,"category":620,"image":991,"draft":522},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":993,"title":994,"description":995,"published":996,"category":518,"image":997,"draft":522},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":999,"title":1000,"description":1001,"published":1002,"category":518,"image":1003,"draft":522},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Де знайти API-ключі Supabase: anon, service_role і URL","URL проєкту, ключ anon і ключ service_role лежать на одній сторінці панелі. Ось де вона, і яке з чотирьох значень має бути у вашому застосунку.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":1005,"title":1006,"description":1007,"published":1008,"category":518,"image":1009,"draft":522},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy в Supabase. Що далі?","\"New row violates row-level security policy\" означає, що Supabase відмовив у записі. Швидке виправлення знову відкриває таблицю для всіх.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":1011,"title":1012,"description":1013,"published":1014,"category":518,"image":1015,"draft":522},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":1017,"title":1018,"description":1019,"published":1020,"category":620,"image":1021,"draft":522},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Branching у Supabase це не бекап. Він іде тільки вперед.","Чому branching у Supabase це не бекап: гілка стартує без ваших даних, а мердж переносить саму лише схему. Для чого він потрібен і що брати замість нього.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":1023,"title":1024,"description":1025,"published":1026,"category":620,"image":1027,"draft":522},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":1029,"title":1030,"description":1031,"published":1032,"category":518,"image":1033,"draft":522},"\u002Fblog\u002Fsupabase-storage-bucket-public","Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":1035,"title":1036,"description":1037,"published":1038,"category":518,"image":1039,"draft":522},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Чи є проблемою ключ API Google у вашому браузері?","Ключ API Google у відкритому коді сторінки наш сканер знаходить найчастіше, і зазвичай усе гаразд. Вирішує це одне безкоштовне налаштування.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":1041,"title":1042,"description":1043,"published":1044,"category":620,"image":1045,"draft":522},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":1047,"title":1048,"description":1049,"published":1050,"category":518,"image":1051,"draft":522},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Чи може будь-хто прочитати вашу базу Supabase? 3 680 застосунків","Чи може будь-хто прочитати вашу базу даних Supabase без входу? Ми просканували 30 998 живих застосунків, зроблених ШІ-білдерами, і виміряли, як часто так.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":1053,"title":1054,"description":1055,"published":1050,"category":518,"image":1056,"draft":522},"\u002Fblog\u002Fsource-maps-exposed-in-production","Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":1058,"title":1059,"description":1060,"published":1061,"category":518,"image":1062,"draft":522},"\u002Fblog\u002Fsupabase-new-api-keys","Supabase publishable key: це той самий anon key?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":1064,"title":1065,"description":1066,"published":1067,"category":620,"image":1068,"draft":522},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":1070,"title":1071,"description":1072,"published":1073,"category":518,"image":1074,"draft":522},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security увімкнено. Таблиця досі публічна.","Увімкнути Supabase Row Level Security не означає захистити таблицю. Захищають політики, а та, що полагодила застосунок, часто впускає всіх.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":1076,"title":1077,"description":1078,"published":1073,"category":620,"image":1079,"draft":522},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":1081,"title":1082,"description":1083,"published":1084,"category":620,"image":1085,"draft":522},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Три способи зробити резервну копію бази Supabase, і чого бракує","Панель, pg_dump і керований сервіс. Що насправді зберігає кожен спосіб, що тихо лишає осторонь і який із них переживе втрату акаунта.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":1087,"title":1088,"description":1089,"published":1084,"category":518,"image":1090,"draft":522},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Які API-ключі безпечні у браузері, а які ні","Ваш ключ anon у Supabase створений, щоб бути публічним. Ключ service_role для цього не створений, і він ігнорує всі правила, які ви задали. Як їх розрізнити.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1794213654131]