From 71f860b28de39174af3b93dd327067b211c9402e Mon Sep 17 00:00:00 2001 From: Ivan Vasilov Date: Thu, 23 May 2024 17:04:27 +0200 Subject: [PATCH 1/5] fix: Use `beforeSend` hook in Sentry to check for telemetry consent (#26700) * Add a beforeSend hook to sentry client config. * Remove the canSendTelemetry function and all its uses. * Use captureException for capturing unhandled error messages. --- .../interfaces/Support/SupportForm.tsx | 5 +---- apps/studio/data/fetchers.ts | 11 +++-------- apps/studio/lib/telemetry.ts | 12 ------------ apps/studio/pages/_app.tsx | 19 +++++++------------ apps/studio/sentry.client.config.ts | 13 +++++++++++++ 5 files changed, 24 insertions(+), 36 deletions(-) diff --git a/apps/studio/components/interfaces/Support/SupportForm.tsx b/apps/studio/components/interfaces/Support/SupportForm.tsx index d08c9919843..fd07f9c0561 100644 --- a/apps/studio/components/interfaces/Support/SupportForm.tsx +++ b/apps/studio/components/interfaces/Support/SupportForm.tsx @@ -13,7 +13,6 @@ import { useFlag } from 'hooks' import useLatest from 'hooks/misc/useLatest' import { detectBrowser } from 'lib/helpers' import { useProfile } from 'lib/profile' -import { canSendTelemetry } from 'lib/telemetry' import { AlertCircle, ExternalLink, HelpCircle, Loader2, Mail, Plus, X } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' @@ -79,9 +78,7 @@ const SupportForm = ({ setSentCategory, setSelectedProject }: SupportFormProps) }, onError: (error) => { toast.error(`Failed to submit support ticket: ${error.message}`) - if (canSendTelemetry()) { - Sentry.captureMessage('Failed to submit Support Form: ' + error.message) - } + Sentry.captureMessage('Failed to submit Support Form: ' + error.message) setIsSubmitting(false) }, }) diff --git a/apps/studio/data/fetchers.ts b/apps/studio/data/fetchers.ts index 894d2aec78c..e9197229044 100644 --- a/apps/studio/data/fetchers.ts +++ b/apps/studio/data/fetchers.ts @@ -2,7 +2,6 @@ import * as Sentry from '@sentry/nextjs' import { API_URL, IS_PLATFORM } from 'lib/constants' import { getAccessToken } from 'lib/gotrue' import { uuidv4 } from 'lib/helpers' -import { canSendTelemetry } from 'lib/telemetry' import createClient from 'openapi-fetch' import type { paths } from './api' // generated from openapi-typescript @@ -161,13 +160,9 @@ export const handleError = (error: any): never => { } console.error(error.stack) - if (canSendTelemetry()) { - // the error doesn't have a message or msg property, so we can't throw it as an error. Log it via Sentry so that we can - // add handling for it. - Sentry.captureMessage( - `Unable to throw an object as error. The object has the following keys: ${Object.keys(error)}.` - ) - } + // the error doesn't have a message or msg property, so we can't throw it as an error. Log it via Sentry so that we can + // add handling for it. + Sentry.captureException(error) // throw a generic error if we don't know what the error is. The message is intentionally vague because it might show // up in the UI. diff --git a/apps/studio/lib/telemetry.ts b/apps/studio/lib/telemetry.ts index 2bf7353414e..3b37e3a0637 100644 --- a/apps/studio/lib/telemetry.ts +++ b/apps/studio/lib/telemetry.ts @@ -114,18 +114,6 @@ const sendActivity = ( return post(`${API_URL}/telemetry/activity`, properties) } -/** - * Checks if the user has consented to sending telemetry data. Mainly used for Sentry reports. - */ -export const canSendTelemetry = () => { - const consent = - typeof window !== 'undefined' - ? localStorage.getItem(LOCAL_STORAGE_KEYS.TELEMETRY_CONSENT) - : null - - return IS_PLATFORM && consent === 'true' -} - /** * Generates a unique identifier for an anonymous user based on their gotrue id. */ diff --git a/apps/studio/pages/_app.tsx b/apps/studio/pages/_app.tsx index 79e6acff77d..84a9254b3ea 100644 --- a/apps/studio/pages/_app.tsx +++ b/apps/studio/pages/_app.tsx @@ -52,7 +52,7 @@ import { useRootQueryClient } from 'data/query-client' import { AuthProvider } from 'lib/auth' import { BASE_PATH, IS_PLATFORM, LOCAL_STORAGE_KEYS } from 'lib/constants' import { ProfileProvider } from 'lib/profile' -import { canSendTelemetry, getAnonId } from 'lib/telemetry' +import { getAnonId } from 'lib/telemetry' import { useAppStateSnapshot } from 'state/app-state' import HCaptchaLoadedStore from 'stores/hcaptcha-loaded-store' import { AppPropsWithLayout } from 'types' @@ -112,12 +112,10 @@ function CustomApp({ Component, pageProps }: AppPropsWithLayout) { ) const errorBoundaryHandler = (error: Error, info: ErrorInfo) => { - if (canSendTelemetry()) { - Sentry.withScope(function (scope) { - scope.setTag('globalErrorBoundary', true) - Sentry.captureException(error) - }) - } + Sentry.withScope(function (scope) { + scope.setTag('globalErrorBoundary', true) + Sentry.captureException(error) + }) console.error(error.stack) } @@ -152,11 +150,8 @@ function CustomApp({ Component, pageProps }: AppPropsWithLayout) { const user = useUser() useEffect(() => { - // don't set the sentry user id if - // - on self-hosted or CLI - // - the user has not consented to telemetry - // - the user hasn't logged in (so that Sentry errors show null user id instead of anonymous id) - if (!canSendTelemetry() || !user?.id) { + // don't set the sentry user id if the user hasn't logged in (so that Sentry errors show null user id instead of anonymous id) + if (!user?.id) { return } diff --git a/apps/studio/sentry.client.config.ts b/apps/studio/sentry.client.config.ts index cc5d0576b79..c87aca25832 100644 --- a/apps/studio/sentry.client.config.ts +++ b/apps/studio/sentry.client.config.ts @@ -1,10 +1,23 @@ import * as Sentry from '@sentry/nextjs' +import { IS_PLATFORM } from 'common/constants/environment' +import { LOCAL_STORAGE_KEYS } from 'common/constants/local-storage' import { match } from 'path-to-regexp' Sentry.init({ dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, tracesSampleRate: 0.01, debug: false, + beforeSend(event) { + const consent = + typeof window !== 'undefined' + ? localStorage.getItem(LOCAL_STORAGE_KEYS.TELEMETRY_CONSENT) + : null + + if (IS_PLATFORM && consent === 'true') { + return event + } + return null + }, integrations: [ new Sentry.BrowserTracing({ // TODO: update gotrue + api to support Access-Control-Request-Headers: authorization,baggage,sentry-trace,x-client-info From 4ea0698cf3ce491d937d496c682ce30551465006 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Thu, 23 May 2024 13:03:43 -0230 Subject: [PATCH 2/5] Chore/add backup warning (#26704) * Show warning that storage objects arent backed up * Move alert to own component --- .../interfaces/Database/Backups/BackupsList.tsx | 4 +++- .../Database/Backups/BackupsStorageAlert.tsx | 17 +++++++++++++++++ .../Database/Backups/PITR/PITRSelection.tsx | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 apps/studio/components/interfaces/Database/Backups/BackupsStorageAlert.tsx diff --git a/apps/studio/components/interfaces/Database/Backups/BackupsList.tsx b/apps/studio/components/interfaces/Database/Backups/BackupsList.tsx index cdf5084a0f8..e099ca8e7d3 100644 --- a/apps/studio/components/interfaces/Database/Backups/BackupsList.tsx +++ b/apps/studio/components/interfaces/Database/Backups/BackupsList.tsx @@ -4,7 +4,7 @@ import dayjs from 'dayjs' import { useRouter } from 'next/router' import { useState } from 'react' import toast from 'react-hot-toast' -import { IconAlertCircle, IconClock, Modal } from 'ui' +import { IconAlertCircle, IconClock, AlertDescription_Shadcn_, Alert_Shadcn_ } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' @@ -18,6 +18,7 @@ import { useCheckPermissions, useSelectedOrganization } from 'hooks' import { PROJECT_STATUS } from 'lib/constants' import BackupItem from './BackupItem' import BackupsEmpty from './BackupsEmpty' +import BackupsStorageAlert from './BackupsStorageAlert' const BackupsList = () => { const router = useRouter() @@ -88,6 +89,7 @@ const BackupsList = () => { title="You need additional permissions to trigger a scheduled backup" /> )} + {sortedBackups?.map((x, i: number) => { return ( diff --git a/apps/studio/components/interfaces/Database/Backups/BackupsStorageAlert.tsx b/apps/studio/components/interfaces/Database/Backups/BackupsStorageAlert.tsx new file mode 100644 index 00000000000..a6e677ab516 --- /dev/null +++ b/apps/studio/components/interfaces/Database/Backups/BackupsStorageAlert.tsx @@ -0,0 +1,17 @@ +import { AlertDescription_Shadcn_, Alert_Shadcn_ } from 'ui' +import { WarningIcon } from 'ui-patterns/Icons/StatusIcons' + +const BackupsStorageAlert = () => { + return ( + + + + Database backups do not include objects stored via the Storage API, as the database only + includes metadata about these objects. Restoring an old backup does not restore objects that + have been deleted since then. + + + ) +} + +export default BackupsStorageAlert diff --git a/apps/studio/components/interfaces/Database/Backups/PITR/PITRSelection.tsx b/apps/studio/components/interfaces/Database/Backups/PITR/PITRSelection.tsx index befe3e3f0ed..a396ea0786d 100644 --- a/apps/studio/components/interfaces/Database/Backups/PITR/PITRSelection.tsx +++ b/apps/studio/components/interfaces/Database/Backups/PITR/PITRSelection.tsx @@ -38,6 +38,7 @@ import { import PITRStatus from './PITRStatus' import TimeInput from './TimeInput' import { TimezoneSelection } from './TimezoneSelection' +import BackupsStorageAlert from '../BackupsStorageAlert' const PITRSelection = () => { const router = useRouter() @@ -138,6 +139,7 @@ const PITRSelection = () => { title="Restore your database from a backup" description="Database changes are watched and recorded, so that you can restore your database to any point in time" /> + {hasNoBackupsAvailable ? ( ) : ( From 8643c2549ee81b74218cc4bb51f5bf2c3ec054e3 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 23 May 2024 23:44:45 +0800 Subject: [PATCH 3/5] Feat [atom component] stacked radio group / card radio group (#26612) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * init site * add nav menu * add props table component * init all the examples • also includes moving a bunch of ./ui files to ./ui-patterns * update package • might need to remove some of these * Update rehype-component.ts * move nav * more changes * add new source information to contentlayer * fix copy buttons * add text-confirm. start new concept of "fragments" * move base path. add homepage. add theme selection * added colors * add form-item-layout * temporary fix code blocks in light mode. they currently don't switch theme to theme * start adding code themes * Update dark.json * update code block themes * fix animations * add cdmk search * export registry of icons in ./icons package * add comments * add icon copy stuff * Update icons.tsx * more docs * more docs. cleaned up colors and icons docs * Update theming.mdx * add more docs * update * add package * Update tailwind.config.js * update content * Update drawer-demo.tsx * Update aspect-ratio-demo.tsx * add new blocks * Update source-panel.tsx * Update source-panel.tsx * Update source-panel.tsx * add new source block * Update source-panel.tsx * Update _app.tsx * Update page.tsx * Delete layout-old.tsx * remove old themes * remove old ui registry * comment out nav items * Update package-lock.json * Update AssistantChatForm.tsx * move back * move again * update * Update index.tsx * Update package-lock.json * Update package-lock.json * Update package-lock.json * update package * udpate prettier * fix tag issues * Update package-lock.json * update to contentlayer2 * update package-lock.json * fix type errors * ignore spelling * feat: add RadioGroupStacked * feat: add `slot` behaviour to `` * sneaky add in better line highlighting * add RadioGroupCard * update colors * Update package-lock.json * Update avoid-typos.yml * Update navigation-menu-demo.tsx * Add a redirect from / to the base path. --------- Co-authored-by: Alaister Young Co-authored-by: Ivan Vasilov --- apps/design-system/__registry__/index.tsx | 55 + .../design-system/components/source-panel.tsx | 4 +- apps/design-system/config/docs.ts | 10 + .../docs/components/radio-group-card.mdx | 36 + .../docs/components/radio-group-stacked.mdx | 32 + apps/design-system/next.config.mjs | 14 + apps/design-system/package.json | 2 +- .../default/example/navigation-menu-demo.tsx | 2 +- .../default/example/radio-group-card-demo.tsx | 11 + .../default/example/radio-group-card-form.tsx | 83 ++ .../radio-group-card-with-children.tsx | 21 + .../example/radio-group-stacked-demo.tsx | 26 + .../example/radio-group-stacked-form.tsx | 82 ++ apps/design-system/registry/examples.ts | 30 + apps/design-system/styles/mdx.css | 8 +- apps/design-system/tsconfig.base.json | 20 + apps/www/public/customers-rss.xml | 30 +- .../planetpg-angelico_de_los_reyes-rss.xml | 10 +- apps/www/public/planetpg-ant_wilson-rss.xml | 4 +- apps/www/public/planetpg-bo_lu-rss.xml | 4 +- apps/www/public/planetpg-burggraf-rss.xml | 6 +- apps/www/public/planetpg-egor_romanov-rss.xml | 6 +- apps/www/public/planetpg-filipe-rss.xml | 4 +- apps/www/public/planetpg-gregnr-rss.xml | 8 +- apps/www/public/planetpg-michel-rss.xml | 11 +- apps/www/public/planetpg-oli_rice-rss.xml | 18 +- .../public/planetpg-paul_copplestone-rss.xml | 12 +- apps/www/public/planetpg-pavel-rss.xml | 22 +- apps/www/public/planetpg-philipp-rss.xml | 4 +- .../public/planetpg-raminder_singh-rss.xml | 6 +- apps/www/public/planetpg-stas-rss.xml | 4 +- apps/www/public/planetpg-steve_chavez-rss.xml | 6 +- apps/www/public/planetpg-victor-rss.xml | 8 +- apps/www/public/rss.xml | 577 +++++---- apps/www/public/sitemap_www.xml | 1096 +++++++++++------ packages/ui/index.tsx | 3 + .../ui/src/components/radio-group-card.tsx | 92 ++ .../ui/src/components/radio-group-stacked.tsx | 106 ++ packages/ui/src/components/shadcn/ui/form.tsx | 23 +- 39 files changed, 1742 insertions(+), 754 deletions(-) create mode 100644 apps/design-system/content/docs/components/radio-group-card.mdx create mode 100644 apps/design-system/content/docs/components/radio-group-stacked.mdx create mode 100644 apps/design-system/registry/default/example/radio-group-card-demo.tsx create mode 100644 apps/design-system/registry/default/example/radio-group-card-form.tsx create mode 100644 apps/design-system/registry/default/example/radio-group-card-with-children.tsx create mode 100644 apps/design-system/registry/default/example/radio-group-stacked-demo.tsx create mode 100644 apps/design-system/registry/default/example/radio-group-stacked-form.tsx create mode 100644 apps/design-system/tsconfig.base.json create mode 100644 packages/ui/src/components/radio-group-card.tsx create mode 100644 packages/ui/src/components/radio-group-stacked.tsx diff --git a/apps/design-system/__registry__/index.tsx b/apps/design-system/__registry__/index.tsx index c5e960a9786..209cb81da04 100644 --- a/apps/design-system/__registry__/index.tsx +++ b/apps/design-system/__registry__/index.tsx @@ -775,6 +775,61 @@ export const Index: Record = { subcategory: "undefined", chunks: [] }, + "radio-group-stacked-demo": { + name: "radio-group-stacked-demo", + type: "components:example", + registryDependencies: ["radio-group"], + component: React.lazy(() => import("@/registry/default/example/radio-group-stacked-demo")), + source: "", + files: ["registry/default/example/radio-group-stacked-demo.tsx"], + category: "undefined", + subcategory: "undefined", + chunks: [] + }, + "radio-group-stacked-form": { + name: "radio-group-stacked-form", + type: "components:example", + registryDependencies: ["radio-group","form"], + component: React.lazy(() => import("@/registry/default/example/radio-group-stacked-form")), + source: "", + files: ["registry/default/example/radio-group-stacked-form.tsx"], + category: "undefined", + subcategory: "undefined", + chunks: [] + }, + "radio-group-card-demo": { + name: "radio-group-card-demo", + type: "components:example", + registryDependencies: ["radio-group"], + component: React.lazy(() => import("@/registry/default/example/radio-group-card-demo")), + source: "", + files: ["registry/default/example/radio-group-card-demo.tsx"], + category: "undefined", + subcategory: "undefined", + chunks: [] + }, + "radio-group-card-form": { + name: "radio-group-card-form", + type: "components:example", + registryDependencies: ["radio-group","form"], + component: React.lazy(() => import("@/registry/default/example/radio-group-card-form")), + source: "", + files: ["registry/default/example/radio-group-card-form.tsx"], + category: "undefined", + subcategory: "undefined", + chunks: [] + }, + "radio-group-card-with-children": { + name: "radio-group-card-with-children", + type: "components:example", + registryDependencies: ["radio-group","form"], + component: React.lazy(() => import("@/registry/default/example/radio-group-card-with-children")), + source: "", + files: ["registry/default/example/radio-group-card-with-children.tsx"], + category: "undefined", + subcategory: "undefined", + chunks: [] + }, "resizable-demo": { name: "resizable-demo", type: "components:example", diff --git a/apps/design-system/components/source-panel.tsx b/apps/design-system/components/source-panel.tsx index 04dc897204c..51fac19dfa6 100644 --- a/apps/design-system/components/source-panel.tsx +++ b/apps/design-system/components/source-panel.tsx @@ -136,8 +136,8 @@ const SourcePanel = forwardRef & > diff --git a/apps/design-system/config/docs.ts b/apps/design-system/config/docs.ts index 97dd211b94b..459ed848096 100644 --- a/apps/design-system/config/docs.ts +++ b/apps/design-system/config/docs.ts @@ -259,6 +259,16 @@ export const docsConfig: DocsConfig = { href: '/docs/components/radio-group', items: [], }, + { + title: 'Radio Group Stacked', + href: '/docs/components/radio-group-stacked', + items: [], + }, + { + title: 'Radio Group Card', + href: '/docs/components/radio-group-card', + items: [], + }, { title: 'Resizable', href: '/docs/components/resizable', diff --git a/apps/design-system/content/docs/components/radio-group-card.mdx b/apps/design-system/content/docs/components/radio-group-card.mdx new file mode 100644 index 00000000000..26adb02c514 --- /dev/null +++ b/apps/design-system/content/docs/components/radio-group-card.mdx @@ -0,0 +1,36 @@ +--- +title: Radio Group Card +description: A set of checkable buttons—known as radio buttons—where no more than one of the buttons can be checked at a time. +component: true +links: + doc: https://www.radix-ui.com/docs/primitives/components/radio-group + api: https://www.radix-ui.com/docs/primitives/components/radio-group#api-reference +source: + radix: true +--- + + + +## Usage + +```tsx +import { RadioGroupCard, RadioGroupCardItem } from 'ui' +``` + +```tsx + + + + + +``` + +## Examples + +### With children + + + +### Form + + diff --git a/apps/design-system/content/docs/components/radio-group-stacked.mdx b/apps/design-system/content/docs/components/radio-group-stacked.mdx new file mode 100644 index 00000000000..ff3c80616bf --- /dev/null +++ b/apps/design-system/content/docs/components/radio-group-stacked.mdx @@ -0,0 +1,32 @@ +--- +title: Radio Group Stacked +description: A set of checkable buttons—known as radio buttons—where no more than one of the buttons can be checked at a time. +component: true +links: + doc: https://www.radix-ui.com/docs/primitives/components/radio-group + api: https://www.radix-ui.com/docs/primitives/components/radio-group#api-reference +source: + radix: true +--- + + + +## Usage + +```tsx +import { RadioGroupStacked, RadioGroupStackedItem } from 'ui' +``` + +```tsx + + + + + +``` + +## Examples + +### Form + + diff --git a/apps/design-system/next.config.mjs b/apps/design-system/next.config.mjs index c76557bfa66..1d3df144ace 100644 --- a/apps/design-system/next.config.mjs +++ b/apps/design-system/next.config.mjs @@ -16,6 +16,20 @@ const nextConfig = { }, ], }, + async redirects() { + return [ + ...(process.env.NEXT_PUBLIC_BASE_PATH?.length + ? [ + { + source: '/', + destination: process.env.NEXT_PUBLIC_BASE_PATH, + basePath: false, + permanent: false, + }, + ] + : []), + ] + }, } export default withContentlayer(nextConfig) diff --git a/apps/design-system/package.json b/apps/design-system/package.json index 64c83d993a3..2be6f37411d 100644 --- a/apps/design-system/package.json +++ b/apps/design-system/package.json @@ -4,7 +4,7 @@ "private": true, "type": "module", "scripts": { - "dev": "next dev", + "dev": "next dev --port 3003", "build": "npm run content:build && npm run build:registry && next build", "build:registry": "tsx --tsconfig ./tsconfig.scripts.json ./scripts/build-registry.mts && prettier --log-level silent --write \"registry/**/*.{ts,tsx,mdx}\" --cache", "start": "next start", diff --git a/apps/design-system/registry/default/example/navigation-menu-demo.tsx b/apps/design-system/registry/default/example/navigation-menu-demo.tsx index eaf24a6ed66..24522235ace 100644 --- a/apps/design-system/registry/default/example/navigation-menu-demo.tsx +++ b/apps/design-system/registry/default/example/navigation-menu-demo.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import Link from 'next/link' -import { cn } from '@/lib/utils' +import { cn } from 'ui' // import { Icons } from '@/components/icons' import { NavigationMenu, diff --git a/apps/design-system/registry/default/example/radio-group-card-demo.tsx b/apps/design-system/registry/default/example/radio-group-card-demo.tsx new file mode 100644 index 00000000000..85e885d6e28 --- /dev/null +++ b/apps/design-system/registry/default/example/radio-group-card-demo.tsx @@ -0,0 +1,11 @@ +import { RadioGroupCard, RadioGroupCardItem } from 'ui' + +export default function RadioGroupDemo() { + return ( + + + + + + ) +} diff --git a/apps/design-system/registry/default/example/radio-group-card-form.tsx b/apps/design-system/registry/default/example/radio-group-card-form.tsx new file mode 100644 index 00000000000..14d54b71ffb --- /dev/null +++ b/apps/design-system/registry/default/example/radio-group-card-form.tsx @@ -0,0 +1,83 @@ +'use client' + +import { zodResolver } from '@hookform/resolvers/zod' +import { useForm } from 'react-hook-form' +import { z } from 'zod' + +import { Button, RadioGroupCard, RadioGroupCardItem } from 'ui' +import { + Form_Shadcn_, + FormControl_Shadcn_, + FormField_Shadcn_, + FormItem_Shadcn_, + FormLabel_Shadcn_, + FormMessage_Shadcn_, +} from 'ui' +import { toast } from 'ui' + +const FormSchema = z.object({ + type: z.enum(['all', 'mentions', 'none'], { + required_error: 'You need to select a notification type.', + }), +}) + +export default function RadioGroupForm() { + const form = useForm>({ + resolver: zodResolver(FormSchema), + }) + + function onSubmit(data: z.infer) { + console.log(JSON.stringify(data, null, 2)) + toast({ + title: 'You submitted the following values:', + description: ( +
+          {JSON.stringify(data, null, 2)}
+        
+ ), + }) + } + + return ( + +
+ ( + + Notify me about... + + + + + + + + + + + + + + + + + + + + + + )} + /> + + +
+ ) +} diff --git a/apps/design-system/registry/default/example/radio-group-card-with-children.tsx b/apps/design-system/registry/default/example/radio-group-card-with-children.tsx new file mode 100644 index 00000000000..758221a1424 --- /dev/null +++ b/apps/design-system/registry/default/example/radio-group-card-with-children.tsx @@ -0,0 +1,21 @@ +import { RadioGroupCard, RadioGroupCardItem } from 'ui' +import SVG from 'react-inlinesvg' + +export default function RadioGroupDemo() { + const singleThemes = [ + { name: 'Dark', value: 'dark' }, // Classic Supabase dark + { name: 'Deep Dark', value: 'deep-dark' }, // Deep Dark Supabase dark + { name: 'Light', value: 'light' }, // Classic Supabase light + { name: 'System', value: 'system' }, // Classic Supabase light + ] as const + + return ( + + {singleThemes.map((theme) => ( + + + + ))} + + ) +} diff --git a/apps/design-system/registry/default/example/radio-group-stacked-demo.tsx b/apps/design-system/registry/default/example/radio-group-stacked-demo.tsx new file mode 100644 index 00000000000..b8de098b5fa --- /dev/null +++ b/apps/design-system/registry/default/example/radio-group-stacked-demo.tsx @@ -0,0 +1,26 @@ +import { RadioGroupStacked, RadioGroupStackedItem } from 'ui' + +export default function RadioGroupDemo() { + return ( + + + + + + ) +} diff --git a/apps/design-system/registry/default/example/radio-group-stacked-form.tsx b/apps/design-system/registry/default/example/radio-group-stacked-form.tsx new file mode 100644 index 00000000000..5c979c76c00 --- /dev/null +++ b/apps/design-system/registry/default/example/radio-group-stacked-form.tsx @@ -0,0 +1,82 @@ +'use client' + +import { zodResolver } from '@hookform/resolvers/zod' +import { useForm } from 'react-hook-form' +import { z } from 'zod' + +import { Button, RadioGroupStacked, RadioGroupStackedItem } from 'ui' +import { + Form_Shadcn_, + FormControl_Shadcn_, + FormField_Shadcn_, + FormItem_Shadcn_, + FormLabel_Shadcn_, + FormMessage_Shadcn_, +} from 'ui' +import { toast } from 'ui' + +const FormSchema = z.object({ + type: z.enum(['all', 'mentions', 'none'], { + required_error: 'You need to select a notification type.', + }), +}) + +export default function RadioGroupForm() { + const form = useForm>({ + resolver: zodResolver(FormSchema), + }) + + function onSubmit(data: z.infer) { + console.log(JSON.stringify(data, null, 2)) + toast({ + title: 'You submitted the following values:', + description: ( +
+          {JSON.stringify(data, null, 2)}
+        
+ ), + }) + } + + return ( + +
+ ( + + Notify me about... + + + + + + + + + + + + + + + + + + + + + + )} + /> + + +
+ ) +} diff --git a/apps/design-system/registry/examples.ts b/apps/design-system/registry/examples.ts index 96f49a1fc30..0f5c5728119 100644 --- a/apps/design-system/registry/examples.ts +++ b/apps/design-system/registry/examples.ts @@ -503,6 +503,36 @@ export const examples: Registry = [ registryDependencies: ['radio-group', 'form'], files: ['example/radio-group-form.tsx'], }, + { + name: 'radio-group-stacked-demo', + type: 'components:example', + registryDependencies: ['radio-group'], + files: ['example/radio-group-stacked-demo.tsx'], + }, + { + name: 'radio-group-stacked-form', + type: 'components:example', + registryDependencies: ['radio-group', 'form'], + files: ['example/radio-group-stacked-form.tsx'], + }, + { + name: 'radio-group-card-demo', + type: 'components:example', + registryDependencies: ['radio-group'], + files: ['example/radio-group-card-demo.tsx'], + }, + { + name: 'radio-group-card-form', + type: 'components:example', + registryDependencies: ['radio-group', 'form'], + files: ['example/radio-group-card-form.tsx'], + }, + { + name: 'radio-group-card-with-children', + type: 'components:example', + registryDependencies: ['radio-group', 'form'], + files: ['example/radio-group-card-with-children.tsx'], + }, { name: 'resizable-demo', type: 'components:example', diff --git a/apps/design-system/styles/mdx.css b/apps/design-system/styles/mdx.css index ade97193433..afac3b50ede 100644 --- a/apps/design-system/styles/mdx.css +++ b/apps/design-system/styles/mdx.css @@ -33,7 +33,7 @@ } [data-rehype-pretty-code-fragment] [data-line-numbers] > .line::before { - @apply text-zinc-50/40 text-xs; + @apply text-foreground-muted text-xs; counter-increment: line; content: counter(line); display: inline-block; @@ -43,7 +43,11 @@ } [data-rehype-pretty-code-fragment] .line--highlighted { - @apply bg-surface-200 dark:bg-surface-100; + @apply relative bg-surface-200 dark:bg-surface-100; +} + +[data-rehype-pretty-code-fragment] .line--highlighted { + @apply border-foreground-muted border-l-2; } [data-rehype-pretty-code-fragment] .line-highlighted span { diff --git a/apps/design-system/tsconfig.base.json b/apps/design-system/tsconfig.base.json new file mode 100644 index 00000000000..d72a9f3a278 --- /dev/null +++ b/apps/design-system/tsconfig.base.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Default", + "compilerOptions": { + "composite": false, + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "inlineSources": false, + "isolatedModules": true, + "moduleResolution": "node", + "noUnusedLocals": false, + "noUnusedParameters": false, + "preserveWatchOutput": true, + "skipLibCheck": true, + "strict": true + }, + "exclude": ["node_modules"] +} diff --git a/apps/www/public/customers-rss.xml b/apps/www/public/customers-rss.xml index 61be78e34d1..3ddf8d8eabd 100644 --- a/apps/www/public/customers-rss.xml +++ b/apps/www/public/customers-rss.xml @@ -5,105 +5,105 @@ https://supabase.com Latest news from Supabase en - Wed, 29 Nov 2023 23:00:00 GMT + Wed, 29 Nov 2023 16:00:00 GMT https://supabase.com/customers/shotgun Supabase migration delivers an 83% reduction in data infrastructure costs for Shotgun https://supabase.com/customers/shotgun Discover how Shotgun, an event ticketing platform with over 3 million users, reduced costs and consolidated systems through migration to Supabase. - Wed, 29 Nov 2023 23:00:00 GMT + Wed, 29 Nov 2023 16:00:00 GMT https://supabase.com/customers/next-door-lending How Next Door Lending leveraged Supabase to become a top 10 mortgage broker https://supabase.com/customers/next-door-lending Discover how Supabase empowered NextDoorLending to move quickly and scale as required, leading to their surpassing other mortgage brokers and expanding their business. - Tue, 07 Nov 2023 23:00:00 GMT + Tue, 07 Nov 2023 16:00:00 GMT https://supabase.com/customers/good-tape Good Tape migrates to Supabase managed Postgres and Authentication and achieves database efficiency and a 60% cost reduction. https://supabase.com/customers/good-tape Explore how Good Tape achieved remarkable database efficiency and reduced costs by 60% through their successful migration to Supabase's managed services. - Mon, 30 Oct 2023 23:00:00 GMT + Mon, 30 Oct 2023 16:00:00 GMT https://supabase.com/customers/pebblely Scaling securely: one million users in 7 months with Supabase Auth https://supabase.com/customers/pebblely Learn how Pebblely, an AI image generation company, used Supabase Auth to handle Single Sign On for their rapidly growing user base. - Thu, 28 Sep 2023 22:00:00 GMT + Thu, 28 Sep 2023 16:00:00 GMT https://supabase.com/customers/chatbase Bootstrapped founder builds an AI app with Supabase and scales to $1M in 5 months https://supabase.com/customers/chatbase How Yasser leveraged Supabase to build Chatbase and became one of the most successful single-founder AI products. - Tue, 05 Sep 2023 22:00:00 GMT + Tue, 05 Sep 2023 16:00:00 GMT https://supabase.com/customers/quivr Quivr launch 5,000 Vector databases on Supabase. https://supabase.com/customers/quivr Learn how one of the most popular Generative AI projects uses Supabase as their Vector Store. - Mon, 04 Sep 2023 22:00:00 GMT + Mon, 04 Sep 2023 16:00:00 GMT https://supabase.com/customers/berriai Berri AI boosts productivity by migrating from AWS RDS to Supabase Vector https://supabase.com/customers/berriai Learn how Berri AI overcame challenges with self-hosting their vector database on AWS RDS and successfully migrated to Supabase. - Mon, 05 Jun 2023 22:00:00 GMT + Mon, 05 Jun 2023 16:00:00 GMT https://supabase.com/customers/markprompt Markprompt and Supabase - GDPR-compliant AI chatbots for docs and websites. https://supabase.com/customers/markprompt AI-powered chatbot platform, Markprompt, empowers developers to deliver efficient and GDPR-compliant prompt experiences on top of their content, by leveraging Supabase's secure and privacy-focused vector database and authentication solutions. - Tue, 16 May 2023 22:00:00 GMT + Tue, 16 May 2023 16:00:00 GMT https://supabase.com/customers/mendableai Mendable switches from Pinecone to Supabase Vector for PostgreSQL vector embeddings. https://supabase.com/customers/mendableai How Mendable boosts efficiency and accuracy of chat powered search for documentation using Supabase Vector. - Thu, 04 May 2023 22:00:00 GMT + Thu, 04 May 2023 16:00:00 GMT https://supabase.com/customers/happyteams HappyTeams unlocks better performance and reduces cost with Supabase. https://supabase.com/customers/happyteams How a bootstrapped startup migrated from Heroku to Supabase in 30 minutes and never looked back. - Wed, 15 Feb 2023 23:00:00 GMT + Wed, 15 Feb 2023 16:00:00 GMT https://supabase.com/customers/xendit Xendit use Supabase and create a full solution shipped to production in less than one week. https://supabase.com/customers/xendit As a payment processor, Xendit are responsible for verifying that all transactions are legal. - Mon, 13 Feb 2023 23:00:00 GMT + Mon, 13 Feb 2023 16:00:00 GMT https://supabase.com/customers/replenysh Replenysh uses Supabase to implement OTP in less than 24 hours. https://supabase.com/customers/replenysh With Supabase, Replenysh gets a slick auth experience, reduces DevOps overhead, and continues to scale with Postgres. - Mon, 13 Feb 2023 23:00:00 GMT + Mon, 13 Feb 2023 16:00:00 GMT https://supabase.com/customers/mobbin How Mobbin migrated 200,000 users from Firebase for a better authentication experience. https://supabase.com/customers/mobbin Mobbin helps over 200,000 creators globally search and view the latest design patterns from well-known apps. - Mon, 13 Feb 2023 23:00:00 GMT + Mon, 13 Feb 2023 16:00:00 GMT https://supabase.com/customers/epsilon3 Epsilon3 digitize paper-based procedures in the space industry using telemetry data, simplifying testing and operations. https://supabase.com/customers/epsilon3 Epsilon3 uses Supabase to help teams execute secure and reliable operations in an industry where project spend runs into the billions. - Mon, 13 Feb 2023 23:00:00 GMT + Mon, 13 Feb 2023 16:00:00 GMT diff --git a/apps/www/public/planetpg-angelico_de_los_reyes-rss.xml b/apps/www/public/planetpg-angelico_de_los_reyes-rss.xml index 315db97c064..1085e7ff935 100644 --- a/apps/www/public/planetpg-angelico_de_los_reyes-rss.xml +++ b/apps/www/public/planetpg-angelico_de_los_reyes-rss.xml @@ -5,35 +5,35 @@ https://supabase.com/blog Latest Postgres news from Angelico de los Reyes at Supabase en - Thu, 15 Dec 2022 23:00:00 GMT + Thu, 15 Dec 2022 16: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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 22:00:00 GMT + Sat, 01 Aug 2020 16: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 22:00:00 GMT + Wed, 08 Jul 2020 16: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 22:00:00 GMT + Mon, 06 Jul 2020 16:00:00 GMT diff --git a/apps/www/public/planetpg-ant_wilson-rss.xml b/apps/www/public/planetpg-ant_wilson-rss.xml index 7733d8ee02d..8ce4387e596 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 23:00:00 GMT + Fri, 26 Feb 2021 16: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 23:00:00 GMT + Fri, 26 Feb 2021 16:00:00 GMT diff --git a/apps/www/public/planetpg-bo_lu-rss.xml b/apps/www/public/planetpg-bo_lu-rss.xml index 2f5f7f12e6c..60399534f4f 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, 13 Dec 2023 23:00:00 GMT + Wed, 13 Dec 2023 16:00:00 GMT https://supabase.com/blog/supabase-wrappers-v02 Supabase Wrappers v0.2: Query Pushdown & Remote Subqueries https://supabase.com/blog/supabase-wrappers-v02 Supabase Wrappers v0.2 brings more Wrappers, query pushdown, remote subquery, and more - Wed, 13 Dec 2023 23:00:00 GMT + Wed, 13 Dec 2023 16:00:00 GMT diff --git a/apps/www/public/planetpg-burggraf-rss.xml b/apps/www/public/planetpg-burggraf-rss.xml index 60c2881d539..3bec1f37cf3 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 23:00:00 GMT + Wed, 23 Nov 2022 16: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 23:00:00 GMT + Wed, 23 Nov 2022 16: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 22:00:00 GMT + Sun, 02 Oct 2022 16:00:00 GMT diff --git a/apps/www/public/planetpg-egor_romanov-rss.xml b/apps/www/public/planetpg-egor_romanov-rss.xml index 1f1992ad3bc..f7b4a45db09 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 22:00:00 GMT + Wed, 02 Aug 2023 16: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 22:00:00 GMT + Wed, 02 Aug 2023 16:00:00 GMT https://supabase.com/blog/pgvector-performance pgvector 0.4.0 performance https://supabase.com/blog/pgvector-performance 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. - Wed, 12 Jul 2023 22:00:00 GMT + Wed, 12 Jul 2023 16:00:00 GMT diff --git a/apps/www/public/planetpg-filipe-rss.xml b/apps/www/public/planetpg-filipe-rss.xml index 8c8374f7380..2d50dfea8f7 100644 --- a/apps/www/public/planetpg-filipe-rss.xml +++ b/apps/www/public/planetpg-filipe-rss.xml @@ -5,14 +5,14 @@ https://supabase.com/blog Latest Postgres news from Filipe Cabaço at Supabase en - Mon, 08 Jan 2024 23:00:00 GMT + Mon, 08 Jan 2024 16:00:00 GMT https://supabase.com/blog/elixir-clustering-using-postgres Elixir clustering using Postgres https://supabase.com/blog/elixir-clustering-using-postgres Learn about our approach to connecting multiple nodes in Elixir using Postgres - Mon, 08 Jan 2024 23:00:00 GMT + Mon, 08 Jan 2024 16:00:00 GMT diff --git a/apps/www/public/planetpg-gregnr-rss.xml b/apps/www/public/planetpg-gregnr-rss.xml index 38d0e18e8c1..ca204372a1a 100644 --- a/apps/www/public/planetpg-gregnr-rss.xml +++ b/apps/www/public/planetpg-gregnr-rss.xml @@ -5,28 +5,28 @@ https://supabase.com/blog Latest Postgres news from Greg Richardson at Supabase en - Tue, 05 Sep 2023 22:00:00 GMT + Tue, 05 Sep 2023 16: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 22:00:00 GMT + Tue, 05 Sep 2023 16: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 22:00:00 GMT + Wed, 02 Aug 2023 16: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 23:00:00 GMT + Sun, 05 Feb 2023 16:00:00 GMT diff --git a/apps/www/public/planetpg-michel-rss.xml b/apps/www/public/planetpg-michel-rss.xml index 579efc5a58f..456793162f4 100644 --- a/apps/www/public/planetpg-michel-rss.xml +++ b/apps/www/public/planetpg-michel-rss.xml @@ -5,21 +5,14 @@ https://supabase.com/blog Latest Postgres news from Michel Pelletier at Supabase en - Thu, 15 Dec 2022 23:00:00 GMT + Thu, 15 Dec 2022 16: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 23: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 23:00:00 GMT + Thu, 15 Dec 2022 16:00:00 GMT diff --git a/apps/www/public/planetpg-oli_rice-rss.xml b/apps/www/public/planetpg-oli_rice-rss.xml index e47141794e3..11a82ee4d1b 100644 --- a/apps/www/public/planetpg-oli_rice-rss.xml +++ b/apps/www/public/planetpg-oli_rice-rss.xml @@ -5,63 +5,63 @@ https://supabase.com/blog Latest Postgres news from Oliver Rice at Supabase en - Tue, 12 Dec 2023 23:00:00 GMT + Tue, 12 Dec 2023 16:00:00 GMT https://supabase.com/blog/postgrest-12 PostgREST 12 https://supabase.com/blog/postgrest-12 PostgREST 12 is out and we take a look at some of the major new features like JWT Caching and Aggregate Functions - Tue, 12 Dec 2023 23:00:00 GMT + Tue, 12 Dec 2023 16:00:00 GMT https://supabase.com/blog/pg-graphql-postgres-functions pg_graphql: Postgres functions now supported https://supabase.com/blog/pg-graphql-postgres-functions pg_graphql now supports the most requested feature: Postgres functions a.k.a. User Defined Functions (UDFs) - Mon, 11 Dec 2023 23:00:00 GMT + Mon, 11 Dec 2023 16: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 22:00:00 GMT + Wed, 02 Aug 2023 16: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 22:00:00 GMT + Thu, 20 Apr 2023 16: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 23:00:00 GMT + Thu, 16 Feb 2023 16: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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 22:00:00 GMT + Thu, 18 Aug 2022 16: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 23:00:00 GMT + Mon, 07 Mar 2022 16:00:00 GMT diff --git a/apps/www/public/planetpg-paul_copplestone-rss.xml b/apps/www/public/planetpg-paul_copplestone-rss.xml index 6859d0a9c79..3bc16e20021 100644 --- a/apps/www/public/planetpg-paul_copplestone-rss.xml +++ b/apps/www/public/planetpg-paul_copplestone-rss.xml @@ -5,42 +5,42 @@ https://supabase.com/blog Latest Postgres news from Paul Copplestone at Supabase en - Sun, 30 Apr 2023 22:00:00 GMT + Sun, 30 Apr 2023 16: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 22:00:00 GMT + Sun, 30 Apr 2023 16: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 23:00:00 GMT + Fri, 09 Dec 2022 16: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 22:00:00 GMT + Mon, 27 Jun 2022 16: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 23:00:00 GMT + Thu, 04 Mar 2021 16: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 23:00:00 GMT + Tue, 17 Nov 2020 16:00:00 GMT diff --git a/apps/www/public/planetpg-pavel-rss.xml b/apps/www/public/planetpg-pavel-rss.xml index efdbe154a7a..45b7e6abde8 100644 --- a/apps/www/public/planetpg-pavel-rss.xml +++ b/apps/www/public/planetpg-pavel-rss.xml @@ -5,28 +5,42 @@ https://supabase.com/blog Latest Postgres news from Pavel Borisov at Supabase en - Wed, 12 Jul 2023 22:00:00 GMT + Wed, 01 May 2024 16:00:00 GMT + https://supabase.com/blog/pgvector-0-7-0 + What's new in pgvector v0.7.0 + https://supabase.com/blog/pgvector-0-7-0 + Exploring new features in pgvector v0.7.0 + Wed, 01 May 2024 16:00:00 GMT + + + https://supabase.com/blog/postgres-bloat + Postgres Bloat Minimization + https://supabase.com/blog/postgres-bloat + Understanding and minimizing Postgres table bloat + Thu, 25 Apr 2024 16:00:00 GMT + + https://supabase.com/blog/pgvector-performance pgvector 0.4.0 performance https://supabase.com/blog/pgvector-performance 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. - Wed, 12 Jul 2023 22:00:00 GMT + Wed, 12 Jul 2023 16: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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 22:00:00 GMT + Wed, 26 Oct 2022 16:00:00 GMT diff --git a/apps/www/public/planetpg-philipp-rss.xml b/apps/www/public/planetpg-philipp-rss.xml index 7aaabf59808..62295896d50 100644 --- a/apps/www/public/planetpg-philipp-rss.xml +++ b/apps/www/public/planetpg-philipp-rss.xml @@ -5,14 +5,14 @@ https://supabase.com/blog Latest Postgres news from Philipp Steinrötter at Supabase en - Thu, 07 Dec 2023 23:00:00 GMT + Thu, 07 Dec 2023 16:00:00 GMT https://supabase.com/blog/postgres-language-server-implementing-parser Postgres Language Server: implementing the Parser https://supabase.com/blog/postgres-language-server-implementing-parser A detailed analysis of our iterations to implement a Parser for Postgres - Thu, 07 Dec 2023 23:00:00 GMT + Thu, 07 Dec 2023 16:00:00 GMT diff --git a/apps/www/public/planetpg-raminder_singh-rss.xml b/apps/www/public/planetpg-raminder_singh-rss.xml index 78ac26bfdad..0669108b041 100644 --- a/apps/www/public/planetpg-raminder_singh-rss.xml +++ b/apps/www/public/planetpg-raminder_singh-rss.xml @@ -5,21 +5,21 @@ https://supabase.com/blog Latest Postgres news from Raminder Singh at Supabase en - Wed, 10 Apr 2024 22:00:00 GMT + Wed, 10 Apr 2024 16:00:00 GMT https://supabase.com/blog/postgres-roles-and-privileges Postgres Roles and Privileges https://supabase.com/blog/postgres-roles-and-privileges A guide to Postgres roles and privileges - Wed, 10 Apr 2024 22:00:00 GMT + Wed, 10 Apr 2024 16:00:00 GMT https://supabase.com/blog/how-pg-graphql-works How pg_graphql works https://supabase.com/blog/how-pg-graphql-works An insight into the internals of GraphQL in Postgres using pg_graphql, and how you can contribute. - Tue, 23 Jan 2024 23:00:00 GMT + Tue, 23 Jan 2024 16:00:00 GMT diff --git a/apps/www/public/planetpg-stas-rss.xml b/apps/www/public/planetpg-stas-rss.xml index ab384bd4cfd..1aec518ee0a 100644 --- a/apps/www/public/planetpg-stas-rss.xml +++ b/apps/www/public/planetpg-stas-rss.xml @@ -5,14 +5,14 @@ https://supabase.com/blog Latest Postgres news from Stanislav Muzhyk at Supabase en - Tue, 12 Dec 2023 23:00:00 GMT + Tue, 12 Dec 2023 16:00:00 GMT https://supabase.com/blog/supavisor-postgres-connection-pooler Supavisor 1.0: a scalable connection pooler for Postgres https://supabase.com/blog/supavisor-postgres-connection-pooler Supavisor is now used across all projects, providing a scalable and cloud-native Postgres connection pooler that can handle millions of connections - Tue, 12 Dec 2023 23:00:00 GMT + Tue, 12 Dec 2023 16:00:00 GMT diff --git a/apps/www/public/planetpg-steve_chavez-rss.xml b/apps/www/public/planetpg-steve_chavez-rss.xml index d847d3c1fb7..3fa9a2969f4 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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 22:00:00 GMT + Thu, 01 Jul 2021 16:00:00 GMT diff --git a/apps/www/public/planetpg-victor-rss.xml b/apps/www/public/planetpg-victor-rss.xml index fa14b827b4b..a5d33f9feaf 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 22:00:00 GMT + Thu, 13 Oct 2022 16: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 22:00:00 GMT + Thu, 13 Oct 2022 16: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 22:00:00 GMT + Wed, 07 Sep 2022 16: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 22:00:00 GMT + Sun, 17 Jul 2022 16:00:00 GMT diff --git a/apps/www/public/rss.xml b/apps/www/public/rss.xml index 5ef80f7d55c..28f5c5f439d 100644 --- a/apps/www/public/rss.xml +++ b/apps/www/public/rss.xml @@ -5,1855 +5,1890 @@ https://supabase.com Latest news from Supabase en - Wed, 17 Apr 2024 22:00:00 GMT + Wed, 08 May 2024 16:00:00 GMT + https://supabase.com/blog/meetup-kahoot-alternative + Kahoot alternative at GA week community meetup + https://supabase.com/blog/meetup-kahoot-alternative + How we built a Kahoot alternative for our Supabase meetup to boost up the community meetup. + Wed, 08 May 2024 16:00:00 GMT + + + https://supabase.com/blog/pgvector-0-7-0 + What's new in pgvector v0.7.0 + https://supabase.com/blog/pgvector-0-7-0 + Exploring new features in pgvector v0.7.0 + Wed, 01 May 2024 16:00:00 GMT + + + https://supabase.com/blog/supabase-oss-hackathon-winners + Open Source Hackathon 2024 winners + https://supabase.com/blog/supabase-oss-hackathon-winners + Announcing the winners of the Open Source Hackathon 2024! + Mon, 29 Apr 2024 16:00:00 GMT + + + https://supabase.com/blog/postgres-bloat + Postgres Bloat Minimization + https://supabase.com/blog/postgres-bloat + Understanding and minimizing Postgres table bloat + Thu, 25 Apr 2024 16:00:00 GMT + + + https://supabase.com/blog/nix-postgres + Packaging Supabase with Nix + https://supabase.com/blog/nix-postgres + + Wed, 24 Apr 2024 16:00:00 GMT + + + https://supabase.com/blog/exploring-support-tooling + Exploring Support Tooling at Supabase: A Dive into SLA Buddy + https://supabase.com/blog/exploring-support-tooling + In this post, we explore the support tooling at Supabase, and how we use SLA Buddy to monitor our SLAs. + Wed, 24 Apr 2024 16:00:00 GMT + + https://supabase.com/blog/security-performance-advisor Supabase Security Advisor & Performance Advisor https://supabase.com/blog/security-performance-advisor We're making it easier to build a secure and high-performing application. - Wed, 17 Apr 2024 22:00:00 GMT + Wed, 17 Apr 2024 16:00:00 GMT https://supabase.com/blog/ga-week-summary Top 10 Launches from Supabase GA Week https://supabase.com/blog/ga-week-summary A recap of the most important launches and updates from the week. - Wed, 17 Apr 2024 22:00:00 GMT + Wed, 17 Apr 2024 16:00:00 GMT https://supabase.com/blog/s3-compatible-storage Supabase Storage: now supports the S3 protocol https://supabase.com/blog/s3-compatible-storage Supabase Storage is now officially an S3-Compatible Storage Provider. - Wed, 17 Apr 2024 22:00:00 GMT + Wed, 17 Apr 2024 16:00:00 GMT https://supabase.com/blog/anonymous-sign-ins Supabase Auth now supports Anonymous Sign-ins https://supabase.com/blog/anonymous-sign-ins Sign in as an anonymous user to authenticate with Supabase - Tue, 16 Apr 2024 22:00:00 GMT + Tue, 16 Apr 2024 16:00:00 GMT https://supabase.com/blog/ai-inference-now-available-in-supabase-edge-functions AI Inference now available in Supabase Edge Functions https://supabase.com/blog/ai-inference-now-available-in-supabase-edge-functions Use embeddings and large language models on the edge with Supabase Edge Functions. - Mon, 15 Apr 2024 22:00:00 GMT + Mon, 15 Apr 2024 16:00:00 GMT https://supabase.com/blog/supabase-swift Supabase Swift https://supabase.com/blog/supabase-swift Supabase Swift is now officially supported. - Sun, 14 Apr 2024 22:00:00 GMT + Sun, 14 Apr 2024 16:00:00 GMT https://supabase.com/blog/supabase-bootstrap Supabase Bootstrap: the fastest way to launch a new project https://supabase.com/blog/supabase-bootstrap Launch a new hosted Supabase project directly from the CLI using pre-built applications. - Sun, 14 Apr 2024 22:00:00 GMT + Sun, 14 Apr 2024 16:00:00 GMT https://supabase.com/blog/supabase-aws-marketplace Supabase on the AWS Marketplace https://supabase.com/blog/supabase-aws-marketplace Supabase is now available on the AWS Marketplace, Simplifying Procurement for Enterprise Customers. - Sun, 14 Apr 2024 22:00:00 GMT + Sun, 14 Apr 2024 16:00:00 GMT https://supabase.com/blog/supabase-aquires-oriole Oriole joins Supabase https://supabase.com/blog/supabase-aquires-oriole The Oriole team are joining Supabase to build a faster storage engine for Postgres. - Sun, 14 Apr 2024 22:00:00 GMT + Sun, 14 Apr 2024 16:00:00 GMT https://supabase.com/blog/branching-publicly-available Branching now Publicly Available https://supabase.com/blog/branching-publicly-available Supabase Branching is now available on Pro Plan and above. - Sun, 14 Apr 2024 22:00:00 GMT + Sun, 14 Apr 2024 16:00:00 GMT https://supabase.com/blog/supabase-oss-hackathon Supabase Open Source Hackathon 2024 https://supabase.com/blog/supabase-oss-hackathon Build an Open Source Project over 10 days. 5 prize categories. - Thu, 11 Apr 2024 22:00:00 GMT + Thu, 11 Apr 2024 16:00:00 GMT https://supabase.com/blog/postgres-roles-and-privileges Postgres Roles and Privileges https://supabase.com/blog/postgres-roles-and-privileges A guide to Postgres roles and privileges - Wed, 10 Apr 2024 22:00:00 GMT + Wed, 10 Apr 2024 16:00:00 GMT https://supabase.com/blog/pg-paper-dump Announcing Data Preservation Service https://supabase.com/blog/pg-paper-dump Secure, reliable and timeless backups - Sun, 31 Mar 2024 22:00:00 GMT + Sun, 31 Mar 2024 16:00:00 GMT https://supabase.com/blog/semantic-image-search-amazon-bedrock Implementing semantic image search with Amazon Titan and Supabase Vector https://supabase.com/blog/semantic-image-search-amazon-bedrock Implementing semantic image search with Amazon Titan and Supabase Vector in Python. - Mon, 25 Mar 2024 23:00:00 GMT + Mon, 25 Mar 2024 16:00:00 GMT https://supabase.com/blog/postgrest-aggregate-functions PostgREST Aggregate Functions https://supabase.com/blog/postgrest-aggregate-functions Summarize your data by performing calculations across groups of rows in PostgREST - Wed, 28 Feb 2024 23:00:00 GMT + Wed, 28 Feb 2024 16:00:00 GMT https://supabase.com/blog/content-recommendation-with-flutter Build a content recommendation app with Flutter and OpenAI https://supabase.com/blog/content-recommendation-with-flutter Build a movie-viewing app that recommends another movie based on what the user is viewing using OpenAI, Flutter and Supabase. - Sun, 25 Feb 2024 23:00:00 GMT + Sun, 25 Feb 2024 16:00:00 GMT https://supabase.com/blog/automating-performance-tests Automating performance tests https://supabase.com/blog/automating-performance-tests Learn about our story to get to the automated performance testing. - Tue, 20 Feb 2024 23:00:00 GMT + Tue, 20 Feb 2024 16:00:00 GMT https://supabase.com/blog/matryoshka-embeddings Matryoshka embeddings: faster OpenAI vector search using Adaptive Retrieval https://supabase.com/blog/matryoshka-embeddings Use Adaptive Retrieval to improve query performance with OpenAI's new embedding models - Mon, 12 Feb 2024 23:00:00 GMT + Mon, 12 Feb 2024 16:00:00 GMT https://supabase.com/blog/nosql-mongodb-compatibility-with-ferretdb-and-flydotio NoSQL Postgres: Add MongoDB compatibility to your Supabase projects with FerretDB https://supabase.com/blog/nosql-mongodb-compatibility-with-ferretdb-and-flydotio NoSQL Postgres: Add MongoDB compatibility to your Supabase projects with FerretDB - Tue, 30 Jan 2024 23:00:00 GMT + Tue, 30 Jan 2024 16:00:00 GMT https://supabase.com/blog/pgvector-fast-builds pgvector 0.6.0: 30x faster with parallel index builds https://supabase.com/blog/pgvector-fast-builds pgvector 0.6.0 brings a significant improvement: parallel index builds for HNSW. Building an HNSW index is now up to 30x faster for unlogged tables. - Mon, 29 Jan 2024 23:00:00 GMT + Mon, 29 Jan 2024 16:00:00 GMT https://supabase.com/blog/ruby-on-rails-postgres Getting started with Ruby on Rails and Postgres on Supabase https://supabase.com/blog/ruby-on-rails-postgres Learn how to create a new Rails app and connect it to a Supabase Postgres database. - Sun, 28 Jan 2024 23:00:00 GMT + Sun, 28 Jan 2024 16:00:00 GMT https://supabase.com/blog/flutter-figma-clone Create a Figma Clone app with Flutter and Supabase Realtime https://supabase.com/blog/flutter-figma-clone A tutorial on how to build a collaborative design app like Figma using Flutter and Supabase Realtime. - Thu, 25 Jan 2024 23:00:00 GMT + Thu, 25 Jan 2024 16:00:00 GMT https://supabase.com/blog/how-pg-graphql-works How pg_graphql works https://supabase.com/blog/how-pg-graphql-works An insight into the internals of GraphQL in Postgres using pg_graphql, and how you can contribute. - Tue, 23 Jan 2024 23:00:00 GMT + Tue, 23 Jan 2024 16:00:00 GMT https://supabase.com/blog/laravel-postgres Getting started with Laravel and Postgres https://supabase.com/blog/laravel-postgres Learn how to create a new Laravel PHP app and connect it to a Supabase PostgreSQL database. - Sun, 21 Jan 2024 23:00:00 GMT + Sun, 21 Jan 2024 16:00:00 GMT https://supabase.com/blog/what-is-saml-authentication What is SAML? A practical guide to the authentication protocol https://supabase.com/blog/what-is-saml-authentication Learn what is SAML authentication, how it differentiates from SSO, SAML with Postgres, and more. - Tue, 16 Jan 2024 23:00:00 GMT + Tue, 16 Jan 2024 16:00:00 GMT https://supabase.com/blog/ipv6 Brace yourself, IPv6 is coming https://supabase.com/blog/ipv6 On February 1st 2024, AWS will start charging for IPv4 addresses. This is a big deal for the internet, and we're here to help you prepare. - Thu, 11 Jan 2024 23:00:00 GMT + Thu, 11 Jan 2024 16:00:00 GMT https://supabase.com/blog/react-query-nextjs-app-router-cache-helpers Using React Query with Next.js App Router and Supabase Cache Helpers https://supabase.com/blog/react-query-nextjs-app-router-cache-helpers Learn how to use React Query in Next.js Client & Server Components for data fetching with Supabase. - Thu, 11 Jan 2024 23:00:00 GMT + Thu, 11 Jan 2024 16:00:00 GMT https://supabase.com/blog/elixir-clustering-using-postgres Elixir clustering using Postgres https://supabase.com/blog/elixir-clustering-using-postgres Learn about our approach to connecting multiple nodes in Elixir using Postgres - Mon, 08 Jan 2024 23:00:00 GMT + Mon, 08 Jan 2024 16:00:00 GMT https://supabase.com/blog/beta-update-december-2023 Supabase Beta December 2023 https://supabase.com/blog/beta-update-december-2023 A Launch Week X rundown with all the fantastic goodies we shipped - Thu, 04 Jan 2024 23:00:00 GMT + Thu, 04 Jan 2024 16:00:00 GMT https://supabase.com/blog/launch-week-x-hackathon-winners Launch Week X Hackathon Winners https://supabase.com/blog/launch-week-x-hackathon-winners Announcing the winners of the Launch Week X Hackathon! - Wed, 03 Jan 2024 23:00:00 GMT + Wed, 03 Jan 2024 16:00:00 GMT https://supabase.com/blog/launch-week-x-best-launches Top 10 Launches of LWX https://supabase.com/blog/launch-week-x-best-launches Our CEO takes a look at his favorite ships from LWX - Mon, 18 Dec 2023 23:00:00 GMT + Mon, 18 Dec 2023 16:00:00 GMT https://supabase.com/blog/introducing-read-replicas Introducing Read Replicas https://supabase.com/blog/introducing-read-replicas We are launching support for Postgres Read Replicas - Thu, 14 Dec 2023 23:00:00 GMT + Thu, 14 Dec 2023 16:00:00 GMT https://supabase.com/blog/client-libraries-v2 Supabase Libraries V2: Python, Swift, Kotlin, Flutter, and Typescript https://supabase.com/blog/client-libraries-v2 Swift, Kotlin, C#, and Python are now stable and moving to the v2 API. - Thu, 14 Dec 2023 23:00:00 GMT + Thu, 14 Dec 2023 16:00:00 GMT https://supabase.com/blog/postgres-on-fly-by-supabase Fly Postgres, managed by Supabase https://supabase.com/blog/postgres-on-fly-by-supabase A managed Postgres offering developed by Supabase and Fly.io - Thu, 14 Dec 2023 23:00:00 GMT + Thu, 14 Dec 2023 16:00:00 GMT https://supabase.com/blog/supabase-auth-identity-linking-hooks Supabase Auth: Identity Linking, Hooks, and HaveIBeenPwned integration https://supabase.com/blog/supabase-auth-identity-linking-hooks Four major Auth features: Identity Linking, Session Control, Leaked Password Protection, and Hooks - Wed, 13 Dec 2023 23:00:00 GMT + Wed, 13 Dec 2023 16:00:00 GMT https://supabase.com/blog/supabase-wrappers-v02 Supabase Wrappers v0.2: Query Pushdown & Remote Subqueries https://supabase.com/blog/supabase-wrappers-v02 Supabase Wrappers v0.2 brings more Wrappers, query pushdown, remote subquery, and more - Wed, 13 Dec 2023 23:00:00 GMT + Wed, 13 Dec 2023 16:00:00 GMT https://supabase.com/blog/supabase-branching Supabase Branching https://supabase.com/blog/supabase-branching A Postgres database for every Pull Request. - Tue, 12 Dec 2023 23:00:00 GMT + Tue, 12 Dec 2023 16:00:00 GMT https://supabase.com/blog/supavisor-postgres-connection-pooler Supavisor 1.0: a scalable connection pooler for Postgres https://supabase.com/blog/supavisor-postgres-connection-pooler Supavisor is now used across all projects, providing a scalable and cloud-native Postgres connection pooler that can handle millions of connections - Tue, 12 Dec 2023 23:00:00 GMT + Tue, 12 Dec 2023 16:00:00 GMT https://supabase.com/blog/postgrest-12 PostgREST 12 https://supabase.com/blog/postgrest-12 PostgREST 12 is out and we take a look at some of the major new features like JWT Caching and Aggregate Functions - Tue, 12 Dec 2023 23:00:00 GMT + Tue, 12 Dec 2023 16:00:00 GMT https://supabase.com/blog/edge-functions-node-npm Edge Functions: Node and native npm compatibility https://supabase.com/blog/edge-functions-node-npm We're adding Node and native npm compatibility for Edge Functions. - Mon, 11 Dec 2023 23:00:00 GMT + Mon, 11 Dec 2023 16:00:00 GMT https://supabase.com/blog/pg-graphql-postgres-functions pg_graphql: Postgres functions now supported https://supabase.com/blog/pg-graphql-postgres-functions pg_graphql now supports the most requested feature: Postgres functions a.k.a. User Defined Functions (UDFs) - Mon, 11 Dec 2023 23:00:00 GMT + Mon, 11 Dec 2023 16:00:00 GMT https://supabase.com/blog/studio-introducing-assistant Supabase Studio: AI Assistant and User Impersonation https://supabase.com/blog/studio-introducing-assistant We're introducing the next generation of our AI Assistant and some features that will help get your ideas into code even faster. - Sun, 10 Dec 2023 23:00:00 GMT + Sun, 10 Dec 2023 16:00:00 GMT https://supabase.com/blog/postgres-language-server-implementing-parser Postgres Language Server: implementing the Parser https://supabase.com/blog/postgres-language-server-implementing-parser A detailed analysis of our iterations to implement a Parser for Postgres - Thu, 07 Dec 2023 23:00:00 GMT + Thu, 07 Dec 2023 16:00:00 GMT https://supabase.com/blog/how-design-works-at-supabase How design works at Supabase https://supabase.com/blog/how-design-works-at-supabase The transformative journey of Supabase's Design team and its unique culture to enhance the output and quality of the entire company. - Thu, 07 Dec 2023 23:00:00 GMT + Thu, 07 Dec 2023 16:00:00 GMT https://supabase.com/blog/supabase-hackathon-lwx Supabase Launch Week X Hackathon https://supabase.com/blog/supabase-hackathon-lwx Build an Open Source Project over 10 days. 5 prize categories. - Mon, 04 Dec 2023 23:00:00 GMT + Mon, 04 Dec 2023 16:00:00 GMT https://supabase.com/blog/community-meetups-lwx Launch Week X Community Meetups https://supabase.com/blog/community-meetups-lwx The Supabase Community Meetups are back, and this time we've got more events happening all over the world! - Mon, 04 Dec 2023 23:00:00 GMT + Mon, 04 Dec 2023 16:00:00 GMT https://supabase.com/blog/beta-update-november-2023 Supabase Beta November 2023 https://supabase.com/blog/beta-update-november-2023 Launch Week X is coming! But we still have cool updates that we couldn't fit next week. - Mon, 04 Dec 2023 23:00:00 GMT + Mon, 04 Dec 2023 16:00:00 GMT https://supabase.com/blog/automatic-cli-login Automatic CLI login https://supabase.com/blog/automatic-cli-login Explore the technical implementation and security measures behind CLI's new automatic login feature. - Thu, 30 Nov 2023 23:00:00 GMT + Thu, 30 Nov 2023 16:00:00 GMT https://supabase.com/blog/oauth2-login-python-flask-apps GitHub OAuth in your Python Flask app https://supabase.com/blog/oauth2-login-python-flask-apps A step-by-step guide on building Login with Github into your Python apps. - Mon, 20 Nov 2023 23:00:00 GMT + Mon, 20 Nov 2023 16:00:00 GMT https://supabase.com/blog/react-native-authentication Getting started with React Native authentication https://supabase.com/blog/react-native-authentication Learn how to implement authentication in your React Native applications. - Wed, 15 Nov 2023 23:00:00 GMT + Wed, 15 Nov 2023 16:00:00 GMT https://supabase.com/blog/beta-update-october-2023 Supabase Beta October 2023 https://supabase.com/blog/beta-update-october-2023 Brand-new features, community content, and (more importantly) the date for our next Launch Week. - Sun, 05 Nov 2023 23:00:00 GMT + Sun, 05 Nov 2023 16:00:00 GMT https://supabase.com/blog/supabase-is-now-compatible-with-nextjs-14 Supabase is now compatible with Next.js 14 https://supabase.com/blog/supabase-is-now-compatible-with-nextjs-14 The fastest way to build apps with Next.js 14 and Supabase - Tue, 31 Oct 2023 23:00:00 GMT + Tue, 31 Oct 2023 16:00:00 GMT https://supabase.com/blog/pgvector-vs-pinecone pgvector vs Pinecone: cost and performance https://supabase.com/blog/pgvector-vs-pinecone Direct performance comparison between pgvector and Pinecone. - Mon, 09 Oct 2023 22:00:00 GMT + Mon, 09 Oct 2023 16:00:00 GMT https://supabase.com/blog/react-native-offline-first-watermelon-db Offline-first React Native Apps with Expo, WatermelonDB, and Supabase https://supabase.com/blog/react-native-offline-first-watermelon-db Store your data locally and sync it with Postgres using WatermelonDB! - Sat, 07 Oct 2023 22:00:00 GMT + Sat, 07 Oct 2023 16:00:00 GMT https://supabase.com/blog/beta-update-september-2023 Supabase Beta September 2023 https://supabase.com/blog/beta-update-september-2023 September was packed with so many new features and releases that it might have seemed like another Launch Week, but it wasn't! - Tue, 03 Oct 2023 22:00:00 GMT + Tue, 03 Oct 2023 16:00:00 GMT https://supabase.com/blog/postgres-dynamic-table-partitioning Dynamic Table Partitioning in Postgres https://supabase.com/blog/postgres-dynamic-table-partitioning Learn how to scale large postgres tables in place and increase query performance. - Mon, 02 Oct 2023 22:00:00 GMT + Mon, 02 Oct 2023 16:00:00 GMT https://supabase.com/blog/beta-update-august-2023 Supabase Beta August 2023 https://supabase.com/blog/beta-update-august-2023 Launch Week 8 review and more things we shipped 🚀 - Thu, 07 Sep 2023 22:00:00 GMT + Thu, 07 Sep 2023 16: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 22:00:00 GMT + Tue, 05 Sep 2023 16: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 22:00:00 GMT + Wed, 30 Aug 2023 16: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 22:00:00 GMT + Wed, 23 Aug 2023 16: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 22:00:00 GMT + Thu, 10 Aug 2023 16: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 22:00:00 GMT + Thu, 10 Aug 2023 16: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 22:00:00 GMT + Thu, 10 Aug 2023 16: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 22:00:00 GMT + Wed, 09 Aug 2023 16: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 22:00:00 GMT + Wed, 09 Aug 2023 16: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 22:00:00 GMT + Tue, 08 Aug 2023 16: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 22:00:00 GMT + Mon, 07 Aug 2023 16: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 22:00:00 GMT + Sun, 06 Aug 2023 16: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 22:00:00 GMT + Fri, 04 Aug 2023 16: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 22:00:00 GMT + Thu, 03 Aug 2023 16: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 22:00:00 GMT + Wed, 02 Aug 2023 16: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 22:00:00 GMT + Tue, 01 Aug 2023 16: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 22:00:00 GMT + Mon, 31 Jul 2023 16: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 22:00:00 GMT + Mon, 24 Jul 2023 16: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 22:00:00 GMT + Mon, 17 Jul 2023 16:00:00 GMT https://supabase.com/blog/pgvector-performance pgvector 0.4.0 performance https://supabase.com/blog/pgvector-performance 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. - Wed, 12 Jul 2023 22:00:00 GMT + Wed, 12 Jul 2023 16: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 22:00:00 GMT + Tue, 11 Jul 2023 16: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 22:00:00 GMT + Wed, 05 Jul 2023 16: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 22:00:00 GMT + Mon, 26 Jun 2023 16: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 22:00:00 GMT + Thu, 08 Jun 2023 16: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 22:00:00 GMT + Sun, 28 May 2023 16: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 22:00:00 GMT + Sun, 28 May 2023 16: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 22:00:00 GMT + Wed, 24 May 2023 16: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 22:00:00 GMT + Sun, 14 May 2023 16: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 22:00:00 GMT + Thu, 11 May 2023 16: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 22:00:00 GMT + Mon, 08 May 2023 16: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 22:00:00 GMT + Wed, 03 May 2023 16: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 22:00:00 GMT + Sun, 30 Apr 2023 16: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 22:00:00 GMT + Sun, 23 Apr 2023 16: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 22:00:00 GMT + Thu, 20 Apr 2023 16: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 22:00:00 GMT + Thu, 13 Apr 2023 16: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 22:00:00 GMT + Thu, 13 Apr 2023 16: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 22:00:00 GMT + Thu, 13 Apr 2023 16: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 22:00:00 GMT + Thu, 13 Apr 2023 16: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 22:00:00 GMT + Wed, 12 Apr 2023 16: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 22:00:00 GMT + Tue, 11 Apr 2023 16: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 22:00:00 GMT + Mon, 10 Apr 2023 16: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 22:00:00 GMT + Sun, 09 Apr 2023 16: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 22:00:00 GMT + Fri, 07 Apr 2023 16: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 22:00:00 GMT + Thu, 06 Apr 2023 16: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 22:00:00 GMT + Thu, 06 Apr 2023 16: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 22:00:00 GMT + Mon, 03 Apr 2023 16:00:00 GMT https://supabase.com/blog/supaclub SupaClub https://supabase.com/blog/supaclub The Worlds First Software Engineering Nightclub. - Fri, 31 Mar 2023 22:00:00 GMT + Fri, 31 Mar 2023 16: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 23:00:00 GMT + Wed, 08 Mar 2023 16: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 23:00:00 GMT + Tue, 28 Feb 2023 16: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 23:00:00 GMT + Thu, 16 Feb 2023 16: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 23:00:00 GMT + Wed, 15 Feb 2023 16: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 23:00:00 GMT + Mon, 13 Feb 2023 16: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 23:00:00 GMT + Tue, 07 Feb 2023 16: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 23:00:00 GMT + Mon, 06 Feb 2023 16: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 23:00:00 GMT + Sun, 05 Feb 2023 16: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 23:00:00 GMT + Wed, 04 Jan 2023 16: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 23:00:00 GMT + Mon, 02 Jan 2023 16: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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 23:00:00 GMT + Thu, 15 Dec 2022 16: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 23:00:00 GMT + Wed, 14 Dec 2022 16: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 23:00:00 GMT + Tue, 13 Dec 2022 16: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 23:00:00 GMT + Mon, 12 Dec 2022 16: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 23:00:00 GMT + Sun, 11 Dec 2022 16: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 23:00:00 GMT + Fri, 09 Dec 2022 16: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 23:00:00 GMT + Thu, 08 Dec 2022 16: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 23:00:00 GMT + Thu, 08 Dec 2022 16: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 23:00:00 GMT + Tue, 06 Dec 2022 16: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 23: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 23:00:00 GMT + Mon, 05 Dec 2022 16: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 23:00:00 GMT + Wed, 23 Nov 2022 16: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 23:00:00 GMT + Mon, 21 Nov 2022 16: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 23:00:00 GMT + Wed, 16 Nov 2022 16: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 23:00:00 GMT + Mon, 07 Nov 2022 16: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 23:00:00 GMT + Tue, 01 Nov 2022 16: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 22:00:00 GMT + Wed, 26 Oct 2022 16: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 22:00:00 GMT + Thu, 20 Oct 2022 16: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 22:00:00 GMT + Wed, 19 Oct 2022 16: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 22:00:00 GMT + Thu, 13 Oct 2022 16: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 22:00:00 GMT + Tue, 04 Oct 2022 16: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 22:00:00 GMT + Sun, 02 Oct 2022 16: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 22:00:00 GMT + Wed, 07 Sep 2022 16: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 22:00:00 GMT + Tue, 06 Sep 2022 16: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 22:00:00 GMT + Wed, 24 Aug 2022 16: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 22:00:00 GMT + Tue, 23 Aug 2022 16: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 22:00:00 GMT + Thu, 18 Aug 2022 16: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 22:00:00 GMT + Thu, 18 Aug 2022 16: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 22:00:00 GMT + Thu, 18 Aug 2022 16: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 22:00:00 GMT + Thu, 18 Aug 2022 16: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 22:00:00 GMT + Thu, 18 Aug 2022 16: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 22:00:00 GMT + Wed, 17 Aug 2022 16: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 22:00:00 GMT + Tue, 16 Aug 2022 16: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 22:00:00 GMT + Mon, 15 Aug 2022 16: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 22:00:00 GMT + Sun, 14 Aug 2022 16: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 22:00:00 GMT + Thu, 11 Aug 2022 16: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 22:00:00 GMT + Tue, 09 Aug 2022 16: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 22:00:00 GMT + Mon, 08 Aug 2022 16: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 22:00:00 GMT + Tue, 02 Aug 2022 16: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 22:00:00 GMT + Mon, 01 Aug 2022 16: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 22:00:00 GMT + Sun, 17 Jul 2022 16: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 22:00:00 GMT + Tue, 12 Jul 2022 16: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 22:00:00 GMT + Tue, 05 Jul 2022 16: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 22:00:00 GMT + Wed, 29 Jun 2022 16: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 22:00:00 GMT + Tue, 28 Jun 2022 16: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 22:00:00 GMT + Mon, 27 Jun 2022 16: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 22:00:00 GMT + Thu, 16 Jun 2022 16: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 22:00:00 GMT + Tue, 31 May 2022 16: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 22:00:00 GMT + Wed, 25 May 2022 16: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 22:00:00 GMT + Tue, 19 Apr 2022 16: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 22:00:00 GMT + Sun, 17 Apr 2022 16: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 22:00:00 GMT + Thu, 14 Apr 2022 16: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 22:00:00 GMT + Thu, 31 Mar 2022 16: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 22:00:00 GMT + Thu, 31 Mar 2022 16: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 22:00:00 GMT + Thu, 31 Mar 2022 16: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 22:00:00 GMT + Wed, 30 Mar 2022 16: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 22:00:00 GMT + Tue, 29 Mar 2022 16: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 22:00:00 GMT + Mon, 28 Mar 2022 16: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 22:00:00 GMT + Sun, 27 Mar 2022 16: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 23:00:00 GMT + Thu, 24 Mar 2022 16: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 23:00:00 GMT + Thu, 24 Mar 2022 16: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 23:00:00 GMT + Mon, 07 Mar 2022 16: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 23:00:00 GMT + Mon, 21 Feb 2022 16: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 23:00:00 GMT + Wed, 19 Jan 2022 16: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 23:00:00 GMT + Wed, 19 Jan 2022 16: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 23:00:00 GMT + Thu, 16 Dec 2021 16: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 23:00:00 GMT + Tue, 14 Dec 2021 16: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 23:00:00 GMT + Thu, 02 Dec 2021 16: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 23:00:00 GMT + Thu, 02 Dec 2021 16: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 23:00:00 GMT + Thu, 02 Dec 2021 16: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 23:00:00 GMT + Wed, 01 Dec 2021 16: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 23:00:00 GMT + Tue, 30 Nov 2021 16: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 23:00:00 GMT + Mon, 29 Nov 2021 16: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 23:00:00 GMT + Sun, 28 Nov 2021 16: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 23:00:00 GMT + Sat, 27 Nov 2021 16: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 23:00:00 GMT + Fri, 26 Nov 2021 16: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 23:00:00 GMT + Thu, 25 Nov 2021 16: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 23:00:00 GMT + Thu, 25 Nov 2021 16: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 23:00:00 GMT + Sat, 06 Nov 2021 16: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 22:00:00 GMT + Wed, 27 Oct 2021 16: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 22:00:00 GMT + Mon, 18 Oct 2021 16: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 22:00:00 GMT + Wed, 13 Oct 2021 16: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 22:00:00 GMT + Sun, 03 Oct 2021 16: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 22:00:00 GMT + Mon, 27 Sep 2021 16: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 22:00:00 GMT + Thu, 09 Sep 2021 16: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 22:00:00 GMT + Wed, 11 Aug 2021 16: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 22:00:00 GMT + Sun, 08 Aug 2021 16: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 22:00:00 GMT + Thu, 29 Jul 2021 16: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 22:00:00 GMT + Thu, 29 Jul 2021 16: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 22:00:00 GMT + Thu, 29 Jul 2021 16: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 22:00:00 GMT + Wed, 28 Jul 2021 16: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 22:00:00 GMT + Tue, 27 Jul 2021 16: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 22:00:00 GMT + Tue, 27 Jul 2021 16: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 22:00:00 GMT + Mon, 26 Jul 2021 16: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 22:00:00 GMT + Mon, 26 Jul 2021 16: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 22:00:00 GMT + Sun, 25 Jul 2021 16: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 22:00:00 GMT + Sun, 25 Jul 2021 16: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 22:00:00 GMT + Sun, 25 Jul 2021 16: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 22:00:00 GMT + Wed, 21 Jul 2021 16: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 22:00:00 GMT + Thu, 01 Jul 2021 16: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 22:00:00 GMT + Tue, 01 Jun 2021 16:00:00 GMT https://supabase.com/blog/supabase-beta-may-2021 Supabase Beta May 2021 https://supabase.com/blog/supabase-beta-may-2021 Apple &amp; Twitter Logins, Supabase Grid, Go &amp; Swift Libraries. - Tue, 01 Jun 2021 22:00:00 GMT + Tue, 01 Jun 2021 16: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 22:00:00 GMT + Tue, 04 May 2021 16: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 22:00:00 GMT + Mon, 05 Apr 2021 16: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 22:00:00 GMT + Thu, 01 Apr 2021 16: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 22:00:00 GMT + Thu, 01 Apr 2021 16: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 22:00:00 GMT + Thu, 01 Apr 2021 16: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 22:00:00 GMT + Wed, 31 Mar 2021 16: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 22:00:00 GMT + Tue, 30 Mar 2021 16: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 22:00:00 GMT + Mon, 29 Mar 2021 16: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 22:00:00 GMT + Sun, 28 Mar 2021 16: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 23:00:00 GMT + Wed, 24 Mar 2021 16: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 23:00:00 GMT + Wed, 24 Mar 2021 16: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 23:00:00 GMT + Sun, 21 Mar 2021 16: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 23:00:00 GMT + Wed, 10 Mar 2021 16: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 23:00:00 GMT + Sun, 07 Mar 2021 16: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 23:00:00 GMT + Thu, 04 Mar 2021 16: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 23:00:00 GMT + Mon, 01 Mar 2021 16: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 23:00:00 GMT + Fri, 26 Feb 2021 16: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 23:00:00 GMT + Mon, 08 Feb 2021 16: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 23:00:00 GMT + Mon, 01 Feb 2021 16: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 23:00:00 GMT + Fri, 01 Jan 2021 16: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 23:00:00 GMT + Sat, 12 Dec 2020 16: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 23:00:00 GMT + Tue, 01 Dec 2020 16: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 23:00:00 GMT + Tue, 01 Dec 2020 16: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 23:00:00 GMT + Tue, 01 Dec 2020 16: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 23:00:00 GMT + Tue, 01 Dec 2020 16: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 23:00:00 GMT + Mon, 30 Nov 2020 16: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 23:00:00 GMT + Tue, 17 Nov 2020 16: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 23:00:00 GMT + Sun, 01 Nov 2020 16: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 23:00:00 GMT + Thu, 29 Oct 2020 16: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 22:00:00 GMT + Fri, 02 Oct 2020 16: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 22:00:00 GMT + Thu, 10 Sep 2020 16: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 22:00:00 GMT + Wed, 02 Sep 2020 16: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 22:00:00 GMT + Tue, 04 Aug 2020 16: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 22:00:00 GMT + Sat, 01 Aug 2020 16: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 22:00:00 GMT + Sat, 01 Aug 2020 16: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 22:00:00 GMT + Thu, 09 Jul 2020 16: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 22:00:00 GMT + Wed, 08 Jul 2020 16: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 22:00:00 GMT + Mon, 06 Jul 2020 16: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 22:00:00 GMT + Tue, 30 Jun 2020 16: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 22:00:00 GMT + Sun, 14 Jun 2020 16: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 22:00:00 GMT + Sun, 31 May 2020 16: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 22:00:00 GMT + Sun, 31 May 2020 16:00:00 GMT diff --git a/apps/www/public/sitemap_www.xml b/apps/www/public/sitemap_www.xml index 4f456e6b163..fa82593d0ac 100644 --- a/apps/www/public/sitemap_www.xml +++ b/apps/www/public/sitemap_www.xml @@ -3,889 +3,889 @@ https://supabase.com/404 weekly - 0.5 + 0.5 https://supabase.com/_app weekly - 0.5 + 0.5 https://supabase.com/beta weekly - 0.5 + 0.5 https://supabase.com/blog weekly - 0.5 + 0.5 https://supabase.com/brand-assets weekly - 0.5 + 0.5 https://supabase.com/changelog weekly - 0.5 + 0.5 https://supabase.com/company weekly - 0.5 - - - - https://supabase.com/support - weekly - 0.5 - - - - https://supabase.com/auth - weekly - 0.5 - - - - https://supabase.com/blog/ - weekly - 0.5 - - - - https://supabase.com/contact/mfa - weekly - 0.5 - - - - https://supabase.com/database - weekly - 0.5 + 0.5 https://supabase.com/edge-functions weekly - 0.5 + 0.5 + + + + https://supabase.com/ga + weekly + 0.5 + + + + https://supabase.com/support + weekly + 0.5 + + + + https://supabase.com/blog/ + weekly + 0.5 + + + + https://supabase.com/auth + weekly + 0.5 + + + + https://supabase.com/database + weekly + 0.5 https://supabase.com/legal/dpa weekly - 0.5 + 0.5 https://supabase.com/nextjs weekly - 0.5 + 0.5 https://supabase.com/realtime weekly - 0.5 + 0.5 https://supabase.com/storage weekly - 0.5 + 0.5 https://supabase.com/vector/Vector weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-alpha-april-2020 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-alpha-may-2020 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-steve-chavez weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-alpha-june-2020 weekly - 0.5 + 0.5 https://supabase.com/blog/postgresql-templates weekly - 0.5 + 0.5 https://supabase.com/blog/alpha-launch-postmortem weekly - 0.5 + 0.5 https://supabase.com/blog/postgresql-physical-logical-backups weekly - 0.5 + 0.5 https://supabase.com/blog/continuous-postgresql-backup-walg weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-alpha-july-2020 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-auth weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-alpha-august-2020 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-hacktoberfest-2020 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-alpha-september-2020 weekly - 0.5 + 0.5 https://supabase.com/blog/improved-dx weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-alpha-october-2020 weekly - 0.5 + 0.5 https://supabase.com/blog/postgresql-views weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-alpha-november-2020 weekly - 0.5 + 0.5 https://supabase.com/blog/case-study-monitoro weekly - 0.5 + 0.5 https://supabase.com/blog/case-study-tayfa weekly - 0.5 + 0.5 https://supabase.com/blog/case-study-xendit weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-striveschool weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-dashboard-performance weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-december-2020 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-january-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/case-study-roboflow weekly - 0.5 + 0.5 https://supabase.com/blog/cracking-postgres-interview weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-february-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/postgres-as-a-cron-server weekly - 0.5 + 0.5 https://supabase.com/blog/toad-a-link-shortener-with-simple-apis-for-low-coders weekly - 0.5 + 0.5 https://supabase.com/blog/using-supabase-replit weekly - 0.5 + 0.5 https://supabase.com/blog/In-The-Loop weekly - 0.5 + 0.5 https://supabase.com/blog/angels-of-supabase weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week weekly - 0.5 + 0.5 https://supabase.com/blog/pricing weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-storage weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-cli weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-nft-marketplace weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-dot-com weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-pgbouncer weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-workflows weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-march-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-april-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-may-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/roles-postgres-hooks weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-june-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-launch-week-sql weekly - 0.5 + 0.5 https://supabase.com/blog/epsilon3-self-hosting weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-community-day weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-postgres-13 weekly - 0.5 + 0.5 https://supabase.com/blog/spot-flutter-with-postgres weekly - 0.5 + 0.5 https://supabase.com/blog/storage-beta weekly - 0.5 + 0.5 https://supabase.com/blog/mobbin-supabase-200000-users weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-auth-passwordless-sms-login weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-reports-and-metrics weekly - 0.5 + 0.5 https://supabase.com/blog/1-the-supabase-hackathon weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-functions-updates weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-swag-store weekly - 0.5 + 0.5 https://supabase.com/blog/hackathon-winners weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-july-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-august-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-hacktoberfest-hackathon-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-sept-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/hacktoberfest-hackathon-winners-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/replenysh-time-to-value-in-less-than-24-hours weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-series-a weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-october-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-how-we-launch weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-launch-week-the-trilogy weekly - 0.5 + 0.5 https://supabase.com/blog/postgrest-9 weekly - 0.5 + 0.5 https://supabase.com/blog/whats-new-in-postgres-14 weekly - 0.5 + 0.5 https://supabase.com/blog/community-day-lw3 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-studio weekly - 0.5 + 0.5 https://supabase.com/blog/realtime-row-level-security-in-postgresql weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-acquires-logflare weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-three-friday-five-more-things weekly - 0.5 + 0.5 https://supabase.com/blog/pg-graphql weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-holiday-hackdays-hackathon weekly - 0.5 + 0.5 https://supabase.com/blog/beta-november-2021-launch-week-recap weekly - 0.5 + 0.5 https://supabase.com/blog/holiday-hackdays-winners-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/product-hunt-golden-kitty-awards-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-december-2021 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-january-2022 weekly - 0.5 + 0.5 https://supabase.com/blog/postgres-audit weekly - 0.5 + 0.5 https://supabase.com/blog/should-i-open-source-my-company weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-launch-week-four weekly - 0.5 + 0.5 https://supabase.com/blog/community-day-lw4 weekly - 0.5 + 0.5 https://supabase.com/blog/graphql-now-available weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-enterprise weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-edge-functions weekly - 0.5 + 0.5 https://supabase.com/blog/hackathon-bring-the-func weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-realtime-with-multiplayer-features weekly - 0.5 + 0.5 https://supabase.com/blog/supabrew weekly - 0.5 + 0.5 https://supabase.com/blog/beta-update-march-2022 weekly - 0.5 + 0.5 https://supabase.com/blog/bring-the-func-hackathon-winners weekly - 0.5 + 0.5 https://supabase.com/blog/partner-gallery-works-with-supabase weekly - 0.5 + 0.5 https://supabase.com/blog/how-supabase-accelerates-development-of-all-pull-together weekly - 0.5 + 0.5 https://supabase.com/blog/beta-update-may-2022 weekly - 0.5 + 0.5 https://supabase.com/blog/loading-data-supabase-python weekly - 0.5 + 0.5 https://supabase.com/blog/partial-postgresql-data-dumps-with-rls weekly - 0.5 + 0.5 https://supabase.com/blog/visualizing-supabase-data-using-metabase weekly - 0.5 + 0.5 https://supabase.com/blog/flutter-tutorial-building-a-chat-app weekly - 0.5 + 0.5 https://supabase.com/blog/beta-update-june-2022 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-auth-helpers-with-sveltekit-support weekly - 0.5 + 0.5 https://supabase.com/blog/seen-by-in-postgresql weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-flutter-sdk-1-developer-preview weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-update-july-2022 weekly - 0.5 + 0.5 https://supabase.com/blog/slack-consolidate-slackbot-to-consolidate-messages weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-5-hackathon weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-series-b weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-cli-v1-and-admin-api-beta weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-js-v2 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-soc2 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-realtime-multiplayer-general-availability weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-5-community-day weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-5-one-more-thing weekly - 0.5 + 0.5 https://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validation weekly - 0.5 + 0.5 https://supabase.com/blog/postgrest-v10 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-vault weekly - 0.5 + 0.5 https://supabase.com/blog/building-a-realtime-trello-board-with-supabase-and-angular weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-5-hackathon-winners weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-update-august-2022 weekly - 0.5 + 0.5 https://supabase.com/blog/choosing-a-postgres-primary-key weekly - 0.5 + 0.5 https://supabase.com/blog/postgres-wasm weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-update-september-2022 weekly - 0.5 + 0.5 https://supabase.com/blog/postgres-full-text-search-vs-the-rest weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-js-v2-released weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-flutter-sdk-v1-released weekly - 0.5 + 0.5 https://supabase.com/blog/postgresql-commitfest weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-update-october-2022 weekly - 0.5 + 0.5 https://supabase.com/blog/authentication-in-ionic-angular weekly - 0.5 + 0.5 @@ -893,1200 +893,1518 @@ >https://supabase.com/blog/fetching-and-caching-supabase-data-in-next-js-server-components weekly - 0.5 + 0.5 https://supabase.com/blog/flutter-authorization-with-rls weekly - 0.5 + 0.5 https://supabase.com/blog/sql-or-nosql-both-with-postgresql weekly - 0.5 - - - - https://supabase.com/blog/transparent-column-encryption-with-postgres - weekly - 0.5 + 0.5 https://supabase.com/blog/the-supabase-content-storm weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-november-2022 weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-6-hackathon weekly - 0.5 + 0.5 https://supabase.com/blog/who-we-hire weekly - 0.5 + 0.5 https://supabase.com/blog/postgres-crdt weekly - 0.5 + 0.5 https://supabase.com/blog/new-supabase-docs-built-with-nextjs weekly - 0.5 + 0.5 https://supabase.com/blog/storage-image-resizing-smart-cdn weekly - 0.5 + 0.5 https://supabase.com/blog/mfa-auth-via-rls weekly - 0.5 + 0.5 https://supabase.com/blog/postgres-foreign-data-wrappers-rust weekly - 0.5 + 0.5 https://supabase.com/blog/custom-domain-names weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-6-community-day weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-6-wrap-up weekly - 0.5 + 0.5 https://supabase.com/blog/new-in-postgres-15 weekly - 0.5 + 0.5 https://supabase.com/blog/pg-graphql-v1 weekly - 0.5 + 0.5 https://supabase.com/blog/postgres-point-in-time-recovery weekly - 0.5 + 0.5 https://supabase.com/blog/postgrest-11-prerelease weekly - 0.5 + 0.5 https://supabase.com/blog/vault-now-in-beta weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-6-hackathon-winners weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-december-2022 weekly - 0.5 + 0.5 https://supabase.com/blog/openai-embeddings-postgres-vector weekly - 0.5 + 0.5 https://supabase.com/blog/chatgpt-supabase-docs weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-january-2023 weekly - 0.5 + 0.5 https://supabase.com/blog/flutter-real-time-multiplayer-game weekly - 0.5 + 0.5 https://supabase.com/blog/case-study-happyteams weekly - 0.5 + 0.5 https://supabase.com/blog/type-constraints-in-65-lines-of-sql weekly - 0.5 + 0.5 https://supabase.com/blog/geo-queries-with-postgis-in-ionic-angular weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-update-february-2023 weekly - 0.5 + 0.5 https://supabase.com/blog/supaclub weekly - 0.5 + 0.5 https://supabase.com/blog/infinite-scroll-with-nextjs-framer-motion weekly - 0.5 + 0.5 https://supabase.com/blog/designing-with-ai-midjourney weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-7-hackathon weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-update-march-2023 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-logs-self-hosted weekly - 0.5 + 0.5 https://supabase.com/blog/edge-runtime-self-hosted-deno-functions weekly - 0.5 + 0.5 https://supabase.com/blog/storage-v3-resumable-uploads weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-auth-sso-pkce weekly - 0.5 + 0.5 https://supabase.com/blog/dbdev weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-7-community-highlights weekly - 0.5 + 0.5 https://supabase.com/blog/pg-tle weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-studio-2.0 weekly - 0.5 + 0.5 https://supabase.com/blog/whats-new-in-pg-graphql-v1-2 weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-7-hackathon-winners weekly - 0.5 + 0.5 https://supabase.com/blog/postgres-pluggable-strorage weekly - 0.5 + 0.5 https://supabase.com/blog/flutter-multi-factor-authentication weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-update-april-2023 weekly - 0.5 + 0.5 https://supabase.com/blog/flutter-hackathon weekly - 0.5 + 0.5 https://supabase.com/blog/building-chatgpt-plugins-template weekly - 0.5 + 0.5 https://supabase.com/blog/chatgpt-plugins-support-postgres weekly - 0.5 + 0.5 https://supabase.com/blog/flutter-hackathon-winners weekly - 0.5 + 0.5 https://supabase.com/blog/vecs weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-update-may-2023 weekly - 0.5 + 0.5 https://supabase.com/blog/native-mobile-auth weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-beta-update-june-2023 weekly - 0.5 + 0.5 https://supabase.com/blog/postgrest-11-1-release weekly - 0.5 + 0.5 https://supabase.com/blog/pgvector-performance weekly - 0.5 + 0.5 https://supabase.com/blog/flutter-authentication weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-lw8-hackathon weekly - 0.5 + 0.5 https://supabase.com/blog/react-native-storage weekly - 0.5 + 0.5 https://supabase.com/blog/beta-update-july-2023 weekly - 0.5 + 0.5 https://supabase.com/blog/fewer-dimensions-are-better-pgvector weekly - 0.5 + 0.5 https://supabase.com/blog/interactive-constellation-threejs-react-three-fiber weekly - 0.5 + 0.5 https://supabase.com/blog/why-supabase-remote weekly - 0.5 + 0.5 https://supabase.com/blog/hugging-face-supabase weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-local-dev weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-studio-3-0 weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-integrations-marketplace weekly - 0.5 + 0.5 https://supabase.com/blog/using-supabase-with-vercel weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-8-community-highlights weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-soc2-hipaa weekly - 0.5 + 0.5 https://supabase.com/blog/supavisor-1-million weekly - 0.5 + 0.5 https://supabase.com/blog/launch-week-8-hackathon-winners weekly - 0.5 + 0.5 https://supabase.com/blog/organization-based-billing weekly - 0.5 + 0.5 https://supabase.com/blog/increase-performance-pgvector-hnsw weekly - 0.5 + 0.5 https://supabase.com/blog/beta-update-august-2023 weekly - 0.5 + 0.5 https://supabase.com/blog/postgres-dynamic-table-partitioning weekly - 0.5 + 0.5 https://supabase.com/blog/beta-update-september-2023 weekly - 0.5 + 0.5 https://supabase.com/blog/react-native-offline-first-watermelon-db weekly - 0.5 + 0.5 https://supabase.com/blog/pgvector-vs-pinecone weekly - 0.5 + 0.5 https://supabase.com/blog/supabase-is-now-compatible-with-nextjs-14 weekly - 0.5 + 0.5 https://supabase.com/blog/beta-update-october-2023 weekly - 0.5 + 0.5 https://supabase.com/blog/react-native-authentication weekly - 0.5 + 0.5 https://supabase.com/blog/oauth2-login-python-flask-apps weekly - 0.5 + 0.5 https://supabase.com/blog/automatic-cli-login weekly - 0.5 + 0.5 + + + + https://supabase.com/blog/beta-update-november-2023 + weekly + 0.5 + + + + https://supabase.com/blog/community-meetups-lwx + weekly + 0.5 https://supabase.com/blog/supabase-hackathon-lwx weekly - 0.5 + 0.5 + + + + https://supabase.com/blog/how-design-works-at-supabase + weekly + 0.5 + + + + https://supabase.com/blog/postgres-language-server-implementing-parser + weekly + 0.5 + + + + https://supabase.com/blog/studio-introducing-assistant + weekly + 0.5 + + + + https://supabase.com/blog/edge-functions-node-npm + weekly + 0.5 + + + + https://supabase.com/blog/pg-graphql-postgres-functions + weekly + 0.5 + + + + https://supabase.com/blog/postgrest-12 + weekly + 0.5 + + + + https://supabase.com/blog/supabase-branching + weekly + 0.5 + + + + https://supabase.com/blog/supavisor-postgres-connection-pooler + weekly + 0.5 + + + + https://supabase.com/blog/supabase-auth-identity-linking-hooks + weekly + 0.5 + + + + https://supabase.com/blog/supabase-wrappers-v02 + weekly + 0.5 + + + + https://supabase.com/blog/client-libraries-v2 + weekly + 0.5 + + + + https://supabase.com/blog/introducing-read-replicas + weekly + 0.5 + + + + https://supabase.com/blog/postgres-on-fly-by-supabase + weekly + 0.5 + + + + https://supabase.com/blog/launch-week-x-best-launches + weekly + 0.5 + + + + https://supabase.com/blog/launch-week-x-hackathon-winners + weekly + 0.5 + + + + https://supabase.com/blog/beta-update-december-2023 + weekly + 0.5 + + + + https://supabase.com/blog/elixir-clustering-using-postgres + weekly + 0.5 + + + + https://supabase.com/blog/react-query-nextjs-app-router-cache-helpers + weekly + 0.5 + + + + https://supabase.com/blog/ipv6 + weekly + 0.5 + + + + https://supabase.com/blog/what-is-saml-authentication + weekly + 0.5 + + + + https://supabase.com/blog/laravel-postgres + weekly + 0.5 + + + + https://supabase.com/blog/how-pg-graphql-works + weekly + 0.5 + + + + https://supabase.com/blog/flutter-figma-clone + weekly + 0.5 + + + + https://supabase.com/blog/ruby-on-rails-postgres + weekly + 0.5 + + + + https://supabase.com/blog/pgvector-fast-builds + weekly + 0.5 + + + + https://supabase.com/blog/nosql-mongodb-compatibility-with-ferretdb-and-flydotio + weekly + 0.5 + + + + https://supabase.com/blog/matryoshka-embeddings + weekly + 0.5 + + + + https://supabase.com/blog/automating-performance-tests + weekly + 0.5 + + + + https://supabase.com/blog/content-recommendation-with-flutter + weekly + 0.5 + + + + https://supabase.com/blog/postgrest-aggregate-functions + weekly + 0.5 + + + + https://supabase.com/blog/semantic-image-search-amazon-bedrock + weekly + 0.5 + + + + https://supabase.com/blog/pg-paper-dump + weekly + 0.5 + + + + https://supabase.com/blog/postgres-roles-and-privileges + weekly + 0.5 + + + + https://supabase.com/blog/supabase-oss-hackathon + weekly + 0.5 + + + + https://supabase.com/blog/branching-publicly-available + weekly + 0.5 + + + + https://supabase.com/blog/supabase-aquires-oriole + weekly + 0.5 + + + + https://supabase.com/blog/supabase-aws-marketplace + weekly + 0.5 + + + + https://supabase.com/blog/supabase-bootstrap + weekly + 0.5 + + + + https://supabase.com/blog/supabase-swift + weekly + 0.5 + + + + https://supabase.com/blog/ai-inference-now-available-in-supabase-edge-functions + weekly + 0.5 + + + + https://supabase.com/blog/anonymous-sign-ins + weekly + 0.5 + + + + https://supabase.com/blog/s3-compatible-storage + weekly + 0.5 + + + + https://supabase.com/blog/ga-week-summary + weekly + 0.5 + + + + https://supabase.com/blog/security-performance-advisor + weekly + 0.5 + + + + https://supabase.com/blog/exploring-support-tooling + weekly + 0.5 + + + + https://supabase.com/blog/nix-postgres + weekly + 0.5 + + + + https://supabase.com/blog/postgres-bloat + weekly + 0.5 + + + + https://supabase.com/blog/supabase-oss-hackathon-winners + weekly + 0.5 + + + + https://supabase.com/blog/pgvector-0-7-0 + weekly + 0.5 + + + + https://supabase.com/blog/meetup-kahoot-alternative + weekly + 0.5 https://supabase.com/customers/berriai weekly - 0.5 + 0.5 https://supabase.com/customers/chatbase weekly - 0.5 + 0.5 https://supabase.com/customers/epsilon3 weekly - 0.5 + 0.5 https://supabase.com/customers/good-tape weekly - 0.5 + 0.5 https://supabase.com/customers/happyteams weekly - 0.5 + 0.5 https://supabase.com/customers/markprompt weekly - 0.5 + 0.5 https://supabase.com/customers/mendableai weekly - 0.5 + 0.5 https://supabase.com/customers/mobbin weekly - 0.5 + 0.5 https://supabase.com/customers/next-door-lending weekly - 0.5 + 0.5 https://supabase.com/customers/pebblely weekly - 0.5 + 0.5 https://supabase.com/customers/quivr weekly - 0.5 + 0.5 https://supabase.com/customers/replenysh weekly - 0.5 + 0.5 https://supabase.com/customers/shotgun weekly - 0.5 + 0.5 https://supabase.com/customers/xendit weekly - 0.5 + 0.5 https://supabase.com/alternatives/supabase-vs-auth0 weekly - 0.5 + 0.5 https://supabase.com/alternatives/supabase-vs-firebase weekly - 0.5 + 0.5 https://supabase.com/alternatives/supabase-vs-heroku-postgres weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/appsmith weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/arengu weekly - 0.5 + 0.5 + + + + https://supabase.com/partners/integrations/artie + weekly + 0.5 https://supabase.com/partners/integrations/auth0 weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/authsignal weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/basedash weekly - 0.5 - - - - https://supabase.com/partners/integrations/bracket - weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/buster weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/clerk weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/cloudflare-workers weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/clutch weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/codesandbox weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/corbado weekly - 0.5 + 0.5 - https://supabase.com/partners/integrations/dashibase + https://supabase.com/partners/integrations/cyberduck weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/deepnote weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/dezbor weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/dhiwise weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/directus weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/doppler weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/draftbit weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/drapcode weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/draxlr weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/dronahq weekly - 0.5 + 0.5 + + + + https://supabase.com/partners/integrations/electricsql + weekly + 0.5 https://supabase.com/partners/integrations/estuary weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/explo weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/fezto weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/flutterflow weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/forestadmin weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/getstream_io weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/illa weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/infisical weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/insightbase weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/internalio weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/jetadmin weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/keyri weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/litellm weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/n8n weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/nextauth weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/nuxt weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/onesignal weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/ory weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/passageidentity weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/pgmustard weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/picket weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/plasmic weekly - 0.5 - - - - https://supabase.com/partners/integrations/polyscale - weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/powersync weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/prisma weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/react-admin weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/readyset weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/refine_dev weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/replibyte weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/replicache weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/resend weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/retool weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/risingwave weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/sequin_io weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/snaplet weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/stacksync weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/stormkit weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/streamlit weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/stytch weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/supabase_wrapper_bigquery weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/supabase_wrapper_firebase weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/supabase_wrapper_stripe weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/supertokens weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/tamagui-takeout weekly - 0.5 + 0.5 + + + + https://supabase.com/partners/integrations/toddle + weekly + 0.5 https://supabase.com/partners/integrations/trevor_io weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/triggerdotdev weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/vercel weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/voltapp weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/weweb weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/windmill weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/yepcode weekly - 0.5 + 0.5 + + + + https://supabase.com/partners/integrations/zapier + weekly + 0.5 https://supabase.com/partners/integrations/zapp_run weekly - 0.5 + 0.5 https://supabase.com/partners/integrations/zuplo weekly - 0.5 + 0.5 https://supabase.com/partners/experts/antstack weekly - 0.5 + 0.5 https://supabase.com/partners/experts/arceptive weekly - 0.5 + 0.5 https://supabase.com/partners/experts/buildlab weekly - 0.5 + 0.5 https://supabase.com/partners/experts/calda weekly - 0.5 + 0.5 https://supabase.com/partners/experts/driglo weekly - 0.5 + 0.5 https://supabase.com/partners/experts/enginedigital weekly - 0.5 + 0.5 https://supabase.com/partners/experts/feelantera weekly - 0.5 + 0.5 https://supabase.com/partners/experts/jensenlabs weekly - 0.5 + 0.5 https://supabase.com/partners/experts/koptional weekly - 0.5 + 0.5 https://supabase.com/partners/experts/morrow weekly - 0.5 + 0.5 https://supabase.com/partners/experts/overcode weekly - 0.5 + 0.5 https://supabase.com/partners/experts/quinence weekly - 0.5 + 0.5 https://supabase.com/partners/experts/robkendal weekly - 0.5 + 0.5 https://supabase.com/partners/experts/solid_software weekly - 0.5 + 0.5 https://supabase.com/partners/experts/sunmoon weekly - 0.5 + 0.5 https://supabase.com/partners/experts/theodo weekly - 0.5 + 0.5 https://supabase.com/partners/experts/tinloof weekly - 0.5 + 0.5 https://supabase.com/partners/experts/uncommonpurpose weekly - 0.5 + 0.5 https://supabase.com/partners/experts/voypost weekly - 0.5 + 0.5 https://supabase.com/partners/experts/zerodays weekly - 0.5 + 0.5 diff --git a/packages/ui/index.tsx b/packages/ui/index.tsx index 8e388e2bdf2..fe135421128 100644 --- a/packages/ui/index.tsx +++ b/packages/ui/index.tsx @@ -239,6 +239,9 @@ export { Separator } from './src/components/shadcn/ui/separator' export * from './src/components/shadcn/ui/resizable' +export * from './src/components/radio-group-stacked' +export * from './src/components/radio-group-card' + // links export * from './src/components/TextLink' diff --git a/packages/ui/src/components/radio-group-card.tsx b/packages/ui/src/components/radio-group-card.tsx new file mode 100644 index 00000000000..f0928ccd43b --- /dev/null +++ b/packages/ui/src/components/radio-group-card.tsx @@ -0,0 +1,92 @@ +'use client' + +import * as RadioGroupPrimitive from '@radix-ui/react-radio-group' +import { Circle } from 'lucide-react' +import * as React from 'react' + +import { cn } from '../lib/utils/cn' + +const RadioGroupCard = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + return +}) +RadioGroupCard.displayName = RadioGroupPrimitive.Root.displayName + +interface RadioGroupCardItemProps { + image?: React.ReactNode + label: string + showIndicator?: boolean +} + +const RadioGroupCardItem = React.forwardRef< + React.ElementRef, + RadioGroupCardItemProps & React.ComponentPropsWithoutRef +>(({ image, label, showIndicator = true, ...props }, ref) => { + return ( + + {props.children} +
+ {showIndicator && ( +
+ + + +
+ )} + + +
+
+ ) +}) + +RadioGroupCardItem.displayName = RadioGroupPrimitive.Item.displayName + +export { RadioGroupCard, RadioGroupCardItem } diff --git a/packages/ui/src/components/radio-group-stacked.tsx b/packages/ui/src/components/radio-group-stacked.tsx new file mode 100644 index 00000000000..8073403887c --- /dev/null +++ b/packages/ui/src/components/radio-group-stacked.tsx @@ -0,0 +1,106 @@ +'use client' + +import * as RadioGroupPrimitive from '@radix-ui/react-radio-group' +import * as React from 'react' + +import { cn } from '../lib/utils/cn' +import { Label_Shadcn_ } from '../..' +import { Circle } from 'lucide-react' + +const RadioGroupStacked = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + return ( + + ) +}) + +RadioGroupStacked.displayName = 'RadioGroupStacked' + +interface RadioGroupStackedItemProps { + image?: React.ReactNode + label: string + showIndicator?: boolean + description?: string +} + +const RadioGroupStackedItem = React.forwardRef< + React.ElementRef, + RadioGroupStackedItemProps & React.ComponentPropsWithoutRef +>(({ image, label, showIndicator = true, ...props }, ref) => { + return ( + +
+ {showIndicator && ( +
+ + + +
+ )} +
+ + {label} + + {props.description && ( +

{props.description}

+ )} + {props.children} +
+
+
+ ) +}) + +RadioGroupStackedItem.displayName = 'RadioGroupStackedItem' + +export { RadioGroupStacked, RadioGroupStackedItem } diff --git a/packages/ui/src/components/shadcn/ui/form.tsx b/packages/ui/src/components/shadcn/ui/form.tsx index 56503231f24..8d534dfd9af 100644 --- a/packages/ui/src/components/shadcn/ui/form.tsx +++ b/packages/ui/src/components/shadcn/ui/form.tsx @@ -69,17 +69,20 @@ type FormItemContextValue = { const FormItemContext = React.createContext({} as FormItemContextValue) -const FormItem = React.forwardRef>( - ({ className, ...props }, ref) => { - const id = React.useId() +const FormItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & { asChild?: boolean } +>(({ asChild, ...props }, ref) => { + const id = React.useId() - return ( - -
- - ) - } -) + const Comp = asChild ? Slot : 'div' + + return ( + + + + ) +}) FormItem.displayName = 'FormItem' const FormLabel = React.forwardRef< From 607a6930c5b2f68c0f2562e7c783fc7a447ef01b Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Thu, 23 May 2024 14:34:29 -0230 Subject: [PATCH 4/5] move linting to api (#26341) * Start * Fix type issues. * Remove client side lints * Fix error handler --------- Co-authored-by: Ivan Vasilov --- apps/studio/data/lint/lint-query.ts | 933 +----------------- .../[ref]/database/performance-advisor.tsx | 1 - .../[ref]/database/security-advisor.tsx | 39 - 3 files changed, 26 insertions(+), 947 deletions(-) diff --git a/apps/studio/data/lint/lint-query.ts b/apps/studio/data/lint/lint-query.ts index 220df3a12c2..ea15206f8c7 100644 --- a/apps/studio/data/lint/lint-query.ts +++ b/apps/studio/data/lint/lint-query.ts @@ -1,923 +1,42 @@ import { UseQueryOptions, useQuery } from '@tanstack/react-query' -import { executeSql } from '../sql/execute-sql-query' +import { components } from 'api-types' +import { get, handleError } from 'data/fetchers' +import { ResponseError } from 'types' import { lintKeys } from './keys' -import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' - -export const LINT_SQL = /* SQL */ `set local search_path = ''; - -( -with foreign_keys as ( - select - cl.relnamespace::regnamespace::text as schema_name, - cl.relname as table_name, - cl.oid as table_oid, - ct.conname as fkey_name, - ct.conkey as col_attnums - from - pg_catalog.pg_constraint ct - join pg_catalog.pg_class cl -- fkey owning table - on ct.conrelid = cl.oid - left join pg_catalog.pg_depend d - on d.objid = cl.oid - and d.deptype = 'e' - where - ct.contype = 'f' -- foreign key constraints - and d.objid is null -- exclude tables that are dependencies of extensions - and cl.relnamespace::regnamespace::text not in ( - 'pg_catalog', 'information_schema', 'auth', 'storage', 'vault', 'extensions' - ) -), -index_ as ( - select - pi.indrelid as table_oid, - indexrelid::regclass as index_, - string_to_array(indkey::text, ' ')::smallint[] as col_attnums - from - pg_catalog.pg_index pi - where - indisvalid -) -select - 'unindexed_foreign_keys' as name, - 'Unindexed foreign keys' as title, - 'INFO' as level, - 'EXTERNAL' as facing, - array['PERFORMANCE'] as categories, - 'Identifies foreign key constraints without a covering index, which can impact database performance.' as description, - format( - 'Table \`%s.%s\` has a foreign key \`%s\` without a covering index. This can lead to suboptimal query performance.', - fk.schema_name, - fk.table_name, - fk.fkey_name - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0001_unindexed_foreign_keys' as remediation, - jsonb_build_object( - 'schema', fk.schema_name, - 'name', fk.table_name, - 'type', 'table', - 'fkey_name', fk.fkey_name, - 'fkey_columns', fk.col_attnums - ) as metadata, - format('unindexed_foreign_keys_%s_%s_%s', fk.schema_name, fk.table_name, fk.fkey_name) as cache_key -from - foreign_keys fk - left join index_ idx - on fk.table_oid = idx.table_oid - and fk.col_attnums = idx.col_attnums - left join pg_catalog.pg_depend dep - on idx.table_oid = dep.objid - and dep.deptype = 'e' -where - idx.index_ is null - and fk.schema_name not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - ) - and dep.objid is null -- exclude tables owned by extensions -order by - fk.schema_name, - fk.table_name, - fk.fkey_name) -union all -( -select - 'auth_users_exposed' as name, - 'Exposed Auth Users' as title, - 'ERROR' as level, - 'EXTERNAL' as facing, - array['SECURITY'] as categories, - 'Detects if auth.users is exposed to anon or authenticated roles via a view or materialized view in schemas exposed to PostgREST, potentially compromising user data security.' as description, - format( - 'View/Materialized View "%s" in the public schema may expose \`auth.users\` data to anon or authenticated roles.', - c.relname - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0002_auth_users_exposed' as remediation, - jsonb_build_object( - 'schema', n.nspname, - 'name', c.relname, - 'type', 'view', - 'exposed_to', array_remove(array_agg(DISTINCT case when pg_catalog.has_table_privilege('anon', c.oid, 'SELECT') then 'anon' when pg_catalog.has_table_privilege('authenticated', c.oid, 'SELECT') then 'authenticated' end), null) - ) as metadata, - format('auth_users_exposed_%s_%s', n.nspname, c.relname) as cache_key -from - -- Identify the oid for auth.users - pg_catalog.pg_class auth_users_pg_class - join pg_catalog.pg_namespace auth_users_pg_namespace - on auth_users_pg_class.relnamespace = auth_users_pg_namespace.oid - and auth_users_pg_class.relname = 'users' - and auth_users_pg_namespace.nspname = 'auth' - -- Depends on auth.users - join pg_catalog.pg_depend d - on d.refobjid = auth_users_pg_class.oid - join pg_catalog.pg_rewrite r - on r.oid = d.objid - join pg_catalog.pg_class c - on c.oid = r.ev_class - join pg_catalog.pg_namespace n - on n.oid = c.relnamespace - join pg_catalog.pg_class pg_class_auth_users - on d.refobjid = pg_class_auth_users.oid -where - d.deptype = 'n' - and ( - pg_catalog.has_table_privilege('anon', c.oid, 'SELECT') - or pg_catalog.has_table_privilege('authenticated', c.oid, 'SELECT') - ) - and n.nspname = any(array(select trim(unnest(string_to_array(current_setting('pgrst.db_schemas', 't'), ','))))) - -- Exclude self - and c.relname <> '0002_auth_users_exposed' - -- There are 3 insecure configurations - and - ( - -- Materialized views don't support RLS so this is insecure by default - (c.relkind in ('m')) -- m for materialized view - or - -- Standard View, accessible to anon or authenticated that is security_definer - ( - c.relkind = 'v' -- v for view - -- Exclude security invoker views - and not ( - lower(coalesce(c.reloptions::text,'{}'))::text[] - && array[ - 'security_invoker=1', - 'security_invoker=true', - 'security_invoker=yes', - 'security_invoker=on' - ] - ) - ) - or - -- Standard View, security invoker, but no RLS enabled on auth.users - ( - c.relkind in ('v') -- v for view - -- is security invoker - and ( - lower(coalesce(c.reloptions::text,'{}'))::text[] - && array[ - 'security_invoker=1', - 'security_invoker=true', - 'security_invoker=yes', - 'security_invoker=on' - ] - ) - and not pg_class_auth_users.relrowsecurity - ) - ) -group by - n.nspname, - c.relname, - c.oid) -union all -( -with policies as ( - select - nsp.nspname as schema_name, - pb.tablename as table_name, - pc.relrowsecurity as is_rls_active, - polname as policy_name, - polpermissive as is_permissive, -- if not, then restrictive - (select array_agg(r::regrole) from unnest(polroles) as x(r)) as roles, - case polcmd - when 'r' then 'SELECT' - when 'a' then 'INSERT' - when 'w' then 'UPDATE' - when 'd' then 'DELETE' - when '*' then 'ALL' - end as command, - qual, - with_check - from - pg_catalog.pg_policy pa - join pg_catalog.pg_class pc - on pa.polrelid = pc.oid - join pg_catalog.pg_namespace nsp - on pc.relnamespace = nsp.oid - join pg_catalog.pg_policies pb - on pc.relname = pb.tablename - and nsp.nspname = pb.schemaname - and pa.polname = pb.policyname -) -select - 'auth_rls_initplan' as name, - 'Auth RLS Initialization Plan' as title, - 'WARN' as level, - 'EXTERNAL' as facing, - array['PERFORMANCE'] as categories, - 'Detects if calls to \`auth.()\` in RLS policies are being unnecessarily re-evaluated for each row' as description, - format( - 'Table \`%s.%s\` has a row level security policy \`%s\` that re-evaluates an auth.() for each row. This produces suboptimal query performance at scale. Resolve the issue by replacing \`auth.()\` with \`(select auth.())\`. See [docs](https://supabase.com/docs/guides/database/postgres/row-level-security#call-functions-with-select) for more info.', - schema_name, - table_name, - policy_name - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0003_auth_rls_initplan' as remediation, - jsonb_build_object( - 'schema', schema_name, - 'name', table_name, - 'type', 'table' - ) as metadata, - format('auth_rls_init_plan_%s_%s_%s', schema_name, table_name, policy_name) as cache_key -from - policies -where - is_rls_active - and schema_name not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - ) - and ( - -- Example: auth.uid() - ( - qual like '%auth.uid()%' - and lower(qual) not like '%select auth.uid()%' - ) - or ( - qual like '%auth.jwt()%' - and lower(qual) not like '%select auth.jwt()%' - ) - or ( - qual like '%auth.role()%' - and lower(qual) not like '%select auth.role()%' - ) - or ( - qual like '%auth.email()%' - and lower(qual) not like '%select auth.email()%' - ) - or ( - with_check like '%auth.uid()%' - and lower(with_check) not like '%select auth.uid()%' - ) - or ( - with_check like '%auth.jwt()%' - and lower(with_check) not like '%select auth.jwt()%' - ) - or ( - with_check like '%auth.role()%' - and lower(with_check) not like '%select auth.role()%' - ) - or ( - with_check like '%auth.email()%' - and lower(with_check) not like '%select auth.email()%' - ) - )) -union all -( -select - 'no_primary_key' as name, - 'No Primary Key' as title, - 'INFO' as level, - 'EXTERNAL' as facing, - array['PERFORMANCE'] as categories, - 'Detects if a table does not have a primary key. Tables without a primary key can be inefficient to interact with at scale.' as description, - format( - 'Table \`%s.%s\` does not have a primary key', - pgns.nspname, - pgc.relname - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0004_no_primary_key' as remediation, - jsonb_build_object( - 'schema', pgns.nspname, - 'name', pgc.relname, - 'type', 'table' - ) as metadata, - format( - 'no_primary_key_%s_%s', - pgns.nspname, - pgc.relname - ) as cache_key -from - pg_catalog.pg_class pgc - join pg_catalog.pg_namespace pgns - on pgns.oid = pgc.relnamespace - left join pg_catalog.pg_index pgi - on pgi.indrelid = pgc.oid - left join pg_catalog.pg_depend dep - on pgc.oid = dep.objid - and dep.deptype = 'e' -where - pgc.relkind = 'r' -- regular tables - and pgns.nspname not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - ) - and dep.objid is null -- exclude tables owned by extensions -group by - pgc.oid, - pgns.nspname, - pgc.relname -having - max(coalesce(pgi.indisprimary, false)::int) = 0) -union all -( -select - 'unused_index' as name, - 'Unused Index' as title, - 'INFO' as level, - 'EXTERNAL' as facing, - array['PERFORMANCE'] as categories, - 'Detects if an index has never been used and may be a candidate for removal.' as description, - format( - 'Index \`%s\` on table \`%s.%s\` has not been used', - psui.indexrelname, - psui.schemaname, - psui.relname - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0005_unused_index' as remediation, - jsonb_build_object( - 'schema', psui.schemaname, - 'name', psui.relname, - 'type', 'table' - ) as metadata, - format( - 'unused_index_%s_%s_%s', - psui.schemaname, - psui.relname, - psui.indexrelname - ) as cache_key - -from - pg_catalog.pg_stat_user_indexes psui - join pg_catalog.pg_index pi - on psui.indexrelid = pi.indexrelid - left join pg_catalog.pg_depend dep - on psui.relid = dep.objid - and dep.deptype = 'e' -where - psui.idx_scan = 0 - and not pi.indisunique - and not pi.indisprimary - and dep.objid is null -- exclude tables owned by extensions - and psui.schemaname not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - )) -union all -( -select - 'multiple_permissive_policies' as name, - 'Multiple Permissive Policies' as title, - 'WARN' as level, - 'EXTERNAL' as facing, - array['PERFORMANCE'] as categories, - 'Detects if multiple permissive row level security policies are present on a table for the same \`role\` and \`action\` (e.g. insert). Multiple permissive policies are suboptimal for performance as each policy must be executed for every relevant query.' as description, - format( - 'Table \`%s.%s\` has multiple permissive policies for role \`%s\` for action \`%s\`. Policies include \`%s\`', - n.nspname, - c.relname, - r.rolname, - act.cmd, - array_agg(p.polname order by p.polname) - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0006_multiple_permissive_policies' as remediation, - jsonb_build_object( - 'schema', n.nspname, - 'name', c.relname, - 'type', 'table' - ) as metadata, - format( - 'multiple_permissive_policies_%s_%s_%s_%s', - n.nspname, - c.relname, - r.rolname, - act.cmd - ) as cache_key -from - pg_catalog.pg_policy p - join pg_catalog.pg_class c - on p.polrelid = c.oid - join pg_catalog.pg_namespace n - on c.relnamespace = n.oid - join pg_catalog.pg_roles r - on p.polroles @> array[r.oid] - or p.polroles = array[0::oid] - left join pg_catalog.pg_depend dep - on c.oid = dep.objid - and dep.deptype = 'e', - lateral ( - select x.cmd - from unnest(( - select - case p.polcmd - when 'r' then array['SELECT'] - when 'a' then array['INSERT'] - when 'w' then array['UPDATE'] - when 'd' then array['DELETE'] - when '*' then array['SELECT', 'INSERT', 'UPDATE', 'DELETE'] - else array['ERROR'] - end as actions - )) x(cmd) - ) act(cmd) -where - c.relkind = 'r' -- regular tables - and p.polpermissive -- policy is permissive - and n.nspname not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - ) - and r.rolname not like 'pg_%' - and r.rolname not like 'supabase%admin' - and not r.rolbypassrls - and dep.objid is null -- exclude tables owned by extensions -group by - n.nspname, - c.relname, - r.rolname, - act.cmd -having - count(1) > 1) -union all -( -select - 'policy_exists_rls_disabled' as name, - 'Policy Exists RLS Disabled' as title, - 'ERROR' as level, - 'EXTERNAL' as facing, - array['SECURITY'] as categories, - 'Detects cases where row level security (RLS) policies have been created, but RLS has not been enabled for the underlying table.' as description, - format( - 'Table \`%s.%s\` has RLS policies but RLS is not enabled on the table. Policies include %s.', - n.nspname, - c.relname, - array_agg(p.polname order by p.polname) - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0007_policy_exists_rls_disabled' as remediation, - jsonb_build_object( - 'schema', n.nspname, - 'name', c.relname, - 'type', 'table' - ) as metadata, - format( - 'policy_exists_rls_disabled_%s_%s', - n.nspname, - c.relname - ) as cache_key -from - pg_catalog.pg_policy p - join pg_catalog.pg_class c - on p.polrelid = c.oid - join pg_catalog.pg_namespace n - on c.relnamespace = n.oid - left join pg_catalog.pg_depend dep - on c.oid = dep.objid - and dep.deptype = 'e' -where - c.relkind = 'r' -- regular tables - and n.nspname not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - ) - -- RLS is disabled - and not c.relrowsecurity - and dep.objid is null -- exclude tables owned by extensions -group by - n.nspname, - c.relname) -union all -( -select - 'rls_enabled_no_policy' as name, - 'RLS Enabled No Policy' as title, - 'INFO' as level, - 'EXTERNAL' as facing, - array['SECURITY'] as categories, - 'Detects cases where row level security (RLS) has been enabled on a table but no RLS policies have been created.' as description, - format( - 'Table \`%s.%s\` has RLS enabled, but no policies exist', - n.nspname, - c.relname - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0008_rls_enabled_no_policy' as remediation, - jsonb_build_object( - 'schema', n.nspname, - 'name', c.relname, - 'type', 'table' - ) as metadata, - format( - 'rls_enabled_no_policy_%s_%s', - n.nspname, - c.relname - ) as cache_key -from - pg_catalog.pg_class c - left join pg_catalog.pg_policy p - on p.polrelid = c.oid - join pg_catalog.pg_namespace n - on c.relnamespace = n.oid - left join pg_catalog.pg_depend dep - on c.oid = dep.objid - and dep.deptype = 'e' -where - c.relkind = 'r' -- regular tables - and n.nspname not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - ) - -- RLS is enabled - and c.relrowsecurity - and p.polname is null - and dep.objid is null -- exclude tables owned by extensions -group by - n.nspname, - c.relname) -union all -( -select - 'duplicate_index' as name, - 'Duplicate Index' as title, - 'WARN' as level, - 'EXTERNAL' as facing, - array['PERFORMANCE'] as categories, - 'Detects cases where two ore more identical indexes exist.' as description, - format( - 'Table \`%s.%s\` has identical indexes %s. Drop all except one of them', - n.nspname, - c.relname, - array_agg(pi.indexname order by pi.indexname) - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0009_duplicate_index' as remediation, - jsonb_build_object( - 'schema', n.nspname, - 'name', c.relname, - 'type', case - when c.relkind = 'r' then 'table' - when c.relkind = 'm' then 'materialized view' - else 'ERROR' - end, - 'indexes', array_agg(pi.indexname order by pi.indexname) - ) as metadata, - format( - 'duplicate_index_%s_%s_%s', - n.nspname, - c.relname, - array_agg(pi.indexname order by pi.indexname) - ) as cache_key -from - pg_catalog.pg_indexes pi - join pg_catalog.pg_namespace n - on n.nspname = pi.schemaname - join pg_catalog.pg_class c - on pi.tablename = c.relname - and n.oid = c.relnamespace - left join pg_catalog.pg_depend dep - on c.oid = dep.objid - and dep.deptype = 'e' -where - c.relkind in ('r', 'm') -- tables and materialized views - and n.nspname not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - ) - and dep.objid is null -- exclude tables owned by extensions -group by - n.nspname, - c.relkind, - c.relname, - replace(pi.indexdef, pi.indexname, '') -having - count(*) > 1) -union all -( -select - 'security_definer_view' as name, - 'Security Definer View' as title, - 'ERROR' as level, - 'EXTERNAL' as facing, - array['SECURITY'] as categories, - 'Detects views defined with the SECURITY DEFINER property. These views enforce Postgres permissions and row level security policies (RLS) of the view creator, rather than that of the querying user' as description, - format( - 'View \`%s.%s\` is defined with the SECURITY DEFINER property', - n.nspname, - c.relname - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0010_security_definer_view' as remediation, - jsonb_build_object( - 'schema', n.nspname, - 'name', c.relname, - 'type', 'view' - ) as metadata, - format( - 'security_definer_view_%s_%s', - n.nspname, - c.relname - ) as cache_key -from - pg_catalog.pg_class c - join pg_catalog.pg_namespace n - on n.oid = c.relnamespace - left join pg_catalog.pg_depend dep - on c.oid = dep.objid - and dep.deptype = 'e' -where - c.relkind = 'v' - and ( - pg_catalog.has_table_privilege('anon', c.oid, 'SELECT') - or pg_catalog.has_table_privilege('authenticated', c.oid, 'SELECT') - ) - and n.nspname = any(array(select trim(unnest(string_to_array(current_setting('pgrst.db_schemas', 't'), ','))))) - and n.nspname not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - ) - and dep.objid is null -- exclude views owned by extensions - and not ( - lower(coalesce(c.reloptions::text,'{}'))::text[] - && array[ - 'security_invoker=1', - 'security_invoker=true', - 'security_invoker=yes', - 'security_invoker=on' - ] - )) -union all -( -select - 'function_search_path_mutable' as name, - 'Function Search Path Mutable' as title, - 'WARN' as level, - 'EXTERNAL' as facing, - array['SECURITY'] as categories, - 'Detects functions with a mutable search_path parameter which could fail to execute successfully for some roles.' as description, - format( - 'Function \`%s.%s\` has a role mutable search_path', - n.nspname, - p.proname - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0011_function_search_path_mutable' as remediation, - jsonb_build_object( - 'schema', n.nspname, - 'name', p.proname, - 'type', 'function' - ) as metadata, - format( - 'function_search_path_mutable_%s_%s_%s', - n.nspname, - p.proname, - md5(p.prosrc) -- required when function is polymorphic - ) as cache_key -from - pg_catalog.pg_proc p - join pg_catalog.pg_namespace n - on p.pronamespace = n.oid - left join pg_catalog.pg_depend dep - on p.oid = dep.objid - and dep.deptype = 'e' -where - n.nspname not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - ) - and dep.objid is null -- exclude functions owned by extensions - -- Search path not set to '' - and not coalesce(p.proconfig, '{}') && array['search_path=""']) -union all -( -select - 'rls_disabled_in_public' as name, - 'RLS Disabled in Public' as title, - 'ERROR' as level, - 'EXTERNAL' as facing, - array['SECURITY'] as categories, - 'Detects cases where row level security (RLS) has not been enabled on tables in schemas exposed to PostgREST' as description, - format( - 'Table \`%s.%s\` is public, but RLS has not been enabled.', - n.nspname, - c.relname - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0013_rls_disabled_in_public' as remediation, - jsonb_build_object( - 'schema', n.nspname, - 'name', c.relname, - 'type', 'table' - ) as metadata, - format( - 'rls_disabled_in_public_%s_%s', - n.nspname, - c.relname - ) as cache_key -from - pg_catalog.pg_class c - join pg_catalog.pg_namespace n - on c.relnamespace = n.oid -where - c.relkind = 'r' -- regular tables - -- RLS is disabled - and not c.relrowsecurity - and ( - pg_catalog.has_table_privilege('anon', c.oid, 'SELECT') - or pg_catalog.has_table_privilege('authenticated', c.oid, 'SELECT') - ) - and n.nspname = any(array(select trim(unnest(string_to_array(current_setting('pgrst.db_schemas', 't'), ','))))) - and n.nspname not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - )) -union all -( -select - 'extension_in_public' as name, - 'Extension in Public' as title, - 'WARN' as level, - 'EXTERNAL' as facing, - array['SECURITY'] as categories, - 'Detects extensions installed in the \`public\` schema.' as description, - format( - 'Extension \`%s\` is installed in the public schema. Move it to another schema.', - pe.extname - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0014_extension_in_public' as remediation, - jsonb_build_object( - 'schema', pe.extnamespace::regnamespace, - 'name', pe.extname, - 'type', 'extension' - ) as metadata, - format( - 'extension_in_public_%s', - pe.extname - ) as cache_key -from - pg_catalog.pg_extension pe -where - -- plpgsql is installed by default in public and outside user control - -- confirmed safe - pe.extname not in ('plpgsql') - -- Scoping this to public is not optimal. Ideally we would use the postgres - -- search path. That currently isn't available via SQL. In other lints - -- we have used has_schema_privilege('anon', 'extensions', 'USAGE') but that - -- is not appropriate here as it would evaluate true for the extensions schema - and pe.extnamespace::regnamespace::text = 'public') -union all -( -with policies as ( - select - nsp.nspname as schema_name, - pb.tablename as table_name, - polname as policy_name, - qual, - with_check - from - pg_catalog.pg_policy pa - join pg_catalog.pg_class pc - on pa.polrelid = pc.oid - join pg_catalog.pg_namespace nsp - on pc.relnamespace = nsp.oid - join pg_catalog.pg_policies pb - on pc.relname = pb.tablename - and nsp.nspname = pb.schemaname - and pa.polname = pb.policyname -) -select - 'rls_references_user_metadata' as name, - 'RLS references user metadata' as title, - 'ERROR' as level, - 'EXTERNAL' as facing, - array['SECURITY'] as categories, - 'Detects when Supabase Auth user_metadata is referenced insecurely in a row level security (RLS) policy.' as description, - format( - 'Table \`%s.%s\` has a row level security policy \`%s\` that references Supabase Auth \`user_metadata\`. \`user_metadata\` is editable by end users and should never be used in a security context.', - schema_name, - table_name, - policy_name - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0015_rls_references_user_metadata' as remediation, - jsonb_build_object( - 'schema', schema_name, - 'name', table_name, - 'type', 'table' - ) as metadata, - format('rls_references_user_metadata_%s_%s_%s', schema_name, table_name, policy_name) as cache_key -from - policies -where - schema_name not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - ) - and ( - -- Example: auth.jwt() -> 'user_metadata' - -- False positives are possible, but it isn't practical to string match - -- If false positive rate is too high, this expression can iterate - qual like '%auth.jwt()%user_metadata%' - or qual like '%current_setting(%request.jwt.claims%)%user_metadata%' - or with_check like '%auth.jwt()%user_metadata%' - or with_check like '%current_setting(%request.jwt.claims%)%user_metadata%' - )) -union all -( -select - 'materialized_view_in_api' as name, - 'Materialized View in API' as title, - 'WARN' as level, - 'EXTERNAL' as facing, - array['SECURITY'] as categories, - 'Detects materialized views that are potentially accessible over the Data APIs.' as description, - format( - 'Materialized view \`%s.%s\` is selectable by anon or authenticated roles', - n.nspname, - c.relname - ) as detail, - 'https://supabase.com/docs/guides/database/database-linter?lint=0016_materialized_view_in_api' as remediation, - jsonb_build_object( - 'schema', n.nspname, - 'name', c.relname, - 'type', 'materialized view' - ) as metadata, - format( - 'materialized_view_in_api_%s_%s', - n.nspname, - c.relname - ) as cache_key -from - pg_catalog.pg_class c - join pg_catalog.pg_namespace n - on n.oid = c.relnamespace - left join pg_catalog.pg_depend dep - on c.oid = dep.objid - and dep.deptype = 'e' -where - c.relkind = 'm' - and ( - pg_catalog.has_table_privilege('anon', c.oid, 'SELECT') - or pg_catalog.has_table_privilege('authenticated', c.oid, 'SELECT') - ) - and n.nspname = any(array(select trim(unnest(string_to_array(current_setting('pgrst.db_schemas', 't'), ','))))) - and n.nspname not in ( - '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_config', '_timescaledb_internal', 'auth', 'cron', 'extensions', 'graphql', 'graphql_public', 'information_schema', 'net', 'pgroonga', 'pgsodium', 'pgsodium_masks', 'pgtle', 'pgbouncer', 'pg_catalog', 'pgtle', 'realtime', 'repack', 'storage', 'supabase_functions', 'supabase_migrations', 'tiger', 'topology', 'vault' - ) - and dep.objid is null)`.trim() - -// Array of all lint rules we handle right now. -export const LINT_TYPES = [ - 'unindexed_foreign_keys', - 'auth_users_exposed', - 'auth_rls_initplan', - 'no_primary_key', - 'unused_index', - 'multiple_permissive_policies', - 'policy_exists_rls_disabled', - 'rls_enabled_no_policy', - 'duplicate_index', - 'security_definer_view', - 'function_search_path_mutable', - 'rls_disabled_in_public', - 'extension_in_public', - 'auth_otp_long_expiry', - 'auth_otp_short_length', - 'rls_references_user_metadata', -] as const - -export type LINT_TYPES = (typeof LINT_TYPES)[number] - -export type Lint = { - name: LINT_TYPES - level: 'ERROR' | 'WARN' | 'INFO' - facing: string - categories: ['PERFORMANCE' | 'SECURITY'] - description: string - detail: string - remediation: any - metadata: { - schema?: string - name?: string - entity?: string - type?: 'table' | 'view' | 'auth' | 'function' | 'extension' - fkey_name?: string - fkey_columns?: number[] - } | null - cache_key: string -} export type ProjectLintsVariables = { projectRef?: string - connectionString?: string - exposedSchemas?: string +} +export type ProjectLintResponse = components['schemas']['ProjectLintResponse'] +export type Lint = ProjectLintResponse +export type LINT_TYPES = ProjectLintResponse['name'] + +export async function getProjectLints({ projectRef }: ProjectLintsVariables, signal?: AbortSignal) { + if (!projectRef) throw new Error('Project ref is required') + + const { data, error } = await get(`/platform/projects/{ref}/run-lints`, { + params: { path: { ref: projectRef } }, + signal, + }) + + if (error) handleError(error) + + return data } -const getProjectLints = async ( - { projectRef, connectionString, exposedSchemas }: ProjectLintsVariables, - signal?: AbortSignal -) => { - const exposedSchemasPrepend = `set local pgrst.db_schemas='${exposedSchemas}';` - - const { result } = await executeSql( - { - projectRef, - connectionString, - sql: exposedSchemasPrepend?.concat(LINT_SQL), - queryKey: lintKeys.lint(projectRef), - }, - signal - ) - - return result -} - -export type ProjectLintsData = Lint[] -export type ProjectLintsError = unknown +export type ProjectLintsData = Awaited> +export type ProjectLintsError = ResponseError export const useProjectLintsQuery = ( - { projectRef, connectionString }: Omit, + { projectRef }: ProjectLintsVariables, { enabled = true, ...options }: UseQueryOptions = {} -) => { - const { data, isSuccess } = useProjectPostgrestConfigQuery({ projectRef }) - - const exposedSchemas = data?.db_schema - - return useQuery( +) => + useQuery( lintKeys.lint(projectRef), - ({ signal }) => - getProjectLints({ projectRef, connectionString, exposedSchemas: exposedSchemas! }, signal), + ({ signal }) => getProjectLints({ projectRef }, signal), { - enabled: enabled && isSuccess && typeof projectRef !== 'undefined', + enabled: enabled && typeof projectRef !== 'undefined', ...options, } ) -} diff --git a/apps/studio/pages/project/[ref]/database/performance-advisor.tsx b/apps/studio/pages/project/[ref]/database/performance-advisor.tsx index e8e1c8e5f85..5f2bb67dff6 100644 --- a/apps/studio/pages/project/[ref]/database/performance-advisor.tsx +++ b/apps/studio/pages/project/[ref]/database/performance-advisor.tsx @@ -32,7 +32,6 @@ const ProjectLints: NextPageWithLayout = () => { const { data, isLoading, isRefetching, refetch } = useProjectLintsQuery({ projectRef: project?.ref, - connectionString: project?.connectionString, }) const activeLints = data?.filter((x) => x.categories.includes('PERFORMANCE')) || [] diff --git a/apps/studio/pages/project/[ref]/database/security-advisor.tsx b/apps/studio/pages/project/[ref]/database/security-advisor.tsx index 1321cc34799..432eec24d77 100644 --- a/apps/studio/pages/project/[ref]/database/security-advisor.tsx +++ b/apps/studio/pages/project/[ref]/database/security-advisor.tsx @@ -38,7 +38,6 @@ const ProjectLints: NextPageWithLayout = () => { refetch: refetchLintsQuery, } = useProjectLintsQuery({ projectRef: project?.ref, - connectionString: project?.connectionString, }) const { @@ -58,44 +57,6 @@ const ProjectLints: NextPageWithLayout = () => { let clientLints: Lint[] = [] - // [Alaister]: checking this client side for speed, but should be moved into the query if possible - if (authConfig?.EXTERNAL_EMAIL_ENABLED) { - if (authConfig.MAILER_OTP_EXP > 3600) { - clientLints.push({ - name: 'auth_otp_long_expiry', - level: 'WARN', - facing: 'EXTERNAL', - categories: ['SECURITY'], - description: 'OTP expiry exceeds recommended threshold', - detail: - 'We have detected that you have enabled the email provider with the OTP expiry set to more than an hour. It is recommended to set this value to less than an hour.', - cache_key: 'auth_otp_long_expiry', - remediation: 'https://supabase.com/docs/guides/platform/going-into-prod#security', - metadata: { - type: 'auth', - entity: 'Auth', - }, - }) - } - - if (authConfig.EXTERNAL_PHONE_ENABLED && authConfig.SMS_OTP_LENGTH < 6) { - clientLints.push({ - name: 'auth_otp_short_length', - level: 'WARN', - facing: 'EXTERNAL', - categories: ['SECURITY'], - description: 'OTP length is less than recommended threshold', - detail: 'We have detected that you have set the OTP length to less than 6 characters', - cache_key: 'auth_otp_short_length', - remediation: 'https://supabase.com/docs/guides/platform/going-into-prod#security', - metadata: { - type: 'auth', - entity: 'Auth', - }, - }) - } - } - const activeLints = [...(data ?? []), ...clientLints]?.filter((x) => x.categories.includes('SECURITY') ) From 9c03be41e4c3fe276347297401e55a321c425e11 Mon Sep 17 00:00:00 2001 From: Charis <26616127+charislam@users.noreply.github.com> Date: Thu, 23 May 2024 13:09:17 -0400 Subject: [PATCH 5/5] enhance(ref docs): add params and returns for realtime and storage (#26687) --- apps/docs/spec/supabase_js_v2.yml | 236 ++++++++++++++++++++++++++++-- 1 file changed, 222 insertions(+), 14 deletions(-) diff --git a/apps/docs/spec/supabase_js_v2.yml b/apps/docs/spec/supabase_js_v2.yml index 96f9fa8a3f9..8cb92c51011 100644 --- a/apps/docs/spec/supabase_js_v2.yml +++ b/apps/docs/spec/supabase_js_v2.yml @@ -6726,20 +6726,19 @@ functions: isSpotlight: true code: | ```js - supabase - .channel('room1') - .on('broadcast', { event: 'cursor-pos' }, payload => { - console.log('Cursor position received!', payload) - }) - .subscribe((status) => { - if (status === 'SUBSCRIBED') { - channel.send({ - type: 'broadcast', - event: 'cursor-pos', - payload: { x: Math.random(), y: Math.random() }, - }) - } - }) + const channel = supabase.channel("room1") + + channel.on("broadcast", { event: "cursor-pos" }, (payload) => { + console.log("Cursor position received!", payload); + }).subscribe((status) => { + if (status === "SUBSCRIBED") { + channel.send({ + type: "broadcast", + event: "cursor-pos", + payload: { x: Math.random(), y: Math.random() }, + }); + } + }); ``` - id: listen-to-presence-sync name: Listen to presence sync @@ -6909,6 +6908,10 @@ functions: } }) ``` + response: | + ``` + ok | timed out | error + ``` - id: send-a-message-via-rest name: Send a message via REST isSpotlight: true @@ -6981,6 +6984,26 @@ functions: .storage .listBuckets() ``` + response: | + ```json + { + "data": [ + { + "id": "avatars", + "name": "avatars", + "owner": "", + "public": false, + "file_size_limit": 1024, + "allowed_mime_types": [ + "image/png" + ], + "created_at": "2024-05-22T22:26:05.100Z", + "updated_at": "2024-05-22T22:26:05.100Z" + } + ], + "error": null + } + ``` - id: get-bucket title: getBucket() @@ -7000,6 +7023,24 @@ functions: .storage .getBucket('avatars') ``` + response: | + ```json + { + "data": { + "id": "avatars", + "name": "avatars", + "owner": "", + "public": false, + "file_size_limit": 1024, + "allowed_mime_types": [ + "image/png" + ], + "created_at": "2024-05-22T22:26:05.100Z", + "updated_at": "2024-05-22T22:26:05.100Z" + }, + "error": null + } + ``` - id: create-bucket title: createBucket() @@ -7023,6 +7064,15 @@ functions: fileSizeLimit: 1024 }) ``` + response: | + ```json + { + "data": { + "name": "avatars" + }, + "error": null + } + ``` - id: empty-bucket title: emptyBucket() @@ -7042,6 +7092,15 @@ functions: .storage .emptyBucket('avatars') ``` + response: | + ```json + { + "data": { + "message": "Successfully emptied" + }, + "error": null + } + ``` - id: update-bucket title: updateBucket() $ref: '@supabase/storage-js.packages/StorageBucketApi.default.updateBucket' @@ -7064,6 +7123,15 @@ functions: fileSizeLimit: 1024 }) ``` + response: | + ```json + { + "data": { + "message": "Successfully updated" + }, + "error": null + } + ``` - id: delete-bucket title: deleteBucket() @@ -7083,6 +7151,15 @@ functions: .storage .deleteBucket('avatars') ``` + response: | + ```json + { + "data": { + "message": "Successfully deleted" + }, + "error": null + } + ``` - id: from-upload title: from.upload() @@ -7108,6 +7185,14 @@ functions: upsert: false }) ``` + response: | + ```json + { + "data": { + "path": "avatars/public/avatar1.png" + }, + "error": null + } - id: upload-file-using-arraybuffer-from-base64-file-data name: Upload file using `ArrayBuffer` from base64 file data code: | @@ -7146,6 +7231,15 @@ functions: upsert: true }) ``` + response: | + ```json + { + "data": { + "path": "avatars/public/avatar1.png" + }, + "error": null + } + ``` - id: update-file-using-arraybuffer-from-base64-file-data name: Update file using `ArrayBuffer` from base64 file data code: | @@ -7179,6 +7273,15 @@ functions: .from('avatars') .move('public/avatar1.png', 'private/avatar2.png') ``` + response: | + ```json + { + "data": { + "message": "Successfully moved" + }, + "error": null + } + ``` - id: from-copy title: from.copy() @@ -7199,6 +7302,15 @@ functions: .from('avatars') .copy('public/avatar1.png', 'private/avatar2.png') ``` + response: | + ```json + { + "data": { + "path": "avatars/private/avatar2.png" + }, + "error": null + } + ``` - id: from-create-signed-url title: from.createSignedUrl() @@ -7219,6 +7331,15 @@ functions: .from('avatars') .createSignedUrl('folder/avatar1.png', 60) ``` + response: | + ```json + { + "data": { + "signedUrl": "https://example.supabase.co/storage/v1/object/sign/avatars/folder/avatar1.png?token=" + }, + "error": null + } + ``` - id: create-signed-url-with-transformations name: Create a signed URL for an asset with transformations isSpotlight: true @@ -7266,6 +7387,26 @@ functions: .from('avatars') .createSignedUrls(['folder/avatar1.png', 'folder/avatar2.png'], 60) ``` + response: | + ```json + { + "data": [ + { + "error": null, + "path": "folder/avatar1.png", + "signedURL": "/object/sign/avatars/folder/avatar1.png?token=", + "signedUrl": "https://example.supabase.co/storage/v1/object/sign/avatars/folder/avatar1.png?token=" + }, + { + "error": null, + "path": "folder/avatar2.png", + "signedURL": "/object/sign/avatars/folder/avatar2.png?token=", + "signedUrl": "https://example.supabase.co/storage/v1/object/sign/avatars/folder/avatar2.png?token=" + } + ], + "error": null + } + ``` - id: from-create-signed-upload-url title: from.createSignedUploadUrl() @@ -7286,6 +7427,17 @@ functions: .from('avatars') .createSignedUploadUrl('folder/cat.jpg') ``` + response: | + ```json + { + "data": { + "signedUrl": "https://example.supabase.co/storage/v1/object/upload/sign/avatars/folder/cat.jpg?token=", + "path": "folder/cat.jpg", + "token": "" + }, + "error": null + } + ``` - id: from-upload-to-signed-url title: from.uploadToSignedUrl() @@ -7306,6 +7458,16 @@ functions: .from('avatars') .uploadToSignedUrl('folder/cat.jpg', 'token-from-createSignedUploadUrl', file) ``` + response: | + ```json + { + "data": { + "path": "folder/cat.jpg", + "fullPath": "avatars/folder/cat.jpg" + }, + "error": null + } + ``` - id: from-get-public-url title: from.getPublicUrl() @@ -7327,6 +7489,14 @@ functions: .from('public-bucket') .getPublicUrl('folder/avatar1.png') ``` + response: | + ```json + { + "data": { + "publicUrl": "https://example.supabase.co/storage/v1/object/public/public-bucket/folder/avatar1.png" + } + } + ``` - id: transform-asset-in-public-bucket name: Returns the URL for an asset in a public bucket with transformations isSpotlight: true @@ -7374,6 +7544,13 @@ functions: .from('avatars') .download('folder/avatar1.png') ``` + response: | + ```json + { + "data": , + "error": null + } + ``` - id: download-file-with-transformations name: Download file with transformations isSpotlight: true @@ -7410,6 +7587,13 @@ functions: .from('avatars') .remove(['folder/avatar1.png']) ``` + response: | + ```json + { + "data": [], + "error": null + } + ``` - id: from-list title: from.list() @@ -7434,6 +7618,30 @@ functions: sortBy: { column: 'name', order: 'asc' }, }) ``` + response: | + ```json + { + "data": [ + { + "name": "avatar1.png", + "id": "e668cf7f-821b-4a2f-9dce-7dfa5dd1cfd2", + "updated_at": "2024-05-22T23:06:05.580Z", + "created_at": "2024-05-22T23:04:34.443Z", + "last_accessed_at": "2024-05-22T23:04:34.443Z", + "metadata": { + "eTag": "\"c5e8c553235d9af30ef4f6e280790b92\"", + "size": 32175, + "mimetype": "image/png", + "cacheControl": "max-age=3600", + "lastModified": "2024-05-22T23:06:05.574Z", + "contentLength": 32175, + "httpStatusCode": 200 + } + } + ], + "error": null + } + ``` - id: search-files-in-a-bucket name: Search files in a bucket code: |