diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index c5f57524b8f..6a210a4cf67 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -469,6 +469,7 @@ export const platform = { items: [ { name: 'Compute Add-ons', url: '/guides/platform/compute-add-ons', items: [] }, { name: 'Custom Domains', url: '/guides/platform/custom-domains', items: [] }, + { name: 'Database Backups', url: '/guides/platform/backups', items: [] }, ], }, { diff --git a/apps/docs/components/index.tsx b/apps/docs/components/index.tsx index 4351050cbf0..c5a5aa3752a 100644 --- a/apps/docs/components/index.tsx +++ b/apps/docs/components/index.tsx @@ -27,6 +27,9 @@ import RefHeaderSection from './reference/RefHeaderSection' // Ref version specific import CliGlobalFlagsHandler from '~/components/reference/enrichments/cli/CliGlobalFlagsHandler' +import Options from '~/components/Options' +import Param from '~/components/Params' + const components = { Admonition, Button, @@ -68,6 +71,8 @@ const components = { code: (props: any) => , RefHeaderSection: (props: any) => , CliGlobalFlagsHandler: () => , + Options, + Param, } export default components diff --git a/apps/docs/data/authProviders.ts b/apps/docs/data/authProviders.ts index f9a32a71454..95c2f6b2dbf 100644 --- a/apps/docs/data/authProviders.ts +++ b/apps/docs/data/authProviders.ts @@ -1,26 +1,8 @@ const authProviders = [ - // { - // name: 'Email', - // // logo: '/img/libraries/dart-icon.svg', - // href: '/docs/guides/auth/auth-apple', - // official: true, - // supporter: 'Supabase', - // platform: true, - // selfHosted: true, - // }, - // { - // name: 'Magic Links', - // // logo: '/img/libraries/dart-icon.svg', - // href: '/docs/guides/auth/auth-apple', - // official: true, - // supporter: 'Supabase', - // platform: true, - // selfHosted: true, - // }, { name: 'Apple', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-apple', + href: '/guides/auth/social-login/auth-apple', official: true, supporter: 'Supabase', platform: true, @@ -29,7 +11,7 @@ const authProviders = [ { name: 'Azure', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-azure', + href: '/guides/auth/social-login/auth-azure', official: false, supporter: 'TBD', platform: true, @@ -38,7 +20,7 @@ const authProviders = [ { name: 'Bitbucket', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-bitbucket', + href: '/guides/auth/social-login/auth-bitbucket', official: true, supporter: 'Supabase', platform: true, @@ -47,7 +29,7 @@ const authProviders = [ { name: 'Discord', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-discord', + href: '/guides/auth/social-login/auth-discord', official: true, supporter: 'Supabase', platform: true, @@ -56,7 +38,7 @@ const authProviders = [ { name: 'Facebook', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-facebook', + href: '/guides/auth/social-login/auth-facebook', official: true, supporter: 'Supabase', platform: true, @@ -65,7 +47,7 @@ const authProviders = [ { name: 'GitHub', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-github', + href: '/guides/auth/social-login/auth-github', official: true, supporter: 'Supabase', platform: true, @@ -74,7 +56,7 @@ const authProviders = [ { name: 'GitLab', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-gitlab', + href: '/guides/auth/social-login/auth-gitlab', official: true, supporter: 'Supabase', platform: true, @@ -83,7 +65,7 @@ const authProviders = [ { name: 'Google', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-google', + href: '/guides/auth/social-login/auth-google', official: true, supporter: 'Supabase', platform: true, @@ -91,7 +73,7 @@ const authProviders = [ }, { name: 'Keycloak', - href: '/guides/auth/auth-keycloak', + href: '/guides/auth/social-login/auth-keycloak', official: true, supporter: 'Supabase', platform: true, @@ -100,7 +82,7 @@ const authProviders = [ { name: 'LinkedIn', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-linkedin', + href: '/guides/auth/social-login/auth-linkedin', official: true, supporter: 'Supabase', platform: true, @@ -109,7 +91,7 @@ const authProviders = [ { name: 'MessageBird', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-messagebird', + href: '/guides/auth/phone-login/messagebird', official: false, supporter: 'MessageBird', platform: true, @@ -118,7 +100,7 @@ const authProviders = [ { name: 'Notion', // logo: '/img/libraries/notion-icon.svg', - href: '/guides/auth/auth-notion', + href: '/guides/auth/social-login/auth-notion', official: true, supporter: 'Supabase', platform: true, @@ -127,7 +109,7 @@ const authProviders = [ { name: 'Slack', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-slack', + href: '/guides/auth/social-login/auth-slack', official: true, supporter: 'Supabase', platform: true, @@ -136,7 +118,7 @@ const authProviders = [ { name: 'Spotify', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-spotify', + href: '/guides/auth/social-login/auth-spotify', official: true, supporter: 'Supabase', platform: true, @@ -145,7 +127,7 @@ const authProviders = [ { name: 'Twitter', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-twitter', + href: '/guides/auth/social-login/auth-twitter', official: true, supporter: 'Supabase', platform: true, @@ -154,7 +136,7 @@ const authProviders = [ { name: 'Twitch', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-twitch', + href: '/guides/auth/social-login/auth-twitch', official: true, supporter: 'Supabase', platform: true, @@ -163,7 +145,7 @@ const authProviders = [ { name: 'Zoom', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-zoom', + href: '/guides/auth/social-login/auth-zoom', official: true, supporter: 'Supabase', platform: true, @@ -172,7 +154,7 @@ const authProviders = [ { name: 'Twilio', // logo: '/img/libraries/dart-icon.svg', - href: '/guides/auth/auth-twilio', + href: '/guides/auth/phone-login/twilio', official: true, supporter: 'Supabase', platform: true, @@ -180,7 +162,7 @@ const authProviders = [ }, { name: 'Vonage', - href: '/guides/auth/auth-vonage', + href: '/guides/auth/phone-login/vonage', official: false, supporter: 'Supabase', platform: true, diff --git a/apps/docs/lib/refGenerator/helpers.ts b/apps/docs/lib/refGenerator/helpers.ts index 77a7aa16755..6af5b8eb539 100644 --- a/apps/docs/lib/refGenerator/helpers.ts +++ b/apps/docs/lib/refGenerator/helpers.ts @@ -60,6 +60,8 @@ function recurseThroughParams(paramDefinition: any) { children = dereferenced.children } else if (dereferenced.type?.declaration?.children) { children = dereferenced.type.declaration.children + } else if (dereferenced.type?.type === 'query') { + // skip: ignore types created from `typeof` for now, like `type Fetch = typeof fetch` } else if (dereferenced.type?.type === 'union') { // skip: we don't want to show unions as nested parameters } else if (Object.keys(dereferenced).length === 0) { diff --git a/apps/docs/pages/guides/auth/auth-helpers/nextjs-server-components.mdx b/apps/docs/pages/guides/auth/auth-helpers/nextjs-server-components.mdx index 346c8d7f3bc..10fa7f73f31 100644 --- a/apps/docs/pages/guides/auth/auth-helpers/nextjs-server-components.mdx +++ b/apps/docs/pages/guides/auth/auth-helpers/nextjs-server-components.mdx @@ -95,7 +95,7 @@ Create a new file at `/utils/supabase-browser.ts` and populate with the followin ```ts import { createBrowserSupabaseClient } from '@supabase/auth-helpers-nextjs' -import { Database } from '../db_types' +import { Database } from '../lib/database.types' export default createBrowserSupabaseClient() ``` @@ -109,7 +109,7 @@ Create a new file at `/utils/supabase-server.ts` and populate with the following ```ts title="/utils/supabase-server.ts" import { headers, cookies } from 'next/headers' import { createServerComponentSupabaseClient } from '@supabase/auth-helpers-nextjs' -import { Database } from '../db_types' +import { Database } from '../lib/database.types' export default () => createServerComponentSupabaseClient({ @@ -139,6 +139,8 @@ Middleware runs before every route declared in the `matcher` array. Since we don > +Create a new file at `/pages/middleware.js` and populate with the following: + ```jsx title="middleware.js" import { createMiddlewareSupabaseClient } from '@supabase/auth-helpers-nextjs' import { NextResponse } from 'next/server' @@ -164,6 +166,8 @@ export const config = { +Create a new file at `/middleware.ts` (a sibling of /pages) and populate with the following: + ```tsx title="middleware.ts" import { createMiddlewareSupabaseClient } from '@supabase/auth-helpers-nextjs' import { NextResponse } from 'next/server' @@ -254,7 +258,7 @@ export default async function RootLayout({ children }) { } ``` -We don't want Next.js to cache this `session` value, so we need to export a `revalidate` value of `0`. +We don't want Next.js to cache this `session` value, so we need to export a `revalidate` value of `0` in the layout file. ```jsx export const revalidate = 0 @@ -641,7 +645,7 @@ Create a new file at `/app/realtime/posts.tsx` and populate with the following: 'use client' import { useEffect, useState } from 'react' -import { Database } from '../../db_types' +import { Database } from '../lib/database.types' import supabase from '../../utils/supabase-browser' type Post = Database['public']['Tables']['posts']['Row'] diff --git a/apps/docs/pages/guides/database/extensions/uuid-ossp.mdx b/apps/docs/pages/guides/database/extensions/uuid-ossp.mdx index 2731ae221a2..167e9b92807 100644 --- a/apps/docs/pages/guides/database/extensions/uuid-ossp.mdx +++ b/apps/docs/pages/guides/database/extensions/uuid-ossp.mdx @@ -10,8 +10,8 @@ The `uuid-ossp` extension can be used to generate a `UUID`. ## Overview -A `UUID` is a "Universally Unique Identifer" and it is, for practical purposes, unique. -This makes them particularly well suited as Primary Keys. It is occasionally referred to as a `GUID`, which stands for "Globally Unique Identifer". +A `UUID` is a "Universally Unique Identifier" and it is, for practical purposes, unique. +This makes them particularly well suited as Primary Keys. It is occasionally referred to as a `GUID`, which stands for "Globally Unique Identifier". ## Usage diff --git a/apps/docs/pages/guides/database/tables.mdx b/apps/docs/pages/guides/database/tables.mdx index 010b104a2a4..78d1b62115a 100644 --- a/apps/docs/pages/guides/database/tables.mdx +++ b/apps/docs/pages/guides/database/tables.mdx @@ -265,7 +265,7 @@ For example if you had the following situations: - You have a list of `movies`. - A movie can have several `actors`. -- An `actor` can perfom in several movies. +- An `actor` can perform in several movies. +
{webapps.map((item) => { return ( @@ -150,13 +150,13 @@ export const resources = [ { title: 'Features', hasLightIcon: true, - href: '/features', + href: '/guides/getting-started/features', description: 'A non-exhaustive list of features that Supabase provides for every project.', }, { title: 'Architecture', hasLightIcon: true, - href: '/architecture', + href: '/guides/getting-started/architecture', description: "An overview of Supabase's architecture and product principles.", }, ] diff --git a/apps/docs/pages/guides/getting-started/features.mdx b/apps/docs/pages/guides/getting-started/features.mdx index 4b10f3830ba..c1e1a0dcfc9 100755 --- a/apps/docs/pages/guides/getting-started/features.mdx +++ b/apps/docs/pages/guides/getting-started/features.mdx @@ -60,11 +60,11 @@ Build passwordless logins for your application or website.[Docs](/docs/guides/au ### Social Logins -Provide social logins - everything from Apple, to GitHub, to Slack. [Docs](/docs/guides/auth/auth-apple). +Provide social logins - everything from Apple, to GitHub, to Slack. [Docs](/docs/guides/auth/social-login). ### Phone Logins -Provide phone logins using a 3rd-party SMS provider. [Docs](/docs/guides/auth/auth-twilio). +Provide phone logins using a third-party SMS provider. [Docs](/docs/guides/auth/phone-login). ### Row Level Security diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-angular.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-angular.mdx index b0d5fc21c93..8f2754453f9 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-angular.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-angular.mdx @@ -205,7 +205,7 @@ export class AuthComponent implements OnInit {
- ``` ### Account page diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-flutter.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-flutter.mdx index db3e028ad30..6a73c7aa8ab 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-flutter.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-flutter.mdx @@ -50,7 +50,9 @@ Add `io.supabase.flutterquickstart://login-callback/` as a new [redirect URL](ht That is it on Supabase's end and the rest are platform specific settings: -For Android, add an intent-filter to enable deep linking: +For Android, edit the `android/app/src/main/AndroidManifest.xml` file. + +Add an intent-filter to enable deep linking: ```xml title=android/app/src/main/AndroidManifest.xml @@ -75,7 +77,9 @@ For Android, add an intent-filter to enable deep linking: ``` -For iOS add CFBundleURLTypes to enable deep linking: +For iOS, edit the ios/Runner/Info.plist file. + +Add CFBundleURLTypes to enable deep linking: ```xml title=ios/Runner/Info.plist" diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-react.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-react.mdx index 1f7804f15ab..7d1418b7146 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-react.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-react.mdx @@ -37,7 +37,7 @@ Then let's install the only additional dependency: [supabase-js](https://github. npm install @supabase/supabase-js ``` -And finally we want to save the environment variables in a `.env`. +And finally we want to save the environment variables in a `.env.local` file. All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). ```bash title=.env @@ -48,6 +48,8 @@ REACT_APP_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. +Create and edit `src/supabaseClient.js`: + ```js title=src/supabaseClient.js import { createClient } from '@supabase/supabase-js' @@ -64,6 +66,8 @@ You can find the full contents of this file [here](https://raw.githubusercontent Let's set up a React component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. +Create and edit `src/Auth.js`: + ```jsx title=src/Auth.js import { useState } from 'react' import { supabase } from './supabaseClient' @@ -120,7 +124,7 @@ export default function Auth() { After a user is signed in we can allow them to edit their profile details and manage their account. -Let's create a new component for that called `Account.js`. +Let's create a new component for that called `src/Account.js`. ```jsx title=src/Account.js import { useState, useEffect } from 'react' @@ -234,7 +238,7 @@ export default Account ### Launch! -Now that we have all the components in place, let's update `App.js`: +Now that we have all the components in place, let's update `src/App.js`: ```jsx title=src/App.js import './index.css' @@ -282,6 +286,8 @@ Every Supabase project is configured with [Storage](/docs/guides/storage) for ma Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: +Create and edit `src/Avatar.js`: + ```jsx title=src/Avatar.js import { useEffect, useState } from 'react' import { supabase } from './supabaseClient' @@ -367,7 +373,7 @@ export default function Avatar({ url, size, onUpload }) { ### Add the new widget -And then we can add the widget to the Account page: +And then we can add the widget to the Account page at `src/Account.js`: ```jsx title=src/Account.js // Import the new component @@ -376,7 +382,7 @@ import Avatar from './Avatar' // ... return ( -
+
{/* Add to the body */} /settings#team`) to send an -invite link to another user's email. The invite expires after 24 hours. - -Invites sent from a SSO account can only be accepted by another SSO account -coming from the same identity provider. This is a security measure that -prevents accidental invites to accounts not managed by your company's -enterprise systems. - -Project level invites are not available at this time. A member of the -organization will be able to access all projects under the organization. If you -wish to restrict access to certain projects, please create another organization -to manage this. +A default organization is created when you first sign in and +you'll be assigned the **Owner** role. +Each member can access all projects under the organization. +Project level invites are not available at this time. +Create a separate organization if you need to restrict access to certain projects. ## Manage team members -You can invite your team members into your organizations to collaborate on projects. +To invite others to collaborate, visit your organization's team settings in the +[Dashboard](https://app.supabase.com/projects) to send an invite link to +another user's email. The invite expires after 24 hours. - +### Transferring ownership of an organization + +Each Supabase organization can have one or more owners. If you no longer want be an owner of an organization, click **Leave team** in the members view (`https://app.supabase.com/org//settings#team`) of your organization. +However, you can only leave an organization when there is _at least one other owner_. + +If you are transferring ownership of your organization to someone else, you will need to invite the new member with the **Owner** role. You can leave the organization after they've accepted the invitation. ### Permissions across roles [#permission-across-roles] The table below shows the corresponding permissions for each available role you can assign a team member in the Dashboard. -| Permissions | Owner | Administrator | Developer | -| ------------------------ | ----- | ------------- | --------- | +| Permissions | Owner | Administrator | Developer | +| ------------------------ | ----------------------- | ----------------------- | ----------------------- | | **Organization** | -| Change organization name | ✅ | | | -| Delete organization | ✅ | | | +| Change organization name | | | | +| Delete organization | | | | | **Members** | -| Add an Owner | ✅ | | | -| Remove an Owner | ✅ | | | -| Add an Administrator | ✅ | ✅ | | -| Remove an Administrator | ✅ | ✅ | | -| Add a Developer | ✅ | ✅ | | -| Remove a Developer | ✅ | ✅ | | -| Revoke an invite | ✅ | ✅ | | -| Resend an invite | ✅ | ✅ | | -| Accept an invite[^1] | ✅ | ✅ | ✅ | +| Add an Owner | | | | +| Remove an Owner | | | | +| Add an Administrator | | | | +| Remove an Administrator | | | | +| Add a Developer | | | | +| Remove a Developer | | | | +| Revoke an invite | | | | +| Resend an invite | | | | +| Accept an invite[^1] | | | | | **Billing** | -| Read invoices | ✅ | ✅ | ✅ | -| Read billing email | ✅ | ✅ | ✅ | -| Change billing email | ✅ | | | -| View subscription | ✅ | ✅ | ✅ | -| Update subscription | ✅ | ✅ | | -| Read billing address | ✅ | ✅ | ✅ | -| Update billing address | ✅ | ✅ | | -| Read tax codes | ✅ | ✅ | ✅ | -| Update tax codes | ✅ | ✅ | | -| Read payment methods | ✅ | ✅ | ✅ | -| Update payment methods | ✅ | ✅ | | +| Read invoices | | | | +| Read billing email | | | | +| Change billing email | | | | +| View subscription | | | | +| Update subscription | | | | +| Read billing address | | | | +| Update billing address | | | | +| Read tax codes | | | | +| Update tax codes | | | | +| Read payment methods | | | | +| Update payment methods | | | | | **Projects** | -| Create a project | ✅ | ✅ | | -| Delete a project | ✅ | ✅ | | -| Update a project | ✅ | ✅ | | -| Pause a project | ✅ | ✅ | | -| Resume a project | ✅ | ✅ | | -| Restart a project | ✅ | ✅ | ✅ | +| Create a project | | | | +| Delete a project | | | | +| Update a project | | | | +| Pause a project | | | | +| Resume a project | | | | +| Restart a project | | | | [^1]: - If the invite was sent from a SSO account, it can only be accepted from - a user signed in via the same identity provider. + Invites sent from a SSO account can only be accepted by another SSO account + coming from the same identity provider. This is a security measure that + prevents accidental invites to accounts not managed by your company's + enterprise systems. export const Page = ({ children }) => diff --git a/apps/docs/pages/guides/platform/backups.mdx b/apps/docs/pages/guides/platform/backups.mdx new file mode 100644 index 00000000000..83d606cd856 --- /dev/null +++ b/apps/docs/pages/guides/platform/backups.mdx @@ -0,0 +1,77 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + title: 'Database Backups', + description: 'Learn about the available backup methods for your Supabase project.', +} + +Database backups are an integral part of any disaster recovery plan. Disasters come in many shapes and sizes. It could be as simple as accidentally deleting a table column, the database crashing, or even a natural calamity wiping out the underlying hardware a database is running on. The risks and impact brought by these scenarios can never be fully eliminated, but only minimized or even mitigated. Having database backups is a form of insurance policy. They are essentially snapshots of the database at various points in time. When disaster strikes, database backups allow the project to be brought back to any of these points in time, therefore averting the crisis. + +## Frequency of Backups + +When deciding how often a database should be backed up, the key business metric Recovery Point Objective (RPO) should be considered. RPO is the threshold for how much data, measured in time, a business could lose when disaster strikes. This amount is fully dependent on a business and its underlying requirements. A low RPO would mean that database backups would have to be taken at an increased cadence throughout the day. Each Supabase project has access to two forms of backups, Daily Backups and Point-in-Time Recovery. The agreed upon RPO would be a deciding factor in choosing which solution best fits a project. + + + Database backups do not include objects stored via the Storage API, as the database only includes + metadata about these objects. Restoring an old backup does not restore objects that have been + deleted since then. + + +## Daily Backups + +All Pro and Enterprise tier Supabase projects are backed up automatically on a daily basis. In terms of Recovery Point Objective (RPO), Daily Backups would be suitable for projects willing to lose up to 24 hours worth of data if disaster hits at the most inopportune time. If a lower RPO is required, enabling Point-in-Time Recovery should be considered. + +### Backup Process [#daily-backups-process] + +The PostgreSQL utility [pg_dumpall](https://www.postgresql.org/docs/current/app-pg-dumpall.html) is used to perform daily backups. An SQL file is generated, zipped up, and sent to our storage servers for safe keeping. + +![Scheduled backups dashboard](/docs/img/backups-daily-dashboard.png) + +You can access daily backups in the [Scheduled backups](https://app.supabase.com/project/_/database/backups/scheduled) settings in the Dashboard. Pro tier projects can access the last 7 days’ worth of daily backups while Enterprise tier projects can access up to 30 days’ worth of daily backups. Users can restore their project to any one of the backups or download them as a zipped SQL file. + +### Restoration Process [#daily-backups-restoration-process] + +When selecting a backup to restore to, select the closest available one made before the desired point in time to restore to. Earlier backups can always be chosen too but do consider the number of days’ worth of data that could be lost. + +![Scheduled backups: Confirmation modal](/docs/img/backups-daily-confirmation-modal.png) + +The Dashboard will then prompt for a confirmation before proceeding with the restoration. The project will be inaccessible following this. As such, do ensure to allot downtime beforehand. This is dependent on the size of the database. The larger it is, the longer the downtime will be. Once the confirmation has been given, the underlying SQL of the chosen backup is then run against the project. The PostgreSQL utility [psql](https://www.postgresql.org/docs/current/app-psql.html) is used to facilitate the restoration. The Dashboard will display a notification once the restoration completes. + +{/* screenshot of the Dashboard of the project completing restoration */} + +## Point-in-Time Recovery + +Point-in-Time Recovery (PITR) allows a project to be backed up at much shorter intervals. This provides users an option to restore to any chosen point of up to seconds in granularity. Even with daily backups, a day’s worth of data could still be lost. With PITR, backups could be performed up to the point of disaster. + + + This feature is available to all Enterprise tier projects. Pro tier projects can enable PITR as an + add-on. + + +### Backup Process [#pitr-backup-process] + +As discussed [here](https://supabase.com/blog/postgresql-physical-logical-backups), PITR is made possible by a combination of taking physical backups of a project, as well as archiving [Write Ahead Log (WAL)](https://www.postgresql.org/docs/current/wal-intro.html) files. Physical backups provide a snapshot of the underlying directory of the database, while WAL files contain records of every change made in the database. + +Supabase uses [WAL-G](https://github.com/wal-g/wal-g), an open source archival and restoration tool, to handle both aspects of PITR. On a daily basis, a snapshot of the database is taken and sent to our storage servers. Throughout the day, as database transactions occur, WAL files are generated and uploaded. + +By default, WAL files are backed up at two minute intervals. If these files cross a certain file size threshold, they are backed up immediately. As such, during periods of high amount of transactions, WAL file backups become more frequent. Conversely, when there is no activity in the database, WAL file backups are not made. Overall, this would mean that at the worst case scenario or disaster, the PITR achieves a Recovery Point Objective (RPO) of two minutes. + +![PITR dashboard](/docs/img/backups-pitr-dashboard.png) + +You can access PITR in the [Point in Time](https://app.supabase.com/project/_/database/backups/pitr) settings in the Dashboard. The recovery period of a project is indicated by the earliest and latest points of recoveries displayed in one’s preferred timezone. If need be, the maximum amount of this recovery period can be modified accordingly. + +Note that the latest restore point of the project could be significantly far from the current time. This occurs when there has not been any recent activity in the database, and therefore no WAL file backups have been made recently. This is perfectly fine as the state of the database at the latest point of recovery would still be indicative of the state of the database at the current time given that no transactions have been made in between. + +### Restoration Process [#pitr-restoration-process] + +![PITR: Calendar view](/docs/img/backups-pitr-calendar-view.png) + +A date and time picker will be provided upon pressing the `Start a restore` button. The process will only proceed if the selected date and time fall within the earliest and latest points of recoveries. + +![PITR: Confirmation modal](/docs/img/backups-pitr-confirmation-modal.png) + +After locking in the desired point in time to recover to, The Dashboard will then prompt for a review and confirmation before proceeding with the restoration. The project will be inaccessible following this. As such, do ensure to allot for downtime beforehand. This is dependent on the size of the database. The larger it is, the longer the downtime will be. Once the confirmation has been given, the latest physical backup available is downloaded to the project and the database is partially restored. WAL files generated after this physical backup up to the specified point-in-time are then downloaded. The underlying records of transactions in these files are replayed against the database to complete the restoration. The Dashboard will display a notification once the restoration completes. + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/platform/custom-domains.mdx b/apps/docs/pages/guides/platform/custom-domains.mdx index 2690eb5f23b..01249cf5455 100644 --- a/apps/docs/pages/guides/platform/custom-domains.mdx +++ b/apps/docs/pages/guides/platform/custom-domains.mdx @@ -12,18 +12,20 @@ Custom Domains are currently in beta, and are being slowly made available to pro -Custom domains allow you to present a branded experience to your users. Currently, you must use a subdomain (e.g., `api.example.com`, rather than `example.com`) for the purposes of this guide. +Custom domains allow you to present a branded experience to your users. Custom domains are available as a [add-on for projects on a paid tier](https://app.supabase.com/project/_/settings/billing/update). Setting up a custom domain requires [Owner or Admin permissions](/docs/guides/platform/access-control#manage-team-members) for the project. Currently, you must use a subdomain (e.g., `api.example.com`, rather than `example.com`) for the purposes of this guide. + +## Configure a Custom Domain using the Supabase Dashboard + +Follow the **Custom Domains** steps in the [General Settings](https://app.supabase.com/project/_/settings/general) page in the Dashboard to set up a custom domain for your project. + +## Configure a Custom Domain using the Supabase CLI + +This example assumes your Supabase project is `foobarbaz` with a corresponding API URL `foobarbaz.supabase.co` and configures a custom domain at `api.example.com`. To get started: -1. [Install](/docs/guides/cli) the Supabase CLI 1.11.3+. -1. [Log in](/docs/guides/cli/local-development#log-in-to-the-supabase-cli) to your Supabase account using the CLI. -1. Ensure that you have [Owner or Admin permissions](/docs/guides/platform#manage-team-members) for the project you'd like to set up a custom domain for. -1. Enable the Custom Domains add-on in the Billing page of the Dashboard. - -## Configure a Custom Domain - -This example assumes your Supabase project is `foobarbaz` with a corresponding API URL `foobarbaz.supabase.co` and configures a custom domain at `api.example.com`. +1. [Install](/docs/guides/resources/supabase-cli) the Supabase CLI 1.11.3+. +1. [Log in](/docs/guides/resources/supabase-cli/local-development#log-in-to-the-supabase-cli) to your Supabase account using the CLI. ### Configure a CNAME @@ -47,7 +49,7 @@ Required outstanding validation records: api.example.com TXT -> ca3-F1HvR9i938OgVwpCFwi1jTsbhe1hvT0Ic3efPY3Q ``` -[^1] One of the records requires you to _replace_ the CNAME record set up in [the first step](#cname-configure) with a TXT record. You'll be able to restore it back to the CNAME after the verification process has been completed. +[^1] One of the records requires you to _replace_ the CNAME record set up in [the first step](#configure-a-cname) with a TXT record. You'll be able to restore it back to the CNAME after the verification process has been completed. ### Verify your domain @@ -97,9 +99,9 @@ Vanity Subdomains allow you to present a basic branded experience, compared to c To get started: -1. [Install](/docs/guides/cli) the Supabase CLI 1.22.0+. -1. [Log in](/docs/guides/cli/local-development#log-in-to-the-supabase-cli) to your Supabase account using the CLI. -1. Ensure that you have [Owner or Admin permissions](/docs/guides/hosting/platform#manage-team-members) for the project you'd like to set up a vanity subdomain for. +1. [Install](/docs/guides/resources/supabase-cli) the Supabase CLI 1.22.0+. +1. [Log in](/docs/guides/resources/supabase-cli/local-development#log-in-to-the-supabase-cli) to your Supabase account using the CLI. +1. Ensure that you have [Owner or Admin permissions](/docs/guides/platform/access-control#manage-team-members) for the project you'd like to set up a vanity subdomain for. 1. Ensure that your project has a paid subscription (Pro/Pay as you go/Enterprise tier) in the [Billing page of the Dashboard](https://app.supabase.com/project/_/settings/billing/subscription). ## Configure a Vanity Subdomain diff --git a/apps/docs/pages/guides/platform/network-restrictions.mdx b/apps/docs/pages/guides/platform/network-restrictions.mdx index 7dfde6433cd..c2286c6a4f5 100644 --- a/apps/docs/pages/guides/platform/network-restrictions.mdx +++ b/apps/docs/pages/guides/platform/network-restrictions.mdx @@ -20,7 +20,7 @@ To get started: 1. [Install](/docs/guides/cli) the Supabase CLI 1.22.0+. 1. [Log in](/docs/guides/cli/local-development#log-in-to-the-supabase-cli) to your Supabase account using the CLI. -1. Ensure that you have [Owner or Admin permissions](/docs/guides/hosting/platform#manage-team-members) for the project that you are enabling network restrictions. +1. Ensure that you have [Owner or Admin permissions](/docs/guides/hosting/platform/access-control#manage-team-members) for the project that you are enabling network restrictions. ## Check restrictions diff --git a/apps/docs/pages/guides/realtime/postgres-changes.mdx b/apps/docs/pages/guides/realtime/postgres-changes.mdx index 79a76e884b2..0d68f25c2ef 100644 --- a/apps/docs/pages/guides/realtime/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/postgres-changes.mdx @@ -63,7 +63,14 @@ const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY */ const channel = supabase .channel('schema-db-changes') - .on('postgres_changes', { event: '*', schema: 'public' }, (payload) => console.log(payload)) + .on( + 'postgres_changes', + { + event: '*', + schema: 'public', + }, + (payload) => console.log(payload) + ) .subscribe() ``` @@ -74,8 +81,14 @@ To listen to changes on a table in the `public` schema: const channel = supabase .channel('table-db-changes') - .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'messages' }, (payload) => - console.log(payload) + .on( + 'postgres_changes', + { + event: 'INSERT', + schema: 'public', + table: 'messages', + }, + (payload) => console.log(payload) ) .subscribe() ``` @@ -109,11 +122,21 @@ const channel = supabase .channel('db-changes') .on( 'postgres_changes', - { event: '*', schema: 'public', table: 'messages', filter: 'body=eq.bye' }, + { + event: '*', + schema: 'public', + table: 'messages', + filter: 'body=eq.bye', + }, (payload) => console.log(payload) ) - .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'users' }, (payload) => - console.log(payload) + .on('postgres_changes', + { + event: 'INSERT', + schema: 'public', + table: 'users', + }, + (payload) => console.log(payload) ) .subscribe() ``` diff --git a/apps/docs/pages/guides/resources/self-hosting/docker.mdx b/apps/docs/pages/guides/resources/self-hosting/docker.mdx index db9bcdf0563..ab14e78b0eb 100644 --- a/apps/docs/pages/guides/resources/self-hosting/docker.mdx +++ b/apps/docs/pages/guides/resources/self-hosting/docker.mdx @@ -102,6 +102,10 @@ Once you have done this, you can safely comment out the `db` section of the `doc By default, `docker-compose` sets the database's `log_min_messages` configuration to `fatal` to prevent redundant logs generated by Realtime. However, you might miss important log messages such as database errors. Configure `log_min_messages` based on your needs. +### File storage backend on macOS + +By default, Storage backend is set to `file`, which is to use local files as the storage backend. To make it work on macOS, you need to choose `VirtioFS` as the Docker container file sharing implementation (in Docker Desktop -> Preferences -> General). + ## Deploying See the following guides to deploy Docker Compose setup using your preferred tool and platform: diff --git a/apps/docs/pages/guides/resources/supabase-cli/local-development.mdx b/apps/docs/pages/guides/resources/supabase-cli/local-development.mdx index 4586927a3f4..3ff1cb1c82a 100644 --- a/apps/docs/pages/guides/resources/supabase-cli/local-development.mdx +++ b/apps/docs/pages/guides/resources/supabase-cli/local-development.mdx @@ -173,7 +173,7 @@ Use the seed script in `supabase/seed.sql` (created with [`supabase init`](/docs -- in supabase/seed.sql insert into public.employees (name) values - ('Erlich Backman'), + ('Erlich Bachman'), ('Richard Hendricks'), ('Monica Hall'); ``` diff --git a/apps/docs/public/img/backups-daily-confirmation-modal.png b/apps/docs/public/img/backups-daily-confirmation-modal.png new file mode 100644 index 00000000000..e340cb7d738 Binary files /dev/null and b/apps/docs/public/img/backups-daily-confirmation-modal.png differ diff --git a/apps/docs/public/img/backups-daily-dashboard.png b/apps/docs/public/img/backups-daily-dashboard.png new file mode 100644 index 00000000000..b6f3b03d443 Binary files /dev/null and b/apps/docs/public/img/backups-daily-dashboard.png differ diff --git a/apps/docs/public/img/backups-pitr-calendar-view.png b/apps/docs/public/img/backups-pitr-calendar-view.png new file mode 100644 index 00000000000..1a4b585b515 Binary files /dev/null and b/apps/docs/public/img/backups-pitr-calendar-view.png differ diff --git a/apps/docs/public/img/backups-pitr-confirmation-modal.png b/apps/docs/public/img/backups-pitr-confirmation-modal.png new file mode 100644 index 00000000000..a365164ef14 Binary files /dev/null and b/apps/docs/public/img/backups-pitr-confirmation-modal.png differ diff --git a/apps/docs/public/img/backups-pitr-dashboard.png b/apps/docs/public/img/backups-pitr-dashboard.png new file mode 100644 index 00000000000..4d68ad5f27f Binary files /dev/null and b/apps/docs/public/img/backups-pitr-dashboard.png differ diff --git a/apps/docs/public/sitemap.xml b/apps/docs/public/sitemap.xml index f189599255f..38b0e06220a 100644 --- a/apps/docs/public/sitemap.xml +++ b/apps/docs/public/sitemap.xml @@ -103,13 +103,13 @@ - https://supabase.com/docs/reference/index + https://supabase.com/docs/new/auth weekly 0.5 - https://supabase.com/docs/new/auth + https://supabase.com/docs/reference/index weekly 0.5 @@ -126,78 +126,6 @@ 0.5 - - https://supabase.com/docs/guides/auth/auth-captcha - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/auth-email-templates - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/auth-email - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/auth-helpers - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/auth-magic-link - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/auth-mfa - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/managing-user-data - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/overview - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/phone-login - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/row-level-security - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/server-side-rendering - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login - weekly - 0.5 - - https://supabase.com/docs/guides/database/arrays weekly @@ -288,6 +216,78 @@ 0.5 + + https://supabase.com/docs/guides/auth/auth-captcha + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/auth-email-templates + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/auth-email + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/auth-helpers + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/auth-magic-link + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/auth-mfa + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/managing-user-data + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/overview + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/phone-login + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/row-level-security + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/server-side-rendering + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login + weekly + 0.5 + + https://supabase.com/docs/guides/functions/auth weekly @@ -474,6 +474,12 @@ 0.5 + + https://supabase.com/docs/guides/platform/backups + weekly + 0.5 + + https://supabase.com/docs/guides/platform/compute-add-ons weekly @@ -636,6 +642,42 @@ 0.5 + + https://supabase.com/docs/guides/database/extensions/http + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/pgcron + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/pgnet + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/pgtap + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/plv8 + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/uuid-ossp + weekly + 0.5 + + https://supabase.com/docs/guides/auth/auth-helpers/auth-ui weekly @@ -787,37 +829,7 @@ - https://supabase.com/docs/guides/database/extensions/http - weekly - 0.5 - - - - https://supabase.com/docs/guides/database/extensions/pgcron - weekly - 0.5 - - - - https://supabase.com/docs/guides/database/extensions/pgnet - weekly - 0.5 - - - - https://supabase.com/docs/guides/database/extensions/pgtap - weekly - 0.5 - - - - https://supabase.com/docs/guides/database/extensions/plv8 - weekly - 0.5 - - - - https://supabase.com/docs/guides/database/extensions/uuid-ossp + https://supabase.com/docs/guides/functions/examples/og-image weekly 0.5 @@ -840,54 +852,6 @@ 0.5 - - https://supabase.com/docs/guides/functions/examples/og-image - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/sso/azure - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/sso/gsuite - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/sso/okta - weekly - 0.5 - - - - https://supabase.com/docs/guides/resources/migrating-to-supabase/firebase-auth - weekly - 0.5 - - - - https://supabase.com/docs/guides/resources/migrating-to-supabase/firebase-storage - weekly - 0.5 - - - - https://supabase.com/docs/guides/resources/migrating-to-supabase/firestore-data - weekly - 0.5 - - - - https://supabase.com/docs/guides/resources/migrating-to-supabase/heroku - weekly - 0.5 - - https://supabase.com/docs/guides/getting-started/tutorials/with-angular weekly @@ -972,6 +936,48 @@ 0.5 + + https://supabase.com/docs/guides/platform/sso/azure + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/sso/gsuite + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/sso/okta + weekly + 0.5 + + + + https://supabase.com/docs/guides/resources/migrating-to-supabase/firebase-auth + weekly + 0.5 + + + + https://supabase.com/docs/guides/resources/migrating-to-supabase/firebase-storage + weekly + 0.5 + + + + https://supabase.com/docs/guides/resources/migrating-to-supabase/firestore-data + weekly + 0.5 + + + + https://supabase.com/docs/guides/resources/migrating-to-supabase/heroku + weekly + 0.5 + + https://supabase.com/docs/guides/resources/self-hosting/docker weekly @@ -1538,6 +1544,12 @@ 0.5 + + https://supabase.com/docs/reference/javascript/v1/initializing + weekly + 0.5 + + https://supabase.com/docs/reference/javascript/v1/auth-signup weekly diff --git a/apps/www/_blog/2021-07-02-supabase-beta-june-2021.mdx b/apps/www/_blog/2021-07-02-supabase-beta-june-2021.mdx index 80ca73046d1..2d4e0ca9bde 100644 --- a/apps/www/_blog/2021-07-02-supabase-beta-june-2021.mdx +++ b/apps/www/_blog/2021-07-02-supabase-beta-june-2021.mdx @@ -57,13 +57,13 @@ Ever wanted to build a Search Engine? We just released a guide which shows you h ### OAuth Guides We released step-by-step guides to help you set up OAuth with -[Apple](/docs/guides/auth/auth-apple), -[Bitbucket](/docs/guides/auth/auth-bitbucket), -[Facebook](/docs/guides/auth/auth-facebook), -[GitHub](/docs/guides/auth/auth-github), -[GitLab](/docs/guides/auth/auth-gitlab), -[Google](/docs/guides/auth/auth-google), and -[Twitter](/docs/guides/auth/auth-twitter). +[Apple](/docs/guides/auth/social-login/auth-apple), +[Bitbucket](/docs/guides/auth/social-login/auth-bitbucket), +[Facebook](/docs/guides/auth/social-login/auth-facebook), +[GitHub](/docs/guides/auth/social-login/auth-github), +[GitLab](/docs/guides/auth/social-login/auth-gitlab), +[Google](/docs/guides/auth/social-login/auth-google), and +[Twitter](/docs/guides/auth/social-login/auth-twitter). ![Image of Apple's developer Portal](/images/blog/2021-june/apple-developer-portal.png) diff --git a/apps/www/_blog/2021-07-22-supabase-launch-week-sql.mdx b/apps/www/_blog/2021-07-22-supabase-launch-week-sql.mdx index f86c57ea758..edef105d6df 100644 --- a/apps/www/_blog/2021-07-22-supabase-launch-week-sql.mdx +++ b/apps/www/_blog/2021-07-22-supabase-launch-week-sql.mdx @@ -63,7 +63,7 @@ Wednesday 28 July 2021.[^1] ### What? -What's cooler than Arnie in the 90's? Passwordless logins. We've [already](/docs/guides/auth/auth-apple) [built](/docs/guides/auth/auth-bitbucket) [support](/docs/guides/auth/auth-discord) [for](/docs/guides/auth/auth-facebook) [eight](/docs/guides/auth/auth-github) [different](/docs/guides/auth/auth-gitlab) [Oauth](/docs/guides/auth/auth-google) [providers](/docs/guides/auth/auth-twitter), so it's anyone's guess what can happen in Supabase Auth Episode II. +What's cooler than Arnie in the 90's? Passwordless logins. We've [already](/docs/guides/auth/social-login/auth-apple) [built](/docs/guides/auth/social-login/auth-bitbucket) [support](/docs/guides/auth/social-login/auth-discord) [for](/docs/guides/auth/social-login/auth-facebook) [eight](/docs/guides/auth/social-login/auth-github) [different](/docs/guides/auth/social-login/auth-gitlab) [Oauth](/docs/guides/auth/social-login/auth-google) [providers](/docs/guides/auth/social-login/auth-twitter), so it's anyone's guess what can happen in Supabase Auth Episode II. ### Where? diff --git a/apps/www/_blog/2021-07-28-supabase-auth-passwordless-sms-login.mdx b/apps/www/_blog/2021-07-28-supabase-auth-passwordless-sms-login.mdx index aa7a26ca013..92623917793 100644 --- a/apps/www/_blog/2021-07-28-supabase-auth-passwordless-sms-login.mdx +++ b/apps/www/_blog/2021-07-28-supabase-auth-passwordless-sms-login.mdx @@ -51,7 +51,7 @@ with either an OTP or a phone + password combo. Supabase Auth supports [Twilio](https://www.twilio.com/) as an SMS provider, with more options coming soon. Simply plug your Twilio credentials into your Auth Settings in the Supabase Dashboard to get started. -Check out the [documentation](/docs/guides/auth/auth-twilio) to get started with Mobile OTPs, +Check out the [documentation](/docs/guides/auth/phone-login/twilio) to get started with Mobile OTPs, or watch the [Youtube guide](https://youtu.be/akScoPO01bc). + +
+ +Community Spotlight + +We partnered with the team at [Flutterflow](https://flutterflow.io/) to bring you a new way to build Flutter apps. Flutterflow is a low-code platform that allows you to build Flutter apps without writing any code. It's a great way to get started with Flutter and Supabase. + +- Watch the [tutorial](https://www.youtube.com/watch?v=hw9Q-NjASbU) +- Get Started with [Flutterflow](https://flutterflow.io/) + +## OneSignal for Push Notifications + + + +
+ +Community Spotlight + +We partnered with the team at [OneSignal](https://onesignal.com/) to offer push notifications in Supabase. OneSignal is a messaging platform allowing you to deliver push notifications, in-app messages, SMS, and emails to your users. + +- Watch the [tutorial](https://www.youtube.com/watch?v=mw0DLwItue4) +- Get Started with [OneSignal](https://onesignal.com/) + +## Getting Started + +Get started today with Supabase. It's free and open source. + +- [Like some memes on Twitter](https://twitter.com/supabase) +- [Star us on GitHub](https://github.com/supabase/supabase) +- [Join the Discord](https://discord.supabase.com) +- [Read the docs](https://supabase.com/docs) +- [Sign up](https://app.supabase.io/) diff --git a/apps/www/_blog/2022-12-16-new-in-postgres-15.mdx b/apps/www/_blog/2022-12-16-new-in-postgres-15.mdx index da45e32becf..d1b158b5a47 100644 --- a/apps/www/_blog/2022-12-16-new-in-postgres-15.mdx +++ b/apps/www/_blog/2022-12-16-new-in-postgres-15.mdx @@ -17,7 +17,7 @@ The PostgreSQL community [released](https://www.postgresql.org/docs/current/rele `CREATE` permission is revoked from all users except the database owner. It makes permission assigning more tunable ([details](https://www.postgresql.org/docs/15/ddl-schemas.html#DDL-SCHEMAS-PATTERNS)). And for the migrated database don't forget to revoke `CREATE` permission on the public schema manually to fit the new policy. -There is a useful option `CREATE VIEW .. WITH security_invoker=on` to create a view that uses permissions of a view caller rather than a view creator to access underlying tables. With this, you should not worry that a user that doesn't have access to a table could see its data through a view. +There is a useful option `CREATE VIEW .. WITH (security_invoker=on)` to create a view that uses permissions of a view caller rather than a view creator to access underlying tables. With this, you should not worry that a user that doesn't have access to a table could see its data through a view. ## **Performance speed-up** diff --git a/apps/www/_blog/2022-12-16-pg-graphql-v1.mdx b/apps/www/_blog/2022-12-16-pg-graphql-v1.mdx new file mode 100644 index 00000000000..30c6c59d777 --- /dev/null +++ b/apps/www/_blog/2022-12-16-pg-graphql-v1.mdx @@ -0,0 +1,103 @@ +--- +title: pg_graphql v1.0 +description: Announcing the v1.0 release of pg_graphql +author: oli_rice +image: launch-week-6/pggraphql/og-pg-graphql.png +thumb: launch-week-6/pggraphql/og-pg-graphql.png +tags: + - graphql + - postgres + - launch-week +date: '2022-12-16' +toc_depth: 3 +--- + +Today we're announcing the 1.0 release of pg_graphql and its general availability on our platform. pg_graphql is a PostgreSQL extension that allows you to query your database using GraphQL. It is the foundation of GraphQL support in the Supabase stack. + +Since our first platform release, v0.2.1, the feature set of pg_graphql has steadily grown and stabilized. Despite being a pre-1.0, we've been extremely cautious with each new feature and have yet to introduce a backwards-incompatible change. With the 1.0 release we're formalizing that guarantee, subject to the SemVer spec. + +## Background + +pg_graphql was created to satisfy an extreme set of constraints. Mainly, [Supabase free tier](https://supabase.com/pricing) projects run on servers with 1 GB of memory. On those servers, we squeeze tuned versions of [PostgreSQL](https://github.com/supabase/postgres), [PostgREST](https://postgrest.org/en/stable/), and [GoTrue](https://github.com/supabase/gotrue). Every megabyte consumed by something that isn't PostgreSQL is another chance for an index to fall out of memory, or a large query to fail. + +Our philosophy when adding to the stack is to use existing open source tools wherever possible. We surveyed the available GraphQL → SQL options and found some excellent candidates in [Hasura](https://hasura.io/) and [Graphile](https://www.graphile.org/). Both support the set of features we're interested in, but consume significantly more memory than we could sacrifice on the free tier. Realizing that, we searched for an architecture that could meet our runtime constraints and performance requirements. + +## Architecture + +Our first prototype of pg_graphql PostgreSQL extension had a parser written in C (libgraphqlparser) with all business logic of transpiling GraphQL to SQL **written** in SQL. We exposed the extensions sole SQL function `graphql.resolve(...)` over HTTP using PostgREST's [RPC functionality](https://postgrest.org/en/stable/api.html#s-procs). With this approach, the memory footprint was too small to measure when accessed over HTTP. While memory-use sent us down this path, we discovered that leaning into Postgres primitives lead to some incredible synergies. To name a few: + +### Security + +Since data are accessed through a standard, unprivileged, SQL function, Postgres role permissions and Row Level Security (RLS) policies work exactly like they do in Postgres. Define your security model once, and it applies everywhere: SQL, REST, Realtime, and GraphQL + +### Always up-to-date + +No separate process means no roundtrip time. Inspecting the database's schema does not require any caching and is always in-sync. Knowing that the GraphQL and SQL schemas are aligned give us the confidence to compile GraphQL requests of any complexity into exactly one SQL query, [solving the N+1 query problem](https://medium.com/the-marcy-lab-school/what-is-the-n-1-problem-in-graphql-dd4921cb3c1a) and producing high throughput. + +### Scaling + +As an extension, pg_graphql's performance scales directly with the size of the database. When a user's performance needs grow, upgrading the database instance also scales up GraphQL throughput with no external processes to manage. + +### ACID - Atomicity, Consistency, Isolation, and Durability + +Databases have strong ACID guarantees. Being embedded in the database lets us claim those guarantees through the GraphQL API. For example, if any part of a multi-mutation GraphQL request fails, the entire request can roll back to leave the database in a consistent state. + +## From SQL to Rust + +Our pure [SQL implementation of the pg_graphql transpiler](https://github.com/supabase/pg_graphql/blob/bd0283718abaf329d98c69808f862594e9df5edc/pg_graphql--0.4.0.sql) carried us from v0.0.1 to v0.4.0. Ultimately, we started to feel some pain, although probably not in the way you'd expect. + +Opinions about business logic in SQL are notoriously split. In my view, there are some foot guns, but: + +- SQL has types +- SQL has functions +- Functions are composable + +Ergo, keep your functions pure and you've got a strongly typed functional programming paradigm. Taking that approach, the developer experience for pg_graphql was surprisingly excellent. The feedback cycle with [pg_regress](https://www.postgresql.org/docs/9.1/regress.html) is fast, and occasionally the type system even caught a bug or two. What more could you ask for? + +Somewhere around the 4,000 line count, things started to bog down. The rough shape of the codebase was coming into view, which made it clear where we could further extract common patterns into functions. At this point I learned two things: + +- SQL functions are “pass by value” (copy) so passing state around can get expensive +- The query planner tends to stop inlining functions when calls are deeply nested + +Combine those two facts with our GraphQL AST being a big ball of JSONB, and the GitHub issues about slow schema introspection on free tier started to trickle in. + +Enter [pgx](https://github.com/tcdi/pgx)… + +pgx is a rust framework for building Postgres extensions. It has a very polished onboarding experience and (as you would expect) full SQL interop. That made it straightforward to initially sprinkle some rust on pg_graphql's hotspots. When that went well, we ultimately rewrote pg_graphql from the ground up as a pure Rust project for the v0.5.0 release. + +One of rust's main selling points is zero cost abstractions. That means high-level concepts like generics incur no runtime penalty. Transitioning from SQL's expensive abstractions to rust's zero cost abstractions has been hugely satisfying as it enabled refactoring the codebase into a more maintainable state. Development velocity is up. Code quality is up. Performance is WAY up. + +As of 1.0, overhead introduced by pg_graphql is sub 300 *micro*seconds per request on free-tier hardware. When executed from SQL we see ~1060 queries per second per connection (no parallelism). If we include the entire Auth + HTTP stack, free tier can handle ~645 requests per second. On larger instance the stack handles upwards of 10k requests / second. + +```text +This is ApacheBench, Version 2.3 <$Revision: 1843412 $> +Server Software: postgrest/10.1.1 +Document Path: /graphql/v1 +Concurrency Level: 10 +Time taken for tests: 3.099 seconds +Complete requests: 2000 +Requests per second: 645.40 [#/sec] (mean) +Time per request: 15.494 [ms] (mean) +Time per request: 1.549 [ms] (mean, across all concurrent requests) +``` + +## Roadmap + +While v1.0 is an important milestone for stability, there's plenty of room to expand the feature set. For example, some commonly requested features on the immediate roadmap are: + +- Extended filtering options + - `startsWith` for the `String` type + - nestable `and`/ `or` blocks +- Support for user-defined functions +- Support for views + +Longer term we look forward to experimenting with more ambitions features like an API for migrations, integrations with 3rd-party services through [supabase/wrappers](https://github.com/supabase/wrappers), and a scalable solution for subscriptions. + +## More Launch Week 6 + +- [Day 1: New Supabase Docs, built with Next.js](https://supabase.com/blog/new-supabase-docs-built-with-nextjs) +- [Day 2: Supabase Storage v2: Image resizing and Smart CDN](https://supabase.com/blog/storage-image-resizing-smart-cdn) +- [Day 3: Multi-factor Authentication via Row Level Security Enforcement](https://supabase.com/blog/mfa-auth-via-rls) +- [Launch Week 6 Hackathon](https://supabase.com/blog/launch-week-6-hackathon) +- [Who We Hire at Supabase](https://supabase.com/blog/who-we-hire) +- [pg_crdt - an experimental CRDT extension for Postgres](https://supabase.com/blog/postgres-crdt) diff --git a/apps/www/_blog/2022-12-16-postgres-point-in-time-recovery.mdx b/apps/www/_blog/2022-12-16-postgres-point-in-time-recovery.mdx new file mode 100644 index 00000000000..243adfdb0e1 --- /dev/null +++ b/apps/www/_blog/2022-12-16-postgres-point-in-time-recovery.mdx @@ -0,0 +1,50 @@ +--- +title: 'Point in Time Recovery is now available for Pro projects' +description: "We're making PITR available for more projects, with a new Dashboard UI that makes it simple to use." +author: angelico_de_los_reyes +image: launch-week-6/pitr/og-pitr.png +thumb: launch-week-6/pitr/og-pitr.png +tags: + - launch-week + - postgres + - backups +date: '2022-12-16' +toc_depth: 3 +--- + +When we announced Point-in-Time a few months ago, it was only available for Enterprise customers. Today, we're making PITR available for more projects, with a new Dashboard UI that makes it simple to use. + +Pro-tier projects created from August 2022 onwards (excluding Northeast Asia / Seoul region), can now enable Point In Time Recovery (PITR) from the dashboard. Projects must have the "Small" compute add-on to ensure that PITR operates smoothly behind the scenes. + +For older projects, don't worry - we're working on making it available for everybody. In the meantime, if you would like to have PITR enabled for your ineligible project, reach out directly [here](https://app.supabase.com/support/new), or stay tuned for further updates. + +## What is Point in Time Recovery? + +![point in time recovery overview](/images/blog/launch-week-6/pitr/pitr-overview.png) + +Point in Time Recovery provides the ability for a database to be restored at any specified point in time. This is useful when averting disasters, for all those times that a, _cough_, natural calamity strikes (like accidentally dropping a table). With PITR, the database can be restored to a state it was in mere seconds before trouble. + +All of this is made possible by a combination of physical backups and archives from the [Write Ahead Log (WAL)](https://www.postgresql.org/docs/current/wal-intro.html). Physical backups provide a snapshot of the underlying directory of the database, while WAL files contain records of every change made in the database. + +Under the hood, we use [WAL-G](https://github.com/wal-g/wal-g), an open source archival and restoration tool, to handle all aspects of PITR. On a daily basis, WAL-G takes a snapshot of the database and sends it to our storage servers. Throughout the day, as database transactions occur, WAL files are generated and uploaded to archived. + +## Should I enable PITR? + +![point in time recovery date selection](/images/blog/launch-week-6/pitr/pitr-date-selection.png) + +Consider your Recovery Point Objective (RPO) when deciding whether to enable Point in Time Recovery. RPO is the threshold for how much data, measured in time, a business could lose when disaster strikes. This is dependent on a business and its underlying requirements. The agreed upon RPO would be a deciding factor in choosing which solution best fits a project. + +While all Pro-tier projects and above are backed up on a daily basis, this means that at the worst case, a project could lose up to 24 hours worth of data if disaster hits at the most inopportune time. With Point in Time Recovery however, backups are made at much shorter intervals, shortening the RPO. WAL files are backed up at two minute intervals. This could be faster if it hits a certain file threshold before the the two minute mark. + +## Getting started + +Enabling Point in Time Recovery could be done [in the Dashboard](https://app.supabase.com/project/_/settings/billing/update/pro). Retention for backups used by PITR is set to up to 7 days by default but could be increased to up to 28 days via self-serve. + +## More Launch Week 6 + +- [Day 1: New Supabase Docs, built with Next.js](https://supabase.com/blog/new-supabase-docs-built-with-nextjs) +- [Day 2: Supabase Storage v2: Image resizing and Smart CDN](https://supabase.com/blog/storage-image-resizing-smart-cdn) +- [Day 3: Multi-factor Authentication via Row Level Security Enforcement](https://supabase.com/blog/mfa-auth-via-rls) +- [Launch Week 6 Hackathon](https://supabase.com/blog/launch-week-6-hackathon) +- [Who We Hire at Supabase](https://supabase.com/blog/who-we-hire) +- [pg_crdt - an experimental CRDT extension for Postgres](https://supabase.com/blog/postgres-crdt) diff --git a/apps/www/_blog/2022-12-16-vault-now-in-beta.mdx b/apps/www/_blog/2022-12-16-vault-now-in-beta.mdx new file mode 100644 index 00000000000..3d1418be10d --- /dev/null +++ b/apps/www/_blog/2022-12-16-vault-now-in-beta.mdx @@ -0,0 +1,96 @@ +--- +title: 'Supabase Vault is now in Beta' +description: 'A Postgres extension to store encrypted secrets and encrypt data.' +author: michel +image: launch-week-6/vault/og-vault.png +thumb: launch-week-6/vault/og-vault.png +tags: + - launch-week + - postgres + - encryption +date: '2022-12-16' +toc_depth: 3 +--- + +During our last Launch Week we [announced](/blog/supabase-vault) Supabase Vault as our “one more thing”. Today we're releasing it progressively across the platform. + +Vault is a new Postgres extension and accompanying Supabase UI that makes it safe and easy to store encrypted secrets and encrypt other stored data in your database. This foundation opens up a lot of possibilities for Postgres that go beyond what is available in a stock distribution. From a product perspective we're grouping various features under the “Vault banner”. Let's explore a few of these features. + +## Secrets Management + +Practically speaking, the Vault is a table of Secrets and Encryption Keys that are stored using [Authenticated Encryption](https://en.wikipedia.org/wiki/Authenticated_encryption) on disk, but available in decrypted form through a Postgres view so that the secrets can be used by applications from SQL. Because the secrets are stored encrypted and authenticated, any backups or replication streams also preserve this encryption in a way that can't be forged. + +We've created a dashboard UI for the Vault that makes storing secrets easy. Click a button and type in your secret, optionally create a new key that is referenced by id (or use the existing default), and submit. Your secret is now stored on disk encrypted using the specified key id. + + + +There are two main parts to the Vault UI, Secrets and Encryption Keys: + +- **Secrets:** Use the Vault to store Secrets - everything from Environment Variables to API Keys. You can use these Secrets anywhere in your database: Postgres [Functions](/docs/guides/database/functions), Triggers, and [Webhooks](/docs/guides/database/webhooks). From a SQL perspective, accessing secrets is as easy as querying a table (or in this case, a view). The underlying secrets tables will be stored in encrypted form. +- **Encryption Keys:** encryption keys are used to encrypt data inside your database. Fun fact: the Secrets you store in the Vault are encrypted with an Encryption Key which we set up by default and is not accessible to SQL or stored in your database alongside the same data it is used to encrypt. You can create different Encryption Keys for different purposes, for example: one for encrypting user-data, and another for application-data. + +## Transparent Column Encryption (TCE) + +Our recent [blog post](/blog/transparent-column-encryption-with-postgres) describes TCE in-depth. TCE is one of the safest ways to encrypt your data so that it doesn't leak into logs and backups, as well as providing your users with row-level authenticated encryption. TCE is the foundational feature of the Vault, but you can use it on your own tables if you choose to if the Vault isn't sufficient for your needs, for example if you have multiple tables that you wish to have encrypted columns. Any Postgres value that can be cast to `text` or `bytea` can use TCE to encrypt the data that is stored to disk. + +### Encrypting columns + +In the “New Column” flow on the Dashboard, you can select that a `text` or `bytea` column is encrypted, and select an existing key id or create a new one. This is functionally identical to the Vault above, but you can apply it to any of your existing tables. In a sense the Vault is a pre-created table and UI for you to get started quickly storing secrets, and to be a centralized point for “global” secrets management, but your not stuck with just that, you can encrypt multiple columns in multiple tables, how you want to store your secret data can be entirely up to you. + +![Encrypting columns](/images/blog/launch-week-6/vault/vault-encrypting-columns.png) + +Once you've setup an encrypted column, just insert data into the table like you would any other table. If you put in an email address for example, you will see that what is stored is not an email at all, but an encrypted value. + +![Encrypted data](/images/blog/launch-week-6/vault/vault-encrypted-data.png) + +Decrypted data can be accessed by a special view that is automatically created whenever you create an encrypted column on a table. This view decrypts the data row-by-row as you access it. By default this view is called `decrypted_`, so in the example provided, the decryption view for the `profiles` table is `decrypted_profiles`. In addition to the existing `emails` column, there is a new column in the view called `decrypted_emails` that contains the decrypted email value. It's that simple! + +![Decrypted data](/images/blog/launch-week-6/vault/vault-decrypted-data.png) + +## Deep Dive on How The Vault works + + + +As we mentioned, the Vault uses pgsodium's Transparent Column Encryption (TCE) to store secrets in an authenticated encrypted form. There are some details around that you may be curious about, what does authenticated mean, and where are encryption keys store? This section explains those details. + +The first important feature of TCE is that it uses an [Authenticated Encryption with Associated Data]() encryption algorithm based on libsodium. “Authenticated Encryption” means that in addition to the data being encrypted, it is also “signed” so that it cannot be forged, the decryption function verifies that the signature is valid **before decrypting the value**. “Associated Data” means that in addition to signing the secret, you can include any other columns in your row in the signature computation, “associating” those columns with the secret. This doesn't encrypt those other columns, but it does ensure that **they are authentic** and cannot be forged because they are included in the secret's signature. So you know when you restore your database dumps, not only are the secrets safe, but also the “associated” columns are also authentic and unforged. + +Another important feature of pgsodium is that the encryption keys are never stored in the database alongside the encrypted data, instead, only a **Key ID** is stored, which refers to a key that is only accessible outside of SQL. Even if an attacker can capture a dump of your entire database, they will see only encrypted data and key ids, **never the raw key itself**. This is an important safety precaution, there would be no point in storing the encryption key in the database alongside the encrypted data, this would be like locking your front door but leaving the key in the lock! Storing the key outside the database fixes this issue. + +You might be wondering, ok then where are the keys stored? Supabase creates and manages the root keys from which all key ids are derived in our internal customer backend systems. We keep this key safe and separate from your data, and provide an alternate dashboard endpoint for accessing the key if you want to decrypt your data outside of Supabase. + +## Future possibilities + +Privacy is becoming one of the most important features in a modern product. Supabase's embrace of the pgsodium extension aims to make this simple. Some of the possibilities we are looking into are: + +- **End-to-end encryption**: give your users the ability to encrypt their personal data so even you, the developer cannot access it, using the libsodium [encrypted streams](https://doc.libsodium.org/secret-key_cryptography/secretstream) API that is exposed by pgsodium. After exchanging keys, parties can stream unlimited amounts of data from peer to peer without being intercepted by any party in between, including Supabase. +- **Group encryption**: have you ever joined a group on Whatsapp and been frustrated that you can't read the previous messages? That's because group encryption is hard. We hope to make that easier using new algorithms like [signcryption](https://github.com/jedisct1/libsodium-signcryption) to support multi-party encrypted messages that can be easily encoded into a token format and use to support streaming encryption keys. +- **Public Key Management:** Public Key Encryption can be hard, but pgsodium makes it easier by exposing all of the public key encryption functions that are supported by libsodium. Making and distributing key pairs is now easy, no need to run arcane GPG scripts or mess with SSL libraries. libsodium contains state of the art public key encryption, and by extension so does pgsodium. These features are available now on the Supabase platform and offer a lot of possibilities to unshackle developers from other confusing and inadequate solutions available today. + +### Using the Vault + +You'll see the Vault appear in the Dashboard over the next month. If you want to use Vault today, email growth@supabase.com and we'll enable it on your account. Vault is available for all customers (including the Free-tier). + +## More Launch Week 6 + +- [Day 1: New Supabase Docs, built with Next.js](https://supabase.com/blog/new-supabase-docs-built-with-nextjs) +- [Day 2: Supabase Storage v2: Image resizing and Smart CDN](https://supabase.com/blog/storage-image-resizing-smart-cdn) +- [Day 3: Multi-factor Authentication via Row Level Security Enforcement](https://supabase.com/blog/mfa-auth-via-rls) +- [Launch Week 6 Hackathon](https://supabase.com/blog/launch-week-6-hackathon) +- [Who We Hire at Supabase](https://supabase.com/blog/who-we-hire) +- [pg_crdt - an experimental CRDT extension for Postgres](https://supabase.com/blog/postgres-crdt) diff --git a/apps/www/components/LaunchWeek/lw6_days.json b/apps/www/components/LaunchWeek/lw6_days.json index 69f32b1d5e1..e961beefa62 100644 --- a/apps/www/components/LaunchWeek/lw6_days.json +++ b/apps/www/components/LaunchWeek/lw6_days.json @@ -87,8 +87,8 @@ ] }, { - "title": "Day 5", - "shipped": false, + "title": "Supabase Vault Release", + "shipped": true, "date": "16 Dec 2022", "description": "Vault Release", "d": 5, @@ -96,6 +96,19 @@ "youtube_id": "6bGQotxisoY", "blogpost": "https://supabase.com/blog", "docs": "https://supabase.com/docs", - "steps": [] + "steps": [ + { + "title": "Vault Release", + "blog": "/blog/vault-now-in-beta", + "isNew": true, + "description": "" + }, + { + "title": "Transparent Column Encryption", + "description": "Faster asset delivery, now even faster.", + "blog": "/blog/transparent-column-encryption-with-postgres", + "isNew": true + } + ] } ] diff --git a/apps/www/lib/authors.json b/apps/www/lib/authors.json index cc37016e61d..1b2c394d052 100644 --- a/apps/www/lib/authors.json +++ b/apps/www/lib/authors.json @@ -2,7 +2,7 @@ { "author_id": "angelico_de_los_reyes", "author": "Angelico de los Reyes", - "position": "", + "position": "Engineering", "author_url": "https://github.com/dragarcia", "author_image_url": "https://github.com/dragarcia.png" }, diff --git a/apps/www/lib/mdx/mdxComponents.tsx b/apps/www/lib/mdx/mdxComponents.tsx index e8b1e6dacf5..a54bee5c0ad 100644 --- a/apps/www/lib/mdx/mdxComponents.tsx +++ b/apps/www/lib/mdx/mdxComponents.tsx @@ -5,6 +5,7 @@ import ImageGrid from '~/components/ImageGrid' import Quote from '~/components/Quote' import Chart from '~/components/Charts/PGCharts' import InlineCodeTag from '~/components/InlineCode' +import { Badge } from 'ui' // import all components used in blog articles here // to do: move this into a helper/utils, it is used elsewhere @@ -14,6 +15,7 @@ const ignoreClass = 'ignore-on-export' export default function mdxComponents(type?: 'blog' | 'lp' | undefined) { const components = { CodeBlock, + Badge, Quote, Avatar, PGChart: (props: any) => { diff --git a/apps/www/lib/redirects.js b/apps/www/lib/redirects.js index b0d03d05b66..fd7ee2335d9 100644 --- a/apps/www/lib/redirects.js +++ b/apps/www/lib/redirects.js @@ -1619,88 +1619,93 @@ module.exports = [ }, { permanent: true, - source: '/docs/guides/auth-twilio', + source: '/docs/guides/auth/auth-twilio', destination: '/docs/guides/auth/phone-login/twilio', }, { permanent: true, - source: '/docs/guides/auth/with-google', - destination: '/docs/guides/auth/social-login/with-google', + source: '/docs/guides/auth/auth-vonage', + destination: '/docs/guides/auth/phone-login/vonage', }, { permanent: true, - source: '/docs/guides/auth/with-facebook', - destination: '/docs/guides/auth/social-login/with-facebook', + source: '/docs/guides/auth/auth-google', + destination: '/docs/guides/auth/social-login/auth-google', }, { permanent: true, - source: '/docs/guides/auth/with-apple', - destination: '/docs/guides/auth/social-login/with-apple', + source: '/docs/guides/auth/auth-facebook', + destination: '/docs/guides/auth/social-login/auth-facebook', }, { permanent: true, - source: '/docs/guides/auth/with-azure', - destination: '/docs/guides/auth/social-login/with-azure', + source: '/docs/guides/auth/auth-apple', + destination: '/docs/guides/auth/social-login/auth-apple', }, { permanent: true, - source: '/docs/guides/auth/with-twitter', - destination: '/docs/guides/auth/social-login/with-twitter', + source: '/docs/guides/auth/auth-azure', + destination: '/docs/guides/auth/social-login/auth-azure', }, { permanent: true, - source: '/docs/guides/auth/with-github', - destination: '/docs/guides/auth/social-login/with-github', + source: '/docs/guides/auth/auth-twitter', + destination: '/docs/guides/auth/social-login/auth-twitter', }, { permanent: true, - source: '/docs/guides/auth/with-gitlab', - destination: '/docs/guides/auth/social-login/with-gitlab', + source: '/docs/guides/auth/auth-github', + destination: '/docs/guides/auth/social-login/auth-github', }, { permanent: true, - source: '/docs/guides/auth/with-bitbucket', - destination: '/docs/guides/auth/social-login/with-bitbucket', + source: '/docs/guides/auth/auth-gitlab', + destination: '/docs/guides/auth/social-login/auth-gitlab', }, { permanent: true, - source: '/docs/guides/auth/with-discord', - destination: '/docs/guides/auth/social-login/with-discord', + source: '/docs/guides/auth/auth-bitbucket', + destination: '/docs/guides/auth/social-login/auth-bitbucket', }, { permanent: true, - source: '/docs/guides/auth/with-keycloak', - destination: '/docs/guides/auth/social-login/with-keycloak', + source: '/docs/guides/auth/auth-discord', + destination: '/docs/guides/auth/social-login/auth-discord', }, { permanent: true, - source: '/docs/guides/auth/with-linkedin', - destination: '/docs/guides/auth/social-login/with-linkedin', + source: '/docs/guides/auth/auth-keycloak', + destination: '/docs/guides/auth/social-login/auth-keycloak', }, { permanent: true, - source: '/docs/guides/auth/with-notion', - destination: '/docs/guides/auth/social-login/with-notion', + source: '/docs/guides/auth/auth-linkedin', + destination: '/docs/guides/auth/social-login/auth-linkedin', }, { permanent: true, - source: '/docs/guides/auth/with-slack', - destination: '/docs/guides/auth/social-login/with-slack', + source: '/docs/guides/auth/auth-notion', + destination: '/docs/guides/auth/social-login/auth-notion', }, { permanent: true, - source: '/docs/guides/auth/with-spotify', - destination: '/docs/guides/auth/social-login/with-spotify', + source: '/docs/guides/auth/auth-slack', + destination: '/docs/guides/auth/social-login/auth-slack', }, { permanent: true, - source: '/docs/guides/auth/with-twitch', - destination: '/docs/guides/auth/social-login/with-twitch', + source: '/docs/guides/auth/auth-spotify', + destination: '/docs/guides/auth/social-login/auth-spotify', }, { permanent: true, - source: '/docs/guides/auth/with-workos', - destination: '/docs/guides/auth/social-login/with-workos', + source: '/docs/guides/auth/auth-twitch', + destination: '/docs/guides/auth/social-login/auth-twitch', + }, + { + permanent: true, + source: '/docs/guides/auth/auth-workos', + destination: '/docs/guides/auth/social-login/auth-workos', }, { permanent: true, diff --git a/apps/www/pages/edge-functions/edge-functions.tsx b/apps/www/pages/edge-functions/edge-functions.tsx index a1d9cd65678..c572c51526d 100644 --- a/apps/www/pages/edge-functions/edge-functions.tsx +++ b/apps/www/pages/edge-functions/edge-functions.tsx @@ -223,20 +223,17 @@ import { Customer } from 'types' serve(async (req) => { try { - // create a supabase client + // create a supabase client with Auth context of the user that called the function const supabaseClient = createClient( Deno.env.get('SUPABASE_URL') ?? '', - Deno.env.get('SUPABASE_ANON_KEY') ?? '' + Deno.env.get('SUPABASE_ANON_KEY') ?? '', + { global: { headers: { Authorization: req.headers.get('Authorization')! } } } ) // create a stripe client const stripe = Stripe(Deno.env.get('STRIPE_SECRET_KEY')) - // Get the authorization header from the request. - const authHeader = req.headers.get('Authorization').replace("Bearer ","") - // Client now respects auth policies for this user - supabaseClient.auth.setAuth(authHeader) - // set the user profile - const user = supabase.auth.user() + // get the current logged in user + const {data: { user },} = supabase.auth.getUser() // Retrieve user metadata that only the user is allowed to select const { data, error } = await supabaseClient diff --git a/apps/www/pages/launch-week/index.tsx b/apps/www/pages/launch-week/index.tsx index f702c333773..225de69fcb0 100644 --- a/apps/www/pages/launch-week/index.tsx +++ b/apps/www/pages/launch-week/index.tsx @@ -38,7 +38,7 @@ export default function launchweek() { const { isDarkMode } = useTheme() const title = 'Launch Week 6' const description = 'Supabase Launch Week 6 | 12-18 Dec 2022' - const liveDay = 'Thursday' + const liveDay = 'Friday' const [supabase] = useState(() => createClient(process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!) @@ -130,14 +130,16 @@ export default function launchweek() {
- - + +
+ Jump to current day +
+
{process.env.NEXT_PUBLIC_LW_STARTED && ( <> - +
@@ -248,7 +255,34 @@ export default function launchweek() {
Read blogpost
- + +
+
+ +
+
+ + +
+
+
+ +
+
+ Wrap Up + Everything we shipped +
+
+
+ +
+ Read blogpost +
+
@@ -269,6 +303,7 @@ export default function launchweek() { day2.d.toString(), day3.d.toString(), day4.d?.toString(), + day5.d?.toString(), ]} >
@@ -500,7 +535,7 @@ export default function launchweek() { )}
-
+
{day5.steps.length > 0 && ( -
-
+ <> +
- +
+ +
+
+ +
+
+ + {day5.steps[0].title} + + + New + +
+
- +
+ +
+
+ +
+
+ + New + + + {day5.steps[1].title} + +
+
-
- - {day5.steps[0].title} - - - New - -
-
-
-
- Community + +

+ One more thing +

+
+
+
+ +
+
+ +
+
+ + Updated + + + pg_graphql v1.0 + +
+
- + +
+
+ +
+
+ + New + + + Custom Domains + +
+
-
- - New - - - {day5.steps[1].title} - +
+
+ +
+
+ +
+
+ + New + + + Point-in-time recovery + +
+ +
+
+
+ +
+
+ +
+
+ + Experimental + + + pg_crdt + +
+ +
+
+
+ +
+
+ +
+
+ + Upgrade + + + Postgres 15 + +
+ +
+
+
+ +
+
+ +
+
+ + Upgrade + + + PostgREST 11 + +
+
-
-
+ )}
@@ -610,99 +1029,9 @@ export default function launchweek() { )} - - - + +
diff --git a/apps/www/public/images/blog/launch-week-6/crdt/og-pg-crdt.png b/apps/www/public/images/blog/launch-week-6/crdt/og-pg-crdt.png new file mode 100644 index 00000000000..b8f6b998f71 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/crdt/og-pg-crdt.png differ diff --git a/apps/www/public/images/blog/launch-week-6/custom-domains/custom-subdomain.png b/apps/www/public/images/blog/launch-week-6/custom-domains/custom-subdomain.png new file mode 100644 index 00000000000..53e830a9730 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/custom-domains/custom-subdomain.png differ diff --git a/apps/www/public/images/blog/launch-week-6/custom-domains/og-custom-domains.png b/apps/www/public/images/blog/launch-week-6/custom-domains/og-custom-domains.png new file mode 100644 index 00000000000..63b14d9b0fd Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/custom-domains/og-custom-domains.png differ diff --git a/apps/www/public/images/blog/launch-week-6/pggraphql/og-pg-graphql.png b/apps/www/public/images/blog/launch-week-6/pggraphql/og-pg-graphql.png new file mode 100644 index 00000000000..5fbb76ce70d Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/pggraphql/og-pg-graphql.png differ diff --git a/apps/www/public/images/blog/launch-week-6/pitr/og-pitr.png b/apps/www/public/images/blog/launch-week-6/pitr/og-pitr.png new file mode 100644 index 00000000000..82280012323 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/pitr/og-pitr.png differ diff --git a/apps/www/public/images/blog/launch-week-6/pitr/pitr-date-selection.png b/apps/www/public/images/blog/launch-week-6/pitr/pitr-date-selection.png new file mode 100644 index 00000000000..6ce491d380f Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/pitr/pitr-date-selection.png differ diff --git a/apps/www/public/images/blog/launch-week-6/pitr/pitr-overview.png b/apps/www/public/images/blog/launch-week-6/pitr/pitr-overview.png new file mode 100644 index 00000000000..be1ec28f7e4 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/pitr/pitr-overview.png differ diff --git a/apps/www/public/images/blog/launch-week-6/vault/og-vault.png b/apps/www/public/images/blog/launch-week-6/vault/og-vault.png new file mode 100644 index 00000000000..71ff756fef8 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/vault/og-vault.png differ diff --git a/apps/www/public/images/blog/launch-week-6/vault/vault-decrypted-data.png b/apps/www/public/images/blog/launch-week-6/vault/vault-decrypted-data.png new file mode 100644 index 00000000000..e802f9d1ef3 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/vault/vault-decrypted-data.png differ diff --git a/apps/www/public/images/blog/launch-week-6/vault/vault-encrypted-data.png b/apps/www/public/images/blog/launch-week-6/vault/vault-encrypted-data.png new file mode 100644 index 00000000000..631536c56fa Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/vault/vault-encrypted-data.png differ diff --git a/apps/www/public/images/blog/launch-week-6/vault/vault-encrypting-columns.png b/apps/www/public/images/blog/launch-week-6/vault/vault-encrypting-columns.png new file mode 100644 index 00000000000..2a2c487eaa7 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/vault/vault-encrypting-columns.png differ diff --git a/apps/www/public/images/blog/launch-week-6/vault/vault-hello-compressed.mp4 b/apps/www/public/images/blog/launch-week-6/vault/vault-hello-compressed.mp4 new file mode 100644 index 00000000000..48395586435 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/vault/vault-hello-compressed.mp4 differ diff --git a/apps/www/public/images/blog/launch-week-6/wrap-up/og-wrap-up.png b/apps/www/public/images/blog/launch-week-6/wrap-up/og-wrap-up.png new file mode 100644 index 00000000000..0137d0d395e Binary files /dev/null and b/apps/www/public/images/blog/launch-week-6/wrap-up/og-wrap-up.png differ diff --git a/apps/www/public/images/launchweek/PITR-visual-hover-light.svg b/apps/www/public/images/launchweek/PITR-visual-hover-light.svg new file mode 100644 index 00000000000..f556d075421 --- /dev/null +++ b/apps/www/public/images/launchweek/PITR-visual-hover-light.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/PITR-visual-hover.svg b/apps/www/public/images/launchweek/PITR-visual-hover.svg new file mode 100644 index 00000000000..150bab53ec9 --- /dev/null +++ b/apps/www/public/images/launchweek/PITR-visual-hover.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/PITR-visual-light.svg b/apps/www/public/images/launchweek/PITR-visual-light.svg new file mode 100644 index 00000000000..57a2ae898d8 --- /dev/null +++ b/apps/www/public/images/launchweek/PITR-visual-light.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/PITR-visual.svg b/apps/www/public/images/launchweek/PITR-visual.svg new file mode 100644 index 00000000000..940aa100e38 --- /dev/null +++ b/apps/www/public/images/launchweek/PITR-visual.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/PgGraphql-visual-hover-light.svg b/apps/www/public/images/launchweek/PgGraphql-visual-hover-light.svg new file mode 100644 index 00000000000..9623ead49c7 --- /dev/null +++ b/apps/www/public/images/launchweek/PgGraphql-visual-hover-light.svg @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/PgGraphql-visual-hover.svg b/apps/www/public/images/launchweek/PgGraphql-visual-hover.svg new file mode 100644 index 00000000000..cce40efe137 --- /dev/null +++ b/apps/www/public/images/launchweek/PgGraphql-visual-hover.svg @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/PgGraphql-visual-light.svg b/apps/www/public/images/launchweek/PgGraphql-visual-light.svg new file mode 100644 index 00000000000..41380ed6f42 --- /dev/null +++ b/apps/www/public/images/launchweek/PgGraphql-visual-light.svg @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/PgGraphql-visual.svg b/apps/www/public/images/launchweek/PgGraphql-visual.svg new file mode 100644 index 00000000000..19fde8c1d2a --- /dev/null +++ b/apps/www/public/images/launchweek/PgGraphql-visual.svg @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/PostgREST11-visual-hover-light.svg b/apps/www/public/images/launchweek/PostgREST11-visual-hover-light.svg new file mode 100644 index 00000000000..b47c55bd292 --- /dev/null +++ b/apps/www/public/images/launchweek/PostgREST11-visual-hover-light.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/PostgREST11-visual-hover.svg b/apps/www/public/images/launchweek/PostgREST11-visual-hover.svg new file mode 100644 index 00000000000..e3ee608cab1 --- /dev/null +++ b/apps/www/public/images/launchweek/PostgREST11-visual-hover.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/PostgREST11-visual-light.svg b/apps/www/public/images/launchweek/PostgREST11-visual-light.svg new file mode 100644 index 00000000000..bb3e0a3ab6e --- /dev/null +++ b/apps/www/public/images/launchweek/PostgREST11-visual-light.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/PostgREST11-visual.svg b/apps/www/public/images/launchweek/PostgREST11-visual.svg new file mode 100644 index 00000000000..09c7207853e --- /dev/null +++ b/apps/www/public/images/launchweek/PostgREST11-visual.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/custom-domains-visual-hover-light.svg b/apps/www/public/images/launchweek/custom-domains-visual-hover-light.svg new file mode 100644 index 00000000000..0abf9dba341 --- /dev/null +++ b/apps/www/public/images/launchweek/custom-domains-visual-hover-light.svg @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/custom-domains-visual-hover.svg b/apps/www/public/images/launchweek/custom-domains-visual-hover.svg new file mode 100644 index 00000000000..723eadef22e --- /dev/null +++ b/apps/www/public/images/launchweek/custom-domains-visual-hover.svg @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/custom-domains-visual-light.svg b/apps/www/public/images/launchweek/custom-domains-visual-light.svg new file mode 100644 index 00000000000..25909761937 --- /dev/null +++ b/apps/www/public/images/launchweek/custom-domains-visual-light.svg @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/custom-domains-visual.svg b/apps/www/public/images/launchweek/custom-domains-visual.svg new file mode 100644 index 00000000000..2786fa9792d --- /dev/null +++ b/apps/www/public/images/launchweek/custom-domains-visual.svg @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/outro-light.svg b/apps/www/public/images/launchweek/outro-light.svg new file mode 100644 index 00000000000..3067fbbc5c2 --- /dev/null +++ b/apps/www/public/images/launchweek/outro-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/launchweek/outro.svg b/apps/www/public/images/launchweek/outro.svg new file mode 100644 index 00000000000..4a5f21eef42 --- /dev/null +++ b/apps/www/public/images/launchweek/outro.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/launchweek/pg_crdt-visual-hover-light.svg b/apps/www/public/images/launchweek/pg_crdt-visual-hover-light.svg new file mode 100644 index 00000000000..5223b45be17 --- /dev/null +++ b/apps/www/public/images/launchweek/pg_crdt-visual-hover-light.svg @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/pg_crdt-visual-hover.svg b/apps/www/public/images/launchweek/pg_crdt-visual-hover.svg new file mode 100644 index 00000000000..ae75a367b58 --- /dev/null +++ b/apps/www/public/images/launchweek/pg_crdt-visual-hover.svg @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/pg_crdt-visual-light.svg b/apps/www/public/images/launchweek/pg_crdt-visual-light.svg new file mode 100644 index 00000000000..05fa238e4bd --- /dev/null +++ b/apps/www/public/images/launchweek/pg_crdt-visual-light.svg @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/pg_crdt-visual.svg b/apps/www/public/images/launchweek/pg_crdt-visual.svg new file mode 100644 index 00000000000..80c6ffe9542 --- /dev/null +++ b/apps/www/public/images/launchweek/pg_crdt-visual.svg @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/postgres-visual-hover-light.svg b/apps/www/public/images/launchweek/postgres-visual-hover-light.svg new file mode 100644 index 00000000000..95f4b7bd656 --- /dev/null +++ b/apps/www/public/images/launchweek/postgres-visual-hover-light.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/postgres-visual-hover.svg b/apps/www/public/images/launchweek/postgres-visual-hover.svg new file mode 100644 index 00000000000..9f004fd8c84 --- /dev/null +++ b/apps/www/public/images/launchweek/postgres-visual-hover.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/postgres-visual-light.svg b/apps/www/public/images/launchweek/postgres-visual-light.svg new file mode 100644 index 00000000000..fd683f199eb --- /dev/null +++ b/apps/www/public/images/launchweek/postgres-visual-light.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/launchweek/postgres-visual.svg b/apps/www/public/images/launchweek/postgres-visual.svg new file mode 100644 index 00000000000..a5f4550269e --- /dev/null +++ b/apps/www/public/images/launchweek/postgres-visual.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/rss.xml b/apps/www/public/rss.xml index 8d937a7f7fb..215ba2e41d8 100644 --- a/apps/www/public/rss.xml +++ b/apps/www/public/rss.xml @@ -42,18 +42,25 @@ MFA Auth with enforcement via RLS Tue, 13 Dec 2022 16:04:00 +0000 + + https://supabase.com/blog/mfa-auth-via-rls + Multi-factor Authentication via Row Level Security Enforcement + https://supabase.com/blog/mfa-auth-via-rls + MFA Auth with enforcement via RLS + Tue, 13 Dec 2022 23:11:00 +0000 + https://supabase.com/blog/storage-image-resizing-smart-cdn Supabase Storage v2: Image resizing and Smart CDN https://supabase.com/blog/storage-image-resizing-smart-cdn We're introducing new features for Supabase Storage: Image resizing and a Smart CDN. - Mon, 12 Dec 2022 16:04:00 +0000 + Mon, 12 Dec 2022 05:05:00 +0000 https://supabase.com/blog/new-supabase-docs-built-with-nextjs New Supabase Docs, built with Next.js https://supabase.com/blog/new-supabase-docs-built-with-nextjs - We've redesignd our Docs and migrated to Next.js + We've redesigned our Docs and migrated to Next.js Sun, 11 Dec 2022 16:04:00 +0000 @@ -61,973 +68,973 @@ pg_crdt - an experimental CRDT extension for Postgres https://supabase.com/blog/postgres-crdt Embedding Yjs and Automerge into Postgres for collaborative applications. - Fri, 09 Dec 2022 16:04:00 +0000 + Fri, 09 Dec 2022 05:05:00 +0000 https://supabase.com/blog/who-we-hire Who We Hire at Supabase https://supabase.com/blog/who-we-hire Traits we look for to maintain a culture of shipping fast and often - Thu, 08 Dec 2022 16:04:00 +0000 + Thu, 08 Dec 2022 05:05:00 +0000 https://supabase.com/blog/launch-week-6-hackathon Launch Week 6 Hackathon https://supabase.com/blog/launch-week-6-hackathon Build an Open Source Project, Win $1500 and the Supabase Darkmode Keyboard - Thu, 08 Dec 2022 16:04:00 +0000 + Thu, 08 Dec 2022 05:05:00 +0000 https://supabase.com/blog/supabase-beta-november-2022 Supabase Beta November 2022 https://supabase.com/blog/supabase-beta-november-2022 We are preparing everything for Launch Week 6, but we still had time to ship some goodies this month! - Tue, 06 Dec 2022 16:04:00 +0000 + Tue, 06 Dec 2022 05:05:00 +0000 https://supabase.com/blog/the-supabase-content-storm The Supabase Content Storm https://supabase.com/blog/the-supabase-content-storm We worked with +30 content creators to drop a mountain of content simultaneously. - Mon, 05 Dec 2022 16:04:00 +0000 + Mon, 05 Dec 2022 05:05:00 +0000 https://supabase.com/blog/transparent-column-encryption-with-postgres Transparent Column Encryption with Postgres https://supabase.com/blog/transparent-column-encryption-with-postgres Using pgsodium's Transparent Column Encryption to encrypt data and provide your users with row-level encryption. - Wed, 30 Nov 2022 16:04:00 +0000 + Wed, 30 Nov 2022 05:05:00 +0000 https://supabase.com/blog/sql-or-nosql-both-with-postgresql SQL or NoSQL? Why not use both (with PostgreSQL)? https://supabase.com/blog/sql-or-nosql-both-with-postgresql How to turn Postgres into an easy-to-use NoSQL database that retains all the power of SQL - Wed, 23 Nov 2022 16:04:00 +0000 + Wed, 23 Nov 2022 05:05:00 +0000 https://supabase.com/blog/flutter-authentication-and-authorization-with-rls Flutter Authentication and Authorization with RLS https://supabase.com/blog/flutter-authentication-and-authorization-with-rls Learn how you can secure your Flutter app using Supabase Row Level Security. - Mon, 21 Nov 2022 16:04:00 +0000 + Mon, 21 Nov 2022 05:05:00 +0000 https://supabase.com/blog/fetching-and-caching-supabase-data-in-next-js-server-components Fetching and caching Supabase data in Next.js 13 Server Components https://supabase.com/blog/fetching-and-caching-supabase-data-in-next-js-server-components Next.js 13 introduces new data fetching and caching methods to enable React Server Components and Suspense. - Wed, 16 Nov 2022 16:04:00 +0000 + Wed, 16 Nov 2022 05:05:00 +0000 https://supabase.com/blog/authentication-in-ionic-angular Authentication in Ionic Angular with Supabase https://supabase.com/blog/authentication-in-ionic-angular Learn how to build an Ionic Angular app with authentication, Row Level Security, and Magic Link auth. - Mon, 07 Nov 2022 16:04:00 +0000 + Mon, 07 Nov 2022 05:05:00 +0000 https://supabase.com/blog/supabase-beta-update-october-2022 Supabase Beta October 2022 https://supabase.com/blog/supabase-beta-update-october-2022 New SDKs, quickstarts, Functions tricks, and more. But, more importantly, Launch Week 6️ has a date! - Tue, 01 Nov 2022 16:04:00 +0000 + Tue, 01 Nov 2022 04:04:00 +0000 https://supabase.com/blog/postgresql-commitfest What is PostgreSQL commitfest and how to contribute https://supabase.com/blog/postgresql-commitfest A time-tested method for contributing to the core Postgres code - Wed, 26 Oct 2022 16:04:00 +0000 + Wed, 26 Oct 2022 04:04:00 +0000 https://supabase.com/blog/supabase-flutter-sdk-v1-released supabase-flutter v1 Released https://supabase.com/blog/supabase-flutter-sdk-v1-released We've released supabase-flutter v1. More intuitive way of accessing Supabase from your Flutter application. - Thu, 20 Oct 2022 16:04:00 +0000 + Thu, 20 Oct 2022 04:04:00 +0000 https://supabase.com/blog/supabase-js-v2-released supabase-js v2 Released https://supabase.com/blog/supabase-js-v2-released We've released supabase-js v2. Updated examples, quickstarts, and an improved experience. - Wed, 19 Oct 2022 16:04:00 +0000 + Wed, 19 Oct 2022 04:04:00 +0000 https://supabase.com/blog/postgres-full-text-search-vs-the-rest Postgres Full Text Search vs the rest https://supabase.com/blog/postgres-full-text-search-vs-the-rest Comparing one of the most popular Postgres features against alternatives - Thu, 13 Oct 2022 16:04:00 +0000 + Thu, 13 Oct 2022 04:04:00 +0000 https://supabase.com/blog/supabase-beta-update-september-2022 Supabase Beta September 2022 https://supabase.com/blog/supabase-beta-update-september-2022 We were too focused on clearing out the backlog so we didn't ship anything new last month... or did we?! - Tue, 04 Oct 2022 16:04:00 +0000 + Tue, 04 Oct 2022 04:04:00 +0000 https://supabase.com/blog/postgres-wasm Postgres WASM by Snaplet and Supabase https://supabase.com/blog/postgres-wasm We're open sourcing postgres-wasm, a PostgresQL server that runs inside a browser, with our friends at Snaplet. - Sun, 02 Oct 2022 16:04:00 +0000 + Sun, 02 Oct 2022 04:04:00 +0000 https://supabase.com/blog/choosing-a-postgres-primary-key Choosing a Postgres Primary Key https://supabase.com/blog/choosing-a-postgres-primary-key Turns out the question of which identifier to use as a Primary Key is complicated -- we're going to dive into some of the complexity and inherent trade-offs, and figure things out - Wed, 07 Sep 2022 16:04:00 +0000 + Wed, 07 Sep 2022 04:04:00 +0000 https://supabase.com/blog/supabase-beta-update-august-2022 Supabase Beta August 2022 https://supabase.com/blog/supabase-beta-update-august-2022 Launch Week Special. See everything we shipped, plus winners of the Hackathon and the extended Community Highlights - Tue, 06 Sep 2022 16:04:00 +0000 + Tue, 06 Sep 2022 04:04:00 +0000 https://supabase.com/blog/launch-week-5-hackathon-winners Launch Week 5 Hackathon Winners https://supabase.com/blog/launch-week-5-hackathon-winners Announcing the winners of the Launch Week 5 Hackathon! - Wed, 24 Aug 2022 16:04:00 +0000 + Wed, 24 Aug 2022 04:04:00 +0000 https://supabase.com/blog/building-a-realtime-trello-board-with-supabase-and-angular Building a Realtime Trello Board with Supabase and Angular https://supabase.com/blog/building-a-realtime-trello-board-with-supabase-and-angular Go beyond the hello world example with this real world project. - Tue, 23 Aug 2022 16:04:00 +0000 + Tue, 23 Aug 2022 04:04:00 +0000 https://supabase.com/blog/supabase-vault Supabase Vault https://supabase.com/blog/supabase-vault Today we're announcing Vault, a Postgres extension for managing secrets and encryption inside your database. - Thu, 18 Aug 2022 16:04:00 +0000 + Thu, 18 Aug 2022 04:04:00 +0000 https://supabase.com/blog/postgrest-v10 PostgREST v10: EXPLAIN and Improved Relationship Detection https://supabase.com/blog/postgrest-v10 Today, PostgREST 10 was released. Let's take a look at some of the new features that go hand in hand with supabase-js v2. - Thu, 18 Aug 2022 16:04:00 +0000 + Thu, 18 Aug 2022 04:04:00 +0000 https://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validation pg_jsonschema: JSON Schema support for Postgres https://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validation Today we're releasing pg_jsonschema, a Postgres extension for JSON validation. - Thu, 18 Aug 2022 16:04:00 +0000 + Thu, 18 Aug 2022 04:04:00 +0000 https://supabase.com/blog/launch-week-5-one-more-thing One more thing https://supabase.com/blog/launch-week-5-one-more-thing Let's be honest, it's never just one more thing. - Thu, 18 Aug 2022 16:04:00 +0000 + Thu, 18 Aug 2022 04:04:00 +0000 https://supabase.com/blog/launch-week-5-community-day Community Day https://supabase.com/blog/launch-week-5-community-day Wrapping up Launch Week 5 with contributors, partners, and friends. - Thu, 18 Aug 2022 16:04:00 +0000 + Thu, 18 Aug 2022 04:04:00 +0000 https://supabase.com/blog/supabase-realtime-multiplayer-general-availability Realtime: Multiplayer Edition https://supabase.com/blog/supabase-realtime-multiplayer-general-availability Announcing the general availability of Realtime's Broadcast and Presence. - Wed, 17 Aug 2022 16:04:00 +0000 + Wed, 17 Aug 2022 04:04:00 +0000 https://supabase.com/blog/supabase-soc2 Supabase is SOC2 compliant https://supabase.com/blog/supabase-soc2 Supabase is now SOC2 compliant. Learn how we got here and what it means for our customers. - Tue, 16 Aug 2022 16:04:00 +0000 + Tue, 16 Aug 2022 04:04:00 +0000 https://supabase.com/blog/supabase-js-v2 supabase-js v2 https://supabase.com/blog/supabase-js-v2 A look at supabase-js v2, which brings type support and focuses on quality-of-life improvements for developers. - Mon, 15 Aug 2022 16:04:00 +0000 + Mon, 15 Aug 2022 04:04:00 +0000 https://supabase.com/blog/supabase-cli-v1-and-admin-api-beta Supabase CLI v1 and Management API Beta https://supabase.com/blog/supabase-cli-v1-and-admin-api-beta We are moving Supabase CLI v1 out of beta, and releasing Management API beta. - Sun, 14 Aug 2022 16:04:00 +0000 + Sun, 14 Aug 2022 04:04:00 +0000 https://supabase.com/blog/supabase-series-b Supabase Series B https://supabase.com/blog/supabase-series-b Supabase raised $80M in May, bringing our total funding to $116M. - Thu, 11 Aug 2022 16:04:00 +0000 + Thu, 11 Aug 2022 04:04:00 +0000 https://supabase.com/blog/launch-week-5-hackathon Launch Week 5 Hackathon https://supabase.com/blog/launch-week-5-hackathon Build to win $1500 - Friday 12th to Monday 21st August 2022 - Tue, 09 Aug 2022 16:04:00 +0000 + Tue, 09 Aug 2022 04:04:00 +0000 https://supabase.com/blog/slack-consolidate-slackbot-to-consolidate-messages Slack Consolidate: a slackbot built with Python and Supabase https://supabase.com/blog/slack-consolidate-slackbot-to-consolidate-messages A slackbot to consolidate messages from different channels using Supabase, Slack SDK and Python - Mon, 08 Aug 2022 16:04:00 +0000 + Mon, 08 Aug 2022 04:04:00 +0000 https://supabase.com/blog/supabase-beta-update-july-2022 Supabase Beta July 2022 https://supabase.com/blog/supabase-beta-update-july-2022 Launch Week Golden Tickets, Flutter SDK 1.0 Developer Preview and more... - Tue, 02 Aug 2022 16:04:00 +0000 + Tue, 02 Aug 2022 04:04:00 +0000 https://supabase.com/blog/supabase-flutter-sdk-1-developer-preview Supabase Flutter SDK 1.0 Developer Preview https://supabase.com/blog/supabase-flutter-sdk-1-developer-preview Supabase Flutter SDK is getting a major update and we need your help making it better. - Mon, 01 Aug 2022 16:04:00 +0000 + Mon, 01 Aug 2022 04:04:00 +0000 https://supabase.com/blog/seen-by-in-postgresql Implementing "seen by" functionality with Postgres https://supabase.com/blog/seen-by-in-postgresql Different approaches for tracking visitor counts with PostgreSQL. - Sun, 17 Jul 2022 16:04:00 +0000 + Sun, 17 Jul 2022 04:04:00 +0000 https://supabase.com/blog/supabase-auth-helpers-with-sveltekit-support Revamped Auth Helpers for Supabase (with SvelteKit support) https://supabase.com/blog/supabase-auth-helpers-with-sveltekit-support Supabase Auth Helpers now have improved developer experience, Sveltekit support, and more. - Tue, 12 Jul 2022 16:04:00 +0000 + Tue, 12 Jul 2022 04:04:00 +0000 https://supabase.com/blog/beta-update-june-2022 Supabase Beta June 2022 https://supabase.com/blog/beta-update-june-2022 Auth Helpers, Unlimited Free Projects, CLI and more... - Tue, 05 Jul 2022 16:04:00 +0000 + Tue, 05 Jul 2022 04:04:00 +0000 https://supabase.com/blog/flutter-tutorial-building-a-chat-app Flutter Tutorial: building a Flutter chat app https://supabase.com/blog/flutter-tutorial-building-a-chat-app Learn how to build a Flutter chat app with open source and scalable backend (inc. auth, realtime, database, and more). - Wed, 29 Jun 2022 16:04:00 +0000 + Wed, 29 Jun 2022 04:04:00 +0000 https://supabase.com/blog/visualizing-supabase-data-using-metabase Visualizing Supabase Data using Metabase https://supabase.com/blog/visualizing-supabase-data-using-metabase How to create different kinds of charts out of data stored in Supabase using Metabase. - Tue, 28 Jun 2022 16:04:00 +0000 + Tue, 28 Jun 2022 04:04:00 +0000 https://supabase.com/blog/partial-postgresql-data-dumps-with-rls Partial data dumps using Postgres Row Level Security https://supabase.com/blog/partial-postgresql-data-dumps-with-rls Using RLS to create seed files for local PostgreSQL testing. - Mon, 27 Jun 2022 16:04:00 +0000 + Mon, 27 Jun 2022 04:04:00 +0000 https://supabase.com/blog/loading-data-supabase-python Python data loading with Supabase https://supabase.com/blog/loading-data-supabase-python An example of how to load data into Supabase using supabase-py - Thu, 16 Jun 2022 16:04:00 +0000 + Thu, 16 Jun 2022 04:04:00 +0000 https://supabase.com/blog/beta-update-may-2022 Supabase Beta May 2022 https://supabase.com/blog/beta-update-may-2022 Product and community updates including wildcard auth redirects, edge functions with webhooks, and Prometheus endpoints for everybody. - Tue, 31 May 2022 16:04:00 +0000 + Tue, 31 May 2022 04:04:00 +0000 https://supabase.com/blog/how-supabase-accelerates-development-of-all-pull-together How Mike Lyndon is using Supabase to accelerate development of AllPullTogether https://supabase.com/blog/how-supabase-accelerates-development-of-all-pull-together Mike Lyndon is learning web development as he builds AllPullTogether, and Supabase is helping him accelerate what he can accomplish. - Wed, 25 May 2022 16:04:00 +0000 + Wed, 25 May 2022 04:04:00 +0000 https://supabase.com/blog/partner-gallery-works-with-supabase Works With Supabase - announcing our Partner Gallery https://supabase.com/blog/partner-gallery-works-with-supabase Introducing our Partner Gallery - open source and made with Supabase. - Tue, 19 Apr 2022 16:04:00 +0000 + Tue, 19 Apr 2022 04:04:00 +0000 https://supabase.com/blog/bring-the-func-hackathon-winners Bring the Func Hackathon Winners 2022 https://supabase.com/blog/bring-the-func-hackathon-winners Celebrating many amazing OSS Hackathon projects using GraphQL and Edge Functions. - Sun, 17 Apr 2022 16:04:00 +0000 + Sun, 17 Apr 2022 04:04:00 +0000 https://supabase.com/blog/beta-update-march-2022 Supabase Beta March 2022 https://supabase.com/blog/beta-update-march-2022 Functions, GraphQL, and much more. - Thu, 14 Apr 2022 16:04:00 +0000 + Thu, 14 Apr 2022 04:04:00 +0000 https://supabase.com/blog/supabrew Supabrew - Never Code Thirsty https://supabase.com/blog/supabrew A light and refreshing non-alcoholic beer for devs. - Thu, 31 Mar 2022 16:04:00 +0000 + Fri, 01 Apr 2022 04:04:00 +0000 https://supabase.com/blog/supabase-realtime-with-multiplayer-features Supabase Realtime, with Multiplayer Features https://supabase.com/blog/supabase-realtime-with-multiplayer-features Today we're announced Realtime, with multiplayer features. Realtime enables broadcast, presence, and listening to database changes delivered over WebSockets. - Thu, 31 Mar 2022 16:04:00 +0000 + Fri, 01 Apr 2022 04:04:00 +0000 https://supabase.com/blog/hackathon-bring-the-func Hackathon: Bring the Func(🕺) https://supabase.com/blog/hackathon-bring-the-func Build open-source projects with our latest features, win limited edition swag and plant a tree! - Thu, 31 Mar 2022 16:04:00 +0000 + Fri, 01 Apr 2022 04:04:00 +0000 https://supabase.com/blog/supabase-edge-functions Edge Functions are now available in Supabase https://supabase.com/blog/supabase-edge-functions Today we're launching Edge Functions. Edge Functions let you execute Typescript code close to your users, no matter where they're located. - Wed, 30 Mar 2022 16:04:00 +0000 + Wed, 30 Mar 2022 04:04:00 +0000 https://supabase.com/blog/supabase-enterprise Introducing Supabase Enterprise https://supabase.com/blog/supabase-enterprise Today we are releasing Supabase Enterprise, a suite of features to scale your project. - Tue, 29 Mar 2022 16:04:00 +0000 + Tue, 29 Mar 2022 04:04:00 +0000 https://supabase.com/blog/graphql-now-available GraphQL is now available in Supabase https://supabase.com/blog/graphql-now-available GraphQL support is now in general availability on the Supabase platform via our open source PostgreSQL extension, pg_graphql (beta). - Mon, 28 Mar 2022 16:04:00 +0000 + Mon, 28 Mar 2022 04:04:00 +0000 https://supabase.com/blog/community-day-lw4 Community Day https://supabase.com/blog/community-day-lw4 Kicking off Launch Week 4 with contributors, partners, and friends. - Sun, 27 Mar 2022 16:04:00 +0000 + Sun, 27 Mar 2022 04:04:00 +0000 https://supabase.com/blog/supabase-launch-week-four Supabase Launch Week 4 https://supabase.com/blog/supabase-launch-week-four Launch Week 4: One new feature every day for an entire week. Starting Monday 28th March. - Thu, 24 Mar 2022 16:04:00 +0000 + Thu, 24 Mar 2022 04:04:00 +0000 https://supabase.com/blog/should-i-open-source-my-company Should I Open Source my Company? https://supabase.com/blog/should-i-open-source-my-company The unexpected upsides of building in public - Thu, 24 Mar 2022 16:04:00 +0000 + Thu, 24 Mar 2022 04:04:00 +0000 https://supabase.com/blog/audit Postgres Auditing in 150 lines of SQL https://supabase.com/blog/audit PostgreSQL has a robust set of features which we can leverage to create a generic auditing solution in 150 lines of SQL. - Mon, 07 Mar 2022 16:04:00 +0000 + Mon, 07 Mar 2022 05:05:00 +0000 https://supabase.com/blog/supabase-beta-january-2022 Supabase Beta January 2022 https://supabase.com/blog/supabase-beta-january-2022 New auth providers, SMS providers, and new videos. - Mon, 21 Feb 2022 16:04:00 +0000 + Mon, 21 Feb 2022 05:05:00 +0000 https://supabase.com/blog/supabase-beta-december-2021 Supabase Beta December 2021 https://supabase.com/blog/supabase-beta-december-2021 New crypto extension, Postgres videos, and a bunch of cool integrations. - Wed, 19 Jan 2022 16:04:00 +0000 + Wed, 19 Jan 2022 05:05:00 +0000 https://supabase.com/blog/product-hunt-golden-kitty-awards-2021 Golden Kitty Awards Ceremony Watch Party with Supabase https://supabase.com/blog/product-hunt-golden-kitty-awards-2021 Hang out with us while watching the Product Hunt Golden Kitty Awards Ceremony - Wed, 19 Jan 2022 16:04:00 +0000 + Wed, 19 Jan 2022 05:05:00 +0000 https://supabase.com/blog/holiday-hackdays-winners-2021 Holiday Hackdays Winners 2021 https://supabase.com/blog/holiday-hackdays-winners-2021 Celebrating many amazing projects submitted to our Holiday Hackdays Hackathon. - Thu, 16 Dec 2021 16:04:00 +0000 + Thu, 16 Dec 2021 05:05:00 +0000 https://supabase.com/blog/beta-november-2021-launch-week-recap Supabase Beta November 2021: Launch Week Recap https://supabase.com/blog/beta-november-2021-launch-week-recap We wrapped up November with Supabase's third Launch Week. Here's all the awesome stuff that got shipped ... - Tue, 14 Dec 2021 16:04:00 +0000 + Tue, 14 Dec 2021 05:05:00 +0000 https://supabase.com/blog/supabase-holiday-hackdays-hackathon Kicking off the Holiday Hackdays https://supabase.com/blog/supabase-holiday-hackdays-hackathon Build cool stuff and celebrate open-source software with us during the Holiday Hackdays! - Thu, 02 Dec 2021 16:04:00 +0000 + Thu, 02 Dec 2021 05:05:00 +0000 https://supabase.com/blog/pg-graphql pg_graphql: A GraphQL extension for PostgreSQL https://supabase.com/blog/pg-graphql GraphQL support is in development for PostgreSQL + Supabase. - Thu, 02 Dec 2021 16:04:00 +0000 + Thu, 02 Dec 2021 05:05:00 +0000 https://supabase.com/blog/launch-week-three-friday-five-more-things Five more things https://supabase.com/blog/launch-week-three-friday-five-more-things It's never just one more thing! - Thu, 02 Dec 2021 16:04:00 +0000 + Thu, 02 Dec 2021 05:05:00 +0000 https://supabase.com/blog/supabase-acquires-logflare Supabase acquires Logflare https://supabase.com/blog/supabase-acquires-logflare Today, we're ecstatic to announce that Logflare is joining Supabase. - Wed, 01 Dec 2021 16:04:00 +0000 + Wed, 01 Dec 2021 05:05:00 +0000 https://supabase.com/blog/realtime-row-level-security-in-postgresql Realtime Postgres RLS now available on Supabase https://supabase.com/blog/realtime-row-level-security-in-postgresql Realtime database changes are now broadcast to authenticated users, respecting the same PostgreSQL policies that you use for Row Level Security. - Tue, 30 Nov 2021 16:04:00 +0000 + Tue, 30 Nov 2021 05:05:00 +0000 https://supabase.com/blog/supabase-studio Supabase Studio https://supabase.com/blog/supabase-studio The same Dashboard that you're using on our Platform is now available for local development and Self-Hosting. - Mon, 29 Nov 2021 16:04:00 +0000 + Mon, 29 Nov 2021 05:05:00 +0000 https://supabase.com/blog/community-day-lw3 Community Day https://supabase.com/blog/community-day-lw3 Kicking off launch week by highlighting the communities around Supabase. - Sun, 28 Nov 2021 16:04:00 +0000 + Sun, 28 Nov 2021 05:05:00 +0000 https://supabase.com/blog/whats-new-in-postgres-14 New in PostgreSQL 14: What every developer should know https://supabase.com/blog/whats-new-in-postgres-14 A quick look at some new features and functionality in PostgreSQL 14. - Sat, 27 Nov 2021 16:04:00 +0000 + Sat, 27 Nov 2021 05:05:00 +0000 https://supabase.com/blog/postgrest-9 PostgREST 9 https://supabase.com/blog/postgrest-9 New features and updates in PostgREST version 9. - Fri, 26 Nov 2021 16:04:00 +0000 + Fri, 26 Nov 2021 05:05:00 +0000 https://supabase.com/blog/supabase-launch-week-the-trilogy Supabase Launch Week III: Holiday Special https://supabase.com/blog/supabase-launch-week-the-trilogy Tis the season to be shipping. - Thu, 25 Nov 2021 16:04:00 +0000 + Thu, 25 Nov 2021 05:05:00 +0000 https://supabase.com/blog/supabase-how-we-launch How we launch at Supabase https://supabase.com/blog/supabase-how-we-launch The history and methodology of Supabase Launch Week. - Thu, 25 Nov 2021 16:04:00 +0000 + Thu, 25 Nov 2021 05:05:00 +0000 https://supabase.com/blog/supabase-beta-october-2021 Supabase Beta October 2021 https://supabase.com/blog/supabase-beta-october-2021 Three new Auth providers, multi-schema support, and we're gearing up for another Launch Week. - Sat, 06 Nov 2021 16:04:00 +0000 + Sat, 06 Nov 2021 04:04:00 +0000 https://supabase.com/blog/supabase-series-a Supabase $30m Series A https://supabase.com/blog/supabase-series-a Supabase just raised $30M, bringing our total funding to $36M. - Wed, 27 Oct 2021 16:04:00 +0000 + Wed, 27 Oct 2021 04:04:00 +0000 https://supabase.com/blog/replenysh-time-to-value-in-less-than-24-hours Replenysh uses Supabase to implement OTP in less than 24-hours https://supabase.com/blog/replenysh-time-to-value-in-less-than-24-hours Learn how Replenysh uses Supabase to power the circular economy, redefining how brands interact with their customers and products. - Mon, 18 Oct 2021 16:04:00 +0000 + Mon, 18 Oct 2021 04:04:00 +0000 https://supabase.com/blog/hacktoberfest-hackathon-winners-2021 Hacktoberfest Hackathon Winners 2021 https://supabase.com/blog/hacktoberfest-hackathon-winners-2021 Celebrating many amazing projects submitted to our Hacktoberfest Hackathon. - Wed, 13 Oct 2021 16:04:00 +0000 + Wed, 13 Oct 2021 04:04:00 +0000 https://supabase.com/blog/supabase-beta-sept-2021 Supabase Beta Sept 2021 https://supabase.com/blog/supabase-beta-sept-2021 Hackathon, Aborting request, UI updates, and now Hiring. - Sun, 03 Oct 2021 16:04:00 +0000 + Sun, 03 Oct 2021 04:04:00 +0000 https://supabase.com/blog/supabase-hacktoberfest-hackathon-2021 Supabase Hacktoberfest Hackathon 2021 https://supabase.com/blog/supabase-hacktoberfest-hackathon-2021 We're running another Supabase Hackathon during Hacktoberfest! - Mon, 27 Sep 2021 16:04:00 +0000 + Mon, 27 Sep 2021 04:04:00 +0000 https://supabase.com/blog/supabase-beta-august-2021 Supabase Beta August 2021 https://supabase.com/blog/supabase-beta-august-2021 Fundraising, Realtime Security, custom SMS templates, and deployments in South Korea. - Thu, 09 Sep 2021 16:04:00 +0000 + Thu, 09 Sep 2021 04:04:00 +0000 https://supabase.com/blog/supabase-beta-july-2021 Supabase Beta July 2021 https://supabase.com/blog/supabase-beta-july-2021 Discord Logins, Vercel Integration, Full text search, and OAuth guides. - Wed, 11 Aug 2021 16:04:00 +0000 + Wed, 11 Aug 2021 04:04:00 +0000 https://supabase.com/blog/hackathon-winners Open Source Hackathon Winners https://supabase.com/blog/hackathon-winners Let the medal ceremony begin for the best projects submitted during the Supabase Hackathon. - Sun, 08 Aug 2021 16:04:00 +0000 + Sun, 08 Aug 2021 04:04:00 +0000 https://supabase.com/blog/supabase-swag-store Supabase Swag Store https://supabase.com/blog/supabase-swag-store Today we are officially launching the Supabase Swag Store. - Thu, 29 Jul 2021 16:04:00 +0000 + Thu, 29 Jul 2021 04:04:00 +0000 https://supabase.com/blog/supabase-functions-updates Updates for Supabase Functions https://supabase.com/blog/supabase-functions-updates The question on everyone's mind - are we launching Supabase Functions? Well, it's complicated. - Thu, 29 Jul 2021 16:04:00 +0000 + Thu, 29 Jul 2021 04:04:00 +0000 https://supabase.com/blog/1-the-supabase-hackathon The Supabase Hackathon https://supabase.com/blog/1-the-supabase-hackathon A whole week of Hacking for Fun and Prizes. - Thu, 29 Jul 2021 16:04:00 +0000 + Thu, 29 Jul 2021 04:04:00 +0000 https://supabase.com/blog/supabase-reports-and-metrics Supabase Reports and Metrics https://supabase.com/blog/supabase-reports-and-metrics We're exposing a full set of metrics in your projects, so that you can build better (and faster) products for your users. - Wed, 28 Jul 2021 16:04:00 +0000 + Wed, 28 Jul 2021 04:04:00 +0000 https://supabase.com/blog/supabase-auth-passwordless-sms-login Supabase Auth v2: Phone Auth now available https://supabase.com/blog/supabase-auth-passwordless-sms-login Phone Auth is available today on all new and existing Supabase projects. - Tue, 27 Jul 2021 16:04:00 +0000 + Tue, 27 Jul 2021 04:04:00 +0000 https://supabase.com/blog/mobbin-supabase-200000-users Mobbin uses Supabase to authenticate 200,000 users https://supabase.com/blog/mobbin-supabase-200000-users Learn how Mobbin migrated 200,000 users from Firebase for a better authentication experience. - Tue, 27 Jul 2021 16:04:00 +0000 + Tue, 27 Jul 2021 04:04:00 +0000 https://supabase.com/blog/storage-beta Supabase Storage now in Beta https://supabase.com/blog/storage-beta Supabase Storage moves into Beta. - Mon, 26 Jul 2021 16:04:00 +0000 + Mon, 26 Jul 2021 04:04:00 +0000 https://supabase.com/blog/spot-flutter-with-postgres Spot: a video sharing app built with Flutter https://supabase.com/blog/spot-flutter-with-postgres Spot is a geolocation-based video-sharing app with some social networking features. - Mon, 26 Jul 2021 16:04:00 +0000 + Mon, 26 Jul 2021 04:04:00 +0000 https://supabase.com/blog/supabase-postgres-13 Supabase is now on Postgres 13.3 https://supabase.com/blog/supabase-postgres-13 From today, new Supabase projects will be on a version of Supabase Postgres that runs on Postgres 13.3. - Sun, 25 Jul 2021 16:04:00 +0000 + Sun, 25 Jul 2021 04:04:00 +0000 https://supabase.com/blog/supabase-community-day Supabase Community Day https://supabase.com/blog/supabase-community-day Community Day - Sun, 25 Jul 2021 16:04:00 +0000 + Sun, 25 Jul 2021 04:04:00 +0000 https://supabase.com/blog/epsilon3-self-hosting Epsilon3 Self-Host Supabase To Revolutionize Space Operations https://supabase.com/blog/epsilon3-self-hosting Learn how the team at Epsilon3 use Supabase to help teams execute secure and reliable operations in an industry that project spend runs into the billions. - Sun, 25 Jul 2021 16:04:00 +0000 + Sun, 25 Jul 2021 04:04:00 +0000 https://supabase.com/blog/supabase-launch-week-sql Supabase Launch Week II: The SQL https://supabase.com/blog/supabase-launch-week-sql Five days of Supabase. Again. - Wed, 21 Jul 2021 16:04:00 +0000 + Wed, 21 Jul 2021 04:04:00 +0000 https://supabase.com/blog/roles-postgres-hooks Protecting reserved roles with PostgreSQL Hooks https://supabase.com/blog/roles-postgres-hooks Using Postgres Hooks to protect functionality in your Postgres database. - Thu, 01 Jul 2021 16:04:00 +0000 + Thu, 01 Jul 2021 04:04:00 +0000 https://supabase.com/blog/supabase-beta-june-2021 Supabase Beta June 2021 https://supabase.com/blog/supabase-beta-june-2021 Discord Logins, Vercel Integration, Full text search, and OAuth guides. - Tue, 01 Jun 2021 16:04:00 +0000 + Tue, 01 Jun 2021 04:04:00 +0000 https://supabase.com/blog/supabase-beta-may-2021 Supabase Beta May 2021 https://supabase.com/blog/supabase-beta-may-2021 Apple & Twitter Logins, Supabase Grid, Go & Swift Libraries. - Tue, 01 Jun 2021 16:04:00 +0000 + Tue, 01 Jun 2021 04:04:00 +0000 https://supabase.com/blog/supabase-beta-april-2021 Supabase Beta April 2021 https://supabase.com/blog/supabase-beta-april-2021 Supabase "gardening" - stability, security, and community support. - Tue, 04 May 2021 16:04:00 +0000 + Tue, 04 May 2021 04:04:00 +0000 https://supabase.com/blog/supabase-beta-march-2021 Supabase Beta March 2021 https://supabase.com/blog/supabase-beta-march-2021 Launch week, Storage, Supabase CLI, Connection Pooling, Supabase UI, and Pricing. - Mon, 05 Apr 2021 16:04:00 +0000 + Mon, 05 Apr 2021 04:04:00 +0000 https://supabase.com/blog/supabase-workflows Workflows are coming to Supabase https://supabase.com/blog/supabase-workflows Functions are great, but you know what's better? - Thu, 01 Apr 2021 16:04:00 +0000 + Thu, 01 Apr 2021 04:04:00 +0000 https://supabase.com/blog/supabase-pgbouncer PgBouncer is now available in Supabase https://supabase.com/blog/supabase-pgbouncer Better support for Serverless and Postgres. - Thu, 01 Apr 2021 16:04:00 +0000 + Thu, 01 Apr 2021 04:04:00 +0000 https://supabase.com/blog/supabase-dot-com Supabase Dot Com https://supabase.com/blog/supabase-dot-com The Supabase Domain name is changing. - Thu, 01 Apr 2021 16:04:00 +0000 + Thu, 01 Apr 2021 04:04:00 +0000 https://supabase.com/blog/supabase-nft-marketplace Supabase Launches NFT Marketplace https://supabase.com/blog/supabase-nft-marketplace A fully encrypted NFT platform to protect and transact your digital assets - Wed, 31 Mar 2021 16:04:00 +0000 + Thu, 01 Apr 2021 04:04:00 +0000 https://supabase.com/blog/supabase-cli Supabase CLI https://supabase.com/blog/supabase-cli Local development, database migrations, and self-hosting. - Tue, 30 Mar 2021 16:04:00 +0000 + Wed, 31 Mar 2021 04:04:00 +0000 https://supabase.com/blog/supabase-storage Storage is now available in Supabase https://supabase.com/blog/supabase-storage Launching Supabase Storage and how you can use it in your apps - Mon, 29 Mar 2021 16:04:00 +0000 + Tue, 30 Mar 2021 04:04:00 +0000 https://supabase.com/blog/pricing Supabase Beta Pricing https://supabase.com/blog/pricing Supabase launches Beta pricing structure - Sun, 28 Mar 2021 16:04:00 +0000 + Mon, 29 Mar 2021 04:04:00 +0000 https://supabase.com/blog/launch-week Launch week https://supabase.com/blog/launch-week Five days of Supabase. - Wed, 24 Mar 2021 16:04:00 +0000 + Wed, 24 Mar 2021 04:04:00 +0000 https://supabase.com/blog/angels-of-supabase Angels of Supabase https://supabase.com/blog/angels-of-supabase Meet the investors of Supabase. - Wed, 24 Mar 2021 16:04:00 +0000 + Wed, 24 Mar 2021 04:04:00 +0000 https://supabase.com/blog/In-The-Loop Developers stay up to date with intheloop.dev https://supabase.com/blog/In-The-Loop Learn why Kevin is building intheloop.dev with Supabase - Sun, 21 Mar 2021 16:04:00 +0000 + Mon, 22 Mar 2021 04:04:00 +0000 https://supabase.com/blog/using-supabase-replit Using Supabase in Replit https://supabase.com/blog/using-supabase-replit Free hosted relational database from within your node.js repl - Wed, 10 Mar 2021 16:04:00 +0000 + Thu, 11 Mar 2021 05:05:00 +0000 https://supabase.com/blog/toad-a-link-shortener-with-simple-apis-for-low-coders Toad, a link shortener with simple APIs for low-coders https://supabase.com/blog/toad-a-link-shortener-with-simple-apis-for-low-coders An easy-to-use link shortening tool with simple APIs - Sun, 07 Mar 2021 16:04:00 +0000 + Mon, 08 Mar 2021 05:05:00 +0000 https://supabase.com/blog/postgres-as-a-cron-server Postgres as a CRON Server https://supabase.com/blog/postgres-as-a-cron-server Running repetitive tasks with your Postgres database. - Thu, 04 Mar 2021 16:04:00 +0000 + Fri, 05 Mar 2021 05:05:00 +0000 https://supabase.com/blog/supabase-beta-february-2021 Supabase Beta February 2021 https://supabase.com/blog/supabase-beta-february-2021 One year of building. - Mon, 01 Mar 2021 16:04:00 +0000 + Tue, 02 Mar 2021 05:05:00 +0000 https://supabase.com/blog/cracking-postgres-interview Cracking PostgreSQL Interview Questions https://supabase.com/blog/cracking-postgres-interview Understand the top PostgreSQL Interview Questions - Fri, 26 Feb 2021 16:04:00 +0000 + Sat, 27 Feb 2021 05:05:00 +0000 https://supabase.com/blog/case-study-roboflow Roboflow.com choose Supabase to power Paint.wtf leaderboard https://supabase.com/blog/case-study-roboflow Learn how Roboflow.com used Supabase to build their Paint.wtf leaderboard - Mon, 08 Feb 2021 16:04:00 +0000 + Tue, 09 Feb 2021 05:05:00 +0000 https://supabase.com/blog/supabase-beta-january-2021 Supabase Beta January 2021 https://supabase.com/blog/supabase-beta-january-2021 Eleven months of building. - Mon, 01 Feb 2021 16:04:00 +0000 + Tue, 02 Feb 2021 05:05:00 +0000 https://supabase.com/blog/supabase-beta-december-2020 Supabase Beta December 2020 https://supabase.com/blog/supabase-beta-december-2020 Ten months of building. - Fri, 01 Jan 2021 16:04:00 +0000 + Sat, 02 Jan 2021 05:05:00 +0000 https://supabase.com/blog/supabase-dashboard-performance Making the Supabase Dashboard Supa-fast https://supabase.com/blog/supabase-dashboard-performance Improving the performance of the Supabase dashboard - Sat, 12 Dec 2020 16:04:00 +0000 + Sun, 13 Dec 2020 05:05:00 +0000 https://supabase.com/blog/supabase-striveschool Supabase Partners With Strive School To Help Teach Open Source https://supabase.com/blog/supabase-striveschool Supabase Partners With Strive School To Help Teach Open Source To The Next Generation Of Developers - Tue, 01 Dec 2020 16:04:00 +0000 + Wed, 02 Dec 2020 05:05:00 +0000 https://supabase.com/blog/case-study-xendit Xendit Built a Counter-Fraud Watchlist for the Fintech Industry https://supabase.com/blog/case-study-xendit See how Xendit use Supabase to build a full-text search engine. - Tue, 01 Dec 2020 16:04:00 +0000 + Wed, 02 Dec 2020 05:05:00 +0000 https://supabase.com/blog/case-study-tayfa TAYFA Built a No-Code Website Builder in Seven Days https://supabase.com/blog/case-study-tayfa See how Tayfa went from idea to paying customer in less than 30 days. - Tue, 01 Dec 2020 16:04:00 +0000 + Wed, 02 Dec 2020 05:05:00 +0000 https://supabase.com/blog/case-study-monitoro Monitoro Built a Web Crawler Handling Millions of API Requests https://supabase.com/blog/case-study-monitoro See how Monitoro built an automated scraping platform using Supabase. - Tue, 01 Dec 2020 16:04:00 +0000 + Wed, 02 Dec 2020 05:05:00 +0000 https://supabase.com/blog/supabase-alpha-november-2020 Supabase Alpha November 2020 https://supabase.com/blog/supabase-alpha-november-2020 Nine months of building. - Mon, 30 Nov 2020 16:04:00 +0000 + Tue, 01 Dec 2020 05:05:00 +0000 https://supabase.com/blog/postgresql-views Postgres Views https://supabase.com/blog/postgresql-views Creating and using a view in PostgreSQL. - Tue, 17 Nov 2020 16:04:00 +0000 + Wed, 18 Nov 2020 05:05:00 +0000 https://supabase.com/blog/supabase-alpha-october-2020 Supabase Alpha October 2020 https://supabase.com/blog/supabase-alpha-october-2020 Eight months of building. - Sun, 01 Nov 2020 16:04:00 +0000 + Mon, 02 Nov 2020 05:05:00 +0000 https://supabase.com/blog/improved-dx Supabase.js 1.0 https://supabase.com/blog/improved-dx We're releasing a new version of our Supabase client with some awesome new improvements. - Thu, 29 Oct 2020 16:04:00 +0000 + Fri, 30 Oct 2020 04:04:00 +0000 https://supabase.com/blog/supabase-alpha-september-2020 Supabase Alpha September 2020 https://supabase.com/blog/supabase-alpha-september-2020 Seven months of building. - Fri, 02 Oct 2020 16:04:00 +0000 + Sat, 03 Oct 2020 04:04:00 +0000 https://supabase.com/blog/supabase-hacktoberfest-2020 Supabase Hacktoberfest 2020 https://supabase.com/blog/supabase-hacktoberfest-2020 Join us for a celebration of open source software and learn how to contribute to Supabase. - Thu, 10 Sep 2020 16:04:00 +0000 + Fri, 11 Sep 2020 04:04:00 +0000 https://supabase.com/blog/supabase-alpha-august-2020 Supabase Alpha August 2020 https://supabase.com/blog/supabase-alpha-august-2020 Six months of building - Wed, 02 Sep 2020 16:04:00 +0000 + Thu, 03 Sep 2020 04:04:00 +0000 https://supabase.com/blog/supabase-auth Supabase Auth https://supabase.com/blog/supabase-auth Authenticate and authorize your users with Supabase Auth - Tue, 04 Aug 2020 16:04:00 +0000 + Wed, 05 Aug 2020 04:04:00 +0000 https://supabase.com/blog/supabase-alpha-july-2020 Supabase Alpha July 2020 https://supabase.com/blog/supabase-alpha-july-2020 Five months of building - Sat, 01 Aug 2020 16:04:00 +0000 + Sun, 02 Aug 2020 04:04:00 +0000 https://supabase.com/blog/continuous-postgresql-backup-walg Continuous PostgreSQL Backups using WAL-G https://supabase.com/blog/continuous-postgresql-backup-walg Have you ever wanted to restore your database's state to a particular moment in time? This post explains how, using WAL-G. - Sat, 01 Aug 2020 16:04:00 +0000 + Sun, 02 Aug 2020 04:04:00 +0000 https://supabase.com/blog/alpha-launch-postmortem Alpha Launch Postmortem https://supabase.com/blog/alpha-launch-postmortem Everything that went wrong with Supabase's launch - Thu, 09 Jul 2020 16:04:00 +0000 + Fri, 10 Jul 2020 04:04:00 +0000 https://supabase.com/blog/postgresql-templates What are PostgreSQL Templates? https://supabase.com/blog/postgresql-templates What are PostgreSQL templates and what are they used for? - Wed, 08 Jul 2020 16:04:00 +0000 + Thu, 09 Jul 2020 04:04:00 +0000 https://supabase.com/blog/postgresql-physical-logical-backups Physical vs Logical Backups in PostgreSQL https://supabase.com/blog/postgresql-physical-logical-backups What are physical and logical backups in Postgres? - Mon, 06 Jul 2020 16:04:00 +0000 + Tue, 07 Jul 2020 04:04:00 +0000 https://supabase.com/blog/supabase-alpha-june-2020 Supabase Alpha June 2020 https://supabase.com/blog/supabase-alpha-june-2020 Four months of building - Tue, 30 Jun 2020 16:04:00 +0000 + Wed, 01 Jul 2020 04:04:00 +0000 https://supabase.com/blog/supabase-steve-chavez Steve Chavez has joined Supabase https://supabase.com/blog/supabase-steve-chavez Steve joins Supabase to help build Auth. - Sun, 14 Jun 2020 16:04:00 +0000 + Mon, 15 Jun 2020 04:04:00 +0000 https://supabase.com/blog/supabase-alpha-may-2020 Supabase Alpha May 2020 https://supabase.com/blog/supabase-alpha-may-2020 Three months of building - Sun, 31 May 2020 16:04:00 +0000 + Mon, 01 Jun 2020 04:04:00 +0000 https://supabase.com/blog/supabase-alpha-april-2020 Supabase Alpha April 2020 https://supabase.com/blog/supabase-alpha-april-2020 Two months of building - Sun, 31 May 2020 16:04:00 +0000 + Mon, 01 Jun 2020 04:04:00 +0000 diff --git a/i18n/README.bn.md b/i18n/README.bn.md index b9455141903..ef6c1836891 100644 --- a/i18n/README.bn.md +++ b/i18n/README.bn.md @@ -11,7 +11,7 @@ - [x] হোস্ট করা পোস্টগ্রেস ডাটাবেস. [ডক্স](https://supabase.com/docs/guides/database) - [x] অথেনটিকেশন এবং অথরাইজড . [ডক্স](https://supabase.com/docs/guides/auth) -- [x] স্বয়ংক্রিয়ভাবে তৈরি APIs. +- [x] স্বয়ংক্রিয়ভাবে তৈরি এপিআই. - [x] রেস্ট. [ডক্স](https://supabase.com/docs/guides/api#rest-api) - [x] রিয়েলটাইম সাবস্ক্রিপশন. [ডক্স](https://supabase.com/docs/guides/api#realtime-api) - [x] গ্রাফকিউএল (বেটা). [ডক্স](https://supabase.com/docs/guides/api#graphql-api) @@ -31,10 +31,10 @@ ## কমিউনিটি ও সাপোর্ট -- [কমিউনিটি ফোরাম](https://github.com/supabase/supabase/discussions). এর জন্য সর্বোত্তম: তৈরিতে সহায়তা, ডাটাবেস সেরা অনুশীলন সম্পর্কে আলোচনা। -- [গিঠাব ইস্যু](https://github.com/supabase/supabase/issues). এর জন্য সেরা: সুপাবেস ব্যবহার করে আপনি যে বাগ এবং ত্রুটির সম্মুখীন হন। -- [ইমেইল সাপোর্ট](https://supabase.com/docs/support#business-support). এর জন্য সেরা: আপনার ডাটাবেস বা অবকাঠামো নিয়ে সমস্যা। -- [ডিসকোর্ড](https://discord.supabase.com). এর জন্য সর্বোত্তম: আপনার অ্যাপ্লিকেশনগুলি ভাগ করা এবং সম্প্রদায়ের সাথে হ্যাঙ্গআউট করা৷ +- [কমিউনিটি ফোরাম](https://github.com/supabase/supabase/discussions)। সর্বোত্তম: তৈরি করতে সহায়তা, ডাটাবেস সেরা অনুশীলন সম্পর্কে আলোচনা। +- [গিটহাব ইস্যু](https://github.com/supabase/supabase/issues)। সর্বোত্তম: সুপাবেস ব্যবহার করতে আপনি যে বাগ এবং ত্রুটির সম্মুখীন হন। +- [ইমেইল সাপোর্ট](https://supabase.com/docs/support#business-support)। সর্বোত্তম: আপনার ডাটাবেস বা অবকাঠামো নিয়ে সমস্যা। +- [ডিসকোর্ড](https://discord.supabase.com)। সর্বোত্তম: আপনার অ্যাপ্লিকেশনগুলি শেয়ার করা এবং কমিউনিটির সাথে দেখা সাক্ষাৎ করা৷ ## স্ট্যাটাস @@ -43,30 +43,30 @@ - [x] পাবলিক বেটা: বেশিরভাগ নন-এন্টারপ্রাইজ ব্যবহারের ক্ষেত্রে যথেষ্ট স্থিতিশীল - [ ] পাবলিক: প্রোডাকশন রেডি -আমরা বর্তমানে পাবলিক বেটাতে আছি। বড় আপডেটের বিজ্ঞপ্তি পেতে এই রেপোর "রিলিজ" দেখুন। +আমরা বর্তমানে পাবলিক বেটাতে আছি। বড় আপডেটের বিজ্ঞপ্তি পেতে এই রিপুর "রিলিজ" দেখুন। -এই রেপো দেখুন +এই রিপু দেখুন --- ## কিভাবে এটা কাজ করে -Supabase হল ওপেন সোর্স টুলের সংমিশ্রণ। আমরা এন্টারপ্রাইজ-গ্রেড, ওপেন সোর্স পণ্য ব্যবহার করে Firebase-এর বৈশিষ্ট্য তৈরি করছি। যদি MIT, Apache 2, বা সমতুল্য ওপেন লাইসেন্স সহ টুল এবং সম্প্রদায়গুলি বিদ্যমান থাকে, আমরা সেই টুলটি ব্যবহার করব এবং সমর্থন করব। যদি টুলটি বিদ্যমান না থাকে, তাহলে আমরা নিজেরাই এটি তৈরি এবং ওপেন সোর্স করি। Supabase Firebase-এর 1-থেকে-1 ম্যাপিং নয়। ওপেন সোর্স টুল ব্যবহার করে ডেভেলপারদের ফায়ারবেসের মতো ডেভেলপার অভিজ্ঞতা দেওয়াই আমাদের লক্ষ্য। +Supabase হল ওপেন সোর্স টুলের সংমিশ্রণ। আমরা এন্টারপ্রাইজ-গ্রেড, ওপেন সোর্স পণ্য ব্যবহার করে Firebase-এর ফিচারসমুহ তৈরি করছি। যদি MIT, Apache 2, বা সমতুল্য ওপেন লাইসেন্স সহ টুল এবং সম্প্রদায়গুলি বিদ্যমান থাকে, আমরা সেই টুলটি ব্যবহার করব এবং সমর্থন করব। যদি টুলটি বিদ্যমান না থাকে, তাহলে আমরা নিজেরাই এটি তৈরি এবং ওপেন সোর্স করি। Supabase Firebase-এর 1-থেকে-1 ম্যাপিং নয়। ওপেন সোর্স টুল ব্যবহার করে ডেভেলপারদের ফায়ারবেসের মতো ডেভেলপার অভিজ্ঞতা দেওয়াই আমাদের লক্ষ্য। **স্থাপত্য** -সুপাবেস হল একটি [হোস্ট করা প্ল্যাটফর্ম](https://app.supabase.com)। আপনি সাইন আপ করতে পারেন এবং কিছু ইনস্টল না করে সুপাবেস ব্যবহার শুরু করতে পারেন। +সুপাবেস হল একটি [হোস্ট করা প্ল্যাটফর্ম](https://app.supabase.com)। আপনি সাইন আপ করে এবং কিছু ইনস্টল না করে সুপাবেস ব্যবহার শুরু করতে পারেন। এছাড়াও আপনি [স্ব-হোস্ট](https://supabase.com/docs/guides/hosting/overview) এবং [ডেভেলপ লোকালি](https://supabase.com/docs/guides/local-development) করতে পারেন। ![আর্কিটেকচার](https://user-images.githubusercontent.com/70828596/187547862-ffa9d058-0c3a-4851-a3e7-92ccfca4b596.png) - [PostgreSQL](https://www.postgresql.org/) হল একটি অবজেক্ট-রিলেশনাল ডাটাবেস সিস্টেম যার 30 বছরের বেশি সক্রিয় বিকাশ রয়েছে যা এটিকে নির্ভরযোগ্যতা, বৈশিষ্ট্যের দৃঢ়তা এবং কর্মক্ষমতার জন্য একটি শক্তিশালী খ্যাতি অর্জন করেছে। - [রিয়েলটাইম](https://github.com/supabase/realtime) হল একটি Elixir সার্ভার যা আপনাকে ওয়েবসকেট ব্যবহার করে PostgreSQL সন্নিবেশ, আপডেট এবং মুছে ফেলা শুনতে দেয়। ডাটাবেস পরিবর্তনের জন্য রিয়েলটাইম পোল পোস্টগ্রেসের অন্তর্নির্মিত প্রতিলিপি কার্যকারিতা, পরিবর্তনগুলিকে JSON-এ রূপান্তরিত করে, তারপর অনুমোদিত ক্লায়েন্টদের কাছে ওয়েবসকেটের মাধ্যমে JSON সম্প্রচার করে। -- [PostgREST](http://postgrest.org/) একটি ওয়েব সার্ভার যা আপনার PostgreSQL ডাটাবেসকে সরাসরি একটি RESTful API-তে পরিণত করে -- [স্টোরেজ](https://github.com/supabase/storage-api) অনুমতিগুলি পরিচালনা করতে Postgres ব্যবহার করে S3-এ সঞ্চিত ফাইলগুলি পরিচালনা করার জন্য একটি RESTful ইন্টারফেস প্রদান করে। -- [postgres-meta](https://github.com/supabase/postgres-meta) হল আপনার পোস্টগ্রেস পরিচালনা করার জন্য একটি RESTful API, যা আপনাকে টেবিল আনতে, ভূমিকা যোগ করতে এবং কোয়েরি চালানোর অনুমতি দেয়। -- [GoTrue](https://github.com/netlify/gotrue) ব্যবহারকারীদের পরিচালনা এবং SWT টোকেন ইস্যু করার জন্য একটি SWT ভিত্তিক API। -- [কং](https://github.com/Kong/kong) হল একটি ক্লাউড-নেটিভ API গেটওয়ে। +- [PostgREST](http://postgrest.org/) একটি ওয়েব সার্ভার যা আপনার PostgreSQL ডাটাবেসকে সরাসরি একটি রেস্টফুল এপিআইতে পরিণত করে। +- [স্টোরেজ](https://github.com/supabase/storage-api) অনুমতিগুলি পরিচালনা করতে পোস্টগ্রেস ব্যবহার করে S3-এ সঞ্চিত ফাইলগুলি পরিচালনা করার জন্য একটি রেস্টফুল ইন্টারফেস প্রদান করে। +- [পোস্টগ্রেস-মেটা](https://github.com/supabase/postgres-meta) হল আপনার পোস্টগ্রেস পরিচালনা করার জন্য একটি রেস্টফুল এপিআই, যা আপনাকে টেবিল আনতে, ভূমিকা যোগ করতে এবং কোয়েরি চালানোর অনুমতি দেয়। +- [গোট্রু](https://github.com/netlify/gotrue) ব্যবহারকারীদের পরিচালনা এবং SWT টোকেন ইস্যু করার জন্য একটি SWT ভিত্তিক এপিআই +- [কং](https://github.com/Kong/kong) হল একটি ক্লাউড-নেটিভ এপিআই গেটওয়ে। #### ক্লায়েন্ট লাইব্রেরি @@ -82,7 +82,7 @@ Supabase হল ওপেন সোর্স টুলের সংমিশ্ Supabase PostgREST - GoTrue + গোট্রু রিয়েলটাইম স্টোরেজ @@ -100,28 +100,28 @@ Supabase হল ওপেন সোর্স টুলের সংমিশ্ ⚡️ অফিসিয়াল ⚡️ জাভাস্ক্রিপ্ট (টাইপস্ক্রিপ্ট) - supabase-js + সুপাবেস-জেএস postgrest-js - gotrue-js + গোট্রু-জেএস রিয়েলটাইম-জেএস - storage-js + স্টোরেজ-জেএস 💚 সম্প্রদায় 💚 C# supabase-csharp postgrest-csharp - gotrue-csharp + গোট্রু-csharp রিয়েলটাইম-csharp - ডার্ট (ফ্লাটার) - supabase-dart - postgrest-dart - gotrue-dart + সুপাবেস-ডার্ট + postgrest-ডার্ট + গোট্রু-ডার্ট রিয়েলটাইম-ডার্ট - storage-dart + স্টোরেজ-ডার্ট গো @@ -135,7 +135,7 @@ Supabase হল ওপেন সোর্স টুলের সংমিশ্ জাভা - - - gotrue-java + গোট্রু-জাভা - - @@ -143,7 +143,7 @@ Supabase হল ওপেন সোর্স টুলের সংমিশ্ কোটলিন - postgrest-kt - gotrue-kt + গোট্রু-kt - - @@ -151,13 +151,13 @@ Supabase হল ওপেন সোর্স টুলের সংমিশ্ পাইথন supabase-py postgrest-py - gotrue-py - realtime-py + গোট্রু-py + রিয়েলটাইম-py - রুবি - supabase-rb + সুপাবেস-rb postgrest-rb - - @@ -173,9 +173,9 @@ Supabase হল ওপেন সোর্স টুলের সংমিশ্ সুইফট - supabase-swift - postgrest-swift - gotrue-swift + সুপাবেস-সুইফট + postgrest-সুইফট + গোট্রু-সুইফট রিয়েলটাইম-সুইফট স্টোরেজ-সুইফট @@ -185,6 +185,6 @@ Supabase হল ওপেন সোর্স টুলের সংমিশ্ - [অনুবাদের তালিকা](/i18n/languages.md) -## স্পনসর +## পৃষ্ঠপোষক -[![নতুন স্পনসর](https://user-images.githubusercontent.com/10214025/90518111-e74bbb00-e198-11ea-8f88-c9e3c1aa4b5b.png)](https://github.com/sponsors/supabase) +[![নতুন পৃষ্ঠপোষক](https://user-images.githubusercontent.com/10214025/90518111-e74bbb00-e198-11ea-8f88-c9e3c1aa4b5b.png)](https://github.com/sponsors/supabase) diff --git a/spec/common-client-libs-sections.json b/spec/common-client-libs-sections.json index 7aa270c1eaa..f1afe0b46b5 100644 --- a/spec/common-client-libs-sections.json +++ b/spec/common-client-libs-sections.json @@ -17,8 +17,7 @@ "title": "Initializing", "id": "initializing", "slug": "initializing", - "type": "markdown", - "libs": ["dart", "dart_v0"] + "type": "function" }, { "title": "Typescript Support", diff --git a/spec/common-self-hosting-auth-sections.json b/spec/common-self-hosting-auth-sections.json index aac1b124ada..82b090de047 100644 --- a/spec/common-self-hosting-auth-sections.json +++ b/spec/common-self-hosting-auth-sections.json @@ -123,12 +123,6 @@ "title": "Returns the updated user", "type": "operation" }, - { - "id": "verifies-a-sign-up", - "slug": "verifies-a-sign-up", - "title": "Verifies a sign up", - "type": "operation" - }, { "id": "verifies-a-sign-up", "slug": "verifies-a-sign-up", diff --git a/spec/supabase_js_v1.yml b/spec/supabase_js_v1.yml index 81b1d4ddb18..b56b1390eac 100644 --- a/spec/supabase_js_v1.yml +++ b/spec/supabase_js_v1.yml @@ -16,6 +16,68 @@ info: version: '0.0.1' functions: + - id: initializing + title: 'Initializing' + $ref: '@supabase/supabase-js.index.SupabaseClient.constructor' + examples: + - id: create-client + name: Create Client + code: | + ```js + import { createClient } from '@supabase/supabase-js' + + // Create a single supabase client for interacting with your database + const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key') + ``` + - id: with-additional-parameters + name: With Additional Parameters + code: | + ```js + import { createClient } from '@supabase/supabase-js' + + const options = { + schema: 'public', + headers: { 'x-my-custom-header': 'my-app-name' }, + autoRefreshToken: true, + persistSession: true, + detectSessionInUrl: true, + } + const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key', options) + ``` + - id: api-schemas + name: API schemas + code: | + ```js + import { createClient } from '@supabase/supabase-js' + + const options = { + schema: 'public', + headers: { 'x-my-custom-header': 'my-app-name' }, + autoRefreshToken: true, + persistSession: true, + detectSessionInUrl: true, + } + const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key', options) + ``` + description: | + By default the API server points to the `public` schema. You can enable other database schemas within the Dashboard. + Go to `Settings > API > Schema` and add the schema which you want to expose to the API. You also need to grant `USAGE` on your new schema with the grants you desire, such as `SELECT, INSERT, UPDATE, DELETE`. + + Note: each client connection can only access a single schema, so the code above can access the `other_schema` schema but cannot access the `public` schema. + - id: custom-fetch-implementation + name: Custom Fetch Implementation + code: | + ```js + import { createClient } from '@supabase/supabase-js' + + const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key', { + fetch: fetch.bind(globalThis), + }) + ``` + description: | + `supabase-js` uses the [`cross-fetch`](https://www.npmjs.com/package/cross-fetch) library to make HTTP requests, + but an alternative `fetch` implementation can be provided as an option. + This is most useful in environments where `cross-fetch` is not compatible (for instance Cloudflare Workers). - id: sign-up title: 'signUp()' $ref: '@supabase/gotrue-js.GoTrueClient.signUp' diff --git a/spec/supabase_js_v2.yml b/spec/supabase_js_v2.yml index 685f250ff91..6bc7533f139 100644 --- a/spec/supabase_js_v2.yml +++ b/spec/supabase_js_v2.yml @@ -968,6 +968,17 @@ functions: name: Query foreign tables description: | If your database has foreign key relationships, you can query related tables too. + code: | + ```js + const { data, error } = await supabase + .from('countries') + .select(` + name, + cities ( + name + ) + `) + ``` - id: query-foreign-tables-through-a-join-table name: Query foreign tables through a join table code: | diff --git a/studio/components/interfaces/Functions/FunctionsEmptyState.tsx b/studio/components/interfaces/Functions/FunctionsEmptyState.tsx index c100eaa152e..0e55b1d6103 100644 --- a/studio/components/interfaces/Functions/FunctionsEmptyState.tsx +++ b/studio/components/interfaces/Functions/FunctionsEmptyState.tsx @@ -25,7 +25,7 @@ const FunctionsEmptyState = () => {
) } diff --git a/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx b/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx index 530bc2073e7..42fab599ac0 100644 --- a/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx +++ b/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx @@ -95,6 +95,7 @@ const MembersView = () => { const memberIsPendingInvite = !!x.invited_id const canRemoveRole = rolesRemovable.includes(memberRoleId) const disableRoleEdit = !canRemoveRole || memberIsUser || memberIsPendingInvite + const isEmailUser = x.username === x.primary_email const validateSelectedRoleToChange = (roleId: any) => { if (!role || role.id === roleId) return @@ -126,6 +127,10 @@ const MembersView = () => { + ) : isEmailUser ? ( +
+ +
) : ( { const [isLeaving, setIsLeaving] = useState(false) const canAddMembers = rolesAddable.length > 0 + const canLeave = !isOwner || (isOwner && hasMultipleOwners(members, roles)) + function onFilterMemberChange(e: any) { PageState.membersFilterString = e.target.value } @@ -77,13 +80,35 @@ const TeamSettings = observer(() => { />
)} - {!isOwner && ( -
- -
- )} +
+ + + + + {!canLeave && ( + + +
+ + An organization requires at least 1 owner + +
+
+ )} +
+
diff --git a/studio/components/interfaces/Organization/TeamSettings/TeamSettings.utils.ts b/studio/components/interfaces/Organization/TeamSettings/TeamSettings.utils.ts index 37ea52a0822..9651dacc86c 100644 --- a/studio/components/interfaces/Organization/TeamSettings/TeamSettings.utils.ts +++ b/studio/components/interfaces/Organization/TeamSettings/TeamSettings.utils.ts @@ -1,4 +1,4 @@ -import { Role } from 'types' +import { Member, Role } from 'types' import { checkPermissions } from 'hooks' import { PermissionAction } from '@supabase/shared-types/out/constants' @@ -23,3 +23,12 @@ export const getRolesManagementPermissions = ( return { rolesAddable, rolesRemovable } } + +export const hasMultipleOwners = (members: Member[] = [], roles: Role[] = []) => { + const membersWhoAreOwners = members.filter((member) => { + const [memberRoleId] = member.role_ids ?? [] + const role = roles.find((role: Role) => role.id === memberRoleId) + return role?.name === 'Owner' && !member.invited_at + }) + return membersWhoAreOwners.length > 1 +} diff --git a/studio/stores/authConfig/schema/AuthProviders/AuthProvidersFormValidation.tsx b/studio/stores/authConfig/schema/AuthProviders/AuthProvidersFormValidation.tsx index b51f6d754f1..d1a2a1cccbf 100644 --- a/studio/stores/authConfig/schema/AuthProviders/AuthProvidersFormValidation.tsx +++ b/studio/stores/authConfig/schema/AuthProviders/AuthProvidersFormValidation.tsx @@ -48,7 +48,7 @@ const PROVIDER_EMAIL = { misc: { iconKey: 'email-icon2', helper: `To complete setup, add this authorisation callback URL to your app's configuration in the Apple Developer Console. - [Learn more](https://supabase.com/docs/guides/auth/auth-apple#configure-your-services-id)`, + [Learn more](https://supabase.com/docs/guides/auth/social-login/auth-apple#configure-your-services-id)`, }, } @@ -279,7 +279,7 @@ const PROVIDER_PHONE = { misc: { iconKey: 'phone-icon4', helper: `To complete setup, add this authorisation callback URL to your app's configuration in the Apple Developer Console. - [Learn more](https://supabase.com/docs/guides/auth/auth-apple#configure-your-services-id)`, + [Learn more](https://supabase.com/docs/guides/auth/social-login/auth-apple#configure-your-services-id)`, }, } @@ -310,7 +310,7 @@ Client identifier when authenticating or validating users. title: 'Secret key', description: ` The secret key is a JWT token that must be generated. -[Learn more](https://supabase.com/docs/guides/auth/auth-apple#generate-a-client_secret)`, +[Learn more](https://supabase.com/docs/guides/auth/social-login/auth-apple#generate-a-client_secret)`, type: 'string', isSecret: true, }, @@ -332,7 +332,7 @@ The secret key is a JWT token that must be generated. iconKey: 'apple-icon', requiresRedirect: true, helper: `To complete setup, add this authorisation callback URL to your app's configuration in the Apple Developer Console. - [Learn more](https://supabase.com/docs/guides/auth/auth-apple#configure-your-services-id)`, + [Learn more](https://supabase.com/docs/guides/auth/social-login/auth-apple#configure-your-services-id)`, alert: { title: `Apple secrets will self expire every 6 months`, description: `You will need to regenerate before the 6 months elapses otherwise your users using Apple Login will no longer be able to log back in.`, @@ -357,7 +357,7 @@ const EXTERNAL_PROVIDER_AZURE = { EXTERNAL_AZURE_SECRET: { // [TODO] Change docs title: 'Secret Value', - description: `Enter the data from Value, not the Secret ID. [Learn more](https://supabase.com/docs/guides/auth/auth-azure#obtain-a-secret-id)`, + description: `Enter the data from Value, not the Secret ID. [Learn more](https://supabase.com/docs/guides/auth/social-login/auth-azure#obtain-a-secret-id)`, type: 'string', isSecret: true, }, diff --git a/studio/stores/authConfig/schema/AuthProviders/AuthTemplatesValidation.tsx b/studio/stores/authConfig/schema/AuthProviders/AuthTemplatesValidation.tsx index 82320e55bd9..526e91022a9 100644 --- a/studio/stores/authConfig/schema/AuthProviders/AuthTemplatesValidation.tsx +++ b/studio/stores/authConfig/schema/AuthProviders/AuthTemplatesValidation.tsx @@ -30,7 +30,7 @@ export const CONFIRMATION: FormSchema = { misc: { iconKey: 'email-icon2', helper: `To complete setup, add this authorisation callback URL to your app's configuration in the Apple Developer Console. - [Learn more](https://supabase.com/docs/guides/auth/auth-apple#configure-your-services-id)`, + [Learn more](https://supabase.com/docs/guides/auth/social-login/auth-apple#configure-your-services-id)`, }, } @@ -61,7 +61,7 @@ export const INVITE: FormSchema = { misc: { iconKey: 'email-icon2', helper: `To complete setup, add this authorisation callback URL to your app's configuration in the Apple Developer Console. - [Learn more](https://supabase.com/docs/guides/auth/auth-apple#configure-your-services-id)`, + [Learn more](https://supabase.com/docs/guides/auth/social-login/auth-apple#configure-your-services-id)`, }, } @@ -92,7 +92,7 @@ export const MAGIC_LINK: FormSchema = { misc: { iconKey: 'email-icon2', helper: `To complete setup, add this authorisation callback URL to your app's configuration in the Apple Developer Console. - [Learn more](https://supabase.com/docs/guides/auth/auth-apple#configure-your-services-id)`, + [Learn more](https://supabase.com/docs/guides/auth/social-login/auth-apple#configure-your-services-id)`, }, } @@ -123,7 +123,7 @@ export const EMAIL_CHANGE: FormSchema = { misc: { iconKey: 'email-icon2', helper: `To complete setup, add this authorisation callback URL to your app's configuration in the Apple Developer Console. - [Learn more](https://supabase.com/docs/guides/auth/auth-apple#configure-your-services-id)`, + [Learn more](https://supabase.com/docs/guides/auth/social-login/auth-apple#configure-your-services-id)`, }, } @@ -154,7 +154,7 @@ export const RECOVERY: FormSchema = { misc: { iconKey: 'email-icon2', helper: `To complete setup, add this authorisation callback URL to your app's configuration in the Apple Developer Console. - [Learn more](https://supabase.com/docs/guides/auth/auth-apple#configure-your-services-id)`, + [Learn more](https://supabase.com/docs/guides/auth/social-login/auth-apple#configure-your-services-id)`, }, } diff --git a/studio/styles/main.scss b/studio/styles/main.scss index 1629e225f20..e3d187c24c4 100644 --- a/studio/styles/main.scss +++ b/studio/styles/main.scss @@ -216,6 +216,12 @@ div.fixed.inset-0 { } } +@media (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } +} + .text-area-resize-none { textarea { @apply resize-none; diff --git a/studio/styles/storage.scss b/studio/styles/storage.scss index 103f60b8412..92c6789701f 100644 --- a/studio/styles/storage.scss +++ b/studio/styles/storage.scss @@ -40,7 +40,9 @@ // scroll-behavior: smooth; // } -.storage-row:hover { +.storage-row:hover, +button[aria-haspopup='menu'][data-state='open'], +button[aria-haspopup='menu']:focus-visible { .storage-row-menu { @apply opacity-100; }