diff --git a/README.md b/README.md
index 70298a09e54..491a08b1009 100644
--- a/README.md
+++ b/README.md
@@ -67,7 +67,7 @@ You can also [self-host](https://supabase.com/docs/guides/hosting/overview) and
- [pg_graphql](http://github.com/supabase/pg_graphql/) a PostgreSQL extension that exposes a GraphQL API
- [Storage](https://github.com/supabase/storage-api) provides a RESTful interface for managing Files stored in S3, using Postgres to manage permissions.
- [postgres-meta](https://github.com/supabase/postgres-meta) is a RESTful API for managing your Postgres, allowing you to fetch tables, add roles, and run queries, etc.
-- [GoTrue](https://github.com/supabase/gotrue) is an JWT based API for managing users and issuing JWT tokens.
+- [GoTrue](https://github.com/supabase/gotrue) is a JWT based API for managing users and issuing JWT tokens.
- [Kong](https://github.com/Kong/kong) is a cloud-native API gateway.
#### Client libraries
diff --git a/apps/docs/components/Extensions.tsx b/apps/docs/components/Extensions.tsx
index b49c5ad83d3..8740be67870 100644
--- a/apps/docs/components/Extensions.tsx
+++ b/apps/docs/components/Extensions.tsx
@@ -1,7 +1,7 @@
import Link from 'next/link'
import React, { useState } from 'react'
-import { GlassPanel, IconLink, IconX, Input } from 'ui'
-import extensions from '../data/extensions.json'
+import { extensions } from 'shared-data'
+import { GlassPanel, IconX, Input } from 'ui'
type Extension = {
name: string
diff --git a/apps/docs/components/MDX/storage_management.mdx b/apps/docs/components/MDX/storage_management.mdx
index ce28a1684c8..94aaa57a999 100644
--- a/apps/docs/components/MDX/storage_management.mdx
+++ b/apps/docs/components/MDX/storage_management.mdx
@@ -61,13 +61,16 @@ as $$
declare
status int;
content text;
+ avatar_name text;
begin
if coalesce(old.avatar_url, '') <> ''
and (tg_op = 'DELETE' or (old.avatar_url <> new.avatar_url)) then
+ -- extract avatar name
+ avatar_name := substring(old.avatar_url from '/([^\/]+)\?.*$');
select
into status, content
result.status, result.content
- from public.delete_avatar(old.avatar_url) as result;
+ from public.delete_avatar(avatar_name) as result;
if status <> 200 then
raise warning 'Could not delete avatar: % %', status, content;
end if;
diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts
index 488226925ee..3e26e339ec4 100644
--- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts
+++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts
@@ -449,6 +449,10 @@ export const auth = {
name: 'Overview',
url: '/guides/auth',
},
+ {
+ name: 'Redirect URLs',
+ url: '/guides/auth/concepts/redirect-urls',
+ },
{
name: 'Quickstarts',
items: [
@@ -495,22 +499,36 @@ export const auth = {
{ name: 'Managing User Data', url: '/guides/auth/managing-user-data' },
{ name: 'Multi-Factor Authentication', url: '/guides/auth/auth-mfa' },
{ name: 'Row Level Security', url: '/guides/auth/row-level-security' },
- { name: 'Server-side Rendering', url: '/guides/auth/server-side-rendering' },
],
},
{
- name: 'Auth Helpers',
+ name: 'Server-side Auth',
url: undefined,
items: [
{ name: 'Overview', url: '/guides/auth/auth-helpers' },
- { name: 'Auth UI', url: '/guides/auth/auth-helpers/auth-ui' },
- { name: 'Flutter Auth UI', url: '/guides/auth/auth-helpers/flutter-auth-ui' },
{
name: 'Next.js',
url: '/guides/auth/auth-helpers/nextjs',
},
{ name: 'Remix', url: '/guides/auth/auth-helpers/remix' },
{ name: 'SvelteKit', url: '/guides/auth/auth-helpers/sveltekit' },
+ { name: 'Server-side Rendering', url: '/guides/auth/server-side-rendering' },
+ {
+ name: 'Email Auth with PKCE flow for SSR',
+ url: '/guides/auth/server-side/email-based-auth-with-pkce-flow-for-ssr',
+ },
+ {
+ name: 'OAuth with PKCE flow for SSR',
+ url: '/guides/auth/server-side/oauth-with-pkce-flow-for-ssr',
+ },
+ ],
+ },
+ {
+ name: 'Auth UI',
+ url: undefined,
+ items: [
+ { name: 'Auth UI', url: '/guides/auth/auth-helpers/auth-ui' },
+ { name: 'Flutter Auth UI', url: '/guides/auth/auth-helpers/flutter-auth-ui' },
],
},
{
@@ -923,7 +941,18 @@ export const storage: NavMenuConstant = {
],
}
-export const ai: NavMenuConstant = {
+export const vectorIndexItems = [
+ {
+ name: 'HNSW indexes',
+ url: '/guides/ai/vector-indexes/hnsw-indexes',
+ },
+ {
+ name: 'IVFFlat indexes',
+ url: '/guides/ai/vector-indexes/ivf-indexes',
+ },
+]
+
+export const ai = {
icon: 'ai',
title: 'AI & Vectors',
url: '/guides/ai',
@@ -935,61 +964,34 @@ export const ai: NavMenuConstant = {
url: '/guides/ai/structured-unstructured',
},
{
- name: 'Quickstarts',
+ name: 'Learn',
url: undefined,
items: [
- { name: 'Developing locally with Vecs', url: '/guides/ai/vecs-python-client' },
- { name: 'Creating and managing collections', url: '/guides/ai/quickstarts/hello-world' },
- {
- name: 'Generate Embeddings',
- url: '/guides/ai/quickstarts/generate-text-embeddings',
- },
- { name: 'Text Deduplication', url: '/guides/ai/quickstarts/text-deduplication' },
- { name: 'Face similarity search', url: '/guides/ai/quickstarts/face-similarity' },
- ],
- },
- {
- name: 'Python Client',
- url: undefined,
- items: [
- { name: 'API', url: '/guides/ai/python/api' },
- { name: 'Collections', url: '/guides/ai/python/collections' },
- { name: 'Indexes', url: '/guides/ai/python/indexes' },
- { name: 'Metadata', url: '/guides/ai/python/metadata' },
- ],
- },
- {
- name: 'Guides',
- url: undefined,
- items: [
- { name: 'Managing collections', url: '/guides/ai/managing-collections' },
- { name: 'Managing indexes', url: '/guides/ai/managing-indexes' },
{ name: 'Vector columns', url: '/guides/ai/vector-columns' },
+ { name: 'Vector indexes', url: '/guides/ai/vector-indexes', items: vectorIndexItems },
{ name: 'Engineering for scale', url: '/guides/ai/engineering-for-scale' },
{ name: 'Choosing Compute Add-on', url: '/guides/ai/choosing-compute-addon' },
{ name: 'Going to Production', url: '/guides/ai/going-to-prod' },
],
},
{
- name: 'Examples',
+ name: 'JavaScript Examples',
url: undefined,
items: [
{
name: 'OpenAI completions using Edge Functions',
url: '/guides/ai/examples/openai',
},
- {
- name: 'Image search with OpenAI CLIP',
- url: '/guides/ai/examples/image-search-openai-clip',
- },
+
{
name: 'Generate image captions using Hugging Face',
url: '/guides/ai/examples/huggingface-image-captioning',
},
{
- name: 'Building ChatGPT Plugins',
- url: '/guides/ai/examples/building-chatgpt-plugins',
+ name: 'Generate Embeddings',
+ url: '/guides/ai/quickstarts/generate-text-embeddings',
},
+
{
name: 'Adding generative Q&A to your documentation',
url: '/guides/ai/examples/headless-vector-search',
@@ -1000,6 +1002,36 @@ export const ai: NavMenuConstant = {
},
],
},
+ {
+ name: 'Python Client',
+ url: undefined,
+ items: [
+ { name: 'Choosing a Client', url: '/guides/ai/python-clients' },
+ { name: 'API', url: '/guides/ai/python/api' },
+ { name: 'Collections', url: '/guides/ai/python/collections' },
+ { name: 'Indexes', url: '/guides/ai/python/indexes' },
+ { name: 'Metadata', url: '/guides/ai/python/metadata' },
+ ],
+ },
+ {
+ name: 'Python Examples',
+ url: undefined,
+ items: [
+ { name: 'Developing locally with Vecs', url: '/guides/ai/vecs-python-client' },
+ { name: 'Creating and managing collections', url: '/guides/ai/quickstarts/hello-world' },
+
+ { name: 'Text Deduplication', url: '/guides/ai/quickstarts/text-deduplication' },
+ { name: 'Face similarity search', url: '/guides/ai/quickstarts/face-similarity' },
+ {
+ name: 'Image search with OpenAI CLIP',
+ url: '/guides/ai/examples/image-search-openai-clip',
+ },
+ {
+ name: 'Building ChatGPT Plugins',
+ url: '/guides/ai/examples/building-chatgpt-plugins',
+ },
+ ],
+ },
{
name: 'Third-Party Tools',
url: undefined,
diff --git a/apps/docs/docs/ref/kotlin/installing.mdx b/apps/docs/docs/ref/kotlin/installing.mdx
index 72e10be54fd..07125a7c0ac 100644
--- a/apps/docs/docs/ref/kotlin/installing.mdx
+++ b/apps/docs/docs/ref/kotlin/installing.mdx
@@ -49,7 +49,7 @@ custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supab
- The available modules are: **gotrue-kt**, **realtime-kt**, **storage-kt**, **functions-kt**, **postgrest-kt** and **apollo-graphql**
+ The available modules are: **gotrue-kt**, **realtime-kt**, **storage-kt**, **functions-kt**, **postgrest-kt**, **apollo-graphql**, [**compose-auth**](https://github.com/supabase-community/supabase-kt/tree/master/plugins/ComposeAuth) and [**compose-auth-ui**](https://github.com/supabase-community/supabase-kt/tree/master/plugins/ComposeAuthUI)
When using multiple modules, you can also use the BOM dependency to ensure that all modules use the same version:
diff --git a/apps/docs/docs/ref/kotlin/introduction.mdx b/apps/docs/docs/ref/kotlin/introduction.mdx
index 914310ba347..35570b4d54f 100644
--- a/apps/docs/docs/ref/kotlin/introduction.mdx
+++ b/apps/docs/docs/ref/kotlin/introduction.mdx
@@ -16,23 +16,43 @@ hideTitle: true
This reference documents every object and method available in Supabase's Kotlin Multiplatform library, [supabase-kt](https://github.com/supabase-community/supabase-kt). You can use supabase-kt to interact with your Postgres database, listen to database changes, invoke Deno Edge Functions, build login and user management functionality, and manage large files.
-Supported Kotlin targets:
+Supported targets:
-| | **GoTrue** | **Realtime** | **Postgrest** | **Storage** | **Functions** | **Apollo-GraphQL** |
-| ------------------------------------------------------------------ | ---------- | ------------ | ------------- | ----------- | ------------- | ------------------ |
-| **JVM** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-| **Android** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-| **JS** _(Browser, NodeJS)_ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-| **IOS** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-| **tvOS** _(tvosArm64, tvosX64, tvosSimulatorArm64)_ 🚧 | ☑️ | ✅ | ✅ | ✅ | ✅ | ✅ |
-| **watchOS** _(watchosArm64, watchosX64, watchosSimulatorArm64)_ 🚧 | ☑️ | ✅ | ✅ | ✅ | ✅ | ✅ |
-| **MacOS** _(macosX64 & macosArm64)_ 🚧 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-| **Windows** _(mingwX64)_ 🚧 | ☑️ | ✅ | ✅ | ✅ | ✅ | ❌ |
-| **Linux** _(linuxX64)_ 🚧 | ☑️ | ✅ | ✅ | ✅ | ✅ | ❌ |
+| | **GoTrue** | **Realtime** | **Postgrest** | **Storage** | **Functions** | **Apollo-GraphQL** | **Compose Auth 🚧** | **Compose Auth UI 🚧** |
+| ----------- | ---------- | ------------ | ------------- | ----------- | ------------- | ------------------ | ------------------- | ---------------------- |
+| **JVM** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ☑️ | ✅ |
+| **Android** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
+| **JS** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ☑️ | ✅ |
+| **IOS** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
+| **tvOS** | ☑️ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
+| **watchOS** | ☑️ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
+| **MacOS** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
+| **Windows** | ☑️ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
+| **Linux** | ☑️ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
+
+In-depth Kotlin targets
+
+**iOS:** iosArm64, iosSimulatorArm64, iosX64
+
+**JS**: Browser, NodeJS
+
+**tvOS**: tvosArm64, tvosX64, tvosSimulatorArm64
+
+**watchOS**: watchosArm64, watchosX64, watchosSimulatorArm64
+
+**MacOS**: macosX64, macosArm64
+
+**Windows**: mingwX64
+
+**Linux**: linuxX64
+
+
+
+
+
+
+
+
+
+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.
+
+## When should you create HNSW indexes?
+
+HNSW should be your default choice when creating a vector index. Add the index when you don't need 100% accuracy and are willing to trade a small amount of accuracy for a lot of throughput.
+
+Unlike IVFFlat indexes, you are safe to build an HNSW index immediately after the table is created. HNSW indexes are based on graphs which inherently are not affected by the same limitations as IVFFlat. As new data is added to the table, the index will be filled automatically and the index structure will remain optimal.
+
+## Resources
+
+Read more about indexing on `pgvector`'s [GitHub page](https://github.com/pgvector/pgvector#indexing).
+
+export const Page = ({ children }) => Follow this link to confirm your user:
+ +``` + +**Invite user template** + +```html ++ You have been invited to create a user on {{ .SiteURL }}. Follow this link to accept the invite: +
+ + +``` + +**Magic Link template** + +```html +Follow this link to login:
+ +``` + +**Change Email Address template** + +```html +Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}:
+ +``` + +**Reset Password template** + +```html +Follow this link to reset the password for your user:
++ Reset Password +
+``` + +export const Page = ({ children }) =>