- We're changing the way our AI Assistant integrates with the dashboard by making it shared
- and accessible universally across the whole dashboard. This hopes to make using the
- Assistant as a supporting tool more seamless while you build your project.
-
-
-
- The Assistant will also be automatically provided with contexts depending on where you are
- in the dashboard to generate more relevant and higher quality outputs. You may also ask for
- insights on your own data apart from help with SQL and Postgres!
-
-
- We believe that this should further lower the barrier of working with databases especially
- if you're not well acquainted with Postgres (yet!), so please do feel free to let us know
- what you think in the attached GitHub discussion above!
-
-
-
Enabling this preview will:
-
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx
index 03ef6fa224fe8..2d897e8b14e8b 100644
--- a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx
+++ b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx
@@ -5,16 +5,8 @@ import { LOCAL_STORAGE_KEYS } from 'lib/constants'
import { EMPTY_OBJ } from 'lib/void'
import { APISidePanelPreview } from './APISidePanelPreview'
import { CLSPreview } from './CLSPreview'
-import { AssistantV2Preview } from './AssistantV2Preview'
export const FEATURE_PREVIEWS = [
- {
- key: LOCAL_STORAGE_KEYS.UI_PREVIEW_ASSISTANT_V2,
- name: 'Supabase AI Assistant V2',
- content: ,
- discussionsUrl: undefined,
- isNew: true,
- },
{
key: LOCAL_STORAGE_KEYS.UI_PREVIEW_API_SIDE_PANEL,
name: 'Project API documentation',
@@ -85,8 +77,3 @@ export const useIsColumnLevelPrivilegesEnabled = () => {
const { flags } = useFeaturePreviewContext()
return flags[LOCAL_STORAGE_KEYS.UI_PREVIEW_CLS]
}
-
-export const useIsAssistantV2Enabled = () => {
- const { flags } = useFeaturePreviewContext()
- return flags[LOCAL_STORAGE_KEYS.UI_PREVIEW_ASSISTANT_V2]
-}
diff --git a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx
index 01c76d6799764..c04cdd98f6646 100644
--- a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx
+++ b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx
@@ -4,7 +4,6 @@ import { useEffect, useState } from 'react'
import { useSendEventMutation } from 'data/telemetry/send-event-mutation'
import { useFlag } from 'hooks/ui/useFlag'
-import { LOCAL_STORAGE_KEYS } from 'lib/constants'
import { TELEMETRY_EVENTS } from 'lib/constants/telemetry'
import { useAppStateSnapshot } from 'state/app-state'
import { Badge, Button, Modal, ScrollArea, cn } from 'ui'
@@ -42,13 +41,6 @@ const FeaturePreviewModal = () => {
label: selectedFeatureKey,
value: isSelectedFeatureEnabled ? 'disabled' : 'enabled',
})
-
- if (
- selectedFeatureKey === LOCAL_STORAGE_KEYS.UI_PREVIEW_ASSISTANT_V2 &&
- isSelectedFeatureEnabled
- ) {
- snap.setAiAssistantPanel({ open: false })
- }
}
function handleCloseFeaturePreviewModal() {
diff --git a/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/QueryError.tsx b/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/QueryError.tsx
index 8faa934e5634f..0ac3fa00896d8 100644
--- a/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/QueryError.tsx
+++ b/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/QueryError.tsx
@@ -72,7 +72,8 @@ const QueryError = ({
{open ? 'Hide error details' : 'Show error details'}
- {!hasHipaaAddon && (
+ {/* [Joshen] Temp hidden as new assistant doesnt support this. Current assistant's UX is not great too tbh so okay to hide this */}
+ {/* {!hasHipaaAddon && (
- )}
+ )} */}
{formattedError.length > 0 ? (
diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx
index f0c174e11e756..22c4bb7e25295 100644
--- a/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx
+++ b/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx
@@ -1,13 +1,14 @@
import type { PostgresPolicy } from '@supabase/postgres-meta'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { noop } from 'lodash'
+import { Edit, MoreVertical, Trash } from 'lucide-react'
import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext'
import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip'
import Panel from 'components/ui/Panel'
import { useAuthConfigQuery } from 'data/auth/auth-config-query'
import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
-import { Edit, MoreVertical, Trash } from 'lucide-react'
+import { useAppStateSnapshot } from 'state/app-state'
import {
Badge,
Button,
@@ -21,8 +22,6 @@ import {
TooltipContent_Shadcn_,
TooltipTrigger_Shadcn_,
} from 'ui'
-import { useIsAssistantV2Enabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext'
-import { useAppStateSnapshot } from 'state/app-state'
import { generatePolicyCreateSQL } from './PolicyTableRow.utils'
interface PolicyRowProps {
@@ -39,7 +38,6 @@ const PolicyRow = ({
onSelectDeletePolicy = noop,
}: PolicyRowProps) => {
const { setAiAssistantPanel } = useAppStateSnapshot()
- const isAssistantV2Enabled = useIsAssistantV2Enabled()
const canUpdatePolicies = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'policies')
const { project } = useProjectContext()
@@ -106,39 +104,33 @@ const PolicyRow = ({
} />
-
+ onSelectEditPolicy(policy)}>
Edit policy
- {isAssistantV2Enabled && (
- {
- const sql = generatePolicyCreateSQL(policy)
- setAiAssistantPanel({
- open: true,
- sqlSnippets: [sql],
- initialInput: `Update the policy with name "${policy.name}" in the ${policy.schema} schema on the ${policy.table} table. It should...`,
- suggestions: {
- title: `I can help you make a change to the policy "${policy.name}" in the ${policy.schema} schema on the ${policy.table} table, here are a few example prompts to get you started:`,
- prompts: [
- 'Tell me how I can improve this policy...',
- 'Duplicate this policy for another table...',
- 'Add extra conditions to this policy...',
- ],
- },
- })
- }}
- >
-
-
Edit policy with Assistant
-
- )}
+ {
+ const sql = generatePolicyCreateSQL(policy)
+ setAiAssistantPanel({
+ open: true,
+ sqlSnippets: [sql],
+ initialInput: `Update the policy with name "${policy.name}" in the ${policy.schema} schema on the ${policy.table} table. It should...`,
+ suggestions: {
+ title: `I can help you make a change to the policy "${policy.name}" in the ${policy.schema} schema on the ${policy.table} table, here are a few example prompts to get you started:`,
+ prompts: [
+ 'Tell me how I can improve this policy...',
+ 'Duplicate this policy for another table...',
+ 'Add extra conditions to this policy...',
+ ],
+ },
+ })
+ }}
+ >
+
+
Edit policy with Assistant
+ {
- if (enableAssistantV2) {
- setAiAssistantPanel({
- open: true,
- initialInput: `Create a new policy for the ${table.schema} schema on the ${table.name} table that ...`,
- })
- } else {
- onSelectCreatePolicy()
- setEditView('conversation')
- }
+ setAiAssistantPanel({
+ open: true,
+ initialInput: `Create a new policy for the ${table.schema} schema on the ${table.name} table that ...`,
+ })
}}
tooltip={{
content: {
diff --git a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx
index 4bb65cd597976..7fef92e064d4b 100644
--- a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx
+++ b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx
@@ -11,14 +11,12 @@ import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
import { useAppStateSnapshot } from 'state/app-state'
import {
Button,
- cn,
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from 'ui'
-import { useIsAssistantV2Enabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext'
interface FunctionListProps {
schema: string
@@ -38,7 +36,6 @@ const FunctionList = ({
const router = useRouter()
const { project: selectedProject } = useProjectContext()
const { setAiAssistantPanel } = useAppStateSnapshot()
- const isAssistantV2Enabled = useIsAssistantV2Enabled()
const { data: functions } = useDatabaseFunctionsQuery({
projectRef: selectedProject?.ref,
@@ -111,10 +108,7 @@ const FunctionList = ({
} />
-
+
{isApiDocumentAvailable && (
Edit function
- {isAssistantV2Enabled && (
- {
- setAiAssistantPanel({
- open: true,
- initialInput: 'Update this function to do...',
- suggestions: {
- title:
- 'I can help you make a change to this function, here are a few example prompts to get you started:',
- prompts: [
- 'Rename this function to ...',
- 'Modify this function so that it ...',
- 'Add a trigger for this function that calls it when ...',
- ],
- },
- sqlSnippets: [x.complete_statement],
- })
- }}
- >
-
-
Edit function with Assistant
-
- )}
+ {
+ setAiAssistantPanel({
+ open: true,
+ initialInput: 'Update this function to do...',
+ suggestions: {
+ title:
+ 'I can help you make a change to this function, here are a few example prompts to get you started:',
+ prompts: [
+ 'Rename this function to ...',
+ 'Modify this function so that it ...',
+ 'Add a trigger for this function that calls it when ...',
+ ],
+ },
+ sqlSnippets: [x.complete_statement],
+ })
+ }}
+ >
+
+
Edit function with Assistant
+ deleteFunction(x)}>
diff --git a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx
index bc11bf2eccd7c..3f6010f3dfd54 100644
--- a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx
+++ b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx
@@ -5,7 +5,6 @@ import { Search } from 'lucide-react'
import { useRouter } from 'next/router'
import { useParams } from 'common'
-import { useIsAssistantV2Enabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext'
import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext'
import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState'
import Table from 'components/to-be-cleaned/Table'
@@ -38,7 +37,6 @@ const FunctionsList = ({
const { search } = useParams()
const { project } = useProjectContext()
const { setAiAssistantPanel } = useAppStateSnapshot()
- const isAssistantV2Enabled = useIsAssistantV2Enabled()
const { selectedSchema, setSelectedSchema } = useQuerySchemaState()
const filterString = search ?? ''
@@ -144,28 +142,26 @@ const FunctionsList = ({
>
Create a new function
- {isAssistantV2Enabled && (
- }
- onClick={() =>
- setAiAssistantPanel({
- open: true,
- initialInput: `Create a new function for the schema ${selectedSchema} that does ...`,
- })
- }
- tooltip={{
- content: {
- side: 'bottom',
- text: !canCreateFunctions
- ? 'You need additional permissions to create functions'
- : 'Create with Supabase Assistant',
- },
- }}
- />
- )}
+ }
+ onClick={() =>
+ setAiAssistantPanel({
+ open: true,
+ initialInput: `Create a new function for the schema ${selectedSchema} that does ...`,
+ })
+ }
+ tooltip={{
+ content: {
+ side: 'bottom',
+ text: !canCreateFunctions
+ ? 'You need additional permissions to create functions'
+ : 'Create with Supabase Assistant',
+ },
+ }}
+ />
>
)}
diff --git a/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx b/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx
index 8ca577424c5eb..58c8282bcfdb5 100644
--- a/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx
+++ b/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx
@@ -1,6 +1,13 @@
-import * as Tooltip from '@radix-ui/react-tooltip'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { includes, sortBy } from 'lodash'
+import { Check, Edit, Edit2, MoreVertical, Trash, X } from 'lucide-react'
+
+import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext'
+import Table from 'components/to-be-cleaned/Table'
+import { ButtonTooltip } from 'components/ui/ButtonTooltip'
+import { useDatabaseTriggersQuery } from 'data/database-triggers/database-triggers-query'
+import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
+import { useAppStateSnapshot } from 'state/app-state'
import {
Badge,
Button,
@@ -12,15 +19,6 @@ import {
TooltipContent_Shadcn_,
TooltipTrigger_Shadcn_,
} from 'ui'
-
-import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext'
-import Table from 'components/to-be-cleaned/Table'
-import { useDatabaseTriggersQuery } from 'data/database-triggers/database-triggers-query'
-import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
-import { Check, X, MoreVertical, Edit3, Trash, Edit, Edit2 } from 'lucide-react'
-import { useAppStateSnapshot } from 'state/app-state'
-import { useIsAssistantV2Enabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext'
-import { cn } from 'ui'
import { generateTriggerCreateSQL } from './TriggerList.utils'
interface TriggerListProps {
@@ -40,7 +38,6 @@ const TriggerList = ({
}: TriggerListProps) => {
const { project } = useProjectContext()
const { setAiAssistantPanel } = useAppStateSnapshot()
- const isAssistantV2Enabled = useIsAssistantV2Enabled()
const { data: triggers } = useDatabaseTriggersQuery({
projectRef: project?.ref,
@@ -141,40 +138,34 @@ const TriggerList = ({
} />
-
+ editTrigger(x)}>
Edit trigger
- {isAssistantV2Enabled && (
- {
- const sql = generateTriggerCreateSQL(x)
- setAiAssistantPanel({
- open: true,
- initialInput: `Update this trigger which exists on the ${x.schema}.${x.table} table to...`,
- suggestions: {
- title:
- 'I can help you make a change to this trigger, here are a few example prompts to get you started:',
- prompts: [
- 'Rename this trigger to ...',
- 'Change the events this trigger responds to ...',
- 'Modify this trigger to run after instead of before ...',
- ],
- },
- sqlSnippets: [sql],
- })
- }}
- >
-
-
Edit with Assistant
-
- )}
+ {
+ const sql = generateTriggerCreateSQL(x)
+ setAiAssistantPanel({
+ open: true,
+ initialInput: `Update this trigger which exists on the ${x.schema}.${x.table} table to...`,
+ suggestions: {
+ title:
+ 'I can help you make a change to this trigger, here are a few example prompts to get you started:',
+ prompts: [
+ 'Rename this trigger to ...',
+ 'Change the events this trigger responds to ...',
+ 'Modify this trigger to run after instead of before ...',
+ ],
+ },
+ sqlSnippets: [sql],
+ })
+ }}
+ >
+
+
- }
- >
- Search
-
- ) : (
+ const CommandButton = (
window.removeEventListener('keydown', handler)
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isAssistantV2Enabled, open])
+ }, [open])
return (
diff --git a/apps/studio/components/layouts/ProjectSettingsLayout/SettingsMenu.utils.tsx b/apps/studio/components/layouts/ProjectSettingsLayout/SettingsMenu.utils.tsx
index 45479064d21a5..186d457763a60 100644
--- a/apps/studio/components/layouts/ProjectSettingsLayout/SettingsMenu.utils.tsx
+++ b/apps/studio/components/layouts/ProjectSettingsLayout/SettingsMenu.utils.tsx
@@ -77,7 +77,7 @@ export const generateSettingsMenu = (
url: isProjectBuilding ? buildingUrl : `/project/${ref}/integrations/vault/overview`,
items: [],
rightIcon: ,
- label: 'BETA',
+ label: 'Alpha',
},
],
},
diff --git a/apps/studio/lib/constants/index.ts b/apps/studio/lib/constants/index.ts
index bfca4e0614c49..efffcd60df183 100644
--- a/apps/studio/lib/constants/index.ts
+++ b/apps/studio/lib/constants/index.ts
@@ -33,7 +33,6 @@ export const LOCAL_STORAGE_KEYS = {
UI_PREVIEW_NAVIGATION_LAYOUT: 'supabase-ui-preview-nav-layout',
UI_PREVIEW_API_SIDE_PANEL: 'supabase-ui-api-side-panel',
UI_PREVIEW_CLS: 'supabase-ui-cls',
- UI_PREVIEW_ASSISTANT_V2: 'supabase-ui-assistant-v2',
UI_ONBOARDING_NEW_PAGE_SHOWN: 'supabase-ui-onboarding-new-page-shown',
SQL_SCRATCH_PAD_BANNER_ACKNOWLEDGED: 'supabase-sql-scratch-pad-banner-acknowledged',
diff --git a/apps/studio/next.config.js b/apps/studio/next.config.js
index 2b2f4e7a15ba7..2deaf3ead2e90 100644
--- a/apps/studio/next.config.js
+++ b/apps/studio/next.config.js
@@ -429,6 +429,11 @@ const nextConfig = {
source: '/project/:ref/settings/vault/keys',
destination: '/project/:ref/integrations/vault/keys',
},
+ {
+ permanent: true,
+ source: '/project/:ref/integrations/cron-jobs',
+ destination: '/project/:ref/integrations/cron',
+ },
...(process.env.NEXT_PUBLIC_BASE_PATH?.length
? [
{
diff --git a/apps/studio/pages/project/[ref]/auth/policies.tsx b/apps/studio/pages/project/[ref]/auth/policies.tsx
index b6e38e3e40d31..2db8fb416a560 100644
--- a/apps/studio/pages/project/[ref]/auth/policies.tsx
+++ b/apps/studio/pages/project/[ref]/auth/policies.tsx
@@ -4,7 +4,6 @@ import { partition } from 'lodash'
import { Search } from 'lucide-react'
import { useState } from 'react'
-import { useIsAssistantV2Enabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext'
import { AIPolicyEditorPanel } from 'components/interfaces/Auth/Policies/AIPolicyEditorPanel'
import Policies from 'components/interfaces/Auth/Policies/Policies'
import AuthLayout from 'components/layouts/AuthLayout/AuthLayout'
@@ -20,7 +19,6 @@ import { useTablesQuery } from 'data/tables/tables-query'
import { useCheckPermissions, usePermissionsLoaded } from 'hooks/misc/useCheckPermissions'
import { useUrlState } from 'hooks/ui/useUrlState'
import { PROTECTED_SCHEMAS } from 'lib/constants/schemas'
-import { useAppStateSnapshot } from 'state/app-state'
import type { NextPageWithLayout } from 'types'
import { Input } from 'ui'
@@ -66,8 +64,6 @@ const AuthPoliciesPage: NextPageWithLayout = () => {
}>()
const { schema = 'public', search: searchString = '' } = params
const { project } = useProjectContext()
- const isAssistantV2Enabled = useIsAssistantV2Enabled()
- const { setAiAssistantPanel } = useAppStateSnapshot()
const [selectedTable, setSelectedTable] = useState()
const [showPolicyAiEditor, setShowPolicyAiEditor] = useState(false)
diff --git a/apps/www/_blog/2024-12-01-orioledb-launch.mdx b/apps/www/_blog/2024-12-01-orioledb-launch.mdx
index e07df745d5b65..63df6484446c0 100644
--- a/apps/www/_blog/2024-12-01-orioledb-launch.mdx
+++ b/apps/www/_blog/2024-12-01-orioledb-launch.mdx
@@ -28,7 +28,6 @@ This initial release is a Public Alpha and you should _not_ use it for Productio
- The release is restricted to Free organizations. You will not be able to upgrade OrioleDB projects to larger instance sizes. If you want to run OrioleDB on a larger instance we suggest following the [Getting Started](https://www.orioledb.com/docs/usage/getting-started) guide on OrioleDB’s official website.
- Index support is restricted to the Postgres default B-Tree index type. Other indexs like GIN/GiST/BRIN/Hash, and pgvector's HNSW/IVFFlat are not supported.
-- No support for Supabase Realtime Postgres Changes. Realtime Broadcast and Presence will continue to work.
### Should you use it today?
diff --git a/apps/www/_blog/2024-12-02-supabase-ai-assistant-v2.mdx b/apps/www/_blog/2024-12-02-supabase-ai-assistant-v2.mdx
new file mode 100644
index 0000000000000..52258b76c352a
--- /dev/null
+++ b/apps/www/_blog/2024-12-02-supabase-ai-assistant-v2.mdx
@@ -0,0 +1,109 @@
+---
+title: 'Supabase AI Assistant v2'
+description: An evolution of how we approach AI within the Supabase dashboard
+author: saxon_fletcher,joshenlim
+image: launch-week-13/day-1-ai-assistant-v2/og.jpg
+thumb: launch-week-13/day-1-ai-assistant-v2/thumb.jpg
+categories:
+ - developers
+ - postgres
+tags:
+ - AI
+ - postgres
+date: '2024-12-02'
+toc_depth: 3
+---
+
+Today we are releasing Supabase Assistant v2 in the Dashboard - a global assistant with several new abilities:
+
+1. Postgres schema design
+1. Data queries and charting
+1. Error debugging
+1. Postgres RLS Policies: create and edit
+1. Postgres Functions: create and edit
+1. Postgres Triggers: create and edit
+1. SQL to `supabase-js` conversion
+
+
+
+
+
+## A new, unified approach to AI
+
+Our new Assistant is more extensible, using a flexible system of components, tools, and APIs. You can provide context manually (e.g. an RLS Policy) or automatically based on whichever page you're visiting in the Dashboard (e.g. the specific table you're working on).
+
+The result is a single panel that's persistent across the entire Dashboard. It sits alongside your workspace and can be called upon when needed (`cmd+i`!). It automatically retrieves context for your prompt and can be provided with extra context similar to other AI tools like Cursor and GitHub Copilot.
+
+## New abilities in Supabase Assistant v2
+
+Let's take a look at new abilities in this release.
+
+### Schema design
+
+If you are creating something new, the Assistant can guide or inspire you. It will show you how to structure your database and generate all the SQL queries to set it up.
+
+
+
+### Writing SQL
+
+Like our previous Assistant, the new Assistant will help you write queries based on your schema. This version has better contextual understanding and can provide more accurate suggestions.
+
+### Debug your queries
+
+Writing SQL can be tough. You can use the new Assistant to debug database errors directly through the SQL Editor or within the Assistant panel.
+
+
+
+### Discover data insights
+
+The new Assistant can run queries directly. This can be a useful (and fun) way to query your data through natural language. Basic select queries run automatically, and results are displayed within the conversation in tabular form or chart form. The chart axis are picked intuitively by the Assistant. No data is sent to the underlying LLM, only your schema structure. This is a helpful tool for folks who are not comfortable with SQL but are still interested in analyzing data insights.
+
+
+
+### SQL to REST
+
+Once your database is set up, you probably want to connect to it directly or with one of our client libraries. If you're using our `supabase-js` library, we've added a helpful tool to convert an SQL query to supabase-js client code. Simply ask the Assistant to convert a query, and it will respond with either a complete snippet for you to copy or a combination of function + RPC call. This is powered by the [sql-to-rest](/docs/guides/api/sql-to-rest) tool.
+
+
+
+### RLS Policies: Protect your database
+
+Use the Assistant to suggest, create or modify RLS Policies. Simply explain the desired behavior and the Assistant will generate a new Policy using the context of your database schema and existing policies. To edit an existing policy, click “edit with Assistant” within your Policy list. The Assistant will be provided the appropriate context for you to start prompting.
+
+
+
+### Postgres Functions and Triggers
+
+Suggest, create or update functions and triggers in a similar way to policies. Just describe what you want or select “Edit with Assistant” from your Function or Trigger list.
+
+
+
+## Feedback
+
+This release gives us a foundation to build off and incorporate into other parts of your database journey. Where are you struggling the most when using Postgres? How might the Assistant help you? Send us your thoughts, ideas, concerns via the feedback form in the Dashboard.
+
+## How to access
+
+Supabase Assistant v2 is available today.
+Go to a Project and hit `cmd + i`, or alternatively click the Assistant icon in the top right toolbar.
diff --git a/apps/www/components/Announcement/data/Announcement.json b/apps/www/components/Announcement/data/Announcement.json
index abb5cec836297..7cce453492dd8 100644
--- a/apps/www/components/Announcement/data/Announcement.json
+++ b/apps/www/components/Announcement/data/Announcement.json
@@ -1,7 +1,7 @@
{
"show": true,
- "text": "Supabase Launch Week 8",
+ "text": "Supabase Launch Week 13: Day 1",
"launchDate": "2023-08-07T09:00:00.000-07:00",
- "link": "https://supabase.com/launch-week",
+ "link": "https://supabase.com/launch-week#day-1",
"badge": "Get your ticket"
}
diff --git a/apps/www/components/Hero/Hero.tsx b/apps/www/components/Hero/Hero.tsx
index b8714b4edd71a..f89ca9a8ce636 100644
--- a/apps/www/components/Hero/Hero.tsx
+++ b/apps/www/components/Hero/Hero.tsx
@@ -25,9 +25,9 @@ const Hero = () => {
- {isPartyMode ? : }
+
{hasTicket && (
)}
>
diff --git a/apps/www/components/svg-icons.tsx b/apps/www/components/svg-icons.tsx
new file mode 100644
index 0000000000000..4994593683b55
--- /dev/null
+++ b/apps/www/components/svg-icons.tsx
@@ -0,0 +1,88 @@
+export const JsIcon = (props: any) => (
+
+)
+export const FlutterIcon = (props: any) => (
+
+)
+export const SwiftIcon = (props: any) => (
+
+)
+export const PythonIcon = (props: any) => (
+
+)
diff --git a/apps/www/data/features.tsx b/apps/www/data/features.tsx
index 9b951aae35fc2..7aac3f8e207c1 100644
--- a/apps/www/data/features.tsx
+++ b/apps/www/data/features.tsx
@@ -1,44 +1,56 @@
+import { FunctionComponent } from 'react'
import {
+ Activity,
+ BarChart,
+ Braces,
+ Brain,
ChartScatter,
+ Cloud,
Database,
+ DatabaseBackup,
+ DatabaseZap,
+ Eye,
FileCode2,
- Lock,
- Cloud,
- UploadCloud,
+ Folders,
+ GitBranch,
+ Globe,
Image,
+ Lock,
+ Mail,
MessageCircle,
- ShieldCheck,
Package,
- Users,
- Folders,
+ Puzzle,
RectangleEllipsis,
- Braces,
- Globe,
- UserX,
- GitBranch,
- DatabaseZap,
- Mail,
- Smartphone,
Server,
- Activity,
- BarChart,
- Brain,
- Puzzle,
- DatabaseBackup,
+ Shield,
+ ShieldCheck,
ShieldPlus,
+ Smartphone,
Terminal,
+ UploadCloud,
+ Users,
+ UserX,
Zap,
} from 'lucide-react'
+import { FlutterIcon, JsIcon, PythonIcon, SwiftIcon } from '~/components/svg-icons'
import { PRODUCT, PRODUCT_SHORTNAMES } from 'shared-data/products'
import type { LucideIcon } from 'lucide-react'
enum ADDITIONAL_PRODUCTS {
- PLATFORM = 'platform management',
+ PLATFORM = 'platform',
STUDIO = 'studio',
}
export type FeatureProductType = PRODUCT | ADDITIONAL_PRODUCTS
+export enum PRODUCT_STAGES {
+ PRIVATE_ALPHA = 'Private Alpha',
+ PUBLIC_ALPHA = 'Public Alpha',
+ BETA = 'Beta',
+ PUBLIC_BETA = 'Public Beta',
+ GA = 'General Availability',
+}
+
export type FeatureType = {
/**
* name of the feature
@@ -59,7 +71,7 @@ export type FeatureType = {
/**
* icon will be displayed in the feature card
*/
- icon: string | LucideIcon
+ icon: string | LucideIcon | FunctionComponent
/**
* Each feature belongs to one or more products
*/
@@ -79,6 +91,17 @@ export type FeatureType = {
* url to docs or blog page for this feature
*/
docsUrl?: string
+ /**
+ * feature metadata on its status
+ */
+ status?: {
+ stage: PRODUCT_STAGES
+ availableOnSelfHosted: boolean
+ selfHostedTooling?: {
+ label: string
+ link: string
+ }
+ }
}
export const features: FeatureType[] = [
@@ -106,6 +129,10 @@ It's 100% portable, which means you can easily migrate your data to and from oth
heroImageLight: '/images/features/postgres-database-light.png',
docsUrl: 'https://supabase.com/docs/guides/database/overview',
slug: 'postgres-database',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Vector database',
@@ -127,6 +154,10 @@ Supabase provides an open source toolkit for developing AI applications using Po
heroImage: 'https://www.youtube-nocookie.com/embed/ibzlEQmgPPY',
docsUrl: 'https://supabase.com/docs/guides/ai',
slug: 'vector-database',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Auto-generated REST API via PostgREST',
@@ -149,6 +180,10 @@ Supabase automatically generates a comprehensive RESTful API from your database
heroImageLight: '/images/features/auto-generated-rest-api-light.png',
docsUrl: 'https://supabase.com/docs/guides/api#rest-api-overview',
slug: 'auto-generated-rest-api',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Auto-generated GraphQL API via pg_graphql',
@@ -178,6 +213,10 @@ Supabase offers lightning-fast GraphQL APIs through its custom-built Postgres Gr
heroImageLight: '/images/features/auto-generated-graphql-api-light.png',
docsUrl: 'https://supabase.com/docs/guides/graphql/api',
slug: 'auto-generated-graphql-api',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Database backups',
@@ -213,6 +252,14 @@ Supabase's backup solutions provide a balance of security, flexibility, and ease
heroImageLight: '/images/features/backups-light.png',
docsUrl: 'https://supabase.com/docs/guides/platform/backups',
slug: 'database-backups',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ selfHostedTooling: {
+ label: 'wal-g',
+ link: 'https://github.com/wal-g/wal-g',
+ },
+ },
},
{
title: 'Custom domains',
@@ -238,6 +285,10 @@ By using custom domains, you create a more cohesive brand experience and gain fl
heroImageLight: '/images/features/custom-domains-light.png',
docsUrl: 'https://supabase.com/docs/guides/platform/custom-domains',
slug: 'custom-domains',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: false,
+ },
},
{
title: 'Network restrictions',
@@ -271,6 +322,10 @@ By implementing Network Restrictions, you create a more secure environment for y
heroImageLight: '/images/features/network-restrictions-light.png',
docsUrl: 'https://supabase.com/docs/guides/platform/network-restrictions',
slug: 'network-restrictions',
+ status: {
+ stage: PRODUCT_STAGES.BETA,
+ availableOnSelfHosted: false,
+ },
},
{
title: 'SSL enforcement',
@@ -306,6 +361,10 @@ By enabling SSL Enforcement, you implement a fundamental best practice in data p
heroImageLight: '/images/features/ssl-enforcement-light.png',
docsUrl: 'https://supabase.com/docs/guides/platform/ssl-enforcement',
slug: 'ssl-enforcement',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: false,
+ },
},
{
title: 'Branching',
@@ -338,6 +397,10 @@ Supabase Branching allows you to create and test changes in separate, temporary
heroImageLight: '/images/features/branching-light.png',
docsUrl: 'https://supabase.com/docs/guides/platform/branching',
slug: 'branching',
+ status: {
+ stage: PRODUCT_STAGES.PUBLIC_ALPHA,
+ availableOnSelfHosted: false,
+ },
},
{
title: 'Terraform provider',
@@ -374,6 +437,10 @@ By adopting the Supabase Terraform provider, teams can implement GitOps practice
heroImageLight: '/images/features/terraform-provider-light.png',
docsUrl: 'https://supabase.com/docs/guides/deployment/terraform',
slug: 'terraform-provider',
+ status: {
+ stage: PRODUCT_STAGES.PUBLIC_ALPHA,
+ availableOnSelfHosted: false,
+ },
},
{
title: 'Read replicas',
@@ -409,6 +476,10 @@ By leveraging Read Replicas, you can achieve consistent low-latency performance
heroImage: 'https://www.youtube-nocookie.com/embed/PX3R1fXjJ2M',
docsUrl: 'https://supabase.com/docs/guides/platform/read-replicas',
slug: 'read-replicas',
+ status: {
+ stage: PRODUCT_STAGES.PRIVATE_ALPHA,
+ availableOnSelfHosted: false,
+ },
},
{
title: 'Fly Postgres',
@@ -443,6 +514,10 @@ By leveraging Fly Postgres, you can achieve improved global performance for your
heroImage: '',
docsUrl: 'https://supabase.com/docs/guides/platform/fly-postgres',
slug: 'fly-postgres',
+ status: {
+ stage: PRODUCT_STAGES.PRIVATE_ALPHA,
+ availableOnSelfHosted: false,
+ },
},
{
title: 'Postgres Extensions',
@@ -483,6 +558,10 @@ By leveraging these extensions, you can implement complex features more easily,
heroImageLight: '/images/features/postgres-extensions-light.png',
docsUrl: 'https://supabase.com/docs/guides/database/extensions',
slug: 'postgres-extensions',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Database Webhooks',
@@ -505,6 +584,10 @@ This feature is particularly useful for developers looking to automate workflows
heroImageLight: '/images/features/database-webhooks-light.png',
docsUrl: 'https://supabase.com/docs/guides/database/webhooks',
slug: 'database-webhooks',
+ status: {
+ stage: PRODUCT_STAGES.BETA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Vault',
@@ -526,6 +609,10 @@ This feature is particularly useful for teams looking to enhance their security
heroImage: 'https://supabase.com/docs/img/guides/database/vault-hello-compressed.mp4',
docsUrl: 'https://supabase.com/docs/guides/database/vault',
slug: 'vault',
+ status: {
+ stage: PRODUCT_STAGES.PUBLIC_ALPHA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Supavisor',
@@ -547,10 +634,14 @@ This feature is particularly valuable for teams looking to optimize their databa
heroImage: 'https://www.youtube-nocookie.com/embed/ogYNmJOFEpk',
docsUrl: 'https://supabase.com/blog/supavisor-postgres-connection-pooler',
slug: 'supavisor',
+ status: {
+ stage: PRODUCT_STAGES.PUBLIC_BETA,
+ availableOnSelfHosted: true,
+ },
},
// Realtime
{
- title: 'Realtime Postgres changes',
+ title: 'Realtime - Postgres changes',
subtitle: 'Receive your database changes through websockets.',
description: `
Supabase's Realtime Postgres Changes feature allows you to listen to database changes in real-time using the Realtime system. This capability enables you to build responsive, live-updating applications that reflect database changes instantly.
@@ -582,9 +673,13 @@ Supabase's Realtime Postgres Changes feature provides a powerful tool for creati
heroImage: 'https://www.youtube-nocookie.com/embed/2rUjcmgZDwQ',
docsUrl: 'https://supabase.com/docs/guides/realtime/postgres-changes',
slug: 'realtime-postgres-changes',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
- title: 'Realtime Broadcast',
+ title: 'Realtime - Broadcast',
subtitle: 'Send messages between connected users through websockets.',
description: `
Supabase's Realtime Broadcast feature enables real-time communication between connected clients using the Realtime system. This functionality allows you to build interactive, collaborative applications where users can instantly share messages or data in real-time.
@@ -619,9 +714,13 @@ Supabase's Realtime Broadcast feature provides a powerful tool for creating resp
heroImage: 'https://www.youtube-nocookie.com/embed/BelYEMJ2N00',
docsUrl: 'https://supabase.com/docs/guides/realtime/broadcast',
slug: 'realtime-broadcast',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
- title: 'Realtime Presence',
+ title: 'Realtime - Presence',
subtitle: 'Synchronize shared state between users through websockets.',
description: `
Supabase's Realtime Presence feature allows you to track and synchronize shared state between connected users in real-time. This capability enables you to build collaborative applications where users can see each other's status, actions, or any custom state information instantly.
@@ -655,6 +754,59 @@ Supabase's Realtime Presence feature provides a powerful tool for creating inter
heroImage: 'https://www.youtube-nocookie.com/embed/BelYEMJ2N00',
docsUrl: 'https://supabase.com/docs/guides/realtime/presence',
slug: 'realtime-presence',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
+ },
+ {
+ title: 'Realtime - Broadcast Authorization',
+ subtitle: 'Control access to broadcast channels in real-time.',
+ description: `
+The Realtime Broadcast Authorization feature allows you to manage access permissions for broadcast channels in your application. This functionality ensures that only authorized users can listen to specific channels, enhancing security and control over real-time data streams.
+
+Key benefits:
+1. Secure Access Control: Implement fine-grained access control over who can receive broadcast messages in real-time.
+2. Customizable Permissions: Define specific authorization rules based on user roles or attributes.
+3. Enhanced User Experience: Ensure that users only receive relevant updates based on their permissions.
+4. Easy Integration with Existing Systems: Seamlessly integrate broadcast authorization into your current application architecture.
+5. Comprehensive Documentation Available: Access detailed guides on how to implement broadcast authorization effectively.
+
+This feature is particularly valuable for applications that require controlled access to live data streams, such as chat applications or collaborative tools.
+`,
+ icon: Shield,
+ products: [PRODUCT_SHORTNAMES.REALTIME, PRODUCT_SHORTNAMES.AUTHENTICATION],
+ heroImage: 'https://www.youtube-nocookie.com/embed/IXRrU9MpA8Q',
+ docsUrl: 'https://supabase.com/docs/guides/realtime/authorization#broadcast',
+ slug: 'realtime-broadcast-authorization',
+ status: {
+ stage: PRODUCT_STAGES.PUBLIC_BETA,
+ availableOnSelfHosted: true,
+ },
+ },
+ {
+ title: 'Realtime - Presence Authorization',
+ subtitle: 'Manage presence information securely in real-time.',
+ description: `
+The Realtime Presence Authorization feature enables you to control access permissions related to presence information in your application. This allows you to manage who can see the online status of other users in real-time, enhancing privacy and security within collaborative environments.
+
+Key benefits:
+1. Controlled Visibility of Presence Data: Ensure that only authorized users can view the online status of others, protecting user privacy.
+2. Customizable Presence Rules: Define specific rules based on user roles or attributes for who can see presence information.
+3. Improved User Experience: Enhance collaboration by providing relevant presence information while maintaining security protocols.
+4. Seamless Integration: Easily incorporate presence authorization into existing systems without significant overhead.
+5. Detailed Implementation Guides: Access comprehensive documentation on how to implement presence authorization effectively.
+
+This feature is particularly useful for collaborative applications where knowing the online status of team members is crucial while ensuring privacy and security are maintained.`,
+ icon: Eye,
+ products: [PRODUCT_SHORTNAMES.REALTIME, PRODUCT_SHORTNAMES.AUTHENTICATION],
+ heroImage: 'https://www.youtube-nocookie.com/embed/IXRrU9MpA8Q',
+ docsUrl: 'https://supabase.com/docs/guides/realtime/authorization#presence',
+ slug: 'realtime-presence-authorization',
+ status: {
+ stage: PRODUCT_STAGES.PUBLIC_BETA,
+ availableOnSelfHosted: true,
+ },
},
// Auth
{
@@ -691,6 +843,10 @@ Supabase's Email Login provides a robust foundation for user authentication, all
heroImageLight: '/images/features/email-login-light.png',
docsUrl: 'https://supabase.com/docs/guides/auth/passwords',
slug: 'email-login',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Social login',
@@ -726,6 +882,10 @@ Supabase's Social Login feature allows you to improve user experience and potent
heroImageLight: '/images/features/social-login-light.png',
docsUrl: 'https://supabase.com/docs/guides/auth/social-login',
slug: 'social-login',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Phone logins',
@@ -760,6 +920,10 @@ Supabase's Phone Login feature enables a seamless authentication experience, par
heroImageLight: '/images/features/phone-login-light.png',
docsUrl: 'https://supabase.com/docs/guides/auth/phone-login',
slug: 'phone-logins',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Passwordless login via Magic Links',
@@ -795,6 +959,10 @@ Supabase's Magic Links feature offers a secure and user-friendly authentication
heroImage: '',
docsUrl: 'https://supabase.com/docs/guides/auth/auth-email-passwordless',
slug: 'passwordless-login-via-magicklink',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Multi-Factor Authentication (MFA)',
@@ -830,6 +998,10 @@ Supabase's MFA feature provides a robust tool for enhancing application security
heroImage: '',
docsUrl: 'https://supabase.com/docs/guides/auth/auth-mfa',
slug: 'multi-factor-authentication',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Authorization via Row Level Security',
@@ -865,6 +1037,10 @@ Supabase's RLS feature provides a powerful tool for implementing sophisticated a
heroImage: `https://xguihxuzqibwxjnimxev.supabase.co/storage/v1/object/public/videos/marketing/website/supabase-rls.mp4`,
docsUrl: 'https://supabase.com/docs/guides/auth/row-level-security',
slug: 'row-level-security',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Captcha protection',
@@ -900,6 +1076,10 @@ Supabase's Captcha Protection feature provides a powerful tool for enhancing app
heroImageLight: '/images/features/auth-captcha-protection-light.png',
docsUrl: 'https://supabase.com/docs/guides/auth/auth-captcha',
slug: 'auth-captcha-protection',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Server-side Auth',
@@ -934,6 +1114,10 @@ Supabase's Server-side Auth feature allows developers to create more secure and
heroImage: '',
docsUrl: 'https://supabase.com/docs/guides/auth/server-side',
slug: 'server-side-auth',
+ status: {
+ stage: PRODUCT_STAGES.BETA,
+ availableOnSelfHosted: true,
+ },
},
// Storage
{
@@ -971,6 +1155,10 @@ Supabase Storage simplifies adding robust file management to your applications,
heroImageLight: '/images/features/file-storage-light.png',
docsUrl: 'https://supabase.com/docs/guides/storage',
slug: 'file-storage',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Content Delivery Network',
@@ -1006,6 +1194,14 @@ Supabase's CDN significantly improves the performance and user experience of you
heroImage: '',
docsUrl: 'https://supabase.com/docs/guides/storage/cdn',
slug: 'cdn',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ selfHostedTooling: {
+ label: 'Cloudflare',
+ link: 'https://www.cloudflare.com',
+ },
+ },
},
{
title: 'Smart Content Delivery Network',
@@ -1041,6 +1237,14 @@ Supabase's Smart CDN optimizes both performance and content accuracy, providing
heroImage: 'https://www.youtube-nocookie.com/embed/NpEl20iuOtg',
docsUrl: 'https://supabase.com/docs/guides/storage/cdn/smart-cdn',
slug: 'smart-cdn',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ selfHostedTooling: {
+ label: 'Cloudflare',
+ link: 'https://www.cloudflare.com',
+ },
+ },
},
{
title: 'Image transformations',
@@ -1077,6 +1281,10 @@ Supabase's Image Transformations feature enables you to efficiently manage and s
heroImage: 'https://www.youtube-nocookie.com/embed/dLqSmxX3r7I',
docsUrl: 'https://supabase.com/docs/guides/storage/image-transformations',
slug: 'image-transformations',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Resumable uploads',
@@ -1113,6 +1321,10 @@ Supabase's Resumable Uploads feature significantly improves the reliability and
heroImage: 'https://www.youtube-nocookie.com/embed/pT2PcZFq_M0',
docsUrl: 'https://supabase.com/docs/guides/storage/uploads/resumable-uploads',
slug: 'resumable-uploads',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'S3 compatibility',
@@ -1150,6 +1362,10 @@ Supabase's S3 compatibility allows seamless integration with existing workflows
heroImageLight: '/images/features/s3-compatibility-light.png',
docsUrl: 'https://supabase.com/docs/guides/storage/s3/compatibility',
slug: 's3-compatibility',
+ status: {
+ stage: PRODUCT_STAGES.PUBLIC_ALPHA,
+ availableOnSelfHosted: true,
+ },
},
// Functions
{
@@ -1189,6 +1405,10 @@ Supabase's Deno Edge Functions enable you to build responsive, globally distribu
heroImage: 'https://www.youtube-nocookie.com/embed/5OWH9c4u68M',
docsUrl: 'https://supabase.com/docs/guides/functions',
slug: 'deno-edge-functions',
+ status: {
+ stage: PRODUCT_STAGES.BETA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Regional invocations',
@@ -1220,6 +1440,10 @@ By leveraging Supabase's Regional Invocations, you can significantly enhance the
heroImage: '',
docsUrl: 'https://supabase.com/docs/guides/functions/regional-invocation',
slug: 'regional-invocations',
+ status: {
+ stage: PRODUCT_STAGES.BETA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'NPM compatibility',
@@ -1251,6 +1475,10 @@ By leveraging NPM Compatibility in Supabase Edge Functions, you can take advanta
heroImage: 'https://www.youtube-nocookie.com/embed/eCbiywoDORw',
docsUrl: 'https://supabase.com/blog/edge-functions-node-npm',
slug: 'npm-compatibility',
+ status: {
+ stage: PRODUCT_STAGES.BETA,
+ availableOnSelfHosted: true,
+ },
},
// Vector
{
@@ -1283,6 +1511,10 @@ By leveraging Supabase's AI Integrations, you can rapidly develop and deploy sop
heroImage: 'https://www.youtube-nocookie.com/embed/OgnYxRkxEUw',
docsUrl: 'https://supabase.com/docs/guides/ai/examples/huggingface-image-captioning',
slug: 'ai-integrations',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
// Platform
{
@@ -1316,6 +1548,10 @@ By leveraging the Supabase CLI, you can significantly improve your development w
docsUrl:
'https://supabase.com/docs/guides/local-development?queryGroups=package-manager&package-manager=pnpm',
slug: 'cli',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Management API',
@@ -1348,6 +1584,10 @@ By utilizing the Supabase Management API, you can create more efficient, scalabl
heroImageLight: '/images/features/management-api-light.png',
docsUrl: 'https://supabase.com/docs/guides/project-management/api',
slug: 'management-api',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Role-Based Access Control (RBAC)',
@@ -1380,6 +1620,10 @@ By leveraging Role-Based Access Control, you can create a secure, scalable, and
docsUrl:
'https://supabase.com/docs/guides/database/postgres/custom-claims-and-role-based-access-control-rbac',
slug: 'role-based-access-control',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: false,
+ },
},
// Analytics
{
@@ -1412,6 +1656,10 @@ By leveraging Supabase Reports, you gain a understanding of your project's perfo
heroImageLight: '/images/features/reports-and-metrics-light.png',
docsUrl: 'https://supabase.com/blog/supabase-reports-and-metrics',
slug: 'reports-and-metrics',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'SOC 2 Compliance',
@@ -1449,6 +1697,10 @@ By building on Supabase's SOC 2 compliant platform, you gain a significant advan
heroImage: '',
docsUrl: 'https://supabase.com/docs/guides/security/compliance',
slug: 'soc-2-compliance',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: false,
+ },
},
// Studio
{
@@ -1472,6 +1724,10 @@ This feature is especially beneficial for teams looking to improve their databas
docsUrl:
'https://supabase.com/blog/studio-introducing-assistant#introducing-the-supabase-assistant',
slug: 'ai-query-assistance',
+ status: {
+ stage: PRODUCT_STAGES.PUBLIC_ALPHA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Logs & Analytics',
@@ -1494,6 +1750,10 @@ This feature is particularly valuable for teams looking to enhance their applica
heroImageLight: '/images/features/logs-analytics-light.png',
docsUrl: 'https://supabase.com/docs/guides/monitoring-troubleshooting/logs',
slug: 'logs-analytics',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Visual Schema Designer',
@@ -1516,6 +1776,10 @@ This feature is particularly valuable for teams engaged in agile development pro
heroImageLight: '/images/features/visual-schema-designer-light.png',
docsUrl: 'https://supabase.com/blog/supabase-studio-3-0#schema-visualizer',
slug: 'visual-schema-designer',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Policy Templates',
@@ -1538,6 +1802,10 @@ This feature is essential for organizations looking to maintain robust security
heroImageLight: '/images/features/policy-templates-light.png',
docsUrl: '',
slug: 'policy-templates',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'SQL Editor',
@@ -1560,6 +1828,10 @@ This feature is particularly valuable for developers looking to streamline their
heroImageLight: '/images/features/sql-editor-light.png',
docsUrl: '',
slug: 'sql-editor',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Security & Performance Advisor',
@@ -1582,6 +1854,10 @@ This feature is essential for organizations aiming to maintain high security sta
heroImageLight: '/images/features/security-and-performance-advisor-light.png',
docsUrl: 'https://supabase.com/blog/security-and-performance-advisor',
slug: 'security-and-performance-advisor',
+ status: {
+ stage: PRODUCT_STAGES.BETA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Postgres Roles',
@@ -1604,6 +1880,10 @@ This feature is particularly valuable for teams looking to implement robust secu
heroImageLight: '/images/features/postgres-roles-light.png',
docsUrl: 'https://supabase.com/docs/guides/database/postgres/roles',
slug: 'postgres-roles',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Foreign Key Selector',
@@ -1626,6 +1906,10 @@ This feature is particularly beneficial for developers working with complex data
'https://xguihxuzqibwxjnimxev.supabase.co/storage/v1/object/public/videos/docs/fk-lookup.mp4',
docsUrl: 'https://supabase.com/blog/supabase-studio-2.0#foreign-key-selector',
slug: 'foreign-key-selector',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
},
{
title: 'Log Drains',
@@ -1647,5 +1931,109 @@ This feature is particularly useful for teams seeking to enhance their observabi
heroImage: 'https://www.youtube-nocookie.com/embed/A4GFmvgxS-E',
docsUrl: 'https://supabase.com/blog/log-drains',
slug: 'log-drains',
+ status: {
+ stage: PRODUCT_STAGES.PUBLIC_ALPHA,
+ availableOnSelfHosted: true,
+ },
+ },
+ {
+ title: 'Client Library - JavaScript',
+ subtitle: 'Easily integrate Supabase with your JavaScript applications.',
+ description: `
+The Supabase JavaScript Client Library provides a straightforward way to interact with your Supabase database and services directly from your JavaScript applications. This library simplifies the process of making API calls, managing authentication, and handling real-time updates, making it an essential tool for developers working with Supabase.
+
+Key benefits:
+1. Simplified API Interaction: Easily connect to your Supabase backend with minimal setup.
+2. Built-in Authentication: Manage user authentication seamlessly within your JavaScript applications.
+3. Real-Time Capabilities: Subscribe to changes in your database and receive updates in real-time.
+4. Comprehensive Documentation: Access detailed guides and examples to help you get started quickly.
+5. Community Support: Join a growing community of developers using the JavaScript Client Library for various projects.
+
+This feature is particularly valuable for developers looking to build dynamic web applications that leverage the power of Supabase as a backend service.
+`,
+ icon: JsIcon,
+ products: [ADDITIONAL_PRODUCTS.PLATFORM],
+ heroImage: '',
+ docsUrl: 'https://supabase.com/docs/reference/javascript/start',
+ slug: 'client-library-javascript',
+ status: {
+ stage: PRODUCT_STAGES.GA,
+ availableOnSelfHosted: true,
+ },
+ },
+ {
+ title: 'Client Library - Flutter',
+ subtitle: 'Integrate Supabase into your Flutter applications effortlessly.',
+ description: `
+The Supabase Flutter Client Library allows developers to easily integrate Supabase into their Flutter applications. This library provides a comprehensive set of tools for managing database interactions, user authentication, and real-time data updates, all tailored for the Flutter framework.
+
+Key benefits:
+1. Seamless Integration: Connect your Flutter app to Supabase with minimal configuration.
+2. User Authentication: Manage user sign-ups, logins, and sessions directly within your Flutter application.
+3. Real-Time Updates: Receive live updates from your database, enhancing user experience.
+4. Detailed Documentation: Access extensive resources and examples to facilitate development.
+5. Active Community: Engage with other Flutter developers leveraging Supabase for their projects.
+
+This feature is particularly useful for Flutter developers aiming to create responsive mobile applications backed by a powerful database solution.
+`,
+ icon: FlutterIcon,
+ products: [ADDITIONAL_PRODUCTS.PLATFORM],
+ heroImage: '',
+ docsUrl: 'https://supabase.com/docs/reference/dart/start',
+ slug: 'client-library-flutter',
+ status: {
+ stage: PRODUCT_STAGES.BETA,
+ availableOnSelfHosted: true,
+ },
+ },
+ {
+ title: 'Client Library - Swift',
+ subtitle: 'Effortlessly connect your Swift applications to Supabase.',
+ description: `
+The Supabase Swift Client Library provides an easy way for developers to integrate their iOS applications with Supabase services. This library simplifies database access, user authentication, and real-time data handling, making it an essential tool for Swift developers.
+
+Key benefits:
+1. Easy Integration: Quickly connect your Swift app to Supabase with straightforward setup instructions.
+2. Authentication Management: Handle user authentication seamlessly within your iOS applications.
+3. Real-Time Data Handling: Subscribe to changes in your database and receive updates instantly.
+4. Comprehensive Guides: Utilize detailed documentation and examples to streamline development.
+5. Supportive Community: Join a community of Swift developers using Supabase for their app development needs.
+
+This feature is particularly valuable for iOS developers looking to leverage the capabilities of Supabase in their mobile applications.
+`,
+ icon: SwiftIcon,
+ products: [ADDITIONAL_PRODUCTS.PLATFORM],
+ heroImage: '',
+ docsUrl: 'https://supabase.com/docs/reference/swift/start',
+ slug: 'client-library-swift',
+ status: {
+ stage: PRODUCT_STAGES.BETA,
+ availableOnSelfHosted: true,
+ },
+ },
+ {
+ title: 'Client Library - Python',
+ subtitle: 'Integrate Supabase easily into your Python applications.',
+ description: `
+The Supabase Python Client Library enables developers to connect their Python applications with Supabase effortlessly. This library provides tools for interacting with the database, managing user authentication, and handling real-time updates, tailored specifically for Python developers.
+
+Key benefits:
+1. Simple Connection Setup: Easily connect your Python application to Supabase with minimal configuration.
+2. User Authentication Support: Manage user accounts and sessions directly within your Python code.
+3. Real-Time Data Updates: Subscribe to changes in your database and receive live updates as they occur.
+4. In-Depth Documentation: Access comprehensive guides and examples to assist in development.
+5. Engaged Community Support: Connect with other Python developers utilizing Supabase in their projects.
+
+This feature is especially beneficial for Python developers looking to build robust applications powered by a scalable backend service like Supabase.
+`,
+ icon: PythonIcon,
+ products: [ADDITIONAL_PRODUCTS.PLATFORM],
+ heroImage: '',
+ docsUrl: 'https://supabase.com/docs/reference/python/start',
+ slug: 'client-library-python',
+ status: {
+ stage: PRODUCT_STAGES.BETA,
+ availableOnSelfHosted: true,
+ },
},
]
diff --git a/apps/www/lib/authors.json b/apps/www/lib/authors.json
index b26aaa47d9a0f..a5e5cd5b22914 100644
--- a/apps/www/lib/authors.json
+++ b/apps/www/lib/authors.json
@@ -565,5 +565,13 @@
"position": "Engineering",
"author_url": "https://github.com/jgoux",
"author_image_url": "https://github.com/jgoux.png"
+ },
+ {
+ "author_id": "saxon_fletcher",
+ "author": "Saxon Fletcher",
+ "username": "saxonf",
+ "position": "Product Design",
+ "author_url": "https://github.com/saxonf",
+ "author_image_url": "https://github.com/saxonf.png"
}
]
diff --git a/apps/www/pages/assistant.tsx b/apps/www/pages/assistant.tsx
index 9730ba19c5556..0809a359f9fc0 100644
--- a/apps/www/pages/assistant.tsx
+++ b/apps/www/pages/assistant.tsx
@@ -53,7 +53,7 @@ const welcomeMessages = [
- Welcome Product Hunter! 👋 Thanks for checking out the Supabase assistant. Let me show you
+ Welcome Product Hunter! 👋 Thanks for checking out the Supabase Assistant. Let me show you
what I can do!
@@ -677,19 +677,30 @@ function Assistant() {
Chat with Postgres
Generate, run and debug queries, chart your data, create functions, policies and
- more. The assistant is here to help.
+ more. The Assistant is here to help.
-
+
{!isUserLoading &&
(isLoggedIn ? (
) : (
))}
+
diff --git a/apps/www/pages/features.tsx b/apps/www/pages/features.tsx
index a8654f8f666c2..40a0f5d60c050 100644
--- a/apps/www/pages/features.tsx
+++ b/apps/www/pages/features.tsx
@@ -131,7 +131,7 @@ function FeaturesPage() {
Filter by tags:
{products
- .sort((a, b) => (a > b ? 1 : -1))
+ .sort((a, b) => (a.toLowerCase() > b.toLowerCase() ? 1 : -1))
.map((product) => (