mirror of
https://github.com/supabase/supabase.git
synced 2026-10-05 17:35:10 +03:00
Merge branch 'master' into feat/sql-editor-optimistic-create
This commit is contained in:
commit
2bc5b3b842
578 files changed
+35332
-25841
No files matched your search
@@ -17,7 +17,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [14.x]
|
||||
node-version: [16.x]
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
|
||||
steps:
|
||||
|
||||
+9
-3
@@ -14,6 +14,8 @@
|
||||
- [Shared components](#shared-components)
|
||||
- [Installing packages](#installing-packages)
|
||||
- [Development](#development)
|
||||
- [Common Tasks](#common-tasks)
|
||||
- [Adding redirects](#adding-redirects)
|
||||
- [Finally](#finally)
|
||||
- [Community Channels](#community-channels)
|
||||
|
||||
@@ -56,7 +58,7 @@ To build Supabase, you clone the source code repository:
|
||||
|
||||
### Choosing Directory
|
||||
|
||||
Before you start a development server, you must choose if you want to work on the [Supabase Website](https://supabase.com), [Supabase Docs](https://supabase.com/docs), or [Supabase Studio](https://app.supabase.io).
|
||||
Before you start a development server, you must choose if you want to work on the [Supabase Website](https://supabase.com), [Supabase Docs](https://supabase.com/docs), or [Supabase Studio](https://app.supabase.com).
|
||||
|
||||
1. Go to the [Supabase Website](https://supabase.com) directory
|
||||
|
||||
@@ -70,7 +72,7 @@ Before you start a development server, you must choose if you want to work on th
|
||||
cd web
|
||||
```
|
||||
|
||||
Go to the [Supabase Studio](https://app.supabase.io) directory
|
||||
Go to the [Supabase Studio](https://app.supabase.com) directory
|
||||
|
||||
```sh
|
||||
cd studio
|
||||
@@ -186,7 +188,6 @@ Then edit and visit any of the following sites:
|
||||
- `/apps/temp-community-tutorials`: http://localhost:3003
|
||||
- pulls all our DEV articles (which community members can write) into a nextjs site. Temporary/POC
|
||||
|
||||
|
||||
### Shared components
|
||||
|
||||
The monorepo has a set of shared components under `/packages`:
|
||||
@@ -194,6 +195,7 @@ The monorepo has a set of shared components under `/packages`:
|
||||
- `/packages/common`: Common React code, shared between all sites.
|
||||
- `/packages/config`: All shared config
|
||||
- `/packages/tsconfig`: Shared Typescript settings
|
||||
|
||||
### Installing packages
|
||||
|
||||
Installing a package with NPM workspaces requires you to add the `-w` flag to tell NPM which workspace you want to install into.
|
||||
@@ -211,7 +213,11 @@ You do not need to install `devDependencies` in each workspace. These can all be
|
||||
|
||||
`npm run dev`
|
||||
|
||||
## Common Tasks
|
||||
|
||||
### Adding Redirects
|
||||
|
||||
To add a redirect, simple create a new entry in the [`next.config.js`](https://github.com/supabase/supabase/blob/master/apps/www/next.config.js) file in our main site.
|
||||
|
||||
## Finally
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ To see how to Contribute, visit [Getting Started](./DEVELOPERS.md)
|
||||
## Status
|
||||
|
||||
- [x] Alpha: We are testing Supabase with a closed set of customers
|
||||
- [x] Public Alpha: Anyone can sign up over at [app.supabase.io](https://app.supabase.io). But go easy on us, there are a few kinks
|
||||
- [x] Public Alpha: Anyone can sign up over at [app.supabase.com](https://app.supabase.com). But go easy on us, there are a few kinks
|
||||
- [x] Public Beta: Stable enough for most non-enterprise use-cases
|
||||
- [ ] Public: Production-ready
|
||||
|
||||
@@ -55,7 +55,7 @@ Supabase is a combination of open source tools. We’re building the features of
|
||||
|
||||
**Architecture**
|
||||
|
||||
Supabase is a [hosted platform](https://app.supabase.io). You can sign up and start using Supabase without installing anything.
|
||||
Supabase is a [hosted platform](https://app.supabase.com). You can sign up and start using Supabase without installing anything.
|
||||
You can also [self-host](https://supabase.com/docs/guides/hosting/overview) and [develop locally](https://supabase.com/docs/guides/local-development).
|
||||
|
||||

|
||||
|
||||
@@ -7,7 +7,7 @@ export default function AuthProviders() {
|
||||
<div className="grid gap-4 md:grid-cols-2">
|
||||
{authProviders.map((x: any) => (
|
||||
<div key={x.name}>
|
||||
<Link href={x.href}>
|
||||
<Link passHref href={x.href}>
|
||||
<Card>
|
||||
<div className="flex justify-between gap-10">
|
||||
<p>{x.name}</p>
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
.code-block::before {
|
||||
content: '';
|
||||
background: #1e1e1e;
|
||||
height: 10px;
|
||||
width: 48px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.code-block::after {
|
||||
content: '';
|
||||
background: #1e1e1e;
|
||||
height: 12px;
|
||||
width: 48px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.code-block code .linenumber {
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.code-block code::after,
|
||||
.code-block code::before {
|
||||
content: none !important;
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'
|
||||
import monokaiCustomTheme from './CodeBlock.utils'
|
||||
import CodeBlockStyles from './CodeBlock.module.css'
|
||||
import { Button, IconCopy } from '@supabase/ui'
|
||||
import { Button, IconCheck, IconCopy } from '@supabase/ui'
|
||||
import CopyToClipboard from 'react-copy-to-clipboard'
|
||||
|
||||
import js from 'react-syntax-highlighter/dist/cjs/languages/hljs/javascript'
|
||||
import py from 'react-syntax-highlighter/dist/cjs/languages/hljs/python'
|
||||
import sql from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql'
|
||||
import { useState } from 'react'
|
||||
|
||||
interface Props {
|
||||
lang: 'js' | 'sql' | 'py'
|
||||
@@ -18,6 +18,15 @@ interface Props {
|
||||
}
|
||||
|
||||
function CodeBlock(props: Props) {
|
||||
const [copied, setCopied] = useState(false)
|
||||
|
||||
const handleCopy = () => {
|
||||
setCopied(true)
|
||||
setTimeout(() => {
|
||||
setCopied(false)
|
||||
}, 1000)
|
||||
}
|
||||
|
||||
let lang = props.lang
|
||||
? props.lang
|
||||
: props.className
|
||||
@@ -38,7 +47,7 @@ function CodeBlock(props: Props) {
|
||||
<SyntaxHighlighter
|
||||
language={lang}
|
||||
style={monokaiCustomTheme}
|
||||
className={'code-block dark:border-dark rounded-lg border border-gray-600'}
|
||||
className={'code-block border-scale-600 rounded-lg border'}
|
||||
customStyle={{
|
||||
padding: 0,
|
||||
fontSize: large ? 18 : 12,
|
||||
@@ -51,23 +60,29 @@ function CodeBlock(props: Props) {
|
||||
paddingTop: '128px',
|
||||
}}
|
||||
lineNumberStyle={{
|
||||
minWidth: '48px',
|
||||
minWidth: '44px',
|
||||
background: '#1e1e1e',
|
||||
paddingLeft: '21px',
|
||||
paddingLeft: '4px',
|
||||
paddingRight: '4px',
|
||||
marginRight: '12px',
|
||||
color: '#828282',
|
||||
textAlign: 'center',
|
||||
fontSize: large ? 14 : 12,
|
||||
paddingTop: '4px',
|
||||
paddingBottom: '4px',
|
||||
}}
|
||||
>
|
||||
{props.children}
|
||||
{props.children?.trimEnd()}
|
||||
</SyntaxHighlighter>
|
||||
{!props.hideCopy && props.children ? (
|
||||
<div className="dark absolute right-2 top-2">
|
||||
<CopyToClipboard text={props.children}>
|
||||
<Button type="outline" className="dark:bg-dark-800" icon={<IconCopy />}>
|
||||
Copy
|
||||
<Button
|
||||
type="default"
|
||||
icon={copied ? <IconCheck /> : <IconCopy />}
|
||||
onClick={() => handleCopy()}
|
||||
>
|
||||
{copied ? 'Copied' : 'Copy'}
|
||||
</Button>
|
||||
</CopyToClipboard>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Typography } from '@supabase/ui'
|
||||
import Image from 'next/image'
|
||||
import Link from 'next/link'
|
||||
import footer from '../data/footer.json'
|
||||
import { useTheme } from './Providers'
|
||||
@@ -16,24 +16,35 @@ const Footer = () => {
|
||||
</h2>
|
||||
<div className="xl:grid xl:grid-cols-3 xl:gap-8">
|
||||
<div className="space-y-8 xl:col-span-1">
|
||||
<Link href="#">
|
||||
<Link href="/">
|
||||
<a>
|
||||
<img
|
||||
className="w-40"
|
||||
<Image
|
||||
src={isDarkMode ? `/supabase-dark.svg` : `/supabase-light.svg`}
|
||||
alt="Supabase"
|
||||
width={160}
|
||||
height={22}
|
||||
/>
|
||||
</a>
|
||||
</Link>
|
||||
<div className="flex space-x-5">
|
||||
<a href="https://twitter.com/supabase" className="text-scale-900 hover:text-scale-1100">
|
||||
<a
|
||||
href="https://twitter.com/supabase"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-scale-900 hover:text-scale-1100"
|
||||
>
|
||||
<span className="sr-only">Twitter</span>
|
||||
<svg className="h-6 w-6" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84" />
|
||||
</svg>
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/supabase" className="text-scale-900 hover:text-scale-1100">
|
||||
<a
|
||||
href="https://github.com/supabase"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-scale-900 hover:text-scale-1100"
|
||||
>
|
||||
<span className="sr-only">GitHub</span>
|
||||
<svg className="h-6 w-6" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path
|
||||
@@ -46,6 +57,8 @@ const Footer = () => {
|
||||
|
||||
<a
|
||||
href="https://discord.supabase.com/"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-scale-900 hover:text-scale-1100"
|
||||
>
|
||||
<span className="sr-only">Discord</span>
|
||||
@@ -60,6 +73,8 @@ const Footer = () => {
|
||||
|
||||
<a
|
||||
href="https://youtube.com/c/supabase"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-scale-900 hover:text-scale-1100"
|
||||
>
|
||||
<span className="sr-only">Youtube</span>
|
||||
@@ -78,21 +93,22 @@ const Footer = () => {
|
||||
<ul className="mt-4 space-y-2">
|
||||
{segment.links.map((link: any, idx: number) => (
|
||||
<li key={`${segment.title}_link_${idx}`}>
|
||||
<a
|
||||
href={link.url}
|
||||
className={`text-sm ${
|
||||
link.url
|
||||
? 'text-scale-1000 dark:text-scale-1000'
|
||||
: 'text-scale-300 dark:text-scale-300'
|
||||
} hover:text-scale-900 dark:hover:text-scale-500`}
|
||||
>
|
||||
{link.text}
|
||||
{!link.url && (
|
||||
<span className="dark:text-dark-300 block text-sm text-gray-300">
|
||||
Coming soon
|
||||
</span>
|
||||
)}
|
||||
</a>
|
||||
<Link href={link.url}>
|
||||
<a
|
||||
className={`text-sm ${
|
||||
link.url
|
||||
? 'text-scale-1000 dark:text-scale-1000'
|
||||
: 'text-scale-300 dark:text-scale-300'
|
||||
} hover:text-brand-900 dark:hover:text-brand-1100 transition`}
|
||||
>
|
||||
{link.text}
|
||||
{!link.url && (
|
||||
<span className="dark:text-dark-300 block text-sm text-gray-300">
|
||||
Coming soon
|
||||
</span>
|
||||
)}
|
||||
</a>
|
||||
</Link>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
|
||||
@@ -1,27 +1,32 @@
|
||||
import Link from 'next/link'
|
||||
import { ReactElement } from 'react'
|
||||
|
||||
export default function LinkCard({
|
||||
title,
|
||||
description,
|
||||
icon,
|
||||
link,
|
||||
}: {
|
||||
title: string
|
||||
description: string
|
||||
icon: ReactElement
|
||||
link: string
|
||||
}) {
|
||||
return (
|
||||
<div className="border-scale-200 hover:border-brand-900 dark:bg-scale-400 m-4 w-full cursor-pointer rounded-md border px-4 shadow-sm hover:shadow-2xl lg:w-2/5">
|
||||
{description ? (
|
||||
<>
|
||||
<h4 className="my-0 p-0">{title}</h4>
|
||||
<p>{description}</p>
|
||||
</>
|
||||
) : (
|
||||
<div className="flex">
|
||||
{icon}
|
||||
<p>{title}</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<Link href={link || '#'}>
|
||||
<a className="border-scale-200 hover:border-brand-900 dark:bg-scale-400 m-4 w-full cursor-pointer rounded-md border p-4 shadow-sm hover:shadow-2xl lg:w-2/5">
|
||||
{description ? (
|
||||
<>
|
||||
<h4 className="m-0 mb-4 p-0 text-base font-semibold">{title}</h4>
|
||||
<p className="text-scale-1100 m-0 p-0">{description}</p>
|
||||
</>
|
||||
) : (
|
||||
<div className="flex">
|
||||
{icon}
|
||||
<p className="text-scale-1200 m-0 p-0">{title}</p>
|
||||
</div>
|
||||
)}
|
||||
</a>
|
||||
</Link>
|
||||
)
|
||||
}
|
||||
@@ -2,10 +2,12 @@ import Image from 'next/image'
|
||||
export default function Sponsor({ imageUrl, handle }: { imageUrl: string; handle: string }) {
|
||||
return (
|
||||
<div className="my-4 flex h-14 w-44 flex-row items-center">
|
||||
<img
|
||||
<Image
|
||||
className="mr-2 rounded-full"
|
||||
src={`https://github.com/${handle}.png`}
|
||||
className="mr-2 w-10 rounded-full"
|
||||
alt={handle}
|
||||
width={32}
|
||||
height={32}
|
||||
/>
|
||||
<h5>{handle}</h5>
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
import { ReactElement } from 'react'
|
||||
import { Tabs } from '@supabase/ui'
|
||||
export default function TabPanel(props) {
|
||||
console.log({ props })
|
||||
export default function TabPanel(props: { id: string; label: string | undefined; children: any }) {
|
||||
return (
|
||||
<Tabs.Panel id={props.id} label={props.label}>
|
||||
{props.children}
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
import { Tabs } from '@supabase/ui'
|
||||
|
||||
const TabWrapper = (props) => {
|
||||
console.log('Tab props: ', props)
|
||||
const { children, ...otherProps } = props
|
||||
|
||||
return <Tabs {...otherProps}>{props.children}</Tabs>
|
||||
const TabWrapper = (props: any) => {
|
||||
return (
|
||||
<div className="dashboard-tabs">
|
||||
<Tabs size="xlarge" type="underlined">
|
||||
<Tabs.Panel id={props.id} label={props.label}>
|
||||
{props.children}
|
||||
</Tabs.Panel>
|
||||
</Tabs>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default TabWrapper
|
||||
@@ -13,9 +13,12 @@ function DarkModeToggle() {
|
||||
}
|
||||
|
||||
return (
|
||||
<button className="flex w-full justify-between" onClick={() => toggleDarkMode()}>
|
||||
{isDarkMode ? <span>Dark Mode</span> : <span>Light Mode</span>}
|
||||
{isDarkMode ? <IconMoon /> : <IconSun />}
|
||||
<button onClick={() => toggleDarkMode()}>
|
||||
{isDarkMode ? (
|
||||
<IconMoon className="text-scale-1100 stroke-2" />
|
||||
) : (
|
||||
<IconSun className="text-scale-1100 stroke-2" />
|
||||
)}
|
||||
</button>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { ReactElement, useState } from 'react'
|
||||
import { ReactElement } from 'react'
|
||||
import Head from 'next/head'
|
||||
import NavBar from '../nav/NavBar'
|
||||
import SideBar from '../nav/SideBar'
|
||||
@@ -12,8 +12,8 @@ const DocsLayout = ({
|
||||
currentPage,
|
||||
}: {
|
||||
meta: { title: string; description: string }
|
||||
children: string
|
||||
toc: any
|
||||
children: ReactElement
|
||||
toc?: any
|
||||
menuItems: any
|
||||
currentPage: string
|
||||
}) => {
|
||||
@@ -25,7 +25,7 @@ const DocsLayout = ({
|
||||
<title>{meta?.title} | Supabase</title>
|
||||
<meta name="description" content={meta?.description} />
|
||||
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
||||
<link rel="icon" href="/docs/favicon.ico" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content={meta?.title} />
|
||||
<meta property="og:description" content={meta?.description} />
|
||||
@@ -40,24 +40,28 @@ const DocsLayout = ({
|
||||
|
||||
<main>
|
||||
<NavBar currentPage={currentPage} />
|
||||
<div className="flex flex-row">
|
||||
<div className="flex w-full flex-row">
|
||||
<SideBar menuItems={menuItems} />
|
||||
<div className="mx-auto grid w-full max-w-7xl grid-cols-12">
|
||||
<article className="prose dark:prose-dark dark:bg-scale-200 col-span-8 max-w-none p-8">
|
||||
{children}
|
||||
</article>
|
||||
<div className="prose dark:bg-scale-200 col-span-4 max-w-none p-8">
|
||||
<h5>On this page</h5>
|
||||
{toc
|
||||
? toc.json.map((item: any) => {
|
||||
<div className="docs-width flex w-full grid-cols-12 justify-between p-4 pb-8">
|
||||
<div className="w-full p-4">
|
||||
<article className="prose dark:prose-dark dark:bg-scale-200 width-full">
|
||||
{children}
|
||||
</article>
|
||||
</div>
|
||||
{toc && (
|
||||
<div className="prose border-scale-400 dark:bg-scale-200 thin-scrollbar table-of-contents-height w-1/4 border-l px-4">
|
||||
<h5>On this page</h5>
|
||||
<ul className="list-none pl-2 text-[0.8rem]">
|
||||
{toc.json.map((item: any, i: number) => {
|
||||
return (
|
||||
<li>
|
||||
<li key={i}>
|
||||
<a href={`#${item.slug}`}>{item.content}</a>
|
||||
</li>
|
||||
)
|
||||
})
|
||||
: 'Please note: No TOC on this page'}
|
||||
</div>
|
||||
})}
|
||||
</ul>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
|
||||
@@ -10,8 +10,8 @@ import {
|
||||
} from '@supabase/ui'
|
||||
import Image from 'next/image'
|
||||
import Link from 'next/link'
|
||||
import styles from '../../styles/Home.module.css'
|
||||
import { useTheme } from '../Providers'
|
||||
import ThemeToggle from '../ThemeToggle'
|
||||
|
||||
const NavBar = ({ currentPage }: { currentPage: string }) => {
|
||||
const [mounted, setMounted] = useState(false)
|
||||
@@ -32,16 +32,14 @@ const NavBar = ({ currentPage }: { currentPage: string }) => {
|
||||
]
|
||||
|
||||
return (
|
||||
<nav
|
||||
className={`dark:border-scale-400 dark:bg-scale-200 sticky top-0 z-10 flex h-[72px] justify-between border-b bg-white p-4 backdrop-blur backdrop-filter`}
|
||||
>
|
||||
<nav className="dark:border-scale-400 dark:bg-scale-200 sticky top-0 z-10 flex h-[72px] items-center justify-between border-b bg-white p-4 backdrop-blur backdrop-filter">
|
||||
<div className="flex items-center">
|
||||
<button className="mr-2 block lg:hidden">
|
||||
<IconMenu />
|
||||
<button className="mr-4 block stroke-2 lg:hidden">
|
||||
<IconMenu className="text-scale-1100" />
|
||||
</button>
|
||||
{mounted && (
|
||||
<Link href="/">
|
||||
<a>
|
||||
<a className="flex items-center">
|
||||
<Image
|
||||
className="cursor-pointer"
|
||||
src={isDarkMode ? `/supabase-dark.svg` : `/supabase-light.svg`}
|
||||
@@ -53,7 +51,7 @@ const NavBar = ({ currentPage }: { currentPage: string }) => {
|
||||
</Link>
|
||||
)}
|
||||
|
||||
<ul className={`${styles.navLinks} flex`}>
|
||||
<ul className="ml-8 hidden space-x-8 lg:flex">
|
||||
{pageLinks.map((p) => (
|
||||
<li key={`${p.text}-${p.link}`}>
|
||||
<Link href={p.link}>
|
||||
@@ -64,23 +62,26 @@ const NavBar = ({ currentPage }: { currentPage: string }) => {
|
||||
</li>
|
||||
))}
|
||||
<li>
|
||||
<Link href="https://app.supabase.io">
|
||||
<Link href="https://app.supabase.com">
|
||||
<a className={`text-scale-1100 text-sm`}>Login</a>
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div className={`${styles.navRight} flex items-center`}>
|
||||
<Link href="https://github.com/supabase/supabase">
|
||||
<a>
|
||||
<IconGitHub className="text-scale-1100" />
|
||||
</a>
|
||||
</Link>
|
||||
<Link href="https://twitter.com/supabase">
|
||||
<a>
|
||||
<IconTwitter className="text-scale-1100" />
|
||||
</a>
|
||||
</Link>
|
||||
<div className="flex items-center space-x-6">
|
||||
<div className="hidden items-center space-x-6 md:flex">
|
||||
<Link href="https://github.com/supabase/supabase">
|
||||
<a target="_blank">
|
||||
<IconGitHub className="text-scale-1100 stroke-2" />
|
||||
</a>
|
||||
</Link>
|
||||
<Link href="https://twitter.com/supabase">
|
||||
<a target="_blank">
|
||||
<IconTwitter className="text-scale-1100 stroke-2" />
|
||||
</a>
|
||||
</Link>
|
||||
<ThemeToggle />
|
||||
</div>
|
||||
<Input
|
||||
placeholder="Search"
|
||||
icon={<IconSearch />}
|
||||
|
||||
@@ -1,60 +1,55 @@
|
||||
import { Menu } from '@supabase/ui'
|
||||
import Link from 'next/link'
|
||||
import { useRouter } from 'next/router'
|
||||
import styles from '../../styles/Home.module.css'
|
||||
import ThemeToggle from '../ThemeToggle'
|
||||
|
||||
const SideBar = ({ menuItems }: { menuItems: any }) => {
|
||||
const { asPath } = useRouter()
|
||||
return (
|
||||
<div
|
||||
className={`${styles.sidebar} dark:bg-scale-200 dark:border-scale-400 relative h-full border-r py-4`}
|
||||
>
|
||||
<Menu>
|
||||
<div className="dark:bg-scale-200 dark:border-scale-400 thin-scrollbar sidebar-width sticky top-0 flex h-screen overflow-y-scroll border-r py-4">
|
||||
<Menu className="w-full">
|
||||
<div>
|
||||
{Object.keys(menuItems).map((key) => {
|
||||
return (
|
||||
<div key={key} className="mb-4">
|
||||
<Menu.Group title={key} />
|
||||
{menuItems[key].map((item: { link: string; text: string; sections: Array }) => (
|
||||
<span key={item.link}>
|
||||
{Array.isArray(item.sections) ? (
|
||||
<>
|
||||
<Menu.Group title={item.text} />
|
||||
{item.sections.map((section) => (
|
||||
<Link href={section.link} key={`${item.text}-${section.text}`}>
|
||||
<Menu.Item
|
||||
active={asPath == section.link}
|
||||
showActiveBar={asPath === section.link}
|
||||
>
|
||||
{section.text}
|
||||
{menuItems[key].map(
|
||||
(item: { link: string; text: string; sections: Array<any> }) => (
|
||||
<span key={item.link}>
|
||||
{Array.isArray(item.sections) ? (
|
||||
<>
|
||||
<Menu.Group title={item.text} />
|
||||
{item.sections.map((section) => (
|
||||
<Link href={section.link} key={`${item.text}-${section.text}`}>
|
||||
<a>
|
||||
<Menu.Item active={asPath == section.link}>
|
||||
{section.text}
|
||||
</Menu.Item>
|
||||
</a>
|
||||
</Link>
|
||||
))}
|
||||
</>
|
||||
) : (
|
||||
<Link href={item.link}>
|
||||
<a>
|
||||
<Menu.Item active={asPath === item.link}>
|
||||
<div
|
||||
className={
|
||||
asPath === item.link ? 'text-brand-900' : 'text-scale-1000'
|
||||
}
|
||||
>
|
||||
{item.text}
|
||||
</div>
|
||||
</Menu.Item>
|
||||
</Link>
|
||||
))}
|
||||
</>
|
||||
) : (
|
||||
<Link href={item.link} passHref>
|
||||
<a>
|
||||
<Menu.Item
|
||||
active={asPath === item.link}
|
||||
showActiveBar={asPath === item.link}
|
||||
>
|
||||
{item.text}
|
||||
</Menu.Item>
|
||||
</a>
|
||||
</Link>
|
||||
)}
|
||||
</span>
|
||||
))}
|
||||
</a>
|
||||
</Link>
|
||||
)}
|
||||
</span>
|
||||
)
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
<div className="mt-16 w-full">
|
||||
<Menu.Item>
|
||||
<ThemeToggle />
|
||||
</Menu.Item>
|
||||
</div>
|
||||
</Menu>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"links": [
|
||||
{
|
||||
"text": "Blog",
|
||||
"url": "https://supabase.com/blog"
|
||||
"url": "/blog"
|
||||
},
|
||||
{
|
||||
"text": "Open Source",
|
||||
@@ -25,7 +25,7 @@
|
||||
"links": [
|
||||
{
|
||||
"text": "Brand Assets",
|
||||
"url": "https://supabase.com/brand-assets"
|
||||
"url": "/brand-assets"
|
||||
},
|
||||
{
|
||||
"text": "Docs",
|
||||
@@ -33,7 +33,7 @@
|
||||
},
|
||||
{
|
||||
"text": "Pricing",
|
||||
"url": "https://supabase.com/pricing"
|
||||
"url": "/pricing"
|
||||
},
|
||||
{
|
||||
"text": "Support",
|
||||
@@ -62,7 +62,7 @@
|
||||
},
|
||||
{
|
||||
"text": "RSS",
|
||||
"url": "https://supabase.com/rss.xml"
|
||||
"url": "/rss.xml"
|
||||
},
|
||||
{
|
||||
"text": "Discord",
|
||||
@@ -79,7 +79,7 @@
|
||||
"links": [
|
||||
{
|
||||
"text": "Join our beta",
|
||||
"url": "https://app.supabase.io/"
|
||||
"url": "https://app.supabase.com/"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
---
|
||||
id: auth-signin
|
||||
title: "auth.signIn()"
|
||||
title: 'auth.signIn()'
|
||||
slug: auth-signin
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/dart.yml
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Log in an existing user, or login via a third-party provider.
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -25,38 +24,22 @@ final user = res.data?.user;
|
||||
final error = res.error;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Notes
|
||||
|
||||
- A user can sign up via email, phone number.
|
||||
- If you provide `email` without a `password`, the user will be sent a magic link.
|
||||
- The magic link's destination URL is determined by the SITE_URL config variable. To change this, you can go to Authentication -> Settings on [app.supabase.io](https://app.supabase.io)
|
||||
- Similarly, if you provide `phone` without a `password`, the user will be sent a one time password.
|
||||
- The magic link's destination URL is determined by the SITE_URL config variable. To change this, you can go to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
|
||||
- Similarly, if you provide `phone` without a `password`, the user will be sent a one time password.
|
||||
- If you are looking to sign users in with OAuth in Flutter apps, go to [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider).
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
### Sign in with email.
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -71,7 +54,6 @@ final user = res.data?.user;
|
||||
final error = res.error;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
@@ -93,17 +75,15 @@ final res = await supabase.auth.signIn(email: 'example@email.com');
|
||||
final error = res.error;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
### Get OAuth sign in URL.
|
||||
|
||||
Passing provider parameter to `signIn()` will return a URL to sign your user in via OAuth.
|
||||
Passing provider parameter to `signIn()` will return a URL to sign your user in via OAuth.
|
||||
If you are looking to sign in a user via OAuth on Flutter app, go to [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider).
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -118,7 +98,6 @@ final url = res.data?.url;
|
||||
final error = res.error;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
</Tabs>
|
||||
@@ -1,16 +1,15 @@
|
||||
---
|
||||
id: auth-signup
|
||||
title: "auth.signUp()"
|
||||
title: 'auth.signUp()'
|
||||
slug: auth-signup
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/dart.yml
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Creates a new user.
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -25,37 +24,21 @@ final user = res.data?.user;
|
||||
final error = res.error;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Notes
|
||||
|
||||
- By default, the user will need to verify their email address before logging in. If you would like to change this, you can disable "Email Confirmations" by going to Authentication -> Settings on [app.supabase.io](https://app.supabase.io)
|
||||
- By default, the user will need to verify their email address before logging in. If you would like to change this, you can disable "Email Confirmations" by going to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
|
||||
- If "Email Confirmations" is turned on, a `user` is returned but `session` will be null
|
||||
- If "Email Confirmations" is turned off, both a `user` and a `session` will be returned
|
||||
- When the user confirms their email address, they will be redirected to localhost:3000 by default. To change this, you can go to Authentication -> Settings on [app.supabase.io](https://app.supabase.io)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
- When the user confirms their email address, they will be redirected to localhost:3000 by default. To change this, you can go to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
|
||||
|
||||
## Examples
|
||||
|
||||
### Sign up.
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -70,11 +53,10 @@ final user = res.data?.user;
|
||||
final error = res.error;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
### Sign up with third-party providers.
|
||||
|
||||
If you are using Flutter, you can sign up with OAuth providers using the [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider) method available on `supabase_flutter`.
|
||||
If you are using Flutter, you can sign up with OAuth providers using the [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider) method available on `supabase_flutter`.
|
||||
@@ -1,16 +1,15 @@
|
||||
---
|
||||
id: storage-from-getpublicurl
|
||||
title: "from.getPublicUrl()"
|
||||
title: 'from.getPublicUrl()'
|
||||
slug: storage-from-getpublicurl
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/dart.yml
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Retrieve URLs for assets in public buckets
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -27,37 +26,21 @@ final res = supabase
|
||||
final publicURL = res.data;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Notes
|
||||
|
||||
- The bucket needs to be set to public, either via [updateBucket()](/docs/reference/javascript/storage-updatebucket) or by going to Storage on [app.supabase.io](https://app.supabase.io), clicking the overflow menu on a bucket and choosing "Make public"
|
||||
- The bucket needs to be set to public, either via [updateBucket()](/docs/reference/javascript/storage-updatebucket) or by going to Storage on [app.supabase.com](https://app.supabase.com), clicking the overflow menu on a bucket and choosing "Make public"
|
||||
- Policy permissions required:
|
||||
- `buckets` permissions: none
|
||||
- `buckets` permissions: none
|
||||
- `objects` permissions: none
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
### Returns the URL for an asset in a public bucket
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -74,7 +57,6 @@ final res = supabase
|
||||
final publicURL = res.data;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
</Tabs>
|
||||
@@ -5,7 +5,15 @@ description: 'Supabase auth'
|
||||
|
||||
# Auth
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/6ow_jW4epf8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||
<iframe
|
||||
width="560"
|
||||
height="315"
|
||||
src="https://www.youtube.com/embed/6ow_jW4epf8"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
|
||||
## User Management
|
||||
|
||||
@@ -57,6 +65,7 @@ let { data, error } = await supabase
|
||||
// console.log(data)
|
||||
// => { id: 'd0714948', name: 'Jane' }
|
||||
```
|
||||
|
||||
... you can simply define a rule on your database table, `auth.uid() = user_id`, and your request will return the rows which pass the rule, even when you remove the filter from your middleware:
|
||||
|
||||
```Javascript
|
||||
@@ -68,7 +77,6 @@ let user = await supabase.from('users').select('user_id, name')
|
||||
|
||||
## How It Works
|
||||
|
||||
|
||||
1. A user signs up. Supabase creates a new user in the `auth.users` table.
|
||||
2. Supabase returns a new JWT, which contains the user's `UUID`.
|
||||
3. Every request to your database also sends the JWT.
|
||||
@@ -105,8 +113,6 @@ alter publication supabase_realtime add table posts;
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
- Read more about Auth in the [Guides](https://supabase.com/docs/guides/auth/intro).
|
||||
- Sign in: [app.supabase.io](https://app.supabase.io/)
|
||||
|
||||
|
||||
|
||||
- Sign in: [app.supabase.com](https://app.supabase.com/)
|
||||
@@ -11,12 +11,12 @@ import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Setting up Email logins for your Supabase application.
|
||||
|
||||
- Add Email authenticator to your [Supabase Project](https://app.supabase.io)
|
||||
- Add Email authenticator to your [Supabase Project](https://app.supabase.com)
|
||||
- Add the login code to your application - [Javascript](https://github.com/supabase/supabase-js) | [Dart](https://github.com/supabase/supabase-dart)
|
||||
|
||||
## Add Email into your Supabase Project
|
||||
|
||||
- Go to your [Supabase Project Dashboard](https://app.supabase.io)
|
||||
- Go to your [Supabase Project Dashboard](https://app.supabase.com)
|
||||
- In the left sidebar, click the `Authentication` icon (near the top)
|
||||
- Click `Settings` from the list to go to the `Authentication Settings` page
|
||||
- Enter the final (hosted) URL of your app under `Site URL` (this is important)
|
||||
|
||||
@@ -13,12 +13,12 @@ By default, if no password is provided, the user will be sent a "magic link" to
|
||||
|
||||
Setting up Magic Link logins for your Supabase application.
|
||||
|
||||
- Add Magic Link authenticator to your [Supabase Project](https://app.supabase.io)
|
||||
- Add Magic Link authenticator to your [Supabase Project](https://app.supabase.com)
|
||||
- Add the login code to your application - [Javascript](https://github.com/supabase/supabase-js) | [Dart](https://github.com/supabase/supabase-dart)
|
||||
|
||||
## Add Magic Link into your Supabase Project
|
||||
|
||||
- Go to your [Supabase Project Dashboard](https://app.supabase.io)
|
||||
- Go to your [Supabase Project Dashboard](https://app.supabase.com)
|
||||
- In the left sidebar, click the `Authentication` icon (near the top)
|
||||
- Click `Settings` from the list to go to the `Authentication Settings` page
|
||||
- Enter the final (hosted) URL of your app under `Site URL` (this is important)
|
||||
|
||||
@@ -25,7 +25,7 @@ We'll cover:
|
||||
What you'll need:
|
||||
|
||||
- A MessageBird account (sign up here: https://dashboard.messagebird.com/en/sign-up)
|
||||
- A Supabase project (create one here: https://app.supabase.io)
|
||||
- A Supabase project (create one here: https://app.supabase.com)
|
||||
- A mobile phone capable of receiving SMS
|
||||
|
||||
## Steps
|
||||
@@ -40,7 +40,7 @@ This is the number that will be receiving the SMS OTPs.
|
||||
|
||||

|
||||
|
||||
Navigate to the [dashboard settings](https://dashboard.messagebird.com/en/settings/sms) to set the default originator. The messagebird originator is the name or number from which the message is sent.
|
||||
Navigate to the [dashboard settings](https://dashboard.messagebird.com/en/settings/sms) to set the default originator. The messagebird originator is the name or number from which the message is sent.
|
||||
For more information, you can refer to the messagebird article on choosing an originator [here](https://support.messagebird.com/hc/en-us/articles/115002628665-Choosing-an-originator)
|
||||
|
||||

|
||||
@@ -50,7 +50,7 @@ You will need the following values to get started:
|
||||
- Live API Key / Test API Key
|
||||
- MessageBird originator
|
||||
|
||||
Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.io/project/YOUR-PROJECT-REF/auth/settings).
|
||||
Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/settings).
|
||||
|
||||
You should see an option to enable Phone Signup.
|
||||
|
||||
@@ -59,9 +59,10 @@ You should see an option to enable Phone Signup.
|
||||
Toggle it on, and copy the 2 values over from the messagebird dashboard. Click save.
|
||||
|
||||
Note: If you use the Test API Key, the OTP will not be delivered to the mobile number specified but messagebird will log the response in the dashboard.
|
||||
If the Live API Key is used instead, the OTP will be delivered and there will be a deduction in your free credits.
|
||||
If the Live API Key is used instead, the OTP will be delivered and there will be a deduction in your free credits.
|
||||
|
||||
<!-- TODO: Add screenshot of UI -->
|
||||
|
||||
Plugin MessageBird credentials
|
||||
|
||||
Now the backend should be setup, we can proceed to add our client-side code!
|
||||
@@ -70,7 +71,7 @@ Now the backend should be setup, we can proceed to add our client-side code!
|
||||
|
||||
The SMS message sent to a phone containing an OTP code can be customized. This is useful if you need to mention a brand name or display a website address.
|
||||
|
||||
Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.io/project/YOUR-PROJECT-REF/auth/templates).
|
||||
Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/templates).
|
||||
|
||||
Use the variable `.Code` in the template to display the code.
|
||||
|
||||
@@ -278,5 +279,5 @@ The user does not have a password therefore will need to sign in via this method
|
||||
## Resources
|
||||
|
||||
- [MessageBird Signup](https://dashboard.messagebird.com/en/sign-up)
|
||||
- [Supabase Dashboard](https://app.supabase.io)
|
||||
- [Supabase Dashboard](https://app.supabase.com)
|
||||
- [Supabase Row Level Security](/docs/guides/auth#row-level-security)
|
||||
@@ -25,13 +25,13 @@ We'll cover:
|
||||
What you'll need:
|
||||
|
||||
- A twilio account (sign up here: https://www.twilio.com/try-twilio)
|
||||
- A Supabase project (create one here: https://app.supabase.io)
|
||||
- A Supabase project (create one here: https://app.supabase.com)
|
||||
- A mobile phone capable of receiving SMS
|
||||
|
||||
## Video
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/akScoPO01bc"
|
||||
@@ -69,7 +69,7 @@ You should now be able to see all three values you'll need to get started:
|
||||
|
||||

|
||||
|
||||
Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.io/project/YOUR-PROJECT-REF/auth/settings).
|
||||
Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/settings).
|
||||
|
||||
You should see an option to enable Phone Signup.
|
||||
|
||||
@@ -87,7 +87,7 @@ Now the backend should be setup, we can proceed to add our client-side code!
|
||||
|
||||
The SMS message sent to a phone containing an OTP code can be customized. This is useful if you need to mention a brand name or display a website address.
|
||||
|
||||
Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.io/project/YOUR-PROJECT-REF/auth/templates).
|
||||
Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/templates).
|
||||
|
||||
Use the variable `.Code` in the template to display the code.
|
||||
|
||||
@@ -295,5 +295,5 @@ The user does not have a password therefore will need to sign in via this method
|
||||
## Resources
|
||||
|
||||
- [Twilio Signup](https://www.twilio.com/try-twilio)
|
||||
- [Supabase Dashboard](https://app.supabase.io)
|
||||
- [Supabase Dashboard](https://app.supabase.com)
|
||||
- [Supabase Row Level Security](/docs/guides/auth#row-level-security)
|
||||
@@ -4,16 +4,13 @@ title: Client Libraries
|
||||
description: 'Supabase provides client libraries in several languages.'
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
|
||||
|
||||
The [Supabase Client](/docs/reference/javascript/supabase-client) makes it simple for developers to build secure and scalable products.
|
||||
The [Supabase Client](/docs/reference/javascript/supabase-client) makes it simple for developers to build secure and scalable products.
|
||||
|
||||
## Auth
|
||||
|
||||
|
||||
Create new users using [`signUp()`](/docs/reference/javascript/auth-signup). By default, the user will need to verify their email address before logging in.<br/>
|
||||
If confirmations are disabled the response will contain an access token and also a confirmed_at value, otherwise it will just contain a confirmation_sent_at attribute.
|
||||
|
||||
@@ -31,7 +28,6 @@ const { error, data } = await supabase.auth.signUp({
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
<TabsPanel id="py" label="py">
|
||||
|
||||
@@ -48,7 +44,6 @@ user = supabase.auth.sign_up(
|
||||
)
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
<TabsPanel id="dart" label="dart">
|
||||
@@ -70,8 +65,6 @@ void main() async {
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
Existing users can log in using [`signIn()`](/docs/reference/javascript/auth-signin).
|
||||
|
||||
<Tabs
|
||||
@@ -84,11 +77,10 @@ Existing users can log in using [`signIn()`](/docs/reference/javascript/auth-sig
|
||||
```js
|
||||
const { error, data } = await supabase.auth.signIn({
|
||||
email: 'example@email.com',
|
||||
password: 'example-password'
|
||||
password: 'example-password',
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
<TabsPanel id="py" label="py">
|
||||
|
||||
@@ -105,7 +97,6 @@ user = supabase.auth.sign_in(
|
||||
)
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
<TabsPanel id="dart" label="dart">
|
||||
@@ -127,7 +118,6 @@ void main() async {
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
If there is an email, but no password passed to [`signIn()`](/docs/reference/javascript/auth-signin), the user will receive a magic link.
|
||||
|
||||
<Tabs
|
||||
@@ -139,11 +129,10 @@ If there is an email, but no password passed to [`signIn()`](/docs/reference/jav
|
||||
|
||||
```js
|
||||
const { error, data } = await supabase.auth.signIn({
|
||||
email: 'example@email.com'
|
||||
email: 'example@email.com',
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
<TabsPanel id="py" label="py">
|
||||
|
||||
@@ -159,7 +148,6 @@ user = supabase.auth.sign_in(
|
||||
)
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
<TabsPanel id="dart" label="dart">
|
||||
@@ -181,10 +169,8 @@ void main() async {
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
Third party logins are also handled through [`signIn()`](/docs/reference/javascript/auth-signin).
|
||||
|
||||
|
||||
<Tabs
|
||||
groupId="libraries"
|
||||
defaultActiveId="js"
|
||||
@@ -195,11 +181,10 @@ Third party logins are also handled through [`signIn()`](/docs/reference/javascr
|
||||
```js
|
||||
const { user, error } = await supabase.auth.signIn({
|
||||
// provider can be 'github', 'google', 'gitlab', or 'bitbucket'
|
||||
provider: 'github'
|
||||
provider: 'github',
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
<TabsPanel id="py" label="py">
|
||||
|
||||
@@ -207,7 +192,6 @@ const { user, error } = await supabase.auth.signIn({
|
||||
# Not yet implemented
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
<TabsPanel id="dart" label="dart">
|
||||
@@ -232,7 +216,6 @@ void main() async {
|
||||
|
||||
Since Postgres is a Relational database, the client makes it simple to query tables and fetch related data in one round-trip, using [`select()`](/docs/reference/javascript/select).
|
||||
|
||||
|
||||
<Tabs
|
||||
groupId="libraries"
|
||||
defaultActiveId="js"
|
||||
@@ -241,9 +224,7 @@ Since Postgres is a Relational database, the client makes it simple to query tab
|
||||
<TabsPanel id="js" label="js">
|
||||
|
||||
```js
|
||||
const { data, error } = await supabase
|
||||
.from('countries')
|
||||
.select(`
|
||||
const { data, error } = await supabase.from('countries').select(`
|
||||
name,
|
||||
cities (
|
||||
name
|
||||
@@ -251,7 +232,6 @@ const { data, error } = await supabase
|
||||
`)
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
<TabsPanel id="py" label="py">
|
||||
|
||||
@@ -266,7 +246,6 @@ supabase: Client = create_client(url, key)
|
||||
data = supabase.table('countries').select('name').execute()
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
<TabsPanel id="dart" label="dart">
|
||||
@@ -289,10 +268,8 @@ void main() async {
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
You can do advanced [filtering](/docs/reference/javascript/using-filters) to extract only the data that you need.
|
||||
|
||||
|
||||
<Tabs
|
||||
groupId="libraries"
|
||||
defaultActiveId="js"
|
||||
@@ -308,7 +285,6 @@ const { data, error } = await supabase
|
||||
.limit(10)
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
<TabsPanel id="py" label="py">
|
||||
|
||||
@@ -318,7 +294,6 @@ data = supabase.table('cities').select('name, country_id').eq('name', 'Germany')
|
||||
assert len(data.get("data", [])) > 0
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
<TabsPanel id="dart" label="dart">
|
||||
@@ -343,11 +318,8 @@ void main() async {
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
You can create data easily using [`insert()`](/docs/reference/javascript/insert).
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
groupId="libraries"
|
||||
defaultActiveId="js"
|
||||
@@ -356,15 +328,12 @@ You can create data easily using [`insert()`](/docs/reference/javascript/insert)
|
||||
<TabsPanel id="js" label="js">
|
||||
|
||||
```js
|
||||
const { data, error } = await supabase
|
||||
.from('cities')
|
||||
.insert([
|
||||
{ name: 'The Shire', country_id: 554 },
|
||||
{ name: 'Rohan', country_id: 555 },
|
||||
])
|
||||
const { data, error } = await supabase.from('cities').insert([
|
||||
{ name: 'The Shire', country_id: 554 },
|
||||
{ name: 'Rohan', country_id: 555 },
|
||||
])
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
<TabsPanel id="py" label="py">
|
||||
|
||||
@@ -373,7 +342,7 @@ data = supabase.table('cities').insert({'name': 'Gotham', 'country_id': 556 }).e
|
||||
# assert if insert response is a success
|
||||
assert data.get("status_code") in (200, 201)
|
||||
|
||||
# bulk insert
|
||||
# bulk insert
|
||||
data = supabase.table('cities').insert([
|
||||
{'name': 'Gotham', 'country_id': 556 },
|
||||
{'name': 'The Shire', 'country_id': 557 }
|
||||
@@ -381,7 +350,6 @@ data = supabase.table('cities').insert([
|
||||
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
<TabsPanel id="dart" label="dart">
|
||||
@@ -407,12 +375,10 @@ void main() async {
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
## Realtime Changes
|
||||
|
||||
The Supabase client makes it simple to listen to realtime database changes, using [`subscribe()`](/docs/reference/javascript/subscribe).
|
||||
|
||||
|
||||
<Tabs
|
||||
groupId="libraries"
|
||||
defaultActiveId="js"
|
||||
@@ -423,13 +389,12 @@ The Supabase client makes it simple to listen to realtime database changes, usin
|
||||
```js
|
||||
const mySubscription = supabase
|
||||
.from('countries')
|
||||
.on('*', payload => {
|
||||
.on('*', (payload) => {
|
||||
console.log('Change received!', payload)
|
||||
})
|
||||
.subscribe()
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
<TabsPanel id="py" label="py">
|
||||
|
||||
@@ -437,7 +402,6 @@ const mySubscription = supabase
|
||||
# Not yet implemented
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
<TabsPanel id="dart" label="dart">
|
||||
@@ -464,10 +428,8 @@ void main() async {
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
You can even [listen to Row Level changes](/docs/reference/javascript/subscribe#listening-to-row-level-changes).
|
||||
|
||||
|
||||
<Tabs
|
||||
groupId="libraries"
|
||||
defaultActiveId="js"
|
||||
@@ -482,7 +444,6 @@ const mySubscription = supabase
|
||||
.subscribe()
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
<TabsPanel id="py" label="py">
|
||||
|
||||
@@ -490,7 +451,6 @@ const mySubscription = supabase
|
||||
# Not yet implemented
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
<TabsPanel id="dart" label="dart">
|
||||
@@ -517,9 +477,7 @@ void main() async {
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
## Next steps
|
||||
|
||||
- View the [Client Docs](/docs/reference/javascript/supabase-client)
|
||||
- Sign in: [app.supabase.io](https://app.supabase.io)
|
||||
- Sign in: [app.supabase.com](https://app.supabase.com)
|
||||
@@ -15,7 +15,7 @@ You don't have to be a database expert to start using Supabase. Our table view m
|
||||
|
||||

|
||||
|
||||
### Relationships
|
||||
### Relationships
|
||||
|
||||
Dig into the relationships within your data.
|
||||
|
||||
@@ -23,8 +23,8 @@ Dig into the relationships within your data.
|
||||
<source src="/videos/relational-drilldown-zoom.mp4" type="video/mp4" playsInline />
|
||||
</video>
|
||||
|
||||
|
||||
### Clone tables
|
||||
|
||||
You can duplicate your tables, just like you would inside a spreadsheet.
|
||||
|
||||
<video width="99%" playsinline controls>
|
||||
@@ -32,6 +32,7 @@ You can duplicate your tables, just like you would inside a spreadsheet.
|
||||
</video>
|
||||
|
||||
### The SQL Editor
|
||||
|
||||
Supabase comes with a SQL Editor. You can also save your favorite queries to run later!
|
||||
|
||||
<video width="99%" playsinline controls>
|
||||
@@ -47,8 +48,8 @@ Supabase comes with a SQL Editor. You can also save your favorite queries to run
|
||||
|
||||
Database backups do NOT include objects stored via the Storage API, as the database only includes metadata about these objects. Restoring an old backup will not restore objects that have been deleted since then.
|
||||
|
||||
|
||||
### Extensions
|
||||
|
||||
To expand the functionality of your Postgres database, you can use extensions. You can enable Postgres extensions with the click of a button within the Supabase dashboard.
|
||||
|
||||
<video width="99%" playsinline controls>
|
||||
@@ -68,12 +69,12 @@ You can manage the realtime system, simply by [updating](https://supabase.com/do
|
||||
For example to enable realtime only for individual tables:
|
||||
|
||||
```sql
|
||||
begin;
|
||||
begin;
|
||||
-- remove the realtime publication
|
||||
drop publication if exists supabase_realtime;
|
||||
drop publication if exists supabase_realtime;
|
||||
|
||||
-- re-create the publication but don't enable it for any tables
|
||||
create publication supabase_realtime;
|
||||
create publication supabase_realtime;
|
||||
commit;
|
||||
|
||||
-- add a table to the publication
|
||||
@@ -82,13 +83,13 @@ alter publication supabase_realtime add table products;
|
||||
-- add other tables to the publication
|
||||
alter publication supabase_realtime add table posts;
|
||||
```
|
||||
|
||||
By default only "new" values are sent, but if you want to receive the old record (previous values) whenever you update or delete a record, you can update the replica identity of your tables, setting it to `full`:
|
||||
|
||||
```sql
|
||||
alter table your_table replica identity full;
|
||||
```
|
||||
|
||||
|
||||
### Migrating between projects#
|
||||
|
||||
If you have an existing Supabase Project and you want to migrate it into a new (fresh) Project, you can simply follow these steps:
|
||||
@@ -100,6 +101,7 @@ If you have an existing Supabase Project and you want to migrate it into a new (
|
||||
|
||||
**Migrate the database**
|
||||
First we want to grab the database structure only:
|
||||
|
||||
```bash
|
||||
pg_dump \
|
||||
-h db.PROJECT_REF.supabase.co \
|
||||
@@ -119,8 +121,8 @@ psql \
|
||||
-U postgres \
|
||||
< supabase_schema.sql
|
||||
```
|
||||
You may see some errors - the restore will attempt to drop any tables if they are present, and if they aren't present then an error will be displayed. These errors are informative only and nothing to worry about.
|
||||
|
||||
You may see some errors - the restore will attempt to drop any tables if they are present, and if they aren't present then an error will be displayed. These errors are informative only and nothing to worry about.
|
||||
|
||||
**(Optionally) Migrate the data**
|
||||
|
||||
@@ -135,7 +137,9 @@ pg_dump \
|
||||
-n auth \
|
||||
> supabase_data.sql
|
||||
```
|
||||
|
||||
This command creates a file on your computer called supabase_data.sql. We can use this file to restore the data in our new database:
|
||||
|
||||
```bash
|
||||
psql \
|
||||
-h db.NEW_PROJECT_REF.supabase.co \
|
||||
@@ -152,7 +156,7 @@ If you forget your password, you can reset it from the Dashboard SQL editor:
|
||||
For example:
|
||||
|
||||
```sql
|
||||
alter user postgres
|
||||
alter user postgres
|
||||
with password 'new_password';
|
||||
```
|
||||
|
||||
@@ -160,7 +164,6 @@ Read more in [Database Configuration](https://supabase.com/docs/guides/database/
|
||||
|
||||
###Changing the timezone of your server.
|
||||
|
||||
|
||||
Your database is initialized with the UTC timezone. We recommend keeping it this way, as it is helpful for time calculations. If, however, you want to update the timezone, you can do so using any of the [database timezones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).
|
||||
|
||||
For example:
|
||||
@@ -168,9 +171,10 @@ For example:
|
||||
```sql
|
||||
alter database postgres set timezone to 'America/New_York';
|
||||
```
|
||||
|
||||
Read more in [Database Configuration](https://supabase.com/docs/guides/database/managing-timezones).
|
||||
|
||||
## Next steps
|
||||
- Read more about [Postgres](https://supabase.com/docs/postgres/server/about)
|
||||
- Sign in: [app.supabase.io](https://app.supabase.io/)
|
||||
|
||||
- Read more about [Postgres](https://supabase.com/docs/postgres/server/about)
|
||||
- Sign in: [app.supabase.com](https://app.supabase.com/)
|
||||
@@ -34,7 +34,7 @@ cp .env.example .env
|
||||
|
||||
In particular, these are required:
|
||||
|
||||
- `POSTGRES_PASSWORD`: the password for the `postgres` role
|
||||
- `POSTGRES_PASSWORD`: the password for the `postgres` role
|
||||
- `JWT_SECRET`: used by PostgREST and GoTrue, among others
|
||||
- `SITE_URL`: the base URL of your site
|
||||
- `SMTP_*`: mail server credentials
|
||||
@@ -45,14 +45,14 @@ Use your `JWT_SECRET` to generate a `anon` and `service` API keys using the [JWT
|
||||
|
||||
Replace the values in these files:
|
||||
|
||||
- `docker-compose.yml`:
|
||||
- `docker-compose.yml`:
|
||||
- `ANON_KEY` - replace with an `anon` key
|
||||
- `SERVICE_KEY` - replace with a `service` key
|
||||
- `volumes/kong.yml`
|
||||
- `anon` - replace with an `anon` key
|
||||
- `service_role` - replace with a `service` key
|
||||
|
||||
### Start
|
||||
### Start
|
||||
|
||||
You can now start Supabase:
|
||||
|
||||
@@ -60,11 +60,10 @@ You can now start Supabase:
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
Your database will be persisted in `volumes/db/data`, and your storage objects in `volumes/storage`.
|
||||
Your database will be persisted in `volumes/db/data`, and your storage objects in `volumes/storage`.
|
||||
|
||||
Try out the examples in `supabase/examples` to verify if it works correctly!
|
||||
|
||||
|
||||
## Configuration
|
||||
|
||||
To keep the setup simple, we made some choices that may not be optimal for production:
|
||||
@@ -84,8 +83,7 @@ See the following guides to deploy Docker Compose setup using your preferred too
|
||||
- [AWS Fargate](https://aws.amazon.com/blogs/containers/deploy-applications-on-amazon-ecs-using-docker-compose/)
|
||||
- [Using Kompose for Kubernetes](https://kubernetes.io/docs/tasks/configure-pod-container/translate-compose-kubernetes/)
|
||||
|
||||
|
||||
## Next steps
|
||||
|
||||
- Got a question? [Ask here](https://github.com/supabase/supabase/discussions).
|
||||
- Sign in: [app.supabase.io](https://app.supabase.io)
|
||||
- Sign in: [app.supabase.com](https://app.supabase.com)
|
||||
@@ -9,35 +9,33 @@ import JwtGenerator from '@site/src/components/JwtGenerator'
|
||||
|
||||
There are several ways to use Supabase:
|
||||
|
||||
- [Supabase Cloud](https://app.supabase.io): you don't need to deploy anything. We will manage and scale your infrastructure.
|
||||
- [Supabase Cloud](https://app.supabase.com): you don't need to deploy anything. We will manage and scale your infrastructure.
|
||||
- [Docker](/docs/guides/hosting/docker): deploy to your own infrastructure.
|
||||
- Kubernetes: coming soon.
|
||||
|
||||
#### Before you begin
|
||||
|
||||
The self-hosted version of Supabase does not include a UI yet.
|
||||
We are working on this in stages, starting with our [UI library](https://github.com/supabase/ui) and with a [WIP PR here](https://github.com/supabase/supabase/pull/2281).
|
||||
The self-hosted version of Supabase does not include a UI yet.
|
||||
We are working on this in stages, starting with our [UI library](https://github.com/supabase/ui) and with a [WIP PR here](https://github.com/supabase/supabase/pull/2281).
|
||||
[[more context](https://github.com/supabase/supabase/discussions/1001#discussioncomment-558696)]
|
||||
|
||||
In the meantime, here are some suggestions for working with your Postgres Database:
|
||||
|
||||
- `pgadmin`: https://www.pgadmin.org
|
||||
- `dbeaver`: https://dbeaver.com
|
||||
- `pgadmin`: https://www.pgadmin.org
|
||||
- `dbeaver`: https://dbeaver.com
|
||||
- `BeeKeeper`: https://beekeeperstudio.io
|
||||
- `HeidiSQL`: https://heidisql.com
|
||||
- `Table Plus`: https://www.tableplus.io
|
||||
|
||||
|
||||
## Architecture
|
||||
|
||||
Supabase is a combination of open source tools, each specifically chosen for Enterprise-readiness.
|
||||
Supabase is a combination of open source tools, each specifically chosen for Enterprise-readiness.
|
||||
|
||||
If the tools and communities already exist, with an MIT, Apache 2, or equivalent open license, we will use and support that tool.
|
||||
If the tool doesn't exist, we build and open source it ourselves.
|
||||
If the tools and communities already exist, with an MIT, Apache 2, or equivalent open license, we will use and support that tool.
|
||||
If the tool doesn't exist, we build and open source it ourselves.
|
||||
|
||||

|
||||
|
||||
|
||||
- [PostgreSQL](https://www.postgresql.org/) is an object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance.
|
||||
- [Realtime](https://github.com/supabase/realtime) is an Elixir server that allows you to listen to PostgreSQL inserts, updates, and deletes using websockets. Supabase listens to Postgres' built-in replication functionality, converts the replication byte stream into JSON, then broadcasts the JSON over websockets.
|
||||
- [PostgREST](http://postgrest.org/) is a web server that turns your PostgreSQL database directly into a RESTful API
|
||||
@@ -46,7 +44,6 @@ If the tool doesn't exist, we build and open source it ourselves.
|
||||
- [GoTrue](https://github.com/netlify/gotrue) is an SWT based API for managing users and issuing SWT tokens.
|
||||
- [Kong](https://github.com/Kong/kong) is a cloud-native API gateway.
|
||||
|
||||
|
||||
## Configuration
|
||||
|
||||
Each system has a number of configuration options which can be found in the relevant product documentation.
|
||||
@@ -65,11 +62,10 @@ The "middleware" is everything except Postgres, and it should work with any Post
|
||||
|
||||
### Database Extensions
|
||||
|
||||
Supabase requires some Postgres extensions to be enabled by default for the API and Auth system to work. You can find the extensions inside the
|
||||
Supabase requires some Postgres extensions to be enabled by default for the API and Auth system to work. You can find the extensions inside the
|
||||
[schema initialization script](https://github.com/supabase/supabase/blob/master/docker/volumes/db/init/00-initial-schema.sql).
|
||||
|
||||
|
||||
We recommend installing all extensions into an `extensions` schema. This will keep your API clean,
|
||||
We recommend installing all extensions into an `extensions` schema. This will keep your API clean,
|
||||
since all tables in the `public` schema are exposed via the API.
|
||||
|
||||
```sql
|
||||
@@ -83,20 +79,18 @@ create extension if not exists pgjwt with schema extensions;
|
||||
|
||||
For UUID functions, required for PostgreSQL <13.
|
||||
|
||||
|
||||
##### `pgcrypto` and `pgjwt`
|
||||
|
||||
|
||||
For working with JWT and Auth functions.
|
||||
|
||||
### Database Roles
|
||||
|
||||
Supabase creates several default roles in your Postgres database. To restore defaults at any time you can run the commands inside the
|
||||
Supabase creates several default roles in your Postgres database. To restore defaults at any time you can run the commands inside the
|
||||
[schema initialization script](https://github.com/supabase/supabase/blob/master/docker/volumes/db/init/00-initial-schema.sql).
|
||||
|
||||
##### `postgres`
|
||||
|
||||
The default PostgreSQL role. This has admin privileges.
|
||||
The default PostgreSQL role. This has admin privileges.
|
||||
|
||||
##### `anon`
|
||||
|
||||
@@ -104,7 +98,7 @@ For "anonymous access". This is the role which the API (PostgREST) will use when
|
||||
|
||||
##### `authenticator`
|
||||
|
||||
A special role for the API (PostgREST). It has very limited access, and is used to validate a JWT and then
|
||||
A special role for the API (PostgREST). It has very limited access, and is used to validate a JWT and then
|
||||
"change into" another role determined by the JWT verification.
|
||||
|
||||
##### `authenticated`
|
||||
@@ -129,22 +123,22 @@ For running commands via the Supabase UI.
|
||||
|
||||
##### `supabase_admin`
|
||||
|
||||
Supabase Administrative role for maintaining your database.
|
||||
Supabase Administrative role for maintaining your database.
|
||||
|
||||
## API Keys
|
||||
## API Keys
|
||||
|
||||
The API Gateway (Kong) uses JWT to authenticate access through to the database. The JWT should correspond to a relevant Postgres Role,
|
||||
The API Gateway (Kong) uses JWT to authenticate access through to the database. The JWT should correspond to a relevant Postgres Role,
|
||||
and Supabase is designed to work with 2 roles: an `ANON_KEY` for unauthenticated access and a `SERVICE_KEY` for elevated access.
|
||||
|
||||
Use this tool to generate keys:
|
||||
|
||||
<JwtGenerator />
|
||||
|
||||
## Managing your secrets
|
||||
## Managing your secrets
|
||||
|
||||
Many components inside Supabase use secure secrets and passwords. These are listed in the self-hosting
|
||||
[env file](https://github.com/supabase/supabase/blob/master/docker/.env.example), but we strongly recommend using a
|
||||
secrets manager when deploying to production. Plain text files like dotenv lead to accidental costly leaks.
|
||||
[env file](https://github.com/supabase/supabase/blob/master/docker/.env.example), but we strongly recommend using a
|
||||
secrets manager when deploying to production. Plain text files like dotenv lead to accidental costly leaks.
|
||||
|
||||
Some suggested systems include:
|
||||
|
||||
|
||||
@@ -4,10 +4,9 @@ title: Supabase Platform
|
||||
description: Getting started with the Supabase platform.
|
||||
---
|
||||
|
||||
|
||||
Supabase is a hosted platform which makes it very simple to get started without needing to manage any infrastructure.
|
||||
|
||||
Visit [app.supabase.io](https://app.supabase.io) and sign in to start creating projects.
|
||||
Visit [app.supabase.com](https://app.supabase.com) and sign in to start creating projects.
|
||||
|
||||
## Organizations
|
||||
|
||||
@@ -18,7 +17,7 @@ Organizations are a way to group your projects. Every Organization can be config
|
||||
You can invite your Team members into your Organizations so that you can collaborate on projects.
|
||||
|
||||
<video width="99%" muted playsInline controls="true">
|
||||
<source src="/docs/videos/invite-team.mp4" type="video/mp4" muted playsInline />
|
||||
<source src="/docs/videos/invite-team.mp4" type="video/mp4" muted playsInline />
|
||||
</video>
|
||||
|
||||
## Projects
|
||||
@@ -26,10 +25,10 @@ You can invite your Team members into your Organizations so that you can collabo
|
||||
Each project on Supabase comes with these features:
|
||||
|
||||
- A dedicated Postgres database. [Learn more](/docs/guides/database)
|
||||
- Auto-generated APIs.
|
||||
- Auto-generated APIs.
|
||||
- User management. [Learn more](/docs/guides/auth)
|
||||
- Storage. [Learn more](/docs/guides/storage)
|
||||
|
||||
## Next Steps
|
||||
|
||||
- Sign in to [app.supabase.io](https://app.supabase.io)
|
||||
- Sign in to [app.supabase.com](https://app.supabase.com)
|
||||
@@ -4,25 +4,25 @@ title: Local Development
|
||||
description: How to use Supabase on your local development machine.
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Supabase provides a CLI so that you can develop your application locally, rather than connecting to a live project.
|
||||
|
||||
## Before you begin
|
||||
|
||||
If you're using the CLI, please record your steps! You can help us improve by adding missing details and fixing errors.
|
||||
If you're using the CLI, please record your steps! You can help us improve by adding missing details and fixing errors.
|
||||
|
||||
Our CLI is still under heavy development, and is missing some features:
|
||||
|
||||
- The self-hosted version of Supabase does not include a UI yet.
|
||||
We are working on this in stages, starting with our [UI library](https://github.com/supabase/ui)
|
||||
([more context](https://github.com/supabase/supabase/discussions/1001#discussioncomment-558696)).
|
||||
We are working on this in stages, starting with our [UI library](https://github.com/supabase/ui)
|
||||
([more context](https://github.com/supabase/supabase/discussions/1001#discussioncomment-558696)).
|
||||
|
||||
In the meantime, here are some suggested tools for interacting with your Postgres Database:
|
||||
|
||||
- `pgadmin`: https://www.pgadmin.org
|
||||
- `dbeaver`: https://dbeaver.com
|
||||
- `pgadmin`: https://www.pgadmin.org
|
||||
- `dbeaver`: https://dbeaver.com
|
||||
- `BeeKeeper`: https://beekeeperstudio.io
|
||||
- `HeidiSQL`: https://heidisql.com
|
||||
- `Table Plus`: https://www.tableplus.io
|
||||
@@ -30,6 +30,7 @@ In the meantime, here are some suggested tools for interacting with your Postgre
|
||||
## Prerequisites
|
||||
|
||||
You will need to have these in your environment:
|
||||
|
||||
- Git
|
||||
- Docker (make sure the daemon is up and running)
|
||||
- Supabase CLI (instructions [here](https://github.com/supabase/cli))
|
||||
@@ -62,7 +63,6 @@ service_role key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoic2VydmljZV9yb
|
||||
|
||||
#### Accessing Services Directly
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="Postgres"
|
||||
values={[
|
||||
@@ -76,7 +76,7 @@ values={[
|
||||
postgresql://postgres:postgres@localhost:5432/postgres
|
||||
```
|
||||
|
||||
The local Postgres instance can be accessed through [`psql`](https://www.postgresql.org/docs/current/app-psql.html)
|
||||
The local Postgres instance can be accessed through [`psql`](https://www.postgresql.org/docs/current/app-psql.html)
|
||||
or any other Postgres client, such as [pgadmin](https://www.pgadmin.org/).
|
||||
|
||||
For example:
|
||||
@@ -93,8 +93,8 @@ psql 'postgresql://postgres:postgres@localhost:5432/postgres'
|
||||
http://localhost:54321
|
||||
```
|
||||
|
||||
All of the services are accessible through the API Gateway [Kong](https://github.com/Kong/kong)).
|
||||
If you are accessing these services without the client libraries, you may need to pass the client keys as an `Authorization` header.
|
||||
All of the services are accessible through the API Gateway [Kong](https://github.com/Kong/kong)).
|
||||
If you are accessing these services without the client libraries, you may need to pass the client keys as an `Authorization` header.
|
||||
You can learn more about these JWT headers in our [Resources](/docs/learn/auth-deep-dive/auth-deep-dive-jwts).
|
||||
|
||||
```sh
|
||||
@@ -108,14 +108,12 @@ http://localhost:54321/v1/storage/v1/ # Storage
|
||||
http://localhost:54321/v1/auth/v1/ # Auth (GoTrue)
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
</Tabs>
|
||||
|
||||
|
||||
## Example application
|
||||
|
||||
Now that we've learned how to install and start Supabase locally, let's see how you can use it with a frontend application.
|
||||
Now that we've learned how to install and start Supabase locally, let's see how you can use it with a frontend application.
|
||||
This quick-start guide will show you, how you can configure a React app which uses the Supabase stack.
|
||||
|
||||
```bash
|
||||
@@ -125,8 +123,8 @@ npx create-react-app react-demo --use-npm
|
||||
# move into the new folder
|
||||
cd react-demo
|
||||
|
||||
# set up Supabase
|
||||
supabase init
|
||||
# set up Supabase
|
||||
supabase init
|
||||
|
||||
# Save the install supabase-js library
|
||||
npm install --save @supabase/supabase-js
|
||||
@@ -169,4 +167,4 @@ You can also use the CLI to manage your migrations. Follow the the tour [here](h
|
||||
|
||||
- Got a question? [Ask here](https://github.com/supabase/supabase/discussions).
|
||||
- CLI repository: [GitHub](https://github.com/supabase/cli).
|
||||
- Sign in: [app.supabase.io](https://app.supabase.io)
|
||||
- Sign in: [app.supabase.com](https://app.supabase.com)
|
||||
@@ -25,7 +25,6 @@ Buckets are distinct containers for files and folders. You can think of them lik
|
||||
|
||||
This is a quick guide that shows the basic functionality of Supabase Storage. Find a full [example application in GitHub](https://github.com/supabase/supabase/edit/master/examples/nextjs-ts-user-management), which you can deploy yourself.
|
||||
|
||||
|
||||
<a href="https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Fnextjs-ts-user-management&project-name=supabase-user-management&repository-name=supabase-user-management&demo-title=Supabase%20User%20Management&demo-description=An%20example%20web%20app%20using%20Supabase%20and%20Next.js&demo-url=https%3A%2F%2Fsupabase-nextjs-ts-user-management.vercel.app&demo-image=https%3A%2F%2Fi.imgur.com%2FZ3HkQqe.png&integration-ids=oac_jUduyjQgOyzev1fjrW83NYOv&external-id=nextjs-user-management">
|
||||
<img src="https://vercel.com/button" alt="Deploy with Vercel" />
|
||||
</a>
|
||||
@@ -41,6 +40,7 @@ TODO: Get tabs to render - @supabase/ui Tabs component fails to render)
|
||||
[Reference](https://pub.dev/documentation/storage_client/latest/storage_client/SupabaseStorageClient/createBucket.html)
|
||||
|
||||
### Upload a file
|
||||
|
||||
You can upload a file from the Dashboard, or within a browser using our JS libraries.
|
||||
|
||||
<video width="99%" playsinline controls>
|
||||
@@ -48,6 +48,7 @@ You can upload a file from the Dashboard, or within a browser using our JS libra
|
||||
</video>
|
||||
|
||||
### Download a file
|
||||
|
||||
You can download a file from the Dashboard, or within a browser using our JS libraries.
|
||||
|
||||
<video width="99%" playsinline controls>
|
||||
@@ -66,7 +67,7 @@ To restrict access to your files you can use either the Dashboard or SQL.
|
||||
|
||||
Supabase Storage is configured with database SQL helper functions which you can use in your database queries and policies.
|
||||
|
||||
<hr/>
|
||||
<hr />
|
||||
|
||||
`storage.filename()`
|
||||
|
||||
@@ -129,7 +130,9 @@ create policy "Public Access"
|
||||
on storage.objects for select
|
||||
using ( bucket_id = 'public' );
|
||||
```
|
||||
|
||||
#### Allow logged-in access to a bucket
|
||||
|
||||
```sql
|
||||
-- 1. Allow logged-in access to any files in the "restricted" bucket
|
||||
create policy "Restricted Access"
|
||||
@@ -148,12 +151,15 @@ create policy "Individual user Access"
|
||||
on storage.objects for select
|
||||
using ( auth.uid() = owner );
|
||||
```
|
||||
|
||||
### Tips
|
||||
|
||||
#### Go Easy
|
||||
|
||||
Supabase Storage is in Beta. If you're experiencing any issues, let us know on our [GitHub](https://github.com/supabase/supabase/discussions) and we will fix it as fast as we can.
|
||||
|
||||
## Next steps
|
||||
|
||||
- Got a question? Ask here.
|
||||
- Read more about storage in our blog post.
|
||||
- Sign in: app.supabase.io
|
||||
|
||||
- Sign in: app.supabase.com
|
||||
@@ -40,7 +40,7 @@ and then creating a "schema" inside the database.
|
||||
|
||||
### Create a project
|
||||
|
||||
1. Go to [app.supabase.io](https://app.supabase.io).
|
||||
1. Go to [app.supabase.com](https://app.supabase.com).
|
||||
1. Click on "New Project".
|
||||
1. Enter your project details.
|
||||
1. Wait for the new database to launch.
|
||||
@@ -54,7 +54,7 @@ or you can just copy/paste the SQL from below and run it yourself.
|
||||
<TabsPanel id="UI" label="UI">
|
||||
|
||||
```sh
|
||||
1. Go to the "SQL" section.
|
||||
1. Go to the "SQL Editor" section.
|
||||
2. Click "User Management Starter".
|
||||
3. Click "Run".
|
||||
```
|
||||
@@ -259,7 +259,7 @@ import { SupabaseService } from './supabase.service'
|
||||
@Component({
|
||||
selector: 'app-auth',
|
||||
template: `
|
||||
<div class="row flex flex-center">
|
||||
<div class="row flex-center flex">
|
||||
<form class="col-6 form-widget">
|
||||
<h1 class="header">Supabase + Angular</h1>
|
||||
<p class="description">Sign in via magic link with your email below</p>
|
||||
@@ -328,7 +328,7 @@ import { Session } from '@supabase/supabase-js'
|
||||
|
||||
<div>
|
||||
<button
|
||||
class="button block primary"
|
||||
class="button primary block"
|
||||
(click)="updateProfile(username.value, website.value)"
|
||||
[disabled]="loading"
|
||||
>
|
||||
@@ -539,4 +539,4 @@ template: `
|
||||
At this stage you have a fully functional application!
|
||||
|
||||
- Got a question? [Ask here](https://github.com/supabase/supabase/discussions).
|
||||
- Sign in: [app.supabase.io](https://app.supabase.io)
|
||||
- Sign in: [app.supabase.com](https://app.supabase.com)
|
||||
@@ -6,7 +6,6 @@ description: Learn how to use Supabase in your Flutter App.
|
||||
|
||||
# Quickstart: Flutter
|
||||
|
||||
|
||||
## Intro
|
||||
|
||||
This example provides the steps to build a simple user management app (from scratch!) using Supabase and Flutter. It includes:
|
||||
@@ -32,7 +31,7 @@ and then creating a "schema" inside the database.
|
||||
|
||||
### Create a project
|
||||
|
||||
1. Go to [app.supabase.io](https://app.supabase.io).
|
||||
1. Go to [app.supabase.com](https://app.supabase.com).
|
||||
1. Click on "New Project".
|
||||
1. Enter your project details.
|
||||
1. Wait for the new database to launch.
|
||||
@@ -48,7 +47,7 @@ defaultActiveId="UI"
|
||||
<TabsPanel id="UI" label="UI">
|
||||
|
||||
```sh
|
||||
1. Go to the "SQL" section.
|
||||
1. Go to the "SQL Editor" section.
|
||||
2. Click "User Management Starter".
|
||||
3. Click "Run".
|
||||
```
|
||||
@@ -906,4 +905,4 @@ Congratulations, that is it! You have now built a fully functional user manageme
|
||||
At this stage you have a fully functional application!
|
||||
|
||||
- Got a question? [Ask here](https://github.com/supabase/supabase/discussions).
|
||||
- Sign in: [app.supabase.io](https://app.supabase.io)
|
||||
- Sign in: [app.supabase.com](https://app.supabase.com)
|
||||
@@ -51,7 +51,7 @@ and then creating a "schema" inside the database.
|
||||
|
||||
### Create a project
|
||||
|
||||
1. Go to [app.supabase.io](https://app.supabase.io).
|
||||
1. Go to [app.supabase.com](https://app.supabase.com).
|
||||
1. Click on "New Project".
|
||||
1. Enter your project details.
|
||||
1. Wait for the new database to launch.
|
||||
@@ -65,7 +65,7 @@ or you can just copy/paste the SQL from below and run it yourself.
|
||||
<TabsPanel id="UI" label="Dashboard UI">
|
||||
|
||||
```sh
|
||||
1. Go to the "SQL" section.
|
||||
1. Go to the "SQL Editor" section.
|
||||
2. Click "User Management Starter".
|
||||
3. Click "Run".
|
||||
```
|
||||
@@ -222,7 +222,7 @@ export default function Auth() {
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="row flex flex-center">
|
||||
<div className="row flex-center flex">
|
||||
<div className="col-6 form-widget">
|
||||
<h1 className="header">Supabase + Next.js</h1>
|
||||
<p className="description">Sign in via magic link with your email below</p>
|
||||
@@ -354,7 +354,7 @@ export default function Account({ session }) {
|
||||
|
||||
<div>
|
||||
<button
|
||||
className="button block primary"
|
||||
className="button primary block"
|
||||
onClick={() => updateProfile({ username, website, avatar_url })}
|
||||
disabled={loading}
|
||||
>
|
||||
@@ -537,4 +537,4 @@ return (
|
||||
At this stage you have a fully functional application!
|
||||
|
||||
- Got a question? [Ask here](https://github.com/supabase/supabase/discussions).
|
||||
- Sign in: [app.supabase.io](https://app.supabase.io)
|
||||
- Sign in: [app.supabase.com](https://app.supabase.com)
|
||||
@@ -48,7 +48,7 @@ and then creating a "schema" inside the database.
|
||||
|
||||
### Create a project
|
||||
|
||||
1. Go to [app.supabase.io](https://app.supabase.io).
|
||||
1. Go to [app.supabase.com](https://app.supabase.com).
|
||||
1. Click on "New Project".
|
||||
1. Enter your project details.
|
||||
1. Wait for the new database to launch.
|
||||
@@ -62,7 +62,7 @@ or you can just copy/paste the SQL from below and run it yourself.
|
||||
<TabsPanel id="UI" label="Dashboard UI">
|
||||
|
||||
```sh
|
||||
1. Go to the "SQL" section.
|
||||
1. Go to the "SQL Editor" section.
|
||||
2. Click "User Management Starter".
|
||||
3. Click "Run".
|
||||
```
|
||||
@@ -230,7 +230,7 @@ export default function Auth() {
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="row flex flex-center">
|
||||
<div className="row flex-center flex">
|
||||
<div className="col-6 form-widget">
|
||||
<h1 className="header">Supabase + React</h1>
|
||||
<p className="description">Sign in via magic link with your email below</p>
|
||||
@@ -362,7 +362,7 @@ export default function Account({ session }) {
|
||||
|
||||
<div>
|
||||
<button
|
||||
className="button block primary"
|
||||
className="button primary block"
|
||||
onClick={() => updateProfile({ username, website, avatar_url })}
|
||||
disabled={loading}
|
||||
>
|
||||
@@ -544,4 +544,4 @@ return (
|
||||
At this stage you have a fully functional application!
|
||||
|
||||
- Got a question? [Ask here](https://github.com/supabase/supabase/discussions).
|
||||
- Sign in: [app.supabase.io](https://app.supabase.io)
|
||||
- Sign in: [app.supabase.com](https://app.supabase.com)
|
||||
@@ -98,7 +98,7 @@ So be sure to have a terminal at the ready and in your project directory.
|
||||
|
||||
### Create a project
|
||||
|
||||
1. Go to [app.supabase.io](https://app.supabase.io).
|
||||
1. Go to [app.supabase.com](https://app.supabase.com).
|
||||
1. Click on "New Project".
|
||||
1. Enter your project details.
|
||||
1. Wait for the new database to launch.
|
||||
@@ -114,7 +114,7 @@ defaultActiveId="UI"
|
||||
<TabsPanel id="UI" label="UI">
|
||||
|
||||
```sh
|
||||
1. Go to the "SQL" section.
|
||||
1. Go to the "SQL Editor" section.
|
||||
2. Click "User Management Starter".
|
||||
4. Click "Run".
|
||||
```
|
||||
@@ -411,7 +411,7 @@ const Auth = () => {
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="row flex flex-center">
|
||||
<div className="row flex-center flex">
|
||||
<div className="col-6 form-widget">
|
||||
<h1 className="header">Supabase + RedwoodJS</h1>
|
||||
<p className="description">Sign in via magic link with your email below</p>
|
||||
@@ -533,7 +533,7 @@ const Account = () => {
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="row flex flex-center">
|
||||
<div className="row flex-center flex">
|
||||
<div className="col-6 form-widget">
|
||||
<h1 className="header">Supabase + RedwoodJS</h1>
|
||||
<p className="description">Your profile</p>
|
||||
@@ -563,7 +563,7 @@ const Account = () => {
|
||||
|
||||
<div>
|
||||
<button
|
||||
className="button block primary"
|
||||
className="button primary block"
|
||||
onClick={() => updateProfile({ username, website, avatar_url })}
|
||||
disabled={loading}
|
||||
>
|
||||
@@ -768,6 +768,6 @@ return (
|
||||
At this stage you have a fully functional application!
|
||||
|
||||
- Got a question? [Ask here](https://github.com/supabase/supabase/discussions).
|
||||
- Sign in: [app.supabase.io](https://app.supabase.io)
|
||||
- Sign in: [app.supabase.com](https://app.supabase.com)
|
||||
- Learn more about [RedwoodJS](https://redwoodjs.com)
|
||||
- Visit the [RedwoodJS Discourse Community](https://community.redwoodjs.com)
|
||||
@@ -34,7 +34,7 @@ and then creating a "schema" inside the database.
|
||||
|
||||
### Create a project
|
||||
|
||||
1. Go to [app.supabase.io](https://app.supabase.io).
|
||||
1. Go to [app.supabase.com](https://app.supabase.com).
|
||||
1. Click on "New Project".
|
||||
1. Enter your project details.
|
||||
1. Wait for the new database to launch.
|
||||
@@ -50,7 +50,7 @@ defaultActiveId="UI"
|
||||
<TabsPanel id="UI" label="UI">
|
||||
|
||||
```sh
|
||||
1. Go to the "SQL" section.
|
||||
1. Go to the "SQL Editor" section.
|
||||
2. Click "User Management Starter".
|
||||
3. Click "Run".
|
||||
```
|
||||
@@ -242,7 +242,7 @@ Let's set up a Svelte component to manage logins and sign ups. We'll use Magic L
|
||||
}
|
||||
</script>
|
||||
|
||||
<form class="row flex flex-center" on:submit|preventDefault="{handleLogin}">
|
||||
<form class="row flex-center flex" on:submit|preventDefault="{handleLogin}">
|
||||
<div class="col-6 form-widget">
|
||||
<h1 class="header">Supabase + Svelte</h1>
|
||||
<p class="description">Sign in via magic link with your email below</p>
|
||||
@@ -522,4 +522,4 @@ And then we can add the widget to the Account page:
|
||||
At this stage you have a fully functional application!
|
||||
|
||||
- Got a question? [Ask here](https://github.com/supabase/supabase/discussions).
|
||||
- Sign in: [app.supabase.io](https://app.supabase.io)
|
||||
- Sign in: [app.supabase.com](https://app.supabase.com)
|
||||
@@ -31,7 +31,7 @@ and then creating a "schema" inside the database.
|
||||
|
||||
### Create a project
|
||||
|
||||
1. Go to [app.supabase.io](https://app.supabase.io).
|
||||
1. Go to [app.supabase.com](https://app.supabase.com).
|
||||
1. Click on "New Project".
|
||||
1. Enter your project details.
|
||||
1. Wait for the new database to launch.
|
||||
@@ -47,7 +47,7 @@ defaultActiveId="UI"
|
||||
<TabsPanel id="UI" label="UI">
|
||||
|
||||
```sh
|
||||
1. Go to the "SQL" section.
|
||||
1. Go to the "SQL Editor" section.
|
||||
2. Click "User Management Starter".
|
||||
3. Click "Run".
|
||||
```
|
||||
@@ -197,7 +197,7 @@ Let's set up a Vue component to manage logins and sign ups. We'll use Magic Link
|
||||
|
||||
```html title="/src/components/Auth.vue"
|
||||
<template>
|
||||
<form class="row flex flex-center" @submit.prevent="handleLogin">
|
||||
<form class="row flex-center flex" @submit.prevent="handleLogin">
|
||||
<div class="col-6 form-widget">
|
||||
<h1 class="header">Supabase + Vue 3</h1>
|
||||
<p class="description">Sign in via magic link with your email below</p>
|
||||
@@ -284,7 +284,7 @@ Let's create a new component for that called `Profile.vue`.
|
||||
<div>
|
||||
<input
|
||||
type="submit"
|
||||
class="button block primary"
|
||||
class="button primary block"
|
||||
:value="loading ? 'Loading ...' : 'Update'"
|
||||
:disabled="loading"
|
||||
/>
|
||||
@@ -567,4 +567,4 @@ And then we can add the widget to the Account page:
|
||||
At this stage you have a fully functional application!
|
||||
|
||||
- Got a question? [Ask here](https://github.com/supabase/supabase/discussions).
|
||||
- Sign in: [app.supabase.io](https://app.supabase.io)
|
||||
- Sign in: [app.supabase.com](https://app.supabase.com)
|
||||
@@ -3,7 +3,6 @@ title: Introduction
|
||||
description: Introduction to Supabase
|
||||
---
|
||||
|
||||
|
||||
# Introduction
|
||||
|
||||
Supabase is an open source Firebase alternative.
|
||||
@@ -19,7 +18,7 @@ It provides all the backend services you need to build a product. You can use it
|
||||
|
||||
## Getting Started
|
||||
|
||||
Visit [app.supabase.io](https://app.supabase.io) to get started with the hosted platform or visit the self-hosting docs to learn how to host Supabase yourself.
|
||||
Visit [app.supabase.com](https://app.supabase.com) to get started with the hosted platform or visit the self-hosting docs to learn how to host Supabase yourself.
|
||||
|
||||
Supabase is just Postgres, which makes it compatible with a large number of tools and frameworks.
|
||||
|
||||
@@ -35,6 +34,7 @@ Supabase is just Postgres, which makes it compatible with a large number of tool
|
||||
</LinkCardsWrapper>
|
||||
|
||||
## How to use these docs
|
||||
|
||||
The documentation is divided into 3 sections.
|
||||
|
||||
<LinkCardsWrapper>
|
||||
@@ -43,6 +43,3 @@ The documentation is divided into 3 sections.
|
||||
<LinkCard title="Overview" description="A summary of the tools and how to get started" />
|
||||
<LinkCard title="Overview" description="A summary of the tools and how to get started" />
|
||||
</LinkCardsWrapper>
|
||||
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
id: auth-signin
|
||||
title: "signIn()"
|
||||
title: 'signIn()'
|
||||
slug: auth-signin
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase.yml
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Log in an existing user, or login via a third-party provider.
|
||||
|
||||
@@ -24,14 +24,12 @@ const { user, session, error } = await supabase.auth.signIn({
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
## Parameters
|
||||
|
||||
|
||||
<ul className="method-list-group">
|
||||
|
||||
<li className="method-list-item">
|
||||
@@ -48,13 +46,12 @@ const { user, session, error } = await supabase.auth.signIn({
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li className="method-list-item">
|
||||
<h4 className="method-list-item-label">
|
||||
<span className="method-list-item-label-name">
|
||||
@@ -69,7 +66,7 @@ No description provided.
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
@@ -90,13 +87,12 @@ No description provided.
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li className="method-list-item">
|
||||
<h4 className="method-list-item-label">
|
||||
<span className="method-list-item-label-name">
|
||||
@@ -111,7 +107,7 @@ No description provided.
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
@@ -123,29 +119,17 @@ No description provided.
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
## Notes
|
||||
|
||||
- A user can sign up either via email or OAuth.
|
||||
- If you provide `email` without a `password`, the user will be sent a magic link.
|
||||
- The magic link's destination URL is determined by the SITE_URL config variable. To change this, you can go to Authentication -> Settings on [app.supabase.io](https://app.supabase.io)
|
||||
- The magic link's destination URL is determined by the SITE_URL config variable. To change this, you can go to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
|
||||
- Specifying a `provider` will open the browser to the relevant login page.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
### Sign in with email.
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
groupId="reference/supabase-js"
|
||||
@@ -160,7 +144,6 @@ const { user, session, error } = await supabase.auth.signIn({
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
@@ -178,11 +161,10 @@ If no password is provided, the user will be sent a "magic link" to their email
|
||||
|
||||
```js
|
||||
const { user, session, error } = await supabase.auth.signIn({
|
||||
email: 'example@email.com'
|
||||
email: 'example@email.com',
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
@@ -201,20 +183,18 @@ Supabase supports OAuth logins.
|
||||
```js
|
||||
const { user, session, error } = await supabase.auth.signIn({
|
||||
// provider can be 'github', 'google', 'gitlab', or 'bitbucket'
|
||||
provider: 'github'
|
||||
provider: 'github',
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
### Sign in with redirect.
|
||||
|
||||
Sometimes you want to control where the user is redirected to after they are logged in. Supabase supports this for
|
||||
any URL path on your website (the base domain must be the same as the domain in your Auth settings).
|
||||
|
||||
Sometimes you want to control where the user is redirected to after they are logged in. Supabase supports this for
|
||||
any URL path on your website (the URL must either be on the same domain as your Site URL [see Auth>Settings in dashboard], or must match one of the Additional Redirect URLs [also in Auth>Settings]).
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
@@ -224,14 +204,16 @@ any URL path on your website (the base domain must be the same as the domain in
|
||||
<TabsPanel id="js" label="js">
|
||||
|
||||
```js
|
||||
const { user, session, error } = await supabase.auth.signIn({
|
||||
provider: 'github'
|
||||
}, {
|
||||
redirectTo: 'https://example.com/welcome'
|
||||
})
|
||||
const { user, session, error } = await supabase.auth.signIn(
|
||||
{
|
||||
provider: 'github',
|
||||
},
|
||||
{
|
||||
redirectTo: 'https://example.com/welcome',
|
||||
}
|
||||
)
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
@@ -241,7 +223,6 @@ const { user, session, error } = await supabase.auth.signIn({
|
||||
If you need additional data from an OAuth provider, you can include a space-separated list of scopes in your request to get back an OAuth provider token.
|
||||
You may also need to specify the scopes in the provider's OAuth app settings, depending on the provider.
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
groupId="reference/supabase-js"
|
||||
@@ -250,15 +231,17 @@ You may also need to specify the scopes in the provider's OAuth app settings, de
|
||||
<TabsPanel id="js" label="js">
|
||||
|
||||
```js
|
||||
const { user, session, error } = await supabase.auth.signIn({
|
||||
provider: 'github'
|
||||
}, {
|
||||
scopes: 'repo gist notifications'
|
||||
})
|
||||
const { user, session, error } = await supabase.auth.signIn(
|
||||
{
|
||||
provider: 'github',
|
||||
},
|
||||
{
|
||||
scopes: 'repo gist notifications',
|
||||
}
|
||||
)
|
||||
const oAuthToken = session.provider_token // use to access provider API
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
@@ -267,7 +250,6 @@ const oAuthToken = session.provider_token // use to access provider API
|
||||
|
||||
If you are completing a sign up or login in a React Native app you can pass the refresh token obtained from the provider to obtain a session.
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
groupId="reference/supabase-js"
|
||||
@@ -277,21 +259,20 @@ If you are completing a sign up or login in a React Native app you can pass the
|
||||
|
||||
```js
|
||||
// An example using Expo's `AuthSession`
|
||||
const redirectUri = AuthSession.makeRedirectUri({ useProxy: false });
|
||||
const provider = 'google';
|
||||
const redirectUri = AuthSession.makeRedirectUri({ useProxy: false })
|
||||
const provider = 'google'
|
||||
|
||||
AuthSession.startAsync({
|
||||
authUrl: `https://MYSUPABASEAPP.supabase.co/auth/v1/authorize?provider=${provider}&redirect_to=${redirectUri}`,
|
||||
returnUrl: redirectUri,
|
||||
}).then(async (response: any) => {
|
||||
if (!response) return;
|
||||
if (!response) return
|
||||
const { user, session, error } = await supabase.auth.signIn({
|
||||
refreshToken: response.params?.refresh_token,
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
</Tabs>
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
id: auth-signup
|
||||
title: "signUp()"
|
||||
title: 'signUp()'
|
||||
slug: auth-signup
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase.yml
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Creates a new user.
|
||||
|
||||
@@ -24,14 +24,12 @@ const { user, session, error } = await supabase.auth.signUp({
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
## Parameters
|
||||
|
||||
|
||||
<ul className="method-list-group">
|
||||
|
||||
<li className="method-list-item">
|
||||
@@ -48,13 +46,12 @@ const { user, session, error } = await supabase.auth.signUp({
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li className="method-list-item">
|
||||
<h4 className="method-list-item-label">
|
||||
<span className="method-list-item-label-name">
|
||||
@@ -69,7 +66,7 @@ No description provided.
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
@@ -90,13 +87,12 @@ No description provided.
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li className="method-list-item">
|
||||
<h4 className="method-list-item-label">
|
||||
<span className="method-list-item-label-name">
|
||||
@@ -111,7 +107,7 @@ No description provided.
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
@@ -123,33 +119,21 @@ No description provided.
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
## Notes
|
||||
|
||||
- By default, the user will need to verify their email address before logging in. If you would like to change this, you can disable "Email Confirmations" by going to Authentication -> Settings on [app.supabase.io](https://app.supabase.io)
|
||||
- By default, the user will need to verify their email address before logging in. If you would like to change this, you can disable "Email Confirmations" by going to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
|
||||
- If "Email Confirmations" is turned on, a `user` is returned but `session` will be null
|
||||
- If "Email Confirmations" is turned off, both a `user` and a `session` will be returned
|
||||
- When the user confirms their email address, they will be redirected to localhost:3000 by default. To change this, you can go to Authentication -> Settings on [app.supabase.io](https://app.supabase.io)
|
||||
- When the user confirms their email address, they will be redirected to localhost:3000 by default. To change this, you can go to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
|
||||
- If signUp() is called for an existing confirmed user:
|
||||
- If "Enable email confirmations" is enabled on the "Authentication" -> "Settings" page, an obfuscated / fake user object will be returned.
|
||||
- If "Enable email confirmations" is disabled, an error with a message "User already registered" will be returned.
|
||||
- If "Enable email confirmations" is enabled on the "Authentication" -> "Settings" page, an obfuscated / fake user object will be returned.
|
||||
- If "Enable email confirmations" is disabled, an error with a message "User already registered" will be returned.
|
||||
- To check if a user already exists, refer to getUser().
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
### Sign up.
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
groupId="reference/supabase-js"
|
||||
@@ -164,15 +148,12 @@ const { user, session, error } = await supabase.auth.signUp({
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
### Sign up with additional user meta data.
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
groupId="reference/supabase-js"
|
||||
@@ -187,19 +168,18 @@ const { user, session, error } = await supabase.auth.signUp(
|
||||
password: 'example-password',
|
||||
},
|
||||
{
|
||||
data: {
|
||||
first_name: 'John',
|
||||
data: {
|
||||
first_name: 'John',
|
||||
age: 27,
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
### Sign up with third-party providers.
|
||||
|
||||
You can sign up with OAuth providers using the [`signIn()`](/docs/reference/javascript/auth-signin#sign-in-using-third-party-providers) method.
|
||||
You can sign up with OAuth providers using the [`signIn()`](/docs/reference/javascript/auth-signin#sign-in-using-third-party-providers) method.
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
id: storage-from-getpublicurl
|
||||
title: "from.getPublicUrl()"
|
||||
title: 'from.getPublicUrl()'
|
||||
slug: storage-from-getpublicurl
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase.yml
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Retrieve URLs for assets in public buckets
|
||||
|
||||
@@ -18,20 +18,17 @@ Retrieve URLs for assets in public buckets
|
||||
<TabsPanel id="js" label="js">
|
||||
|
||||
```js
|
||||
const { publicURL, error } = supabase
|
||||
.storage
|
||||
const { publicURL, error } = supabase.storage
|
||||
.from('public-bucket')
|
||||
.getPublicUrl('folder/avatar1.png')
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
## Parameters
|
||||
|
||||
|
||||
<ul className="method-list-group">
|
||||
|
||||
<li className="method-list-item">
|
||||
@@ -56,29 +53,17 @@ The file path to be downloaded, including the path and file name. For example `f
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
## Notes
|
||||
|
||||
- The bucket needs to be set to public, either via [updateBucket()](/docs/reference/javascript/storage-updatebucket) or by going to Storage on [app.supabase.io](https://app.supabase.io), clicking the overflow menu on a bucket and choosing "Make public"
|
||||
- The bucket needs to be set to public, either via [updateBucket()](/docs/reference/javascript/storage-updatebucket) or by going to Storage on [app.supabase.com](https://app.supabase.com), clicking the overflow menu on a bucket and choosing "Make public"
|
||||
- Policy permissions required:
|
||||
- `buckets` permissions: none
|
||||
- `buckets` permissions: none
|
||||
- `objects` permissions: none
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
### Returns the URL for an asset in a public bucket
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
groupId="reference/supabase-js"
|
||||
@@ -87,13 +72,11 @@ The file path to be downloaded, including the path and file name. For example `f
|
||||
<TabsPanel id="js" label="js">
|
||||
|
||||
```js
|
||||
const { publicURL, error } = supabase
|
||||
.storage
|
||||
const { publicURL, error } = supabase.storage
|
||||
.from('public-bucket')
|
||||
.getPublicUrl('folder/avatar1.png')
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
</Tabs>
|
||||
@@ -1,16 +1,15 @@
|
||||
---
|
||||
id: auth-signin
|
||||
title: "auth.signIn()"
|
||||
title: 'auth.signIn()'
|
||||
slug: auth-signin
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/dart.yml
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Log in an existing user, or login via a third-party provider.
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -25,38 +24,22 @@ final user = res.data?.user;
|
||||
final error = res.error;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Notes
|
||||
|
||||
- A user can sign up via email, phone number.
|
||||
- If you provide `email` without a `password`, the user will be sent a magic link.
|
||||
- The magic link's destination URL is determined by the SITE_URL config variable. To change this, you can go to Authentication -> Settings on [app.supabase.io](https://app.supabase.io)
|
||||
- Similarly, if you provide `phone` without a `password`, the user will be sent a one time password.
|
||||
- The magic link's destination URL is determined by the SITE_URL config variable. To change this, you can go to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
|
||||
- Similarly, if you provide `phone` without a `password`, the user will be sent a one time password.
|
||||
- If you are looking to sign users in with OAuth in Flutter apps, go to [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider).
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
### Sign in with email.
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -71,7 +54,6 @@ final user = res.data?.user;
|
||||
final error = res.error;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
@@ -93,17 +75,15 @@ final res = await supabase.auth.signIn(email: 'example@email.com');
|
||||
final error = res.error;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
### Get OAuth sign in URL.
|
||||
|
||||
Passing provider parameter to `signIn()` will return a URL to sign your user in via OAuth.
|
||||
Passing provider parameter to `signIn()` will return a URL to sign your user in via OAuth.
|
||||
If you are looking to sign in a user via OAuth on Flutter app, go to [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider).
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -118,7 +98,6 @@ final url = res.data?.url;
|
||||
final error = res.error;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
</Tabs>
|
||||
@@ -1,16 +1,15 @@
|
||||
---
|
||||
id: auth-signup
|
||||
title: "auth.signUp()"
|
||||
title: 'auth.signUp()'
|
||||
slug: auth-signup
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/dart.yml
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Creates a new user.
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -25,37 +24,21 @@ final user = res.data?.user;
|
||||
final error = res.error;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Notes
|
||||
|
||||
- By default, the user will need to verify their email address before logging in. If you would like to change this, you can disable "Email Confirmations" by going to Authentication -> Settings on [app.supabase.io](https://app.supabase.io)
|
||||
- By default, the user will need to verify their email address before logging in. If you would like to change this, you can disable "Email Confirmations" by going to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
|
||||
- If "Email Confirmations" is turned on, a `user` is returned but `session` will be null
|
||||
- If "Email Confirmations" is turned off, both a `user` and a `session` will be returned
|
||||
- When the user confirms their email address, they will be redirected to localhost:3000 by default. To change this, you can go to Authentication -> Settings on [app.supabase.io](https://app.supabase.io)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
- When the user confirms their email address, they will be redirected to localhost:3000 by default. To change this, you can go to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
|
||||
|
||||
## Examples
|
||||
|
||||
### Sign up.
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -70,11 +53,10 @@ final user = res.data?.user;
|
||||
final error = res.error;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
### Sign up with third-party providers.
|
||||
|
||||
If you are using Flutter, you can sign up with OAuth providers using the [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider) method available on `supabase_flutter`.
|
||||
If you are using Flutter, you can sign up with OAuth providers using the [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider) method available on `supabase_flutter`.
|
||||
@@ -1,16 +1,15 @@
|
||||
---
|
||||
id: storage-from-getpublicurl
|
||||
title: "from.getPublicUrl()"
|
||||
title: 'from.getPublicUrl()'
|
||||
slug: storage-from-getpublicurl
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/dart.yml
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Retrieve URLs for assets in public buckets
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -27,37 +26,21 @@ final res = supabase
|
||||
final publicURL = res.data;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Notes
|
||||
|
||||
- The bucket needs to be set to public, either via [updateBucket()](/docs/reference/javascript/storage-updatebucket) or by going to Storage on [app.supabase.io](https://app.supabase.io), clicking the overflow menu on a bucket and choosing "Make public"
|
||||
- The bucket needs to be set to public, either via [updateBucket()](/docs/reference/javascript/storage-updatebucket) or by going to Storage on [app.supabase.com](https://app.supabase.com), clicking the overflow menu on a bucket and choosing "Make public"
|
||||
- Policy permissions required:
|
||||
- `buckets` permissions: none
|
||||
- `buckets` permissions: none
|
||||
- `objects` permissions: none
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
### Returns the URL for an asset in a public bucket
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="dart"
|
||||
groupId="reference/dart"
|
||||
@@ -74,7 +57,6 @@ final res = supabase
|
||||
final publicURL = res.data;
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
</Tabs>
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
id: auth-signin
|
||||
title: "signIn()"
|
||||
title: 'signIn()'
|
||||
slug: auth-signin
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase.yml
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Log in an existing user, or login via a third-party provider.
|
||||
|
||||
@@ -24,14 +24,12 @@ const { user, session, error } = await supabase.auth.signIn({
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
## Parameters
|
||||
|
||||
|
||||
<ul className="method-list-group">
|
||||
|
||||
<li className="method-list-item">
|
||||
@@ -48,13 +46,12 @@ const { user, session, error } = await supabase.auth.signIn({
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li className="method-list-item">
|
||||
<h4 className="method-list-item-label">
|
||||
<span className="method-list-item-label-name">
|
||||
@@ -69,7 +66,7 @@ No description provided.
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
@@ -90,13 +87,12 @@ No description provided.
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li className="method-list-item">
|
||||
<h4 className="method-list-item-label">
|
||||
<span className="method-list-item-label-name">
|
||||
@@ -111,7 +107,7 @@ No description provided.
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
@@ -123,29 +119,17 @@ No description provided.
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
## Notes
|
||||
|
||||
- A user can sign up either via email or OAuth.
|
||||
- If you provide `email` without a `password`, the user will be sent a magic link.
|
||||
- The magic link's destination URL is determined by the SITE_URL config variable. To change this, you can go to Authentication -> Settings on [app.supabase.io](https://app.supabase.io)
|
||||
- The magic link's destination URL is determined by the SITE_URL config variable. To change this, you can go to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
|
||||
- Specifying a `provider` will open the browser to the relevant login page.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
### Sign in with email.
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
groupId="reference/supabase-js"
|
||||
@@ -160,7 +144,6 @@ const { user, session, error } = await supabase.auth.signIn({
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
@@ -178,11 +161,10 @@ If no password is provided, the user will be sent a "magic link" to their email
|
||||
|
||||
```js
|
||||
const { user, session, error } = await supabase.auth.signIn({
|
||||
email: 'example@email.com'
|
||||
email: 'example@email.com',
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
@@ -201,20 +183,18 @@ Supabase supports OAuth logins.
|
||||
```js
|
||||
const { user, session, error } = await supabase.auth.signIn({
|
||||
// provider can be 'github', 'google', 'gitlab', or 'bitbucket'
|
||||
provider: 'github'
|
||||
provider: 'github',
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
### Sign in with redirect.
|
||||
|
||||
Sometimes you want to control where the user is redirected to after they are logged in. Supabase supports this for
|
||||
any URL path on your website (the base domain must be the same as the domain in your Auth settings).
|
||||
|
||||
Sometimes you want to control where the user is redirected to after they are logged in. Supabase supports this for
|
||||
any URL path on your website (the URL must either be on the same domain as your Site URL [see Auth>Settings in dashboard], or must match one of the Additional Redirect URLs [also in Auth>Settings]).
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
@@ -224,14 +204,16 @@ any URL path on your website (the base domain must be the same as the domain in
|
||||
<TabsPanel id="js" label="js">
|
||||
|
||||
```js
|
||||
const { user, session, error } = await supabase.auth.signIn({
|
||||
provider: 'github'
|
||||
}, {
|
||||
redirectTo: 'https://example.com/welcome'
|
||||
})
|
||||
const { user, session, error } = await supabase.auth.signIn(
|
||||
{
|
||||
provider: 'github',
|
||||
},
|
||||
{
|
||||
redirectTo: 'https://example.com/welcome',
|
||||
}
|
||||
)
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
@@ -241,7 +223,6 @@ const { user, session, error } = await supabase.auth.signIn({
|
||||
If you need additional data from an OAuth provider, you can include a space-separated list of scopes in your request to get back an OAuth provider token.
|
||||
You may also need to specify the scopes in the provider's OAuth app settings, depending on the provider.
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
groupId="reference/supabase-js"
|
||||
@@ -250,15 +231,17 @@ You may also need to specify the scopes in the provider's OAuth app settings, de
|
||||
<TabsPanel id="js" label="js">
|
||||
|
||||
```js
|
||||
const { user, session, error } = await supabase.auth.signIn({
|
||||
provider: 'github'
|
||||
}, {
|
||||
scopes: 'repo gist notifications'
|
||||
})
|
||||
const { user, session, error } = await supabase.auth.signIn(
|
||||
{
|
||||
provider: 'github',
|
||||
},
|
||||
{
|
||||
scopes: 'repo gist notifications',
|
||||
}
|
||||
)
|
||||
const oAuthToken = session.provider_token // use to access provider API
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
@@ -267,7 +250,6 @@ const oAuthToken = session.provider_token // use to access provider API
|
||||
|
||||
If you are completing a sign up or login in a React Native app you can pass the refresh token obtained from the provider to obtain a session.
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
groupId="reference/supabase-js"
|
||||
@@ -277,21 +259,20 @@ If you are completing a sign up or login in a React Native app you can pass the
|
||||
|
||||
```js
|
||||
// An example using Expo's `AuthSession`
|
||||
const redirectUri = AuthSession.makeRedirectUri({ useProxy: false });
|
||||
const provider = 'google';
|
||||
const redirectUri = AuthSession.makeRedirectUri({ useProxy: false })
|
||||
const provider = 'google'
|
||||
|
||||
AuthSession.startAsync({
|
||||
authUrl: `https://MYSUPABASEAPP.supabase.co/auth/v1/authorize?provider=${provider}&redirect_to=${redirectUri}`,
|
||||
returnUrl: redirectUri,
|
||||
}).then(async (response: any) => {
|
||||
if (!response) return;
|
||||
if (!response) return
|
||||
const { user, session, error } = await supabase.auth.signIn({
|
||||
refreshToken: response.params?.refresh_token,
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
</Tabs>
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
id: auth-signup
|
||||
title: "signUp()"
|
||||
title: 'signUp()'
|
||||
slug: auth-signup
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase.yml
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Creates a new user.
|
||||
|
||||
@@ -24,14 +24,12 @@ const { user, session, error } = await supabase.auth.signUp({
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
## Parameters
|
||||
|
||||
|
||||
<ul className="method-list-group">
|
||||
|
||||
<li className="method-list-item">
|
||||
@@ -48,13 +46,12 @@ const { user, session, error } = await supabase.auth.signUp({
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li className="method-list-item">
|
||||
<h4 className="method-list-item-label">
|
||||
<span className="method-list-item-label-name">
|
||||
@@ -69,7 +66,7 @@ No description provided.
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
@@ -90,13 +87,12 @@ No description provided.
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li className="method-list-item">
|
||||
<h4 className="method-list-item-label">
|
||||
<span className="method-list-item-label-name">
|
||||
@@ -111,7 +107,7 @@ No description provided.
|
||||
</h4>
|
||||
<div class="method-list-item-description">
|
||||
|
||||
No description provided.
|
||||
No description provided.
|
||||
|
||||
</div>
|
||||
|
||||
@@ -123,33 +119,21 @@ No description provided.
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
## Notes
|
||||
|
||||
- By default, the user will need to verify their email address before logging in. If you would like to change this, you can disable "Email Confirmations" by going to Authentication -> Settings on [app.supabase.io](https://app.supabase.io)
|
||||
- By default, the user will need to verify their email address before logging in. If you would like to change this, you can disable "Email Confirmations" by going to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
|
||||
- If "Email Confirmations" is turned on, a `user` is returned but `session` will be null
|
||||
- If "Email Confirmations" is turned off, both a `user` and a `session` will be returned
|
||||
- When the user confirms their email address, they will be redirected to localhost:3000 by default. To change this, you can go to Authentication -> Settings on [app.supabase.io](https://app.supabase.io)
|
||||
- When the user confirms their email address, they will be redirected to localhost:3000 by default. To change this, you can go to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
|
||||
- If signUp() is called for an existing confirmed user:
|
||||
- If "Enable email confirmations" is enabled on the "Authentication" -> "Settings" page, an obfuscated / fake user object will be returned.
|
||||
- If "Enable email confirmations" is disabled, an error with a message "User already registered" will be returned.
|
||||
- If "Enable email confirmations" is enabled on the "Authentication" -> "Settings" page, an obfuscated / fake user object will be returned.
|
||||
- If "Enable email confirmations" is disabled, an error with a message "User already registered" will be returned.
|
||||
- To check if a user already exists, refer to getUser().
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
### Sign up.
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
groupId="reference/supabase-js"
|
||||
@@ -164,15 +148,12 @@ const { user, session, error } = await supabase.auth.signUp({
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
### Sign up with additional user meta data.
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
groupId="reference/supabase-js"
|
||||
@@ -187,19 +168,18 @@ const { user, session, error } = await supabase.auth.signUp(
|
||||
password: 'example-password',
|
||||
},
|
||||
{
|
||||
data: {
|
||||
first_name: 'John',
|
||||
data: {
|
||||
first_name: 'John',
|
||||
age: 27,
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
### Sign up with third-party providers.
|
||||
|
||||
You can sign up with OAuth providers using the [`signIn()`](/docs/reference/javascript/auth-signin#sign-in-using-third-party-providers) method.
|
||||
You can sign up with OAuth providers using the [`signIn()`](/docs/reference/javascript/auth-signin#sign-in-using-third-party-providers) method.
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
id: storage-from-getpublicurl
|
||||
title: "from.getPublicUrl()"
|
||||
title: 'from.getPublicUrl()'
|
||||
slug: storage-from-getpublicurl
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase.yml
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabsPanel from '@theme/TabsPanel';
|
||||
import Tabs from '@theme/Tabs'
|
||||
import TabsPanel from '@theme/TabsPanel'
|
||||
|
||||
Retrieve URLs for assets in public buckets
|
||||
|
||||
@@ -18,20 +18,17 @@ Retrieve URLs for assets in public buckets
|
||||
<TabsPanel id="js" label="js">
|
||||
|
||||
```js
|
||||
const { publicURL, error } = supabase
|
||||
.storage
|
||||
const { publicURL, error } = supabase.storage
|
||||
.from('public-bucket')
|
||||
.getPublicUrl('folder/avatar1.png')
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
|
||||
## Parameters
|
||||
|
||||
|
||||
<ul className="method-list-group">
|
||||
|
||||
<li className="method-list-item">
|
||||
@@ -56,29 +53,17 @@ The file path to be downloaded, including the path and file name. For example `f
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
## Notes
|
||||
|
||||
- The bucket needs to be set to public, either via [updateBucket()](/docs/reference/javascript/storage-updatebucket) or by going to Storage on [app.supabase.io](https://app.supabase.io), clicking the overflow menu on a bucket and choosing "Make public"
|
||||
- The bucket needs to be set to public, either via [updateBucket()](/docs/reference/javascript/storage-updatebucket) or by going to Storage on [app.supabase.com](https://app.supabase.com), clicking the overflow menu on a bucket and choosing "Make public"
|
||||
- Policy permissions required:
|
||||
- `buckets` permissions: none
|
||||
- `buckets` permissions: none
|
||||
- `objects` permissions: none
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
### Returns the URL for an asset in a public bucket
|
||||
|
||||
|
||||
|
||||
<Tabs
|
||||
defaultActiveId="js"
|
||||
groupId="reference/supabase-js"
|
||||
@@ -87,13 +72,11 @@ The file path to be downloaded, including the path and file name. For example `f
|
||||
<TabsPanel id="js" label="js">
|
||||
|
||||
```js
|
||||
const { publicURL, error } = supabase
|
||||
.storage
|
||||
const { publicURL, error } = supabase.storage
|
||||
.from('public-bucket')
|
||||
.getPublicUrl('folder/avatar1.png')
|
||||
```
|
||||
|
||||
|
||||
</TabsPanel>
|
||||
|
||||
</Tabs>
|
||||
</Tabs>
|
||||
@@ -1,4 +1,3 @@
|
||||
import { ReactElement } from 'react'
|
||||
import { getAllDocs, getDocsBySlug } from '../lib/docs'
|
||||
import Layout from '../components/layouts/Layout'
|
||||
import { serialize } from 'next-mdx-remote/serialize'
|
||||
@@ -17,7 +16,7 @@ export default function Doc({
|
||||
toc,
|
||||
}: {
|
||||
meta: { title: string; description: string }
|
||||
content: ReactElement
|
||||
content: any
|
||||
toc: any
|
||||
}) {
|
||||
const { asPath } = useRouter()
|
||||
@@ -37,6 +36,7 @@ export default function Doc({
|
||||
}
|
||||
|
||||
return (
|
||||
// @ts-ignore
|
||||
<Layout meta={meta} toc={toc} menuItems={menuItems[page]} currentPage={page}>
|
||||
<MDXProvider components={components}>
|
||||
<MDXRemote {...content} components={components} />
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import React from 'react'
|
||||
import type { AppProps } from 'next/app'
|
||||
import { ThemeProvider } from '../components/Providers'
|
||||
import '../styles/tailwind.css'
|
||||
import '../styles/main.css'
|
||||
|
||||
function MyApp({ Component, pageProps }: AppProps) {
|
||||
return (
|
||||
|
||||
@@ -124,18 +124,3 @@
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar {
|
||||
height: 60px;
|
||||
}
|
||||
.sidebar {
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
.navLinks li {
|
||||
margin-left: 2.5em;
|
||||
}
|
||||
.navRight > * {
|
||||
margin-left: 1em;
|
||||
margin-right: 1em;
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
:root {
|
||||
--sidebar-width: 300px;
|
||||
}
|
||||
|
||||
body {
|
||||
@apply bg-white dark:bg-[#1c1c1c] !important;
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
::selection {
|
||||
background-color: #6ee7b7;
|
||||
color: #333 !important;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
article h1 {
|
||||
margin-bottom: 3rem !important;
|
||||
font-size: 3rem !important;
|
||||
font-weight: 400 !important;
|
||||
}
|
||||
|
||||
.thin-scrollbar {
|
||||
scrollbar-width: thin;
|
||||
}
|
||||
|
||||
.sidebar-width {
|
||||
width: var(--sidebar-width);
|
||||
}
|
||||
|
||||
.docs-width {
|
||||
max-width: calc(100% - var(--sidebar-width));
|
||||
}
|
||||
|
||||
.table-of-contents-height {
|
||||
max-height: calc(100vh - 3.75rem - 2rem);
|
||||
overflow-y: auto;
|
||||
position: sticky;
|
||||
top: calc(3.75rem + 1rem);
|
||||
}
|
||||
|
||||
.width-full {
|
||||
width: 100% !important;
|
||||
max-width: max-content !important;
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
body {
|
||||
@apply bg-white dark:bg-[#1c1c1c] !important;
|
||||
}
|
||||
|
||||
::selection {
|
||||
background-color: #6ee7b7;
|
||||
color: #333 !important;
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
---
|
||||
title: Supabase vs Firebase
|
||||
description: Supabase is an Open Source Firebase Alternative with a SQL based Database, Auth, and Cloud Functions
|
||||
author: ant_wilson
|
||||
image: partner-gallery/partner-showcase-thumb.png
|
||||
thumb: partner-gallery/partner-showcase-thumb.png
|
||||
tags:
|
||||
- comparison
|
||||
date: '2022-05-26'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
## What is Firebase?
|
||||
|
||||
Now owned by Google, Firebase is a collection of tools aimed at mobile and web developers. At its core is the Firestore database.
|
||||
|
||||
Firestore allows you to store “documents”. These are collections of key:value pairs where the value can be another sub-document. Document based storage is perfect for unstructured data, since two documents in a collection do not necessarily need to have the same structure.
|
||||
|
||||
Firebase also offers other things that web developers find useful like an auth service for user management, and wrappers for other Google services such as Cloud Functions, and File Storage.
|
||||
|
||||
## What is Supabase?
|
||||
|
||||
Supabase is an open source firebase alternative, but instead of being built around a document-based datastore, Supabase offers a relational database management system called PostgreSQL. This comes with a few advantages:
|
||||
|
||||
- It’s open source, so there is zero lock in.
|
||||
- You can query it with SQL, a proven and powerful query language.
|
||||
- It has a long track record of being used at scale.
|
||||
- It’s the database of choice for transactional workloads (think apps and websites, or other things that require near-instant responses to queries).
|
||||
- It comes with decades of [useful postgres extensions and plug-ins](https://supabase.com/docs/guides/database/extensions).
|
||||
|
||||
At Supabase we’ve always been huge fans of Firebase - so we started adding a few things on top of PostgreSQL in an attempt to reach feature parity, including:
|
||||
|
||||
- Auto-generated API - [query your data straight from the client](https://supabase.com/docs/guides/api#rest-api-2).
|
||||
- Realtime - [changes in your data will be streamed directly to your application](https://supabase.com/docs/reference/dart/subscribe).
|
||||
- Auth - [a simple to integrate auth system and SQL based rules engine](https://supabase.com/auth).
|
||||
- Functions - [javascript and typescript functions that deploy out globally](https://supabase.com/edge-functions).
|
||||
- Storage - [hosting images, videos, and pdfs easily](https://supabase.com/storage).
|
||||
|
||||
## How are they similar?
|
||||
|
||||
Both Firebase and Supabase are based on the idea of bringing a superior developer experience to databases. With both platforms you can spin up a new project from directly inside the browser without the need to download any extra tools or software to your machine. Both platforms come with a useful dashboard UI for debugging your data in realtime, which is especially useful for fast iterations when in development.
|
||||
|
||||
Both Firebase and Supabase have invested heavily in client side libraries so you can communicate with your database directly from the client. Firebase has their [Firebase Javascript SDK](https://github.com/firebase/firebase-js-sdk) and Supabase has [supabase-js an isomorphic client](https://github.com/supabase/supabase-js/) that can be used both on the client also on the server in a node-js environment.
|
||||
|
||||
## How are they different?
|
||||
|
||||
Firebase and Supabase differ in several ways. The main one being that Firebase is a document store, whereas Supabase is based on PostgreSQL - a relational, SQL-based database management system.
|
||||
|
||||
There are some other important differences.
|
||||
|
||||
### Open Source
|
||||
|
||||
Supabase is open source. Along with the hosted cloud platform, you can also take the Supabase stack and host it inside your own cloud or run it locally on your machine. There is no vendor lock in.
|
||||
|
||||
### Pricing
|
||||
|
||||
[Firebase charges for reads, writes and deletes](https://firebase.google.com/pricing), which can lead to some unpredictability, especially in the early stages of a project when your application is in heavy development. Supabase [charges based on the amount of data stored](https://supabase.com/pricing), with breathing room for unlimited API requests and an unlimited number of Auth users.
|
||||
|
||||
### Performance
|
||||
|
||||
We created a benchmarking repo where you can compare the performance of both services in different scenarios. Our most recent results show that [Supabase outperforms Firebase by up to 4x](https://github.com/supabase/benchmarks/issues/8) on number of reads per second, and 3.1x on writes per second.
|
||||
|
||||
## How do I migrate from Firebase to Supabase?
|
||||
|
||||
Since Firebase is document based, migrating into a relational database requires you to map your data structure across into a SQL schema. Luckily we’ve built a [handy conversion tool to do it for you](https://github.com/supabase-community/firebase-to-supabase/tree/main/firestore).
|
||||
|
||||
We also have a tool for [migrating Firebase Auth to Supabase Auth](https://github.com/supabase-community/firebase-to-supabase/tree/main/auth). And one for [migrating Firebase Storage files to Supabase Storage](https://github.com/supabase-community/firebase-to-supabase/tree/main/storage).
|
||||
|
||||
These are by far the most complete Firebase to Postgres migration tools available anywhere on the web.
|
||||
|
||||
You can [try Supabase for free](https://app.supabase.io). If you require Enterprise level support with your project or migration, please get in touch using our [Enterprise contact form](https://supabase.com/contact/enterprise).
|
||||
@@ -0,0 +1,75 @@
|
||||
---
|
||||
title: Supabase vs Heroku Postgres
|
||||
description: Supabase is an alternative to Heroku Postgres with Enterprise Grade Support available
|
||||
author: ant_wilson
|
||||
image: partner-gallery/partner-showcase-thumb.png
|
||||
thumb: partner-gallery/partner-showcase-thumb.png
|
||||
tags:
|
||||
- comparison
|
||||
date: '2022-05-26'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
## What is Heroku Postgres?
|
||||
|
||||
Heroku is a cloud application platform that offers managed PostgreSQL as a service. They offer 5 levels of Postgres support from the Hobby Tier up to the Shield Tier, each with different levels of features and pricing.
|
||||
|
||||
## What is Supabase?
|
||||
|
||||
Supabase also offers managed Postgres, the main difference is that with each deployment you also get:
|
||||
|
||||
- Auto-generated API - [never write an API again](https://supabase.com/docs/guides/api#rest-api-2)
|
||||
- Realtime - [subscribe to data changes via websockets](https://supabase.com/docs/reference/dart/subscribe)
|
||||
- Auth - [users can log in and out of your application](https://supabase.com/auth)
|
||||
- Functions - [deploy custom logic to the edge](https://supabase.com/edge-functions)
|
||||
- Storage - [serve large files and folders](https://supabase.com/storage)
|
||||
- PgBouncer - [connection pooling useful for serverless computing](https://supabase.com/docs/guides/database/connecting-to-postgres#connection-pool)
|
||||
|
||||
## How are they similar?
|
||||
|
||||
Heroku Postgres and Supabase both offer:
|
||||
|
||||
- [A web UI for managing your instance](https://supabase.com/docs/guides/database#table-view)
|
||||
- SLAs and Enterprise-grade support packages
|
||||
- Direct SSL connections to Postgres
|
||||
- Postgres Extensions (see [Supabase Extensions](https://supabase.com/docs/guides/database/extensions), [Heroku Extensions](https://devcenter.heroku.com/articles/heroku-postgres-extensions-postgis-full-text-search))
|
||||
- [Backups and PITR](https://supabase.com/blog/2020/08/02/continuous-postgresql-backup-walg)
|
||||
- [Postgres logs](https://supabase.com/docs/guides/platform/logs)
|
||||
- Encryption-at-rest
|
||||
|
||||
## What are the differences?
|
||||
|
||||
### Core Features
|
||||
|
||||
These are some of the key differences between Heroku Postgres and Supabase in terms of features:
|
||||
|
||||
- Supabase is more than just the raw database, it also comes with:
|
||||
- [Connection pooling](https://supabase.com/docs/guides/database/connecting-to-postgres#connection-pool) so that you won’t run out of connections in a serverless environment.
|
||||
- [Auto-generated APIs](https://supabase.com/docs/guides/api#rest-api-2) based on your schema, so you can communicate with your database directly from the client.
|
||||
- [Realtime API](https://supabase.com/docs/reference/dart/subscribe) is useful for when you want to subscribe to changes to your database over websockets.
|
||||
- [Auth API](https://supabase.com/auth) can be used to leverage Postgres’s Row Level Security model, and control access to sensitive data on a per user, or per group level.
|
||||
- [Functions](https://supabase.com/edge-functions) can be deployed out to the edge directly from the Supabase CLI, which means you can run sensitive business logic or transformations in a serverless fashion.
|
||||
- You can also deploy edge functions to Heroku using their [Dynos](https://www.heroku.com/dynos) runtime in conjunction with something like [Fastly](https://www.fastly.com/).
|
||||
- [File Storage](https://supabase.com/storage) is useful for when your app needs to store large files and folders that aren’t suitable for storing within Postgres itself.
|
||||
- A spreadsheet-like web interface for building your schemas and inspecting data.
|
||||
|
||||
### Pricing
|
||||
|
||||
The two services price quite differently, the key differences being:
|
||||
|
||||
- [Supabase pricing is based around usage](https://supabase.com/pricing), so you only pay for what you use.
|
||||
- Heroku prices based on a tier model with [37 plans to choose from](https://elements.heroku.com/addons/heroku-postgresql#pricing).
|
||||
|
||||
Supabase’s free tier also includes a dedicated Postgres instance, and the best bit is you can upgrade to pro later without any interruptions.
|
||||
|
||||
### Global Deployments
|
||||
|
||||
You may have strict data regulations that you must comply with, so choosing your region can be very important. Here’s how the deployment options stack up:
|
||||
|
||||
- Supabase can be deployed to any one of [12 data centers across the globe](https://github.com/supabase/supabase/discussions/4815#discussioncomment-1915129) (free tier included).
|
||||
- Since Supabase is fully open source - you can also [self host wherever you like](https://supabase.com/docs/guides/hosting/overview).
|
||||
- You can deploy Heroku Postgres to two data centers (US and Europe) however [6 more data centers](https://devcenter.heroku.com/articles/regions) are available on the Enterprise plan.
|
||||
|
||||
## How to migrate from Heroku Postgres to Supabase
|
||||
|
||||
Migrating is surprisingly simple. You just need to use the standard Postgres `pg_dump` and `pg_restore` tools to dump and restore from a backup. We created a handy guide for [migrating from heroku to supabase](https://github.com/supabase-community/heroku-to-supabase).
|
||||
@@ -11,7 +11,7 @@ tags:
|
||||
date: '06-01-2020'
|
||||
---
|
||||
|
||||
Now in [Supabase](https://app.supabase.io):
|
||||
Now in [Supabase](https://app.supabase.com):
|
||||
|
||||
- Set up Postgres in less than 2 minutes
|
||||
- Auto-generated APIs! (they are a bit flaky, go easy)
|
||||
@@ -58,6 +58,6 @@ Send realtime database changes to other systems, like queues or webhooks (Slack
|
||||
|
||||
## Follow us
|
||||
|
||||
Start using Supabase today: [app.supabase.io](https://app.supabase.io)
|
||||
Start using Supabase today: [app.supabase.com](https://app.supabase.com)
|
||||
|
||||
Make sure to star us on github! [github.com/supabase/supabase](https://github.com/supabase/supabase)
|
||||
@@ -57,6 +57,6 @@ This one is still very unstable, but we wanted to ship it anyway. It's a little
|
||||
|
||||
## Follow us
|
||||
|
||||
Start using Supabase today: [app.supabase.io](https://app.supabase.io)
|
||||
Start using Supabase today: [app.supabase.com](https://app.supabase.com)
|
||||
|
||||
Make sure to star us on github! [github.com/supabase/supabase](https://github.com/supabase/supabase)
|
||||
@@ -95,7 +95,7 @@ We have a number of small improvements:
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Become a [sponsor](https://github.com/sponsors/supabase)
|
||||
@@ -53,7 +53,7 @@ We have since migrated our middleware to multiple ECS clusters, globally load-ba
|
||||
|
||||
We serve our marketing site ([supabase.io](/)) from Netlify. It's a static-build [Docusaurus (v2)](https://v2.docusaurus.io/) site, so it had no problems (apart from one developer in Russia who couldn't access the site - it looks like some of Netlify's IP addresses are blocked there).
|
||||
|
||||
We serve our app ([app.supabase.io](http://app.supabase.io)) using Vercel, and the login system uses Auth0. These were both rock-solid. Before the launch we noticed that Vercel was extremely slow on their free plan, and once we upgraded to their Pro Plan for multi-region deploys it solved performance issues. It looks like they are changing their plans again so buyer beware.
|
||||
We serve our app ([app.supabase.com](https://app.supabase.com)) using Vercel, and the login system uses Auth0. These were both rock-solid. Before the launch we noticed that Vercel was extremely slow on their free plan, and once we upgraded to their Pro Plan for multi-region deploys it solved performance issues. It looks like they are changing their plans again so buyer beware.
|
||||
|
||||
## The Bad
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ We have a number of small improvements:
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Become a [sponsor](https://github.com/sponsors/supabase)
|
||||
@@ -88,6 +88,6 @@ Supabase has a culture of shipping early and often. Our Auth release is another
|
||||
|
||||
### Get started
|
||||
|
||||
Supabase Auth is ready for you to start using today, free of charge: [app.supabase.io](https://app.supabase.io)
|
||||
Supabase Auth is ready for you to start using today, free of charge: [app.supabase.com](https://app.supabase.com)
|
||||
|
||||
To see the full power of our auth system, watch [this demo](https://youtu.be/2oqIZW5S-lQ) where I deploy a secure, real-time slack clone to Vercel in less than 3 minutes.
|
||||
@@ -84,7 +84,7 @@ Our focus now is to move from Alpha to Beta. This involves stabilising our Auth
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Become a [sponsor](https://github.com/sponsors/supabase)
|
||||
@@ -92,7 +92,7 @@ Our focus now is to move from Alpha to Beta and we'll be improving stability, re
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Become a [sponsor](https://github.com/sponsors/supabase)
|
||||
@@ -113,7 +113,7 @@ To summarise the steps:
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Become a [sponsor](https://github.com/sponsors/supabase)
|
||||
@@ -21,7 +21,7 @@ We're now 8 months into building Supabase. We're focused on performance, stabili
|
||||
Watch a full demo:
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/1gNDMMsUPI0"
|
||||
@@ -80,7 +80,7 @@ Our focus is still moving from Alpha to Beta and we'll be improving stability, r
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Become a [sponsor](https://github.com/sponsors/supabase)
|
||||
@@ -21,7 +21,7 @@ We've been building for 9 months now, and we're getting even closer to Beta.
|
||||
Watch a full demo:
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/unC_de7iytA"
|
||||
@@ -77,7 +77,7 @@ Look out for a big announcement on December 3rd. We'll also be presenting in the
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Become a [sponsor](https://github.com/sponsors/supabase)
|
||||
@@ -20,7 +20,7 @@ After 10 hectic months of building, Supabase is now in Beta.
|
||||
Watch a full demo:
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/ofSm4BJkZ1g"
|
||||
@@ -92,7 +92,7 @@ We also have something exciting planned with Vercel and Stripe ... [stay tuned](
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Become a [sponsor](https://github.com/sponsors/supabase)
|
||||
@@ -22,7 +22,7 @@ New year, new features. We've been busy at Supabase during January and our commu
|
||||
Watch a full demo:
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/DlybOLANG4s"
|
||||
@@ -124,7 +124,7 @@ We're ramping up to "Launch week" at the end of Q1, where we will be giving you
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
|
||||
|
||||
@@ -153,6 +153,6 @@ WHERE first_name LIKE "S%";
|
||||
|
||||
If you can reason about most of the topics in this post then you'll be in a very strong position to impress with your answers to PostgreSQL interview questions. As with all programming topics however, the real learning starts when you put these things into practice. At Supabase we offer a very very fast (the fastest?) way to spin up a PostgreSQL database and start querying it, and our browser based SQL editor is getting more powerful every day.
|
||||
|
||||
[Get started on Supabase for free here](https://app.supabase.io)
|
||||
[Get started on Supabase for free here](https://app.supabase.com)
|
||||
|
||||
Thanks Steve Chavez for providing all the good bits of this post :)
|
||||
@@ -21,7 +21,7 @@ Supabase is an open source Firebase alternative. We've now been building for one
|
||||
Watch a full demo:
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/h-ses99G45g"
|
||||
@@ -104,7 +104,7 @@ Waiting for Supabase Storage? Here's a sneak peek for the upcoming Launch Week a
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
|
||||
|
||||
@@ -211,4 +211,4 @@ If you're familiar with `C`, you could also help `@pramsey` to implement async f
|
||||
|
||||
There are plenty of ways to run cron jobs these days. You can trigger them from your local machine. You can install them on a VPS. You can schedule Serverless functions. You can use a paid service. You can use GitHub Actions.
|
||||
|
||||
Is Postgres the best place to put your cron jobs? `¯\_(ツ)_/¯`. Postgres databases are free on Supabase and since it takes only one minute to [get started](https://app.supabase.io/), why not make your next cron server a Postgres database?
|
||||
Is Postgres the best place to put your cron jobs? `¯\_(ツ)_/¯`. Postgres databases are free on Supabase and since it takes only one minute to [get started](https://app.supabase.com/), why not make your next cron server a Postgres database?
|
||||
@@ -22,7 +22,7 @@ They support a ton of different languages and execution environments and even re
|
||||
As a Replit user, if you want to access larger amounts of data direct from your repl, or if you fancy accessing some super-powerful query tools, at some point you may want to start interacting with a relational database. Supabase is a good fit here; just like Replit, you don't need to worry about servers, and hosting, you can just click a few buttons and get a fully featured relational database which you can start communicating with directly from javacript, using supabase-js.
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/lQ5iIxaYduI"
|
||||
@@ -132,4 +132,4 @@ We look forward to showing off some more Supabase + Replit examples.
|
||||
|
||||
You can find my example repl here: [https://repl.it/@awalias/supabase-test#index.js](https://repl.it/@awalias/supabase-test#index.js)
|
||||
|
||||
Supabase has a free tier, head over to [https://app.supabase.io](https://app.supabase.io) to get started.
|
||||
Supabase has a free tier, head over to [https://app.supabase.com](https://app.supabase.com) to get started.
|
||||
@@ -77,7 +77,7 @@ In the next few days, you will see your usage appear in the dashboard with an up
|
||||
|
||||
Check back throughout the week to see what else we're launching [here](/blog/2021/03/25/launch-week).
|
||||
|
||||
Sign up for the Supabase Beta [here](https://app.supabase.io).
|
||||
Sign up for the Supabase Beta [here](https://app.supabase.com).
|
||||
|
||||
And check out the full pricing details [here](/pricing). And we'd love to hear your opnions on our Pricing! You can let us know via support@supabase.io.
|
||||
|
||||
|
||||
@@ -160,4 +160,4 @@ You may be itching to get started tinkering around with our new Supabase storage
|
||||
- A better editor to make authoring policies easier and less error prone.
|
||||
- Reach out to us if you would like to help out with adding storage support in one of the [community maintained client libraries](/docs/reference/javascript/supabase-client).
|
||||
|
||||
Take it for a spin on our [dashboard](http://app.supabase.io/) and let us know what you think!
|
||||
Take it for a spin on our [dashboard](https://app.supabase.com/) and let us know what you think!
|
||||
@@ -224,4 +224,4 @@ Head over to the [Self Hosting Docs](/docs/guides/self-hosting) for a more compl
|
||||
|
||||
If you require any assistance feel free to reach out in our [github discussions](https://github.com/supabase/supabase/discussions) or at support@supabase.io.
|
||||
|
||||
Check out what else we've [launched this week](/blog/2021/03/25/launch-week), contribute to the [CLI repo](https://github.com/supabase/cli), or go here for the [hosted version](https://app.supabase.io).
|
||||
Check out what else we've [launched this week](/blog/2021/03/25/launch-week), contribute to the [CLI repo](https://github.com/supabase/cli), or go here for the [hosted version](https://app.supabase.com).
|
||||
@@ -92,7 +92,7 @@ This is the most granular option. Connections are returned to the pool after eve
|
||||
|
||||
## What's next?
|
||||
|
||||
Try out connection pooling now with a new project in the [dashboard.](http://app.supabase.io) For now, we do not have any plans to port this over to older projects.
|
||||
Try out connection pooling now with a new project in the [dashboard.](https://app.supabase.com) For now, we do not have any plans to port this over to older projects.
|
||||
|
||||
Eventually, we will expose more PgBouncer settings to the UI such as `Pool Size`. At the moment it is set to `15`.
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ Launch week, Storage, Supabase CLI, Connection Pooling, Supabase UI, and Pricing
|
||||
Watch a full demo:
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/TtLxxaYE1rA"
|
||||
@@ -115,7 +115,7 @@ For this we are working on our own [Workflow engine](/blog/2021/04/02/supabase-
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
|
||||
|
||||
@@ -20,7 +20,7 @@ Check out what we were working on below, as well as some incredible Community co
|
||||
Watch a full demo:
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/uWJmUTCFdak"
|
||||
@@ -38,7 +38,7 @@ We're a developer tool, which means that Dark Mode is [extremely popular](https:
|
||||
While Dark mode is great, for some people it's not an option. Dark Mode is difficult to use for developers with astigmatisms,
|
||||
or even just working in brightly-lit environments.
|
||||
|
||||
So today we're shipping Light Mode. Access it in the settings of your [Dashboard](https://app.supabase.io).
|
||||
So today we're shipping Light Mode. Access it in the settings of your [Dashboard](https://app.supabase.com).
|
||||
|
||||
<video width="99%" autoPlay="autoplay" muted playsInline controls={true}>
|
||||
<source src="/images/blog/april-2021/light-mode.mp4" type="video/mp4" muted playsInline />
|
||||
@@ -124,7 +124,7 @@ $$ language plv8;
|
||||
Fireship reviewed Supabase last week, and despite being a (self-proclaimed) Firebase fan-boy, the review was very impartial.
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/WiwfiVdfRIc"
|
||||
@@ -170,7 +170,7 @@ We're also working on our [Workflows engine](/blog/2021/04/02/supabase-workflows
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
|
||||
|
||||
@@ -19,7 +19,7 @@ Apple & Twitter Logins, Supabase Grid, Go & Swift Libraries. Lots of great stuff
|
||||
Watch a full demo:
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/qETcl3SUfzU"
|
||||
@@ -88,7 +88,7 @@ We started a weekly 1-hour live stream where we build in public.
|
||||
- [Build in Public 002](https://twitter.com/p_phiri/status/1397815806990372865?s=20): `maybeSingle()` and "React + Supabase" Tutorial
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/p561ogKZ63o"
|
||||
@@ -124,7 +124,7 @@ We're planning another Launch Week at the end of July. We'll probably have a qui
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
|
||||
|
||||
@@ -20,7 +20,7 @@ Supabase is gearing up for another Launch Week on July the 26th. Until then, her
|
||||
Watch a full demo of this month's releases
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/m3yRPNyYolk"
|
||||
@@ -113,7 +113,7 @@ We run a weekly 1-hour live stream where we build in public.
|
||||
- [Build in Public 007](https://youtu.be/R4gJhX_JFTo): Supabase Studio - API Docs
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/LHYrqBb4q9I"
|
||||
@@ -164,7 +164,7 @@ Let's goooooo.
|
||||
|
||||
### Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
|
||||
|
||||
@@ -119,4 +119,4 @@ Each offering will be available for both the `x86` and `arm` architectures.
|
||||
|
||||
## Try PostgreSQL 13
|
||||
|
||||
Try the new features of PostgreSQL 13.3 today by creating a [new project](https://app.supabase.io/) on Supabase.
|
||||
Try the new features of PostgreSQL 13.3 today by creating a [new project](https://app.supabase.com/) on Supabase.
|
||||
@@ -166,4 +166,4 @@ We have a few production applications using Supabase Storage. Wataru is using St
|
||||
|
||||
We're planning a Content Delivery Network for faster downloads, as well as basic transformation and optimization support for media files (like resizing, etc). We will continue our Kaizen on smaller improvements like allowing configurable upload limits and improving service stability and scalability.
|
||||
|
||||
Anything else you want to see or can help implement in Storage? Reach out on our [Discord channel](https://discord.supabase.com/) and give Storage a try by [creating a project](https://app.supabase.io/) on Supabase!
|
||||
Anything else you want to see or can help implement in Storage? Reach out on our [Discord channel](https://discord.supabase.com/) and give Storage a try by [creating a project](https://app.supabase.com/) on Supabase!
|
||||
@@ -55,7 +55,7 @@ Check out the [documentation](/docs/guides/auth/auth-twilio) to get started with
|
||||
or watch the [Youtube guide](https://youtu.be/akScoPO01bc).
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/akScoPO01bc"
|
||||
@@ -102,4 +102,4 @@ The next major item on the list is MFA (Multi-Factor Authentication) - which inc
|
||||
Find out how Mobbin is using Supabase Auth to [manage 200,000 users](/blog/2021/07/28/mobbin-supabase-200000-users).
|
||||
|
||||
Anything else you want to see or can help implement in Auth? Reach out on
|
||||
[Discord](https://discord.supabase.com/) and give Auth a try by [creating a project](https://app.supabase.io/) on Supabase!
|
||||
[Discord](https://discord.supabase.com/) and give Auth a try by [creating a project](https://app.supabase.com/) on Supabase!
|
||||
@@ -122,4 +122,4 @@ Where to begin?
|
||||
- Longer time periods: view historical data going back several months.
|
||||
- Interactive widgets: view-only reports are fine, but we wouldn't be a Postgres company if we didn't allow you to write your own SQL queries.
|
||||
|
||||
Any other metrics you want to see in your projects? Reach out on our [Discord channel](https://discord.supabase.com/) and give Supabase a try by [creating a project](https://app.supabase.io/).
|
||||
Any other metrics you want to see in your projects? Reach out on our [Discord channel](https://discord.supabase.com/) and give Supabase a try by [creating a project](https://app.supabase.com/).
|
||||
@@ -244,7 +244,7 @@ This is only the beginning! First we'll thoroughly test it and make a stable rel
|
||||
|
||||
## Get started today
|
||||
|
||||
Function Hooks is enabled today on all [new projects](https://app.supabase.io). Find it under Database > Alpha Preview > Function Hooks.
|
||||
Function Hooks is enabled today on all [new projects](https://app.supabase.com). Find it under Database > Alpha Preview > Function Hooks.
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ July ended with our second "Launch Week", where we shipped something every day f
|
||||
Watch a full demo of this month's releases.
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/Vj5fPA-vjfw"
|
||||
@@ -135,7 +135,7 @@ Security, stability, performance ... and Functions.
|
||||
|
||||
## Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
|
||||
|
||||
@@ -20,7 +20,7 @@ We've raised $30M and shipped a bunch of features. Let's dive into what's been h
|
||||
Watch a recap of this month's release.
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/YYpTh2DAvho"
|
||||
@@ -90,7 +90,7 @@ RLS can be a bit foreign for developers getting started with Postgres.
|
||||
This video by [@\_dijonmusters](https://twitter.com/_dijonmusters) demystifies it. If you find the video a useful medium for learning, consider [subscribing to our channel](https://www.youtube.com/c/supabase).
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/Ow_Uzedfohk"
|
||||
@@ -158,7 +158,7 @@ By the time we're done, Supabase will be production-ready for all use cases.
|
||||
|
||||
## Get started
|
||||
|
||||
- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
|
||||
- Start using Supabase today: [app.supabase.com](https://app.supabase.com/)
|
||||
- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
|
||||
- Follow us [on Twitter](https://twitter.com/supabase)
|
||||
- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
|
||||
|
||||
@@ -67,7 +67,7 @@ We've revamped the Auth docs - The docs are now broken down into [Authentication
|
||||
Low Code demo, Using Supabase with [Clutch.io](http://clutch.io/) - [@\_dijonmusters](https://twitter.com/_dijonmusters) ran a [session at General Assembly](https://www.youtube.com/watch?t=642&v=5fsKMTeBKKY) showing how to use these two tools together to create apps using a low code approach.
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/5fsKMTeBKKY"
|
||||
@@ -124,7 +124,7 @@ We're warming up for another Launch Week! Last time was "[Launch Week II: the SQ
|
||||
|
||||
## Get started
|
||||
|
||||
- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
|
||||
- Start using Supabase today: **[app.supabase.com](https://app.supabase.com/)**
|
||||
- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
|
||||
- Follow us **[on Twitter](https://twitter.com/supabase)**
|
||||
- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
|
||||
|
||||
@@ -74,4 +74,4 @@ Replenysh clients include brands with global recognition and millions of custome
|
||||
|
||||
## Supabase help Replenysh continue to scale
|
||||
|
||||
Supabase turbo-charged Replenysh's development time with a seamless end-user mobile login experience. They are ready to help major brands engage with their users through participation in the circular economy. With Supabase, the team knows they have a slick auth experience, reduced DevOps overhead, and can continue to scale with Postgres. You can test out the Supabase developer experience today by [starting a new project on the free tier!.](https://app.supabase.io/)
|
||||
Supabase turbo-charged Replenysh's development time with a seamless end-user mobile login experience. They are ready to help major brands engage with their users through participation in the circular economy. With Supabase, the team knows they have a slick auth experience, reduced DevOps overhead, and can continue to scale with Postgres. You can test out the Supabase developer experience today by [starting a new project on the free tier!.](https://app.supabase.com/)
|
||||
@@ -263,7 +263,7 @@ If you want to help us build the future of cloud-native Postgres, join us:
|
||||
|
||||
## Get started
|
||||
|
||||
- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
|
||||
- Start using Supabase today: **[app.supabase.com](https://app.supabase.com/)**
|
||||
- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
|
||||
- Follow us **[on Twitter](https://twitter.com/supabase)**
|
||||
- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
|
||||
|
||||
@@ -20,7 +20,7 @@ We released three new Auth providers, multi-schema support, and we're gearing up
|
||||
Watch a recap of this month's release.
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/yL5WbAKAKjE"
|
||||
@@ -63,7 +63,7 @@ We have a TON of new guides, with videos too.
|
||||
Learn about PostgreSQL Functions. [Docs](https://supabase.com/docs/guides/database/functions).
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/MJZCCpCYEqk"
|
||||
@@ -77,7 +77,7 @@ Learn about PostgreSQL Functions. [Docs](https://supabase.com/docs/guides/databa
|
||||
Learn about all the exciting features of Auth within Supabase. [Docs](https://supabase.com/docs/guides/auth/intro).
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/6ow_jW4epf8"
|
||||
@@ -91,7 +91,7 @@ Learn about all the exciting features of Auth within Supabase. [Docs](https://su
|
||||
Learn more about the power of PostgREST for RESTful APIs. [Docs](https://supabase.com/docs/guides/api#restful-api).
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/rPAJJFdtPw0"
|
||||
@@ -118,7 +118,7 @@ There was a lot of activity this month.
|
||||
Supabase attended the Jamstack conf. Watch us catch up with Matt, the cofounder of Netlify (minute 8).
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/phC14xfwvjc"
|
||||
@@ -132,7 +132,7 @@ Supabase attended the Jamstack conf. Watch us catch up with Matt, the cofounder
|
||||
And [Jon](https://twitter.com/_dijonmusters) made a guest appearance at this year's amazing [Next.js Conf](https://nextjs.org/conf).
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/GpXEMB1pDRE"
|
||||
@@ -173,7 +173,7 @@ Now we're going even bigger with the third installment: `Launch Week III: The Tr
|
||||
|
||||
## Get started
|
||||
|
||||
- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
|
||||
- Start using Supabase today: **[app.supabase.com](https://app.supabase.com/)**
|
||||
- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
|
||||
- Follow us **[on Twitter](https://twitter.com/supabase)**
|
||||
- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
|
||||
|
||||
@@ -114,6 +114,6 @@ In some ways, running Supabase is like launching many startups at the same time,
|
||||
|
||||
Running an accelerator model may also be why we've had success [hiring so many other founders](https://about.supabase.com/careers/founders). We're able to give a high degree of autonomy to individuals when it comes to managing projects and initiatives. If this kind of work environment sounds interesting to you, we have tons of [open roles](https://about.supabase.com/careers). We've already hired people who joined because they "couldn't stand to watch another Launch Week from the sidelines" and team members often quote experiencing their first Launch Week as one of the highlights of their Supabase journey so far. It clearly has benefits that extend beyond just growth and user activation.
|
||||
|
||||
Make sure you follow us on [Twitter](https://twitter.com/supabase), join our [Discord](https://discord.supabase.com), or [sign up for Supabase](https://app.supabase.io) in order to keep up to date on all things Supabase.
|
||||
Make sure you follow us on [Twitter](https://twitter.com/supabase), join our [Discord](https://discord.supabase.com), or [sign up for Supabase](https://app.supabase.com) in order to keep up to date on all things Supabase.
|
||||
|
||||
Supabase is the Open Source Firebase Alternative.
|
||||
@@ -97,7 +97,7 @@ select *
|
||||
from sensor_range;
|
||||
```
|
||||
|
||||
``` hideCopy
|
||||
```hideCopy
|
||||
| `reading_id` | `metric_desc` | `metric_level` | `metric_ts` |
|
||||
|--------------|---------------|----------------|-----------------------------------------------------------------------------|
|
||||
| 1 | Temperature | high | {[2021-11-01 6:00, 2021-11-01 10:00],[2021-11-05 14:00, 2021-11-05 20:00]} |
|
||||
@@ -163,4 +163,4 @@ Indeed, there's a lot more to explore in the latest PostgreSQL, and we've barely
|
||||
There's no better way to experience some of these features than by trying them out for yourself.
|
||||
You can check out these new features within your Supabase project without having to perform a local installation.
|
||||
|
||||
Explore the [Supabase dashboard now](https://app.supabase.io) and get started with your new project.
|
||||
Explore the [Supabase dashboard now](https://app.supabase.com) and get started with your new project.
|
||||
@@ -19,53 +19,51 @@ Here's all the awesome stuff that got shipped during Launch Week...
|
||||
|
||||
## Supabase Studio
|
||||
|
||||
We [open sourced the Dashboard](/blog/2021/11/30/supabase-studio) - it's now included in Self-Hosting, and the community are now able to contribute,
|
||||
We [open sourced the Dashboard](/blog/2021/11/30/supabase-studio) - it's now included in Self-Hosting, and the community are now able to contribute,
|
||||
which is going to help us move even faster! Expect many more updates to the dashboard over the coming weeks and months! [Read the code for yourself.](https://github.com/supabase/supabase/tree/master/studio)
|
||||
|
||||

|
||||
|
||||
## We acquired Logflare
|
||||
|
||||
We were early Logflare users, and found it to be one of the most impressive products we'd ever used. So impressive in fact, that we wanted to offer it's capabilities to our entire user base.
|
||||
We were early Logflare users, and found it to be one of the most impressive products we'd ever used. So impressive in fact, that we wanted to offer it's capabilities to our entire user base.
|
||||
You'll now find fully searchable Supabase API and database logs within the dashboard, and we're also in the process of open sourcing the codebase. [Read more about the acquisition](/blog/2021/12/02/supabase-acquires-logflare).
|
||||
|
||||

|
||||
|
||||
## Realtime Row Level Security
|
||||
|
||||
[Security rules now work for Realtime](/blog/2021/12/01/realtime-row-level-security-in-postgresql).
|
||||
[Security rules now work for Realtime](/blog/2021/12/01/realtime-row-level-security-in-postgresql).
|
||||
All of your row level security policies now work with the realtime API, so you can limit streams and subscriptions on a per user basis (or any configuration you want!).
|
||||
|
||||
|
||||

|
||||
|
||||
## GraphQL is coming to Supabase
|
||||
|
||||
We heard you! And built a Postgres extension for [querying your database with GraphQL](/blog/2021/12/03/pg-graphql).
|
||||
We heard you! And built a Postgres extension for [querying your database with GraphQL](/blog/2021/12/03/pg-graphql).
|
||||
This means that each GraphQL request is resolved by a single SQL statement and hits the theoretical minimum achievable network IO overhead of any GraphQL to SQL resolver.
|
||||
|
||||

|
||||
|
||||
## Supabase now runs on PostgreSQL 14
|
||||
|
||||
One of the most exciting things to happen in databases this year was the release of PG 14.
|
||||
One of the most exciting things to happen in databases this year was the release of PG 14.
|
||||
Which is now the default database used on our hosted platform. Read more here about [why we're so excited about it](/blog/2021/11/28/whats-new-in-postgres-14).
|
||||
|
||||
|
||||

|
||||
|
||||
## PostgREST 9.0
|
||||
## PostgREST 9.0
|
||||
|
||||
PostgREST is the tool we use to introspect your schema and make your database available over a RESTful API.
|
||||
We also sponsor and help maintain this amazing open source project. Version 9.0 was just released and has also been rolled out to all new and existing Supabase projects on our hosted platform.
|
||||
PostgREST is the tool we use to introspect your schema and make your database available over a RESTful API.
|
||||
We also sponsor and help maintain this amazing open source project. Version 9.0 was just released and has also been rolled out to all new and existing Supabase projects on our hosted platform.
|
||||
[Check out the blog post](/blog/2021/11/28/postgrest-9) by Steve Chavez, the maintainer of PostgREST.
|
||||
|
||||

|
||||
|
||||
## Building a SaaS?
|
||||
## Building a SaaS?
|
||||
|
||||
We have [a course for that](https://egghead.io/courses/build-a-saas-product-with-next-js-supabase-and-stripe-61f2bc20).
|
||||
You'll learn how to combine Next.js, Stripe, and Supabase to launch your business in no time at all.
|
||||
We have [a course for that](https://egghead.io/courses/build-a-saas-product-with-next-js-supabase-and-stripe-61f2bc20).
|
||||
You'll learn how to combine Next.js, Stripe, and Supabase to launch your business in no time at all.
|
||||
It's honestly mind blowing how quickly you can get products out the door with this stack. Oh and it's free.
|
||||
|
||||

|
||||
@@ -83,7 +81,7 @@ supabase monthly growth
|
||||
|
||||

|
||||
|
||||
## Community
|
||||
## Community
|
||||
|
||||
### Highlights
|
||||
|
||||
@@ -103,7 +101,6 @@ Supabase is [now on TikTok](https://www.tiktok.com/@supabase.com?) - Watch us sh
|
||||
|
||||

|
||||
|
||||
|
||||
### GitHub
|
||||
|
||||
We hit 25K stars!! [github.com/supabase/supabase](http://github.com/supabase/supabase)
|
||||
@@ -112,8 +109,8 @@ We hit 25K stars!! [github.com/supabase/supabase](http://github.com/supabase/sup
|
||||
|
||||
## Get started
|
||||
|
||||
- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
|
||||
- Start using Supabase today: **[app.supabase.com](https://app.supabase.com/)**
|
||||
- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
|
||||
- Follow us **[on Twitter](https://twitter.com/supabase)**
|
||||
- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
|
||||
- Become a **[sponsor](https://github.com/sponsors/supabase)**
|
||||
- Become a **[sponsor](https://github.com/sponsors/supabase)**
|
||||
@@ -17,7 +17,7 @@ Happy 2022. We're looking forward to a year of shipping product and helping our
|
||||
|
||||
Here's a bunch of stuff we shipped throughout December...
|
||||
|
||||
## Hackathon Winners
|
||||
## Hackathon Winners
|
||||
|
||||
We had a ton of awesome projects [submitted for our Holiday Hackdays](/blog/2021/12/17/holiday-hackdays-winners-2021), all of the submissions are open source so come and check out the code for some of our top picks!
|
||||
|
||||
@@ -25,20 +25,20 @@ We had a ton of awesome projects [submitted for our Holiday Hackdays](/blog/2021
|
||||
|
||||
## New crypto extension - pg_crypto
|
||||
|
||||
We just added pg_sodium as an extension inside all postgres instances.
|
||||
Which means you can easily do encryption, decryption, hashing, and cryptographic signing from within your postgres functions and queries.
|
||||
Enable it from the Database > Extensions tab in the [Supabase Dashboard](https://app.supabase.io).
|
||||
We just added pg_sodium as an extension inside all postgres instances.
|
||||
Which means you can easily do encryption, decryption, hashing, and cryptographic signing from within your postgres functions and queries.
|
||||
Enable it from the Database > Extensions tab in the [Supabase Dashboard](https://app.supabase.com).
|
||||
|
||||
[](https://app.supabase.io)
|
||||
[](https://app.supabase.com)
|
||||
|
||||
## PostgreSQL Videos
|
||||
## PostgreSQL Videos
|
||||
|
||||
### Call Postgres functions from JavaScript with RPC
|
||||
|
||||
Jon Meyers walks you through how to write more complex queries and logic in your database, and invoke it via the API.
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/I6nnp9AINJk"
|
||||
@@ -47,12 +47,12 @@ Jon Meyers walks you through how to write more complex queries and logic in your
|
||||
allowFullScreen
|
||||
></iframe>
|
||||
|
||||
### Call any API using PostgreSQL functions
|
||||
### Call any API using PostgreSQL functions
|
||||
|
||||
We recently added the ability to call any external HTTP endpoint from your postgres functions. Jon shows you how!
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/rARgrELRCwY"
|
||||
@@ -61,12 +61,12 @@ We recently added the ability to call any external HTTP endpoint from your postg
|
||||
allowFullScreen
|
||||
></iframe>
|
||||
|
||||
### Create PostgreSQL Functions with Supabase
|
||||
### Create PostgreSQL Functions with Supabase
|
||||
|
||||
Triggers allow you to execute SQL in response to any table changes. Learn how to write PostgreSQL triggers with Jon!
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/MJZCCpCYEqk"
|
||||
@@ -90,7 +90,7 @@ There was a lot of activity this month.
|
||||
Let Jason and Jon show you how to build an app with Next.js and Supabase on top of Netlify!
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/8vqY1KT4TLU"
|
||||
@@ -109,7 +109,17 @@ Divjoy announced their [Supabase Integration](https://divjoy.com/?database=supab
|
||||
|
||||
[n8n](https://n8n.io/) added a Supabase node.
|
||||
|
||||
<blockquote class="twitter-tweet" data-theme="dark"><p lang="en" dir="ltr">We released n8n@0.158.0 with new nodes for <a href="https://twitter.com/supabase?ref_src=twsrc%5Etfw">@supabase</a>, <a href="https://twitter.com/syncromsp?ref_src=twsrc%5Etfw">@syncromsp</a>, and <a href="https://twitter.com/Microsoft?ref_src=twsrc%5Etfw">@Microsoft</a> Graph Security. We also made improvements to existing nodes ✨ <a href="https://t.co/IdeUe4eWBK">pic.twitter.com/IdeUe4eWBK</a></p>— n8n.io (@n8n_io) <a href="https://twitter.com/n8n_io/status/1480502781320572931?ref_src=twsrc%5Etfw">January 10, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
|
||||
<blockquote class="twitter-tweet" data-theme="dark">
|
||||
<p lang="en" dir="ltr">
|
||||
We released n8n@0.158.0 with new nodes for{' '}
|
||||
<a href="https://twitter.com/supabase?ref_src=twsrc%5Etfw">@supabase</a>,{' '}
|
||||
<a href="https://twitter.com/syncromsp?ref_src=twsrc%5Etfw">@syncromsp</a>, and{' '}
|
||||
<a href="https://twitter.com/Microsoft?ref_src=twsrc%5Etfw">@Microsoft</a> Graph Security. We
|
||||
also made improvements to existing nodes ✨{' '}
|
||||
<a href="https://t.co/IdeUe4eWBK">pic.twitter.com/IdeUe4eWBK</a>
|
||||
</p>
|
||||
— n8n.io (@n8n_io) <a href="https://twitter.com/n8n_io/status/1480502781320572931?ref_src=twsrc%5Etfw">January 10, 2022</a>
|
||||
</blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>{' '}
|
||||
|
||||
### Python Upgrades
|
||||
|
||||
@@ -121,9 +131,14 @@ See the full list of [community supported libs](https://github.com/supabase-comm
|
||||
|
||||
### Twitter
|
||||
|
||||
We're having a 24/7*365 meme-fest on [Twitter](https://twitter.com/supabase)
|
||||
We're having a 24/7\*365 meme-fest on [Twitter](https://twitter.com/supabase)
|
||||
|
||||
<blockquote class="twitter-tweet" data-theme="dark"><p lang="en" dir="ltr">invest in good relationships <a href="https://t.co/bGiBE7FRFQ">pic.twitter.com/bGiBE7FRFQ</a></p>— Supabase (@supabase) <a href="https://twitter.com/supabase/status/1475876907212316678?ref_src=twsrc%5Etfw">December 28, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
|
||||
<blockquote class="twitter-tweet" data-theme="dark">
|
||||
<p lang="en" dir="ltr">
|
||||
invest in good relationships <a href="https://t.co/bGiBE7FRFQ">pic.twitter.com/bGiBE7FRFQ</a>
|
||||
</p>
|
||||
— Supabase (@supabase) <a href="https://twitter.com/supabase/status/1475876907212316678?ref_src=twsrc%5Etfw">December 28, 2021</a>
|
||||
</blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>{' '}
|
||||
|
||||
### TikTok
|
||||
|
||||
@@ -149,7 +164,7 @@ Check out some of our other community stats in our latest [Series A Blog Post](/
|
||||
|
||||
## Get started
|
||||
|
||||
- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
|
||||
- Start using Supabase today: **[app.supabase.com](https://app.supabase.com/)**
|
||||
- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
|
||||
- Follow us **[on Twitter](https://twitter.com/supabase)**
|
||||
- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
|
||||
|
||||
@@ -109,7 +109,7 @@ There's no stopping [Jon Meyers](https://jonmeyers.io/videos)! He’s back with
|
||||
You'll learn how to listen to _any_ database change, then send those changes [in a payload](https://supabase.com/blog/2021/07/30/supabase-functions-updates#hook-payload) via HTTP request.
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/codAs9-NeHM"
|
||||
@@ -120,10 +120,9 @@ You'll learn how to listen to _any_ database change, then send those changes [in
|
||||
|
||||
## Set your own support ticket priority
|
||||
|
||||
As with any platform, there can be the occasional glitch.
|
||||
|
||||
As with any platform, there can be the occasional glitch.
|
||||
|
||||
The Supabase Dashboard includes a dedicated support form that goes straight to our support inbox. This support form includes your project information and,
|
||||
The Supabase Dashboard includes a dedicated support form that goes straight to our support inbox. This support form includes your project information and,
|
||||
since we all want to see your issues solved, we thought it would make sense that _you_ could set the priority of your support tickets.
|
||||
|
||||
This change has drastically improved response times for urgent support tickets.
|
||||
@@ -142,7 +141,7 @@ Are you maintaining multiple environments? Snaplet helps you copy a production d
|
||||
Check out the [Supabase clone environments](https://docs.snaplet.dev/tutorials/supabase-clone-environments) tutorial on the Snaplet docs.
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/oPtMMhdhEP4"
|
||||
@@ -156,7 +155,7 @@ Check out the [Supabase clone environments](https://docs.snaplet.dev/tutorials/s
|
||||
Retool has put together a brilliant 10 minute admin panel setup using Supabase with Retool.
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/AgB2-CSrnoI"
|
||||
@@ -170,7 +169,7 @@ Retool has put together a brilliant 10 minute admin panel setup using Supabase w
|
||||
Jason Lengstorf caught up with our very own [Jon Meyers](https://jonmeyers.io/) on his awesome show, [Learn with Jason](https://www.youtube.com/watch?v=8vqY1KT4TLU), to talk about building an app [with Supabase and NextJS](https://supabase.com/docs/guides/with-nextjs).
|
||||
|
||||
<iframe
|
||||
className="w-full video-with-border"
|
||||
className="video-with-border w-full"
|
||||
width="640"
|
||||
height="385"
|
||||
src="https://www.youtube-nocookie.com/embed/8vqY1KT4TLU"
|
||||
@@ -189,7 +188,7 @@ Jason Lengstorf caught up with our very own [Jon Meyers](https://jonmeyers.io/)
|
||||
|
||||
One of Supabase’s key tools that allow a lot of our functionality has had some updates.
|
||||
|
||||
- `pg_listen` was removed in favor of PostgREST’s built-in schema reloading.
|
||||
- `pg_listen` was removed in favor of PostgREST’s built-in schema reloading.
|
||||
- PostgREST database connection pool size gets scaled with instance size for better performance for certain workload shapes.
|
||||
|
||||
## Coming Next: Launch Week IV
|
||||
@@ -200,7 +199,7 @@ Of course, we can’t tell you what will happen (perhaps because we don’t know
|
||||
|
||||
## Get started
|
||||
|
||||
- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
|
||||
- Start using Supabase today: **[app.supabase.com](https://app.supabase.com/)**
|
||||
- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
|
||||
- Follow us **[on Twitter](https://twitter.com/supabase)**
|
||||
- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
|
||||
|
||||
@@ -124,58 +124,42 @@ Some features are too good to limit to large customers, so today we're introduci
|
||||
### Spend caps
|
||||
|
||||
<video width="99%" autoPlay="autoplay" muted playsInline controls={true}>
|
||||
<source
|
||||
src="/videos/blog/launch-week-4/spend-caps.mp4"
|
||||
type="video/mp4"
|
||||
muted
|
||||
playsInline
|
||||
/>
|
||||
<source src="/videos/blog/launch-week-4/spend-caps.mp4" type="video/mp4" muted playsInline />
|
||||
</video>
|
||||
|
||||
To simplify pricing, we've merged the “Pro” and “Pay as you go” tiers and introduced monthly spend caps to avoid nasty billing surprises.
|
||||
To simplify pricing, we've merged the “Pro” and “Pay as you go” tiers and introduced monthly spend caps to avoid nasty billing surprises.
|
||||
These changes are to keep Supabase pricing [predictable, transparent, and developer friendly](/blog/2021/03/29/pricing).
|
||||
|
||||
When you upgrade to the Pro Tier, spend caps are turned on by default, limiting your per-project costs to $25 per month.
|
||||
When you upgrade to the Pro Tier, spend caps are turned on by default, limiting your per-project costs to $25 per month.
|
||||
We're also retaining our soft limits while we manage the transition to granular spend-caps, so your service will continue to run even if your usage exceeds $25 (we'll contact you directly when you go over the limit). Right now there is a global project spend-cap, and in the future you'll have full control with configurable spend-caps on a “per-feature” basis.
|
||||
|
||||
### Database Add-ons
|
||||
|
||||
<video width="99%" autoPlay="autoplay" muted playsInline controls={true}>
|
||||
<source
|
||||
src="/videos/blog/launch-week-4/database-addons.mp4"
|
||||
type="video/mp4"
|
||||
muted
|
||||
playsInline
|
||||
/>
|
||||
<source src="/videos/blog/launch-week-4/database-addons.mp4" type="video/mp4" muted playsInline />
|
||||
</video>
|
||||
|
||||
Today we're releasing self-serve Database Add-ons.
|
||||
|
||||
What do you do when your project hits production and your userbase is sky-rocketing?
|
||||
What do you do when your project hits production and your userbase is sky-rocketing?
|
||||
Many developers have been asking to scale their projects on-demand. Database Add-ons give everyone this control.
|
||||
|
||||
Today, Database Add-ons are available for a small set of customers. We will progressively release this for everyone by the end of next week (Friday 8th April).
|
||||
|
||||
### New Log Explorer
|
||||
|
||||
|
||||
<video width="99%" autoPlay="autoplay" muted playsInline controls={true}>
|
||||
<source
|
||||
src="/videos/blog/launch-week-4/logexplorer.mp4"
|
||||
type="video/mp4"
|
||||
muted
|
||||
playsInline
|
||||
/>
|
||||
<source src="/videos/blog/launch-week-4/logexplorer.mp4" type="video/mp4" muted playsInline />
|
||||
</video>
|
||||
|
||||
Today we're releasing a brand new [Log Explorer](/docs/guides/platform/logs) in the Supabase Dashboard.
|
||||
As big advocates of SQL, we've done what any good Postgres fanatics would do - we're giving you the ability to query your logs using SQL.
|
||||
And if you're new to SQL, we have plenty of templates included.
|
||||
This is just one of the exciting features we are releasing through our [Logflare acquisition](/blog/2021/12/02/supabase-acquires-logflare).
|
||||
Log history is available to every Supabase project:
|
||||
Log history is available to every Supabase project [^1]:
|
||||
|
||||
- Free Tier: 7 days of log history
|
||||
- Pro Tier: 30 days of log history
|
||||
- Free Tier: 1 day of log history
|
||||
- Pro Tier: 7 days of log history
|
||||
- Enterprise Tier: 90 days of log history
|
||||
|
||||
### Elixir Livebooks
|
||||
@@ -189,16 +173,18 @@ For example, Supabase is popular with web3 projects where traffic can be very un
|
||||
When [sound.xyz](http://sound.xyz) dropped [an NFT with Snoop](https://www.sound.xyz/snoopdogg/death-row-mix-vol-1), we customized their pooler to handle significant load.
|
||||
Their database handled over 9,000 simultaneously connections from Vercel's serverless API.
|
||||
|
||||
<Quote
|
||||
img="vignesh-sound.jpeg"
|
||||
caption="Vignesh - CTO @ sound.xyz"
|
||||
>
|
||||
<p>In our MVP, we started with a serverless stack to simplify DevOps. Supabase made it dead simple to get PgBouncer and Postgres running so we could focus on the product.</p>
|
||||
<Quote img="vignesh-sound.jpeg" caption="Vignesh - CTO @ sound.xyz">
|
||||
<p>
|
||||
As we started hitting scale, they've been crucial to supporting our drops. When Snoop Dogg debuted on Sound, Supabase was able to help us provision our data store to handle the load.
|
||||
In our MVP, we started with a serverless stack to simplify DevOps. Supabase made it dead simple
|
||||
to get PgBouncer and Postgres running so we could focus on the product.
|
||||
</p>
|
||||
<p>
|
||||
As we rearchitect our backend stack towards scaled microservices, we can be confident that managing Postgres won't be a bottleneck.
|
||||
As we started hitting scale, they've been crucial to supporting our drops. When Snoop Dogg
|
||||
debuted on Sound, Supabase was able to help us provision our data store to handle the load.
|
||||
</p>
|
||||
<p>
|
||||
As we rearchitect our backend stack towards scaled microservices, we can be confident that
|
||||
managing Postgres won't be a bottleneck.
|
||||
</p>
|
||||
<p>
|
||||
Supabase takes out the mental effort from our back-end infrastructure so we can focus on our
|
||||
@@ -274,5 +260,7 @@ saved to disk for increased performance. These views update periodically at a ca
|
||||
|
||||
## Next steps
|
||||
|
||||
Get started today with all of our Enterprise Features on [app.supabase.io](https://app.supabase.io), or [contact the Supabase Enterprise team](/contact/enterprise)
|
||||
Get started today with all of our Enterprise Features on [app.supabase.com](https://app.supabase.com), or [contact the Supabase Enterprise team](/contact/enterprise)
|
||||
if you want to access our Enterprise features.
|
||||
|
||||
[^1]: Updated on May 31 2022 for accuracy: Changed to accurately reflect the log periods we advertise on our [pricing page](/pricing).
|
||||
@@ -5,14 +5,14 @@ author: ant_wilson
|
||||
image: 2022-march/thumb.jpg
|
||||
thumb: 2022-march/thumb.jpg
|
||||
tags:
|
||||
- launch-week
|
||||
date: '2022-04-15T11:00:00'
|
||||
- release-notes
|
||||
date: '2022-04-15'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
Definitely our most feature-packed month so far. Here's a ton of stuff we shipped throughout March...
|
||||
|
||||
## Functions
|
||||
## Functions
|
||||
|
||||
The one we've all been waiting for. You can now [deploy Javascript & Typescript functions](/blog/2022/03/31/supabase-edge-functions) to Supabase. You can develop and test locally, link a project, and deploy globally to the edge in a matter of seconds!
|
||||
|
||||
@@ -20,11 +20,11 @@ The one we've all been waiting for. You can now [deploy Javascript & Typescript
|
||||
|
||||
## GraphQL
|
||||
|
||||
You can now [query your Supabase database with GraphQL](/blog/2022/03/29/graphql-now-available). We built this as a postgres extension, so it's portable, open source, and solves some of the problems that exist in other GraphQL implementations.
|
||||
You can now [query your Supabase database with GraphQL](/blog/2022/03/29/graphql-now-available). We built this as a postgres extension, so it's portable, open source, and solves some of the problems that exist in other GraphQL implementations.
|
||||
|
||||
[](/blog/2022/03/29/graphql-now-available)
|
||||
|
||||
## Realtime
|
||||
## Realtime
|
||||
|
||||
Supabase Realtime [now supports multiplayer and presence](/blog/2022/04/01/supabase-realtime-with-multiplayer-features), so you can build collaborative applications like Figma and Google Docs with Supabase. Come and have some fun on our demo application.
|
||||
|
||||
@@ -56,13 +56,14 @@ We're now an official [GitHub secret scanning partner](/blog/2022/03/28/communit
|
||||
|
||||
## Supabrew - Never Code Thirsty
|
||||
|
||||
For April Fools - [we announced a non-alcoholic](/blog/2022/04/01/supabrew), light, and refreshing brew. Perfect for coding late into the night. We're pushing the boundaries of Developer Experience.
|
||||
For April Fools - [we announced a non-alcoholic](/blog/2022/04/01/supabrew), light, and refreshing brew. Perfect for coding late into the night. We're pushing the boundaries of Developer Experience.
|
||||
|
||||
[](/blog/2022/04/01/supabrew)
|
||||
|
||||
## Video Highlights
|
||||
|
||||
Relive all the action from Launch Week 4:
|
||||
|
||||
- [Community Day Live Stream](https://www.youtube.com/watch?v=D0gIgjozOzc) on YouTube
|
||||
- [GraphQL Announcement Live Stream](https://www.youtube.com/watch?v=fApxu_U_hdw) on YouTube
|
||||
- [Enterprise Announcements Live Stream](https://www.youtube.com/watch?v=UZrl1cwzTDg) on YouTube
|
||||
@@ -79,7 +80,7 @@ We're Hiring - for a ton of new roles across engineering, marketing, and HR. We
|
||||
|
||||
## Twitter
|
||||
|
||||
We're having a 24/7*365 meme-fest on [Twitter](https://twitter.com/supabase). Come join us.
|
||||
We're having a 24/7\*365 meme-fest on [Twitter](https://twitter.com/supabase). Come join us.
|
||||
|
||||
[](https://twitter.com/supabase)
|
||||
|
||||
@@ -101,7 +102,7 @@ We hit 30K stars!!: [github.com/supabase/supabase](http://github.com/supabase/su
|
||||
|
||||
## Get started
|
||||
|
||||
- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
|
||||
- Start using Supabase today: **[app.supabase.com](https://app.supabase.com/)**
|
||||
- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
|
||||
- Follow us **[on Twitter](https://twitter.com/supabase)**
|
||||
- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
|
||||
|
||||
+128
@@ -0,0 +1,128 @@
|
||||
---
|
||||
title: How Mike Lyndon is using Supabase to accelerate development of AllPullTogether
|
||||
description: Mike Lyndon is learning web development as he builds AllPullTogether, and Supabase is helping him accelerate what he can accomplish.
|
||||
author: shanerice
|
||||
image: all-pull-together/all-pull-together-thumb.png
|
||||
thumb: all-pull-together/all-pull-together-thumb.png
|
||||
tags:
|
||||
- community
|
||||
- case-study
|
||||
- q-and-a
|
||||
date: '2022-05-26'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
# How Mike Lyndon is using Supabase to accelerate development of AllPullTogether
|
||||
|
||||
There are epic stories about how Supabase helps our customers solve their big challenges. Today we want to put a spotlight on one of these stories from Mike Lyndon as he’s building AllPullTogether. Mike shared this note with our team during an interaction with support:
|
||||
|
||||
<Quote img="allpulltogether-mike-lyndon.png" caption="Mike Lyndon - Creator of AllPullTogether">
|
||||
…if it weren't for Supabase, I'd probably still be talking about launching my app. Instead, I can
|
||||
zoom through the backend stuff and focus on improving my app.
|
||||
</Quote>
|
||||
|
||||
A bit of background on Mike, he’s an experienced visual effects artist who is building AllPullTogether to help digital artists make the asset review process tangible and accessible by reviewing 3D assets in a web browser. Mike is new to web development — he started learning as his life shifted during the early days of the COVID pandemic.
|
||||
|
||||
I sat down with Mike to chat about his experience learning web development and how Supabase changed his approach on AllPullTogether
|
||||
|
||||
---
|
||||
|
||||
<Avatar img="shane-rice.png" caption="Shane" />
|
||||
|
||||
Mike, you’re using Supabase on a project you’re working on and shared a little bit about your experience
|
||||
with Supabase in a support ticket with our team. We loved hearing your story and I wanted to dive a little
|
||||
deeper to see if there was something we could share that would be meaningful to the community.
|
||||
|
||||
_If you don't mind, go ahead and introduce yourself._
|
||||
|
||||
---
|
||||
|
||||
<Avatar img="allpulltogether-mike-lyndon.png" caption="Mike" />
|
||||
|
||||
Sure, I’m Mike Lyndon and I am a visual effects artist who turned to web development about a year ago.
|
||||
I'm working on a 3D review app called AllPullTogether, which lets people upload their 3D assets and invite
|
||||
art directors or other collaborators to review them.
|
||||
|
||||
I’m new to web development. I needed a way to deal with the backend side of things and I came across Supabase
|
||||
|
||||
---
|
||||
|
||||
<Avatar img="shane-rice.png" caption="Shane" />
|
||||
|
||||
Great, thanks Mike. You mentioned you're new to web development.
|
||||
|
||||
Can you share a little about your experience
|
||||
as you've been working through learning and what led you to where you're at with AllPullTogether?
|
||||
|
||||
---
|
||||
|
||||
<Avatar img="allpulltogether-mike-lyndon.png" caption="Mike" />
|
||||
|
||||
Sure! It was part of being in quarantine for a month. I was like, “I need something to do.” I started
|
||||
learning web development about a year ago. Just super basic stuff. Going through HTML, CSS and JavaScript
|
||||
with a bunch of Treehouse video tutorials. As I slowly started progressing, I started incorporating the
|
||||
stuff that I'm more familiar with, which is 3D.
|
||||
|
||||
Once I was through that learning phase, I started looking into how I could create a web app with 3D. That’s another layer of complexity in terms of all the different stacks that you can build on, and I was trying to learn all of them at the same time. During that time I came across an Egghead video series on how to build a SaaS product with nextJS, Supabase, and Stripe.
|
||||
|
||||

|
||||
|
||||
The course gave me the blueprint I needed. I was like, “Wait a minute. I can do that! I can build that too.” I watched that and started implementing what I learned. That's when I realised that I might have an app on my hands that I can market as a product. Something relatively simple where users can upload their 3D assets and someone else can review it by annotating on top of the asset, which is how AllPullTogether started.
|
||||
|
||||
---
|
||||
|
||||
<Avatar img="shane-rice.png" caption="Shane" />
|
||||
|
||||
When we were talking before we started recording, one of the things you mentioned was through your learning
|
||||
before AllPullTogether you were working on a different project to teach yourself backend tools.
|
||||
|
||||
_Can you talk a little about that and your experience and the difference between what you saw building everything from scratch and what you're able to do with Supabase?_
|
||||
|
||||
---
|
||||
|
||||
<Avatar img="allpulltogether-mike-lyndon.png" caption="Mike" />
|
||||
|
||||
At one point I was working on a health tracker app. Just as a personal project. I've done a fair amount
|
||||
of Python scripting in the past, and I was using Flask to build out the backend.
|
||||
|
||||
I deliberately did everything manually and that included building out the databases, figuring out the schema, marshalling the data, Normalisation. It was a good way to learn the principles of database design and backend stuff, but I realised that I was moving at a pace that was relatively slow. It was also not something that I enjoyed doing. What I like doing is the frontend and user experience stuff. So when I saw the Supabase video training series, I was like, “Okay, let me give this a go.”
|
||||
|
||||
What I love about Supabase is I had something up and running in probably less than a day. It takes care of the [authorization](/auth). It let me quickly build out the tables. I learned about row level security, and how that can help separate out the data in terms of who can see what. I love the fact that Supabase is essentially all of these different pieces, all brought together.
|
||||
|
||||
It makes it much easier for me to build the entire app. If it weren't for Supabase, I'd probably still be talking about launching my app. Instead, I can zoom through the backend stuff and focus on improving my app.
|
||||
|
||||
---
|
||||
|
||||
<Avatar img="shane-rice.png" caption="Shane" />
|
||||
|
||||
Mike, that's great to hear. What you're sharing is a story that we hear often as solo devs find us. Maybe
|
||||
they have another full-time job or are working on multiple projects, and they're able to multiply what
|
||||
they can do because of what Supabase takes off their shoulders.\_
|
||||
|
||||
_Before we end our conversation, is there anything else you want to share about your app or your experience with the rest of the community?_
|
||||
|
||||
---
|
||||
|
||||
<Avatar img="allpulltogether-mike-lyndon.png" caption="Mike" />
|
||||
|
||||
I just want to add to that point. One of the things that’s growing in popularity for digital content creation is [multiplayer/real-time](https://multiplayer.dev/).
|
||||
Developing a collaboration-focused app means this was something already on my todo list. I looked into
|
||||
trying to do that myself - setting up the WebSockets and the servers - but when I saw Supabase now had
|
||||
that as well, I thought, “Great, that's one less thing that I need to worry about.”
|
||||
|
||||
---
|
||||
|
||||
<Avatar img="shane-rice.png" caption="Shane" />
|
||||
|
||||
Great. Mike, I appreciate you taking the time and I'm looking forward to watching you build your app
|
||||
and seeing it grow.\_
|
||||
|
||||
---
|
||||
|
||||
<Avatar img="allpulltogether-mike-lyndon.png" caption="Mike" />
|
||||
|
||||
Thanks.
|
||||
|
||||
---
|
||||
|
||||
Check out Mike's work on [AllPullTogether](https://we.allpulltogether.online) and follow him on [Twitter](https://twitter.com/mike_lyndon). And if you're not familiar with Supabase sign up and let us know what you're excited to build.
|
||||
@@ -0,0 +1,129 @@
|
||||
---
|
||||
title: Supabase Beta May 2022
|
||||
description: Product and community updates including wildcard auth redirects, edge functions with webhooks, and Prometheus endpoints for everybody.
|
||||
author: ant_wilson
|
||||
image: 2022-may/thumb.jpg
|
||||
thumb: 2022-may/thumb.jpg
|
||||
tags:
|
||||
- release-notes
|
||||
date: '2022-06-01'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
It's been another packed month of shipping like crazy at Supabase, here's the update on what you might have seen appearing in the product and beyond during the month of May...
|
||||
|
||||
## Wildcard Auth Redirects
|
||||
|
||||
Wildcard redirects are especially useful for Jamstack platforms with preview deployments, like Vercel and Netlify. Now you can add a wildcard domain, like `*.mydomain.com/welcome` and both `x.mydomain.com/welcome` and `y.mydomain.com/welcome` will be be accepted. [Read the Pull Request](https://github.com/supabase/gotrue/pull/334).
|
||||
|
||||
[](https://github.com/supabase/gotrue/pull/334)
|
||||
|
||||
## Supabase Edge functions with Webhooks
|
||||
|
||||
Now you can deploy functions with optional JWT verification. This makes it easier to trigger Edge Functions with webhooks. Use the -no-verify-jwt flag when deploying your functions via the CLI to enable this mode. You can test this out with our [Edge Functions Telegram Bot example](https://github.com/supabase/supabase/tree/master/examples/edge-functions/supabase/functions/telegram-bot).
|
||||
|
||||
[](https://github.com/supabase/supabase/tree/master/examples/edge-functions/supabase/functions/telegram-bot)
|
||||
|
||||
## Metrics for everybody
|
||||
|
||||
We are making another enterprise feature available for all of our users. Our Prometheus-compatible metrics endpoint gives you granular insights on the health and status of your projects, allowing for real-time monitoring, debugging, and alerting for all. [Read the docs](https://supabase.com/docs/guides/platform/metrics).
|
||||
|
||||
[](https://supabase.com/docs/guides/platform/metrics)
|
||||
|
||||
## Improved Policy Editor
|
||||
|
||||
The Policy editor now includes a “Target roles” field. We now have a strong recommendation to use this over the auth.role() = 'authenticated' technique. In one customer’s database, this reduced a query from 46 seconds to 7 milliseconds. Sometimes even we get it wrong - luckily you can trust that Postgres has it right. [Check it out](https://app.supabase.com/project/_/auth/policies).
|
||||
|
||||
[](https://app.supabase.com/project/_/auth/policies)
|
||||
|
||||
## State of DB 2022
|
||||
|
||||
Basedash conducted a survey that takes the pulse of the current databases that teams, individuals, startups, enterprises and hobbyists are using.
|
||||
|
||||
Supabase was listed in two categories, including the first place in satisfaction for hosting providers (84% of users would use us again 🙏). [Full results](https://stateofdb.com/).
|
||||
|
||||
[](https://stateofdb.com/)
|
||||
|
||||
## Supabase Happy Hour #5
|
||||
|
||||
For the fifth edition of our Happy Hour streaming, we had a chat with our CEO and co-founder, Paul Copplestone. We went through some of the history of Supabase, our culture, why PostgreSQL was the right call, and hints about the future of the product. [Watch the episode](https://www.youtube.com/watch?v=_k7GqVDSFvw).
|
||||
|
||||
[](https://www.youtube.com/watch?v=_k7GqVDSFvw)
|
||||
|
||||
## Supabase on Software Engineering Radio
|
||||
|
||||
I chatted with SE Radio host Jeremy Jung about all things Supabase: building an API layer with postgREST, authentication using GoTrue, row-level security, forking open source projects, using the write ahead log to implement real time updates, provisioning and monitoring databases, user support, incidents, and open source licenses. [Listen to the podcast](https://www.se-radio.net/2022/05/episode-511-ant-wilson-on-supabase-postgres-as-a-service/).
|
||||
|
||||
[](https://www.se-radio.net/2022/05/episode-511-ant-wilson-on-supabase-postgres-as-a-service/)
|
||||
|
||||
## Supabase is Hiring for Sales Assist
|
||||
|
||||
There is an opportunity to work inside the growth team at Supabase. It's still a small team so you'd be getting in at the ground floor. If you love dev tools and are passionate about talking to customers, then you're who we're looking for! [Read the role spec here](https://boards.greenhouse.io/supabase/jobs/4530789004).
|
||||
|
||||
[](https://boards.greenhouse.io/supabase/jobs/4530789004)
|
||||
|
||||
## Partner Showcase
|
||||
|
||||
### Deepnote
|
||||
|
||||
Deepnote is a data notebook that’s built for collaboration — Jupyter compatible, works magically in the cloud, and sharing is as easy as sending a link.
|
||||
|
||||
You can connect your Supabase Postgres Database to your Deepnote notebooks to quickly analyze data and share your findings with others. [Check out the guide](https://docs.deepnote.com/integrations/supabase).
|
||||
|
||||
[](https://docs.deepnote.com/integrations/supabase)
|
||||
|
||||
## Made with Supabase
|
||||
|
||||
### Polypane
|
||||
|
||||
A browser that help you design, build and test better websites. Who doesn't want that? [Polypane](https://polypane.app/) helps with responsive design, accessibility, SEO, performance, design accuracy, semantic HTML, social media tags... and everything else. Built by: [@kilianvalkhof](https://twitter.com/kilianvalkhof).
|
||||
|
||||
[](https://polypane.app/)
|
||||
|
||||
### Pawternity Hub
|
||||
|
||||
[Pawternity Hub](https://pawternityhub.netlify.app/) is a Pet Adoption website where people can find local pets around their area to adopt. Started in a hackathon while brainstorming ideas to help the community, it was built with React and Bootstrap and uses the PetFinder API. Built by [@NathanJoSuarez](https://twitter.com/NathanJoSuarez).
|
||||
|
||||
[](https://pawternityhub.netlify.app/)
|
||||
|
||||
Discover other projects: Made with Supabase
|
||||
|
||||
## Issue Bounties
|
||||
|
||||
- Fix: [crash in aws sdk](https://issuehunt.io/r/supabase/storage-api/issues/141)
|
||||
|
||||
## Quick Product Updates
|
||||
|
||||
- Fix: [Added reuse interval for token refresh](https://github.com/supabase/gotrue/pull/466)
|
||||
|
||||
## Community Highlights
|
||||
|
||||
- Morrow is looking for a full Senior Full Stack TypeScript Developer (Supabase Focus): [Job post](https://jobs.themorrow.digital/24826)
|
||||
- The StackOverflow podcast with Matt and Cassidoo talking about Supabase’s Series B and open source. [Podcast](https://stackoverflow.blog/2022/05/17/open-source-is-winning-over-developers-and-investors-ep-442/)
|
||||
- Migrate your MySQL database to Postgres with Supabase, Hasura & pgloader. [Blog](https://medium.com/@adi_myth/migrate-your-mysql-database-to-postgres-with-supabase-hasura-pgloader-3ef63bedd38)
|
||||
- Here’s Why You Should Ditch MongoDB and Switch to Supabase. [Blog](https://javascript.plainenglish.io/heres-why-you-should-ditch-mongodb-and-switch-to-supabase-374b43f4ebc2)
|
||||
- What is Supabase? [Video](https://www.youtube.com/watch?v=v2W7QJMMIA0)
|
||||
- Anima converted Supabase’s Social Auth component into a native Figma component, with over 400 variants. [Link](https://unruffled-hoover-de9320.netlify.app/?path=/story/auth-auth--with-coloured-social-auth&args=socialLayout:horizontal)
|
||||
- How To Build A Nuxt 3 Ionic Capacitor Starter App, Supabase Setup and Authentication. [Blog](https://dev.to/aaronksaunders/how-to-build-a-nuxt-3-ionic-capacitor-starter-app-supabase-setup-and-authentication-3gd0)
|
||||
- How to create and test a GitHub Action that generates Supabase database types. [Blog](https://dev.to/lyqht/how-to-create-and-test-a-github-action-that-generates-supabase-database-types-1l6b)
|
||||
|
||||
## Supabase GitHub
|
||||
|
||||
We hit 49K stars!!: [repository.surf/supabase](https://repository.surf/supabase)
|
||||
|
||||
[](https://repository.surf/supabase)
|
||||
|
||||
## Meme Zone
|
||||
|
||||
If you made it this far in the blog post you deserve a treat. [Follow us on Twitter](https://twitter.com/supabase) for more.
|
||||
|
||||
[](https://twitter.com/supabase)
|
||||
|
||||
## Get started with Supabase
|
||||
|
||||
- Start using Supabase today: **[app.supabase.com](https://app.supabase.com/)**
|
||||
- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
|
||||
- Follow us **[on Twitter](https://twitter.com/supabase)**
|
||||
- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
|
||||
- Become a **[sponsor](https://github.com/sponsors/supabase)**
|
||||
- Join the **[team](https://about.supabase.com/careers)**
|
||||
Loaded 100 of 578 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user