[{"data":1,"prerenderedAt":897},["ShallowReactive",2],{"blog-uk-supabase-permission-denied-for-table":3,"blog-index-uk":546},{"id":4,"title":5,"body":6,"category":505,"cover":506,"coverAlt":507,"description":508,"draft":509,"extension":510,"faq":511,"image":526,"keywords":527,"meta":534,"navigation":535,"ogTitle":536,"path":537,"published":538,"seo":539,"stem":540,"tldr":541,"updated":538,"__hash__":545},"blog_uk\u002Fblog\u002Fsupabase-permission-denied-for-table.md","Supabase \"permission denied for table\": бракує GRANT",{"type":7,"value":8,"toc":493},"minimark",[9,18,26,31,34,57,60,70,73,76,80,87,107,151,154,160,163,202,206,209,216,225,229,232,238,241,247,262,267,274,278,281,297,300,351,355,358,366,369,393,397,402,436,443,447,486],[10,11,12,13,17],"p",{},"Якщо ваш застосунок працює на Supabase, ви, мабуть, уже отримали лист про 30\nжовтня. У ньому сказано, що для таблиць, які у вас уже є, нічого не змінюється,\nа потім вам дають три команди SQL. Або вже листопад: ви попросили Lovable, Bolt\nчи Cursor про нову функцію, новий екран відкрився порожнім, а десь у консолі\nлежить повідомлення ",[14,15,16],"code",{},"permission denied for table",". І те, і те стосується однієї\nзміни в Supabase, просто з різних боків від дати.",[10,19,20,21,25],{},"Ось чого лист не каже: ",[22,23,24],"strong",{},"SQL, який він показує, це половина виправлення.","\nВиконайте цю половину окремо, на не тій таблиці, і застосунок знову запрацює, а\nнова таблиця тим часом віддаватиме свої рядки кожному, хто попросить.",[27,28,30],"h2",{"id":29},"що-означає-permission-denied-for-table-у-supabase","Що означає \"permission denied for table\" у Supabase?",[10,32,33],{},"Це означає, що тип відвідувача, від якого прийшов запит, узагалі не отримав\nдоступу до цієї таблиці, тож база відмовила ще до того, як подивилася бодай на\nодин рядок.",[10,35,36,37,40,41,44,45,48,49,52,53,56],{},"Supabase відносить кожен запит до певної ",[22,38,39],{},"ролі",", тобто до типу відвідувача,\nвід якого він прийшов. ",[14,42,43],{},"anon"," означає когось, хто не увійшов. ",[14,46,47],{},"authenticated","\nозначає когось, хто увійшов. ",[14,50,51],{},"service_role"," означає ваш власний серверний код із\nсекретним ключем. ",[22,54,55],{},"GRANT"," це команда, яка дає одній із цих ролей доступ до\nоднієї таблиці в Postgres, базі даних, на якій працює Supabase. Немає GRANT,\nнемає доступу, хоч би що ще ви написали.",[10,58,59],{},"Коли GRANT бракує, Supabase відповідає ось так, зазвичай як 401 або 403:",[61,62,67],"pre",{"className":63,"code":65,"language":66},[64],"language-text","{\n  \"code\": \"42501\",\n  \"message\": \"permission denied for table comments\",\n  \"hint\": \"Grant the required privileges to the current role with: GRANT SELECT ON public.comments TO anon;\"\n}\n","text",[14,68,65],{"__ignoreMap":69},"",[10,71,72],{},"Найкорисніша тут підказка. Вона називає роль, якій відмовили, і точну команду,\nяка б її впустила.",[10,74,75],{},"Уявіть кожну таблицю як кімнату. GRANT це двері, і для кожної ролі двері окремі.\nRow Level Security, правила для окремих рядків, які ви, можливо, вже бачили,\nвирішує, які шухляди відвідувач може відкрити, коли вже зайшов. \"Permission\ndenied for table\" означає, що хтось стоїть перед зачиненими дверима. До ваших\nправил він так і не дійшов.",[27,77,79],{"id":78},"що-зміниться-30-жовтня","Що зміниться 30 жовтня?",[10,81,82,83,86],{},"Нові таблиці в схемі ",[14,84,85],{},"public",", тобто в теці з таблицями, яку ваш конструктор\nвикористовує, якщо йому не сказати інакше, почнуть зʼявлятися із зачиненими\nдверима.",[10,88,89,90,92,93,95,96,98,99,106],{},"Досі Supabase відчиняв усі три двері кожної нової таблиці автоматично: читання,\nдодавання, зміну й видалення для ",[14,91,43],{},", ",[14,94,47],{}," і ",[14,97,51],{},"\nоднаково. Таблиця ставала досяжною для вашого застосунку щойно зʼявлялася, і\nміж незнайомцем та її рядками стояли лише ваші правила Row Level Security.\n",[100,101,105],"a",{"href":102,"rel":103},"https:\u002F\u002Fsupabase.com\u002Fchangelog\u002F45329-breaking-change-tables-not-exposed-to-data-and-graphql-api-automatically",[104],"nofollow","Changelog","\nSupabase прямо пояснює причину: агенти й платформи зі ШІ тепер створюють\nтаблиці так, що зміну ніхто не переглядає, а автоматичні гранти відкривали\nтаблиці, які \"a developer forgot to protect\", тобто розробник забув захистити.",[108,109,110,123],"table",{},[111,112,113],"thead",{},[114,115,116,120],"tr",{},[117,118,119],"th",{},"Дата",[117,121,122],{},"Що сталося або станеться",[124,125,126,135,143],"tbody",{},[114,127,128,132],{},[129,130,131],"td",{},"28 квітня 2026",[129,133,134],{},"Нові проєкти отримали змогу відмовитися від автоматичних грантів під час створення.",[114,136,137,140],{},[129,138,139],{},"30 травня 2026",[129,141,142],{},"Відсутність автоматичних грантів почала ставати типовою для нових проєктів.",[114,144,145,148],{},[129,146,147],{},"30 жовтня 2026",[129,149,150],{},"Наявні проєкти теж перестають їх отримувати.",[10,152,153],{},"Якщо ваш проєкт створено після кінця травня, він, можливо, вже так і працює, бо\nSupabase поширював нову типову поведінку на нові проєкти протягом кількох тижнів\nпісля цієї дати.",[155,156],"diagram",{"alt":157,"caption":158,"src":159},"Часова шкала з позначкою 2026-10-30. До неї три таблиці стоять із відчиненими дверима: у двох над рядками висить замок, у третьої замка немає, і її рядки бурштинові. Після позначки дві нові таблиці стоять із зачиненими дверима.","Таблиці, що існують на 30 жовтня, зберігають свої двері, зокрема й ту, що була відчинена для незнайомців. Із зачиненими дверима починають лише таблиці, створені після цієї дати.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fbefore-and-after-october-30-1600x620.png",[10,161,162],{},"Три деталі варто знати ще до цієї дати:",[164,165,166,184,196],"ul",{},[167,168,169,175,176,179,180,183],"li",{},[22,170,171,172,174],{},"Лише схема ",[14,173,85],{},"."," Storage і вхід тримають свої таблиці в окремих\nсхемах, ",[14,177,178],{},"storage"," та ",[14,181,182],{},"auth",", і Supabase каже, що їхні гранти й типові\nналаштування лишаються як є.",[167,185,186,189,190,192,193,195],{},[22,187,188],{},"Секретному ключу теж відмовлять."," Автоматичні гранти покривали й\n",[14,191,51],{},", тож edge function (серверний код, який Supabase запускає для\nвас) із вашим секретним ключем отримає ту саму помилку на новій таблиці, доки\n",[14,194,51],{}," не матиме власного GRANT.",[167,197,198,201],{},[22,199,200],{},"Таблиця, яку видалили й створили знову, це нова таблиця."," Гранти належать\nсамій таблиці й зникають разом із нею, коли її видаляють. Якщо ваш конструктор\nперебудовує таблицю, щоб її змінити, перебудована починає із зачиненими\nдверима.",[27,203,205],{"id":204},"чи-зламається-мій-застосунок-30-жовтня","Чи зламається мій застосунок 30 жовтня?",[10,207,208],{},"Не того дня. Він зламається, коли щось уперше створить нову таблицю й не\nстворить разом із нею GRANT.",[10,210,211,212,215],{},"Для більшості читачів це щось і є конструктор. Ви просите розділ коментарів.\nКонструктор пише міграцію, тобто файл змін у базі, який він запускає за вас, і\nміграція створює таблицю ",[14,213,214],{},"comments",". Якщо він пише й гранти, цієї помилки ви не\nпобачите ніколи. Якщо ні, екран коментарів нічого не показує, або коментар не\nзберігається, або зʼявляється червоне повідомлення, залежно від того, як ваш\nзастосунок обробляє помилки. Усі екрани, які у вас уже були, працюють далі.",[10,217,218,219,224],{},"Supabase публікує ",[100,220,223],{"href":221,"rel":222},"https:\u002F\u002Fsupabase.com\u002Fblog\u002Fsupabase-agent-skills",[104],"agent skill","\nдля інструментів програмування зі ШІ, і в ньому є крок із GRANT. Чи\nкористується ним ваш конструктор, вирішує сам конструктор, тож безпечніше\nвважати, що наступна таблиця, яку він створить, може зʼявитися із зачиненими\nдверима.",[27,226,228],{"id":227},"чи-безпечно-виконати-grant-із-помилки","Чи безпечно виконати GRANT із помилки?",[10,230,231],{},"Лише тоді, коли в таблиці увімкнено Row Level Security і для неї написано\nправило. GRANT вирішує, хто пройде у двері. Які шухляди відвідувач відкриє, він\nне вирішує жодним чином.",[10,233,234,235,237],{},"Ключ, яким ваш застосунок робить запити до Supabase, їде всередині застосунку,\nтож GRANT для ",[14,236,43],{}," означає, що будь-який відвідувач, увійшов він чи ні, тепер\nможе просити в цієї таблиці рядки. Коли правило є, він отримає ті рядки, які\nвоно дозволяє. Коли Row Level Security вимкнено, він отримає кожен рядок\nтаблиці, і у вашому застосунку нічого не виглядатиме інакше.",[10,239,240],{},"Лист показує три гранти й на цьому зупиняється. Changelog самого Supabase\nпоказує три кроки й радить виконувати їх як одне ціле (\"treat these three steps\nas a unit\"):",[61,242,245],{"className":243,"code":244,"language":66},[64],"-- 1. хто може дістатися таблиці\ngrant select on public.orders to authenticated;\ngrant select, insert, update, delete on public.orders to service_role;\n\n-- 2. увімкнути правила для рядків\nalter table public.orders enable row level security;\n\n-- 3. саме правило\ncreate policy \"Customers read their own orders\"\n  on public.orders\n  for select\n  to authenticated\n  using (auth.uid() = user_id);\n",[14,246,244],{"__ignoreMap":69},[10,248,249,250,252,253,258,259,261],{},"Рядка для ",[14,251,43],{}," у цьому прикладі немає, і так задумано. Ніхто без входу не має\nдіставатися таблиці замовлень, тож двері для незнайомців лишаються зачиненими, а\nпокупці, які увійшли, отримують лише читання, потрібне їхньому екрану. Далі\nправило звужує це до їхніх власних рядків. Supabase і сам радить\n",[100,254,257],{"href":255,"rel":256},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fapi\u002Fsecuring-your-api",[104],"давати кожній ролі мінімум, який їй потрібен",".\nGRANT для ",[14,260,43],{}," доречний на таблиці, чиї рядки призначені для всіх, наприклад\nна коментарях під публічним дописом.",[155,263],{"alt":264,"caption":265,"src":266},"Три доріжки, у кожній запит від anon іде до тієї самої таблиці. У першій двері зачинені, стрілка зупиняється перед ними, поруч код 42501. У другій двері відчинені, стрілка зупиняється на смузі Row Level Security, і два рядки таблиці підсвічуються. У третій двері відчинені, смуга лише пунктирний контур, і всі рядки підсвічуються бурштиновим.","GRANT вирішує, чи запит дістанеться таблиці. Правила за ним вирішують, скільки він забере. Відчинені двері без правил за ними віддають усю таблицю.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fthe-door-and-the-rules-1600x760.png",[10,268,269,270,174],{},"Якщо хочете побачити, по який бік цієї картинки стоять ваші таблиці, наше\nбезкоштовне сканування ставить вашому живому застосунку те саме питання, яке\nпоставив би незнайомець, рахує рядки, які той отримав би, не завантажуючи\nжодного, і займає близько 20 секунд без облікового запису:\n",[100,271,273],{"href":272},"\u002Fsecurity-scanner","просканувати застосунок",[27,275,277],{"id":276},"чому-виправлення-row-level-security-не-діють-на-цю-помилку","Чому виправлення Row Level Security не діють на цю помилку",[10,279,280],{},"Бо GRANT перевіряють першим. Запит, якому відмовили на дверях, ніколи не\nдоходить до ваших правил, тож зміна правил нічого в помилці не змінює.",[10,282,283,284,287,288,292,293,296],{},"Це важливо, бо код у них спільний. ",[14,285,286],{},"42501"," Postgres повертає й тоді, коли Row\nLevel Security відмовляє у збереженні, як у випадку\n",[100,289,291],{"href":290},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","new row violates row-level security policy",".\nАсистент, який орієнтується лише на код, може взятися за виправлення від тієї\nпомилки: вимкнути Row Level Security або додати правило з ",[14,294,295],{},"using (true)",", яке\nпропускає всіх. Жодне з них цієї помилки не прибере. Обидва лишаться і після\nтого, як GRANT нарешті зʼявиться, і тоді двері відчинені до шухляд без замків.",[10,298,299],{},"Слова в повідомленні розрізняють ці два випадки, хоча число їх не розрізняє:",[108,301,302,315],{},[111,303,304],{},[114,305,306,309,312],{},[117,307,308],{},"Повідомлення каже",[117,310,311],{},"Що саме відмовило",[117,313,314],{},"Що це виправляє",[124,316,317,329,341],{},[114,318,319,323,326],{},[129,320,321],{},[14,322,16],{},[129,324,325],{},"двері (GRANT)",[129,327,328],{},"GRANT для ролі, яку називає підказка",[114,330,331,335,338],{},[129,332,333],{},[14,334,291],{},[129,336,337],{},"правила",[129,339,340],{},"політика, яка дозволяє цей рядок",[114,342,343,346,348],{},[129,344,345],{},"помилки немає, а список порожній",[129,347,337],{},[129,349,350],{},"політика читання для цієї ролі",[27,352,354],{"id":353},"чого-30-жовтня-не-виправить","Чого 30 жовтня не виправить",[10,356,357],{},"Жодної таблиці, яка у вас уже є. Кожна зберігає рівно той доступ, що має\nсьогодні, зокрема й таблиця, яку незнайомець може прочитати просто зараз.",[10,359,360,361,365],{},"Зміна стосується таблиць, яких ще немає. Досі кожна нова таблиця зʼявлялася з\nвідчиненими дверима, тож у застосунку, зробленому до 30 жовтня, може бути така,\nде замків ніхто так і не поставив: Row Level Security ніколи не вмикали або\n",[100,362,364],{"href":363},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","увімкнули з правилом, яке впускає всіх",".\nПісля 30 жовтня ці кімнати лишаються рівно такими, як були.",[10,367,368],{},"Три місця показують, де ви зараз:",[370,371,372,378,384],"ol",{},[167,373,374,377],{},[22,375,376],{},"Сторінка налаштувань Data API",", на яку веде посилання в листі. У дашборді\nвона в розділі Integrations, далі Data API, і там видно, які з ваших таблиць\nузагалі досяжні.",[167,379,380,383],{},[22,381,382],{},"Security Advisor",", який, за словами Supabase, перелічує таблиці, які варто\nпереглянути до зміни.",[167,385,386,389,390,174],{},[22,387,388],{},"Погляд ззовні."," Жодне з перших двох місць не каже, що саме отримує\nнезнайомець. Для цього треба спитати ваш живий застосунок так, як спитав би\nнезнайомець, і\n",[100,391,392],{"href":272},"саме це робить наше сканування",[27,394,396],{"id":395},"як-reeve-стежить-за-таблицями-які-ви-додаєте","Як Reeve стежить за таблицями, які ви додаєте",[10,398,399],{},[22,400,401],{},"Після 30 жовтня кожна таблиця, яку додає ваш конструктор, це нове рішення про\nте, хто пройде у двері. Reeve перевіряє відповідь ззовні, а Monitor перевіряє її\nй далі.",[164,403,404,412,422],{},[167,405,406,409,410,174],{},[22,407,408],{},"Безкоштовне сканування"," питає в кожної таблиці, яку згадує ваш застосунок,\nскільки рядків отримав би відвідувач без входу, читає це число й на цьому\nзупиняється, не завантажуючи жодного рядка. Близько 20 секунд, без облікового\nзапису: ",[100,411,273],{"href":272},[167,413,414,417,418,421],{},[22,415,416],{},"Reeve Monitor"," запускає всі девʼять перевірок щогодини для трьох\nзастосунків максимум і пише вам листа того дня, коли ваша оцінка ",[22,419,420],{},"гіршає",",\nтож деплой, який щось відчинив, не чекатиме, поки ви самі прийдете подивитися.",[167,423,424,427,428,431,432,174],{},[22,425,426],{},"Care"," запускає ті самі перевірки й зберігає зашифровану копію вашої бази\n",[22,429,430],{},"Supabase"," поза вашим обліковим записом Supabase, тож якщо виправлення від\nасистента перебудує таблицю, буде копія, до якої можна повернутися.\n",[100,433,435],{"href":434},"\u002Fsupabase-backups","Як копію створюють і повертають",[10,437,438,439,174],{},"Що входить у кожен тариф, написано на ",[100,440,442],{"href":441},"\u002Fpricing","сторінці цін",[27,444,446],{"id":445},"що-зробити-до-30-жовтня","Що зробити до 30 жовтня",[448,449,450],"key-takeaways",{},[164,451,452,455,462,468,477,483],{},[167,453,454],{},"Не чіпайте таблиці, які у вас уже є, якщо вам потрібно лише, щоб застосунок і далі працював. Вони зберігають свої гранти.",[167,456,457,458,461],{},"Попросіть конструктор писати GRANT, ",[14,459,460],{},"enable row level security"," і політику в тій самій міграції, що створює кожну нову таблицю, як одну зміну.",[167,463,464,465,467],{},"Коли зʼявиться помилка, подивіться, яку роль називає підказка. ",[14,466,43],{}," означає кожного відвідувача вашого застосунку.",[167,469,470,471,473,474,476],{},"Не давайте ",[14,472,43],{}," жодного GRANT на таблицю, доки не увімкнено Row Level Security і не написано правило. Таблицям із людьми чи замовленнями GRANT для ",[14,475,43],{}," зазвичай не потрібен узагалі.",[167,478,479,480,482],{},"Відмовляйтеся від будь-якого виправлення, яке вимикає Row Level Security або додає ",[14,481,295],{},", щоб прибрати помилку доступу. Жодне з них на неї не діє.",[167,484,485],{},"Перевірте, що незнайомець може прочитати з таблиць, які у вас уже є. Після 30 жовтня вони лишаються такими ж.",[10,487,488,489,492],{},"Почніть із таблиці, яку незнайомець найбільше хотів би прочитати, зазвичай тієї,\nде є люди, і\n",[100,490,491],{"href":272},"проскануйте застосунок",", щоб побачити, що вона віддає сьогодні.",{"title":69,"searchDepth":494,"depth":494,"links":495},3,[496,498,499,500,501,502,503,504],{"id":29,"depth":497,"text":30},2,{"id":78,"depth":497,"text":79},{"id":204,"depth":497,"text":205},{"id":227,"depth":497,"text":228},{"id":276,"depth":497,"text":277},{"id":353,"depth":497,"text":354},{"id":395,"depth":497,"text":396},{"id":445,"depth":497,"text":446},"Основи безпеки","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcover-1200x630.png","Ряд дверей до таблиць бази даних. Старіші стоять відчинені, за ними світяться рядки, а найновіші, в кінці ряду, зачинені.","З 30 жовтня нова таблиця в Supabase відповідає \"permission denied for table\", доки ви не дасте доступ. Лист показує лише половину виправлення.",false,"md",[512,515,517,520,523],{"q":513,"a":514},"Чи перестане мій застосунок на Supabase працювати 30 жовтня?","Ні. Кожна таблиця, що існує на 30 жовтня, зберігає свій доступ, і Supabase підтвердив, що ці гранти не відкличуть. Змінюється наступна таблиця, створена після цієї дати. Вона зʼявляється недосяжною для вашого застосунку, доки хтось не відкриє до неї доступ, тож першою зламається перша нова функція, якій потрібна нова таблиця.",{"q":30,"a":516},"Це означає, що тип відвідувача, від якого прийшов запит, узагалі не отримав доступу до цієї таблиці, тож ваша база відмовила ще до того, як подивилася бодай на один рядок. Повідомлення походить від Postgres, бази даних, на якій працює Supabase, має код 42501 і зазвичай доходить до застосунку як 401 або 403. Supabase додає підказку з точною командою GRANT, яка впустила б цього відвідувача.",{"q":518,"a":519},"Чи безпечно виконати GRANT, який пропонує помилка?","Лише тоді, коли в таблиці увімкнено Row Level Security і для неї написано правило. GRANT для anon дозволяє кожному відвідувачу вашого застосунку просити в таблиці рядки, бо ключ, яким робляться ці запити, їде всередині застосунку. Коли правило є, відвідувач отримує ті рядки, які воно дозволяє. Коли правила немає, а Row Level Security вимкнено, він отримує всі.",{"q":521,"a":522},"Чи зачіпає ця зміна Storage, вхід або мої edge functions?","Storage і вхід тримають свої таблиці в окремих схемах, storage та auth, і Supabase каже, що їхні гранти й типові налаштування лишаються як є. З edge functions інакше. Функції, яка користується вашим секретним ключем, усе одно потрібен GRANT на кожну нову таблицю, бо автоматичні гранти, які прибирають, покривали service_role так само, як і дві ролі ваших відвідувачів.",{"q":524,"a":525},"Чи можна увімкнути стару поведінку назад?","Supabase документує спосіб, як налаштування на сторінці Data API в дашборді або як SQL, і не радить цього робити. Коли вона увімкнена, кожна нова таблиця досяжна для кожного відвідувача з моменту появи, і між незнайомцем та її рядками стоїть лише Row Level Security. Так працював кожен проєкт до цієї зміни.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",[528,529,530,531,532,533],"supabase permission denied for table","supabase grant нові таблиці","зміна supabase 30 жовтня data api","supabase 42501","supabase автоматично відкривати нові таблиці","supabase default privileges схема public",{},true,"Supabase \"permission denied for table\" після 30 жовтня","\u002Fblog\u002Fsupabase-permission-denied-for-table","2026-09-26",{"title":5,"description":508},"blog\u002Fsupabase-permission-denied-for-table",[542,543,544],"З 30 жовтня 2026 року нова таблиця у вашому проєкті Supabase відповідає \"permission denied for table\", доки хтось не відкриє до неї доступ. Таблиці, які у вас уже є, працюють так само, як сьогодні.","GRANT вирішує, чи запит узагалі дістанеться таблиці. Row Level Security і далі вирішує, які рядки він забере. Якщо дати anon доступ до таблиці без правил, кожен її рядок зможе прочитати будь-хто.","Зміна не закриває нічого, що вже відкрите. Перевірте, що може прочитати незнайомець сьогодні, і повторюйте це після кожної нової таблиці.","oOnUEtzykwMvX-7j7xqVgkKUzTKgIC3_XwrsmUy8lE8",[547,553,559,565,571,577,583,589,595,601,607,613,619,626,632,637,638,644,650,656,662,668,674,680,686,692,698,704,710,716,722,728,734,740,746,752,758,764,770,776,782,788,794,800,806,812,817,823,829,835,841,847,853,859,864,870,876,881,886,892],{"path":548,"title":549,"description":550,"published":551,"category":505,"image":552,"draft":509},"\u002Fblog\u002Fbase44-security-scan","Сканування безпеки Base44: те, що бачить лише воно","Сканування безпеки Base44 перевіряє сім видів проблем зсередини. Ось половина, яку читає тільки воно, і половина, на яку воно ніколи не дивиться.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":554,"title":555,"description":556,"published":557,"category":505,"image":558,"draft":509},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Ваш API-ключ витік. Порядок дій","API-ключ витік, і ви не знаєте, що робити першим. Не кожен ключ у вашому фронтенді є витоком, а порядок важить більше за швидкість.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":560,"title":561,"description":562,"published":563,"category":505,"image":564,"draft":509},"\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":566,"title":567,"description":568,"published":569,"category":505,"image":570,"draft":509},"\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":572,"title":573,"description":574,"published":575,"category":505,"image":576,"draft":509},"\u002Fblog\u002Fis-base44-safe","Чи безпечний Base44? Дані 5 442 застосунків","Чи безпечний Base44? Ми прогнали дев’ять перевірок на 5 442 робочих застосунках Base44. Майже всі отримали B з причин, яких власник ніколи не обирав.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":578,"title":579,"description":580,"published":581,"category":505,"image":582,"draft":509},"\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":584,"title":585,"description":586,"published":587,"category":505,"image":588,"draft":509},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Чи відкритий ваш файл .env? Дванадцять шляхів для перевірки","Чи відкритий ваш файл .env на вашому власному вебсервері? Дванадцять адрес скажуть це за хвилину, а влучання означає, що все в ньому вже публічне.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":590,"title":591,"description":592,"published":593,"category":505,"image":594,"draft":509},"\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":596,"title":597,"description":598,"published":599,"category":505,"image":600,"draft":509},"\u002Fblog\u002Fis-bolt-safe","Чи безпечний Bolt? Що показали 1 123 застосунки Bolt","Чи безпечний Bolt? Ми прогнали 1 123 живі застосунки Bolt через дев’ять перевірок. Хостинг був чистим. Знахідки: ключі й відкриті таблиці в самих застосунках.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":602,"title":603,"description":604,"published":605,"category":505,"image":606,"draft":509},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase не працює чи проблема у вашому застосунку? Як розрізнити","Supabase не працює чи зламався ваш застосунок? Пауза, повна база й ваша власна помилка виглядають однаково. Чотири перевірки їх розрізняють.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":608,"title":609,"description":610,"published":611,"category":505,"image":612,"draft":509},"\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":614,"title":615,"description":616,"published":617,"category":505,"image":618,"draft":509},"\u002Fblog\u002Fsupabase-free-plan-limits","Ліміти безкоштовного тарифу Supabase і що стається на кожному","Ліміти безкоштовного тарифу Supabase: 500 МБ бази, 5 ГБ egress і жодних резервних копій. Що стається на кожній межі і що змінює Pro за $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":620,"title":621,"description":622,"published":623,"category":624,"image":625,"draft":509},"\u002Fblog\u002Ftest-your-supabase-backup","Перевірте резервну копію Supabase до того, як вона знадобиться","Як перевірити резервну копію Supabase: відновити в тестовий проєкт, порахувати рядки, увійти й знайти рядок, якого бракує обрізаному файлу.","2026-09-28","Backups","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":627,"title":628,"description":629,"published":630,"category":624,"image":631,"draft":509},"\u002Fblog\u002Fsupabase-backup-github-action","Безкоштовна резервна копія Supabase через GitHub Action і підступ","Резервна копія Supabase через GitHub Action безкоштовна й годиться багатьом застосункам. Робочий процес, потрібний рядок підключення та egress.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":633,"title":634,"description":635,"published":538,"category":624,"image":636,"draft":509},"\u002Fblog\u002Fdownload-your-supabase-backup","Чому ви не можете завантажити резервну копію Supabase","Завантажити резервну копію Supabase на сучасному проєкті не вийде: щоденна копія там фізична. Як це перевірити і як тримати власну копію.","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":537,"title":5,"description":508,"published":538,"category":505,"image":526,"draft":509},{"path":639,"title":640,"description":641,"published":642,"category":505,"image":643,"draft":509},"\u002Fblog\u002Fopen-api-endpoint-exposed","Чи є відкритий API-ендпоінт проблемою безпеки? Читайте JSON","Ваше сканування позначило відкритий API-ендпоінт. Чи це важливо, залежить від того, що повернулося, і більшість знайдених належали платформі.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":645,"title":646,"description":647,"published":648,"category":505,"image":649,"draft":509},"\u002Fblog\u002Flovable-security-scan","Сканування безпеки Lovable: чого воно не доведе","Сканування безпеки Lovable: що перевіряють Quick scan і Deep scan, коли запускається кожне, і єдине, чого не доведе жодне сканування зсередини.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":651,"title":652,"description":653,"published":654,"category":624,"image":655,"draft":509},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":657,"title":658,"description":659,"published":660,"category":505,"image":661,"draft":509},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":663,"title":664,"description":665,"published":666,"category":505,"image":667,"draft":509},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":669,"title":670,"description":671,"published":672,"category":505,"image":673,"draft":509},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":675,"title":676,"description":677,"published":678,"category":505,"image":679,"draft":509},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":681,"title":682,"description":683,"published":684,"category":505,"image":685,"draft":509},"\u002Fblog\u002Fvite-and-next-public-env-vars","Змінні оточення Vite відкриті: префікс означає опублікувати це","Змінні оточення Vite відкриті у вашому застосунку, бо так просив префікс. VITE_ і NEXT_PUBLIC_ означають опублікувати це, а ШІ, який їх додав, не знав ціни.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":687,"title":688,"description":689,"published":690,"category":505,"image":691,"draft":509},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":693,"title":694,"description":695,"published":696,"category":505,"image":697,"draft":509},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":699,"title":700,"description":701,"published":702,"category":505,"image":703,"draft":509},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":705,"title":706,"description":707,"published":708,"category":624,"image":709,"draft":509},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":711,"title":712,"description":713,"published":714,"category":624,"image":715,"draft":509},"\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":717,"title":718,"description":719,"published":720,"category":624,"image":721,"draft":509},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":723,"title":724,"description":725,"published":726,"category":505,"image":727,"draft":509},"\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":729,"title":730,"description":731,"published":732,"category":505,"image":733,"draft":509},"\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":735,"title":736,"description":737,"published":738,"category":505,"image":739,"draft":509},"\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":741,"title":742,"description":743,"published":744,"category":505,"image":745,"draft":509},"\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":747,"title":748,"description":749,"published":750,"category":505,"image":751,"draft":509},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Десять інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":753,"title":754,"description":755,"published":756,"category":505,"image":757,"draft":509},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":759,"title":760,"description":761,"published":762,"category":505,"image":763,"draft":509},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":765,"title":766,"description":767,"published":768,"category":505,"image":769,"draft":509},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":771,"title":772,"description":773,"published":774,"category":505,"image":775,"draft":509},"\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":777,"title":778,"description":779,"published":780,"category":505,"image":781,"draft":509},"\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":783,"title":784,"description":785,"published":786,"category":624,"image":787,"draft":509},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":789,"title":790,"description":791,"published":792,"category":505,"image":793,"draft":509},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":795,"title":796,"description":797,"published":798,"category":624,"image":799,"draft":509},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":801,"title":802,"description":803,"published":804,"category":505,"image":805,"draft":509},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":807,"title":808,"description":809,"published":810,"category":505,"image":811,"draft":509},"\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":290,"title":813,"description":814,"published":815,"category":505,"image":816,"draft":509},"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":818,"title":819,"description":820,"published":821,"category":505,"image":822,"draft":509},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":824,"title":825,"description":826,"published":827,"category":624,"image":828,"draft":509},"\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":830,"title":831,"description":832,"published":833,"category":624,"image":834,"draft":509},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":836,"title":837,"description":838,"published":839,"category":505,"image":840,"draft":509},"\u002Fblog\u002Fsupabase-storage-bucket-public","Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":842,"title":843,"description":844,"published":845,"category":505,"image":846,"draft":509},"\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":848,"title":849,"description":850,"published":851,"category":624,"image":852,"draft":509},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":854,"title":855,"description":856,"published":857,"category":505,"image":858,"draft":509},"\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":860,"title":861,"description":862,"published":857,"category":505,"image":863,"draft":509},"\u002Fblog\u002Fsource-maps-exposed-in-production","Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":865,"title":866,"description":867,"published":868,"category":505,"image":869,"draft":509},"\u002Fblog\u002Fsupabase-new-api-keys","Нові API-ключі Supabase: який із них безпечний у застосунку?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":871,"title":872,"description":873,"published":874,"category":624,"image":875,"draft":509},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":363,"title":877,"description":878,"published":879,"category":505,"image":880,"draft":509},"Supabase Row Level Security увімкнено. Таблиця досі публічна.","Увімкнути Supabase Row Level Security не означає захистити таблицю. Захищають політики, а та, що полагодила застосунок, часто впускає всіх.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":882,"title":883,"description":884,"published":879,"category":624,"image":885,"draft":509},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":887,"title":888,"description":889,"published":890,"category":624,"image":891,"draft":509},"\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":893,"title":894,"description":895,"published":890,"category":505,"image":896,"draft":509},"\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",1791618974000]