<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: awalias</title>
    <description>The latest articles on DEV Community by awalias (@awalias).</description>
    <link>https://dev.to/awalias</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F366925%2F0b0a1970-286f-4efe-8443-416bee532312.jpg</url>
      <title>DEV Community: awalias</title>
      <link>https://dev.to/awalias</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/awalias"/>
    <language>en</language>
    <item>
      <title>Prisma + Postgres</title>
      <dc:creator>awalias</dc:creator>
      <pubDate>Wed, 30 Oct 2024 06:36:55 +0000</pubDate>
      <link>https://dev.to/awalias/prisma-postgres-4o09</link>
      <guid>https://dev.to/awalias/prisma-postgres-4o09</guid>
      <description>&lt;p&gt;In this tutorial, we'll explore how to set up Prisma + Postgres. We'll use real-world examples involving books and authors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites for Prisma + Postgres
&lt;/h2&gt;

&lt;p&gt;Before we begin, ensure you have the following installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; (v14 or later)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt; or &lt;strong&gt;yarn&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;An account on &lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Supabase&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting Up Prisma + Postgres
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://supabase.com" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt; provides a hosted Postgres database for use with Prisma, making it easy to get started without setting up your own database server. Supabase is quick and easy to get started, and is a cost effective way to scale up to millions of users if your project gets traction.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a New Supabase Project&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Sign in to your &lt;a href="https://app.supabase.com" rel="noopener noreferrer"&gt;Supabase account&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;"New Project"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Fill in the project details and click &lt;strong&gt;"Create new project"&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Retrieve Database Connection Details&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the navigation bar, go to &lt;a href="https://supabase.com/dashboard/project/_/settings/database" rel="noopener noreferrer"&gt;&lt;strong&gt;"Project Settings"&lt;/strong&gt; &amp;gt; &lt;strong&gt;"Database"&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy the &lt;strong&gt;Connection string&lt;/strong&gt; (URI) for Postgres. You’ll need it in the next step:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgres://postgres.[ref]:[password]@[region].pooler.supabase.com:6543/postgres
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setting Up Prisma in Your Project
&lt;/h2&gt;

&lt;p&gt;Prisma is an ORM that simplifies database interactions in Node.js applications.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Initialize a Node.js Project&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;prisma-postgres
&lt;span class="nb"&gt;cd &lt;/span&gt;prisma-postgres
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Prisma and Postgres Client&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;prisma &lt;span class="nt"&gt;--save-dev&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @prisma/client

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Initialize Prisma&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx prisma init

&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;This command creates a &lt;code&gt;prisma&lt;/code&gt; directory with a &lt;code&gt;schema.prisma&lt;/code&gt; file and a &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Configuring Prisma + Postgres
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up the Database Connection&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the &lt;code&gt;.env&lt;/code&gt; file (located in the new &lt;code&gt;prisma&lt;/code&gt; folder).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add &lt;code&gt;DATABASE_URL&lt;/code&gt; and &lt;code&gt;DIRECT_URL&lt;/code&gt; you can get the connection details &lt;a href="https://supabase.com/dashboard/project/_/settings/database" rel="noopener noreferrer"&gt;here&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DATABASE_URL="postgres://postgres.[ref]:[password]@aws-0-[region].pooler.supabase.com:6543/postgres?pgbouncer=true"

DIRECT_URL="postgres://postgres.[ref]:[password]@aws-0-[region].pooler.supabase.com:5432/postgres"

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The direct connection (on port 5432 is required for running database migrations against the database).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define the Data Model&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open &lt;code&gt;prisma/schema.prisma&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update the &lt;code&gt;datasource&lt;/code&gt; block to include DIRECT_URL like so:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
  directUrl = env("DIRECT_URL")
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add your data models. For a library system:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;```
model Author {
  id     Int     @id @default(autoincrement())
  name   String
  books  Book[]
}

model Book {
  id        Int      @id @default(autoincrement())
  title     String
  author    Author   @relation(fields: [authorId], references: [id])
  authorId  Int
}

```
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Generating the Postgres Schema
&lt;/h2&gt;

&lt;p&gt;Use Prisma Migrate to apply your schema to the Postgres database on Supabase.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx prisma migrate dev &lt;span class="nt"&gt;--name&lt;/span&gt; init

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate migration files.&lt;/li&gt;
&lt;li&gt;Apply the migration to the Postgres database.&lt;/li&gt;
&lt;li&gt;Generate the Prisma Client.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Using Prisma Client to Interact with Prisma + Postgres
&lt;/h2&gt;

&lt;p&gt;Create a &lt;code&gt;script.js&lt;/code&gt; file to test database operations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PrismaClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@prisma/client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PrismaClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Create a new author&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Yevgeny Zamyatin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Create a new book&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;We&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;authorId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Retrieve all books with their authors&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;books&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findMany&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;books&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;$disconnect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node script.js

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see an array of books with their associated authors logged to the console.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Congratulations! You've set up Prisma with Postgres. This setup allows you to interact with your Postgres database seamlessly using Prisma.&lt;/p&gt;




&lt;p&gt;By following this guide, you've taken the first steps toward building robust applications with Prisma and Postgres.&lt;/p&gt;

</description>
      <category>prisma</category>
      <category>postgres</category>
      <category>postgressql</category>
    </item>
    <item>
      <title>Supabase Beta August 2023</title>
      <dc:creator>awalias</dc:creator>
      <pubDate>Fri, 08 Sep 2023 13:14:44 +0000</pubDate>
      <link>https://dev.to/supabase/supabase-beta-august-2023-46hb</link>
      <guid>https://dev.to/supabase/supabase-beta-august-2023-46hb</guid>
      <description>&lt;p&gt;Launch Week 8 breezed by, leaving behind a trail of new features to explore. Here is a recap of everything and an update of what else we are working on, like pgvector 0.5.0 with HNSW.&lt;/p&gt;

&lt;h2&gt;
  
  
  pgvector v0.5.0: Faster semantic search with HNSW indexes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rwA0gfcO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/pgvector-0-5-0-hnsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rwA0gfcO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/pgvector-0-5-0-hnsw.png" alt="pgvector v0.5.0: Faster semantic search with HNSW indexes" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Supabase Vector is about to get a lot faster 💨. pgvector v0.5.0 adds Hierarchical Navigable Small World (HNSW), a new type of index that ensures lightning-fast vector searches, especially in high-dimensional spaces and embeddings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/increase-performance-pgvector-hnsw"&gt;Blog post&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 1 - Hugging Face is now supported in Supabase
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--StsZzZiG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-1.png%3Ft%3D2023-09-08T07%253A12%253A07.012Z" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--StsZzZiG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-1.png%3Ft%3D2023-09-08T07%253A12%253A07.012Z" alt="Day 1 - Hugging Face is now supported in Supabase" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are all about open source collaboration, and Hugging Face is one of the open source communities we admire most. That’s why we've added Hugging Face support in our Python Vector Client and Edge Functions (Javascript) 🤗&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/hugging-face-supabase"&gt;Blog post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=RJccSbJ9Go4"&gt;Video announcement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Day 2 - Supabase Local Dev: migrations, branching, and observability
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZumZmGkw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-2.png%3Ft%3D2023-09-08T07%253A12%253A43.796Z" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZumZmGkw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-2.png%3Ft%3D2023-09-08T07%253A12%253A43.796Z" alt="Day 2 - Supabase Local Dev: migrations, branching, and observability" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The CLI received some serious upgrades including observability tools, streamlined backups, and enhanced migrations. But that's not all – the big game-changer is the introduction of Supabase branching which we’re rolling out to selected customers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/supabase-local-dev"&gt;Blog post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=N0Wb85m3YMI"&gt;Video announcement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Day 3 - Supabase Studio 3.0
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Sa8cl7qR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-3.png%3Ft%3D2023-09-08T07%253A13%253A17.511Z" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sa8cl7qR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-3.png%3Ft%3D2023-09-08T07%253A13%253A17.511Z" alt="Day 3 - Supabase Studio 3.0" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Supabase Studio went to &lt;a href="https://www.producthunt.com/products/supabase#ai-sql-editor-by-supabase"&gt;#1 on Product Hunt&lt;/a&gt; with some huge new features, including AI SQL editor, Schema diagrams, Wrappers UI, and a lot more!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/supabase-studio-3-0"&gt;Blog post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=51tCMQPiitQ"&gt;Video announcement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Day 4 - Supabase Integrations Marketplace
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MxuXkXs5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-4-vercel.jpg%3Ft%3D2023-09-08T07%253A13%253A43.691Z" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MxuXkXs5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-4-vercel.jpg%3Ft%3D2023-09-08T07%253A13%253A43.691Z" alt="Day 4 - Supabase Integrations Marketplace" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the release of OAuth2 applications, we've made it easier than ever for our partners to extend the Supabase platform with useful tooling 🙌&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/supabase-integrations-marketplace"&gt;Blog post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=gtJo1lTxHfs"&gt;Video announcement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Day 4 - Vercel Integration 2.0 and Next.js App Router Support
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ty1Byc_J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-4.png%3Ft%3D2023-09-08T07%253A14%253A19.166Z" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ty1Byc_J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-4.png%3Ft%3D2023-09-08T07%253A14%253A19.166Z" alt="Day 4 - Vercel Integration 2.0 and Next.js App Router Support" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The New Supabase x Vercel integration streamlines the process of creating, deploying, and maintaining web applications with several enhancements. Plus, it fully supports the App Router in Next.js ▲&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/using-supabase-with-vercel"&gt;Blog post&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 5 - Supavisor: Scaling Postgres to 1 Million Connections
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LUHAcYvi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-5-supavisor.jpg%3Ft%3D2023-09-08T07%253A14%253A40.415Z" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LUHAcYvi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-5-supavisor.jpg%3Ft%3D2023-09-08T07%253A14%253A40.415Z" alt="Day 5 - Supavisor: Scaling Postgres to 1 Million Connections" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Supavisor is a scalable, cloud-native Postgres connection pooler written in Elixir. It has been developed with multi-tenancy in mind, handling millions of connections without significant overhead or latency. We’re rolling it out to every database on our platform.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/supavisor-1-million"&gt;Blog post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=qzxzLSAJDfE"&gt;Video announcement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Community Highlights from the past 4 months
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1lzeGeB2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1lzeGeB2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-5.jpg" alt="Community Highlights from the past 4 months" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Launch Week is an event for our community, so it’s a good time to look back at what happened in the last months (spoiler: a lot).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/launch-week-8-community-highlights"&gt;Blog post&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One more thing: HIPAA and SOC2 Type 2
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XW7-1CTp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-5-compliance.jpg%3Ft%3D2023-09-08T07%253A15%253A15.241Z" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XW7-1CTp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/LW-Digest-5-compliance.jpg%3Ft%3D2023-09-08T07%253A15%253A15.241Z" alt="One more thing: HIPAA and SOC2 Type 2" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Supabase is officially SOC2 Type 2 and HIPAA compliant! In this write-up, we offer insights into what you can expect if you’re planning to go through the same process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/supabase-soc2-hipaa"&gt;Blog post&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Launch Week 8 Hackathon Winners
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h9xte1eB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/launch-week-8-hackathon" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h9xte1eB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/launch-week-8-hackathon" alt="Launch Week 8 Hackathon Winners" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The decision was not easy, but after assessing a record number of submissions, the panel of judges chose &lt;a href="https://github.com/alex-streza/witas"&gt;WITAS&lt;/a&gt; as the winner of the Best Overall project. As the name doesn't suggest, it's an acronym for Wait is that a sticker? In a nutshell, it generates stickers with Midjourney. Huge congrats to &lt;a href="https://twitter.com/alex_streza"&gt;Alex Streza&lt;/a&gt; and &lt;a href="https://twitter.com/Catalina_Melnic"&gt;Catalina Melnic&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://t.co/onYiaDmavb"&gt;Full list of winners&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.madewithsupabase.com/hackathons/launch-week-8"&gt;All the submissions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More product announcements!
&lt;/h2&gt;

