Merge branch 'master' into docs/studio_updates

This commit is contained in:
Copple committed 2021-11-30 19:40:35 +08:00
commit 650695e846
49 files changed
+1696 -683

No files matched your search

@@ -9,10 +9,8 @@ import Roles from '@site/docs/careers/snippets/roles.mdx'
import About from '@site/docs/careers/snippets/about.mdx'
import Team from '@site/docs/careers/snippets/team.mdx'
import Apply from '@site/docs/careers/snippets/apply.mdx'
import Freeze from '@site/docs/careers/snippets/hiring-freeze.mdx'
import Process from '@site/docs/careers/snippets/process.mdx'
<Freeze />
## About the role
-2
View File
@@ -9,10 +9,8 @@ import Roles from '@site/docs/careers/snippets/roles.mdx'
import About from '@site/docs/careers/snippets/about.mdx'
import Team from '@site/docs/careers/snippets/team.mdx'
import Apply from '@site/docs/careers/snippets/apply.mdx'
import Freeze from '@site/docs/careers/snippets/hiring-freeze.mdx'
import Process from '@site/docs/careers/snippets/process.mdx'
<Freeze />
## About the role
-2
View File
@@ -9,10 +9,8 @@ import Roles from '@site/docs/careers/snippets/roles.mdx'
import About from '@site/docs/careers/snippets/about.mdx'
import Team from '@site/docs/careers/snippets/team.mdx'
import Apply from '@site/docs/careers/snippets/apply.mdx'
import Freeze from '@site/docs/careers/snippets/hiring-freeze.mdx'
import Process from '@site/docs/careers/snippets/process.mdx'
<Freeze />
## About the role
-2
View File
@@ -9,10 +9,8 @@ import Roles from '@site/docs/careers/snippets/roles.mdx'
import About from '@site/docs/careers/snippets/about.mdx'
import Team from '@site/docs/careers/snippets/team.mdx'
import Apply from '@site/docs/careers/snippets/apply.mdx'
import Freeze from '@site/docs/careers/snippets/hiring-freeze.mdx'
import Process from '@site/docs/careers/snippets/process.mdx'
<Freeze />
## About the role
-2
View File
@@ -9,10 +9,8 @@ import Roles from '@site/docs/careers/snippets/roles.mdx'
import About from '@site/docs/careers/snippets/about.mdx'
import Team from '@site/docs/careers/snippets/team.mdx'
import Apply from '@site/docs/careers/snippets/apply.mdx'
import Freeze from '@site/docs/careers/snippets/hiring-freeze.mdx'
import Process from '@site/docs/careers/snippets/process.mdx'
<Freeze />
## About the role
-1
View File
@@ -9,7 +9,6 @@ import Roles from '@site/docs/careers/snippets/roles.mdx'
import About from '@site/docs/careers/snippets/about.mdx'
import Team from '@site/docs/careers/snippets/team.mdx'
import Apply from '@site/docs/careers/snippets/apply.mdx'
import Freeze from '@site/docs/careers/snippets/hiring-freeze.mdx'
import Process from '@site/docs/careers/snippets/process.mdx'
## About the role
+1 -1
View File
@@ -1,3 +1,3 @@
# Supabase Studio
Dashboard for Supabase projects (README will be updated during Launch Week - 30th Nov)
Dashboard for Supabase projects (README will be updated during Launch Week - 30th Nov 🎉)
@@ -37,7 +37,7 @@ const ProjectUsage: FC<Props> = ({ project }) => {
return (
<div className="mx-6 space-y-6">
<Typography.Title level={4}>Statistics for the past 7 days</Typography.Title>
<Typography.Title level={4}>Statistics for past 24 hours</Typography.Title>
<div className="">
{startDate && endDate && (
<div className="grid lg:grid-cols-4 lg:gap-8">
@@ -62,6 +62,10 @@ export const inferColumnType = (column: string, rows: object[]) => {
// General strategy is to check the first row first, before checking across all the rows
// to ensure uniformity in data type. Thinking we do this as an optimization instead of
// checking all the rows up front.
// If there are no rows to infer for, default to text
if (rows.length === 0) return 'text'
const columnData = (rows[0] as any)[column]
const columnDataAcrossRows = rows.map((row: object) => (row as any)[column])
@@ -33,7 +33,7 @@ const createValidator = (schema) => {
})
validator(cleansedModel)
if (validator.errors && validator.errors.length) {
throw { details: validator.errors }
return { details: validator.errors }
}
}
}
@@ -27,10 +27,12 @@ export default function SchemaFormPanel({
const onClickSubmit = () => {
formRef
.submit()
.then((response) => {
.then(() => {
setSubmitButtonLoading(true)
})
.catch(console.error)
.catch((error) => {
console.log('Error on submitting', error)
})
}
return (
+3
View File
@@ -1,3 +1,6 @@
/// <reference types="next" />
/// <reference types="next/types/global" />
/// <reference types="next/image-types/global" />
// NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information.
+1114 -649
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "studio",
"version": "0.0.2",
"version": "0.0.3",
"private": true,
"scripts": {
"dev": "next dev -p 8082",
+9 -5
View File
@@ -1,7 +1,6 @@
import useSWR from 'swr'
import { observer } from 'mobx-react-lite'
import { useState, useEffect } from 'react'
import { toast } from 'react-hot-toast'
import { useRouter } from 'next/router'
import { AutoField, NumField } from 'uniforms-bootstrap4'
import { Button, Divider, Typography, Toggle as UIToggle } from '@supabase/ui'
@@ -34,6 +33,8 @@ export default withAuth(observer(Auth))
const Settings = () => {
const router = useRouter()
const { ui } = useStore()
const [model, setModel] = useState<any>({})
const [smsProviderModel, setSmsProviderModel] = useState<any>({})
const [externalProvidersModel, setExternalProvidersModel] = useState<any>({})
@@ -75,11 +76,14 @@ const Settings = () => {
}
const response = await patch(URL, model)
if (response.error) {
toast.error(`Update config failed: ${response.error.message}`)
ui.setNotification({
category: 'error',
message: `Update config failed: ${response.error.message}`,
})
} else {
const updates = response
setModel({ ...updates })
toast(`Settings saved`)
ui.setNotification({ category: 'success', message: 'Settings saved' })
}
}
@@ -98,9 +102,9 @@ const Settings = () => {
if (response.error) throw response.error
const updates = response
setModel({ ...updates })
toast(`Settings saved`)
ui.setNotification({ category: 'success', message: 'Settings saved' })
} catch (error: any) {
toast.error(`Update config failed: ${error.message}`)
ui.setNotification({ category: 'error', message: `Update config failed: ${error.message}` })
}
}
+2 -2
View File
@@ -276,7 +276,7 @@ const ServiceList: FC<any> = ({ projectRef }) => {
)
}
const PostgrestConfig = ({ config, projectRef }: any) => {
const PostgrestConfig = observer(({ config, projectRef }: any) => {
const PageState: any = useContext(PageContext)
const { meta } = PageState
@@ -396,4 +396,4 @@ const PostgrestConfig = ({ config, projectRef }: any) => {
</SchemaFormPanel>
</>
)
}
})
+1 -1
View File
@@ -393,7 +393,7 @@ export default class MetaStore implements IMetaStore {
// If the user is importing data via a spreadsheet
if (!isUndefined(importContent)) {
if (importContent.file) {
if (importContent.file && importContent.rowCount > 0) {
// Via a CSV file
const { error }: any = await this.insertRowsViaSpreadsheet(
importContent.file,
+12
View File
@@ -425,6 +425,18 @@ pages:
''')
.execute();
```
- name: Filtering with inner joins
description: |
If you want to filter a table based on a child table's values you can use the `!inner()` function. For example, if you wanted
to select all rows in a `message` table which belong to a user with the `username` "Jane":
js: |
```js
final res = await supabase
.from('messages')
.select('*, users!inner(*)')
.eq('users.username', 'Jane')
.execute();
```
- name: Querying with count option
description: |
You can get the number of rows by using the count option.
+12 -1
View File
@@ -283,7 +283,7 @@ pages:
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key', {
fetch: fetch
fetch: fetch.bind(globalThis)
})
```
@@ -856,6 +856,17 @@ pages:
purchaser:purchaser_id ( name )
`)
```
- name: Filtering with inner joins
description: |
If you want to filter a table based on a child table's values you can use the `!inner()` function. For example, if you wanted
to select all rows in a `message` table which belong to a user with the `username` "Jane":
js: |
```js
const { data, error } = await supabase
.from('messages')
.select('*, users!inner(*)')
.eq('users.username', 'Jane')
```
- name: Querying with count option
description: |
You can get the number of rows by using the count option.
@@ -149,7 +149,7 @@ http_post
After making a request, the extension will return an ID. You can use this ID to collect a response.
```sql noCopy
```sql hideCopy
-- Collect the response from a request
select
*
@@ -207,7 +207,7 @@ To build asynchronous behavior, we use a PostgreSQL [background worker](https://
Shout out to [Paul Ramsey](https://github.com/pramsey), who gave us the implementation idea in [pgsql-http](https://github.com/pramsey/pgsql-http/#to-do). While we originally hoped to add background workers to his extension, the implementation became too cumbersome and we decided to start with a clean slate. The advantage of being async can be seen by making some requests with both extensions:
```sql noCopy
```sql hideCopy
\timing on
-- using pgsql-http to fetch from "supabase.io" 10 times
@@ -5,8 +5,8 @@ author: paul_copplestone
author_url: https://github.com/kiwicopple
author_image_url: https://github.com/kiwicopple.png
authorURL: https://github.com/kiwicopple
image: launch-week-3/launch-week-3-og.jpg
thumb: launch-week-3/launch-week-3-thumb.jpg
image: launch-week-three/launch-week-three-og.jpg
thumb: launch-week-three/launch-week-three-thumb.jpg
tags:
- launch-week
date: '2021-11-26'
@@ -37,7 +37,9 @@ Last Launch Week we introduced the idea of Community Day - a day where we shine
### Where?
Blog post coming soon. Follow our [Twitter](https://twitter.com/supabase) to get notified immediately.
Read the [blog post](https://supabase.com/blog/2021/11/29/community-day).
Tune in on [Twitter Spaces](https://twitter.com/i/spaces/1YqKDqYXQnLGV) at 7am PT!
## Tuesday: Dashboard Surprise
+109
View File
@@ -0,0 +1,109 @@
---
title: 'PostgREST 9'
description: New features and updates in PostgREST version 9.
author: steve_chavez
author_url: https://github.com/steve-chavez
author_image_url: https://github.com/steve-chavez.png
authorURL: https://github.com/steve-chavez
image: postgrest-9/whats-new-in-postgrest-9-og.png
thumb: postgrest-9/whats-new-in-postgrest-9-thumb.png
tags:
- launch-week
- release-notes
- tech
- community
date: '2021-11-27'
toc_depth: 2
---
PostgREST turns your PostgreSQL database automatically into a RESTful API. Today, PostgREST 9 was [released](https://postgrest.org/en/v9.0/releases/v9.0.0.html). Let's take a look at some of the new features.
## Resource embedding with Inner Joins
PostgREST 9 brings a [much-requested feature](https://github.com/supabase/postgrest-js/issues/197): the ability to do `inner joins` when embedding a table.
Here's an example with `supabase-js`:
```js hideCopy
const { data, error } = await supabase
.from('messages')
.select('*, users!inner(*)')
.eq('users.username', 'Jane')
```
With the new `!inner` keyword, you can now filter rows of the top-level table (`messages`) based on a filter (`eq`) of the embedded table (`users`).
This works across all Supabase client libraries and you can use it with any of the available operators (`gt`, `in`, etc.)
[Read more](https://postgrest.org/en/v9.0/releases/v9.0.0.html#resource-embedding-with-top-level-filtering).
## Functions with unnamed parameters
You can now make `POST` requests to functions with a single unnamed parameter. This is particularly useful for webhooks that send JSON payloads.
For example, imagine you were using Postmark as an email provider and you wanted to save email bounces using their [bounce webhook](https://postmarkapp.com/developer/webhooks/bounce-webhook).
Previously this wouldn't be possible with PostgREST, as every function required a named parameter.
As of PostgREST 9, this is possible.
Simply create a function inside your PostgreSQL database to receive the raw JSON:
```sql hideCopy
create function store_bounces(json)
returns json
language sql
as $$
insert into bounces (webhook_id, email)
values (
($1->>'ID')::bigint,
($1->>'Email')::text
);
select '{ "status": 200 }'::json;
$$;
```
And the webhook can send data directly to your database via an `rpc` call:
```bash hideCopy
POST https://<PROJECT_REF>.supabase.co/rest/v1/rpc/store_bounces HTTP/1.1
Content-Type: application/json
{
"RecordType": "Bounce",
"MessageStream": "outbound",
"ID": 4323372036854775807,
"Type": "HardBounce",
"MessageID": "883953f4-6105-42a2-a16a-77a8eac79483",
"Description": "The server was unable to deliver your message (ex: unknown user, mailbox not found).",
"Details": "Test bounce details",
"Email": "john@example.com",
"From": "sender@example.com",
"BouncedAt": "2019-11-05T16:33:54.9070259Z"
}
```
[Read more](https://postgrest.org/en/v9.0/api.html#s-proc-single-unnamed).
## PostgreSQL 14 compatibility
If you've ever done your own custom `auth` functions using PostgREST [HTTP Context](https://postgrest.org/en/v8.0/api.html#accessing-request-headers-cookies-and-jwt-claims),
note that a breaking change was necessary for PostgreSQL 14 Compatibility. You'll need to update them:
| `From` | `To` |
| --- | --- |
| `current_setting('request.jwt.claim.custom-claim', true)` | `current_setting('request.jwt.claims', true)::json->>'custom-claim'` |
| `current_setting('request.header.custom-header', true)` | `current_setting('request.headers', true)::json->>'custom-header'` |
If you only use Supabase default `auth` functions(`auth.email()`, `auth.uid()`, `auth.role()`), then no action is required because we have updated the functions to handle these changes transparently.
[Read more](https://postgrest.org/en/v9.0/releases/v9.0.0.html#postgresql-14-compatibility).
## Release notes
There are a lot more improvements released in PostgREST 9, including [support for Partitioned Tables](https://postgrest.org/en/v9.0/releases/v9.0.0.html#partitioned-tables),
[improved doc](https://postgrest.org/en/v9.0/releases/v9.0.0.html#documentation-improvements), and [bug fixes](https://postgrest.org/en/v9.0/releases/v9.0.0.html#bug-fixes).
You can see the full updates on the [PostgREST 9 release notes](https://postgrest.org/en/v9.0/releases/v9.0.0.html).
@@ -0,0 +1,166 @@
---
title: 'New in PostgreSQL 14: What every developer should know'
description: 'A quick look at some new features and functionality in PostgreSQL 14.'
author: gurjeet
author_url: https://github.com/gurjeet
author_image_url: https://github.com/gurjeet.png
authorURL: https://github.com/gurjeet
image: whats-new-in-postgres-14/whats-new-in-postgres-14-og.png
thumb: whats-new-in-postgres-14/whats-new-in-postgres-14-thumb.png
tags:
- tech
date: '2021-11-28'
toc_depth: 3
---
Every web developer knows the importance of choosing a suitable database for building modern apps.
Even though NoSQL, NewSQL, and other types of databases have received a great deal of buzz in the last few years,
relational database management systems (or RDBMS) are still relevant for several critical business use cases and will likely do so in the foreseeable future.
Among the many open-source relational databases available, [PostgreSQL](https://supabase.com/docs/guides/database/introduction) is a popular choice among developers.
It was named [DBMS of the year in 2020](https://db-engines.com/en/blog_post/85) by
DBEngines, and with every release of PostgreSQL new features are available making it easy for developers and administrators to run their apps.
This blog will highlight some key features of the newly available PostgreSQL 14, which every developer can benefit from. So, let's dive right in.
## Complex data type support
### JSON subscripting
PostgreSQL continues to add innovations for complex data types, making JSON data more accessible. In postgreSQL 14, developers can use subscripts to iterate through JSON key pairs and fetch corresponding values. For example, using this capability, nested JSON fields can be quickly traversed to retrieve values to reconstruct application objects.
```sql hideCopy
select (
'{ "PostgreSQL": { "release": 14 }}'::jsonb
)['PostgreSQL']['release'];
jsonb
-------
14
```
### Working with disjointed data ranges
In the real world, data ranges are pretty common. For example, if you have sensor readings going into a PostgreSQL database, you may want to define a range for
low, medium, and high metrics. Before version 14, you could set data ranges for integers, numerics, timestamps, and other data types.
However, these ranges had to be contiguous, and it required multiple insert records across the different ranges.
In PostgreSQL 14, a single insert statement can be used to map data across multiple noncontiguous ranges. Let's check it out with an example.
First, create an enum data type to capture low, medium, and high sensor reading levels.
```sql hideCopy
create type valid_levels as enum (
'low', 'medium', 'high'
);
```
To store sensor reading metric data, create a table consisting of the sensor description, the level and the range of timestamps when the sensor was at that level.
```sql hideCopy
create table sensor_range (
reading_id serial primary key,
metric_desc varchar(100),
metric_level valid_levels,
metric_ts tsmultirange
);
```
Now, insert some data into the table. Note that, the insert statement below provides two time ranges that are not contiguous.
```sql hideCopy
insert into sensor_range (
metric_desc,
metric_level,
metric_ts
)
values (
'Temperature',
'high',
'{[2021-11-01 6:00, 2021-11-01 10:00],[2021-11-05 14:00, 2021-11-05 20:00]}'
);
insert into sensor_range (
metric_desc,
metric_level,
metric_ts
)
values (
'Temperature',
'low',
'{[2021-11-01 10:00, 2021-11-01 12:00],[2021-11-05 21:00, 2021-11-05 22:00]}'
);
```
Query the data in the table to see the inserted data rows
```sql hideCopy
select *
from sensor_range;
```
``` hideCopy
| `reading_id` | `metric_desc` | `metric_level` | `metric_ts` |
|--------------|---------------|----------------|-----------------------------------------------------------------------------|
| 1 | Temperature | high | {[2021-11-01 6:00, 2021-11-01 10:00],[2021-11-05 14:00, 2021-11-05 20:00]} |
| 2 | Temperature | low | {[2021-11-01 10:00, 2021-11-01 12:00],[2021-11-05 21:00, 2021-11-05 22:00]} |
```
## Improved performance and monitoring
### Query pipelining
If you're a developer accessing PostgreSQL using a high-level programming language, the database driver you're using is likely based on a C library called libpq. For example, suppose your application performs several write operations within a short period, or your network has a higher latency. In that case, you may want to fire off several queries over the same network connection simultaneously, so you don't have to wait for a reply after each query. Under the hood, libpq can send multiple queries to PostgreSQL while maintaining a queue of queries that are waiting for results. This queue consumes additional memory on both the client and server. Developers can now take advantage of PostgreSQL 14's client-side query pipeline mode using clients built on top of the latest libpq library to accelerate app performance.
Aside from query pipelining, the latest PostgreSQL 14 release brings several other enhancements to query parallelism, including improved performance of parallel sequential scans, parallel query execution capabilities for Foreign Data Wrappers, and the ability to run parallel queries when refreshing materialized views. With this, your PostgreSQL server can now do more work for you at a lower cost.
### Monitoring and troubleshooting queries
Ask any database troubleshooting expert, and they will tell you that without a way to correlate data across different database components, investigating and monitoring query-related issues can quickly become a nightmare. When it comes to PostgreSQL, the SQL statement’s query_id can be used for this purpose, allowing database experts an easy way to identify workload patterns quickly, detect rogue run-away or slow queries, and common query-related issues. Before PostgreSQL 14, this information was only available using the pg_stat_statements [extension](https://supabase.com/docs/guides/database/extensions), which shows aggregate statistics about queries that have finished executing, but now this information is additionally available for live running queries with pg_stat_activity, in the EXPLAIN VERBOSE statement, and log files.
An example of using query_id IN EXPLAIN (VERBOSE) statement
Start by altering the system to enable the query_id
```sql hideCopy
alter system set compute_query_id = 'on';
```
Restart the PostgreSQL database for the alter system statement to take effect.
Run the following query that selects schema and table names from the catalog tables
```sql hideCopy
explain (verbose, costs off)
select schemaname, tablename
from pg_tables, pg_sleep(5)
where schemaname <> 'pg_catalog';
```
View the result of the EXPLAIN statement
![View the result of the EXPLAIN statement](/images/blog/whats-new-in-postgres-14/explain-statement.png)
Notice that the query identifier is in the output:<br />
`Query Identifier: 4856400161806292488`
## Enhanced security
Security remains top of mind for every organization, and PostgreSQL 14 brings some critical enhancements in this area.
Have you ever wanted to [manage database user access](https://supabase.com/docs/guides/auth/managing-user-data) so that only specific individuals have read-only access? For example, consider a situation where you would like to host some sample data online for a demo and not allow demo users to modify or delete data. With the latest PostgreSQL version 14, you can easily set that up using a single GRANT statement.
```sql hideCopy
grant pg_read_all_data to bobfries;
```
From an authentication perspective, if you're still managing passwords in the database without [third-party login providers](https://supabase.com/docs/guides/auth#third-party-logins),
you may want to read this. Since version 10, PostgreSQL supports several different hashing mechanisms such as MD5 and SCRAM-SHA-256 to store user passwords on disk.
However, to keep up with the [latest security weaknesses around MD5](https://en.wikipedia.org/wiki/MD5#Security) and meet regulatory compliance requirements,
PostgreSQL 14 has made SCRAM-SHA-256 the default password management mechanism. So, if you are using old PostgreSQL client software,
you may want to update it, to be able to connect to the newer versions of the database server.
## It's only the tip of the iceberg
Indeed, there's a lot more to explore in the latest PostgreSQL, and we've barely scratched the surface of what PostgreSQL 14 has to offer.
There's no better way to experience some of these features than by trying them out for yourself.
You can check out these new features within your Supabase project without having to perform a local installation.
Explore the [Supabase dashboard now](https://app.supabase.io) and get started with your new project.
+136
View File
@@ -0,0 +1,136 @@
---
title: 'Community Day'
description: Kicking off launch week by highlighting the communities around Supabase.
author: thor_schaeff
author_url: https://github.com/thorwebdev
author_image_url: https://github.com/thorwebdev.png
authorURL: https://github.com/thorwebdev
image: launch-week-three/community-day/supabase-oss.jpg
thumb: launch-week-three/community-day/supabase-oss.jpg
tags:
- launch-week
- community
date: '2021-11-29'
toc_depth: 2
---
Supabase combines existing open-source tools with our own open-source contributions to provide a delightful experience for developers. As part of this goal we hope to build a community of communities, bringing together developers from many different tools, as well as new developers looking to get involved with open source.
To kick off launch week we want to showcase some of the communities that make up the Supabase community, highlight some of their updates, and celebrate everyone who contributes their time to the Supabase mission.
So let's get cracking, we've got a lot to cover. 🚀
## Open Source Spotlight: Kong API Gateway
Supabase provides a whole bunch of features that are made up of a [collection of open-source tools](/docs/architecture). To orchestrate these different services and functionalities we use the [Kong API Gateway](https://github.com/Kong/kong).
As a user of our hosted offering you don't really need to know all this, but we love showcasing the amazing open-source tools that we work with, and so we've invited [Vik Gamov](https://twitter.com/gAmUssA) to give you a little intro to [Kong](https://github.com/Kong/kong):
<iframe
className="w-full"
width="700"
height="350"
src="https://www.youtube-nocookie.com/embed/6ptUrE4QRPQ"
frameBorder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
></iframe>
## PostgreSQL 14 updates
![Postgres-14](/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-og.png)
Every web developer knows the importance of choosing a suitable database for building modern apps.
Even though NoSQL, NewSQL, and other types of databases have received a great deal of buzz in the last few years,
relational database management systems (or RDBMS) are still relevant for several critical business use cases and will likely do so in the foreseeable future.
Among the many open-source relational databases available, [PostgreSQL](/docs/guides/database/introduction) is a popular choice among developers.
It was named [DBMS of the year in 2020](https://db-engines.com/en/blog_post/85) by
DBEngines, and with every release of PostgreSQL new features are available making it easy for developers and administrators to run their apps.
[Gurjeet](https://twitter.com/0xGurjeet), one of our Postgres engineers, has written up a [blogpost](/blog/2021/11/28/whats-new-in-postgres-14) with the most important updates the every dev should know.
## PostgREST 9 updates
![PostgREST-9](/images/blog/launch-week-three/community-day/postgrest-9-og.png)
We've had a lot of feedback on our Postgres APIs, and we've been hard at work with the [PostgREST team](https://github.com/orgs/PostgREST/people) to improve an already-incredible product.
Some new features include
- Inner Joins
- Functions with unnamed parameters
- PostgreSQL 14 compatibility
From tomorrow, every Supabase project will be on PostgREST 9 (including existing projects).
Read about some of the new features in PostgREST 9 [here](/blog/2021/11/28/postgrest-9).
## New community partner: GitGuardian
![gitguardian-supabase-partnership.jpeg](/images/blog/launch-week-three/community-day/gitguardian-supabase-partnership.jpeg)
[As you (hopefully) know](/docs/learn/auth-deep-dive/auth-deep-dive-jwts#jwts-in-supabase), keeping your service role key secret is a crucial part of securing your database. But we also know that it can be difficult to make sure it stays secret as your team grows and you don't accidentally leak it. To help you with this, [we've partnered with GitGuardian](https://blog.gitguardian.com/the-detector-of-the-month-november-2021/).
GitGuardian helps developers keep 250+ types of secrets out of source code. Their automated secrets detection and remediation solution secures every step of the development life cycle, helping you monitor your code for sensitive data. Read [their blog post](https://blog.gitguardian.com/the-detector-of-the-month-november-2021/) to learn more.
## Auth updates
![new-oauth-providers.jpg](/images/blog/launch-week-three/community-day/new-oauth-providers.jpg)
The beauty of building in the open is that the community can get involved in adding new OAuth providers, which is exactly what [@TheHarryET](https://twitter.com/TheHarryET) and [MonsterDeveloper](https://github.com/MonsterDeveloper) have been doing. Thanks to them you can now provide sign-in with [Slack](/docs/guides/auth/auth-slack) as well as [Spotify](/docs/guides/auth/auth-spotify) to your users, as well as use [MessageBird](/docs/guides/auth/auth-messagebird) for phone auth as an alternative to the existing [Twilio](/docs/guides/auth/auth-twilio) integration.
## SupaSquad updates
The [SupaSquad](/docs/handbook/supasquad) is an official Supabase advocate program where community members help build and manage the Supabase community.
Among many other awesome things, the SupaSquad has been absolutely on fire building [client libraries](/docs/reference/javascript/supabase-client) for all flavors of backends and environments.
![client-libs.jpg](/images/blog/launch-week-three/community-day/client-libs.jpg)
### Python client library updates
- New maintainers [`@Dreinon`](https://github.com/dreinon), [`@anand2312`](https://github.com/anand2312), and [`@leynier`](https://github.com/leynier). 💚
- `gotrue-py` rewritten and now at feature parity with `gotrue-js`.
- Postgrest-py now support synchronous operations as well instead of just synchronous operations in the past. Also at feature-parity with postgrest-js.
- Supabase-py is now Supabase (e.g. you do `pip3 install supabase` instead of `pip3 install supabase-py`).
- Storage is working for the py client library but it's yet to be extracted out as a standalone lib.
## New tutorials and integration guides
Our own [Jon Meyers](https://twitter.com/_dijonmusters) and the broader community have been busy creating awesome tutorials and integration guides to help everyone build even more amazing things with Supabase:
- Jon has added official guides for working with [Auth0](/docs/guides/integrations/auth0) and [Vercel](/docs/guides/integrations/vercel),
- [Jonny Summers-Muir](https://twitter.com/JSummersMuir) has been busy paving the way for [Prisma](/docs/guides/integrations/prisma), and
- [Aman Mittal](https://github.com/amandeepmittal) has hooked us up with a guide for [Draftbit](/docs/guides/integrations/draftbit)!
And below are some of the community one's we've come across recently. If you've created one yourself, please notify us by tagging us in a Tweet!
- [Supabase & Sveltekit - Build Twitter in 75 minutes](https://youtu.be/mPQyckogDYc)
- [Supabase Auth With Next.Js 12 Middleware](https://jitsu.com/blog/supabase-nextjs-middleware#what-were-going-to-build)
- [Vue 3 & Supabase | Workout Tracker App](https://www.youtube.com/watch?v=3tF0fGkd4ho)
- [Use Supabase Auth with Vue.js 3](https://vueschool.io/articles/vuejs-tutorials/use-supabase-auth-with-vue-js-3/)
- [Dynamic Jamstack with Stencil and Supabase](https://ionicframework.com/blog/dynamic-jamstack-with-stencil-and-supabase)
## Developer stories
Anytime we scroll through [madewithsupabase.com](https://www.madewithsupabase.com/) we're absolutely blown away by the awesome things y'all are building with Supabase.
So we reached out to some of our users, requesting a short video to learn more and we were overwhelmed with your gracious submissions. We've started a user stories playlist and we are so excited to see many more of these stories in the future. 💚
<iframe
className="w-full"
width="700"
height="350"
src="https://www.youtube-nocookie.com/embed/videoseries?list=PL5S4mPUpp4OuzQN-a_FY3OZQuYo4NmXvb"
frameBorder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
></iframe>
And with that, we officially declare Launch Week as open 🥳 Check back [here](/blog) every day this week to see what new things we are shipping. We can't wait to share them with you 🚀
## Want even more Supabase in your life?
![tiktok.png](/images/blog/launch-week-three/community-day/tiktok.png)
We've got some stellar swag drops and behind the scenes footage for you on our new [TikTok page](https://www.tiktok.com/@supabase.com). Make sure to follow us there as we'll be giving away some swag randomly to 10 peeps who follow us during launch week!
+7
View File
@@ -82,5 +82,12 @@
"position": "Engineering",
"username": "darora",
"author_image_url": "https://github.com/darora.png"
},
"gurjeet": {
"author": "Gurjeet Singh",
"author_url": "https://github.com/gurjeet",
"position": "Engineering",
"username": "gurjeet",
"author_image_url": "https://github.com/gurjeet.png"
}
}
+7
View File
@@ -119,6 +119,13 @@ function AuthPage() {
<img src={`${basePath}/images/product/auth/gitlab-icon.svg`} width={21} />
<img src={`${basePath}/images/product/auth/bitbucket-icon.svg`} width={21} />
<img src={`${basePath}/images/product/auth/twitter-icon.svg`} width={21} />
<img src={`${basePath}/images/product/auth/apple-icon.svg`} width={21} />
<img src={`${basePath}/images/product/auth/discord-icon.svg`} width={21} />
<img src={`${basePath}/images/product/auth/microsoft-icon.svg`} width={21} />
<img src={`${basePath}/images/product/auth/messagebird-icon.svg`} width={21} />
<img src={`${basePath}/images/product/auth/twilio-icon.svg`} width={21} />
<img src={`${basePath}/images/product/auth/twitch-icon.svg`} width={21} />
<img src={`${basePath}/images/product/auth/spotify-icon.svg`} width={21} />
</Space>
</p>
<Typography.Title level={4}>All the social providers</Typography.Title>
Binary file not shown.

After

Width:  |  Height:  |  Size: 800 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="842.32007"
viewBox="0 0 842.32007 1000.0001"
version="1.1"
height="1000.0001"
id="svg2"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="Apple_logo_black.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="705"
id="namedview6"
showgrid="false"
inkscape:zoom="0.1767767"
inkscape:cx="-621.03745"
inkscape:cy="964.94676"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<path
d="m 824.66636,779.30363 c -15.12299,34.93724 -33.02368,67.09674 -53.7638,96.66374 -28.27076,40.3074 -51.4182,68.2078 -69.25717,83.7012 -27.65347,25.4313 -57.2822,38.4556 -89.00964,39.1963 -22.77708,0 -50.24539,-6.4813 -82.21973,-19.629 -32.07926,-13.0861 -61.55985,-19.5673 -88.51583,-19.5673 -28.27075,0 -58.59083,6.4812 -91.02193,19.5673 -32.48053,13.1477 -58.64639,19.9994 -78.65196,20.6784 -30.42501,1.29623 -60.75123,-12.0985 -91.02193,-40.2457 -19.32039,-16.8514 -43.48632,-45.7394 -72.43607,-86.6641 C 77.707522,829.30207 52.171259,778.62464 32.165691,720.84861 10.740416,658.44309 0,598.01283 0,539.50845 0,472.49197 14.481044,414.69125 43.486336,366.25444 66.28194,327.34823 96.60818,296.6578 134.5638,274.1276 c 37.95566,-22.53016 78.96676,-34.01129 123.1321,-34.74585 24.16591,0 55.85633,7.47508 95.23784,22.166 39.27042,14.74029 64.48571,22.21538 75.54091,22.21538 8.26518,0 36.27668,-8.7405 83.7629,-26.16587 44.90607,-16.16001 82.80614,-22.85118 113.85458,-20.21546 84.13326,6.78992 147.34122,39.95559 189.37699,99.70686 -75.24463,45.59122 -112.46573,109.4473 -111.72502,191.36456 0.67899,63.8067 23.82643,116.90384 69.31888,159.06309 20.61664,19.56727 43.64066,34.69027 69.2571,45.4307 -5.55531,16.11062 -11.41933,31.54225 -17.65372,46.35662 z M 631.70926,20.0057 c 0,50.01141 -18.27108,96.70693 -54.6897,139.92782 -43.94932,51.38118 -97.10817,81.07162 -154.75459,76.38659 -0.73454,-5.99983 -1.16045,-12.31444 -1.16045,-18.95003 0,-48.01091 20.9006,-99.39207 58.01678,-141.40314 C 497.65157,54.696 521.21876,37.0095 549.79815,22.90064 578.3158,9.00229 605.2903,1.31621 630.65988,0 c 0.74076,6.68575 1.04938,13.37191 1.04938,20.00505 z"
id="path4"
inkscape:connector-curvature="0"
style="stroke-width:0.84231985;fill:#b3b3b3;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

@@ -0,0 +1,10 @@
<svg width="71" height="55" viewBox="0 0 71 55" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M60.1045 4.8978C55.5792 2.8214 50.7265 1.2916 45.6527 0.41542C45.5603 0.39851 45.468 0.440769 45.4204 0.525289C44.7963 1.6353 44.105 3.0834 43.6209 4.2216C38.1637 3.4046 32.7345 3.4046 27.3892 4.2216C26.905 3.0581 26.1886 1.6353 25.5617 0.525289C25.5141 0.443589 25.4218 0.40133 25.3294 0.41542C20.2584 1.2888 15.4057 2.8186 10.8776 4.8978C10.8384 4.9147 10.8048 4.9429 10.7825 4.9795C1.57795 18.7309 -0.943561 32.1443 0.293408 45.3914C0.299005 45.4562 0.335386 45.5182 0.385761 45.5576C6.45866 50.0174 12.3413 52.7249 18.1147 54.5195C18.2071 54.5477 18.305 54.5139 18.3638 54.4378C19.7295 52.5728 20.9469 50.6063 21.9907 48.5383C22.0523 48.4172 21.9935 48.2735 21.8676 48.2256C19.9366 47.4931 18.0979 46.6 16.3292 45.5858C16.1893 45.5041 16.1781 45.304 16.3068 45.2082C16.679 44.9293 17.0513 44.6391 17.4067 44.3461C17.471 44.2926 17.5606 44.2813 17.6362 44.3151C29.2558 49.6202 41.8354 49.6202 53.3179 44.3151C53.3935 44.2785 53.4831 44.2898 53.5502 44.3433C53.9057 44.6363 54.2779 44.9293 54.6529 45.2082C54.7816 45.304 54.7732 45.5041 54.6333 45.5858C52.8646 46.6197 51.0259 47.4931 49.0921 48.2228C48.9662 48.2707 48.9102 48.4172 48.9718 48.5383C50.038 50.6034 51.2554 52.5699 52.5959 54.435C52.6519 54.5139 52.7526 54.5477 52.845 54.5195C58.6464 52.7249 64.529 50.0174 70.6019 45.5576C70.6551 45.5182 70.6887 45.459 70.6943 45.3942C72.1747 30.0791 68.2147 16.7757 60.1968 4.9823C60.1772 4.9429 60.1437 4.9147 60.1045 4.8978ZM23.7259 37.3253C20.2276 37.3253 17.3451 34.1136 17.3451 30.1693C17.3451 26.225 20.1717 23.0133 23.7259 23.0133C27.308 23.0133 30.1626 26.2532 30.1066 30.1693C30.1066 34.1136 27.28 37.3253 23.7259 37.3253ZM47.3178 37.3253C43.8196 37.3253 40.9371 34.1136 40.9371 30.1693C40.9371 26.225 43.7636 23.0133 47.3178 23.0133C50.9 23.0133 53.7545 26.2532 53.6986 30.1693C53.6986 34.1136 50.9 37.3253 47.3178 37.3253Z" fill="#5865F2"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="71" height="55" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path d="M57.425 14.726c-2.568 0-4.863 1.284-6.264 3.23l-9.454 13.228a1.9 1.9 0 0 1-1.556.817 1.91 1.91 0 0 1-1.906-1.906c0-.39.117-.778.31-1.05L46.53 17.1c.817-1.206 1.284-2.684 1.284-4.28 0-4.24-3.424-7.664-7.664-7.664H0v7.664h34.393c0 2.1-1.712 3.852-3.852 3.852H0c0 2.723.584 5.33 1.595 7.664H26.69c0 2.1-1.712 3.852-3.852 3.852H3.852a19.12 19.12 0 0 0 15.368 7.664h9.454a1.91 1.91 0 0 1 1.906 1.906 1.91 1.91 0 0 1-1.906 1.906H19.18l-12.84 19.18h23.227c10.62 0 19.647-6.925 22.8-16.496l4.32-13.11c1.4-4.24 3.968-7.976 7.314-10.816-1.323-2.218-3.774-3.696-6.575-3.696zm0 5.252c-.778 0-1.44-.66-1.44-1.44s.66-1.44 1.44-1.44 1.44.66 1.44 1.44c0 .817-.66 1.44-1.44 1.44z" fill="#2481d7"/></svg>

After

Width:  |  Height:  |  Size: 758 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 23 23"><path fill="#f3f3f3" d="M0 0h23v23H0z"/><path fill="#f35325" d="M1 1h10v10H1z"/><path fill="#81bc06" d="M12 1h10v10H12z"/><path fill="#05a6f0" d="M1 12h10v10H1z"/><path fill="#ffba08" d="M12 12h10v10H12z"/></svg>

After

Width:  |  Height:  |  Size: 272 B

@@ -0,0 +1 @@
<svg enable-background="new 0 0 2447.6 2452.5" viewBox="0 0 2447.6 2452.5" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m897.4 0c-135.3.1-244.8 109.9-244.7 245.2-.1 135.3 109.5 245.1 244.8 245.2h244.8v-245.1c.1-135.3-109.5-245.1-244.9-245.3.1 0 .1 0 0 0m0 654h-652.6c-135.3.1-244.9 109.9-244.8 245.2-.2 135.3 109.4 245.1 244.7 245.3h652.7c135.3-.1 244.9-109.9 244.8-245.2.1-135.4-109.5-245.2-244.8-245.3z" fill="#36c5f0"/><path d="m2447.6 899.2c.1-135.3-109.5-245.1-244.8-245.2-135.3.1-244.9 109.9-244.8 245.2v245.3h244.8c135.3-.1 244.9-109.9 244.8-245.3zm-652.7 0v-654c.1-135.2-109.4-245-244.7-245.2-135.3.1-244.9 109.9-244.8 245.2v654c-.2 135.3 109.4 245.1 244.7 245.3 135.3-.1 244.9-109.9 244.8-245.3z" fill="#2eb67d"/><path d="m1550.1 2452.5c135.3-.1 244.9-109.9 244.8-245.2.1-135.3-109.5-245.1-244.8-245.2h-244.8v245.2c-.1 135.2 109.5 245 244.8 245.2zm0-654.1h652.7c135.3-.1 244.9-109.9 244.8-245.2.2-135.3-109.4-245.1-244.7-245.3h-652.7c-135.3.1-244.9 109.9-244.8 245.2-.1 135.4 109.4 245.2 244.7 245.3z" fill="#ecb22e"/><path d="m0 1553.2c-.1 135.3 109.5 245.1 244.8 245.2 135.3-.1 244.9-109.9 244.8-245.2v-245.2h-244.8c-135.3.1-244.9 109.9-244.8 245.2zm652.7 0v654c-.2 135.3 109.4 245.1 244.7 245.3 135.3-.1 244.9-109.9 244.8-245.2v-653.9c.2-135.3-109.4-245.1-244.7-245.3-135.4 0-244.9 109.8-244.8 245.1 0 0 0 .1 0 0" fill="#e01e5a"/></g></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1333.33 1333.3" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd"><path d="M666.66 0C298.48 0 0 298.47 0 666.65c0 368.19 298.48 666.65 666.66 666.65 368.22 0 666.67-298.45 666.67-666.65C1333.33 298.49 1034.88.03 666.65.03l.01-.04zm305.73 961.51c-11.94 19.58-37.57 25.8-57.16 13.77-156.52-95.61-353.57-117.26-585.63-64.24-22.36 5.09-44.65-8.92-49.75-31.29-5.12-22.37 8.84-44.66 31.26-49.75 253.95-58.02 471.78-33.04 647.51 74.35 19.59 12.02 25.8 37.57 13.77 57.16zm81.6-181.52c-15.05 24.45-47.05 32.17-71.49 17.13-179.2-110.15-452.35-142.05-664.31-77.7-27.49 8.3-56.52-7.19-64.86-34.63-8.28-27.49 7.22-56.46 34.66-64.82 242.11-73.46 543.1-37.88 748.89 88.58 24.44 15.05 32.16 47.05 17.12 71.46V780zm7.01-189.02c-214.87-127.62-569.36-139.35-774.5-77.09-32.94 9.99-67.78-8.6-77.76-41.55-9.98-32.96 8.6-67.77 41.56-77.78 235.49-71.49 626.96-57.68 874.34 89.18 29.69 17.59 39.41 55.85 21.81 85.44-17.52 29.63-55.89 39.4-85.42 21.8h-.03z" fill="#1ed760" fill-rule="nonzero"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1 @@
<svg fill="#F22F46" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30"><path d="M15 0C6.7 0 0 6.7 0 15s6.7 15 15 15 15-6.7 15-15S23.3 0 15 0zm0 26C8.9 26 4 21.1 4 15S8.9 4 15 4s11 4.9 11 11-4.9 11-11 11zm6.8-14.7c0 1.7-1.4 3.1-3.1 3.1s-3.1-1.4-3.1-3.1 1.4-3.1 3.1-3.1 3.1 1.4 3.1 3.1zm0 7.4c0 1.7-1.4 3.1-3.1 3.1s-3.1-1.4-3.1-3.1c0-1.7 1.4-3.1 3.1-3.1s3.1 1.4 3.1 3.1zm-7.4 0c0 1.7-1.4 3.1-3.1 3.1s-3.1-1.4-3.1-3.1c0-1.7 1.4-3.1 3.1-3.1s3.1 1.4 3.1 3.1zm0-7.4c0 1.7-1.4 3.1-3.1 3.1S8.2 13 8.2 11.3s1.4-3.1 3.1-3.1 3.1 1.4 3.1 3.1z"/></svg>

After

Width:  |  Height:  |  Size: 544 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path d="M5.7 0L1.4 10.985V55.88h15.284V64h8.597l8.12-8.12h12.418l16.716-16.716V0H5.7zm51.104 36.3L47.25 45.85H31.967l-8.12 8.12v-8.12H10.952V5.73h45.85V36.3zM47.25 16.716v16.716h-5.73V16.716h5.73zm-15.284 0v16.716h-5.73V16.716h5.73z" fill="#6441a4" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 340 B

+27 -3
View File
@@ -5,12 +5,36 @@
<link>https://supabase.com</link>
<description>Latest news from Supabase</description>
<language>en</language>
<lastBuildDate>Thu, 25 Nov 2021 16:00:00 GMT</lastBuildDate>
<lastBuildDate>Sun, 28 Nov 2021 16:00:00 GMT</lastBuildDate>
<atom:link href="https://supabase.com/blog/rss.xml" rel="self" type="application/rss+xml"/>
<item>
<guid>https://supabase.com/blog/2021/11/29/community-day</guid>
<title>Community Day</title>
<link>https://supabase.com/blog/2021/11/29/community-day</link>
<description>Kicking off launch week by highlighting the communities around Supabase.</description>
<pubDate>Sun, 28 Nov 2021 16:00:00 GMT</pubDate>
</item>
<item>
<guid>https://supabase.com/blog/2021/11/28/whats-new-in-postgres-14</guid>
<title>New in PostgreSQL 14: What every developer should know</title>
<link>https://supabase.com/blog/2021/11/28/whats-new-in-postgres-14</link>
<description>A quick look at some new features and functionality in PostgreSQL 14.</description>
<pubDate>Sat, 27 Nov 2021 16:00:00 GMT</pubDate>
</item>
<item>
<guid>https://supabase.com/blog/2021/11/28/postgrest-9</guid>
<title>PostgREST 9</title>
<link>https://supabase.com/blog/2021/11/28/postgrest-9</link>
<description>New features and updates in PostgREST version 9.</description>
<pubDate>Fri, 26 Nov 2021 16:00:00 GMT</pubDate>
</item>
<item>
<guid>https://supabase.com/blog/2021/11/26/supabase-launch-week-the-trilogy</guid>
<title>Supabase Launch Week III: Holiday Special.</title>
<title>Supabase Launch Week III: Holiday Special</title>
<link>https://supabase.com/blog/2021/11/26/supabase-launch-week-the-trilogy</link>
<description>Tis the season to be shipping.</description>
<pubDate>Thu, 25 Nov 2021 16:00:00 GMT</pubDate>
@@ -18,7 +42,7 @@
<item>
<guid>https://supabase.com/blog/2021/11/26/supabase-how-we-launch</guid>
<title>How we launch at Supabase.</title>
<title>How we launch at Supabase</title>
<link>https://supabase.com/blog/2021/11/26/supabase-how-we-launch</link>
<description>The history and methodology of Supabase Launch Week.</description>
<pubDate>Thu, 25 Nov 2021 16:00:00 GMT</pubDate>