From e1a4dcd3bb927fb3cfb7964036956f3dc2556616 Mon Sep 17 00:00:00 2001 From: Paul Copplestone Date: Wed, 1 Sep 2021 22:23:03 +0800 Subject: [PATCH] plucking the key changes from other PR --- web/docs/about.md | 37 ---- web/docs/about.mdx | 131 ++++++++++++ web/docs/architecture.mdx | 17 ++ web/docs/guides/auth.mdx | 192 +++++++++++------- web/docs/guides/database.mdx | 13 +- web/docs/guides/platform.mdx | 3 +- web/docs/guides/self-hosting.mdx | 4 +- web/sidebars.js | 21 +- web/static/img/libraries/c-sharp-icon.svg | 1 + web/static/img/libraries/dart-icon.svg | 32 +++ web/static/img/libraries/expo-icon.svg | 1 + web/static/img/libraries/javascript-icon.svg | 1 + web/static/img/libraries/kotlin-icon.svg | 1 + web/static/img/libraries/nestjs-icon.svg | 19 ++ web/static/img/libraries/nextjs-icon.svg | 3 + web/static/img/libraries/nextjs.svg | Bin 0 -> 3054 bytes web/static/img/libraries/python-icon.svg | 113 +++++++++++ web/static/img/libraries/react-icon.svg | 37 ++++ .../img/libraries/react-native-icon.svg | 37 ++++ web/static/img/libraries/rust-icon.svg | 2 + web/static/img/libraries/svelte-icon.svg | 20 ++ web/static/img/libraries/vuejs-icon.svg | 2 + 22 files changed, 551 insertions(+), 136 deletions(-) delete mode 100755 web/docs/about.md create mode 100755 web/docs/about.mdx create mode 100755 web/docs/architecture.mdx create mode 100644 web/static/img/libraries/c-sharp-icon.svg create mode 100644 web/static/img/libraries/dart-icon.svg create mode 100644 web/static/img/libraries/expo-icon.svg create mode 100644 web/static/img/libraries/javascript-icon.svg create mode 100644 web/static/img/libraries/kotlin-icon.svg create mode 100644 web/static/img/libraries/nestjs-icon.svg create mode 100644 web/static/img/libraries/nextjs-icon.svg create mode 100644 web/static/img/libraries/nextjs.svg create mode 100644 web/static/img/libraries/python-icon.svg create mode 100644 web/static/img/libraries/react-icon.svg create mode 100644 web/static/img/libraries/react-native-icon.svg create mode 100644 web/static/img/libraries/rust-icon.svg create mode 100644 web/static/img/libraries/svelte-icon.svg create mode 100644 web/static/img/libraries/vuejs-icon.svg diff --git a/web/docs/about.md b/web/docs/about.md deleted file mode 100755 index 5392d8d84bd..00000000000 --- a/web/docs/about.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -id: about -title: About -description: 'What is Supabase?' -slug: / ---- - -## What it is - -Supabase is an open source Firebase alternative. We are a service to: - -- Listen to database changes. -- Query your tables, including filtering, pagination, and deeply nested relationships (like GraphQL). -- Create, update, and delete rows. -- Manage your users and their permissions. -- Interact with your database using a simple UI. - -## What it isn't - -Supabase is not a 1-to-1 mapping of Firebase. While we are building many of the features that Firebase offers, we are not going about it the same way. - -Our technological choices are quite different to Firebase. Everything we use is open source. Wherever possible, we use and support existing tools in the ecosystem, rather than developing from scratch. - -Most notably, we use Postgres rather than a NoSQL store. This was a deliberate choice. We believe that no other database on the market offers the scalability and functionality required to legitimately compete with Firebase. - -## How it works - -At its core, Supabase is a suite of open source tools, stitched together to build a seamless developer experience: - -![Supabase Architecture](/img/supabase-architecture.png) - -- [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. -- [postgres-meta](https://github.com/supabase/postgres-meta) is a RESTful API for managing your Postgres, allowing you to fetch tables, add roles, and run queries etc. -- [GoTrue](https://github.com/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. diff --git a/web/docs/about.mdx b/web/docs/about.mdx new file mode 100755 index 00000000000..9eb2a2ae602 --- /dev/null +++ b/web/docs/about.mdx @@ -0,0 +1,131 @@ +--- +id: about +title: Introduction +description: 'What is Supabase?' +slug: / +hide_table_of_contents: true +--- + +import Link from '@docusaurus/Link' +import Tabs from '@theme/Tabs' +import TabItem from '@theme/TabItem' +const frameworks = [ + { name: 'Angular', logo: '/img/libraries/dart-icon.svg', href: '/docs/guides/with-angular' }, + { + name: 'Cloudflare', + logo: '/img/libraries/dart-icon.svg', + href: 'https://github.com/supabase/supabase/tree/master/examples/with-cloudflare-workers', + }, + { + name: 'Expo', + logo: '/img/libraries/expo-icon.svg', + href: 'https://github.com/supabase/supabase/tree/master/examples/expo-todo-list', + }, + { name: 'Flutter', logo: '/img/libraries/dart-icon.svg', href: '/docs/guides/with-flutter' }, + { name: 'Next.js', logo: '/img/libraries/nextjs-icon.svg', href: '/docs/guides/with-nextjs' }, + { name: 'React', logo: '/img/libraries/react-icon.svg', href: '/docs/guides/with-react' }, + { name: 'Svelte', logo: '/img/libraries/svelte-icon.svg', href: '/docs/guides/with-svelte' }, + { name: 'Vue', logo: '/img/libraries/vuejs-icon.svg', href: '/docs/guides/with-vue-3' }, +] + +Supabase is an open source Firebase alternative. + +It's provides all the backend services you need to build a product. You can use it completely, or just the services you require: + +
+
+ {/* Database */} +
+ +
+