&lt;p&gt;Shipping doesn’t stop here at Supabase! We are back in full shipping mode and already thinking about the next LW. These are some of the things we’ve been working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updated and rewrote a bunch of docs: &lt;a href="https://supabase.com/docs/guides/database/postgres/row-level-security"&gt;Row-Level-Security&lt;/a&gt;, &lt;a href="https://supabase.com/docs/guides/database/postgres/roles"&gt;Postgres Roles,&lt;/a&gt; &lt;a href="https://supabase.com/docs/guides/database/postgres/configuration"&gt;Database configuration&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Implemented read only UI for indexes. &lt;a href="https://github.com/supabase/supabase/pull/16582"&gt;PR&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Organization-based Billing, project transfers, team plan. &lt;a href="https://supabase.com/blog/organization-based-billing"&gt;Blog post&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Extended Community Highlights
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t4tjAAkd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/community-highlights.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t4tjAAkd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/community-highlights.png" alt="Community Highlights" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supabase’s Happy Hour made a comeback! Two new episodes of Alaister, Tyler, and Jon chatting about the latest news while live coding. &lt;a href="https://www.youtube.com/watch?v=OWhKVbg1p7Y"&gt;Episode #27&lt;/a&gt; | &lt;a href="https://www.youtube.com/watch?v=_Z2f-gGrYu8"&gt;Episode #28&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The State of Postgres 2023 is live. Take the survey and help improve Postgres. &lt;a href="https://timescale.typeform.com/state-of-pg-23/"&gt;Survey&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Jon Meyers stopped by the PodRocket podcast to chat about everything we shipped for LW8. &lt;a href="https://podrocket.logrocket.com/supabase-launch-week"&gt;Podcast&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Supabase Crash Course for iOS Developers: Mikaela shows how to implement a Postgres database in a Swift project. &lt;a href="https://www.youtube.com/watch?v=XBSiXROUoZk"&gt;Video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The Vite ecosystem conference is back and we are happy to be a Community Partner again. &lt;a href="https://viteconf.org/23/ecosystem/supabase"&gt;Get your ticket&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Building a real app with Tamagui and Supabase. &lt;a href="https://www.youtube.com/watch?v=d32F7crxXsY"&gt;Video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Build PostgreSQL Databases Faster With Supabase AI SQL Editor. &lt;a href="https://www.youtube.com/watch?v=ueCECQ24STI"&gt;Video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Creating Customized i18n-Ready Authentication Emails using Supabase Edge Functions, PostgreSQL, and Resend. &lt;a href="https://blog.mansueli.com/creating-customized-i18n-ready-authentication-emails-using-supabase-edge-functions-postgresql-and-resend"&gt;Blog post&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Expo Router Tabs with Supabase Authentication. &lt;a href="https://www.youtube.com/watch?v=6IzrH-1M0uE&amp;amp;list=PL2PY2-9rsgl2DikpQG-GgO7TBgRtdB6NT&amp;amp;index=6"&gt;Video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Integrating Supabase with Prisma and TRPC: A Comprehensive Guide. &lt;a href="https://tobicode.hashnode.dev/integrating-supabase-with-prisma-and-trpc-a-comprehensive-guide"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A Supa-Introduction to Supabase. &lt;a href="https://medium.com/@alex.streza/a-supa-introduction-to-supabase-e551ea6708e"&gt;Blog post&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Authentication in Next.js with Supabase Auth and PKCE. &lt;a href="https://dev.to/mryechkin/authentication-in-nextjs-with-supabase-auth-and-pkce-45pk"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Implementing OAuth in Nuxt with Supabase. &lt;a href="https://dev.to/jacobandrewsky/implementing-oauth-in-nuxt-with-supabase-4p1k"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚠️ Baking hot meme zone ⚠️
&lt;/h2&gt;

&lt;p&gt;If you made it this far in the email you deserve a devilish treat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tnIDW0Mi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/meme-beta-update-august.jpeg%3Ft%3D2023-09-08T07%253A16%253A43.981Z" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tnIDW0Mi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/marketing-emails/august%25202023/meme-beta-update-august.jpeg%3Ft%3D2023-09-08T07%253A16%253A43.981Z" alt="Beta Update Meme August 2023" width="680" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it for now, see you next month 👋&lt;/p&gt;

&lt;p&gt;&lt;a href="http://supabase.com?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm%5C_term=devtocta" class="ltag_cta ltag_cta--branded"&gt;🚀 Learn more about Supabase&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>postgres</category>
      <category>database</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Supabase Beta May 2023</title>
      <dc:creator>awalias</dc:creator>
      <pubDate>Fri, 09 Jun 2023 10:40:10 +0000</pubDate>
      <link>https://dev.to/supabase/supabase-beta-may-2023-4fol</link>
      <guid>https://dev.to/supabase/supabase-beta-may-2023-4fol</guid>
      <description>&lt;p&gt;We have two big product announcements this month, new integrations with products we love, and exciting highlights from our amazing community.&lt;/p&gt;

&lt;p&gt;We're also absolutely stoked to let you know that we've hit a massive milestone: &lt;a href="https://github.com/supabase/supabase"&gt;50k GitHub Stars&lt;/a&gt;! 🌟. Much love to everyone who helped us get there!&lt;/p&gt;

&lt;h2&gt;
  
  
  Supabase Vector: the open source Vector Toolkit for Postgres
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jXb6iiHv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9yqaj4pdczu5kb8urkoj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jXb6iiHv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9yqaj4pdczu5kb8urkoj.png" alt="Supabase Vector: the open source Vector Toolkit for Postgres" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Storing vector embeddings in Postgres with 'pgvector' is becoming increasingly popular for AI applications, so we're building out a collection of tools to store, index, and query embeddings at scale.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/vector"&gt;Supabase Vector&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vault is now available for all projects
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3f8vEPo4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pagizyqh6zoj51wp9rkd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3f8vEPo4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pagizyqh6zoj51wp9rkd.jpg" alt="Vault is now available for all projects" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vault is a Postgres extension and accompanying Supabase UI that makes it safe and easy to store encrypted secrets and other data in your database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/docs/guides/database/vault"&gt;Learn how to use Vault.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Auth Helpers now include server-side Auth and full support for the Next.js App Router
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Fg6PVeda--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eqqqkkng6z4es5yvlvtr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fg6PVeda--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eqqqkkng6z4es5yvlvtr.png" alt="Auth Helpers now include server-side Auth and full support for the Next.js App Router" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have updated the &lt;a href="https://github.com/supabase/auth-helpers"&gt;Next.js Auth Helpers package&lt;/a&gt; to make it available across the client and server of the App Router. They also now implement server-side auth by default with PKCE - meaning the entire auth flow is now possible server-side.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/docs/guides/auth/auth-helpers/nextjs"&gt;Updated docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/playlist?list=PL5S4mPUpp4OtMhpnp93EFSo42iQ40XjbF"&gt;Video course&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Improving our dashboard with user feedback
&lt;/h2&gt;

&lt;p&gt;As we plan the next few months of Dashboard development, we're reaching out to users to see all the different ways people use the Dashboard in their work.&lt;/p&gt;

&lt;p&gt;Last month, we opened up a public &lt;a href="https://github.com/orgs/supabase/discussions/14206"&gt;RFC for the Dashboard SQL Editor&lt;/a&gt;. It's been amazing to see how people use this tool to build their projects. If you're a heavy user of the SQL Editor, we'd love to get your feedback.&lt;/p&gt;

&lt;p&gt;We also started doing user interviews to understand how users use the Dashboard. Our goal is to build the best possible Dashboard for all of our users, and you can help! Reach out to &lt;a href="https://twitter.com/saltcod"&gt;Terry&lt;/a&gt; you would like to share your experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick product announcements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;[Auth] You can now use Turnstile as a Captcha provider. &lt;a href="https://supabase.com/docs/guides/auth/auth-captcha#sign-up-for-captcha"&gt;Doc&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[Auth] How to send a password reauthentication nonce. &lt;a href="https://supabase.com/docs/reference/javascript/auth-resend"&gt;Doc&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[Dashboard] Supabase Wrappers UI that supports pulling data in from Firebase, Stripe, S3, and Clickhouse. &lt;a href="https://supabase.com/dashboard/project/_/database/wrappers"&gt;Create a Wrapper&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[Edge Functions] Support for deploying all Edge Functions via CLI. &lt;a href="https://supabase.com/docs/guides/functions/quickstart#deploy-all-functions"&gt;Doc&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[Edge Functions] Custom domains and vanity domains support for Edge Functions. &lt;a href="https://github.com/supabase/supabase-js/pull/778"&gt;PR&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[Storage] Image Transformation is now out of Beta. &lt;a href="https://supabase.com/docs/guides/storage/image-transformations"&gt;Doc&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[Postgres Extensions] pg_cron 1.5.2 (new projects only) now supports sub-minute schedules. &lt;a href="https://github.com/citusdata/pg_cron"&gt;PR&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI resources &amp;amp; examples
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Br6sUsr5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tm4b2rwfrc2hrzmjwjff.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Br6sUsr5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tm4b2rwfrc2hrzmjwjff.jpg" alt="AI resources &amp;amp; examples" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole team has been busy building with ChatGPT, pgvector, and creating valuable resources so the community can unleash their imagination and build great AI apps faster than ever.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://supabase.com/blog/vecs"&gt;Supabase Vecs: a vector client for Postgres&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://supabase.com/blog/chatgpt-plugins-support-postgres"&gt;ChatGPT plugins now support Postgres &amp;amp; Supabase&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://supabase.com/blog/building-chatgpt-plugins-template"&gt;Building ChatGPT Plugins with Supabase Edge Runtime&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ffdUZbYov9g"&gt;Use AI to generate a PostgreSQL database that can play Tony Hawk's Pro Skater&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Flutter Hackathon winners
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vRU2fQGs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4f995700dt9mp05n2qsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vRU2fQGs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4f995700dt9mp05n2qsw.png" alt="Flutter Hackathon winners" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We hosted our first-ever Flutter Hackathon, in partnership with FlutterFlow and Invertase. Samuel Philip built &lt;a href="https://github.com/ineffablesam/Syno"&gt;Syno&lt;/a&gt;, a YouTube summarizer app that uses OpenAI, and won the limited Flutter-themed Supabase keyboard 💙, and there are tons of other great open source projects to check out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/flutter-hackathon-winners"&gt;Read the blog post with all the winners&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=AazB9mQetkw"&gt;Watch the live announcement with Pooja and Majid&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Made with Supabase 
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/stangirard/quivr"&gt;Quivr&lt;/a&gt;, your second brain in the cloud, utilizes the power of GenerativeAI to store and retrieve unstructured information. Built by &lt;a href="https://twitter.com/_StanGirard"&gt;Stan Girard&lt;/a&gt; using LangChain, OpenAI, and Supabase Vector.&lt;/p&gt;

&lt;p&gt;Bonus track: make sure to also check out &lt;a href="https://www.chartgpt.dev/"&gt;ChartGPT&lt;/a&gt;, which just launched V2.0 with a big UI refresh ✨&lt;/p&gt;

&lt;h2&gt;
  
  
  Extended Community Highlights
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7vkc0cA_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ap1hhge0l054i1za93o2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7vkc0cA_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ap1hhge0l054i1za93o2.jpeg" alt="Extended Community Highlights" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We worked with Cloudflare on a new integration that makes it super easy to connect your Supabase database from Cloudflare Workers. &lt;a href="https://supabase.com/docs/guides/integrations/cloudflare-workers"&gt;Doc&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;- Deno Fresh Starter: ChatGPT-style doc search. &lt;a href="https://deno.com/blog/build-chatgpt-doc-search-with-supabase-fresh"&gt;Blog post&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Vector Similarity Search in Bubble using Supabase Vector. &lt;a href="https://medium.com/@ivbran/vector-similarity-search-in-bubble-io-using-supabase-and-pgvector-672a2e69fbc7"&gt;Integration&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supabase RLS with Typescryp. &lt;a href="https://supabase-rls.up.railway.app/"&gt;Editor&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How Supabase does performance benchmarking using k6, with Egor Romanov. &lt;a href="https://www.youtube.com/watch?v=VcrQidYBjEg"&gt;Webinar&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Code With Antonio - Spotify Clone with Next.js Auth Helpers. &lt;a href="https://www.youtube.com/watch?v=2aeMRB8LL4o"&gt;Video tutorial&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Our friends from 1Password announced Passage and wrote an integration guide. &lt;a href="https://supabase.com/partners/integrations/passageidentity"&gt;Doc&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to create a chatbot with OpenAI's API: a conceptual cheat sheet. &lt;a href="https://dev.to/farez/how-to-create-a-chatbot-with-openais-api-a-conceptual-cheat-sheet-2o5p"&gt;Tutorial&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to Implement Role-Based Access with Supabase. &lt;a href="https://dev.to/akkilah/how-to-implement-role-based-access-with-supabase-3a2"&gt;Tutorial&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rodrigo Mansueli, Developer Support Enginere here at Supabase, started a blog that is starting to become go-to resource for leveling up with Supabase and Postgres. [Blog]](&lt;a href="https://blog.mansueli.com/"&gt;https://blog.mansueli.com/&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Building a mobile authentication flow for your SaaS with Expo and Supabase. &lt;a href="https://blog.spirokit.com/building-a-mobile-authentication-flow-for-your-saas-with-expo-and-supabase"&gt;Tutorial&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Huntabyte released a new course: Modern SaaS Apps with SvelteKit, Stripe, &amp;amp; Supabase. &lt;a href="https://courses.huntabyte.com/modern-saas"&gt;Full Course&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setting Up n8n on Railway with Postgres Database. &lt;a href="https://nesin.io/blog/host-n8n-railway-external-database"&gt;Tutorial&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  We're hiring
&lt;/h2&gt;

&lt;p&gt;Great opportunity to be an early and key member of our Customer Success team. Come join one of the fastest-growing open source projects ever 🤗&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://boards.greenhouse.io/supabase/jobs/4888237004"&gt;Customer Solution Architect&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Meme Zone
&lt;/h2&gt;

