diff --git a/apps/www/_blog/2023-02-03-openai-embeddings-postgres-vector.mdx b/apps/www/_blog/2023-02-03-openai-embeddings-postgres-vector.mdx index 7e3d5c209c7..7184cd66f41 100644 --- a/apps/www/_blog/2023-02-03-openai-embeddings-postgres-vector.mdx +++ b/apps/www/_blog/2023-02-03-openai-embeddings-postgres-vector.mdx @@ -378,11 +378,13 @@ The OpenAI API supports [completion streaming](https://platform.openai.com/docs/ Storing embeddings in Postgres opens a world of possibilities. You can combine your search function with telemetry functions, add an user-provided feedback (thumbs up/down), and make your search feel more integrated with your products. -The [pgvector extension](https://supabase.com/docs/guides/ai/vector-columns) is available on all new Supabase projects today. If you want to try it out, launch a new Postgres database today: [database.new](https://database.new) +The [pgvector extension](https://supabase.com/docs/guides/ai/vector-columns) is available on all new Supabase projects today. To try it out, launch a new Postgres database: [database.new](https://database.new) -## More pgvector and ChatGPT resources +## More pgvector and AI resources - [Supabase Clippy: ChatGPT for Supabase Docs](https://supabase.com/blog/chatgpt-supabase-docs) -- [A ChatGPT Plugins Template built with Supabase Edge Runtime](https://supabase.com/blog/building-chatgpt-plugins-template) -- [Template for building your own custom ChatGPT style doc search](https://github.com/supabase-community/nextjs-openai-doc-search) -- [Supabase + LangChain Starter Template](https://blog.langchain.dev/langchain-x-supabase/) +- [Hugging Face is now supported in Supabase](https://supabase.com/blog/hugging-face-supabase) +- [How to build ChatGPT Plugin from scratch with Supabase Edge Runtime](https://supabase.com/blog/building-chatgpt-plugins-template) +- [Docs pgvector: Embeddings and vector similarity](https://supabase.com/docs/guides/database/extensions/pgvector) +- [Choosing Compute Add-on for AI workloads](https://supabase.com/docs/guides/ai/choosing-compute-addon) +- [pgvector v0.5.0: Faster semantic search with HNSW indexes](https://supabase.com/blog/increase-performance-pgvector-hnsw) diff --git a/apps/www/_blog/2023-02-07-chatgpt-supabase-docs.mdx b/apps/www/_blog/2023-02-07-chatgpt-supabase-docs.mdx index 2a7a46d93fb..fe8f61cf7df 100644 --- a/apps/www/_blog/2023-02-07-chatgpt-supabase-docs.mdx +++ b/apps/www/_blog/2023-02-07-chatgpt-supabase-docs.mdx @@ -123,7 +123,7 @@ Want to try Supabase Clippy? It's a hidden feature while in MVP - visit [supabas ## More pgvector and ChatGPT resources -- [pgvector docs]([https://supabase.com/blog/chatgpt-supabase-docs](https://supabase.com/docs/guides/getting-started/openai/vector-search) +- [AI docs](https://supabase.com/docs/guides/ai) - [A ChatGPT Plugins Template built with Supabase Edge Runtime](https://supabase.com/blog/building-chatgpt-plugins-template) - [Template for building your own custom ChatGPT style doc search](https://github.com/supabase-community/nextjs-openai-doc-search) - [Supabase + LangChain Starter Template](https://blog.langchain.dev/langchain-x-supabase/) diff --git a/apps/www/_blog/2023-05-15-building-chatgpt-plugins-template.mdx b/apps/www/_blog/2023-05-15-building-chatgpt-plugins-template.mdx index e9281978c45..b9f1fde47f1 100644 --- a/apps/www/_blog/2023-05-15-building-chatgpt-plugins-template.mdx +++ b/apps/www/_blog/2023-05-15-building-chatgpt-plugins-template.mdx @@ -274,8 +274,7 @@ In a next step you can add authentication to your plugin, let us know on [Twitte ## More AI resources +- [Hugging Face is now supported in Supabase](https://supabase.com/blog/hugging-face-supabase) +- [pgvector v0.5.0: Faster semantic search with HNSW indexes](https://supabase.com/blog/pgvector-v0-5-0-hnsw) - [OpenAI ChatGPT Plugin docs](https://platform.openai.com/docs/plugins/introduction) -- [Advanced plugin template](https://github.com/openai/chatgpt-retrieval-plugin) -- Learn to build your own ChatGPT-style docs search with [Deno Fresh](https://deno.com/blog/build-chatgpt-doc-search-with-supabase-fresh) or [Next.js](https://vercel.com/templates/next.js/nextjs-openai-doc-search-starter) -- [How we builtChatGPT for the Supabase Docs](https://supabase.com/blog/chatgpt-supabase-docs). - [Docs pgvector: Embeddings and vector similarity](https://supabase.com/docs/guides/database/extensions/pgvector) diff --git a/apps/www/_blog/2023-07-13-pgvector-performance.mdx b/apps/www/_blog/2023-07-13-pgvector-performance.mdx index ed40d524fa9..4a2df4293a0 100644 --- a/apps/www/_blog/2023-07-13-pgvector-performance.mdx +++ b/apps/www/_blog/2023-07-13-pgvector-performance.mdx @@ -1,6 +1,6 @@ --- title: 'pgvector 0.4.0 performance' -description: There's been lot of talk about pgvector performance lately, so we took some datasets and pushed pgvector to the limits to find out its strengths and limitations. +description: There's been a lot of talk about pgvector performance lately, so we took some datasets and pushed pgvector to the limits to find out its strengths and limitations. categories: - engineering tags: @@ -15,6 +15,13 @@ image: 2023-07-13-pgvector-performance/vector-benchmarks-og.jpeg thumb: 2023-07-13-pgvector-performance/vector-benchmarks-thumb.jpeg --- +
+ +🚀 The incorporation of the HNSW index in pgvector v0.5.0 ensures lightning-fast vector searches. We tested it, benchmarked it, and shared everything. +[Read the new post](https://supabase.com/blog/increase-performance-pgvector-hnsw) + +
+ There are a few pgvector benchmarks floating around the internet, most recently a [pgvector vs Qdrant](https://nirantk.com/writing/pgvector-vs-qdrant/) comparison by NirantK. We wanted to reproduce (or improve!) the results. There is an obvious bias here: we're a Postgres company. It's not our goal to prove that pgvector is better than Qdrant for running vector workloads. From everything we hear about Qdrant, it's fantastic. @@ -23,7 +30,7 @@ Our goals in this article are: 1. To show the strengths and limitations of the _current version_ of pgvector. 2. Highlight some improvements that are coming to pgvector. -3. Prove to you that it's completely viable for production workloads and give you some tips on using it at scale. We'll show you how to run 1 million Open AI embeddings at ~1800 requests per second with 91% precision, or 670 requests per second with 98% precision. +3. Prove to you that it's completely viable for production workloads and give you some tips on using it at scale. We'll show you how to run 1 million Open AI embeddings at ~1800 queries per second with 91% accuracy, or 670 queries per second with 98% accuracy. ## Benchmark Methodology @@ -32,7 +39,7 @@ We've used the [ANN Benchmarks](https://github.com/erikbern/ann-benchmarks) meth The key elements are: - **Helper scripts:** a Python test runner which is responsible for data upload, index creation, and query execution. This uses [qdrant's vector-db-benchmark](https://github.com/qdrant/vector-db-benchmark) repo. The “engine” in this repo uses [Vecs](https://github.com/supabase/vecs), a Python client for pgvector. -- **Runtime:** Each test runs for at least 30-40 minutes and included a series of experiments executed at various concurrency levels. This process allowed us to gauge the engine's performance under different load types. Subsequently, we averaged the results. +- **Runtime:** Each test runs for at least 30-40 minutes and includes a series of experiments executed at various concurrency levels. This process allowed us to gauge the engine's performance under different load types. Subsequently, we averaged the results. - **Pre-warming RAM:** We executed 10,000 to 50,000 “warm-up” queries before each benchmark, matching the number of probes as the benchmark. Additionally, we executed about 1,000 queries with probes ranging from three to ten times the benchmark's probes. Both of these help with RAM utilization.
@@ -87,7 +94,7 @@ Let's start with NirantK's results as a baseline: />
-They aren't very flattering! Repeating our statements above, these benchmarks are using the defaults for both engines. Our goal now is to replicate the results, and then see what improvements need to be made as developers scale up their workload. +They aren't very flattering! Repeating our statements above, these benchmarks use the defaults for both engines. Our goal now is to replicate the results, and then see what improvements need to be made as developers scale up their workload. ## Results @@ -111,8 +118,8 @@ The resulting figures were significantly different after these changes. With the changes above and probes set to 10, pgvector was faster and more accurate: -- precision@10 of 0.91 -- RPS (requests per second) of 380 +- accuracy@10 of 0.91 +- QPS (queries per second) of 380
@@ -170,13 +177,13 @@ The Qdrant benchmark uses “default” configuration and is in not indicative o />
-Although more compute is required to match Qdrant's precision and RPS levels concurrently, this is still a satisfying outcome. It means that it's not a _necessity_ to use another vector database. You can put everything in Postgres to lower your operational complexity. +Although more compute is required to match Qdrant's accuracy and QPS levels concurrently, this is still a satisfying outcome. It means that it's not a _necessity_ to use another vector database. You can put everything in Postgres to lower your operational complexity. ### Final results: pgvector performance Putting it all together, we find that we can predictably scale our database to match the performance we need. -With a 64-core, 256 GB server we achieve ~1800 RPS and 0.91 precision. This is for pgvector 0.4.0, and we've heard that the latest version (0.4.4) already has significant improvements. We'll release those benchmarks as soon as we have them. +With a 64-core, 256 GB server we achieve ~1800 QPS and 0.91 accuracy. This is for pgvector 0.4.0, and we've heard that the latest version (0.4.4) already has significant improvements. We'll release those benchmarks as soon as we have them.
-Dot product is the product of each vector element pair summed together into a single result. Fewer dimensions in the vector means fewer calculations for every computed distance . +Dot product is the product of each vector element pair summed together into a single result. Fewer dimensions in the vector means fewer calculations for every computed distance. -We compared the performance of `text-embedding-ada-002` from OpenAI (1536 dimensions) with open-source `all-MiniLM-L6-v2` (384 dimensions) by measuring requests per second at a constant precision and configuration: +We compared the performance of `text-embedding-ada-002` from OpenAI (1536 dimensions) with open-source `all-MiniLM-L6-v2` (384 dimensions) by measuring queries per second at a constant accuracy and configuration: - **Database size:** with 2vCPU (ARM) and 8GB RAM - `large` add-on for Supabase project. - **Version:** Postgres v15 and pgvector v0.4.0 @@ -95,7 +95,7 @@ We compared the performance of `text-embedding-ada-002` from OpenAI (1536 dimens - **Index:** The index was generated for `inner-product` (dot product) distance function with `lists=1000`. - **Process:** We followed [our optimization guide and tips](https://supabase.com/docs/guides/ai/going-to-prod#performance-tips-when-using-indexes). -We observed pgvector with `all-MiniLM-L6-v2` outperforming `text-embedding-ada-002` by 78% when holding the precision@10 constant at 0.99. This gap increases as you lower the precision. Postgres was using just 4GB of RAM with 384d vectors generated by `all-MiniLM-L6-v2` compared to 7.5GB with `text-embedding-ada-002`. +We observed pgvector with `all-MiniLM-L6-v2` outperforming `text-embedding-ada-002` by 78% when holding the accuracy@10 constant at 0.99. This gap increases as you lower the accuracy. Postgres was using just 4GB of RAM with 384d vectors generated by `all-MiniLM-L6-v2` compared to 7.5GB with `text-embedding-ada-002`.
-After that, we decided to try the recently published [gte-small](https://huggingface.co/thenlper/gte-small) (also 384 dimensions), and the results were even more astonishing. With `gte-small`, we could set `probes=10` to achieve the same level of `precision@10 = 0.99`. Consequently, we observed more than a 200% improvement in requests per second for pgvector with embeddings generated by `gte-small` compared to `all-MiniLM-L6-v2`. +After that, we decided to try the recently published [gte-small](https://huggingface.co/thenlper/gte-small) (also 384 dimensions), and the results were even more astonishing. With `gte-small`, we could set `probes=10` to achieve the same level of `accuracy@10 = 0.99`. Consequently, we observed more than a 200% improvement in queries per second for pgvector with embeddings generated by `gte-small` compared to `all-MiniLM-L6-v2`.
+ +💡 If you have an existing database that was created before this release, please reach out to [support](https://supabase.com/dashboard/support/new) and we'll assist you in an upgrade to pgvector v0.5.0. + + + +## How does HNSW work? + +Compared to inverted file (IVF) indexes which use [clusters](https://supabase.com/docs/guides/ai/managing-indexes#ivfflat-indexes) to approximate nearest-neighbor search, HNSW uses proximity graphs (graphs connecting nodes based on distance between them). To understand HNSW, we can break it down into 2 parts: + +- **Hierarchical (H):** The algorithm operates over multiple layers +- **Navigable Small World (NSW):** Each vector is a node within a graph and is connected to several other nodes + +### Hierarchical + +The hierarchical aspect of HNSW builds off of the idea of skip lists. + +Skip lists are multi-layer linked lists. The bottom layer is a regular linked list connecting an ordered sequence of elements. Each new layer above removes some elements from the underlying layer (based on a fixed probability), producing a sparser subsequence that “skips” over elements. + +
+ visual of an example skip list (light) + visual of an example skip list (dark) +
+ +When searching for an element, the algorithm begins at the top layer and traverses its linked list horizontally. If the target element is found, the algorithm stops and returns it. Otherwise if the next element in the list is greater than the target (or NIL), the algorithm drops down to the next layer below. Since each layer below is less sparse than the layer above (with the bottom layer connecting all elements), the target will eventually be found. Skip lists offer O(log n) average complexity for both search and insertion/deletion. + +### Navigable Small World + +A navigable small world (NSW) is a special type of proximity graph that also includes long-range connections between nodes. These long-range connections support the “small world” property of the graph, meaning almost every node can be reached from any other node within a few hops. Without these additional long-range connections, many hops would be required to reach a far-away node. + +visual of an example navigable small world graph + +The “navigable” part of NSW specifically refers to the ability to logarithmically scale the greedy search algorithm on the graph, an algorithm that attempts to make only the locally optimal choice at each hop. Without this property, the graph may still be considered a small world with short paths between far-away nodes, but the greedy algorithm tends to miss them. Greedy search is ideal for NSW because it is quick to navigate and has low computational costs. + +### **Hierarchical +** Navigable Small World + +HNSW combines these two concepts. From the hierarchical perspective, the bottom layer consists of a NSW made up of short links between nodes. Each layer above “skips” elements and creates longer links between nodes further away from each other. + +Just like skip lists, search starts at the top layer and works its way down until it finds the target element. However instead of comparing a scalar value at each layer to determine whether or not to descend to the layer below, a multi-dimensional distance measure (such as Euclidean distance) is used. + +## HNSW performance: 1536 dimensions + +To understand the performance improvements that HNSW offers, we decided to expand upon our previous benchmarks and include results for the HNSW index in addition to IVF and compare the queries per second (QPS) for both. + +### wikipedia-en-embeddings + +In the first test, we used [224,482 vectors by OpenAI](https://huggingface.co/datasets/Supabase/wikipedia-en-embeddings) (1536 dimensions). You can find our previous benchmark with additional information on how vector dimensions may affect performance in [pgvector: Fewer dimensions are better](https://supabase.com/blog/pgvector-performance). + +In this test, we used a Supabase project with a large compute add-on (2-core CPU and 8GB RAM) and built the HNSW index with the following parameters: + +- `m`: 32 +- `ef_construction`: 64 + +
+ wikipedia embeddings comparing ivfflat and hnsw queries-per-second (light) + wikipedia embeddings comparing ivfflat and hnsw queries-per-second (dark) +
+ +HNSW has 3 times better performance than IVFFlat and with better accuracy. + +### dbpedia-entities-openai-1M + +Next, we took the setup from our benchmarks with [1,000,000 vectors by OpenAI](https://huggingface.co/datasets/KShivendu/dbpedia-entities-openai-1M) (1536 dimensions). If you want to find out more about pgvector 0.4.0 IVFFlat performance and our load testing methodology, check out [pgvector 0.4.0 performance](https://supabase.com/blog/pgvector-performance) blogpost. + +Here we used the Supabase project with a 2XL compute add-on (8-core CPU and 32GB RAM) and built the HNSW index with the same parameters: + +- `m`: 24 +- `ef_construction`: 56 + +
+ dbpedia embeddings comparing ivfflat and hnsw queries-per-second (light) + dbpedia embeddings comparing ivfflat and hnsw queries-per-second (dark) +
+ +When we maintain fixed HNSW build parameters, we can adjust the select query parameter `ef_search` to balance query speed and accuracy. To achieve accuracy@10 of 0.98, we increased it from the default 40 to 100. For accuracy@10 of 0.99, we further raised it to 250. Remarkably, HNSW demonstrated over six times better performance while maintaining the same level of accuracy. With higher accuracy@10 of 0.99 HNSW even outperforms [qdrant](https://nirantk.com/writing/pgvector-vs-qdrant/) on equivalent compute resources. + +
+ dbpedia embeddings comparing qdrant and hnsw queries-per-second (light) + dbpedia embeddings comparing qdrant and hnsw queries-per-second (dark) +
+ +### Scaling the database + +Performance scales predictably with the size of the database for the HNSW index, just as [it does for the IVFFlat index](https://supabase.com/blog/pgvector-performance#scaling-the-database). The difference in performance between IVFFlat and HNSW remains consistent after a compute upgrade. + +
+ dbpedia embeddings comparing ivfflat and hnsw queries-per-second using the 4XL compute addon (light) + dbpedia embeddings comparing ivfflat and hnsw queries-per-second using the 4XL compute addon (dark) +
+ +Switching to a 4XL compute add-on (with a 16-core CPU and 64GB of RAM) resulted in a 69% increase in QPS for an accuracy@10 of 0.99 compared to the 2XL instance. + +
+ dbpedia embeddings comparing hnsw queries-per-second using the 2XL vs 4XL compute addon (light) + dbpedia embeddings comparing hnsw queries-per-second using the 2XL vs 4XL compute addon (dark) +
+ +Furthermore, having 64GB of RAM is better suited for this dataset because Postgres uses approximately 30-35GB of RAM to achieve optimal performance. With a 4XL setup, you not only have the capacity to store 1,000,000 vectors but also the flexibility to accommodate additional data or increase the number of vectors as needed. + +### HNSW build parameters + +We conducted a small experiment to assess the impact of HNSW index parameters on accuracy and QPS. In this experiment, we utilized the same 4XL instance as in the previous test but modified the building parameters: + +- `m`: 32 +- `ef_construction`: 80 + +This adjustment enabled us to achieve the same level of accuracy@10 of 0.99 with an `ef_search` = 100 instead of the previous 250, resulting in a 35% increase in QPS. + +
+ dbpedia embeddings comparing hnsw queries-per-second using different build parameters (light) + dbpedia embeddings comparing hnsw queries-per-second using different build parameters (dark) +
+ +## Other HNSW features + +In addition to the above query performance improvements, HNSW offers another advantage: you don't need to fully fill your table before building the index. + +With IVFFlat indexes, the clusters (lists) are constructed based on the distribution of existing data in the table. This means that IVF indexes built on an empty table would produce completely suboptimal centers. This is why pgvector recommends building IVF indexes only once sufficient data exists in the table and rebuilding them any time the distribution of data changes significantly. + +HNSW indexes use graphs which inherently are not affected by this limitation, so you are safe to create your HNSW index immediately after the table is created. As new data is added to the table, the index will be filled automatically and the index structure will remain optimal. + +## Improvements to IVF indexes + +IVFFlat indexes also saw some improvements in v0.5.0. Index build times are now significantly faster for large datasets thanks to 2 new improvements: + +- Parallelization during the assignment build step (assigning records to lists) +- Switching from [double to float](https://github.com/pgvector/pgvector/pull/180) accuracy for select distance calculations which unlocks the [fused multiply-add](https://en.wikipedia.org/wiki/Multiply%E2%80%93accumulate_operation#Fused_multiply%E2%80%93add) instruction on CPUs + +Below we compare the index build times between v0.4.0 and v0.5.0 for the inner product distance measure over 1,000,000 vectors on a Supabase project with 4XL compute add-on (with a 16-core CPU and 64GB of RAM). + +- `lists = 1000` + +
+ dbpedia embeddings comparing ivfflat index build time between v0.4.0 and v0.5.0 using 1000 lists (light) + dbpedia embeddings comparing ivfflat index build time between v0.4.0 and v0.5.0 using 1000 lists (dark) +
+ +- `lists = 5000` + +
+ dbpedia embeddings comparing ivfflat index build time between v0.4.0 and v0.5.0 using 5000 lists (light) + dbpedia embeddings comparing ivfflat index build time between v0.4.0 and v0.5.0 using 5000 lists (dark) +
+ +The index build time has decreased by over 50%, and this ratio remains consistent when you adjust the index build parameters ([specifically, the `lists` value](https://supabase.com/blog/pgvector-performance#other-performance-factors)). + +## When should you use HNSW vs IVF? + +In most cases today, HNSW offers a more performant and robust index over IVFFlat. It's worth noting though that HNSW indexes will almost always be slower to build and use more memory than IVFFlat, so if your system is memory-constrained and you don't foresee the need to rebuild your index often, you may find IVFFlat to be more suitable. It's also worth noting that product quantization (compressing index entries for vectors) is expected for IVF in the next versions of pgvector which should significantly improve performance and lower resource requirements. Regardless of the type of index you use, we still recommend [reducing the number of dimensions](https://supabase.com/blog/fewer-dimensions-are-better-pgvector) in your embeddings when possible. + +## Start using HNSW + +All [new Supabase databases](https://database.new/) will automatically ship with pgvector v0.5.0 which includes the new HNSW indexes. If you have an existing database, please reach out to [support](https://supabase.com/dashboard/support/new) and we'll be more than happy to assist you with an upgrade. + +## More pgvector and AI resources + +- [How to build ChatGPT Plugin from scratch with Supabase Edge Runtime](https://supabase.com/blog/building-chatgpt-plugins-template) +- [Docs pgvector: Embeddings and vector similarity](https://supabase.com/docs/guides/database/extensions/pgvector) +- [Choosing Compute Add-on for AI workloads](https://supabase.com/docs/guides/ai/choosing-compute-addon) +- [pgvector: Fewer dimensions are better](https://supabase.com/blog/fewer-dimensions-are-better-pgvector) diff --git a/apps/www/components/Sections/GithubExamples.tsx b/apps/www/components/Sections/GithubExamples.tsx index 85e3cb4e279..ff3a5027626 100644 --- a/apps/www/components/Sections/GithubExamples.tsx +++ b/apps/www/components/Sections/GithubExamples.tsx @@ -57,6 +57,7 @@ function GithubExamples() {
}, - Img: ({ zoomable = true, ...props }: any) => ( -
+ Img: ({ zoomable = true, className, ...props }: any) => ( +
https://supabase.com/blog Latest Postgres news from Angelico de los Reyes at Supabase en - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT https://supabase.com/blog/postgres-point-in-time-recovery Point in Time Recovery is now available for Pro projects https://supabase.com/blog/postgres-point-in-time-recovery We're making PITR available for more projects, with a new Dashboard UI that makes it simple to use. - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT 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 21:00:00 GMT + Sun, 02 Aug 2020 06:00:00 GMT 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 21:00:00 GMT + Thu, 09 Jul 2020 06:00:00 GMT 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 21:00:00 GMT + Tue, 07 Jul 2020 06:00:00 GMT diff --git a/apps/www/public/planetpg-ant_wilson-rss.xml b/apps/www/public/planetpg-ant_wilson-rss.xml index c05190295d9..105fcaf8be4 100644 --- a/apps/www/public/planetpg-ant_wilson-rss.xml +++ b/apps/www/public/planetpg-ant_wilson-rss.xml @@ -5,14 +5,14 @@ https://supabase.com/blog Latest Postgres news from Ant Wilson at Supabase en - Fri, 26 Feb 2021 22:00:00 GMT + Sat, 27 Feb 2021 07:00:00 GMT 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 22:00:00 GMT + Sat, 27 Feb 2021 07:00:00 GMT diff --git a/apps/www/public/planetpg-bo_lu-rss.xml b/apps/www/public/planetpg-bo_lu-rss.xml index 09cc2b44362..b22a9199c32 100644 --- a/apps/www/public/planetpg-bo_lu-rss.xml +++ b/apps/www/public/planetpg-bo_lu-rss.xml @@ -5,14 +5,14 @@ https://supabase.com/blog Latest Postgres news from Bo Lu at Supabase en - Wed, 14 Dec 2022 22:00:00 GMT + Wed, 14 Dec 2022 07:00:00 GMT https://supabase.com/blog/postgres-foreign-data-wrappers-rust Supabase Wrappers, a Postgres FDW framework written in Rust https://supabase.com/blog/postgres-foreign-data-wrappers-rust A framework for building Postgres Foreign Data Wrappers which connects to Stripe, Firebase, Clickhouse, and more. - Wed, 14 Dec 2022 22:00:00 GMT + Wed, 14 Dec 2022 07:00:00 GMT diff --git a/apps/www/public/planetpg-burggraf-rss.xml b/apps/www/public/planetpg-burggraf-rss.xml index 6523813f1d8..708068d21b1 100644 --- a/apps/www/public/planetpg-burggraf-rss.xml +++ b/apps/www/public/planetpg-burggraf-rss.xml @@ -5,21 +5,21 @@ https://supabase.com/blog Latest Postgres news from Mark Burggraf at Supabase en - Wed, 23 Nov 2022 22:00:00 GMT + Wed, 23 Nov 2022 07:00:00 GMT 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 22:00:00 GMT + Wed, 23 Nov 2022 07:00:00 GMT 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 21:00:00 GMT + Sun, 02 Oct 2022 06:00:00 GMT diff --git a/apps/www/public/planetpg-egor_romanov-rss.xml b/apps/www/public/planetpg-egor_romanov-rss.xml index 5e55ea51cb3..9b27f34d600 100644 --- a/apps/www/public/planetpg-egor_romanov-rss.xml +++ b/apps/www/public/planetpg-egor_romanov-rss.xml @@ -5,21 +5,21 @@ https://supabase.com/blog Latest Postgres news from Egor Romanov at Supabase en - Wed, 02 Aug 2023 21:00:00 GMT + Wed, 02 Aug 2023 06:00:00 GMT https://supabase.com/blog/fewer-dimensions-are-better-pgvector pgvector: Fewer dimensions are better https://supabase.com/blog/fewer-dimensions-are-better-pgvector Increase performance in pgvector by using embedding vectors with fewer dimensions - Wed, 02 Aug 2023 21:00:00 GMT + Wed, 02 Aug 2023 06:00:00 GMT https://supabase.com/blog/pgvector-performance pgvector 0.4.0 performance https://supabase.com/blog/pgvector-performance There's been lot of talk about pgvector performance lately, so we took some datasets and pushed pgvector to the limits to find out its strengths and limitations. - Wed, 12 Jul 2023 21:00:00 GMT + Wed, 12 Jul 2023 06:00:00 GMT diff --git a/apps/www/public/planetpg-gregnr-rss.xml b/apps/www/public/planetpg-gregnr-rss.xml index 0351c1ef398..a36f90d143b 100644 --- a/apps/www/public/planetpg-gregnr-rss.xml +++ b/apps/www/public/planetpg-gregnr-rss.xml @@ -5,21 +5,28 @@ https://supabase.com/blog Latest Postgres news from Greg Richardson at Supabase en - Wed, 02 Aug 2023 21:00:00 GMT + Tue, 05 Sep 2023 06:00:00 GMT + https://supabase.com/blog/increase-performance-pgvector-hnsw + pgvector v0.5.0: Faster semantic search with HNSW indexes + https://supabase.com/blog/increase-performance-pgvector-hnsw + Increase performance in pgvector using HNSW indexes + Tue, 05 Sep 2023 06:00:00 GMT + + https://supabase.com/blog/fewer-dimensions-are-better-pgvector pgvector: Fewer dimensions are better https://supabase.com/blog/fewer-dimensions-are-better-pgvector Increase performance in pgvector by using embedding vectors with fewer dimensions - Wed, 02 Aug 2023 21:00:00 GMT + Wed, 02 Aug 2023 06:00:00 GMT https://supabase.com/blog/openai-embeddings-postgres-vector Storing OpenAI embeddings in Postgres with pgvector https://supabase.com/blog/openai-embeddings-postgres-vector An example of how to build an AI-powered search engine using OpenAI's embeddings and PostgreSQL. - Sun, 05 Feb 2023 22:00:00 GMT + Sun, 05 Feb 2023 07:00:00 GMT diff --git a/apps/www/public/planetpg-michel-rss.xml b/apps/www/public/planetpg-michel-rss.xml index c0cb6b29758..fe11b656656 100644 --- a/apps/www/public/planetpg-michel-rss.xml +++ b/apps/www/public/planetpg-michel-rss.xml @@ -5,21 +5,21 @@ https://supabase.com/blog Latest Postgres news from Michel Pelletier at Supabase en - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT https://supabase.com/blog/vault-now-in-beta Supabase Vault is now in Beta https://supabase.com/blog/vault-now-in-beta A Postgres extension to store encrypted secrets and encrypt data. - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT 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 22:00:00 GMT + Wed, 30 Nov 2022 07:00:00 GMT diff --git a/apps/www/public/planetpg-oli_rice-rss.xml b/apps/www/public/planetpg-oli_rice-rss.xml index 2f5b5adc7cb..5343de4d441 100644 --- a/apps/www/public/planetpg-oli_rice-rss.xml +++ b/apps/www/public/planetpg-oli_rice-rss.xml @@ -5,56 +5,56 @@ https://supabase.com/blog Latest Postgres news from Oliver Rice at Supabase en - Wed, 02 Aug 2023 21:00:00 GMT + Wed, 02 Aug 2023 06:00:00 GMT https://supabase.com/blog/fewer-dimensions-are-better-pgvector pgvector: Fewer dimensions are better https://supabase.com/blog/fewer-dimensions-are-better-pgvector Increase performance in pgvector by using embedding vectors with fewer dimensions - Wed, 02 Aug 2023 21:00:00 GMT + Wed, 02 Aug 2023 06:00:00 GMT https://supabase.com/blog/whats-new-in-pg-graphql-v1-2 What's New in pg_graphql v1.2 https://supabase.com/blog/whats-new-in-pg-graphql-v1-2 New Features in the v1.2 release of pg_graphql - Thu, 20 Apr 2023 21:00:00 GMT + Thu, 20 Apr 2023 06:00:00 GMT https://supabase.com/blog/type-constraints-in-65-lines-of-sql Type Constraints in 65 lines of SQL https://supabase.com/blog/type-constraints-in-65-lines-of-sql Creating validated data types in Postgres - Thu, 16 Feb 2023 22:00:00 GMT + Thu, 16 Feb 2023 07:00:00 GMT https://supabase.com/blog/pg-graphql-v1 pg_graphql v1.0 https://supabase.com/blog/pg-graphql-v1 Announcing the v1.0 release of pg_graphql - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT https://supabase.com/blog/postgres-foreign-data-wrappers-rust Supabase Wrappers, a Postgres FDW framework written in Rust https://supabase.com/blog/postgres-foreign-data-wrappers-rust A framework for building Postgres Foreign Data Wrappers which connects to Stripe, Firebase, Clickhouse, and more. - Wed, 14 Dec 2022 22:00:00 GMT + Wed, 14 Dec 2022 07:00:00 GMT 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 21:00:00 GMT + Thu, 18 Aug 2022 06:00:00 GMT https://supabase.com/blog/postgres-audit Postgres Auditing in 150 lines of SQL https://supabase.com/blog/postgres-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 22:00:00 GMT + Mon, 07 Mar 2022 07:00:00 GMT diff --git a/apps/www/public/planetpg-paul_copplestone-rss.xml b/apps/www/public/planetpg-paul_copplestone-rss.xml index c7dee6ce7e4..9ece0cb1076 100644 --- a/apps/www/public/planetpg-paul_copplestone-rss.xml +++ b/apps/www/public/planetpg-paul_copplestone-rss.xml @@ -5,49 +5,49 @@ https://supabase.com/blog Latest Postgres news from Paul Copplestone at Supabase en - Sun, 30 Apr 2023 21:00:00 GMT + Sun, 30 Apr 2023 06:00:00 GMT https://supabase.com/blog/postgres-pluggable-strorage Next steps for Postgres pluggable storage https://supabase.com/blog/postgres-pluggable-strorage Exploring history of Postgres pluggable storage and the possibility of landing it in the Postgres core. - Sun, 30 Apr 2023 21:00:00 GMT + Sun, 30 Apr 2023 06:00:00 GMT https://supabase.com/blog/postgres-foreign-data-wrappers-rust Supabase Wrappers, a Postgres FDW framework written in Rust https://supabase.com/blog/postgres-foreign-data-wrappers-rust A framework for building Postgres Foreign Data Wrappers which connects to Stripe, Firebase, Clickhouse, and more. - Wed, 14 Dec 2022 22:00:00 GMT + Wed, 14 Dec 2022 07:00:00 GMT https://supabase.com/blog/postgres-crdt 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 22:00:00 GMT + Fri, 09 Dec 2022 07:00:00 GMT 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 21:00:00 GMT + Mon, 27 Jun 2022 06:00:00 GMT 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 22:00:00 GMT + Fri, 05 Mar 2021 07:00:00 GMT 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 22:00:00 GMT + Wed, 18 Nov 2020 07:00:00 GMT diff --git a/apps/www/public/planetpg-pavel-rss.xml b/apps/www/public/planetpg-pavel-rss.xml index 8b3b258debf..059b1deb9ca 100644 --- a/apps/www/public/planetpg-pavel-rss.xml +++ b/apps/www/public/planetpg-pavel-rss.xml @@ -5,28 +5,28 @@ https://supabase.com/blog Latest Postgres news from Pavel Borisov at Supabase en - Wed, 12 Jul 2023 21:00:00 GMT + Wed, 12 Jul 2023 06:00:00 GMT https://supabase.com/blog/pgvector-performance pgvector 0.4.0 performance https://supabase.com/blog/pgvector-performance There's been lot of talk about pgvector performance lately, so we took some datasets and pushed pgvector to the limits to find out its strengths and limitations. - Wed, 12 Jul 2023 21:00:00 GMT + Wed, 12 Jul 2023 06:00:00 GMT https://supabase.com/blog/new-in-postgres-15 What's new in Postgres 15? https://supabase.com/blog/new-in-postgres-15 Describes the release of Postgres 15, new features and reasons to use it - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT 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 21:00:00 GMT + Wed, 26 Oct 2022 06:00:00 GMT diff --git a/apps/www/public/planetpg-steve_chavez-rss.xml b/apps/www/public/planetpg-steve_chavez-rss.xml index 1341da51bee..9f886f93bdd 100644 --- a/apps/www/public/planetpg-steve_chavez-rss.xml +++ b/apps/www/public/planetpg-steve_chavez-rss.xml @@ -5,21 +5,21 @@ https://supabase.com/blog Latest Postgres news from Steve Chavez at Supabase en - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT https://supabase.com/blog/postgrest-11-prerelease PostgREST 11 pre-release https://supabase.com/blog/postgrest-11-prerelease Describes new features of PostgREST 11 pre-release - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT 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 21:00:00 GMT + Thu, 01 Jul 2021 06:00:00 GMT diff --git a/apps/www/public/planetpg-victor-rss.xml b/apps/www/public/planetpg-victor-rss.xml index fa447ad16e0..3339ab1aed9 100644 --- a/apps/www/public/planetpg-victor-rss.xml +++ b/apps/www/public/planetpg-victor-rss.xml @@ -5,28 +5,28 @@ https://supabase.com/blog Latest Postgres news from Victor at Supabase en - Thu, 13 Oct 2022 21:00:00 GMT + Thu, 13 Oct 2022 06:00:00 GMT 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 21:00:00 GMT + Thu, 13 Oct 2022 06:00:00 GMT 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 21:00:00 GMT + Wed, 07 Sep 2022 06:00:00 GMT 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 21:00:00 GMT + Sun, 17 Jul 2022 06:00:00 GMT diff --git a/apps/www/public/rss.xml b/apps/www/public/rss.xml index ee53242abf9..32b4e7bec05 100644 --- a/apps/www/public/rss.xml +++ b/apps/www/public/rss.xml @@ -5,1435 +5,1456 @@ https://supabase.com Latest news from Supabase en - Thu, 10 Aug 2023 21:00:00 GMT + Tue, 05 Sep 2023 06:00:00 GMT + https://supabase.com/blog/increase-performance-pgvector-hnsw + pgvector v0.5.0: Faster semantic search with HNSW indexes + https://supabase.com/blog/increase-performance-pgvector-hnsw + Increase performance in pgvector using HNSW indexes + Tue, 05 Sep 2023 06:00:00 GMT + + + https://supabase.com/blog/organization-based-billing + Organization-based Billing, Project Transfers, Team plan + https://supabase.com/blog/organization-based-billing + Introducing the new Organization-based Billing + Wed, 30 Aug 2023 06:00:00 GMT + + + https://supabase.com/blog/launch-week-8-hackathon-winners + Launch Week 8 Hackathon Winners + https://supabase.com/blog/launch-week-8-hackathon-winners + Announcing the winners of the Launch Week 8 Hackathon! + Wed, 23 Aug 2023 06:00:00 GMT + + https://supabase.com/blog/supavisor-1-million Supavisor: Scaling Postgres to 1 Million Connections https://supabase.com/blog/supavisor-1-million Supavisor is a scalable, cloud-native Postgres connection pooler. We connected a million clients to it to see how it performs. - Thu, 10 Aug 2023 21:00:00 GMT + Thu, 10 Aug 2023 06:00:00 GMT https://supabase.com/blog/supabase-soc2-hipaa Supabase is now HIPAA and SOC2 Type 2 compliant https://supabase.com/blog/supabase-soc2-hipaa This documents our journey from SOC2 Type 1 to SOC2 Type2 and HIPAA compliance. You can start building healthcare apps on Supabase today. - Thu, 10 Aug 2023 21:00:00 GMT + Thu, 10 Aug 2023 06:00:00 GMT https://supabase.com/blog/launch-week-8-community-highlights Launch Week 8 Community Highlights https://supabase.com/blog/launch-week-8-community-highlights Highlights from the community for the past 4 months. - Thu, 10 Aug 2023 21:00:00 GMT + Thu, 10 Aug 2023 06:00:00 GMT https://supabase.com/blog/supabase-integrations-marketplace Supabase Integrations Marketplace https://supabase.com/blog/supabase-integrations-marketplace Become a Supabase Integrations Partner: Publish OAuth Apps and Build with Supabase. - Wed, 09 Aug 2023 21:00:00 GMT + Wed, 09 Aug 2023 06:00:00 GMT https://supabase.com/blog/using-supabase-with-vercel Vercel Integration and Next.js App Router Support https://supabase.com/blog/using-supabase-with-vercel Using Supabase with Vercel and Next.js is now a lot easier. - Wed, 09 Aug 2023 21:00:00 GMT + Wed, 09 Aug 2023 06:00:00 GMT https://supabase.com/blog/supabase-studio-3-0 Supabase Studio 3.0: AI SQL Editor, Schema Diagrams, and new Wrappers https://supabase.com/blog/supabase-studio-3-0 Supabase Studio now comes with an AI assisted SQL Editor, schema diagrams, and much more. - Tue, 08 Aug 2023 21:00:00 GMT + Tue, 08 Aug 2023 06:00:00 GMT https://supabase.com/blog/supabase-local-dev Supabase Local Dev: migrations, branching, and observability https://supabase.com/blog/supabase-local-dev New features to streamline the interaction between CLI, code editors, and remote databases. - Mon, 07 Aug 2023 21:00:00 GMT + Mon, 07 Aug 2023 06:00:00 GMT https://supabase.com/blog/hugging-face-supabase Hugging Face is now supported in Supabase https://supabase.com/blog/hugging-face-supabase We've added support Hugging Face support in our Python Vector Client and Edge Functions. - Sun, 06 Aug 2023 21:00:00 GMT + Sun, 06 Aug 2023 06:00:00 GMT https://supabase.com/blog/why-supabase-remote Why we'll stay remote https://supabase.com/blog/why-supabase-remote Offices are making a comeback, just not at Supabase. - Fri, 04 Aug 2023 21:00:00 GMT + Fri, 04 Aug 2023 06:00:00 GMT https://supabase.com/blog/interactive-constellation-threejs-react-three-fiber Coding the stars - an interactive constellation with Three.js and React Three Fiber https://supabase.com/blog/interactive-constellation-threejs-react-three-fiber How we built a constellation of stars with Three.js and React Three Fiber. - Thu, 03 Aug 2023 21:00:00 GMT + Thu, 03 Aug 2023 06:00:00 GMT https://supabase.com/blog/fewer-dimensions-are-better-pgvector pgvector: Fewer dimensions are better https://supabase.com/blog/fewer-dimensions-are-better-pgvector Increase performance in pgvector by using embedding vectors with fewer dimensions - Wed, 02 Aug 2023 21:00:00 GMT + Wed, 02 Aug 2023 06:00:00 GMT https://supabase.com/blog/beta-update-july-2023 Supabase Beta July 2023 https://supabase.com/blog/beta-update-july-2023 Launch Week 8 is coming - but we still shipped some goodies during July - Tue, 01 Aug 2023 21:00:00 GMT + Tue, 01 Aug 2023 06:00:00 GMT https://supabase.com/blog/react-native-storage React Native file upload with Supabase Storage https://supabase.com/blog/react-native-storage Learn how to implement authentication and file upload in a React Native app. - Mon, 31 Jul 2023 21:00:00 GMT + Mon, 31 Jul 2023 06:00:00 GMT https://supabase.com/blog/supabase-lw8-hackathon Supabase Launch Week 8 Hackathon https://supabase.com/blog/supabase-lw8-hackathon Build an Open Source Project over 10 days. 5 prize categories. - Mon, 24 Jul 2023 21:00:00 GMT + Mon, 24 Jul 2023 06:00:00 GMT https://supabase.com/blog/flutter-authentication Getting started with Flutter authentication https://supabase.com/blog/flutter-authentication Learn how authentication on Flutter works through Google sign in with Supabase auth. - Mon, 17 Jul 2023 21:00:00 GMT + Mon, 17 Jul 2023 06:00:00 GMT https://supabase.com/blog/pgvector-performance pgvector 0.4.0 performance https://supabase.com/blog/pgvector-performance There's been lot of talk about pgvector performance lately, so we took some datasets and pushed pgvector to the limits to find out its strengths and limitations. - Wed, 12 Jul 2023 21:00:00 GMT + Wed, 12 Jul 2023 06:00:00 GMT https://supabase.com/blog/postgrest-11-1-release What is new in PostgREST v11.1? https://supabase.com/blog/postgrest-11-1-release Impersonated Role Settings, Configurable Isolation Level, improved Bulk Insert, and more - Tue, 11 Jul 2023 21:00:00 GMT + Tue, 11 Jul 2023 06:00:00 GMT https://supabase.com/blog/supabase-beta-update-june-2023 Supabase Beta June 2023 https://supabase.com/blog/supabase-beta-update-june-2023 A plethora of announcements... read till the end to find out when is the new Launch Week - Wed, 05 Jul 2023 21:00:00 GMT + Wed, 05 Jul 2023 06:00:00 GMT https://supabase.com/blog/native-mobile-auth Native Mobile Auth Support for Google and Apple Sign in https://supabase.com/blog/native-mobile-auth Supabase auth adds full support for native mobile sign in with Apple and Google. - Mon, 26 Jun 2023 21:00:00 GMT + Mon, 26 Jun 2023 06:00:00 GMT https://supabase.com/blog/supabase-beta-update-may-2023 Supabase Beta May 2023 https://supabase.com/blog/supabase-beta-update-may-2023 Learn about the great things we shipped last month. Spoiler alert... lots of AI. - Thu, 08 Jun 2023 21:00:00 GMT + Thu, 08 Jun 2023 06:00:00 GMT https://supabase.com/blog/vecs Supabase Vecs: a vector client for Postgres https://supabase.com/blog/vecs Introducing Supabase Vecs, a PostgreSQL vector client - Sun, 28 May 2023 21:00:00 GMT + Sun, 28 May 2023 06:00:00 GMT https://supabase.com/blog/flutter-hackathon-winners Flutter Hackathon Winners https://supabase.com/blog/flutter-hackathon-winners Announcing the winners of the Flutter Hackathon! - Sun, 28 May 2023 21:00:00 GMT + Sun, 28 May 2023 06:00:00 GMT https://supabase.com/blog/chatgpt-plugins-support-postgres ChatGPT plugins now support Postgres & Supabase https://supabase.com/blog/chatgpt-plugins-support-postgres Supabase recently contributed to the OpenAI Retrieval Plugin repo with a Postgres and a Supabase implementation to help developers build ChatGPT plugins using pgvector. - Wed, 24 May 2023 21:00:00 GMT + Wed, 24 May 2023 06:00:00 GMT https://supabase.com/blog/building-chatgpt-plugins-template Building ChatGPT Plugins with Supabase Edge Runtime https://supabase.com/blog/building-chatgpt-plugins-template We're releasing a ChatGPT plugin template written in TypeScript and running on Deno! - Sun, 14 May 2023 21:00:00 GMT + Sun, 14 May 2023 06:00:00 GMT https://supabase.com/blog/flutter-hackathon Flutter Hackathon https://supabase.com/blog/flutter-hackathon Build Flutter apps and win limited edition swag. - Thu, 11 May 2023 21:00:00 GMT + Thu, 11 May 2023 06:00:00 GMT https://supabase.com/blog/supabase-beta-update-april-2023 Supabase Beta April 2023 https://supabase.com/blog/supabase-beta-update-april-2023 A review of Launch Week 7 and more exciting updates from last month. - Mon, 08 May 2023 21:00:00 GMT + Mon, 08 May 2023 06:00:00 GMT https://supabase.com/blog/flutter-multi-factor-authentication Securing your Flutter apps with Multi-Factor Authentication https://supabase.com/blog/flutter-multi-factor-authentication Build a Flutter app where the user is required to authenticate using Multi-Factor Authentication. - Wed, 03 May 2023 21:00:00 GMT + Wed, 03 May 2023 06:00:00 GMT https://supabase.com/blog/postgres-pluggable-strorage Next steps for Postgres pluggable storage https://supabase.com/blog/postgres-pluggable-strorage Exploring history of Postgres pluggable storage and the possibility of landing it in the Postgres core. - Sun, 30 Apr 2023 21:00:00 GMT + Sun, 30 Apr 2023 06:00:00 GMT https://supabase.com/blog/launch-week-7-hackathon-winners Launch Week 7 Hackathon Winners https://supabase.com/blog/launch-week-7-hackathon-winners Announcing the winners of the Launch Week 7 Hackathon! - Sun, 23 Apr 2023 21:00:00 GMT + Sun, 23 Apr 2023 06:00:00 GMT https://supabase.com/blog/whats-new-in-pg-graphql-v1-2 What's New in pg_graphql v1.2 https://supabase.com/blog/whats-new-in-pg-graphql-v1-2 New Features in the v1.2 release of pg_graphql - Thu, 20 Apr 2023 21:00:00 GMT + Thu, 20 Apr 2023 06:00:00 GMT https://supabase.com/blog/supabase-studio-2.0 Supabase Studio 2.0: help when you need it most https://supabase.com/blog/supabase-studio-2.0 Supabase Studio now comes with ChatGPT, and GraphiQL built in, Cascade Deletes, and Foreign Key Selectors, and much more. - Thu, 13 Apr 2023 21:00:00 GMT + Thu, 13 Apr 2023 06:00:00 GMT https://supabase.com/blog/dbdev dbdev: PostgreSQL Package Manager https://supabase.com/blog/dbdev We're publicly previewing dbdev, a PostgreSQL package manager. - Thu, 13 Apr 2023 21:00:00 GMT + Thu, 13 Apr 2023 06:00:00 GMT https://supabase.com/blog/pg-tle Trusted Language Extensions for Postgres https://supabase.com/blog/pg-tle We're collaborating with AWS to bring Trusted Language Extensions to Postgres. - Thu, 13 Apr 2023 21:00:00 GMT + Thu, 13 Apr 2023 06:00:00 GMT https://supabase.com/blog/launch-week-7-community-highlights Launch Week 7 Community Highlights https://supabase.com/blog/launch-week-7-community-highlights We're honored to work with, sponsor, and support incredible people and tools. Here is a highlight of the last 3 months. - Thu, 13 Apr 2023 21:00:00 GMT + Thu, 13 Apr 2023 06:00:00 GMT https://supabase.com/blog/supabase-auth-sso-pkce Supabase Auth: SSO, Mobile, and Server-side support https://supabase.com/blog/supabase-auth-sso-pkce Supacharging Supabase Auth with Sign in with Apple on iOS, Single-Sign-On support with SAML 2.0, and PKCE for server-side rendering and mobile auth. - Wed, 12 Apr 2023 21:00:00 GMT + Wed, 12 Apr 2023 06:00:00 GMT https://supabase.com/blog/storage-v3-resumable-uploads Supabase Storage v3: Resumable Uploads with support for 50GB files https://supabase.com/blog/storage-v3-resumable-uploads Storage V3 with lots of new features including resumable uploads, more image transformationsm a Next.js image loader and more. - Tue, 11 Apr 2023 21:00:00 GMT + Tue, 11 Apr 2023 06:00:00 GMT https://supabase.com/blog/edge-runtime-self-hosted-deno-functions Supabase Edge Runtime: Self-hosted Deno Functions https://supabase.com/blog/edge-runtime-self-hosted-deno-functions We are open-sourcing Supabase Edge Runtime allowing you to host your Edge Functions anywhere. - Mon, 10 Apr 2023 21:00:00 GMT + Mon, 10 Apr 2023 06:00:00 GMT https://supabase.com/blog/supabase-logs-self-hosted Supabase Logs: open source logging server https://supabase.com/blog/supabase-logs-self-hosted We're releasing Supabase Logs for both self-hosted users and CLI development. - Sun, 09 Apr 2023 21:00:00 GMT + Sun, 09 Apr 2023 06:00:00 GMT https://supabase.com/blog/supabase-beta-update-march-2023 Supabase Beta March 2023 https://supabase.com/blog/supabase-beta-update-march-2023 We are in full shipping mode 🛥️… Launch Week 7 can’t come quickly enough! - Fri, 07 Apr 2023 21:00:00 GMT + Fri, 07 Apr 2023 06:00:00 GMT https://supabase.com/blog/launch-week-7-hackathon The Supabase AI Hackathon https://supabase.com/blog/launch-week-7-hackathon Build an Open Source Project over 10 days. 5 prize categories. - Thu, 06 Apr 2023 21:00:00 GMT + Thu, 06 Apr 2023 06:00:00 GMT https://supabase.com/blog/designing-with-ai-midjourney Designing with AI: Generating unique artwork for every user https://supabase.com/blog/designing-with-ai-midjourney Using MidJourney to generative artwork and serving ticket images with Edge Functions - Thu, 06 Apr 2023 21:00:00 GMT + Thu, 06 Apr 2023 06:00:00 GMT https://supabase.com/blog/infinite-scroll-with-nextjs-framer-motion Infinite scroll with Next.js, Framer Motion, and Supabase https://supabase.com/blog/infinite-scroll-with-nextjs-framer-motion Lazy load and paginate data on scroll with Next.js and a sprinkle of Framer Motion magic ✨ - Mon, 03 Apr 2023 21:00:00 GMT + Mon, 03 Apr 2023 06:00:00 GMT https://supabase.com/blog/supaclub SupaClub https://supabase.com/blog/supaclub The Worlds First Software Engineering Nightclub. - Fri, 31 Mar 2023 21:00:00 GMT + Fri, 31 Mar 2023 06:00:00 GMT https://supabase.com/blog/supabase-beta-update-february-2023 Supabase Beta February 2023 https://supabase.com/blog/supabase-beta-update-february-2023 There is something for everybody this month - AI, Auth, Database, Edge Functions, GraphQL … you name it! - Wed, 08 Mar 2023 22:00:00 GMT + Wed, 08 Mar 2023 07:00:00 GMT https://supabase.com/blog/geo-queries-with-postgis-in-ionic-angular Geo Queries with PostGIS in Ionic Angular https://supabase.com/blog/geo-queries-with-postgis-in-ionic-angular Using the PostGIS extension to build a cross-platform application with Ionic Angular. - Tue, 28 Feb 2023 22:00:00 GMT + Tue, 28 Feb 2023 07:00:00 GMT https://supabase.com/blog/type-constraints-in-65-lines-of-sql Type Constraints in 65 lines of SQL https://supabase.com/blog/type-constraints-in-65-lines-of-sql Creating validated data types in Postgres - Thu, 16 Feb 2023 22:00:00 GMT + Thu, 16 Feb 2023 07:00:00 GMT https://supabase.com/blog/case-study-happyteams HappyTeams unlocks better performance and reduces cost with Supabase https://supabase.com/blog/case-study-happyteams How a bootstrapped startup migrated from Heroku to Supabase in 30 minutes and never looked back - Wed, 15 Feb 2023 22:00:00 GMT + Wed, 15 Feb 2023 07:00:00 GMT https://supabase.com/blog/flutter-real-time-multiplayer-game How to build a real-time multiplayer game with Flutter Flame https://supabase.com/blog/flutter-real-time-multiplayer-game Build a real-time multiplayer game using Flutter, Flame, and Supabase realtime. - Mon, 13 Feb 2023 22:00:00 GMT + Mon, 13 Feb 2023 07:00:00 GMT https://supabase.com/blog/supabase-beta-january-2023 Supabase Beta January 2023 https://supabase.com/blog/supabase-beta-january-2023 New Postgres extensions, pg_graphql updates, changes to Edge Functions, and more! - Tue, 07 Feb 2023 22:00:00 GMT + Tue, 07 Feb 2023 07:00:00 GMT https://supabase.com/blog/chatgpt-supabase-docs Supabase Clippy: ChatGPT for Supabase Docs https://supabase.com/blog/chatgpt-supabase-docs Creating a ChatGPT interface for the Supabase documentation. - Mon, 06 Feb 2023 22:00:00 GMT + Mon, 06 Feb 2023 07:00:00 GMT https://supabase.com/blog/openai-embeddings-postgres-vector Storing OpenAI embeddings in Postgres with pgvector https://supabase.com/blog/openai-embeddings-postgres-vector An example of how to build an AI-powered search engine using OpenAI's embeddings and PostgreSQL. - Sun, 05 Feb 2023 22:00:00 GMT + Sun, 05 Feb 2023 07:00:00 GMT https://supabase.com/blog/supabase-beta-december-2022 Supabase Beta December 2022 https://supabase.com/blog/supabase-beta-december-2022 This month the Beta Update is a Launch Week 6 Special, where we review the cascade of announcements. - Wed, 04 Jan 2023 22:00:00 GMT + Wed, 04 Jan 2023 07:00:00 GMT https://supabase.com/blog/launch-week-6-hackathon-winners Launch Week 6 Hackathon Winners https://supabase.com/blog/launch-week-6-hackathon-winners Announcing the winners of the Launch Week 6 Hackathon! - Mon, 02 Jan 2023 22:00:00 GMT + Mon, 02 Jan 2023 07:00:00 GMT https://supabase.com/blog/vault-now-in-beta Supabase Vault is now in Beta https://supabase.com/blog/vault-now-in-beta A Postgres extension to store encrypted secrets and encrypt data. - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT https://supabase.com/blog/postgrest-11-prerelease PostgREST 11 pre-release https://supabase.com/blog/postgrest-11-prerelease Describes new features of PostgREST 11 pre-release - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT https://supabase.com/blog/postgres-point-in-time-recovery Point in Time Recovery is now available for Pro projects https://supabase.com/blog/postgres-point-in-time-recovery We're making PITR available for more projects, with a new Dashboard UI that makes it simple to use. - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT https://supabase.com/blog/pg-graphql-v1 pg_graphql v1.0 https://supabase.com/blog/pg-graphql-v1 Announcing the v1.0 release of pg_graphql - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT https://supabase.com/blog/new-in-postgres-15 What's new in Postgres 15? https://supabase.com/blog/new-in-postgres-15 Describes the release of Postgres 15, new features and reasons to use it - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT https://supabase.com/blog/launch-week-6-wrap-up Launch Week 6: Wrap Up https://supabase.com/blog/launch-week-6-wrap-up That's a wrap on Supabase Launch Week Day 6. Here's everything we shipped in one long blog post. - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT https://supabase.com/blog/launch-week-6-community-day Community Day https://supabase.com/blog/launch-week-6-community-day Wrapping up Launch Week 6 with contributors, partners, and friends. - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT https://supabase.com/blog/custom-domain-names Custom Domain Names https://supabase.com/blog/custom-domain-names Change your Supabase project's domain name to your own domain. - Thu, 15 Dec 2022 22:00:00 GMT + Thu, 15 Dec 2022 07:00:00 GMT https://supabase.com/blog/postgres-foreign-data-wrappers-rust Supabase Wrappers, a Postgres FDW framework written in Rust https://supabase.com/blog/postgres-foreign-data-wrappers-rust A framework for building Postgres Foreign Data Wrappers which connects to Stripe, Firebase, Clickhouse, and more. - Wed, 14 Dec 2022 22:00:00 GMT + Wed, 14 Dec 2022 07:00:00 GMT 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 22:00:00 GMT + Tue, 13 Dec 2022 07:00:00 GMT 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 22:00:00 GMT + Mon, 12 Dec 2022 07:00:00 GMT 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 redesigned our Docs and migrated to Next.js - Sun, 11 Dec 2022 22:00:00 GMT + Sun, 11 Dec 2022 07:00:00 GMT https://supabase.com/blog/postgres-crdt 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 22:00:00 GMT + Fri, 09 Dec 2022 07:00:00 GMT 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 22:00:00 GMT + Thu, 08 Dec 2022 07:00:00 GMT 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 22:00:00 GMT + Thu, 08 Dec 2022 07:00:00 GMT 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 22:00:00 GMT + Tue, 06 Dec 2022 07:00:00 GMT 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 22:00:00 GMT + Mon, 05 Dec 2022 07:00:00 GMT 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 22:00:00 GMT + Wed, 30 Nov 2022 07:00:00 GMT 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 22:00:00 GMT + Wed, 23 Nov 2022 07:00:00 GMT https://supabase.com/blog/flutter-authorization-with-rls Flutter Authorization with RLS https://supabase.com/blog/flutter-authorization-with-rls Learn how you can secure your Flutter app using Supabase Row Level Security. - Mon, 21 Nov 2022 22:00:00 GMT + Mon, 21 Nov 2022 07:00:00 GMT 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 22:00:00 GMT + Wed, 16 Nov 2022 07:00:00 GMT 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 22:00:00 GMT + Mon, 07 Nov 2022 07:00:00 GMT 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 22:00:00 GMT + Tue, 01 Nov 2022 06:00:00 GMT 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 21:00:00 GMT + Wed, 26 Oct 2022 06:00:00 GMT 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 21:00:00 GMT + Thu, 20 Oct 2022 06:00:00 GMT 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 21:00:00 GMT + Wed, 19 Oct 2022 06:00:00 GMT 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 21:00:00 GMT + Thu, 13 Oct 2022 06:00:00 GMT 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 21:00:00 GMT + Tue, 04 Oct 2022 06:00:00 GMT 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 21:00:00 GMT + Sun, 02 Oct 2022 06:00:00 GMT 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 21:00:00 GMT + Wed, 07 Sep 2022 06:00:00 GMT 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 21:00:00 GMT + Tue, 06 Sep 2022 06:00:00 GMT 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 21:00:00 GMT + Wed, 24 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Tue, 23 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Thu, 18 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Thu, 18 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Thu, 18 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Thu, 18 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Thu, 18 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Wed, 17 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Tue, 16 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Mon, 15 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Sun, 14 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Thu, 11 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Tue, 09 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Mon, 08 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Tue, 02 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Mon, 01 Aug 2022 06:00:00 GMT 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 21:00:00 GMT + Sun, 17 Jul 2022 06:00:00 GMT 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 21:00:00 GMT + Tue, 12 Jul 2022 06:00:00 GMT 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 21:00:00 GMT + Tue, 05 Jul 2022 06:00:00 GMT 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 21:00:00 GMT + Wed, 29 Jun 2022 06:00:00 GMT 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 21:00:00 GMT + Tue, 28 Jun 2022 06:00:00 GMT 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 21:00:00 GMT + Mon, 27 Jun 2022 06:00:00 GMT 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 21:00:00 GMT + Thu, 16 Jun 2022 06:00:00 GMT 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 21:00:00 GMT + Tue, 31 May 2022 06:00:00 GMT 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 21:00:00 GMT + Wed, 25 May 2022 06:00:00 GMT 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 21:00:00 GMT + Tue, 19 Apr 2022 06:00:00 GMT 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 21:00:00 GMT + Sun, 17 Apr 2022 06:00:00 GMT 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 21:00:00 GMT + Thu, 14 Apr 2022 06:00:00 GMT 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 21:00:00 GMT + Fri, 01 Apr 2022 06:00:00 GMT 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 21:00:00 GMT + Fri, 01 Apr 2022 06:00:00 GMT 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 21:00:00 GMT + Fri, 01 Apr 2022 06:00:00 GMT 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 21:00:00 GMT + Wed, 30 Mar 2022 06:00:00 GMT 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 21:00:00 GMT + Tue, 29 Mar 2022 06:00:00 GMT 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. - Mon, 28 Mar 2022 21:00:00 GMT + Mon, 28 Mar 2022 06:00:00 GMT 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 21:00:00 GMT + Sun, 27 Mar 2022 06:00:00 GMT 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 22:00:00 GMT + Thu, 24 Mar 2022 06:00:00 GMT 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 22:00:00 GMT + Thu, 24 Mar 2022 06:00:00 GMT https://supabase.com/blog/postgres-audit Postgres Auditing in 150 lines of SQL https://supabase.com/blog/postgres-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 22:00:00 GMT + Mon, 07 Mar 2022 07:00:00 GMT 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 22:00:00 GMT + Mon, 21 Feb 2022 07:00:00 GMT 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 22:00:00 GMT + Wed, 19 Jan 2022 07:00:00 GMT 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 22:00:00 GMT + Wed, 19 Jan 2022 07:00:00 GMT 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 22:00:00 GMT + Thu, 16 Dec 2021 07:00:00 GMT 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 22:00:00 GMT + Tue, 14 Dec 2021 07:00:00 GMT 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 22:00:00 GMT + Thu, 02 Dec 2021 07:00:00 GMT 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 22:00:00 GMT + Thu, 02 Dec 2021 07:00:00 GMT 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 22:00:00 GMT + Thu, 02 Dec 2021 07:00:00 GMT 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 22:00:00 GMT + Wed, 01 Dec 2021 07:00:00 GMT 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 22:00:00 GMT + Tue, 30 Nov 2021 07:00:00 GMT 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 22:00:00 GMT + Mon, 29 Nov 2021 07:00:00 GMT 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 22:00:00 GMT + Sun, 28 Nov 2021 07:00:00 GMT 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 22:00:00 GMT + Sat, 27 Nov 2021 07:00:00 GMT 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 22:00:00 GMT + Fri, 26 Nov 2021 07:00:00 GMT 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 22:00:00 GMT + Thu, 25 Nov 2021 07:00:00 GMT 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 22:00:00 GMT + Thu, 25 Nov 2021 07:00:00 GMT 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 22:00:00 GMT + Sat, 06 Nov 2021 06:00:00 GMT 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 21:00:00 GMT + Wed, 27 Oct 2021 06:00:00 GMT 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 21:00:00 GMT + Mon, 18 Oct 2021 06:00:00 GMT 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 21:00:00 GMT + Wed, 13 Oct 2021 06:00:00 GMT 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 21:00:00 GMT + Sun, 03 Oct 2021 06:00:00 GMT 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 21:00:00 GMT + Mon, 27 Sep 2021 06:00:00 GMT 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 21:00:00 GMT + Thu, 09 Sep 2021 06:00:00 GMT 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 21:00:00 GMT + Wed, 11 Aug 2021 06:00:00 GMT 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 21:00:00 GMT + Sun, 08 Aug 2021 06:00:00 GMT 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 21:00:00 GMT + Thu, 29 Jul 2021 06:00:00 GMT 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 21:00:00 GMT + Thu, 29 Jul 2021 06:00:00 GMT 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 21:00:00 GMT + Thu, 29 Jul 2021 06:00:00 GMT 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 21:00:00 GMT + Wed, 28 Jul 2021 06:00:00 GMT 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 21:00:00 GMT + Tue, 27 Jul 2021 06:00:00 GMT 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 21:00:00 GMT + Tue, 27 Jul 2021 06:00:00 GMT 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 21:00:00 GMT + Mon, 26 Jul 2021 06:00:00 GMT 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 21:00:00 GMT + Mon, 26 Jul 2021 06:00:00 GMT 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 21:00:00 GMT + Sun, 25 Jul 2021 06:00:00 GMT https://supabase.com/blog/supabase-community-day Supabase Community Day https://supabase.com/blog/supabase-community-day Community Day - Sun, 25 Jul 2021 21:00:00 GMT + Sun, 25 Jul 2021 06:00:00 GMT 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 21:00:00 GMT + Sun, 25 Jul 2021 06:00:00 GMT 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 21:00:00 GMT + Wed, 21 Jul 2021 06:00:00 GMT 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 21:00:00 GMT + Thu, 01 Jul 2021 06:00:00 GMT 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 21:00:00 GMT + Tue, 01 Jun 2021 06:00:00 GMT 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 21:00:00 GMT + Tue, 01 Jun 2021 06:00:00 GMT 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 21:00:00 GMT + Tue, 04 May 2021 06:00:00 GMT 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 21:00:00 GMT + Mon, 05 Apr 2021 06:00:00 GMT 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 21:00:00 GMT + Thu, 01 Apr 2021 06:00:00 GMT 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 21:00:00 GMT + Thu, 01 Apr 2021 06:00:00 GMT 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 21:00:00 GMT + Thu, 01 Apr 2021 06:00:00 GMT 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 21:00:00 GMT + Thu, 01 Apr 2021 06:00:00 GMT 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 21:00:00 GMT + Wed, 31 Mar 2021 06:00:00 GMT 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 21:00:00 GMT + Tue, 30 Mar 2021 06:00:00 GMT https://supabase.com/blog/pricing Supabase Beta Pricing https://supabase.com/blog/pricing Supabase launches Beta pricing structure - Sun, 28 Mar 2021 21:00:00 GMT + Mon, 29 Mar 2021 06:00:00 GMT https://supabase.com/blog/launch-week Launch week https://supabase.com/blog/launch-week Five days of Supabase. - Wed, 24 Mar 2021 22:00:00 GMT + Wed, 24 Mar 2021 06:00:00 GMT 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 22:00:00 GMT + Wed, 24 Mar 2021 06:00:00 GMT 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 22:00:00 GMT + Mon, 22 Mar 2021 06:00:00 GMT 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 22:00:00 GMT + Thu, 11 Mar 2021 07:00:00 GMT 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 22:00:00 GMT + Mon, 08 Mar 2021 07:00:00 GMT 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 22:00:00 GMT + Fri, 05 Mar 2021 07:00:00 GMT 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 22:00:00 GMT + Tue, 02 Mar 2021 07:00:00 GMT 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 22:00:00 GMT + Sat, 27 Feb 2021 07:00:00 GMT 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 22:00:00 GMT + Tue, 09 Feb 2021 07:00:00 GMT 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 22:00:00 GMT + Tue, 02 Feb 2021 07:00:00 GMT 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 22:00:00 GMT + Sat, 02 Jan 2021 07:00:00 GMT 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 22:00:00 GMT + Sun, 13 Dec 2020 07:00:00 GMT 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 22:00:00 GMT + Wed, 02 Dec 2020 07:00:00 GMT 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 22:00:00 GMT + Wed, 02 Dec 2020 07:00:00 GMT 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 22:00:00 GMT + Wed, 02 Dec 2020 07:00:00 GMT 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 22:00:00 GMT + Wed, 02 Dec 2020 07:00:00 GMT 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 22:00:00 GMT + Tue, 01 Dec 2020 07:00:00 GMT 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 22:00:00 GMT + Wed, 18 Nov 2020 07:00:00 GMT 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 22:00:00 GMT + Mon, 02 Nov 2020 07:00:00 GMT 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 22:00:00 GMT + Fri, 30 Oct 2020 06:00:00 GMT 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 21:00:00 GMT + Sat, 03 Oct 2020 06:00:00 GMT 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 21:00:00 GMT + Fri, 11 Sep 2020 06:00:00 GMT 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 21:00:00 GMT + Thu, 03 Sep 2020 06:00:00 GMT 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 21:00:00 GMT + Wed, 05 Aug 2020 06:00:00 GMT 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 21:00:00 GMT + Sun, 02 Aug 2020 06:00:00 GMT 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 21:00:00 GMT + Sun, 02 Aug 2020 06:00:00 GMT 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 21:00:00 GMT + Fri, 10 Jul 2020 06:00:00 GMT 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 21:00:00 GMT + Thu, 09 Jul 2020 06:00:00 GMT 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 21:00:00 GMT + Tue, 07 Jul 2020 06:00:00 GMT 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 21:00:00 GMT + Wed, 01 Jul 2020 06:00:00 GMT 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 21:00:00 GMT + Mon, 15 Jun 2020 06:00:00 GMT 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 21:00:00 GMT + Mon, 01 Jun 2020 06:00:00 GMT 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 21:00:00 GMT + Mon, 01 Jun 2020 06:00:00 GMT diff --git a/spec/examples/examples.yml b/spec/examples/examples.yml index bd034b94223..4960b1f29a5 100644 --- a/spec/examples/examples.yml +++ b/spec/examples/examples.yml @@ -296,6 +296,13 @@ functions: ```js const { data, error } = await supabase.auth.verifyOtp({ email, token, type: 'signup'}) ``` + - id: verify-email-auth(tokenhash) + name: Verify Email Auth (Token Hash) + isSpotlight: false + code: | + ```js + const { data, error } = await supabase.auth.verifyOtp({ token_hash: tokenHash, type: 'email'}) + ``` - id: auth.getSession() title: 'getSession()' $ref: '@supabase/gotrue-js.GoTrueClient.getSession' diff --git a/spec/supabase_js_v2.yml b/spec/supabase_js_v2.yml index aa2337b47b5..601b892c97b 100644 --- a/spec/supabase_js_v2.yml +++ b/spec/supabase_js_v2.yml @@ -415,6 +415,7 @@ functions: notes: | - The `verifyOtp` method takes in different verification types. If a phone number is used, the type can either be `sms` or `phone_change`. If an email address is used, the type can be one of the following: `email`, `recovery`, `invite` or `email_change` (`signup` and `magiclink` types are deprecated). - The verification type used should be determined based on the corresponding auth method called before `verifyOtp` to sign up / sign-in a user. + - The `TokenHash` is contained in the [email templates](/docs/guides/auth/auth-email-templates) and can be used to sign in. You may wish to use the hash with Magic Links for the PKCE flow for Server Side Auth. See [this guide](/docs/guides/auth/server-side/email-based-auth-with-pkce-flow-for-ssr) for more details. examples: - id: verify-sms-one-time-password(otp) name: Verify Sms One-Time Password (OTP) @@ -430,6 +431,13 @@ functions: ```js const { data, error } = await supabase.auth.verifyOtp({ email, token, type: 'email'}) ``` + - id: verify-email-auth(tokenhash) + name: Verify Email Auth (Token Hash) + isSpotlight: false + code: | + ```js + const { data, error } = await supabase.auth.verifyOtp({ token_hash: tokenHash, type: 'email'}) + ``` - id: get-session title: 'getSession()' $ref: '@supabase/gotrue-js.GoTrueClient.getSession' diff --git a/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx b/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx index 5ba615f4159..cdd8ee29829 100644 --- a/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx +++ b/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx @@ -2,7 +2,7 @@ import * as Tooltip from '@radix-ui/react-tooltip' import type { PostgresPolicy } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' import { noop } from 'lodash' -import { Button, Dropdown, IconEdit, IconMoreVertical, IconTrash } from 'ui' +import { Button, Dropdown, IconEdit, IconMoreVertical, IconTrash, ScrollArea } from 'ui' import Panel from 'components/ui/Panel' import { useCheckPermissions } from 'hooks' @@ -34,11 +34,35 @@ const PolicyRow = ({

Applied to:

- {policy.roles.map((role, i) => ( + {policy.roles.slice(0, 3).map((role, i) => ( {role} ))} + + + {policy.roles.length > 3 && ( + + + {policy.roles.length - 3} more roles + + )} + + + + +
+ + {policy.roles.slice(3).join(', ')} + +
+
+
+
diff --git a/studio/components/interfaces/Auth/Users/UserDropdown.tsx b/studio/components/interfaces/Auth/Users/UserDropdown.tsx index dfbd2d6cb11..0f37278e54e 100644 --- a/studio/components/interfaces/Auth/Users/UserDropdown.tsx +++ b/studio/components/interfaces/Auth/Users/UserDropdown.tsx @@ -128,7 +128,7 @@ const UserDropdown = ({ user, canRemoveUser, canRemoveMFAFactors }: UserDropdown ) : null} - + } @@ -160,7 +160,7 @@ const UserDropdown = ({ user, canRemoveUser, canRemoveMFAFactors }: UserDropdown )} - + } diff --git a/studio/components/interfaces/Database/Backups/BackupItem.tsx b/studio/components/interfaces/Database/Backups/BackupItem.tsx index 45041016a34..8d13167d797 100644 --- a/studio/components/interfaces/Database/Backups/BackupItem.tsx +++ b/studio/components/interfaces/Database/Backups/BackupItem.tsx @@ -67,15 +67,20 @@ const BackupItem = ({ projectRef, backup, index }: BackupItemProps) => { return Backup In Progress... } + const generateBackupName = (backup: any) => { + if (backup.status == 'COMPLETED') { + return `${dayjs(backup.inserted_at).format('DD MMM YYYY HH:mm:ss')} UTC` + } + return dayjs(backup.inserted_at).format('DD MMM YYYY') + } + return (
-

- {dayjs(backup.inserted_at).format('DD MMM YYYY HH:mm:ss')} -

+

{generateBackupName(backup)}

{generateSideButtons(backup)}
) diff --git a/studio/components/interfaces/Database/Backups/BackupsList.tsx b/studio/components/interfaces/Database/Backups/BackupsList.tsx index dabc90d5837..6add480cb2c 100644 --- a/studio/components/interfaces/Database/Backups/BackupsList.tsx +++ b/studio/components/interfaces/Database/Backups/BackupsList.tsx @@ -21,7 +21,7 @@ const BackupsList = () => { 'queue_job.restore.prepare' ) - const isPitrEnabled = backups?.configuration?.walg_enabled + const isPitrEnabled = backups?.configuration?.pitr_enabled if (backups.isLoading) return if (backups.error) return diff --git a/studio/components/interfaces/Organization/BillingSettingsV2/PaymentMethods/ChangePaymentMethodModal.tsx b/studio/components/interfaces/Organization/BillingSettingsV2/PaymentMethods/ChangePaymentMethodModal.tsx index a58f2f57cd1..7b4485b01a8 100644 --- a/studio/components/interfaces/Organization/BillingSettingsV2/PaymentMethods/ChangePaymentMethodModal.tsx +++ b/studio/components/interfaces/Organization/BillingSettingsV2/PaymentMethods/ChangePaymentMethodModal.tsx @@ -1,10 +1,8 @@ import { useParams } from 'common' import { OrganizationPaymentMethod } from 'data/organizations/organization-payment-methods-query' import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { - SubscriptionTier, - useOrgSubscriptionUpdateMutation, -} from 'data/subscriptions/org-subscription-update-mutation' +import { useOrgSubscriptionUpdateMutation } from 'data/subscriptions/org-subscription-update-mutation' +import { SubscriptionTier } from 'data/subscriptions/types' import { useStore } from 'hooks' import { Button, Modal } from 'ui' diff --git a/studio/components/interfaces/Organization/BillingSettingsV2/Subscription/PlanUpdateSidePanel.tsx b/studio/components/interfaces/Organization/BillingSettingsV2/Subscription/PlanUpdateSidePanel.tsx index 03c23fb582d..649e6984542 100644 --- a/studio/components/interfaces/Organization/BillingSettingsV2/Subscription/PlanUpdateSidePanel.tsx +++ b/studio/components/interfaces/Organization/BillingSettingsV2/Subscription/PlanUpdateSidePanel.tsx @@ -7,10 +7,7 @@ import { useEffect, useState } from 'react' import ShimmeringLoader from 'components/ui/ShimmeringLoader' import { useOrgPlansQuery } from 'data/subscriptions/org-plans-query' import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { - SubscriptionTier, - useOrgSubscriptionUpdateMutation, -} from 'data/subscriptions/org-subscription-update-mutation' +import { useOrgSubscriptionUpdateMutation } from 'data/subscriptions/org-subscription-update-mutation' import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import { PRICING_TIER_PRODUCT_IDS } from 'lib/constants' import Telemetry from 'lib/telemetry' @@ -27,6 +24,7 @@ import { useFreeProjectLimitCheckQuery } from 'data/organizations/free-project-l import { useOrganizationBillingSubscriptionPreview } from 'data/organizations/organization-billing-subscription-preview' import InformationBox from 'components/ui/InformationBox' import AlertError from 'components/ui/AlertError' +import { SubscriptionTier } from 'data/subscriptions/types' // [Joshen TODO] Need to remove all contexts of "projects" @@ -266,7 +264,7 @@ const PlanUpdateSidePanel = () => {
    - {(plan.features).map((feature) => ( + {plan.features.map((feature) => (
  • { setSelectedTier(undefined)} onConfirm={onUpdateSubscription} diff --git a/studio/components/interfaces/Organization/GeneralSettings/MigrateOrganizationBillingButton.tsx b/studio/components/interfaces/Organization/GeneralSettings/MigrateOrganizationBillingButton.tsx index 6a2710f8a1a..a6d84f2e874 100644 --- a/studio/components/interfaces/Organization/GeneralSettings/MigrateOrganizationBillingButton.tsx +++ b/studio/components/interfaces/Organization/GeneralSettings/MigrateOrganizationBillingButton.tsx @@ -37,7 +37,7 @@ const MigrateOrganizationBillingButton = observer(() => { const [isOpen, setIsOpen] = useState(false) const [tier, setTier] = useState('') const [showSpendCapHelperModal, setShowSpendCapHelperModal] = useState(false) - const [isSpendCapEnabled, setIsSpendCapEnabled] = useState(true) + const [isSpendCapEnabled, setIsSpendCapEnabled] = useState(false) const [paymentMethodId, setPaymentMethodId] = useState('') const dbTier = useMemo(() => { @@ -95,6 +95,23 @@ const MigrateOrganizationBillingButton = observer(() => { const canMigrateOrganization = useCheckPermissions(PermissionAction.UPDATE, 'organizations') + const selectedLimitedUsage = useMemo( + () => tier === 'PRO' && isSpendCapEnabled, + [tier, isSpendCapEnabled] + ) + + const downgradingToLimitedUsage = useMemo(() => { + if (migrationPreviewData) { + const hadUsageBillingEnabled = migrationPreviewData.old_tiers.some((it) => + ['tier_payg', 'tier_team', 'tier_enterprise'].includes(it) + ) + + return hadUsageBillingEnabled && selectedLimitedUsage + } else { + return false + } + }, [migrationPreviewData, selectedLimitedUsage]) + const toggle = () => { setIsOpen(!isOpen) } @@ -297,8 +314,8 @@ const MigrateOrganizationBillingButton = observer(() => {

    When enabled, usage is limited to the plan's quota, with restrictions when - limits are exceeded. To scale beyond Pro limits without restrictions, disable - the spend cap and pay for over-usage beyond the quota. + limits are exceeded. When disabled, you scale beyond Pro limits without + restrictions and pay for over-usage beyond the quota.

    @@ -326,15 +343,46 @@ const MigrateOrganizationBillingButton = observer(() => { - {migrationPreviewError && ( - - - Organization cannot be migrated - - {migrationPreviewError.message} - - - )} +
    + {migrationPreviewError && ( + + + Organization cannot be migrated + + {migrationPreviewError.message} + + + )} + + {(downgradingToLimitedUsage || + (!downgradingToLimitedUsage && selectedLimitedUsage)) && ( + + + Spend Cap is enabled + +
    + {downgradingToLimitedUsage ? ( +

    + You previously had the spend cap disabled to scale seamlessly beyond the + included quota. You will run into restrictions in case you exceed the + included quota. +

    + ) : ( +

    + With the Spend Cap enabled, your projects will be restricted once you + exhaust the included quota. To scale seamlessly beyond the included + quota, disable the Spend Cap. +

    + )} + + +
    +
    +
    + )} +
    {migrationError && ( diff --git a/studio/components/interfaces/Settings/Database/ConnectionPooling.tsx b/studio/components/interfaces/Settings/Database/ConnectionPooling.tsx index 121294652df..f3ae3ed6099 100644 --- a/studio/components/interfaces/Settings/Database/ConnectionPooling.tsx +++ b/studio/components/interfaces/Settings/Database/ConnectionPooling.tsx @@ -88,13 +88,7 @@ const ConnectionPooling = () => { ) : ( )} diff --git a/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx b/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx index 072b9c83c79..1bd733e909a 100644 --- a/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx +++ b/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx @@ -144,7 +144,13 @@ const TransferProjectButton = () => {

    To transfer projects, the owner must be a member of both the source and target - organizations. + organizations. For further information see our{' '} + + + Documentation + + + .

    Transferring considerations:

    diff --git a/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx b/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx index 17387da6b9f..05088113ee6 100644 --- a/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx +++ b/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx @@ -38,7 +38,7 @@ const LayoutHeader = ({ customHeaderComponents, breadcrumbs = [], headerBorder = { enabled: selectedOrganization && !selectedOrganization.subscription_id } ) - const projectHasNoLimits = subscription?.usage_billing_enabled === false + const projectHasNoLimits = subscription?.usage_billing_enabled === true const showOverUsageBadge = useFlag('overusageBadge') && diff --git a/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerHeader.tsx b/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerHeader.tsx index e998e6d45ba..b83f20da943 100644 --- a/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerHeader.tsx +++ b/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerHeader.tsx @@ -96,9 +96,7 @@ const HeaderBreadcrumbs = ({ loading, breadcrumbs, selectBreadcrumb }: any) => { } interface FileExplorerHeader { - isSearching: boolean itemSearchString: string - setIsSearching: (value: boolean) => void setItemSearchString: (value: string) => void onFilesUpload: (event: any, columnIndex: number) => void } diff --git a/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerRow.tsx b/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerRow.tsx index ab905d4f326..ba4ee7bc678 100644 --- a/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerRow.tsx +++ b/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerRow.tsx @@ -423,7 +423,7 @@ const FileExplorerRow = ({ overlay={(option?.children ?? [])?.map((child) => { return ( - {child.name} +

    {child.name}

    ) })} @@ -436,7 +436,7 @@ const FileExplorerRow = ({ >
    {option.icon} -

    {option.name}

    +

    {option.name}

    @@ -451,7 +451,7 @@ const FileExplorerRow = ({ icon={option.icon || <>} onClick={option.onClick} > - {option.name} +

    {option.name}

    ) } diff --git a/studio/components/to-be-cleaned/Storage/StorageExplorer/PreviewPane.tsx b/studio/components/to-be-cleaned/Storage/StorageExplorer/PreviewPane.tsx index a50d04e58f6..af6d50ac595 100644 --- a/studio/components/to-be-cleaned/Storage/StorageExplorer/PreviewPane.tsx +++ b/studio/components/to-be-cleaned/Storage/StorageExplorer/PreviewPane.tsx @@ -210,6 +210,7 @@ const PreviewPane = ({ onCopyUrl }: PreviewPaneProps) => { overlay={[ onCopyUrl(file.name, await getFileUrl(file, URL_EXPIRY_DURATION.WEEK)) } @@ -218,6 +219,7 @@ const PreviewPane = ({ onCopyUrl }: PreviewPaneProps) => { , onCopyUrl(file.name, await getFileUrl(file, URL_EXPIRY_DURATION.MONTH)) } @@ -226,6 +228,7 @@ const PreviewPane = ({ onCopyUrl }: PreviewPaneProps) => { , onCopyUrl(file.name, await getFileUrl(file, URL_EXPIRY_DURATION.YEAR)) } @@ -234,6 +237,7 @@ const PreviewPane = ({ onCopyUrl }: PreviewPaneProps) => { , setSelectedFileCustomExpiry(file)} > Custom expiry diff --git a/studio/components/to-be-cleaned/Storage/StorageExplorer/StorageExplorer.js b/studio/components/to-be-cleaned/Storage/StorageExplorer/StorageExplorer.tsx similarity index 78% rename from studio/components/to-be-cleaned/Storage/StorageExplorer/StorageExplorer.js rename to studio/components/to-be-cleaned/Storage/StorageExplorer/StorageExplorer.tsx index dbca2bcaec6..99e343cf459 100644 --- a/studio/components/to-be-cleaned/Storage/StorageExplorer/StorageExplorer.js +++ b/studio/components/to-be-cleaned/Storage/StorageExplorer/StorageExplorer.tsx @@ -5,6 +5,7 @@ import { useEffect, useRef, useState } from 'react' import { useProjectSettingsQuery } from 'data/config/project-settings-query' import { useCustomDomainsQuery } from 'data/custom-domains/custom-domains-query' +import { Bucket } from 'data/storage/buckets-query' import { useStore } from 'hooks' import { DEFAULT_PROJECT_API_SERVICE_ID, IS_PLATFORM } from 'lib/constants' import { copyToClipboard } from 'lib/helpers' @@ -18,7 +19,11 @@ import FileExplorerHeaderSelection from './FileExplorerHeaderSelection' import MoveItemsModal from './MoveItemsModal' import PreviewPane from './PreviewPane' -const StorageExplorer = observer(({ bucket }) => { +interface StorageExplorerProps { + bucket: Bucket +} + +const StorageExplorer = ({ bucket }: StorageExplorerProps) => { const storageExplorerStore = useStorageStore() const { columns, @@ -70,30 +75,35 @@ const StorageExplorer = observer(({ bucket }) => { // Requires a fixed height to ensure that explorer is constrained to the viewport const fileExplorerHeight = window.innerHeight - 122 - useEffect(async () => { - const currentFolderIdx = openedFolders.length - 1 - const currentFolder = openedFolders[currentFolderIdx] + // eslint-disable-next-line react-hooks/exhaustive-deps + useEffect(() => { + const fetchContents = async () => { + const currentFolderIdx = openedFolders.length - 1 + const currentFolder = openedFolders[currentFolderIdx] - if (itemSearchString) { - if (!currentFolder) { - // At root of bucket - await fetchFolderContents(bucket.id, bucket.name, -1, itemSearchString) + if (itemSearchString) { + if (!currentFolder) { + // At root of bucket + await fetchFolderContents(bucket.id, bucket.name, -1, itemSearchString) + } else { + await fetchFolderContents( + currentFolder.id, + currentFolder.name, + currentFolderIdx, + itemSearchString + ) + } } else { - await fetchFolderContents( - currentFolder.id, - currentFolder.name, - currentFolderIdx, - itemSearchString - ) - } - } else { - if (!currentFolder) { - // At root of bucket - await fetchFolderContents(bucket.id, bucket.name, -1) - } else { - await fetchFolderContents(currentFolder.id, currentFolder.name, currentFolderIdx) + if (!currentFolder) { + // At root of bucket + await fetchFolderContents(bucket.id, bucket.name, -1) + } else { + await fetchFolderContents(currentFolder.id, currentFolder.name, currentFolderIdx) + } } } + + fetchContents() }, [itemSearchString]) useEffect(() => { @@ -108,18 +118,22 @@ const StorageExplorer = observer(({ bucket }) => { /** Checkbox selection methods */ /** [Joshen] We'll only support checkbox selection for files ONLY */ - const onSelectAllItemsInColumn = (columnIndex) => { + const onSelectAllItemsInColumn = (columnIndex: number) => { const columnFiles = columns[columnIndex].items - .filter((item) => item.type === STORAGE_ROW_TYPES.FILE) - .map((item) => { + .filter((item: any) => item.type === STORAGE_ROW_TYPES.FILE) + .map((item: any) => { return { ...item, columnIndex } }) - const columnFilesId = compact(columnFiles.map((item) => item.id)) - const selectedItemsFromColumn = selectedItems.filter((item) => columnFilesId.includes(item.id)) + const columnFilesId = compact(columnFiles.map((item: any) => item.id)) + const selectedItemsFromColumn = selectedItems.filter((item: any) => + columnFilesId.includes(item.id) + ) if (selectedItemsFromColumn.length === columnFiles.length) { // Deselect all items from column - const updatedSelectedItems = selectedItems.filter((item) => !columnFilesId.includes(item.id)) + const updatedSelectedItems = selectedItems.filter( + (item: any) => !columnFilesId.includes(item.id) + ) setSelectedItems(updatedSelectedItems) } else { // Select all items from column @@ -130,7 +144,7 @@ const StorageExplorer = observer(({ bucket }) => { /** File manipulation methods */ - const onFilesUpload = async (event, columnIndex = -1) => { + const onFilesUpload = async (event: any, columnIndex = -1) => { event.persist() const items = event.target.files || event.dataTransfer.items const isDrop = !isEmpty(get(event, ['dataTransfer', 'items'], [])) @@ -138,7 +152,7 @@ const StorageExplorer = observer(({ bucket }) => { event.target.value = '' } - const onMoveSelectedFiles = async (newPath) => { + const onMoveSelectedFiles = async (newPath: string) => { await moveFiles(newPath) } @@ -161,14 +175,14 @@ const StorageExplorer = observer(({ bucket }) => { } /** Misc UI methods */ - const onSelectColumnEmptySpace = (columnIndex) => { + const onSelectColumnEmptySpace = (columnIndex: number) => { popColumnAtIndex(columnIndex) popOpenedFoldersAtIndex(columnIndex - 1) closeFilePreview() clearSelectedItems() } - const onCopyUrl = (name, url) => { + const onCopyUrl = (name: string, url: string) => { const formattedUrl = customDomainData?.customDomain?.status === 'active' ? url.replace(apiUrl, `https://${customDomainData.customDomain.hostname}`) @@ -232,7 +246,7 @@ const StorageExplorer = observer(({ bucket }) => {
) -}) +} StorageExplorer.displayName = 'StorageExplorer' -export default StorageExplorer +export default observer(StorageExplorer) diff --git a/studio/data/config/project-read-only-query.ts b/studio/data/config/project-read-only-query.ts index ebbdbe55768..151b0ff12e2 100644 --- a/studio/data/config/project-read-only-query.ts +++ b/studio/data/config/project-read-only-query.ts @@ -40,21 +40,9 @@ export const useProjectReadOnlyQuery = ( return data.result[0]?.default_transaction_read_only === 'on' }, enabled: typeof projectRef !== 'undefined' && typeof connectionString !== 'undefined', + retry: (failureCount) => { + return failureCount < 3 + }, ...options, } ) - -export const useProjectReadOnlyPrefetch = () => { - const prefetch = useExecuteSqlPrefetch() - - return useCallback( - ({ projectRef, connectionString }: ProjectReadOnlyVariables) => - prefetch({ - projectRef, - connectionString, - sql: getProjectReadOnlySql(), - queryKey: ['project-read-only'], - }), - [prefetch] - ) -} diff --git a/studio/data/database/backup-restore-mutation.ts b/studio/data/database/backup-restore-mutation.ts index 991f928a95c..e8f27f9e628 100644 --- a/studio/data/database/backup-restore-mutation.ts +++ b/studio/data/database/backup-restore-mutation.ts @@ -14,6 +14,15 @@ export type BackupRestoreVariables = { export type Backup = components['schemas']['Backup'] export async function restoreFromBackup({ ref, backup }: BackupRestoreVariables) { + if (backup.isPhysicalBackup) { + const { data, error } = await post('/platform/database/{ref}/backups/restore-physical', { + params: { path: { ref } }, + body: { id: backup.id, recovery_time_target: backup.inserted_at }, + }) + if (error) throw error + return data + } + const { data, error } = await post('/platform/database/{ref}/backups/restore', { params: { path: { ref } }, body: { id: backup.id }, diff --git a/studio/data/database/pooling-configuration-query.ts b/studio/data/database/pooling-configuration-query.ts index 61ef636fc75..eecf45b5bae 100644 --- a/studio/data/database/pooling-configuration-query.ts +++ b/studio/data/database/pooling-configuration-query.ts @@ -21,7 +21,7 @@ export type PoolingConfiguration = { inserted_at: string max_client_conn: number | null pgbouncer_enabled: boolean - supavisor_enabled?: boolean + supavisor_enabled: boolean pgbouncer_status: string pool_mode: string connectionString: string diff --git a/studio/data/organizations/organization-billing-subscription-preview.ts b/studio/data/organizations/organization-billing-subscription-preview.ts index 8c9068d9322..910eef3bed4 100644 --- a/studio/data/organizations/organization-billing-subscription-preview.ts +++ b/studio/data/organizations/organization-billing-subscription-preview.ts @@ -2,10 +2,11 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query' import { post } from 'data/fetchers' import { organizationKeys } from './keys' import { ResponseError } from 'types' +import { SubscriptionTier } from 'data/subscriptions/types' export type OrganizationBillingSubscriptionPreviewVariables = { organizationSlug?: string - tier?: 'tier_payg' | 'tier_pro' | 'tier_free' | 'tier_team' | 'tier_enterprise' + tier?: SubscriptionTier } export type OrganizationBillingSubscriptionPreviewResponse = { diff --git a/studio/data/organizations/organization-migrate-billing-preview-query.ts b/studio/data/organizations/organization-migrate-billing-preview-query.ts index ef5e6551319..4b6628acecd 100644 --- a/studio/data/organizations/organization-migrate-billing-preview-query.ts +++ b/studio/data/organizations/organization-migrate-billing-preview-query.ts @@ -2,6 +2,7 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query' import { post } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import { organizationKeys } from './keys' +import { SubscriptionTier } from 'data/subscriptions/types' export type OrganizationBillingMigrationPreviewVariables = { organizationSlug?: string @@ -21,6 +22,7 @@ export type OrganizationBillingMigrationPreviewResponse = { quantity: number total_price: number }[] + old_tiers: SubscriptionTier[] } export async function previewOrganizationBillingMigration( diff --git a/studio/data/subscriptions/org-subscription-update-mutation.ts b/studio/data/subscriptions/org-subscription-update-mutation.ts index 4e91365c39e..ad6cae5e40a 100644 --- a/studio/data/subscriptions/org-subscription-update-mutation.ts +++ b/studio/data/subscriptions/org-subscription-update-mutation.ts @@ -5,13 +5,7 @@ import { toast } from 'react-hot-toast' import { ResponseError } from 'types/base' import { subscriptionKeys } from './keys' import { usageKeys } from 'data/usage/keys' - -export type SubscriptionTier = - | 'tier_free' - | 'tier_pro' - | 'tier_payg' - | 'tier_team' - | 'tier_enterprise' +import { SubscriptionTier } from './types' export type OrgSubscriptionUpdateVariables = { slug: string diff --git a/studio/data/subscriptions/types.ts b/studio/data/subscriptions/types.ts new file mode 100644 index 00000000000..d0755cb9406 --- /dev/null +++ b/studio/data/subscriptions/types.ts @@ -0,0 +1,6 @@ +export type SubscriptionTier = + | 'tier_free' + | 'tier_pro' + | 'tier_payg' + | 'tier_team' + | 'tier_enterprise' diff --git a/studio/pages/api/storage/[ref]/buckets/index.ts b/studio/pages/api/storage/[ref]/buckets/index.ts index e426db1810c..e7a968948d5 100644 --- a/studio/pages/api/storage/[ref]/buckets/index.ts +++ b/studio/pages/api/storage/[ref]/buckets/index.ts @@ -33,6 +33,13 @@ const handleGet = async (req: NextApiRequest, res: NextApiResponse) => { const handlePost = async (req: NextApiRequest, res: NextApiResponse) => { const { id, public: isPublicBucket } = req.body + // To validate bucket name, can be removed once the issue is fixed in supabase lib + const regex = /^[a-z0-9.-]+$/ + if (!regex.test(id)) { + return res.status(400).json({ error: { message: 'Bucket name invalid' } }) + } + // Bucket name validation ends here + const { data, error } = await supabase.storage.createBucket(id, { public: isPublicBucket }) if (error) { return res.status(400).json({ error: { message: error.message } }) diff --git a/studio/pages/new/[slug].tsx b/studio/pages/new/[slug].tsx index 3179618a1d9..16300ebd9ad 100644 --- a/studio/pages/new/[slug].tsx +++ b/studio/pages/new/[slug].tsx @@ -496,7 +496,14 @@ const Wizard: NextPageWithLayout = () => {
)} -
+
+ + + + + + + + + + + + +
+
+ } + /> + + )} + {!billedViaOrg && !isSelectFreeTier && ( <> diff --git a/studio/pages/project/[ref]/database/backups/scheduled.tsx b/studio/pages/project/[ref]/database/backups/scheduled.tsx index 2a6fe5fbd3b..d32e43d89d2 100644 --- a/studio/pages/project/[ref]/database/backups/scheduled.tsx +++ b/studio/pages/project/[ref]/database/backups/scheduled.tsx @@ -18,7 +18,7 @@ const DatabaseScheduledBackups: NextPageWithLayout = () => { const { project } = useProjectContext() const ref = project?.ref - const isPitrEnabled = backups?.configuration?.walg_enabled + const isPitrEnabled = backups?.configuration?.pitr_enabled const canReadScheduledBackups = useCheckPermissions(PermissionAction.READ, 'back_ups') diff --git a/studio/pages/project/[ref]/logs/pooler-logs.tsx b/studio/pages/project/[ref]/logs/pooler-logs.tsx index 4ac98a09c80..e3e876d3942 100644 --- a/studio/pages/project/[ref]/logs/pooler-logs.tsx +++ b/studio/pages/project/[ref]/logs/pooler-logs.tsx @@ -1,5 +1,4 @@ import { useParams } from 'common' -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, IconAlertCircle } from 'ui' import { LogsTableName } from 'components/interfaces/Settings/Logs' import LogsPreviewer from 'components/interfaces/Settings/Logs/LogsPreviewer' @@ -18,10 +17,7 @@ export const LogPage: NextPageWithLayout = () => { if (isLoading) { return } - const isSupavisorEnabled = - poolingConfiguration?.supavisor_enabled ?? - poolingConfiguration?.connectionString.includes('pooler.supabase.com') ?? - false + const isSupavisorEnabled = poolingConfiguration?.supavisor_enabled ?? false return ( b.id - a.id) + return arr + .filter(filter) + .sort( + (a: any, b: any) => new Date(b.inserted_at).valueOf() - new Date(a.inserted_at).valueOf() + ) } else { - return arr.sort((a: any, b: any) => b.id - a.id) + return arr.sort( + (a: any, b: any) => new Date(b.inserted_at).valueOf() - new Date(a.inserted_at).valueOf() + ) } }