Database

+

A dedicated, scalable Postgres database.

+
+ +
+ {/* Auth */} +
+ +
+

Auth

+

User management with Row Level Security.

+
+ +
+ {/* Auth */} +
+ +
+

File Storage

+

Store, organize, and serve large files.

+
+ +
+ {/* API */} +
+ +
+

Auto-generated APIs

+

Instantly APIs for your database.

+
+ +
+
+
+ +## Getting started + +Visit [app.supabase.io](https://app.supabase.io) to get started with the hosted platform or visit the [self-hosting](/docs/guides/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. + +
+
+ {frameworks.map((x) => ( +
+ +
+ {x.logo && {x.name}} +

{x.name}

+
+ +
+ ))} +
+
+ +## How to use these docs + +The documentation is divided into 3 sections. + +
+
+ {/* Overview */} +
+ +
+

Overview

+

A summary of the tools and how to get started.

+
+ +
+ {/* Auth */} +
+ +
+

Guides

+

In-depth explainations for each tool.

+
+ +
+ {/* Ref */} +
+ +
+

Reference Docs

+

Technical documentation for Client Libraries and Systems.

+
+ +
+
+
diff --git a/web/docs/architecture.mdx b/web/docs/architecture.mdx new file mode 100755 index 00000000000..22cf34e8535 --- /dev/null +++ b/web/docs/architecture.mdx @@ -0,0 +1,17 @@ +--- +id: architecture +title: Architecture +description: 'Supabase design and architecture' +# hide_table_of_contents: true +--- + +Supabase is open source. Wherever possible, we use and support existing tools rather than developing from scratch. +We choose open source tools which are scalable and we make them simple to use. + +![Supabase Architecture](/img/supabase-architecture.png) + +Supabase is not a 1-to-1 mapping of Firebase. While we are building many of the features that Firebase offers, we are not going about it the same way. + +Our technological choices are quite different to Firebase. Everything we use is open source. Wherever possible, we use and support existing tools in the ecosystem, rather than developing from scratch. + +Most notably, we use Postgres rather than a NoSQL store. This was a deliberate choice. We believe that no other database on the market offers the scalability and functionality required to legitimately compete with Firebase. \ No newline at end of file diff --git a/web/docs/guides/auth.mdx b/web/docs/guides/auth.mdx index 8fd47316bd9..1298484a113 100644 --- a/web/docs/guides/auth.mdx +++ b/web/docs/guides/auth.mdx @@ -4,57 +4,112 @@ title: Auth description: Use Supabase to Authenticate and Authorize your users. --- +import Link from '@docusaurus/Link' +import Tabs from '@theme/Tabs' +import TabItem from '@theme/TabItem' +const providers = [ + { + name: 'Apple', + // logo: '/img/libraries/dart-icon.svg', + href: '/docs/guides/auth/auth-apple', + }, + { + name: 'Bitbucket', + // logo: '/img/libraries/dart-icon.svg', + href: '/docs/guides/auth/auth-bitbucket', + }, + { + name: 'Discord', + // logo: '/img/libraries/dart-icon.svg', + href: '/docs/guides/auth/discord', + }, + { + name: 'Facebook', + // logo: '/img/libraries/dart-icon.svg', + href: '/docs/guides/auth/auth-facebook', + }, + { + name: 'GitHub', + // logo: '/img/libraries/dart-icon.svg', + href: '/docs/guides/auth/auth-github', + }, + { + name: 'GitLab', + // logo: '/img/libraries/dart-icon.svg', + href: '/docs/guides/auth/auth-gitlab', + }, + { + name: 'Google', + // logo: '/img/libraries/dart-icon.svg', + href: '/docs/guides/docs/guides/auth/auth-google', + }, + { + name: 'Twitter', + // logo: '/img/libraries/dart-icon.svg', + href: '/docs/guides/auth/auth-twitter', + }, + { + name: 'Twitch', + // logo: '/img/libraries/dart-icon.svg', + href: '/docs/guides/auth/auth-twitch', + }, + { + name: 'Twilio', + // logo: '/img/libraries/dart-icon.svg', + href: '/docs/guides/auth/auth-twilio', + }, +] + ## User Management Supabase makes it simple to manage your users. When users sign up, Supabase assigns them a unique ID. You can reference this ID anywhere in your database. For example, you might create a `profiles` table referencing the user using a `user_id` field. -Supabase provides the routes to [sign up](/docs/reference/javascript/auth-signup), [log in](/docs/reference/javascript/auth-signin), +Supabase provides the routes to [sign up](/docs/reference/javascript/auth-signup), [log in](/docs/reference/javascript/auth-signin), [log out](/docs/reference/javascript/auth-signout), and manage users in your apps and websites. - ## Third Party Logins We currently support the following OAuth providers: -- Google -- GitHub -- GitLab -- Azure -- Facebook -- Bitbucket -- Twitter -- Apple (See [this guide](https://medium.com/identity-beyond-borders/how-to-configure-sign-in-with-apple-77c61e336003) to generate an Apple `client_secret`) -![OAuth Logins.](/img/supabase-oauth-logins.png) +
+
+ {providers.map((x) => ( +
+ +
+ {x.logo && {x.name}} +

{x.name}

+
+ +
+ ))} +
+
You can enable providers by navigating to Authentication > Settings > External OAuth Providers and inputting your `Client ID` and `Secret` for each. -To fetch these, you need to: - -1. Generate `Client ID` and `Secret` ([Google](https://console.developers.google.com/apis/credentials), [GitHub](https://github.com/settings/applications/new), [GitLab](https://gitlab.com/oauth/applications), [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/use-oauth-on-bitbucket-cloud/), [Apple](https://developer.apple.com/account/ios/certificate), [Twitter](https://developer.twitter.com/en/portal/projects-and-apps) ). -2. Enter Authorized Redirect URI: `https://.supabase.co/auth/v1/callback` on provider dashboard. - +![OAuth Logins.](/img/supabase-oauth-logins.png) ## Row Level Security Authentication only gets you so far. When you need granular authorization rules, nothing beats PostgreSQL's [Row Level Security (RLS)](https://www.postgresql.org/docs/current/ddl-rowsecurity.html). Supabase makes it simple to turn RLS on and off. - ## Policies -[Policies](https://www.postgresql.org/docs/current/sql-createpolicy.html) are PostgreSQL's rule engine. They are incredibly powerful and flexible, allowing you to write complex SQL rules which fit your unique business needs. +[Policies](https://www.postgresql.org/docs/current/sql-createpolicy.html) are PostgreSQL's rule engine. They are incredibly powerful and flexible, allowing you to write complex SQL rules which fit your unique business needs. - - -### Full list of extensions - -Supabase is pre-configured with over 50 extensions. You can also install your own SQL extensions directly into the database through our SQL editor. - - - +[Learn more](/docs/guides/database/extensions) about all the extensions provided on Supabase. ## Tips diff --git a/web/docs/guides/platform.mdx b/web/docs/guides/platform.mdx index ef13ae8ba1b..9919207606d 100644 --- a/web/docs/guides/platform.mdx +++ b/web/docs/guides/platform.mdx @@ -1,7 +1,6 @@ --- id: platform -title: Getting started -sidebar_label: Introduction +title: Platform description: Getting started with the Supabase platform. --- diff --git a/web/docs/guides/self-hosting.mdx b/web/docs/guides/self-hosting.mdx index 983a7f05420..cf81e187d0b 100644 --- a/web/docs/guides/self-hosting.mdx +++ b/web/docs/guides/self-hosting.mdx @@ -7,6 +7,8 @@ description: How to use configure and deploy Supabase. Supabase is a [Hosted Platform](https://app.supabase.io), so you don't _have_ to deploy it yourself. However, if you want to configure and deploy it yourself, that's also possible. +![Supabase Architecture](/img/supabase-architecture.png) + ## Before you begin The self-hosted version of Supabase does not include a UI yet. @@ -25,7 +27,7 @@ In the meantime, here are some suggestions for working with your Postgres Databa We provide a Docker Compose directory which is includes all of the tools required for building on top of Supabase. -You can download the Docker files like so: +Download the Docker files: ```bash # 1. Copy an empty repo diff --git a/web/sidebars.js b/web/sidebars.js index b41ed776223..af85d54856e 100755 --- a/web/sidebars.js +++ b/web/sidebars.js @@ -33,37 +33,29 @@ module.exports = { docs: [ { type: 'category', - label: 'Introduction', - items: ['about', 'faq'], - collapsed: false, - }, - { - type: 'category', - label: 'Getting Started', - collapsed: false, + label: 'Overview', items: [ - 'guides/platform', + 'about', + 'architecture', 'guides/database', 'guides/auth', 'guides/storage', 'guides/api', - 'guides/client-libraries', - 'guides/local-development', + 'guides/examples', ], + collapsed: false, }, { type: 'category', label: 'Tutorials', collapsed: false, items: [ - 'guides/examples', 'guides/with-angular', 'guides/with-flutter', 'guides/with-nextjs', 'guides/with-react', 'guides/with-svelte', 'guides/with-vue-3', - 'guides/self-hosting', ], }, { @@ -71,6 +63,7 @@ module.exports = { label: 'See Also', collapsed: false, items: [ + 'faq', 'handbook/contributing', 'handbook/supasquad', 'company/terms', @@ -83,7 +76,7 @@ module.exports = { { type: 'category', label: 'Guides', - items: ['guides'], + items: ['guides', 'guides/platform', 'guides/local-development', 'guides/self-hosting'], collapsed: false, }, { diff --git a/web/static/img/libraries/c-sharp-icon.svg b/web/static/img/libraries/c-sharp-icon.svg new file mode 100644 index 00000000000..5f58f928629 --- /dev/null +++ b/web/static/img/libraries/c-sharp-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/static/img/libraries/dart-icon.svg b/web/static/img/libraries/dart-icon.svg new file mode 100644 index 00000000000..7fdd552a41e --- /dev/null +++ b/web/static/img/libraries/dart-icon.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/web/static/img/libraries/expo-icon.svg b/web/static/img/libraries/expo-icon.svg new file mode 100644 index 00000000000..e4deeadf133 --- /dev/null +++ b/web/static/img/libraries/expo-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/static/img/libraries/javascript-icon.svg b/web/static/img/libraries/javascript-icon.svg new file mode 100644 index 00000000000..1f203d35ed6 --- /dev/null +++ b/web/static/img/libraries/javascript-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/static/img/libraries/kotlin-icon.svg b/web/static/img/libraries/kotlin-icon.svg new file mode 100644 index 00000000000..93fee789273 --- /dev/null +++ b/web/static/img/libraries/kotlin-icon.svg @@ -0,0 +1 @@ +icon_Kotlin \ No newline at end of file diff --git a/web/static/img/libraries/nestjs-icon.svg b/web/static/img/libraries/nestjs-icon.svg new file mode 100644 index 00000000000..6deb3ed54ee --- /dev/null +++ b/web/static/img/libraries/nestjs-icon.svg @@ -0,0 +1,19 @@ + + + + + + diff --git a/web/static/img/libraries/nextjs-icon.svg b/web/static/img/libraries/nextjs-icon.svg new file mode 100644 index 00000000000..99afa3413d3 --- /dev/null +++ b/web/static/img/libraries/nextjs-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/static/img/libraries/nextjs.svg b/web/static/img/libraries/nextjs.svg new file mode 100644 index 0000000000000000000000000000000000000000..843612152bbffda0d660e91d2cb28271d2d80e58 GIT binary patch literal 3054 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 literal 0 HcmV?d00001 diff --git a/web/static/img/libraries/python-icon.svg b/web/static/img/libraries/python-icon.svg new file mode 100644 index 00000000000..366f52f3393 --- /dev/null +++ b/web/static/img/libraries/python-icon.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/web/static/img/libraries/react-icon.svg b/web/static/img/libraries/react-icon.svg new file mode 100644 index 00000000000..88860de5722 --- /dev/null +++ b/web/static/img/libraries/react-icon.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + diff --git a/web/static/img/libraries/react-native-icon.svg b/web/static/img/libraries/react-native-icon.svg new file mode 100644 index 00000000000..88860de5722 --- /dev/null +++ b/web/static/img/libraries/react-native-icon.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + diff --git a/web/static/img/libraries/rust-icon.svg b/web/static/img/libraries/rust-icon.svg new file mode 100644 index 00000000000..b486919ff05 --- /dev/null +++ b/web/static/img/libraries/rust-icon.svg @@ -0,0 +1,2 @@ + +Rust programming language logoimage/svg+xml diff --git a/web/static/img/libraries/svelte-icon.svg b/web/static/img/libraries/svelte-icon.svg new file mode 100644 index 00000000000..4bf279659a9 --- /dev/null +++ b/web/static/img/libraries/svelte-icon.svg @@ -0,0 +1,20 @@ + + + + + + + diff --git a/web/static/img/libraries/vuejs-icon.svg b/web/static/img/libraries/vuejs-icon.svg new file mode 100644 index 00000000000..a1d285eb2a1 --- /dev/null +++ b/web/static/img/libraries/vuejs-icon.svg @@ -0,0 +1,2 @@ + +