&lt;p&gt;As always, one of our favorite memes from last month. &lt;a href="https://twitter.com/supabase"&gt;Follow us on Twitter&lt;/a&gt; for more.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/blog/2023-09-06-may-2023-beta-update/beta-update-may-2023-meme.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="/images/blog/2023-09-06-may-2023-beta-update/beta-update-may-2023-meme.jpeg" alt="Meme May 2023"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>postgres</category>
      <category>database</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Supabase Beta April 2023</title>
      <dc:creator>awalias</dc:creator>
      <pubDate>Wed, 10 May 2023 13:03:55 +0000</pubDate>
      <link>https://dev.to/supabase/supabase-beta-april-2023-21cc</link>
      <guid>https://dev.to/supabase/supabase-beta-april-2023-21cc</guid>
      <description>&lt;p&gt;Brace yourself, this is one of the most feature-packed Beta Updates we've published so far.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/launch-week"&gt;Launch Week 7&lt;/a&gt; was a massive success with great feedback from the community. We also gave away lots of mechanical keyboards, including the Hackathon winner which we announce here!&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 1 - Supabase Logs: open source logging server
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Jbwj5ygL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jbwj5ygL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day-1.jpg" alt="Day 1 - Supabase Logs: open source logging server" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Logflare is the hub of analytics streams for Supabase. We are open sourcing it so that you can self-host your own Logging infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/supabase-logs-self-hosted"&gt;Blog Post&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=Ai2BjHV36Ng"&gt;Video overview&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 2 - Supabase Edge Runtime: Self-hosted Deno Functions
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LD9UyVMg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LD9UyVMg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day2.jpg" alt="Day 2 - Supabase Edge Runtime: Self-hosted Deno Functions" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can now self-host Edge Functions and run them in local development using our new Edge Runtime. We published a guide showing how to self-host Edge Functions with Fly and what more is coming&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lydn9wYq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://fonts.gstatic.com/s/e/notoemoji/15.0/26a1/32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lydn9wYq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://fonts.gstatic.com/s/e/notoemoji/15.0/26a1/32.png" alt="⚡" width="32" height="32"&gt;&lt;/a&gt;️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/edge-runtime-self-hosted-deno-functions"&gt;Blog post&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=cPGxPl1lx4Y"&gt;Video overview&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 3 - Storage v3: Resumable Uploads with support for 50GB files
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QVyEqzaL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QVyEqzaL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day3.jpg" alt="Day 3 - Storage v3: Resumable Uploads with support for 50GB files" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Supabase Storage received many of the most requested features from our users: Resumable Uploads, Quality Filters, Next.js support, and WebP support.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/storage-v3-resumable-uploads"&gt;Blog post&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=pT2PcZFq_M0"&gt;Video overview&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 4 - Supabase Auth: SSO, Mobile, and Server-side support
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0PP9kBQV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0PP9kBQV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day4.jpg" alt="Day 4 - Supabase Auth: SSO, Mobile, and Server-side support" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On day 4, we introduced SSO with SAML 2.0, PKCE, and Sign in with Apple for iOS. It felt like acronym day, but it was actually Auth day!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/supabase-auth-sso-pkce"&gt;Blog post&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=hAwJeR6mhB0"&gt;Video overview&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 5 - Supabase Studio 2.0 with new AI features
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7BMZ8d0Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day5-studio.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7BMZ8d0Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day5-studio.jpg" alt="Day 5 - Supabase Studio 2.0 with new AI features" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Supabase Studio got a major upgrade that goes from redesigns to improved developer experience, and new tools. We have the features people have been asking for and new capabilities that will change the way you work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/supabase-studio-2.0"&gt;Blog Post&lt;/a&gt;\&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=0rcNqHt5KWU"&gt;Video overview&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Community highlights
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OSNhbX8a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day5-community.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OSNhbX8a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day5-community.jpg" alt="Community highlights" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our community defines us. We're honored to work with, sponsor, and support incredible people and tools 💜. Our CEO wrote a highlight of the last 3 months.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/launch-week-7-community-highlights"&gt;Blog post&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing dbdev: PostgreSQL Package Manager
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zrtLDzQd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day5-dbdev.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zrtLDzQd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-OG-day5-dbdev.jpg" alt="dbdev: PostgreSQL Package Manager" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://database.dev/"&gt;database.dev&lt;/a&gt; fills the same role for PostgreSQL as &lt;code&gt;npm&lt;/code&gt; for JavaScript or &lt;code&gt;pip&lt;/code&gt; for Python, it enables publishing libraries and applications for repeatable deployment. Our goal is to create an open ecosystem for packaging and discovering SQL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/dbdev"&gt;Blog post&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More product announcements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Trusted Language Extensions for Postgres. &lt;a href="https://supabase.com/blog/pg-tle"&gt;[Blog post]&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;What's New in pg_graphql v1.2. &lt;a href="https://supabase.com/blog/whats-new-in-pg-graphql-v1-2"&gt;[Blog post]&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Discussions are now a new knowledge source for search &amp;amp; AI (Troubleshooting category only for now). &lt;a href="https://supabase.com/docs"&gt;[Check it out]&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;New API report with routing information for each chart, making it easier to debug API calls.  &lt;a href="https://github.com/supabase/supabase/pull/14063"&gt;[PR]&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Storage permission changes: the developer role is now allowed to update the storage settings (previously was only owner and admin). &lt;a href="https://github.com/supabase/supabase/pull/13883"&gt;[PR]&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Launch Week 7 Hackathon winners
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ULRaaX0n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-hackathon.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ULRaaX0n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/newsletter-hackathon.jpg" alt="Launch Week 7 Hackathon winners" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The community is loving &lt;code&gt;pgvector&lt;/code&gt; to build AI apps so we decided to make it part of the traditional Launch Week Hackathon. The quality of the apps was out of this world, it wasn't easy, but in the end, we selected &lt;a href="https://github.com/n4ze3m/page-assist"&gt;Page Assist&lt;/a&gt; - by &lt;a href="https://twitter.com/n4ze3m"&gt;@n4ze3m &lt;/a&gt;as the winner of the Best Overall Project. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/launch-week-7-hackathon-winners"&gt;Full list of Winners&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.madewithsupabase.com/launch-week-7"&gt;See all the submissions&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mendable.ai switches from Pinecone to Supabase for PostgreSQL vector embeddings.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--clXfuGU1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/customer-stories-mendable.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--clXfuGU1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/customer-stories-mendable.png" alt="Mendable logo" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Supabase and pgvector, Mendable.ai could build a more cost-effective solution that is just as performant - if not more performant - than other vector databases.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/customers/mendableai"&gt;Read the full story&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From the community
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bWn4YJTH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-june/community.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bWn4YJTH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-june/community.jpg" alt="Community" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FlutterFlow now supports Supabase Authentication. &lt;a href="https://www.youtube.com/watch?v=tL-sLPfWzVE"&gt;Video guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Supabase + ClickHouse: Combining the Best of the OLTP and OLAP Worlds. &lt;a href="https://www.youtube.com/watch?v=LDWEsw41Zko"&gt;Webinar&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Our friend Guillaume put together the most incredible course about Supabase, with the in and outs of the platform. &lt;a href="https://www.youtube.com/watch?v=8DTOTT7q0XA"&gt;Full course&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Supabase + LangChain starter template for building full stack AI apps. &lt;a href="https://github.com/langchain-ai/langchain-template-supabase"&gt;Template&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Creating a Books Tracker App with .NET MAUI and Supabase. &lt;a href="https://hackernoon.com/creating-a-books-tracker-app-with-net-maui-and-supabase"&gt;Article&lt;/a&gt;
- Vanta Case Study - Supabase turns trust into a revenue-generating opportunity with Vanta. &lt;a href="https://www.vanta.com/customers/supabase"&gt;Case Study&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Meme Zone
&lt;/h2&gt;

&lt;p&gt;As always, one of our favorite memes from last month. &lt;a href="https://twitter.com/supabase"&gt;Follow us on Twitter&lt;/a&gt; for more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L5kkenR5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/beta-update-april-2023-meme.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L5kkenR5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2023-05-09-beta-update-april/beta-update-april-2023-meme.png" alt="Beta Update Meme" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>opensource</category>
      <category>database</category>
    </item>
    <item>
      <title>Supabase Auth: SSO, Mobile, and Server-side support</title>
      <dc:creator>awalias</dc:creator>
      <pubDate>Thu, 13 Apr 2023 16:08:32 +0000</pubDate>
      <link>https://dev.to/supabase/supabase-auth-sso-mobile-and-server-side-support-4hd4</link>
      <guid>https://dev.to/supabase/supabase-auth-sso-mobile-and-server-side-support-4hd4</guid>
      <description>&lt;p&gt;Today we're excited to announce a few new features for Supabase Auth:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Easily add Single Sign-On support to your projects using SAML 2.0&lt;/li&gt;
&lt;li&gt;Better support for server-side rendering and mobile apps using PKCE&lt;/li&gt;
&lt;li&gt;Native Apple login on iOS&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Single Sign-On Support using SAML 2.0
&lt;/h2&gt;

&lt;p&gt;With Single Sign-On (SSO), your users can login with their company's identity provider (IDP), a critical feature when you're building applications for Enterprises.&lt;/p&gt;

&lt;p&gt;Every developer building a B2B application eventually needs the SSO authentication flow to onboard enterprise customers. SSO is a requirement for larger Enterprise customers because it's a standard request in Enterprise Security Policies. Over the past few months, we've been &lt;a href="https://supabase.com/docs/guides/platform/sso"&gt;dogfooding SSO for our own Enterprise customers&lt;/a&gt;, and today we're releasing it for you to do the same.&lt;/p&gt;

&lt;p&gt;Building SSO into your application isn't necessarily hard, but does come with some complexity. A lot of time can be spent understanding the nuances and details of the protocol - from dissecting the jargon to testing the implementation heavily. It took us months to build it for ourselves. With this release, you will have SSO set up and running in less than an hour so that you can focus on shipping the core features of your product. This feature is available for the &lt;a href="https://supabase.com/pricing"&gt;Pro-tier and above&lt;/a&gt;, starting today. It will also be available on the &lt;a href="https://supabase.com/docs/guides/self-hosting"&gt;self-hosted version&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/hAwJeR6mhB0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Started with SAML 2.0
&lt;/h3&gt;

&lt;p&gt;To get started, enable the &lt;a href="https://app.supabase.com/project/phcnitosaawbzytgyznx/auth/providers"&gt;“SAML 2.0“&lt;/a&gt; &lt;a href="https://app.supabase.com/project/_/auth/providers"&gt;authentication method in the dashboard&lt;/a&gt;. We've added new commands to the &lt;a href="https://supabase.com/docs/guides/cli"&gt;Supabase CLI&lt;/a&gt; to help with the configuration process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;supabase sso &lt;span class="nt"&gt;--help&lt;/span&gt;
Manage Single Sign-On &lt;span class="o"&gt;(&lt;/span&gt;SSO&lt;span class="o"&gt;)&lt;/span&gt; authentication &lt;span class="k"&gt;for &lt;/span&gt;projects

Usage:
  supabase sso &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

Available Commands:
  add         Add a new SSO identity provider
  info        Returns the SAML SSO settings required &lt;span class="k"&gt;for &lt;/span&gt;the identity provider
  list        List all SSO identity providers &lt;span class="k"&gt;for &lt;/span&gt;a project
  remove      Remove an existing SSO identity provider
  show        Show information about an SSO identity provider
  update      Update information about an SSO identity provider
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you've added a new SSO identity provider to your project, it's as simple as calling the &lt;code&gt;signInWithSSO()&lt;/code&gt; from the &lt;code&gt;supabase-js&lt;/code&gt; library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signInWithSSO&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;acme.corp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SSO with Row Level Security and multi-tenancy
&lt;/h3&gt;

&lt;p&gt;As usual, we've engineered this feature around the excellent capabilities of PostgreSQL.&lt;/p&gt;

&lt;p&gt;For example, you can use Row Level Security (RLS) to build multi-tenant applications, simply by using the provider's unique identifier in the user's JWT:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="nv"&gt;"Only allow read-write access to tenants"&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;tablename&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;restrictive&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;authenticated&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;tenant_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jwt&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'app_metadata'&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'provider'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The journey to enterprise readiness isn't an end goal, it is a continuous process that demands constant attention and maintenance. With Supabase Auth, your team can offload this engineering burden to us and prioritize the features that matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Server-Side and Mobile Auth
&lt;/h2&gt;

&lt;p&gt;Many developers today are using Supabase to build mobile apps, and server-side rendering is becoming popular (again!). This release will add support for these use cases by introducing the &lt;em&gt;Proof Key for Code Exchange flow (PKCE)&lt;/em&gt; authentication flow. This improves security for mobile apps and makes building server-first apps simple. Since this is a major update that touches many of the authentication routes, we will be rolling it out gradually over the next few weeks.&lt;/p&gt;

&lt;h3&gt;
  
  
  A brief history of Supabase Auth
&lt;/h3&gt;

&lt;p&gt;When we &lt;a href="https://news.ycombinator.com/item?id=24072051"&gt;launched&lt;/a&gt; Supabase Auth, our target was JAMstack developers. In these cases, the protocol used between the user's application and Supabase Auth is known as the &lt;a href="https://www.rfc-editor.org/rfc/rfc6749#section-4.2"&gt;Implicit Grant Flow&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpq8617vrz1qavn374sgg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpq8617vrz1qavn374sgg.png" alt="Supabase Auth implicit grant flow" width="800" height="769"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As developers built more complex apps, they encountered two problems with this authentication flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server-Side Email Verification Links&lt;/strong&gt;
Data provided in a URL fragment is only accessible in a browser environment, not on the server. This is problematic for email verification links that redirect users to a server-side route.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Challenges with Mobile App Authentication&lt;/strong&gt;
The implicit grant flow raised security concerns for mobile use cases since &lt;a href="https://www.rfc-editor.org/rfc/rfc7636#section-1"&gt;malicious apps could potentially obtain the user session&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Server-side auth unlocks a number of benefits. Developers can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set cookies on the same domain as the application.&lt;/li&gt;
&lt;li&gt;Enable server-side rendering for protected pages.&lt;/li&gt;
&lt;li&gt;Perform downstream actions after user authentication, such as adding the user to a CRM or sending analytics.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Introducing PKCE
&lt;/h3&gt;

&lt;p&gt;To solve these problems, we're introducing support for the &lt;em&gt;Proof Key for Code Exchange&lt;/em&gt; flow (PKCE, pronounced “pixy”).&lt;/p&gt;

&lt;p&gt;The PKCE flow introduces a &lt;em&gt;code verifier&lt;/em&gt; (a randomly generated secret) and a &lt;em&gt;code challenge&lt;/em&gt; (the hash of the &lt;em&gt;code verifier&lt;/em&gt;). The authorization code is returned as a query parameter so it's accessible on the server. During the PKCE flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;em&gt;code challenge&lt;/em&gt; is sent to Supabase Auth, which returns an &lt;em&gt;authorization code.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;The client sends the &lt;em&gt;authorization code&lt;/em&gt; together with the &lt;em&gt;code verifier&lt;/em&gt; to obtain the user's session.&lt;/li&gt;
&lt;li&gt;Supabase Auth checks if the &lt;em&gt;code verifier&lt;/em&gt; matches the &lt;em&gt;code challenge&lt;/em&gt; sent earlier by computing the hash. This renders a malicious attacker's attempt to intercept the authorization code useless, since they need to know the value of the &lt;em&gt;code verifier&lt;/em&gt; as well.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82tdcvmfq2rgxezzt649.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82tdcvmfq2rgxezzt649.png" alt="Supabase Auth PKCE Flow" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Migrating to PKCE on the client
&lt;/h3&gt;

&lt;p&gt;Over the next few weeks, you'll be able to use it with the Supabase libraries. We've already added PKCE to the &lt;a href="https://supabase.com/docs/reference/javascript/installing"&gt;JavaScript&lt;/a&gt; client library and our &lt;a href="https://supabase.com/docs/guides/auth/auth-helpers"&gt;auth-helpers&lt;/a&gt; library. If you're using &lt;code&gt;supabase-js&lt;/code&gt; , you can switch to PKCE by initializing your client with the following option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@supabase/supabase-js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SUPABASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SUPABASE_ANON_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;flowType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pkce&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For client-side auth, that's all you need to do to switch over. &lt;code&gt;supabase-js&lt;/code&gt; will handle the generation and storage for the code verifier, as well as exchanging the authorization code for the user's session.&lt;/p&gt;

&lt;h3&gt;
  
  
  Migrating to PKCE on the server
&lt;/h3&gt;

&lt;p&gt;Server-side authentication is now a lot easier. Let's look at an example using NextJS.&lt;/p&gt;

&lt;p&gt;Install the &lt;code&gt;next&lt;/code&gt; version of auth-helpers (lets use the &lt;code&gt;nextjs&lt;/code&gt; version for this example)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @supabase/auth-helpers-nextjs@next
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then prepare an endpoint for the sign in process. The redirect URL is set to &lt;code&gt;/api/auth/callback&lt;/code&gt;, which will be implemented next.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// api/auth/login&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextApiRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NextApiResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createServerSupabaseClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@supabase/auth-helpers-nextjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextApiRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextApiResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Create the Supabase Client&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createServerSupabaseClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;supabaseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SUPABASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;supabaseKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SUPABASE_ANON_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// Start sign in with one-time password&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signInWithOtp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;foo@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;emailRedirectTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3000/api/auth/callback&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can set up the callback API endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// api/auth/callback&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextApiRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NextApiResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createServerSupabaseClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@supabase/auth-helpers-nextjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextApiRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextApiResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Create authenticated Supabase Client&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createServerSupabaseClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;supabaseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SUPABASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;supabaseKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SUPABASE_ANON_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;// check for code in url querystring&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// exchange the auth code for user session&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exchangeCodeForSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// redirect the user to a server-side protected area in your app&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Roll out
&lt;/h3&gt;

&lt;p&gt;Since this is a major update that touches many of the authentication routes, we will roll it out gradually over the next few weeks. You will receive a notification in your dashboard when the feature is available for your project. Reach out to us if you want early access to this feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Native Apple login on iOS
&lt;/h2&gt;

&lt;p&gt;While PKCE support is great, that is not the only news for you mobile app developers out there.&lt;/p&gt;

&lt;p&gt;Building apps for iOS requires support for native &lt;em&gt;Sign in with Apple&lt;/em&gt;. We heard the community's requests for native sign-in. We hope you join our excitement to officially announce support for native &lt;em&gt;Sign in with Apple&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Your app's iOS Bundle ID can now be configured in the Apple provider section of your project's dashboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0i01lxy6gtkwo5abwe07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0i01lxy6gtkwo5abwe07.png" alt="Native Apple login on iOS" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the only prerequisite for triggering a native &lt;em&gt;Sign in with Apple.&lt;/em&gt; With &lt;a href="https://pub.dev/packages/supabase_flutter#native-sign-in-with-apple-example"&gt;supabase-flutter&lt;/a&gt;, this is as easy as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;AuthResponse&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;supabase&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;signInWithApple&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's that easy! No need to set up deep links, no need to pass any parameters.&lt;/p&gt;

&lt;p&gt;We're just starting with Apple login, and soon add support for Google login.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Supabase Auth aims to continue developing auth features that are secure by default yet simple to implement. We use Supabase Auth for our hosted platform and continuously dogfood the latest version on it. If you are interested to migrate to Supabase Auth, you can check out this blog post on how &lt;a href="https://kevcodez.medium.com/migrating-125-000-users-from-auth0-to-supabase-81c0568de307"&gt;Parqet migrated 125,000 users from Auth0 to Supabase Auth&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  More Launch Week 7
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/storage-v3-resumable-uploads"&gt;Day 3: Supabase Storage v3: Resumable Uploads with support for 50GB files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/edge-runtime-self-hosted-deno-functions"&gt;Day 2: Supabase Edge Runtime: Self-hosted Deno Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/supabase-logs-self-hosted"&gt;Day 1: Supabase Logs: open source logging server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/launch-week-7-hackathon"&gt;The Supabase AI Hackathon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/supabase/supavisor"&gt;Supavisor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/designing-with-ai-midjourney"&gt;Designing with AI: Generating unique artwork for every user&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://supabase.com?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm%5C_term=devtocta" class="ltag_cta ltag_cta--branded"&gt;🚀 Learn more about Supabase&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>opensource</category>
      <category>authentication</category>
      <category>programming</category>
    </item>
    <item>
      <title>Supabase Storage v3: Resumable Uploads with support for 50GB files</title>
      <dc:creator>awalias</dc:creator>
      <pubDate>Wed, 12 Apr 2023 15:48:42 +0000</pubDate>
      <link>https://dev.to/supabase/supabase-storage-v3-resumable-uploads-with-support-for-50gb-files-2egd</link>
      <guid>https://dev.to/supabase/supabase-storage-v3-resumable-uploads-with-support-for-50gb-files-2egd</guid>
      <description>&lt;p&gt;Supabase Storage is receiving a major upgrade, implementing many of the most requested features from our users: Resumable Uploads, Quality Filters, Next.js support, and WebP support.&lt;/p&gt;

&lt;p&gt;The key feature: &lt;strong&gt;Resumable Uploads&lt;/strong&gt;! With Resumable Uploads, you can continue uploading a file from where you left off, even if you lose internet connectivity or accidentally close your browser tab while uploading.&lt;/p&gt;

&lt;p&gt;Resumable uploads divides the file into chucks before uploading them, emitting progress events during upload.&lt;/p&gt;

&lt;p&gt;With this release, you can now upload files as large as 50GB! (Previously the limit was 5GB).&lt;/p&gt;

&lt;p&gt;To build this feature, we implemented Postgres Advisory locks which solved some gnarly concurrency problems. We can now handle edge-cases, like two clients uploading to the same location. We’ll deep dive into how we implemented Advisory locks later in the post.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/pT2PcZFq_M0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  New features
&lt;/h2&gt;

&lt;p&gt;Storage v3 introduces a number of new features.&lt;/p&gt;

&lt;h3&gt;
  
  
  More image transformations options
&lt;/h3&gt;

&lt;p&gt;We introduced image resizing last Launch Week. This time, we’ve added the ability to specify &lt;code&gt;quality&lt;/code&gt; and &lt;code&gt;format&lt;/code&gt; filters when downloading your image. When you request images via the transform endpoint, by default we render it as Webp, if the client supports it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bucket&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;download&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;origin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Next.js loader
&lt;/h3&gt;

&lt;p&gt;You can serve images from Storage with a simple Next.js loader for the Image component. Check out &lt;a href="https://supabase.com/docs/guides/storage/image-transformations#nextjs-loader" rel="noopener noreferrer"&gt;our docs&lt;/a&gt; on how to get started.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// supabase-image-loader.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;projectId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;SUPABASE_PROJECT_ID&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;supabaseLoader&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quality&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;projectId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.supabase.co/storage/v1/render/image/public/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?width=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;quality=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
    &lt;span class="nx"&gt;quality&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// nextjs.config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;custom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loaderFile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./supabase-image-loader.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Using Next Image&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Image&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MyImage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bucket/image.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Picture of the author&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Presigned upload URLs
&lt;/h3&gt;

&lt;p&gt;Authenticated users can now generate presigned URLs.&lt;/p&gt;

&lt;p&gt;These URLs can then be shared with other users who can then upload to storage without further authorization. For example, you can generate a presigned URL on your server (ahem, Edge Function).&lt;/p&gt;

&lt;p&gt;Shoutout to community members &lt;a href="https://github.com/abbit" rel="noopener noreferrer"&gt;@abbit&lt;/a&gt; and &lt;a href="https://github.com/MagnusHJensen" rel="noopener noreferrer"&gt;@MagnusHJensen&lt;/a&gt; who &lt;a href="https://github.com/supabase/storage-api/pull/282" rel="noopener noreferrer"&gt;implemented&lt;/a&gt; this feature on the Storage server and &lt;a href="https://github.com/Rawnly" rel="noopener noreferrer"&gt;@Rawnly&lt;/a&gt; for the &lt;a href="https://github.com/supabase/storage-js/pull/152" rel="noopener noreferrer"&gt;client library bindings&lt;/a&gt; 🎉.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// create a signed upload url&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users.txt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newBucketName&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;createSignedUploadUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// this token can then be used to upload to storage&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newBucketName&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;uploadToSignedUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Size and file type limits per bucket
&lt;/h3&gt;

&lt;p&gt;You can now restrict the size and type of objects on a per-bucket basis. These features make it easy to upload to Storage from the client directly, without requiring validation from an intermediary server.&lt;/p&gt;

&lt;p&gt;For example, you can restrict your users a 1 MB and &lt;code&gt;image/*&lt;/code&gt; files when uploading their profile images:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7oucdynjm4fn7tjp917r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7oucdynjm4fn7tjp917r.png" alt="Bucket Restrictions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deep Dive into Resumable Uploads
&lt;/h2&gt;

&lt;p&gt;Let’s get into the nuts-and-bolts of how we implemented Resumable Uploads.&lt;/p&gt;

&lt;p&gt;First, why do we need Resumable Uploads, when the HTTP protocol has a standard method for uploading files - &lt;code&gt;multipart/form-data&lt;/code&gt; ? This approach works well for small files, since the file is streamed to the server in bytes over the network. For medium to large files this method becomes problematic, especially on spotty connections like mobile networks. Uploads that are interrupted need to be restarted from the beginning.&lt;/p&gt;

&lt;h3&gt;
  
  
  TUS - Resumable Protocol
&lt;/h3&gt;

&lt;p&gt;We use S3 to store your files and it implements a proprietary protocol for resumable uploads. At Supabase, we support existing open source communities when possible and so, instead of exposing the S3 protocol to our users, we implemented &lt;a href="https://tus.io/" rel="noopener noreferrer"&gt;TUS&lt;/a&gt; (historically an acronym for Transloadit Upload Server, later renamed to The Upload Server). TUS is an open protocol for resumable file uploads. By leveraging an open protocol, developers can use existing libraries with Supabase Storage.&lt;/p&gt;

&lt;p&gt;TUS is a powerful protocol. It’s built on top of HTTP, making it easy to integrate your browser and mobile applications. Because of its open nature, a variety of powerful, drop-in clients and open-source libraries have been built around it. For example, at Supabase, we love &lt;a href="https://uppy.io/docs/tus/" rel="noopener noreferrer"&gt;Uppy.js&lt;/a&gt;, a multi-file uploader for TUS.&lt;/p&gt;

&lt;p&gt;Using Uppy with Supabase Storage looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Uppy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Tus&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://releases.transloadit.com/uppy/v3.6.1/uppy.min.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;anon-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;projectId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-project-ref&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bucketName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;avatars&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;folderName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;foldername&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabaseUploadURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;projectId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.supabase.co/storage/v1/upload/resumable`&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;uppy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uppy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;inline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#drag-drop-area&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;showProgressDetails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Tus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;supabaseUploadURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;chunkSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;allowedMetaFields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bucketName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;objectName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;contentType&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cacheControl&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;uppy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file-added&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;bucketName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bucketName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;objectName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;folderName&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;folderName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;uppy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;complete&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Upload complete! We’ve uploaded these files:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;successful&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And there you have it, with a few lines of code, you can support parallel, resumable uploads of multiple files, with progress events!&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing TUS inside Supabase Storage
&lt;/h2&gt;

&lt;p&gt;There were a few technical challenges we faced while implementing TUS in Supabase Storage.&lt;/p&gt;

&lt;p&gt;Storage is powered by our &lt;a href="https://github.com/supabase/storage-api" rel="noopener noreferrer"&gt;Storage-API service&lt;/a&gt;, a Node.js server that interfaces with different storage backends (like AWS S3). It is fully integrated with the Supabase ecosystem, making it easy to protect files with Postgres RLS policies.&lt;/p&gt;

&lt;p&gt;To implement the TUS protocol, we use &lt;a href="https://github.com/tus/tus-node-server" rel="noopener noreferrer"&gt;tus-node-server&lt;/a&gt;, which was recently ported to Typescript. It was only missing a few features we needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ability to limit the upload to files of a certain size&lt;/li&gt;
&lt;li&gt;Ability to run multiple instances of TUS (more on this later)&lt;/li&gt;
&lt;li&gt;Ability to expire upload URLs after a certain amount of time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will be contributing these features back to TUS with discussions and PRs after Launch Week.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scaling TUS
&lt;/h3&gt;

&lt;p&gt;One of the biggest challenges we faced was the ability to scale TUS by running multiple instances of the server behind a load balancer. The protocol divides the file into chunks and sends it to any arbitrary server. Each chunk can be processed by a different server. Cases like these can lead to corrupted files with multiple servers trying to buffer the same file to S3 concurrently.&lt;/p&gt;

&lt;p&gt;The TUS documentation gives 2 work-arounds:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use Sticky sessions to direct the client to the same server the upload was originally started.&lt;/li&gt;
&lt;li&gt;Implement some sort of distributed locking to ensure exclusive access to the storage backend.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Option 1 would have affected the even distribution of requests across servers. We decided to go with option 2 - Distributed Locking. Storage uses Postgres as a database, a queue, and now as a lock manager.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter Postgres Advisory Locks
&lt;/h3&gt;

&lt;p&gt;Postgres advisory locks offer a way for defining locking behaviour of resources &lt;em&gt;outside&lt;/em&gt; of the database. These are called &lt;em&gt;advisory&lt;/em&gt; locks because Postgres does not enforce their use - it is up to the application to acquire and release the locks when accessing the shared resource. In our case, the shared resource is an object in S3. Advisory locks can be used to mediate concurrent operations to the same object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`/bucket-name/folder/bunny.jpg`&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hashedKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withTransaction&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// try acquiring a transactional advisory lock&lt;/span&gt;
    &lt;span class="c1"&gt;// these locks are automatically released at the end of every transaction&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SELECT pg_advisory_xact_lock(?)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;hashedKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// the current server can upload to s3 at the given key&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;uploadObject&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

   &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isLastChunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// storage.objects stores the object metadata of all objects&lt;/span&gt;
    &lt;span class="c1"&gt;// It doubles up as a way to enforce authorization.&lt;/span&gt;
    &lt;span class="c1"&gt;// If a user is able to insert into this table, they can upload.&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;insert into storage.objects(..) values(..)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// the advisory lock is automatically released at this point&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With advisory locks, we’ve been able to utilize Postgres as a key part of the Supabase Stack to solve difficult concurrency problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Roll out
&lt;/h3&gt;

&lt;p&gt;Because this is a major update, we’re rolling it out gradually over the next month. You will receive a notification in your dashboard when the feature is available for project. Reach out to us if you want early access to this feature.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkyvkd7wpjgjxyqagi4ng.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkyvkd7wpjgjxyqagi4ng.gif" alt="Let me in!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Coming up next
&lt;/h2&gt;

&lt;p&gt;We’ve got an exciting roadmap for the next few Storage releases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Presigned upload URLs for TUS&lt;/li&gt;
&lt;li&gt;Increasing max file size limit to 500 GB&lt;/li&gt;
&lt;li&gt;Transform images stored outside Supabase Storage&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://supabase.com/docs/guides/storage/cdn#smart-cdn-caching" rel="noopener noreferrer"&gt;Smart CDN&lt;/a&gt; v2 with an even higher cache hit rate&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More Launch Week 7
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/edge-runtime-self-hosted-deno-functions" rel="noopener noreferrer"&gt;Day 2: Supabase Edge Runtime: Self-hosted Deno Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/supabase-logs-self-hosted" rel="noopener noreferrer"&gt;Day 1: Supabase Logs: open source logging server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/launch-week-7-hackathon" rel="noopener noreferrer"&gt;The Supabase AI Hackathon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/supabase/supavisor" rel="noopener noreferrer"&gt;Supavisor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/designing-with-ai-midjourney" rel="noopener noreferrer"&gt;Designing with AI: Generating unique artwork for every user&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>supabase</category>
      <category>opensource</category>
      <category>postgres</category>
      <category>storage</category>
    </item>
    <item>
      <title>Supabase AI Hackathon</title>
      <dc:creator>awalias</dc:creator>
      <pubDate>Sun, 09 Apr 2023 22:36:58 +0000</pubDate>
      <link>https://dev.to/supabase/supabase-ai-hackathon-30ah</link>
      <guid>https://dev.to/supabase/supabase-ai-hackathon-30ah</guid>
      <description>&lt;h2&gt;
  
  
  Key Facts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You have 10 days to build a new &lt;strong&gt;Open Source&lt;/strong&gt; project using &lt;a href="https://supabase.com"&gt;Supabase&lt;/a&gt; in some capacity.

&lt;ul&gt;
&lt;li&gt;Starting 6:00 am PT Friday 7th April 2023&lt;/li&gt;
&lt;li&gt;The submission deadline is 11:59 pm Sunday midnight PT 16th April 2023&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Enter as an individual, or as a team of up to 5 people&lt;/li&gt;
&lt;li&gt;Build whatever you want - a project, app, tool, library, or anything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J0MKAPca--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dh2q45y2ql3w0l4xoa9m.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J0MKAPca--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dh2q45y2ql3w0l4xoa9m.jpeg" alt="Black and purple supabase mechanical keyboard" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prizes
&lt;/h2&gt;

&lt;p&gt;There are 5 categories, there will be prizes for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best overall project (Mechanical Keyboards &amp;amp; Swag kit)&lt;/li&gt;
&lt;li&gt;Best use of AI (Swag kit)&lt;/li&gt;
&lt;li&gt;Most fun / best easter egg (Swag kit)&lt;/li&gt;
&lt;li&gt;Most technically impressive (Swag kit)&lt;/li&gt;
&lt;li&gt;Most visually pleasing (Swag kit)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There will be a winner and a runner-up prize for each category. Every team member on winning/runner-up teams gets a Supabase Launch Week swag kit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Submission
&lt;/h2&gt;

&lt;p&gt;You should submit your project using &lt;a href="https://www.madewithsupabase.com/launch-week-7"&gt;this form&lt;/a&gt; before 11:59 pm Sunday midnight PT 16th April 2023. Extra points if you include a simple video demoing the app in the description. &lt;/p&gt;

&lt;h2&gt;
  
  
  Judges
&lt;/h2&gt;

&lt;p&gt;The Supabase team will judge the winners for each category.&lt;br&gt;
We'll be looking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creativity/inventiveness&lt;/li&gt;
&lt;li&gt;functions correctly/smoothly&lt;/li&gt;
&lt;li&gt;visually pleasing&lt;/li&gt;
&lt;li&gt;technically impressive&lt;/li&gt;
&lt;li&gt;use of Supabase features

&lt;ul&gt;
&lt;li&gt;deep usage of a single feature or&lt;/li&gt;
&lt;li&gt;broad usage are both ok&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;FUN! 😃&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Team size 1-5 (all team members on winning teams will receive a prize)&lt;/li&gt;
&lt;li&gt;You cannot be on multiple teams&lt;/li&gt;
&lt;li&gt;One submission per team&lt;/li&gt;
&lt;li&gt;It's not a requirement to use AI, it's just a theme&lt;/li&gt;
&lt;li&gt;All design elements, code, etc. for your project must be created &lt;strong&gt;during&lt;/strong&gt; the event&lt;/li&gt;
&lt;li&gt;All entries must be Open Source (link to source code required in entry)&lt;/li&gt;
&lt;li&gt;Must use Supabase in some capacity&lt;/li&gt;
&lt;li&gt;Can be any language or framework&lt;/li&gt;
&lt;li&gt;You must submit before the deadline (no late entries)&lt;/li&gt;
&lt;li&gt;(optional) Include a link to a demo video along with the submission for extra points&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Supabase resources to get you started
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=29p8kIqyU_Y"&gt;OpenAI with Edge Functions YouTube video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=9N66JBRLNYU"&gt;Streaming Data in Edge Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/openai-embeddings-postgres-vector"&gt;Storing OpenAI embeddings in Postgres with pgvector article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://supabase.com/docs/guides/database/extensions/pgvector"&gt;pgvector guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Community help
&lt;/h3&gt;

&lt;p&gt;The Supabase Team will be taking part in the Hackathon and you'll find us live to build in our discord all week. Please join us by building in public:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text channel: &lt;a href="https://discord.gg/UYyweApy"&gt;#hackathon&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Audio channel: &lt;a href="https://discord.gg/Vj3mTPwH"&gt;#hackathon&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need help or advice when building, find other people to join your team, or if you just want to chill and watch people build, come and join us!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://discord.supabase.com/"&gt;Join our Discord&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F5KZFw1p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/_next/image%3Furl%3D%252Fimages%252Fblog%252Flw7-hackathon%252Fdiscord.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F5KZFw1p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/_next/image%3Furl%3D%252Fimages%252Fblog%252Flw7-hackathon%252Fdiscord.png%26w%3D3840%26q%3D75" alt="Supabase Discord Channel" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Launch Week
&lt;/h2&gt;

&lt;p&gt;Don't forget to check out the new features being announced as part of &lt;a href="https://supabase.com/launch-week"&gt;Launch Week&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/launch-week-6-hackathon-winners"&gt;Previous Hackathon Prize Winners&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Additional Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Any intellectual property developed during the hackathon will belong to the team that developed it. We expect that each team will have an agreement between themselves regarding the IP, but this is not required&lt;/li&gt;
&lt;li&gt;By making a submission you grant Supabase permission to use screenshots, code snippets, and/or links to your project or content of your README on our Twitter, blog, website, email updates, and in the Supabase discord server. Supabase does not make any claims over your IP.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hackathon</category>
      <category>ai</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Supabase Beta August 2022</title>
      <dc:creator>awalias</dc:creator>
      <pubDate>Thu, 08 Sep 2022 12:09:05 +0000</pubDate>
      <link>https://dev.to/supabase/supabase-beta-august-2022-1cj3</link>
      <guid>https://dev.to/supabase/supabase-beta-august-2022-1cj3</guid>
      <description>&lt;p&gt;This month the Beta Update is a Launch Week special. #SupaLaunchWeek 5 just happened and it was a big one, so we revisit everything we shipped, congratulate the winners of the Supa Hackathon, and of course we have the extended the Community Highlights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 1 - Supabase CLI v1 and Admin API Beta
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VET2Qg92--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/CLI.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VET2Qg92--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/CLI.png" alt="Day 1 - Supabase CLI v1 and Admin API Beta" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Supabase CLI is now in v1.0 (including the ability to generate TypeScript types 🎉). We also released the Admin API Beta, a REST API that opens the door to a whole new suite of integrations (Zapier, Terraform, Pulumi, you name it). Full programmatic control of your projects and orgs is on the way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/supabase-cli-v1-and-admin-api-beta"&gt;Blog Post&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=OpPOaJI_Z28"&gt;Video Announcement&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 2 - supabase-js v2 Release Candidate
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LivLtHPE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/supabase_js.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LivLtHPE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/supabase_js.png" alt="Day 2 - supabase-js v2 Release Candidate" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/supabase/supabase-js"&gt;supabase-js v2&lt;/a&gt;&lt;/strong&gt; focuses on "quality-of-life" improvements for developers and includes Type Support, new Auth Methods, async Auth overhaul, improvements for Edge Functions, and more. We couldn't have done this without our amazing Community, so thanks a lot to everyone who contributed. &lt;/p&gt;

&lt;p&gt;Try it out by running &lt;code&gt;npm i @supabase/supabase-js@rc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/supabase-js-v2"&gt;Blog Post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/iqZlPtl_b-I"&gt;Video Announcement&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 3 - Supabase is SOC2 compliant
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7KEViUZp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/security.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7KEViUZp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/security.png" alt="Day 3 - Supabase is SOC2 compliant" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our customers can rest assured knowing their information is secure and private 🔒. The blog post explains the process we went through to get there and is very useful for anyone building a SaaS product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/supabase-soc2"&gt;Blog Post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/security"&gt;Security at Supabase&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/6bGQotxisoY"&gt;Video Announcement&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 4 - Realtime: Multiplayer Edition
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fk1AdvVy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/realtime.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fk1AdvVy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/realtime.png" alt="Day 4 - Realtime: Multiplayer Edition" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next level Realtime is here ⚡️. Presence and Broadcast are two key blocks developers can use to build the digital experiences users want. All projects now have access to these features. Try it out in combination with supabase-js v2.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/supabase-realtime-multiplayer-general-availability"&gt;Blog Post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/CGZr5tybW18"&gt;Video Announcement&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 5 - Community Day and One More Thing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hhbs2cLl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/day-5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hhbs2cLl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/day-5.png" alt="Day 5 - Community Day and One More Thing" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We wrapped Launch Week 5 with contributors, partners, and friends and the traditional One More Thing... that was actually SIX more things: &lt;a href="https://supabase.com/blog/supabase-vault"&gt;Supabase Vault&lt;/a&gt;, Auth UI, Dashboard permissions, &lt;a href="https://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validation"&gt;JSON schema validation&lt;/a&gt;, pg_graphql v0.4.0, MFA early-access.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/launch-week-5-community-day"&gt;Community Day Blog Post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=s9UePQjLT0U"&gt;Community Day Video Announcement&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/launch-week-5-one-more-thing"&gt;One More Thing Blog Post&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Launch Week 5 Hackathon
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s_T_Q5m6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/hackathon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s_T_Q5m6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/hackathon.png" alt="Launch Week 5 Hackathon" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We had a huge amount of open source submissions 🤯. The selection process was not easy as it wasn't only quantity, but also quality. After a thorough review, we declared &lt;a href="https://github.com/psteinroe/supabase-cache-helpers"&gt;Supabase Cache Helpers&lt;/a&gt; the overall winner of the $1500 GitHub sponsorship and Gold SupaCap. Congratulations to &lt;a href="https://twitter.com/psteinroe"&gt;@psteinroe&lt;/a&gt; 👏&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/blog/launch-week-5-hackathon-winners"&gt;Full list of winners&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.madewithsupabase.com/launch-week-5"&gt;Check all the submissions in Made with Supabase&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Platform Updates
&lt;/h2&gt;

&lt;p&gt;The following changes to the Supabase Platform will take effect from September 11th at 7 pm PDT.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  HTTP API requests to Supabase will automatically be redirected to HTTPS.&lt;/li&gt;
&lt;li&gt;  The API Key was passed to Supabase both in the &lt;code&gt;Authorization&lt;/code&gt; header and in a separate &lt;code&gt;apiKey&lt;/code&gt; header. This led to confusion among new users of Supabase who used the API directly. It is no longer required to send the anon key or service key via the &lt;code&gt;apiKey&lt;/code&gt; header. If you are using Supabase via our client libraries, no change is required from your side.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Supabase Migration Guides
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K3QCREK1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/migration-to-supabase-guides.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K3QCREK1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/migration-to-supabase-guides.jpg" alt="Supabase Migration Guides" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our guides and tools make it super easy to migrate your projects to Supabase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://supabase.com/docs/guides/migrations/firebase-auth"&gt;Firebase Auth Migration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://supabase.com/docs/guides/migrations/firestore-data"&gt;Firestore Data Migration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://supabase.com/docs/guides/migrations/firebase-storage"&gt;Firebase Storage Migration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://supabase.com/docs/guides/migrations/heroku"&gt;Migrate from Heroku to Supabase&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Webinar: How Netlify and Supabase Enables “Supa” DX
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Mv0DHrFN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/webinar.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Mv0DHrFN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/webinar.jpg" alt="Webinar: How Netlify and Supabase Enables “Supa” DX" width="800" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our friends from Netlify invited Ant to their new webinar series. He and Netlify's VP of Partnerships &amp;amp; Ecosystems, Steven Larsen, will show you how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy Supabase’s open source backend together with Netlify&lt;/li&gt;
&lt;li&gt;Build User Management without handing over user data to any third parties&lt;/li&gt;
&lt;li&gt;Upload files and folders to the cloud without needing to tack on additional tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.netlify.com/resources/webinars/how-netlify-supabase-enables-supa-dx/"&gt;Save your seat.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Extended Community Highlights
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bWn4YJTH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-june/community.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bWn4YJTH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-june/community.jpg" alt="Community" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Inian shared our journey with Cloudflare. &lt;a href="https://twitter.com/Cloudflare/status/1557728943901675520"&gt;Video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Supabase Tips: Introduction to Supabase Storage. &lt;a href="https://www.youtube.com/watch?v=J9mTPY8rIXE"&gt;Video&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;  Zack DeRose playing around with Supabase and Nx. &lt;a href="https://www.youtube.com/watch?v=OTh5GBBfr4E"&gt;Part 1&lt;/a&gt; | &lt;a href="https://www.youtube.com/watch?v=_5gJi_xwpzk"&gt;Part 2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  A new guide showing how to combine Supabase and Directus. &lt;a href="https://supabase.com/docs/guides/integrations/directus"&gt;Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Supabase with Flutter course on raywenderlich. &lt;a href="https://www.raywenderlich.com/33619647-supabase-with-flutter"&gt;Course&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Build a full-stack app with Next.js and Supabase on the LogRocket blog. &lt;a href="https://blog.logrocket.com/build-full-stack-app-next-js-supabase/"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Supabase Crash Course by The Net Ninja. &lt;a href="https://www.youtube.com/watch?v=ydz7Dj5QHKY&amp;amp;list=PL4cUxeGkcC9hUb6sHthUEwG7r9VDPBMKO"&gt;Video Courses&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  How to build a Grocery Application with Webflow CMS using DhiWise. &lt;a href="https://dev.to/saloni137/how-to-build-a-grocery-application-with-webflow-cms-using-dhiwise-1a72"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  How To Create a Full Stack app with SolidJS, Supabase, and TailwindCSS &lt;a href="https://blog.chetanverma.com/how-to-create-a-full-stack-app-with-solidjs-supabase-and-tailwindcss"&gt;Video and Tutorial.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  The WalletConnect Cloud now supports Sign in wtih Ethereum. &lt;a href="https://twitter.com/TheHarryET/status/1559861021845643265"&gt;Announcement&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  Building In Public: Cartta Tech Stack. &lt;a href="https://dev.to/fvaldes33/building-in-public-cartta-tech-stack-5en0"&gt;Article&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Supabase + Vue 3 in 12 minutes. &lt;a href="https://www.youtube.com/watch?v=YN32uVqAXw8&amp;amp;feature=emb_title"&gt;Video&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  We’re hiring
&lt;/h2&gt;

&lt;p&gt;Come join one of the fastest growing open source projects ever 🤗&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://boards.greenhouse.io/supabase/jobs/4652333004"&gt;Lead Billing Engineer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://boards.greenhouse.io/supabase/jobs/4594393004"&gt;Customer Success (US time zone)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://boards.greenhouse.io/supabase/jobs/4191650004"&gt;Support Engineers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://boards.greenhouse.io/supabase"&gt;View all our openings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Meme Zone
&lt;/h2&gt;

&lt;p&gt;If you made it this far in the blog post you deserve a treat. &lt;a href="https://twitter.com/supabase"&gt;Follow us on Twitter&lt;/a&gt; for more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YoaM5srY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/supabase-beta-update-august-2022-meme.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YoaM5srY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/2022-august/supabase-beta-update-august-2022-meme.png" alt="Supabase meme august 2022" width="800" height="804"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Start using Supabase today: &lt;strong&gt;&lt;a href="https://app.supabase.com/"&gt;app.supabase.com&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Make sure to &lt;strong&gt;&lt;a href="https://github.com/supabase/supabase"&gt;star us on GitHub&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Follow us &lt;strong&gt;&lt;a href="https://twitter.com/supabase"&gt;on Twitter&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Subscribe to our &lt;strong&gt;&lt;a href="https://www.youtube.com/c/supabase"&gt;YouTube channel&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>supabase</category>
      <category>database</category>
      <category>open</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Supabase Beta July 2022</title>
      <dc:creator>awalias</dc:creator>
      <pubDate>Thu, 04 Aug 2022 14:53:20 +0000</pubDate>
      <link>https://dev.to/awalias/supabase-beta-july-2022-55ll</link>
      <guid>https://dev.to/awalias/supabase-beta-july-2022-55ll</guid>
      <description>&lt;p&gt;It’s happening! Launch Week is back ✊. We are preparing lots of product announcements and fun activities. Join us the week of August 15-19 for Launch Week 5️⃣.&lt;/p&gt;

&lt;p&gt;We don't ship only during Launch Weeks, so this month we still bring you some great new stuff: Flutter SDK 1.0 (developer preview), Auth Helpers, pg_jsonschema, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Launch Week Golden Ticket
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nJmnd0iO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/teaser.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nJmnd0iO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/teaser.jpg" alt="Launch week golden ticket" width="880" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Register for &lt;a href="https://twitter.com/hashtag/SupaLaunchWeek"&gt;#SupaLaunchWeek 5&lt;/a&gt; and if you are lucky, you may pull a golden ticket and win a limited edition Supabase goodie bag! &lt;a href="https://supabase.com/launch-week"&gt;Get a ticket&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supabase Flutter SDK 1.0 developer preview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DZi7BLWc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/flutter-sdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DZi7BLWc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/flutter-sdk.png" alt="flutter sdk 1.0" width="880" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Supabase Flutter SDK is getting a major update, with a big focus on developer experience. We shared a preview of what is to come so you can help us make it even better with your feedback. &lt;a href="https://supabase.com/blog/2022/08/02/supabase-flutter-sdk-1-developer-preview"&gt;Read the blog.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Revamped Auth Helpers (now with SvelteKit support)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tD3j52AS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/auth-helpers.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tD3j52AS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/auth-helpers.jpg" alt="Sveltekit auth helpers" width="880" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've been hard at work making an Auth experience that is as smooth as possible for Supabase developers. The new Auth Helpers have a better experience for server-side rendering (SSR) environments, new Github structure, SvelteKit support, and more. &lt;a href="https://supabase.com/blog/2022/07/13/supabase-auth-helpers-with-sveltekit-support"&gt;Read the blog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  pg_jsonschema – A Postgres extension for JSON validation
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N5xIeLFf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/pg_jsonschema.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N5xIeLFf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/pg_jsonschema.png" alt="pg_jsonschema" width="880" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Born as an excuse to play with pgx, pg_jsonschema is a solution we're exploring to allow enforcing more structure on json and jsonb typed postgres columns. &lt;a href="https://github.com/supabase/pg_jsonschema/tree/fb7ab09bf6050130e8d656f2999ec0f6a3fedc0d"&gt;Only 10 lines of code&lt;/a&gt; 😎&lt;/p&gt;

&lt;h2&gt;
  
  
  hCaptcha integration
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4mUtOUDh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/hCaptcha-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4mUtOUDh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/hCaptcha-1.png" alt="hCaptcha" width="880" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The new hCpatcha integration allows you to implement captcha functionality for auth. Enable hCaptcha protection in the auth settings to stop bots attacks and protect your users' privacy. &lt;a href="https://supabase.com/docs/reference/tools/reference-auth"&gt;Captcha settings&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Updated Settings UI in dashboard
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eNXLpUQy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/auth-config.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eNXLpUQy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/auth-config.jpeg" alt="supabase-updated-settings-ui-dashboard" width="880" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've started updating our settings UI, starting with the Auth settings. You'll now see updated UI for setting up your Auth providers, Email templates and SMTP config. &lt;a href="https://app.supabase.com/project/_/auth/settings"&gt;Auth settings&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick product announcements
&lt;/h2&gt;

&lt;p&gt;-  Email OTP now supports 6-10 digits length. &lt;a href="https://github.com/supabase/gotrue/pull/513"&gt;PR&lt;/a&gt;&lt;br&gt;
-  GenerateLink method now returns the email_otp, the hashed_token , the verification_type and the redirect_to. &lt;a href="https://github.com/supabase/gotrue/pull/537"&gt;PR&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Nuxt 3 Quickstart
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FXMIKWae--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/Nuxt-Supabase-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FXMIKWae--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/Nuxt-Supabase-2.png" alt="nuxt-3-supabase-quickstart" width="880" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a new quickstart in town. The guide, powered by &lt;a href="https://supabase.nuxtjs.org/"&gt;NuxtSupabase&lt;/a&gt;, shows how to build a simple user management app using Supabase and Nuxt 3, including Database, Auth, Storage, and more. &lt;a href="https://supabase.com/docs/guides/with-nuxt-3"&gt;Get started&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Made with Supabase
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1RhK8m6l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/buy-me-a-pizza.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1RhK8m6l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/buy-me-a-pizza.jpg" alt="made with supabase" width="880" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymea.pizza/"&gt;BuyMeAPizza&lt;/a&gt; | A brand new, free, and open source service to accept donations in crypto on your website. Built with Next.js, Tailwind, Supabase, and Solana tools.&lt;/p&gt;

&lt;p&gt;Discover other projects: &lt;a href="https://www.madewithsupabase.com/"&gt;Made with Supabase&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Community highlights
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V5prNeG7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/community--dark.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V5prNeG7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/community--dark.jpg" alt="Community" width="880" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Supabase community is exploding and we’ve reached a point where we can’t fit everything into our monthly newsletter so here’s the full list of community updates from July:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Netlify announced a new webinar series, Web Ecosystem, and we get to be part of it. &lt;a href="https://www.netlify.com/blog/web-ecosystem-webinar-series/"&gt;Blog Post&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Implementing "seen by" functionality with Postgres. &lt;a href="https://supabase.com/blog/2022/07/18/seen-by-in-postgresql"&gt;Blog Post&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open Source Startup Podcast with our CEO Paul Copplestone. &lt;a href="https://anchor.fm/ossstartuppodcast/episodes/E43-Building-Supabase--the-Open-Source-Firebase-Alternative-e1ld637"&gt;Podcast&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Scaleway listed 40+ of the best open-source tools to build your startup. &lt;a href="https://blog.scaleway.com/40-open-source-projects/"&gt;Blog Post&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sign-up form with OTP and auto login using Supabase and Arengu. &lt;a href="https://www.arengu.com/tutorials/sign-up-form-with-otp-and-auto-login-using-supabase"&gt;Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Setup Supabase with Nest.js. &lt;a href="https://blog.devgenius.io/setup-supabase-with-nest-js-85041b03ec3a"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Loading SportsDB data into Supabase. &lt;a href="https://dev.to/supabase/auto-generated-documentation-in-supabase-5e8o"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Introduction to Supabase: Postgres Database using Python. &lt;a href="https://www.analyticsvidhya.com/blog/2022/07/introduction-to-supabase-postgres-database-using-python/"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Supabase and SWR to fetch data updates in realtime using React Hooks. &lt;a href="https://dev.to/jakobpotosme/supabase-swr-3icp"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Protected routes using Next.js Edge Middleware &amp;amp; Supabase. &lt;a href="https://engineering.udacity.com/protected-routes-using-next-js-edge-middleware-supabase-f197ba7f503c"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Supabase backend demo with Bravo Studio. &lt;a href="https://www.youtube.com/watch?v=ZWQeAmbYFzg"&gt;Video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Building a live demo with Supabase and AppSmith. &lt;a href="https://www.youtube.com/watch?v=xmb4JrTYhZg"&gt;Video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Auto-generated documentation in Supabase. &lt;a href="https://dev.to/supabase/auto-generated-documentation-in-supabase-5ecd"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Speeding Up Bulk Loading in PostgreSQL. &lt;a href="https://dev.to/supabase/speeding-up-bulk-loading-in-postgresql-41g5"&gt;Blog Post&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Installing React-Admin In A Remix App. &lt;a href="https://marmelab.com/blog/2022/07/01/add-react-admin-to-your-remix-app-using-supabase.html"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  How to set up Supabase in React? And Some Useful Tips. &lt;a href="https://dev.to/eminvergil/how-to-setup-supabase-in-react-and-some-useful-tips-40oc"&gt;Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  My approach to authentication with Next.JS, Prisma &amp;amp; Supabase. &lt;a href="https://ktra99.hashnode.dev/my-approach-to-authentication-with-nextjs-prisma-supabase"&gt;Guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  We’re hiring
&lt;/h2&gt;

&lt;p&gt;Come join one of the fastest growing open source projects ever 🤗&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;a href="https://boards.greenhouse.io/supabase/jobs/4594393004"&gt;Customer Success (US time zone)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://boards.greenhouse.io/supabase/jobs/4561503004"&gt;Go-To-Market Recruiter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://boards.greenhouse.io/supabase"&gt;View all our openings&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Meme Zone
&lt;/h2&gt;

&lt;p&gt;If you made it this far in the blog post you deserve a treat. &lt;a href="https://twitter.com/supabase"&gt;Follow us on Twitter&lt;/a&gt; for more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OqELXSC---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/CSS-meme.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OqELXSC---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://supabase.com/images/blog/2022-july/CSS-meme.jpg" alt="Supabase meme june 2022" width="680" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Start using Supabase today: &lt;strong&gt;&lt;a href="https://app.supabase.com/"&gt;app.supabase.com&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Make sure to &lt;strong&gt;&lt;a href="https://github.com/supabase/supabase"&gt;star us on GitHub&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Follow us &lt;strong&gt;&lt;a href="https://twitter.com/supabase"&gt;on Twitter&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Subscribe to our &lt;strong&gt;&lt;a href="https://www.youtube.com/c/supabase"&gt;YouTube channel&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>supabase</category>
      <category>database</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Visualizing Supabase Data using Metabase</title>
      <dc:creator>awalias</dc:creator>
      <pubDate>Thu, 30 Jun 2022 12:08:21 +0000</pubDate>
      <link>https://dev.to/supabase/visualizing-supabase-data-using-metabase-5a43</link>
      <guid>https://dev.to/supabase/visualizing-supabase-data-using-metabase-5a43</guid>
      <description>&lt;p&gt;Data helps organizations make better decisions. With a programming language like Python to analyze your data and transform data into visual representations, you can effortlessly tell the story of your business. One way to create customized visuals from your data would be to use data visualization libraries in Python like &lt;a href="https://matplotlib.org/" rel="noopener noreferrer"&gt;Matplotlib&lt;/a&gt;, &lt;a href="https://seaborn.pydata.org/" rel="noopener noreferrer"&gt;Seaborn&lt;/a&gt;, &lt;a href="https://ggplot2.tidyverse.org/index.html" rel="noopener noreferrer"&gt;Ggplot2&lt;/a&gt;, &lt;a href="https://plotly.com/" rel="noopener noreferrer"&gt;Plotly&lt;/a&gt;, or &lt;a href="https://pandas.pydata.org/" rel="noopener noreferrer"&gt;Pandas&lt;/a&gt;. When you want to accomplish this task with little or no code (not even SQL), you might consider using tools like &lt;a href="https://www.metabase.com/" rel="noopener noreferrer"&gt;Metabase&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With Metabase, a powerful visualization tool, you can quickly turn your data into easy-to-understand visuals like graphs, pie charts, flow diagrams, and much more. Then, using Metabase’s intuitive interface, you can cut through the data noise and focus on what’s essential for your business.&lt;/p&gt;

&lt;p&gt;In the previous blog of this series*&lt;em&gt;,&lt;/em&gt;* we explained &lt;a href="https://supabase.com/blog/2022/06/15/loading-data-supabase-python" rel="noopener noreferrer"&gt;how to use Python to load data into Supabase&lt;/a&gt;. In this blog, we will create different kinds of charts out of the data stored in Supabase using Metabase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we dive in, let’s look at some prerequisites that you will need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Supabase project with data&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Based on our &lt;a href="https://supabase.com/blog/2022/06/15/loading-data-supabase-python" rel="noopener noreferrer"&gt;previous article&lt;/a&gt;, we assume we already have a Supabase project setup and have data loaded into it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Metabase Docker Container&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To take advantage of the open-source version of Metabase, you can use the Metabase docker container &lt;a href="https://hub.docker.com/r/metabase/metabase/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visualizing data in Supabase with Metabase
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Launching Metabase
&lt;/h3&gt;

&lt;p&gt;To launch Metabase, simply go to "&lt;a href="http://localhost:3000/setup/" rel="noopener noreferrer"&gt;http://localhost:3000/setup/&lt;/a&gt;" which is the default port that the Metabase server will be listening to.&lt;/p&gt;

&lt;p&gt;After Metabase is launched, select your preferred language and add your contact information. In the &lt;em&gt;Add your data&lt;/em&gt; markdown, you will need to choose PostgreSQL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fadding-postgresql-data-metabase.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fadding-postgresql-data-metabase.png%26w%3D3840%26q%3D75" alt="screen shot of adding postgres data to metabase"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will be prompted to add the necessary connection information to your Supabase project. Go to your &lt;a href="https://app.supabase.com/" rel="noopener noreferrer"&gt;Supabase project&lt;/a&gt; and hit &lt;em&gt;Settings &amp;gt; Database to get the database info&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fsupabase-dashboard-connect-database-info.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fsupabase-dashboard-connect-database-info.png%26w%3D3840%26q%3D75" alt="screen shot of supabase dashboard database connection information"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the necessary information on Metabase and hit next. Finally, select your data preference, after which you will land on the Metabase homepage.&lt;/p&gt;

&lt;h3&gt;
  
  
  View Database and Tables
&lt;/h3&gt;

&lt;p&gt;We can now see the "Supabase DB" Supabase project under "Our data".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-with-supabase-db.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-with-supabase-db.png%26w%3D3840%26q%3D75" alt="screen shot of metabase dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To view the tables, go to &lt;em&gt;SupabaseDB &amp;gt; public&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-02.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-02.png%26w%3D3840%26q%3D75" alt="screen shot of metabase dashboard table view"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  View Table Data Insights
&lt;/h3&gt;

&lt;p&gt;Go back to the home page and select public schema under "Try these x-rays based on your data"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-03.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-03.png%26w%3D3840%26q%3D75" alt="screen shot of metabase dashboard schema view"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the output of the product table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-visualization-supabase-db.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-visualization-supabase-db.png%26w%3D3840%26q%3D75" alt="screen shot of metabase data visualization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, we can get some handy information from this like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many products are present with a given range of inventory count.&lt;/li&gt;
&lt;li&gt;How many products are present for a given range of price.&lt;/li&gt;
&lt;li&gt;The ratio between the number of employees to the number of products.&lt;/li&gt;
&lt;li&gt;How many products each vendor has created.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have column-specific views, you can select the &lt;em&gt;zoom-in&lt;/em&gt; option under &lt;em&gt;More x-rays&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-visualization-supabase-db-02.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-visualization-supabase-db-02.png%26w%3D3840%26q%3D75" alt="screen shot of metabase data visualization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example, let's select the total employees field.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-visualization-supabase-data.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-visualization-supabase-data.png%26w%3D3840%26q%3D75" alt="screen shot of metabase data visualization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With information like this, you will be able to answer some key questions like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are some common statistics for company employees like average, minimum, maximum, and standard deviation?&lt;/li&gt;
&lt;li&gt;What is the distribution of the employees across different geo locations?&lt;/li&gt;
&lt;li&gt;What is the distribution of the employees across different vendors?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Using custom SQL queries
&lt;/h2&gt;

&lt;p&gt;We can also use custom queries to set up our dashboards. To do this, go to &lt;em&gt;New &amp;gt; SQL query.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-04.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-04.png%26w%3D3840%26q%3D75" alt="screen shot of metabase custom queries dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, under the database, select "SupabaseDB".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-05.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-05.png%26w%3D3840%26q%3D75" alt="screen shot of metabase custom queries dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will be using the following SQL query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="nv"&gt;"Vendor"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vendor_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;product_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"Vendor"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_employees&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="nv"&gt;"Product"&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="nv"&gt;"Vendor"&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="nv"&gt;"Product"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vendor_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;"Vendor"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vendor_id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="nv"&gt;"Vendor"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_employees&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This query should fetch us the vendor name and the product where the number of employees for a given vendor is less than 110.&lt;/p&gt;

&lt;p&gt;To run the SQL query, hit the play button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-06.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-06.png%26w%3D3840%26q%3D75" alt="screen shot of metabase data visualization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will be shown below in the output window. To visualize the data, hit the visualization button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-07.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-07.png%26w%3D3840%26q%3D75" alt="screen shot of metabase data visualization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, select the type of visualizer you want. Let us choose &lt;em&gt;Bar&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-08.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-dashboard-08.png%26w%3D3840%26q%3D75" alt="screen shot of metabase data visualization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose the appropriate x-axis and y-axis fields, and you will be able to view the data in bar format.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-report.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Fmetabase-report.png%26w%3D3840%26q%3D75" alt="screen shot of metabase data visualization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Data visualization empowers organizations to turn unused data into actionable insights, leading to faster and better decision-making. Why wait?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Ffinal-meme.png%26w%3D3840%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsupabase.com%2F_next%2Fimage%3Furl%3D%252Fimages%252Fblog%252Fpython-1%252Ffinal-meme.png%26w%3D3840%26q%3D75" alt="screen shot of a meme saying visualization works every time"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With our &lt;a href="https://app.supabase.com/" rel="noopener noreferrer"&gt;free tier Supabase account&lt;/a&gt;, you can start a new project today and use Metabase to visualize your app data.&lt;/p&gt;

&lt;p&gt;If you have any questions please reach out via &lt;a href="https://twitter.com/supabase" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or join our &lt;a href="https://discord.supabase.com" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>metabase</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>Python data loading with Supabase</title>
      <dc:creator>awalias</dc:creator>
      <pubDate>Fri, 17 Jun 2022 14:41:14 +0000</pubDate>
      <link>https://dev.to/supabase/python-data-loading-with-supabase-1nc6</link>
      <guid>https://dev.to/supabase/python-data-loading-with-supabase-1nc6</guid>
      <description>&lt;p&gt;Python is an excellent choice when it comes to data science. With a wide selection of libraries and built-in analytics tools, you can crunch data with ease, analyze even the most complex datasets, and visualize your results in beautiful charts and graphs.&lt;/p&gt;

&lt;p&gt;Supabase is backend-as-a-service built on top of PostgreSQL. It’s an excellent choice for building modern data-intensive apps and tooling.&lt;/p&gt;

&lt;p&gt;Thanks to our incredible community, Supabase now has a powerful and open source &lt;a href="https://github.com/supabase-community/supabase-py"&gt;Python SDK&lt;/a&gt;. With Supabase and Python, you can automate tasks such as CRUD operations with only a few lines of code. This guide will first create a simple schema in Supabase, then we’ll use the Supabase Python SDK to show how you can load sample data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xwlrGIQS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7rbpzdndztdn4end2clq.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xwlrGIQS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7rbpzdndztdn4end2clq.jpeg" alt="Python and Supabase logos" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we dive in, let’s look at some prerequisites you'll need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python version &amp;gt; 3.7

&lt;ul&gt;
&lt;li&gt;The SDK only supports version &amp;gt; 3.7. You can download a supported Python version from &lt;a href="https://www.python.org/downloads/"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Python virtual environment

&lt;ul&gt;
&lt;li&gt;This is optional, but it will avoid issues of package dependencies and version conflicts. You can find the steps to create a virtual environment &lt;a href="https://uoa-eresearch.github.io/eresearch-cookbook/recipe/2014/11/26/python-virtual-env/"&gt;here&lt;/a&gt;. We will be using PyCharm to harness its venv creation capabilities.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Faker python package

&lt;ul&gt;
&lt;li&gt;We will be using the &lt;a href="https://pypi.org/project/faker-commerce/"&gt;faker-commerce&lt;/a&gt; package from the Faker library in Python to generate realistic sample data.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Loading data into Supabase using Python
&lt;/h2&gt;

&lt;p&gt;Supabase is built for developers, and you can &lt;a href="https://app.supabase.com"&gt;get started for free&lt;/a&gt; using your existing Github account. Once your Supabase account is set up, you will access the Supabase dashboard. From here, go to All Project &amp;gt; New Project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dUI3LY0V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dUI3LY0V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/1.png" alt="screen shot of supabase dashboard" width="800" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give your project a name and set the database password. You can also choose the region and adjust the pricing plan based on the requirements of your project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ewQ06UOR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ewQ06UOR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/2.png" alt="screen shot of supabase dashboard" width="800" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your project will spin up within 2 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating tables in Supabase
&lt;/h2&gt;

&lt;p&gt;In this example, we’ll be creating 2 tables in Supabase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vendor (fields are vendor_name, vendor_location, and total_employees)&lt;/li&gt;
&lt;li&gt;Product (vendor_id as FK, product_name, price, and total orders)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The database schema will look like the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9FbgLg7V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9FbgLg7V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/3.png" alt="screen shot of supabase dashboard" width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let us now begin creating the tables. Once you create a project, you will need to go to Table Editor &amp;gt; New Table&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NpIPS-D9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NpIPS-D9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/4.png" alt="screen shot of supabase dashboard" width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you can create a table according to the defined schema. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VxOhFxJd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VxOhFxJd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/5.png" alt="screen shot of supabase dashboard" width="800" height="850"&gt;&lt;/a&gt;&lt;br&gt;
Click on Save to create your vendor table. Similarly, create the product table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4k2FhLjZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4k2FhLjZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/6.png" alt="screen shot of supabase dashboard" width="800" height="826"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before you click Save, you need to set up the foreign key relationship between the Product and Vendor table. To do this, select the button next to “vendor_id”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Of37_Q3h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Of37_Q3h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/7.png" alt="screen shot of supabase dashboard" width="504" height="152"&gt;&lt;/a&gt;&lt;br&gt;
Select the vendor_id primary key from the “Vendor” table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SAWiKzvX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SAWiKzvX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/8.png" alt="screen shot of supabase dashboard" width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on Save and you are good to go. You should now see the 2 tables under Table Editor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mwUQb4KA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mwUQb4KA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/9.png" alt="screen shot of supabase dashboard" width="800" height="754"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Installing the Python SDK
&lt;/h2&gt;

&lt;p&gt;Once you have set up the tables and installed the prerequisites, you can now start playing around with the &lt;a href="https://github.com/supabase-community/supabase-py"&gt;Python SDK&lt;/a&gt;. To install the SDK, run the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pip3 install supabase&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ensure that you are running this inside your python virtual environment. This will take a few minutes to complete.&lt;/p&gt;
&lt;h2&gt;
  
  
  Using Supabase API keys
&lt;/h2&gt;

&lt;p&gt;The SDK authentication uses API keys pointing to a project URL. To find out your project URL and APIs, go to Settings &amp;gt; API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dn8hhDKG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dn8hhDKG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/10.png" alt="screen shot of supabase dashboard" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Setting up the environment variables
&lt;/h2&gt;

&lt;p&gt;API credentials and project URL can be stored in environment variables. Setting the environment variables in bash/zsh is very simple. All we need to do is run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &amp;lt;variable_name&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;variable_value&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So for our example we will set them up like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SUPABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;the&lt;/span&gt;&lt;span class="sh"&gt; value under config &amp;gt; URL&amp;gt;&amp;gt;
export SUPABASE_KEY=&amp;lt;&amp;lt;the value present in Project API keys &amp;gt; anon public&amp;gt;&amp;gt; 
export SUPABASE_SECRET_KEY=&amp;lt;&amp;lt;the value present in Project API keys &amp;gt; service_role secret&amp;gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Inserting data into Supabase
&lt;/h2&gt;

&lt;p&gt;Here is a snippet of the code we will be using to insert random data into our tables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;supabase&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;faker&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Faker&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;faker_commerce&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_entries_to_vendor_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vendor_count&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Faker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;foreign_key_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_provider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;faker_commerce&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Provider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;main_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vendor_count&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'vendor_name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;'total_employees'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                 &lt;span class="s"&gt;'vendor_location'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;

        &lt;span class="n"&gt;main_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Vendor'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main_list&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;data_json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;data_entries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data_json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'data'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_entries&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;foreign_key_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_entries&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;'vendor_id'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;foreign_key_list&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_entries_to_product_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vendor_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Faker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_provider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;faker_commerce&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Provider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;main_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;iterator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'vendor_id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vendor_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'product_name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ecommerce_name&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                 &lt;span class="s"&gt;'inventory_count'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
        &lt;span class="n"&gt;main_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Product'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main_list&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;vendor_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="n"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SUPABASE_URL"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SUPABASE_KEY"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;create_client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fk_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;add_entries_to_vendor_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vendor_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fk_list&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;add_entries_to_product_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fk_list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;


&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To summarize what we have done using this code snippet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We have inserted 10 random vendors to the table.&lt;/li&gt;
&lt;li&gt;For each of the 10 vendors, we have inserted a number of different products &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reading the data stored in Supabase
&lt;/h2&gt;

&lt;p&gt;Data can also be viewed directly from the Supabase dashboard. To do this, go to &lt;code&gt;Table Editor &amp;gt; All tables&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C3FG3bE4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C3FG3bE4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/11.png" alt="screen shot of supabase dashboard" width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HB_ydYPy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HB_ydYPy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://supabase.com/images/blog/python-1/12.png" alt="screen shot of supabase dashboard" width="800" height="274"&gt;&lt;/a&gt;&lt;br&gt;
Note: In case  you cannot see any of the data, you should hit the Refresh button.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;With Python, data loading into Supabase is easy. It just takes a few easy steps to get started with the Python SDK and Supabase. In the next part of this blog series, we will learn how to visualize the data that we just loaded into Supabase using Metabase. Stay tuned!&lt;/p&gt;

&lt;p&gt;If you have any questions please reach out via &lt;a href="https://twitter.com/supabase"&gt;Twitter&lt;/a&gt; or join our &lt;a href="https://discord.supabase.com"&gt;Discord&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>supabas</category>
      <category>database</category>
    </item>
    <item>
      <title>What is OAuth? Setting up Github OAuth with Supabase</title>
      <dc:creator>awalias</dc:creator>
      <pubDate>Thu, 09 Jun 2022 12:38:14 +0000</pubDate>
      <link>https://dev.to/supabase/what-is-oauth-setting-up-github-oauth-with-supabase-44le</link>
      <guid>https://dev.to/supabase/what-is-oauth-setting-up-github-oauth-with-supabase-44le</guid>
      <description>&lt;p&gt;&lt;em&gt;TL;DR: In this post, I will do a quick intro to the OAuth protocol and show how to use OAuth with Supabase by implementing Sign in with Github.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is OAuth? Setting up Github OAuth with Supabase
&lt;/h2&gt;

&lt;p&gt;OAuth is an open protocol which allows users to log into your service with an account that they already have with a third party provider (e.g. Google, Github, Twitter etc.). The benefit is that the user doesn't need to maintain a separate set of credentials for each app or web service that they interact with, they can just "log in with Google". The protocol depends on grants and tokens and works by issuing access tokens to the third-party client with the approval of the resource owner.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9ddwh25rh9i363swqmr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9ddwh25rh9i363swqmr.png" alt="Figure 1 : OAuth-based authentication between a User and a Supabase based web app. 'Gotrue tenant' refers to the Supabase Auth server.&amp;lt;br&amp;gt;
" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1 : OAuth-based authentication between a User and a Supabase based web app. 'Gotrue tenant' refers to the Supabase Auth server.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Some of the benefits of using OAuth for authentication are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Improved security and privacy - The OAuth 2.0 framework uses SSL to securely store access tokens, which protects user data on the wire.&lt;/li&gt;
&lt;li&gt;  Greater control and flexibility - OAuth allows the user to choose where and how their data can be accessed, giving them greater control and flexibility.&lt;/li&gt;
&lt;li&gt;  Better agility and user experience - OAuth lifts and shifts the responsibility of API authentication from developers to the external provider, allowing developers to focus on the application logic rather than writing and maintaining a new auth flow from scratch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that we know the value of using OAuth, let's set up authentication based on native OAuth in Supabase using Github as the external provider. The full list of supported external providers can be found &lt;a href="https://supabase.com/docs/guides/auth#providers" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  What is Supabase?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://supabase.com" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt; is an open source backend for apps. It works with any client or framework (e.g. Javascript/React/Next.js, Python/Django, Mobile/Flutter/iOS, and comes with a free tier which is good for two free backends. It hosts all your data in the cloud, and comes with auth, realtime, and cloud functions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://supabase.com/docs/guides/auth" rel="noopener noreferrer"&gt;Learn about Supabase's Auth system&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Using OAuth in Supabase
&lt;/h2&gt;

&lt;p&gt;Supabase allows you to set up auth integrations with a &lt;a href="https://supabase.com/docs/guides/auth#providers" rel="noopener noreferrer"&gt;long list of OAuth providers&lt;/a&gt;. Once your &lt;a href="https://app.supabase.io" rel="noopener noreferrer"&gt;Supabase account&lt;/a&gt; is set up, you will be able to access the Supabase dashboard. From here, go to All Project &amp;gt; New Project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7imcn44qe9iu97e5c47.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7imcn44qe9iu97e5c47.png" alt="Create a new Supabase project" width="800" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give your project a name and set the database password. You can also choose the region and adjust the &lt;a href="https://supabase.com/pricing" rel="noopener noreferrer"&gt;pricing plan&lt;/a&gt; based on the requirements of your project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbgxraqpld9twdhjmswby.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbgxraqpld9twdhjmswby.png" alt="Create a new project form" width="800" height="772"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you create a new project, Supabase will begin provisioning your database and set up your API endpoint. This process may take a few minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagltynnry2aq9pvbru1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagltynnry2aq9pvbru1b.png" alt="Setting up Supabase docs OAuth" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once your project is ready, go to Settings &amp;gt; API and make a note of the Config URL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmw9glfnj5d793ml5llh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmw9glfnj5d793ml5llh.png" alt="Supabase API config setup" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let's set up Supabase with Github OAuth. Once your project is set up and you have your Config URL, log into Github and go to &lt;em&gt;Settings &amp;gt; Developer Settings &amp;gt; OAuth Apps&lt;/em&gt;, and click on Register a new application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqa054h2bjng2r01n9wm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqa054h2bjng2r01n9wm.png" alt="Blank Github OAuth application settings" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give the OAuth application a name and copy &lt;code&gt;&amp;lt;YOUR_CONFIG_URL&amp;gt;/auth/v1/callback&lt;/code&gt; in the Authorization callback URL. For the homepage URL, add the URL to your app. In this example, we will create a react app that is running locally on port 3000. Once the fields have been filled, click on the Register application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpjwt766laz97d8d0hn3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpjwt766laz97d8d0hn3.png" alt="Github register a new OAuth application" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the application is created, click on the Generate a new client secret button and copy the value that is generated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F560sbgiqogz82f6rp4lt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F560sbgiqogz82f6rp4lt.png" alt="Supabase OAuth Github - Generate a new client" width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Supabase, go to &lt;em&gt;Authentication &amp;gt; Settings&lt;/em&gt; and scroll down to the External OAuth Providers section and enable the Github option.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxnjqu3ls6z1z65odg55o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxnjqu3ls6z1z65odg55o.png" alt="Supabase's External OAuth Providers" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste the Github client ID as well as Github Secret in their respective fields and save.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjssmojqom1cxx0d2ejn4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjssmojqom1cxx0d2ejn4.png" alt="Credentials for the Github OAuth Provider" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, let's verify this functionality by creating a simple react app app to sign in with Github OAuth on the front end.&lt;/p&gt;

&lt;p&gt;Create the app by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app supabase-oauth-example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the app is created, change directory into the app and install the Supabase npm package by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd supabase-oauth-example
npm install @supabase/supabase-js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before creating an instance of createClient which will be used to connect to the Supabase project, make a note of the project's public API which can be found by going to &lt;em&gt;Settings &amp;gt; API&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynifdwxj8fe2yosl9zoj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynifdwxj8fe2yosl9zoj.png" alt="Project API keys" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the App.js file, create an instance of createClient which will be used to connect to your Supabase project by adding the following. The first argument for createClient is the URL Config. For the second argument, copy the Project public API key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { createClient } from  '@supabase/supabase-js';

const  supabase = createClient('&amp;lt;https://zcc```


import { createClient } from  '@supabase/supabase-js';

const  supabase = createClient('&amp;lt;https://zccsowtggisnkzbgsco.supabase.co&amp;gt;','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.....')


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;import { createClient } from '@supabase/supabase-js';&lt;/p&gt;

&lt;p&gt;const supabase = createClient('&lt;a href="https://zccsowtggisnkzbgsco.supabase.co" rel="noopener noreferrer"&gt;https://zccsowtggisnkzbgsco.supabase.co&lt;/a&gt;','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.....')&lt;/p&gt;

&lt;p&gt;Next, replace the App function with the following which adds a sign in button that will then redirect users to sign in using Github OAuth.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

const  provider = 'github';

function  App() {
  const [user, setUser] = useState(null);
  async  function  userStatus() {
    const  user = supabase.auth.user();
    setUser(user);
  }
async  function  signIn() {
  await  supabase.auth.signIn({
    provider:  provider
  });
}
async  function  signOut() {
  await  supabase.auth.signOut();
  setUser(null);
}

useEffect(() =&amp;gt; {
  userStatus();
  window.addEventListener('hashchange', function() {
    userStatus();
  });
}, [])

if (user) {
  return (
    &amp;lt;div  className="App"&amp;gt;
      &amp;lt;h1&amp;gt;Hello, {user.email}&amp;lt;/h1&amp;gt;
      &amp;lt;button  onClick={signOut}&amp;gt;Sign out&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}
return (
  &amp;lt;div  className="App"&amp;gt;
    &amp;lt;h1&amp;gt;Sign in using Github OAuth&amp;lt;/h1&amp;gt;
    &amp;lt;button  onClick={signIn}&amp;gt;Sign In&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
  );
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Start the development server by running the following from the terminal:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

npm start


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl95bb39zu5ga0g4e8xt2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl95bb39zu5ga0g4e8xt2.png" alt="Compiled succesfully" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On a browser, go to &lt;a href="http://localhost:3000/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; to access the app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9w55e4u17egq8zwv91o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9w55e4u17egq8zwv91o.png" alt="Sign in using Github Auth" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on the &lt;em&gt;Sign in&lt;/em&gt; button will redirect you to Sign in with Github.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhk2k4z0fc6pgv0mdwme9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhk2k4z0fc6pgv0mdwme9.png" alt="Sign in with Github login" width="800" height="1181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Log in using your Github credentials and authorize your app.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft5gaq3vtaf36a3gwxzsk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft5gaq3vtaf36a3gwxzsk.png" alt="Authorizing Supabase OAuth Github" width="800" height="763"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will then be redirected back to the app and be signed in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3i2nsyowpl93lq5famno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3i2nsyowpl93lq5famno.png" alt="The app confirming you have signed in" width="800" height="126"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can then also sign out using the &lt;em&gt;Sign out&lt;/em&gt; button.&lt;/p&gt;

&lt;p&gt;By following this process, you can configure your Supabase project with any supported OAuth providers. After setting up your project with a provider, you just need to pass in the provider name:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

await  supabase.auth.signIn({
  provider:  &amp;lt;YOUR_PROVIDER&amp;gt;
});


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Supabase makes it very simple to use OAuth and allows you to extend access control to a large number of applications. You can easily control access using the Supabase Console or from the API. So, say goodbye to traditional password management and get access to secure user data without complex user onboarding workflows!&lt;/p&gt;

&lt;p&gt;Now, become a Supabase developer today by starting &lt;a href="https://app.supabase.com/" rel="noopener noreferrer"&gt;a new project on our free tier&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>oauth</category>
      <category>authentication</category>
      <category>supabase</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
