diff --git a/apps/docs/components/CustomHTMLElements/Heading.tsx b/apps/docs/components/CustomHTMLElements/Heading.tsx index 9d427e79b99..336dba4d0f7 100644 --- a/apps/docs/components/CustomHTMLElements/Heading.tsx +++ b/apps/docs/components/CustomHTMLElements/Heading.tsx @@ -26,7 +26,7 @@ interface Props { * * In tsx files, we can generate this tocList directly. For these files, we don't * need to parse the and generate anchors. Custom anchors are used in tsx files. - * (see: /pages/reference/cli/config.tsx) + * (see: /pages/guides/cli/config.tsx) */ const Heading: React.FC = ({ tag, customAnchor, children }) => { const HeadingTag = `${tag}` as any diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index f12d0ecd7f8..37803d4823b 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -568,6 +568,7 @@ export const database: NavMenuConstant = { { name: 'Implementing Cascade Deletes', url: '/guides/database/postgres/cascade-deletes' }, { name: 'Implementing column encryption', url: '/guides/database/column-encryption' }, { name: 'Partitioning your tables', url: '/guides/database/partitions' }, + { name: 'Query Optimization', url: '/guides/database/query-optimization' }, { name: 'Testing your database', url: '/guides/database/testing' }, { name: 'Managing Timeouts', url: '/guides/database/timeouts' }, { name: 'Managing Passwords', url: '/guides/database/managing-passwords' }, @@ -588,6 +589,10 @@ export const database: NavMenuConstant = { url: '/guides/database/extensions/plv8', }, { name: 'http: RESTful Client', url: '/guides/database/extensions/http' }, + { + name: 'index_advisor: Query optimization', + url: '/guides/database/extensions/index_advisor', + }, { name: 'PGAudit: Postgres Auditing', url: '/guides/database/extensions/pgaudit', @@ -1037,6 +1042,10 @@ export const supabase_cli: NavMenuConstant = { name: 'Testing and linting', url: '/guides/cli/testing-and-linting', }, + { + name: 'Customizing email templates', + url: '/guides/cli/customizing-email-templates', + }, ], }, { diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.tsx b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.tsx index 452eb693116..bb5b6035dbd 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.tsx +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.tsx @@ -95,7 +95,7 @@ const menus: Menu[] = [ }, { id: 'supabase_cli', - // TODO: Add path '/reference/cli/config' + // TODO: Add path '/guides/cli/config' path: '/guides/cli', type: 'guide', }, diff --git a/apps/docs/data/extensions.json b/apps/docs/data/extensions.json index 53c1c69b19e..96fb984b821 100644 --- a/apps/docs/data/extensions.json +++ b/apps/docs/data/extensions.json @@ -113,6 +113,12 @@ "tags": ["Admin", "Utility"], "link": "https://www.postgresql.org/docs/current/oldsnapshot.html" }, + { + "name": "index_advisor", + "comment": "optimize query performance with automatic index recommendation", + "tags": ["Utility"], + "link": "/guides/database/extensions/index_advisor" + }, { "name": "intarray", "comment": "functions, operators, and index support for 1-D arrays of integers", diff --git a/apps/docs/data/nav/supabase-cli.ts b/apps/docs/data/nav/supabase-cli.ts index 65a5bce9419..9eb1a91e66c 100644 --- a/apps/docs/data/nav/supabase-cli.ts +++ b/apps/docs/data/nav/supabase-cli.ts @@ -4,7 +4,7 @@ const Nav = [ items: [ { name: 'Supabase CLI', url: '/reference/cli', items: [] }, { name: 'Usage', url: '/reference/cli/usage', items: [] }, - { name: 'Configuration', url: '/reference/cli/config', items: [] }, + { name: 'Configuration', url: '/guides/cli/config', items: [] }, { name: 'Release Notes', url: '/reference/cli/release-notes', items: [] }, ], }, diff --git a/apps/docs/docs/ref/self-hosting-analytics/introduction.mdx b/apps/docs/docs/ref/self-hosting-analytics/introduction.mdx index 1158463ba48..b020dd6110b 100644 --- a/apps/docs/docs/ref/self-hosting-analytics/introduction.mdx +++ b/apps/docs/docs/ref/self-hosting-analytics/introduction.mdx @@ -20,92 +20,100 @@ When self-hosting the Analytics server, the full logging experience matching tha However, it's important to note that certain [differences](#differences) may arise due to the platform's infrastructure. - All logflare technical docs are available at - [https://docs.logflare.app](https://docs.logflare.app) + +All Logflare technical documentation is available at https://docs.logflare.app. + +## Backends Supported + +The Analytics server supports either **Postgres** or **BigQuery** as the backend. The `supabase-cli` experience uses the Postgres backend out-of-the-box. However, the Supabase Platform uses the BigQuery backend for storing all platform logs. + +When using the BigQuery backend, a BigQuery dataset is created in the provided Google Cloud project, and tables are created for each source. Log events are streamed into each table, and all queries generated by Studio or by the Logs Explorer are executed against the BigQuery API. This backend requires internet access to work, and cannot be run fully locally. + +When using the Postgres backend, tables are created for each source within the provided schema (for supabase-cli, this would be `_analytics`). Log events received by Logflare are inserted directly into the respective tables. All BigQuery-dialect SQL queries from Studio will be handled by a translation layer within the Analytics server. This translation layer translates the query to PostgreSQL dialect, and then executes it against the Postgres database. + +The Postgres backend is not yet optimized for a high volume of inserts, or for heavy query usage. Today the translation layer only handles a limited subset of the BigQuery dialect. As such, the [Log Explorer](https://supabase.com/docs/guides/platform/logs#logs-explorer) may produce errors for more advanced queries when using the Postgres Backend. + ## Getting Started -### Pre-requisites +The Postgres backend is recommended when familiarizing and experimenting with self-hosting Supabase. For production, we recommend using the BigQuery backend. See [production recommendations](#production-recommendations) for more information. -Currently the Analytics service supports two backends for ingestion: +To set up logging in self-hosted Supabase, see the [docker-compose example](https://github.com/supabase/supabase/tree/master/docker). +Two compose services are required: Logflare, and Vector. Logflare is the HTTP Analytics server, while Vector is the logging pipeline to route all compose services' syslog to the Logflare sever. -- Postgres ingestion -- Big Query ingestion +Regardless of the backend chosen, the following environment variables **must** be set for the `supabase/logflare` docker image: -### Postgres Ingestion Requirements +- `LOGFLARE_SINGLE_TENANT_MODE=true`: The feature flag for enabling single tenant mode for Logflare. Must be set to `true` +- `LOGFLARE_SUPABASE_MODE=true`: The feature flag for seeding Supabase-related data. Must be set to `true` -- Requires you to use supabase/logflare:1.3.26 or above -- Requires the following environment variables set: - - Required - POSTGRES_BACKEND_URL: `postgresql://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_HOST}:{POSTGRES_PORT}/{POSTGRES_DB}` - - Optional - POSTGRES_BACKEND_SCHEMA: `{SCHEMA_NAME}` +For all other configuration environment variables, please refer to the [Logflare self-hosting documentation](https://docs.logflare.app/self-hosting/#configuration). -### Big Query Ingestion Requirements +## Postgres Backend Setup -- Google Cloud Account with billing enabled -- Big Query enabled - -The remainder of the instructions are specified in the [Setup Big Query ingestion](#setup-big-query-ingestion) section. - -#### Setup Big Query ingestion - -Logflare currently requires BigQuery usage. You will need to create a Google Cloud project with billing enabled. - -The requirements are as follows after creating the project: - -- Project ID -- Project number -- A service account key - -##### Setting up BigQuery Service Account - -To ensure that you have sufficient permissions to insert into your Google Cloud BigQuery, ensure that you have created a service account with either: - -- BigQuery Admin role; or -- The following permissions: - - bigquery.datasets.create - - bigquery.datasets.get - - bigquery.datasets.getIamPolicy - - bigquery.datasets.update - - bigquery.jobs.create - - bigquery.routines.create - - bigquery.routines.update - - bigquery.tables.create - - bigquery.tables.delete - - bigquery.tables.get - - bigquery.tables.getData - - bigquery.tables.update - - bigquery.tables.updateData - -You can create the service account via the web console or `gcloud`, as per the [Google Cloud documentation](https://cloud.google.com/iam/docs/keys-create-delete). In the web console, you can create the key by navigating to IAM > Service Accounts > Actions (dropdown) > Manage Keys - -We recommend setting the BigQuery Admin role, as it simplifies permissions setup. - -##### Downloading the Service Account key - -After the service account is created, you will need to create a key for the service account. This key will sign the JWTs for API requests that the Analytics server makes with BigQuery. - -### Docker Compose - -For analytics to work we're adding two services: Logflare and Vector. - -Logflare is the analytics server that will ingest your logs into your preferred backend while Vector is the log router that will route all the docker logs using syslog unto Logflare. - -#### Using the Postgres Backend - -You can simply startup using the following command +The [example docker-compose](https://github.com/supabase/supabase/tree/master/docker) uses the Postgres backend out of the box. ```bash -# assuming you clone the supabase/supabase repo. +# clone the supabase/supabase repo, and run the following cd docker docker compose -f docker-compose.yml up ``` -> ⚠️ WARNING: Please be aware of the heavy consumption of analytics. For heavy usage you might want to consider the usage of a different database for analytics only by updating the `POSTGRES_BACKEND_URL` in the `analytics` service on the `docker-compose.yml` file. +### Configuration and Requirements -Also be aware that you won't be able to use [Log Explorer](https://supabase.com/docs/guides/platform/logs#logs-explorer) when using the Postgres Backend as some of the querying features are still not supported by our translation layer. +- `supabase/logflare:1.4.0` or above +- Relevant environment variables: + - `POSTGRES_BACKEND_URL` : Required. The connection string to the Postgres database. + - `POSTGRES_BACKEND_SCHEMA` : Optional. Allows customization of the schema used to scope all backend operations within the database. -#### Using the Big Query Backend +## BigQuery Backend Setup + +The BigQuery backend is a more robust and scalable backend option that is battle-tested and production ready. Use this backend if you intend to have heavy logging usage and require advanced querying features such as the Logs Explorer. + +### Configuration and Requirements + +The requirements are as follows after creating the project: + +- Google Cloud project with billing enabled +- Project ID +- Project number +- A service account key. + + + +You must enable billing on your Google Cloud project, as a valid billing account is required for streaming inserts. + + + +#### Setting up BigQuery Service Account + +The service account used must have sufficient permissions to insert into your Google Cloud BigQuery. Ensure that the service account has either: + +- BigQuery Admin role; or +- The following permissions: + - `bigquery.datasets.create` + - `bigquery.datasets.get` + - `bigquery.datasets.getIamPolicy` + - `bigquery.datasets.update` + - `bigquery.jobs.create` + - `bigquery.routines.create` + - `bigquery.routines.update` + - `bigquery.tables.create` + - `bigquery.tables.delete` + - `bigquery.tables.get` + - `bigquery.tables.getData` + - `bigquery.tables.update` + - `bigquery.tables.updateData` + +You can create the service account via the web console or `gcloud` CLI, as per the [Google Cloud documentation](https://cloud.google.com/iam/docs/keys-create-delete). In the web console, you can create the key by navigating to IAM > Service Accounts > Actions (dropdown) > Manage Keys + +We recommend setting the BigQuery Admin role, as it simplifies permissions setup. + +#### Download the Service Account Keys + +After the service account is created, you will need to create a key for the service account. This key will sign the JWTs for API requests that the Analytics server makes with BigQuery. This can be done through the IAM section in Google Cloud console. + +#### Docker Image Configuration Using the example [self-hosting stack based on docker-compose](https://github.com/supabase/supabase/tree/master/docker), you include the logging related services using the following command @@ -118,7 +126,7 @@ Using the example [self-hosting stack based on docker-compose](https://github.co 3. On `docker-compose.yml`, uncomment the block section below the commentary `# Uncomment to use Big Query backend for analytics` 4. On `docker-compose.yml`, comment the block section below the commentary `# Comment variables to use Big Query backend for analytics` -Thereafter, you can simply startup using the following command +Thereafter, you can start the example stack using the following command: ```bash # assuming you clone the supabase/supabase repo. @@ -126,55 +134,25 @@ cd docker docker compose -f docker-compose.yml ``` - - Read more about [self-hosting Logflare](https://docs.logflare.app/self-hosting) as your analytics - server. - +#### BigQuery Datset Storage Location -#### Vector Usage +Currently, all BigQuery datasets stored and managed by Analytics, whether via CLI or self-hosted, will default to the US region. -In the Docker Compose example, we utilize vector to coordinate the logging pipeline between the services. However, if you peer into the [vector configuration file](https://github.com/supabase/supabase/blob/master/docker/volumes/logs/vector.yml), you will be able to see that Vector sends logs to the Analytics ingestion endpoint. +## Vector Usage -If you need to customize the logging pipeline for your own needs, you must ensure that the payloads matches the expected event schema structure. Without the correct structure, it would cause the Studio Logs UI features to break. +In the Docker Compose example, Vector is used for the logging pipieline, where log events are forwarded to the Analytics API for ingestion. -### Standalone Docker Container +Please refer to the [Vector configuration file](https://github.com/supabase/supabase/blob/master/docker/volumes/logs/vector.yml) when customizing your own setup. -Supplementary technical documentation on self-hosting and using the `supabase/logflare` image for a full Logflare experience is available at the [official Logflare documentation](https://docs.logflare.app/self-hosting/). +You **must** ensure that the payloads matches the expected event schema structure. Without the correct structure, it would cause the Studio Logs UI features to break. -## Differences +## Differences from Platform API logs rely on Kong instead of the Supabase Cloud API Gateway. Logs from Kong are not enriched with platform-only data. Within the self-hosted setup, all logs are routed to Logflare via Vector. As Kong routes API requests to PostgREST, self-hosted or local deployments will result in Kong request logs instead. This would result in differences in the log event metadata between self-hosted API requests and Supabase Platform requests. -## Postgres - -Log event data is stored and queried from a Postgres database. - -Make sure to set the `POSTGRES_BACKEND_URL` environment variable. - -### Storage - -All data will be stored on the Postgres Database configured by setting `POSTGRES_BACKEND_URL` - -## BigQuery - -All log event data is stored in and queried from BigQuery. To use the Analytics server with Supabase you'll need a Google Cloud Platform account for access to BigQuery. - -Make sure to set the `GOOGLE_DATASET_ID_APPEND`, `GOOGLE_PROJECT_ID` and `GOOGLE_PROJECT_NUMBER` environment variables. - -Download your Google Cloud API JWT and store it under gcloud.json in your working directory. - - - You must also enable billing on your Google Cloud project, as the streaming inserts feature is - required. - - -### Storage Location - -Currently, all BigQuery datasets stored and managed by Analytics, whether via CLI or self-hosted, will default to the US region. - ## Production Recommendations To self-host in a production setting, we recommend performing the following for a better experience. @@ -194,6 +172,8 @@ The self-hosted example is only used as a minimal example on running the entire The current Postgres Ingestion backend isn't optimized for production usage. We recommend using Big Query for more heavy use cases. +**We recommend using the BigQuery backend for production environments as it offers better scaling and querying/debugging experiences.** + diff --git a/apps/docs/pages/guides/cli/customizing-email-templates.mdx b/apps/docs/pages/guides/cli/customizing-email-templates.mdx new file mode 100644 index 00000000000..4702b09ad72 --- /dev/null +++ b/apps/docs/pages/guides/cli/customizing-email-templates.mdx @@ -0,0 +1,124 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'customizing-email-templates', + title: 'Customizing email templates', + description: 'Customizing local email templates using config.toml.', + subtitle: 'Customizing local email templates using config.toml.', +} + +You can customize the email templates for local development [using the `config.toml` settings](/docs/guides/cli/config#auth-config). + +## Configuring Templates + +You should provide a relative URL to the `content_path` parameter, pointing to an HTML file which contains the template. For example + + + +```toml supabase/config.toml +[auth.email.template.invite] +subject = "You are invited to Acme Inc" +content_path = "./supabase/templates/invite.html" +``` + +```html supabase/templates/invite.html + + +

Confirm your signup

+

Confirm your email

+ + +``` + + + +## Available email templates + +There are several Auth email templates which can be configured: + +- `auth.email.template.invite` +- `auth.email.template.confirmation` +- `auth.email.template.recovery` +- `auth.email.template.magic_link` +- `auth.email.template.email_change` + +## Template variables + +The templating system provides the following variables for use: + +### ConfirmationURL + +Contains the confirmation URL. For example, a signup confirmation URL would look like: + +``` +https://project-ref.supabase.co/auth/v1/verify?token={{ .TokenHash }}&type=signup&redirect_to=https://example.com/path +``` + +**Usage** + +```html +

Click here to confirm: {{ .ConfirmationURL }}

+``` + +### Token + +Contains a 6-digit One-Time-Password (OTP) that can be used instead of the `ConfirmationURL`. + +**Usage** + +```html +

Here is your one time password: {{ .Token }}

+``` + +### TokenHash + +Contains a hashed version of the `Token`. This is useful for constructing your own email link in the email template. + +**Usage** + +```html +

Follow this link to confirm your user:

+

+ Confirm your email +

+``` + +### SiteURL + +Contains your application's Site URL. This can be configured in your project's [authentication settings](/dashboard/project/_/auth/url-configuration). + +**Usage** + +```html +

Visit here to log in.

+``` + +### Email + +Contains the user's email address. + +**Usage** + +```html +

A recovery request was sent to {{ .Email }}.

+``` + +### NewEmail + +Contains the new user's email address. This is only available in the `email_change` email template. + +**Usage** + +```html +

You are requesting to update your email address to {{ .NewEmail }}.

+``` + +## Deploying email templates + +These settings are only for local development. To update your hosted project, please copy the templates into the [Email Templates](/dashboard/project/_/auth/templates) section of the Dashboard. + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/cli/local-development.mdx b/apps/docs/pages/guides/cli/local-development.mdx index 57b4e5abf52..8c719d931be 100644 --- a/apps/docs/pages/guides/cli/local-development.mdx +++ b/apps/docs/pages/guides/cli/local-development.mdx @@ -364,12 +364,12 @@ Associate your project with your remote project using [`supabase link`](/docs/re supabase link --project-ref # You can get from your project's dashboard URL: https://supabase.com/dashboard/project/ -supabase db remote commit +supabase db pull # Capture any changes that you have made to your remote database before you went through the steps above # If you have not made any changes to the remote database, skip this step ``` -`supabase/migrations` is now populated with a migration in `..._remote_commit.sql`. +`supabase/migrations` is now populated with a migration in `_remote_schema.sql`. This migration captures any changes required for your local database to match the schema of your remote Supabase project. @@ -420,7 +420,7 @@ For these changes to take effect, you need to run `supabase stop` and `supabase If you have additional triggers or RLS policies defined on your `auth` schema, you can pull them as a migration file locally. ```bash -supabase db remote commit --schema auth +supabase db pull --schema auth ``` ### Local Logging diff --git a/apps/docs/pages/guides/cli/managing-config.mdx b/apps/docs/pages/guides/cli/managing-config.mdx index 1f93c9e52cf..d63eeafd81c 100644 --- a/apps/docs/pages/guides/cli/managing-config.mdx +++ b/apps/docs/pages/guides/cli/managing-config.mdx @@ -12,7 +12,7 @@ The Supabase CLI uses a `config.toml` file to manage local configuration. This f The `config.toml` file is automatically created when you run `supabase start`. -There are a wide variety of options available, which can be found in the [CLI Config Reference](/docs/reference/cli/config). +There are a wide variety of options available, which can be found in the [CLI Config Reference](/docs/guides/cli/config). For example, to enable the "Apple" OAuth provider for local development, you can append the following information to `config.toml`: diff --git a/apps/docs/pages/guides/cli/managing-environments.mdx b/apps/docs/pages/guides/cli/managing-environments.mdx index b20a4c5c5f1..59bd4ed51fe 100644 --- a/apps/docs/pages/guides/cli/managing-environments.mdx +++ b/apps/docs/pages/guides/cli/managing-environments.mdx @@ -38,10 +38,10 @@ If you're using an existing Supabase project, you might have made schema changes Run the following command to pull these changes before making local schema changes from the CLI: ```sql -supabase db remote commit +supabase db pull ``` -This command creates a new migration in `supabase/migrations/_remote_commit.sql` which reflects the schema changes you have made previously. +This command creates a new migration in `supabase/migrations/_remote_schema.sql` which reflects the schema changes you have made previously. Now commit your local changes to Git and run the local development setup: @@ -348,9 +348,9 @@ Once pushed, check that the migration version is up to date for both local and r supabase migration list ``` -### Permission denied on db remote commit +### Permission denied on db pull -If you have been using Supabase hosted projects for a long time, you might encounter the following permission error when executing `db remote commit`. +If you have been using Supabase hosted projects for a long time, you might encounter the following permission error when executing `db pull`. ```bash Error: Error running pg_dump on remote database: pg_dump: error: query failed: ERROR: permission denied for table _type diff --git a/apps/docs/pages/guides/database/extensions/index_advisor.mdx b/apps/docs/pages/guides/database/extensions/index_advisor.mdx new file mode 100644 index 00000000000..d155c36a49b --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/index_advisor.mdx @@ -0,0 +1,161 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'index-advisor', + title: 'index_advisor: query optimization', + description: 'Automatically optimize SQL queries', +} + +[Index advisor](https://github.com/supabase/index_advisor) is a Postgres extension for recommending indexes to improve query performance. + +For example: + +```sql +select + * +from + index_advisor('select book.id from book where title = $1'); + + startup_cost_before | startup_cost_after | total_cost_before | total_cost_after | index_statements | errors +---------------------+--------------------+-------------------+------------------+-----------------------------------------------------+-------- + 0.00 | 1.17 | 25.88 | 6.40 | {"CREATE INDEX ON public.book USING btree (title)"},| {} +(1 row) +``` + +Features: + +- Supports generic parameters e.g. `$1`, `$2` +- Supports materialized views +- Identifies tables/columns obfuscaed by views +- Skips duplicate indexes + +## Installation + +index_advisor is a trusted language extension, which means it is directly installable by users from the [database.dev](database.dev) SQL package repository. + +To get started, enable the dbdev client by executing the [setup SQL script](https://database.dev/installer). + +Then, install index_advisor by running + +```sql +select dbdev.install('olirice-index_advisor'); +create extension if not exists hypopg; +create extension "olirice-index_advisor"; +``` + +## API + +Index advisor exposes a single function `index_advisor(query text)` that accepts a query and searches for a set of SQL DDL `create index` statements that improve the query's execution time. + +The function's signature is: + +```sql +index_advisor(query text) +returns + table ( + startup_cost_before jsonb, + startup_cost_after jsonb, + total_cost_before jsonb, + total_cost_after jsonb, + index_statements text[], + errors text[] + ) +``` + +## Usage + +As a minimal example, the `index_advisor` function can be given a single table query with a filter on an unindexed column. + +```sql +create extension if not exists index_advisor cascade; + +create table book( + id int primary key, + title text not null +); + +select + * +from + index_advisor('select book.id from book where title = $1'); + + startup_cost_before | startup_cost_after | total_cost_before | total_cost_after | index_statements | errors +---------------------+--------------------+-------------------+------------------+-----------------------------------------------------+-------- + 0.00 | 1.17 | 25.88 | 6.40 | {"CREATE INDEX ON public.book USING btree (title)"},| {} +(1 row) +``` + +and will return a row recommending an index on the unindexed column. + +More complex queries may generate additional suggested indexes: + +```sql +create extension if not exists index_advisor cascade; + +create table author( + id serial primary key, + name text not null +); + +create table publisher( + id serial primary key, + name text not null, + corporate_address text +); + +create table book( + id serial primary key, + author_id int not null references author(id), + publisher_id int not null references publisher(id), + title text +); + +create table review( + id serial primary key, + book_id int references book(id), + body text not null +); + +select + * +from + index_advisor(' + select + book.id, + book.title, + publisher.name as publisher_name, + author.name as author_name, + review.body review_body + from + book + join publisher + on book.publisher_id = publisher.id + join author + on book.author_id = author.id + join review + on book.id = review.book_id + where + author.id = $1 + and publisher.id = $2 + '); + + startup_cost_before | startup_cost_after | total_cost_before | total_cost_after | index_statements | errors +---------------------+--------------------+-------------------+------------------+-----------------------------------------------------------+-------- + 27.26 | 12.77 | 68.48 | 42.37 | {"CREATE INDEX ON public.book USING btree (author_id)", | {} + "CREATE INDEX ON public.book USING btree (publisher_id)", + "CREATE INDEX ON public.review USING btree (book_id)"} +(3 rows) +``` + +## Limitations + +- index_advisor will only recommend single column, B-tree indexes. More complex indexes will be supported in future releases. +- when a generic argument's type is not discernible from context, an error is returned in the `errors` field. To resolve those errors, add explicit type casting to the argument. e.g. `$1::int`. + +## Resources + +- Official [`index_advisor` GitHub Repository](https://github.com/supabase/index_advisor) + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/database/query-optimization.mdx b/apps/docs/pages/guides/database/query-optimization.mdx new file mode 100644 index 00000000000..3176c49adaf --- /dev/null +++ b/apps/docs/pages/guides/database/query-optimization.mdx @@ -0,0 +1,134 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + title: 'Query Optimization', + description: 'Choosing indexes', + footerHelpType: 'postgres', +} + +When working with PostgreSQL, or any relational database, indexing is key to improving query performance. +Aligning indexes with common query patterns can speed up data retrieval by an order of magnitude. + +This guide is intended to: + +- help identify parts of a query that have the potential to be improved by indexes +- introduce tooling to help identify useful indexes + +This is not a comprehensive resource, but rather a helpful starting point for your optimization journey. + +If you're new to query optimization, you may be interested in [index_advisor](/docs/guides/database/extensions/index_advisor), our tool for automatically detecting indexes that improve performance on a given query. + +## Example Query + +Consider the following example query that retrieves customer names and purchase dates from two tables: + +```sql +select + a.name, + b.date_of_purchase +from + customers a + join orders b + on a.id = b.customer_id +where + a.sign_up_date > '2023-01-01' + and b.status = 'shipped' +order by + b.date_of_purchase; +limit 10 +``` + +In this query, there are several parts that indexes could likely help in optimizing the performance: + +### `where` Clause: + +The `where` clause filters rows based on certain conditions, and indexing the columns involved can improve this process: + +- `a.sign_up_date`: If filtering by `sign_up_date` is common, indexing this column can speed up the query. +- `b.status`: Indexing the status may be beneficial if the column has diverse values. + +```sql +create index idx_customers_sign_up_date on customers (sign_up_date); + +create index idx_orders_status on orders (status); +``` + +### `join` Columns + +Indexes on the columns used for joining tables can help Postgres avoid scanning tables in their entirety when connecting tables. + +- Indexing and `b.customer_id` would likely improve the performance of the join in this query. +- Note that if `a.id` is the primary key of the `customers` table it is already indexed + +```sql +create index idx_orders_customer_id on orders (customer_id); +``` + +### `order by` Clause + +Sorting can also be optimized by indexing: + +- An index on `b.date_of_purchase` wcan improve the sorting process, and is particularly beneficial when a subset of rows is being returned with a `limit` clause. + +```sql +create index idx_orders_date_of_purchase on orders (date_of_purchase); +``` + +## Key Concepts + +Here are some concepts and tools to keep in mind to help you identify the best index for the job, and measure the impact that your index had: + +### Analyze the Query Plan + +Use the `explain` command to understand the query's execution. Look for slow parts, such as Sequential Scans or high cost numbers. If creating an index does not reduce the cost of the query plan, remove it. + +For example: + +```sql +explain select * from customers where sign_up_date > 25; +``` + +### Use Appropriate Index Types + +PostgreSQL offers various index types like [B-tree, Hash, GIN, etc](https://www.postgresql.org/docs/current/indexes-types.html). Select the type that best suits your data and query pattern. Using the right index type can make a significant difference. For example, using a BRIN index on a field that always increases and lives within a table that updates infrequently - like `created_at` on an `orders` table - routinely results in indexes that are +10x smaller than the equivalent default B-tree index. That translates into better scalability. + +```sql +create index idx_orders_created_at ON customers using brin(created_at); +``` + +### Partial Indexes + +For queries that frequently target a subset of data, a partial index could be faster and smaller than indexing the entire column. A partial index contains a `where` clause to filter the values included in the index. Note that a query's `where` clause must match the index for it to be used. + +```sql +create index idx_orders_status on orders (status) +where status = 'shipped'; +``` + +### Composite Indexes + +If filtering or joining on multiple columns, a composite index prevents Postgres from referring to multiple indexes when identifying the relevant rows. + +```sql +create index idx_customers_sign_up_date_priority on customers (sign_up_date, priority); +``` + +### Over-Indexing + +Avoid the urge to index columns you operate on infrequently. While indexes can speed up reads, they also slow down writes, so it's important to balance those factors when making indexing decisions. + +### Statistics + +Postgres maintains a set of statistics about the contents of your tables. Those statistics are used by the query planner to decide when it's is more efficient to use an index vs scanning the entire table. If the collected statistics drift too far from reality, the query planner may make poor decisions. To avoid this risk, you can periodically `analyze` tables. + +```sql +analyze customers; +``` + +--- + +By following this guide, you'll be able to discern where indexes can optimize queries and enhance your PostgreSQL performance. Remember that each database is unique, so always consider the specific context and use case of your queries. + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/functions/cicd-workflow.mdx b/apps/docs/pages/guides/functions/cicd-workflow.mdx index 4827bde8473..b729044c17e 100644 --- a/apps/docs/pages/guides/functions/cicd-workflow.mdx +++ b/apps/docs/pages/guides/functions/cicd-workflow.mdx @@ -38,7 +38,7 @@ jobs: Since Supabase CLI [v1.62.0](https://github.com/supabase/cli/releases/tag/v1.62.0) you can deploy all functions with a single command. -Individual function configuration like [JWT verification](/docs/reference/cli/config#functions.function_name.verify_jwt) and [import map location](/docs/reference/cli/config#functions.function_name.import_map) can be set via the `config.toml` file. +Individual function configuration like [JWT verification](/docs/guides/cli/config#functions.function_name.verify_jwt) and [import map location](/docs/guides/cli/config#functions.function_name.import_map) can be set via the `config.toml` file. ```toml [functions.hello-world] diff --git a/apps/docs/pages/guides/functions/examples/github-actions.mdx b/apps/docs/pages/guides/functions/examples/github-actions.mdx index 7baf600b40d..d29fd6f1981 100644 --- a/apps/docs/pages/guides/functions/examples/github-actions.mdx +++ b/apps/docs/pages/guides/functions/examples/github-actions.mdx @@ -47,7 +47,7 @@ jobs: Since Supabase CLI [v1.62.0](https://github.com/supabase/cli/releases/tag/v1.62.0) you can deploy all functions with a single command. -Individual function configuration like [JWT verification](/docs/reference/cli/config#functions.function_name.verify_jwt) and [import map location](/docs/reference/cli/config#functions.function_name.import_map) can be set via the `config.toml` file. +Individual function configuration like [JWT verification](/docs/guides/cli/config#functions.function_name.verify_jwt) and [import map location](/docs/guides/cli/config#functions.function_name.import_map) can be set via the `config.toml` file. ```toml [functions.hello-world] diff --git a/apps/docs/pages/guides/functions/quickstart.mdx b/apps/docs/pages/guides/functions/quickstart.mdx index 14de4f79620..7c32c36db06 100644 --- a/apps/docs/pages/guides/functions/quickstart.mdx +++ b/apps/docs/pages/guides/functions/quickstart.mdx @@ -66,7 +66,7 @@ supabase functions deploy Since Supabase CLI [v1.62.0](https://github.com/supabase/cli/releases/tag/v1.62.0) you can deploy all functions with a single command. This is useful for example when [deploying with GitHub Actions](/docs/guides/functions/cicd-workflow). -Individual function configuration like [JWT verification](/docs/reference/cli/config#functions.function_name.verify_jwt) and [import map location](/docs/reference/cli/config#functions.function_name.import_map) can be set via the `config.toml` file. +Individual function configuration like [JWT verification](/docs/guides/cli/config#functions.function_name.verify_jwt) and [import map location](/docs/guides/cli/config#functions.function_name.import_map) can be set via the `config.toml` file. ```toml [functions.hello-world] diff --git a/apps/docs/public/.well-known/security.txt b/apps/docs/public/.well-known/security.txt index e21dd296c27..9b50057f0c7 100644 --- a/apps/docs/public/.well-known/security.txt +++ b/apps/docs/public/.well-known/security.txt @@ -17,6 +17,7 @@ Out of scope vulnerabilities: - Missing DNSSEC, CAA, CSP headers - Lack of Secure or HTTP only flag on non-sensitive cookies - Deadlinks +- User enumeration Please do the following: diff --git a/apps/docs/public/archive/supabase-dark-lw8.svg b/apps/docs/public/archive/supabase-dark-lw8.svg new file mode 100644 index 00000000000..020bdceabf4 --- /dev/null +++ b/apps/docs/public/archive/supabase-dark-lw8.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/docs/public/archive/supabase-dark.svg b/apps/docs/public/archive/supabase-dark.svg deleted file mode 100644 index 9e96fab4ddc..00000000000 --- a/apps/docs/public/archive/supabase-dark.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/docs/public/archive/supabase-light-lw8.svg b/apps/docs/public/archive/supabase-light-lw8.svg new file mode 100644 index 00000000000..7640c30020c --- /dev/null +++ b/apps/docs/public/archive/supabase-light-lw8.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/docs/public/archive/supabase-light.svg b/apps/docs/public/archive/supabase-light.svg deleted file mode 100644 index 60cbc71dc7c..00000000000 --- a/apps/docs/public/archive/supabase-light.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/docs/public/favicon/android-chrome-192x192.png b/apps/docs/public/favicon/android-chrome-192x192.png new file mode 100644 index 00000000000..c0ac2bb1cdb Binary files /dev/null and b/apps/docs/public/favicon/android-chrome-192x192.png differ diff --git a/apps/docs/public/favicon/android-chrome-512x512.png b/apps/docs/public/favicon/android-chrome-512x512.png new file mode 100644 index 00000000000..1bdeaa23bb8 Binary files /dev/null and b/apps/docs/public/favicon/android-chrome-512x512.png differ diff --git a/apps/docs/public/favicon/android-icon-144x144.png b/apps/docs/public/favicon/android-icon-144x144.png index e34cdc489bf..4aa46d4d25d 100644 Binary files a/apps/docs/public/favicon/android-icon-144x144.png and b/apps/docs/public/favicon/android-icon-144x144.png differ diff --git a/apps/docs/public/favicon/android-icon-192x192.png b/apps/docs/public/favicon/android-icon-192x192.png index 3779f7008a4..7583d2035e3 100644 Binary files a/apps/docs/public/favicon/android-icon-192x192.png and b/apps/docs/public/favicon/android-icon-192x192.png differ diff --git a/apps/docs/public/favicon/android-icon-36x36.png b/apps/docs/public/favicon/android-icon-36x36.png index 620f828d767..5e4eabec411 100644 Binary files a/apps/docs/public/favicon/android-icon-36x36.png and b/apps/docs/public/favicon/android-icon-36x36.png differ diff --git a/apps/docs/public/favicon/android-icon-48x48.png b/apps/docs/public/favicon/android-icon-48x48.png index 0918c9d5a5f..f8d8a7d9c05 100644 Binary files a/apps/docs/public/favicon/android-icon-48x48.png and b/apps/docs/public/favicon/android-icon-48x48.png differ diff --git a/apps/docs/public/favicon/android-icon-72x72.png b/apps/docs/public/favicon/android-icon-72x72.png index 83dfc47bd21..e4418058cef 100644 Binary files a/apps/docs/public/favicon/android-icon-72x72.png and b/apps/docs/public/favicon/android-icon-72x72.png differ diff --git a/apps/docs/public/favicon/android-icon-96x96.png b/apps/docs/public/favicon/android-icon-96x96.png index 5f1fda34086..0f1351f3670 100644 Binary files a/apps/docs/public/favicon/android-icon-96x96.png and b/apps/docs/public/favicon/android-icon-96x96.png differ diff --git a/apps/docs/public/favicon/apple-icon-114x114.png b/apps/docs/public/favicon/apple-icon-114x114.png index f32fa5c91e5..4aa46d4d25d 100644 Binary files a/apps/docs/public/favicon/apple-icon-114x114.png and b/apps/docs/public/favicon/apple-icon-114x114.png differ diff --git a/apps/docs/public/favicon/apple-icon-120x120.png b/apps/docs/public/favicon/apple-icon-120x120.png index f740816a889..d2b0e50ef41 100644 Binary files a/apps/docs/public/favicon/apple-icon-120x120.png and b/apps/docs/public/favicon/apple-icon-120x120.png differ diff --git a/apps/docs/public/favicon/apple-icon-144x144.png b/apps/docs/public/favicon/apple-icon-144x144.png index e34cdc489bf..00a5d8b5180 100644 Binary files a/apps/docs/public/favicon/apple-icon-144x144.png and b/apps/docs/public/favicon/apple-icon-144x144.png differ diff --git a/apps/docs/public/favicon/apple-icon-152x152.png b/apps/docs/public/favicon/apple-icon-152x152.png index 07dbf228a9a..310532c4648 100644 Binary files a/apps/docs/public/favicon/apple-icon-152x152.png and b/apps/docs/public/favicon/apple-icon-152x152.png differ diff --git a/apps/docs/public/favicon/apple-icon-180x180.png b/apps/docs/public/favicon/apple-icon-180x180.png index bf1bfbf7f00..2a80dbc2f68 100644 Binary files a/apps/docs/public/favicon/apple-icon-180x180.png and b/apps/docs/public/favicon/apple-icon-180x180.png differ diff --git a/apps/docs/public/favicon/apple-icon-57x57.png b/apps/docs/public/favicon/apple-icon-57x57.png index e24842ebed2..e7b08eb605f 100644 Binary files a/apps/docs/public/favicon/apple-icon-57x57.png and b/apps/docs/public/favicon/apple-icon-57x57.png differ diff --git a/apps/docs/public/favicon/apple-icon-60x60.png b/apps/docs/public/favicon/apple-icon-60x60.png index 7075a8eb8c5..0615675e809 100644 Binary files a/apps/docs/public/favicon/apple-icon-60x60.png and b/apps/docs/public/favicon/apple-icon-60x60.png differ diff --git a/apps/docs/public/favicon/apple-icon-72x72.png b/apps/docs/public/favicon/apple-icon-72x72.png index 83dfc47bd21..e4418058cef 100644 Binary files a/apps/docs/public/favicon/apple-icon-72x72.png and b/apps/docs/public/favicon/apple-icon-72x72.png differ diff --git a/apps/docs/public/favicon/apple-icon-76x76.png b/apps/docs/public/favicon/apple-icon-76x76.png index 283e804eee7..9a76327f94b 100644 Binary files a/apps/docs/public/favicon/apple-icon-76x76.png and b/apps/docs/public/favicon/apple-icon-76x76.png differ diff --git a/apps/docs/public/favicon/apple-icon-precomposed.png b/apps/docs/public/favicon/apple-icon-precomposed.png index 7d55e102305..7583d2035e3 100644 Binary files a/apps/docs/public/favicon/apple-icon-precomposed.png and b/apps/docs/public/favicon/apple-icon-precomposed.png differ diff --git a/apps/docs/public/favicon/apple-icon.png b/apps/docs/public/favicon/apple-icon.png index 7d55e102305..7583d2035e3 100644 Binary files a/apps/docs/public/favicon/apple-icon.png and b/apps/docs/public/favicon/apple-icon.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-114x114.png b/apps/docs/public/favicon/apple-touch-icon-114x114.png new file mode 100644 index 00000000000..4aa46d4d25d Binary files /dev/null and b/apps/docs/public/favicon/apple-touch-icon-114x114.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-120x120.png b/apps/docs/public/favicon/apple-touch-icon-120x120.png new file mode 100644 index 00000000000..d2b0e50ef41 Binary files /dev/null and b/apps/docs/public/favicon/apple-touch-icon-120x120.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-144x144.png b/apps/docs/public/favicon/apple-touch-icon-144x144.png new file mode 100644 index 00000000000..00a5d8b5180 Binary files /dev/null and b/apps/docs/public/favicon/apple-touch-icon-144x144.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-152x152.png b/apps/docs/public/favicon/apple-touch-icon-152x152.png new file mode 100644 index 00000000000..310532c4648 Binary files /dev/null and b/apps/docs/public/favicon/apple-touch-icon-152x152.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-57x57.png b/apps/docs/public/favicon/apple-touch-icon-57x57.png new file mode 100644 index 00000000000..1314e02c744 Binary files /dev/null and b/apps/docs/public/favicon/apple-touch-icon-57x57.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-60x60.png b/apps/docs/public/favicon/apple-touch-icon-60x60.png new file mode 100644 index 00000000000..0615675e809 Binary files /dev/null and b/apps/docs/public/favicon/apple-touch-icon-60x60.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-72x72.png b/apps/docs/public/favicon/apple-touch-icon-72x72.png new file mode 100644 index 00000000000..e4418058cef Binary files /dev/null and b/apps/docs/public/favicon/apple-touch-icon-72x72.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-76x76.png b/apps/docs/public/favicon/apple-touch-icon-76x76.png new file mode 100644 index 00000000000..9a76327f94b Binary files /dev/null and b/apps/docs/public/favicon/apple-touch-icon-76x76.png differ diff --git a/apps/docs/public/favicon/archive/lw8/android-icon-144x144.png b/apps/docs/public/favicon/archive/lw8/android-icon-144x144.png new file mode 100644 index 00000000000..e34cdc489bf Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/android-icon-144x144.png differ diff --git a/apps/docs/public/favicon/archive/lw8/android-icon-192x192.png b/apps/docs/public/favicon/archive/lw8/android-icon-192x192.png new file mode 100644 index 00000000000..3779f7008a4 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/android-icon-192x192.png differ diff --git a/apps/docs/public/favicon/archive/lw8/android-icon-36x36.png b/apps/docs/public/favicon/archive/lw8/android-icon-36x36.png new file mode 100644 index 00000000000..620f828d767 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/android-icon-36x36.png differ diff --git a/apps/docs/public/favicon/archive/lw8/android-icon-48x48.png b/apps/docs/public/favicon/archive/lw8/android-icon-48x48.png new file mode 100644 index 00000000000..0918c9d5a5f Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/android-icon-48x48.png differ diff --git a/apps/docs/public/favicon/archive/lw8/android-icon-72x72.png b/apps/docs/public/favicon/archive/lw8/android-icon-72x72.png new file mode 100644 index 00000000000..83dfc47bd21 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/android-icon-72x72.png differ diff --git a/apps/docs/public/favicon/archive/lw8/android-icon-96x96.png b/apps/docs/public/favicon/archive/lw8/android-icon-96x96.png new file mode 100644 index 00000000000..5f1fda34086 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/android-icon-96x96.png differ diff --git a/apps/docs/public/favicon/archive/lw8/apple-icon-114x114.png b/apps/docs/public/favicon/archive/lw8/apple-icon-114x114.png new file mode 100644 index 00000000000..f32fa5c91e5 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/apple-icon-114x114.png differ diff --git a/apps/docs/public/favicon/archive/lw8/apple-icon-120x120.png b/apps/docs/public/favicon/archive/lw8/apple-icon-120x120.png new file mode 100644 index 00000000000..f740816a889 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/apple-icon-120x120.png differ diff --git a/apps/docs/public/favicon/archive/lw8/apple-icon-144x144.png b/apps/docs/public/favicon/archive/lw8/apple-icon-144x144.png new file mode 100644 index 00000000000..e34cdc489bf Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/apple-icon-144x144.png differ diff --git a/apps/docs/public/favicon/archive/lw8/apple-icon-152x152.png b/apps/docs/public/favicon/archive/lw8/apple-icon-152x152.png new file mode 100644 index 00000000000..07dbf228a9a Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/apple-icon-152x152.png differ diff --git a/apps/docs/public/favicon/archive/lw8/apple-icon-180x180.png b/apps/docs/public/favicon/archive/lw8/apple-icon-180x180.png new file mode 100644 index 00000000000..bf1bfbf7f00 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/apple-icon-180x180.png differ diff --git a/apps/docs/public/favicon/archive/lw8/apple-icon-57x57.png b/apps/docs/public/favicon/archive/lw8/apple-icon-57x57.png new file mode 100644 index 00000000000..e24842ebed2 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/apple-icon-57x57.png differ diff --git a/apps/docs/public/favicon/archive/lw8/apple-icon-60x60.png b/apps/docs/public/favicon/archive/lw8/apple-icon-60x60.png new file mode 100644 index 00000000000..7075a8eb8c5 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/apple-icon-60x60.png differ diff --git a/apps/docs/public/favicon/archive/lw8/apple-icon-72x72.png b/apps/docs/public/favicon/archive/lw8/apple-icon-72x72.png new file mode 100644 index 00000000000..83dfc47bd21 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/apple-icon-72x72.png differ diff --git a/apps/docs/public/favicon/archive/lw8/apple-icon-76x76.png b/apps/docs/public/favicon/archive/lw8/apple-icon-76x76.png new file mode 100644 index 00000000000..283e804eee7 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/apple-icon-76x76.png differ diff --git a/apps/docs/public/favicon/archive/lw8/apple-icon-precomposed.png b/apps/docs/public/favicon/archive/lw8/apple-icon-precomposed.png new file mode 100644 index 00000000000..7d55e102305 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/apple-icon-precomposed.png differ diff --git a/apps/docs/public/favicon/archive/lw8/apple-icon.png b/apps/docs/public/favicon/archive/lw8/apple-icon.png new file mode 100644 index 00000000000..7d55e102305 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/apple-icon.png differ diff --git a/apps/docs/public/favicon/archive/lw8/favicon-16x16.png b/apps/docs/public/favicon/archive/lw8/favicon-16x16.png new file mode 100644 index 00000000000..9dc90100bf3 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/favicon-16x16.png differ diff --git a/apps/docs/public/favicon/archive/lw8/favicon-32x32.png b/apps/docs/public/favicon/archive/lw8/favicon-32x32.png new file mode 100644 index 00000000000..b8fd7965f93 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/favicon-32x32.png differ diff --git a/apps/docs/public/favicon/archive/lw8/favicon-96x96.png b/apps/docs/public/favicon/archive/lw8/favicon-96x96.png new file mode 100644 index 00000000000..408eebc96d7 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/favicon-96x96.png differ diff --git a/apps/docs/public/favicon/archive/lw8/favicon.ico b/apps/docs/public/favicon/archive/lw8/favicon.ico new file mode 100644 index 00000000000..97615df1d2d Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/favicon.ico differ diff --git a/apps/docs/public/favicon/archive/lw8/ms-icon-144x144.png b/apps/docs/public/favicon/archive/lw8/ms-icon-144x144.png new file mode 100644 index 00000000000..bcbff0884b1 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/ms-icon-144x144.png differ diff --git a/apps/docs/public/favicon/archive/lw8/ms-icon-150x150.png b/apps/docs/public/favicon/archive/lw8/ms-icon-150x150.png new file mode 100644 index 00000000000..c61ccd6bc02 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/ms-icon-150x150.png differ diff --git a/apps/docs/public/favicon/archive/lw8/ms-icon-310x310.png b/apps/docs/public/favicon/archive/lw8/ms-icon-310x310.png new file mode 100644 index 00000000000..474d2d508f4 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/ms-icon-310x310.png differ diff --git a/apps/docs/public/favicon/archive/lw8/ms-icon-70x70.png b/apps/docs/public/favicon/archive/lw8/ms-icon-70x70.png new file mode 100644 index 00000000000..c0f3a66542c Binary files /dev/null and b/apps/docs/public/favicon/archive/lw8/ms-icon-70x70.png differ diff --git a/apps/docs/public/favicon/favicon-128.png b/apps/docs/public/favicon/favicon-128.png new file mode 100644 index 00000000000..d5dca345802 Binary files /dev/null and b/apps/docs/public/favicon/favicon-128.png differ diff --git a/apps/docs/public/favicon/favicon-16x16.png b/apps/docs/public/favicon/favicon-16x16.png index 9dc90100bf3..fa07282ee8d 100644 Binary files a/apps/docs/public/favicon/favicon-16x16.png and b/apps/docs/public/favicon/favicon-16x16.png differ diff --git a/apps/docs/public/favicon/favicon-196x196.png b/apps/docs/public/favicon/favicon-196x196.png new file mode 100644 index 00000000000..adb05b43453 Binary files /dev/null and b/apps/docs/public/favicon/favicon-196x196.png differ diff --git a/apps/docs/public/favicon/favicon-32x32.png b/apps/docs/public/favicon/favicon-32x32.png index b8fd7965f93..7fa29c547a6 100644 Binary files a/apps/docs/public/favicon/favicon-32x32.png and b/apps/docs/public/favicon/favicon-32x32.png differ diff --git a/apps/docs/public/favicon/favicon-96x96.png b/apps/docs/public/favicon/favicon-96x96.png index 408eebc96d7..0f1351f3670 100644 Binary files a/apps/docs/public/favicon/favicon-96x96.png and b/apps/docs/public/favicon/favicon-96x96.png differ diff --git a/apps/docs/public/favicon/favicon.ico b/apps/docs/public/favicon/favicon.ico index 97615df1d2d..5c4d1dcc5cf 100644 Binary files a/apps/docs/public/favicon/favicon.ico and b/apps/docs/public/favicon/favicon.ico differ diff --git a/apps/docs/public/favicon/ms-icon-144x144.png b/apps/docs/public/favicon/ms-icon-144x144.png index bcbff0884b1..00a5d8b5180 100644 Binary files a/apps/docs/public/favicon/ms-icon-144x144.png and b/apps/docs/public/favicon/ms-icon-144x144.png differ diff --git a/apps/docs/public/favicon/ms-icon-150x150.png b/apps/docs/public/favicon/ms-icon-150x150.png index c61ccd6bc02..4de1d9b1cc1 100644 Binary files a/apps/docs/public/favicon/ms-icon-150x150.png and b/apps/docs/public/favicon/ms-icon-150x150.png differ diff --git a/apps/docs/public/favicon/ms-icon-310x310.png b/apps/docs/public/favicon/ms-icon-310x310.png index 474d2d508f4..7ea95ae09c0 100644 Binary files a/apps/docs/public/favicon/ms-icon-310x310.png and b/apps/docs/public/favicon/ms-icon-310x310.png differ diff --git a/apps/docs/public/favicon/ms-icon-70x70.png b/apps/docs/public/favicon/ms-icon-70x70.png index c0f3a66542c..48f6391fcdc 100644 Binary files a/apps/docs/public/favicon/ms-icon-70x70.png and b/apps/docs/public/favicon/ms-icon-70x70.png differ diff --git a/apps/docs/public/favicon/mstile-144x144.png b/apps/docs/public/favicon/mstile-144x144.png new file mode 100644 index 00000000000..00a5d8b5180 Binary files /dev/null and b/apps/docs/public/favicon/mstile-144x144.png differ diff --git a/apps/docs/public/favicon/mstile-150x150.png b/apps/docs/public/favicon/mstile-150x150.png new file mode 100644 index 00000000000..4de1d9b1cc1 Binary files /dev/null and b/apps/docs/public/favicon/mstile-150x150.png differ diff --git a/apps/docs/public/favicon/mstile-310x150.png b/apps/docs/public/favicon/mstile-310x150.png new file mode 100644 index 00000000000..b1121df62aa Binary files /dev/null and b/apps/docs/public/favicon/mstile-310x150.png differ diff --git a/apps/docs/public/favicon/mstile-310x310.png b/apps/docs/public/favicon/mstile-310x310.png new file mode 100644 index 00000000000..7ea95ae09c0 Binary files /dev/null and b/apps/docs/public/favicon/mstile-310x310.png differ diff --git a/apps/docs/public/favicon/mstile-70x70.png b/apps/docs/public/favicon/mstile-70x70.png new file mode 100644 index 00000000000..d5dca345802 Binary files /dev/null and b/apps/docs/public/favicon/mstile-70x70.png differ diff --git a/apps/docs/public/img/supabase-logo-wordmark--dark.png b/apps/docs/public/img/supabase-logo-wordmark--dark.png index 6b3fe698337..391cbd1e9b0 100644 Binary files a/apps/docs/public/img/supabase-logo-wordmark--dark.png and b/apps/docs/public/img/supabase-logo-wordmark--dark.png differ diff --git a/apps/docs/public/img/supabase-logo-wordmark--dark.svg b/apps/docs/public/img/supabase-logo-wordmark--dark.svg index 020bdceabf4..9e96fab4ddc 100644 --- a/apps/docs/public/img/supabase-logo-wordmark--dark.svg +++ b/apps/docs/public/img/supabase-logo-wordmark--dark.svg @@ -1,27 +1,23 @@ - - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - diff --git a/apps/docs/public/img/supabase-logo-wordmark--light.png b/apps/docs/public/img/supabase-logo-wordmark--light.png index a01f8c96dd8..2b369e1372e 100644 Binary files a/apps/docs/public/img/supabase-logo-wordmark--light.png and b/apps/docs/public/img/supabase-logo-wordmark--light.png differ diff --git a/apps/docs/public/img/supabase-logo-wordmark--light.svg b/apps/docs/public/img/supabase-logo-wordmark--light.svg index 7640c30020c..60cbc71dc7c 100644 --- a/apps/docs/public/img/supabase-logo-wordmark--light.svg +++ b/apps/docs/public/img/supabase-logo-wordmark--light.svg @@ -1,27 +1,23 @@ - - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - diff --git a/apps/docs/public/supabase-dark.svg b/apps/docs/public/supabase-dark.svg index 020bdceabf4..9e96fab4ddc 100644 --- a/apps/docs/public/supabase-dark.svg +++ b/apps/docs/public/supabase-dark.svg @@ -1,27 +1,23 @@ - - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - diff --git a/apps/docs/public/supabase-light.svg b/apps/docs/public/supabase-light.svg index 7640c30020c..60cbc71dc7c 100644 --- a/apps/docs/public/supabase-light.svg +++ b/apps/docs/public/supabase-light.svg @@ -1,27 +1,23 @@ - - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - diff --git a/apps/www/_blog/2023-08-09-supabase-studio-3-0.mdx b/apps/www/_blog/2023-08-09-supabase-studio-3-0.mdx index 4a79f060d79..061e1c9639b 100644 --- a/apps/www/_blog/2023-08-09-supabase-studio-3-0.mdx +++ b/apps/www/_blog/2023-08-09-supabase-studio-3-0.mdx @@ -59,11 +59,19 @@ Today, we're releasing a huge improvement to our SQL Editor. First up, we've add Supabase AI is aware of the SQL snippet in the editor and can modify it for you. You can ask it to change `customers` to `customer_orders`, for example. You can interact with the code the same way you would converse with ChatGPT until it's just right. -Create a table +Create a table Next, we've added a diff view for changes that Supabase AI makes to your SQL snippet. You can tell Supabase AI what you want changed, and visualize it as you would a Git diff. From this view, you can accept or reject the diffs, and keep asking Supabase AI to make changes until you're satisfied. -Create a table diff +Create a table diff We've wondered for a long time how to make it easier to teach developers how to use SQL. It's fortunate we didn't solve this problem too quickly, as it turns out that AI does a much better job than we could do ourselves. @@ -110,7 +118,11 @@ Massive thanks to [HTMHell](https://github.com/HTMHell) (amazing handle btw) for Speaking of commonly requested features, this one has to be in the all-time top 5. Your beautiful, hand-crafted SQL snippets used to be yours and yours alone. Now you can share them with team members and let them bask in your technical prowess. -Share SQL Snippets +Share SQL Snippets You can create a set of project-wide snippets for doing common tasks, making it faster to collaborate and build. To share a snippet, just take a personal snippet that ~~Supabase AI~~ you wrote and share it with the project. It will show up in a new Project Snippets list that's visible to everyone on the team. diff --git a/apps/www/_blog/2023-08-10-using-supabase-with-vercel.mdx b/apps/www/_blog/2023-08-10-using-supabase-with-vercel.mdx index 867c4b07920..21606166b4a 100644 --- a/apps/www/_blog/2023-08-10-using-supabase-with-vercel.mdx +++ b/apps/www/_blog/2023-08-10-using-supabase-with-vercel.mdx @@ -25,7 +25,10 @@ Our new [Vercel Integration](https://vercel.com/integrations/supabase-v2) stream You can now [link multiple](https://app.supabase.com/org/_/integrations) Vercel projects to a single Supabase project: -![Vercel in the Supabase dashboard](/images/blog/launch-week-8/day-4/vercel-dashboard.png) +Vercel in the Supabase dashboard Previously we mapped each Vercel project to a single Supabase project. With this release, we're introducing the concept of project 'Connections'. Supabase projects can have an unlimited number of Vercel Connections. This is especially useful for monorepos using [Turborepo](https://turbo.build/). @@ -33,7 +36,7 @@ Previously we mapped each Vercel project to a single Supabase project. With this We've improved the way we manage your Supabase environment variables. -![Vercel config](/images/blog/launch-week-8/day-4/vercel-config.png) +Vercel config Supabase keeps each of your Vercel Projects updated with Environment Variables, managing your secrets (like `service-role-key`) and public variables (like `supabase-url`). @@ -76,7 +79,7 @@ After Vercel has deployed the app, it works without any additional configuration We announced Database Branching on [Tuesday](/blog/supabase-local-dev#branching-and-preview-environments). We've designed this to work perfectly with Vercel's Preview Deployments. -![Vercel config](/images/blog/launch-week-8/day-4/supabase-vercel-branching.png) +Vercel branching For now, Branching in Supabase is limited to development partners. We'll be rolling it out to everyone over the coming months. If you're interested in testing the new features, [sign up for early access](https://forms.supabase.com/branching-request). diff --git a/apps/www/components/LaunchWeek/8/AnimatedParticles/ParticlesCanvas.tsx b/apps/www/components/LaunchWeek/8/AnimatedParticles/ParticlesCanvas.tsx index d30c96261f5..c9879188f24 100644 --- a/apps/www/components/LaunchWeek/8/AnimatedParticles/ParticlesCanvas.tsx +++ b/apps/www/components/LaunchWeek/8/AnimatedParticles/ParticlesCanvas.tsx @@ -72,7 +72,7 @@ const ParticlesCanvas = () => { className="relative z-30" > - + {particles?.map((user: any, index: number) => ( { >
- Join us daily at Twitter Spaces - Friday – Day 5 + Twitter Spaces + Replay recordings
@@ -37,13 +37,9 @@ const LW8CalloutsSection = () => {
-
-
-
-
LW8 Hackathon Aug 4 – Aug 13
- Read more about rules and prizes on the blog + Finished
diff --git a/apps/www/components/LaunchWeek/8/LWArchive.tsx b/apps/www/components/LaunchWeek/8/LWArchive.tsx index 3456a49ebfc..aad42232934 100644 --- a/apps/www/components/LaunchWeek/8/LWArchive.tsx +++ b/apps/www/components/LaunchWeek/8/LWArchive.tsx @@ -3,62 +3,47 @@ import { StyledArticleBadge } from './Releases/components' import Image from 'next/image' import Link from 'next/link' -import { Swiper, SwiperSlide } from 'swiper/react' - -import 'swiper/swiper.min.css' - -const launchweeks = [ - { title: '7', link: '/launchweek/7' }, - { title: '6', link: '/launchweek/6' }, - { title: '5', link: '/blog/launch-week-5-hackathon' }, - { title: '4', link: '/blog/supabase-launch-week-four' }, - { title: '3', link: '/blog/supabase-launch-week-the-trilogy' }, - { title: '2', link: '/blog/supabase-launch-week-sql' }, - { title: '1', link: '/blog/launch-week' }, -] - const LWArchive = () => { return ( -
-
+
+
Throwback

Previous Launch Weeks

- Explore what has been announced in the past and relive those moments. + Explore our past Launch Weeks, and check the progress we've made on our journey.

-
- - {launchweeks.map((launchweek, i) => ( - - - - - {launchweek.title} - - - - - ))} - +
) diff --git a/apps/www/components/LaunchWeek/8/LaunchWeekLogoHeader.tsx b/apps/www/components/LaunchWeek/8/LaunchWeekLogoHeader.tsx index d66950f72d1..df14b669215 100644 --- a/apps/www/components/LaunchWeek/8/LaunchWeekLogoHeader.tsx +++ b/apps/www/components/LaunchWeek/8/LaunchWeekLogoHeader.tsx @@ -5,8 +5,11 @@ export function LaunchWeekLogoHeader() {

Launch week 8

August 7th–11th, 2023 - 9:00 AM PT

+
+

A week of announcing new features has come to an end.

+

Thanks to everyone who participated.

+
) diff --git a/apps/www/components/LaunchWeek/8/LaunchWeekPrizeSection.tsx b/apps/www/components/LaunchWeek/8/LaunchWeekPrizeSection.tsx index b59b35da825..7ad927cddea 100644 --- a/apps/www/components/LaunchWeek/8/LaunchWeekPrizeSection.tsx +++ b/apps/www/components/LaunchWeek/8/LaunchWeekPrizeSection.tsx @@ -37,12 +37,7 @@ export default function LaunchWeekPrizeSection({ quality={100} />
-

Get your winning ticket

-

- Join us on August 11th for Launch Week 8's final day -
and find out if you are one of the lucky - winners. Get sharing! -

+

Swag has been delivered

{ticket && } diff --git a/apps/www/components/LaunchWeek/8/Releases/LWAnnouncement.tsx b/apps/www/components/LaunchWeek/8/Releases/LWAnnouncement.tsx index 9b9a07036c3..8c2d369ce80 100644 --- a/apps/www/components/LaunchWeek/8/Releases/LWAnnouncement.tsx +++ b/apps/www/components/LaunchWeek/8/Releases/LWAnnouncement.tsx @@ -2,8 +2,8 @@ import React from 'react' import { SmallCard } from './components' import Link from 'next/link' import Image from 'next/image' -import days from './lw8_data' -import { ExpandableVideo } from 'ui' +// import days from './lw8_data' +// import { ExpandableVideo } from 'ui' const LWAnnouncement = ({ title, @@ -12,46 +12,30 @@ const LWAnnouncement = ({ title?: string isLaunchWeekPage?: boolean }) => { - const [_pre, _d1, _d2, _d3, _d4, currentDay] = days + // const [_pre, _d1, _d2, _d3, _d4, currentDay] = days const announcement = ( <>
-
- - - -
- {title ?? 'Launch Week 8: Day 5'} + Launch Week 8
- {currentDay.steps[0].title} + Explore all the announcements
-
+ {/*
-
+
*/} Youtube video thumbnail @@ -59,12 +43,12 @@ const LWAnnouncement = ({ ) - const handleClick = () => { - if (typeof document === 'undefined') return null - const today = document.getElementById('today') - if (!today) return - window.scrollTo({ top: today?.offsetTop + today?.offsetHeight, left: 0, behavior: 'smooth' }) - } + // const handleClick = () => { + // if (typeof document === 'undefined') return null + // const today = document.getElementById('today') + // if (!today) return + // window.scrollTo({ top: today?.offsetTop + today?.offsetHeight, left: 0, behavior: 'smooth' }) + // } return (
@@ -72,7 +56,7 @@ const LWAnnouncement = ({ className="border hover:border-scale-800 transition-colors" innerClassName="bg-opacity-70 items-stretch" > - {isLaunchWeekPage ? ( + {/* {isLaunchWeekPage ? ( } /> - ) : ( - - - {announcement} - - - )} + ) : ( */} + + + {announcement} + + + {/* )} */}
) diff --git a/apps/www/components/LaunchWeek/8/Releases/components/index.tsx b/apps/www/components/LaunchWeek/8/Releases/components/index.tsx index 038bb8c1e6b..36e7b188038 100644 --- a/apps/www/components/LaunchWeek/8/Releases/components/index.tsx +++ b/apps/www/components/LaunchWeek/8/Releases/components/index.tsx @@ -225,12 +225,7 @@ export const AccordionHeader = ({ )} {shippable && shipped && youtube_id && ( -
+
)}
- {shippable && !shipped && ( + {/* {shippable && !shipped && ( } - )} + )} */}
) diff --git a/apps/www/components/ZoomableImg/ZoomContent.tsx b/apps/www/components/ZoomableImg/ZoomContent.tsx index d76a994efd4..8ba8a64ef18 100644 --- a/apps/www/components/ZoomableImg/ZoomContent.tsx +++ b/apps/www/components/ZoomableImg/ZoomContent.tsx @@ -8,6 +8,7 @@ any) => { [&_img]:rounded-md [&_img]:border [&_img]:bg-scale-100 + [&_img]:dark:bg-scale-200 `} > {img} diff --git a/apps/www/lib/mdx/mdxComponents.tsx b/apps/www/lib/mdx/mdxComponents.tsx index 6568225002b..92a7c63f8de 100644 --- a/apps/www/lib/mdx/mdxComponents.tsx +++ b/apps/www/lib/mdx/mdxComponents.tsx @@ -94,20 +94,14 @@ export default function mdxComponents(type?: 'blog' | 'lp' | undefined) { Img: ({ zoomable = true, ...props }: any) => (
- - {zoomable ? ( - - ) : ( - - )} + + {props.caption && ( diff --git a/apps/www/lib/redirects.js b/apps/www/lib/redirects.js index 0ff808fff5f..a47e3dbafde 100644 --- a/apps/www/lib/redirects.js +++ b/apps/www/lib/redirects.js @@ -1170,37 +1170,47 @@ module.exports = [ { permanent: true, source: '/docs/reference/cli/supabase-db-branch-list', - destination: '/docs/reference/supabase-db', + destination: '/docs/reference/supabase-branches-list', }, { permanent: true, source: '/docs/reference/cli/supabase-db-branch-create', - destination: '/docs/reference/supabase-db', + destination: '/docs/reference/supabase-branches-create', }, { permanent: true, source: '/docs/reference/cli/supabase-db-branch-delete', - destination: '/docs/reference/supabase-db', + destination: '/docs/reference/supabase-branches-delete', }, { permanent: true, source: '/docs/reference/cli/supabase-db-switch', - destination: '/docs/reference/supabase-db', + destination: '/docs/reference/supabase-branches-create', }, { permanent: true, source: '/docs/reference/cli/supabase-db-changes', - destination: '/docs/reference/supabase-db', + destination: '/docs/reference/supabase-db-diff', }, { permanent: true, source: '/docs/reference/cli/supabase-db-commit', - destination: '/docs/reference/supabase-db', + destination: '/docs/reference/supabase-db-pull', }, { permanent: true, source: '/docs/reference/cli/supabase-db-remote-set', - destination: '/docs/reference/supabase-db', + destination: '/docs/reference/supabase-link', + }, + { + permanent: true, + source: '/docs/reference/cli/supabase-db-remote-changes', + destination: '/docs/reference/supabase-db-diff', + }, + { + permanent: true, + source: '/docs/reference/cli/supabase-db-remote-commit', + destination: '/docs/reference/supabase-db-pull', }, { diff --git a/apps/www/pages/launch-week/index.tsx b/apps/www/pages/launch-week/index.tsx index c9dc7a474e8..2db9d1e58ea 100644 --- a/apps/www/pages/launch-week/index.tsx +++ b/apps/www/pages/launch-week/index.tsx @@ -14,7 +14,6 @@ import SectionContainer from '~/components/Layouts/SectionContainer' import { LaunchWeekLogoHeader } from '~/components/LaunchWeek/8/LaunchWeekLogoHeader' import { Meetup } from '~/components/LaunchWeek/8/LW8Meetups' import LW8CalloutsSection from '~/components/LaunchWeek/8/LW8CalloutsSection' -import LWAnnouncement from '~/components/LaunchWeek/8/Releases/LWAnnouncement' import { useTheme } from 'common/Providers' @@ -25,7 +24,7 @@ const AnimatedParticles = dynamic( ) const LW8Releases = dynamic(() => import('~/components/LaunchWeek/8/Releases')) const LW8Meetups = dynamic(() => import('~/components/LaunchWeek/8/LW8Meetups')) -const TicketContainer = dynamic(() => import('~/components/LaunchWeek/8/Ticket/TicketContainer')) +const LWArchive = dynamic(() => import('~/components/LaunchWeek/8/LWArchive')) const LaunchWeekPrizeSection = dynamic( () => import('~/components/LaunchWeek/8/LaunchWeekPrizeSection') ) @@ -142,7 +141,6 @@ export default function TicketHome({ users, meetups }: Props) {
-
@@ -183,20 +181,10 @@ export default function TicketHome({ users, meetups }: Props) { -
- {supabase && ( -
- -
- )} -
+ + + + diff --git a/apps/www/public/favicon/android-chrome-192x192.png b/apps/www/public/favicon/android-chrome-192x192.png new file mode 100644 index 00000000000..c0ac2bb1cdb Binary files /dev/null and b/apps/www/public/favicon/android-chrome-192x192.png differ diff --git a/apps/www/public/favicon/android-chrome-512x512.png b/apps/www/public/favicon/android-chrome-512x512.png new file mode 100644 index 00000000000..1bdeaa23bb8 Binary files /dev/null and b/apps/www/public/favicon/android-chrome-512x512.png differ diff --git a/apps/www/public/favicon/android-icon-144x144.png b/apps/www/public/favicon/android-icon-144x144.png index e34cdc489bf..4aa46d4d25d 100644 Binary files a/apps/www/public/favicon/android-icon-144x144.png and b/apps/www/public/favicon/android-icon-144x144.png differ diff --git a/apps/www/public/favicon/android-icon-192x192.png b/apps/www/public/favicon/android-icon-192x192.png index 3779f7008a4..7583d2035e3 100644 Binary files a/apps/www/public/favicon/android-icon-192x192.png and b/apps/www/public/favicon/android-icon-192x192.png differ diff --git a/apps/www/public/favicon/android-icon-36x36.png b/apps/www/public/favicon/android-icon-36x36.png index 620f828d767..5e4eabec411 100644 Binary files a/apps/www/public/favicon/android-icon-36x36.png and b/apps/www/public/favicon/android-icon-36x36.png differ diff --git a/apps/www/public/favicon/android-icon-48x48.png b/apps/www/public/favicon/android-icon-48x48.png index 0918c9d5a5f..f8d8a7d9c05 100644 Binary files a/apps/www/public/favicon/android-icon-48x48.png and b/apps/www/public/favicon/android-icon-48x48.png differ diff --git a/apps/www/public/favicon/android-icon-72x72.png b/apps/www/public/favicon/android-icon-72x72.png index 83dfc47bd21..e4418058cef 100644 Binary files a/apps/www/public/favicon/android-icon-72x72.png and b/apps/www/public/favicon/android-icon-72x72.png differ diff --git a/apps/www/public/favicon/android-icon-96x96.png b/apps/www/public/favicon/android-icon-96x96.png index 5f1fda34086..0f1351f3670 100644 Binary files a/apps/www/public/favicon/android-icon-96x96.png and b/apps/www/public/favicon/android-icon-96x96.png differ diff --git a/apps/www/public/favicon/apple-icon-114x114.png b/apps/www/public/favicon/apple-icon-114x114.png index f32fa5c91e5..4aa46d4d25d 100644 Binary files a/apps/www/public/favicon/apple-icon-114x114.png and b/apps/www/public/favicon/apple-icon-114x114.png differ diff --git a/apps/www/public/favicon/apple-icon-120x120.png b/apps/www/public/favicon/apple-icon-120x120.png index f740816a889..d2b0e50ef41 100644 Binary files a/apps/www/public/favicon/apple-icon-120x120.png and b/apps/www/public/favicon/apple-icon-120x120.png differ diff --git a/apps/www/public/favicon/apple-icon-144x144.png b/apps/www/public/favicon/apple-icon-144x144.png index e34cdc489bf..00a5d8b5180 100644 Binary files a/apps/www/public/favicon/apple-icon-144x144.png and b/apps/www/public/favicon/apple-icon-144x144.png differ diff --git a/apps/www/public/favicon/apple-icon-152x152.png b/apps/www/public/favicon/apple-icon-152x152.png index 07dbf228a9a..310532c4648 100644 Binary files a/apps/www/public/favicon/apple-icon-152x152.png and b/apps/www/public/favicon/apple-icon-152x152.png differ diff --git a/apps/www/public/favicon/apple-icon-180x180.png b/apps/www/public/favicon/apple-icon-180x180.png index bf1bfbf7f00..2a80dbc2f68 100644 Binary files a/apps/www/public/favicon/apple-icon-180x180.png and b/apps/www/public/favicon/apple-icon-180x180.png differ diff --git a/apps/www/public/favicon/apple-icon-57x57.png b/apps/www/public/favicon/apple-icon-57x57.png index e24842ebed2..e7b08eb605f 100644 Binary files a/apps/www/public/favicon/apple-icon-57x57.png and b/apps/www/public/favicon/apple-icon-57x57.png differ diff --git a/apps/www/public/favicon/apple-icon-60x60.png b/apps/www/public/favicon/apple-icon-60x60.png index 7075a8eb8c5..0615675e809 100644 Binary files a/apps/www/public/favicon/apple-icon-60x60.png and b/apps/www/public/favicon/apple-icon-60x60.png differ diff --git a/apps/www/public/favicon/apple-icon-72x72.png b/apps/www/public/favicon/apple-icon-72x72.png index 83dfc47bd21..e4418058cef 100644 Binary files a/apps/www/public/favicon/apple-icon-72x72.png and b/apps/www/public/favicon/apple-icon-72x72.png differ diff --git a/apps/www/public/favicon/apple-icon-76x76.png b/apps/www/public/favicon/apple-icon-76x76.png index 283e804eee7..9a76327f94b 100644 Binary files a/apps/www/public/favicon/apple-icon-76x76.png and b/apps/www/public/favicon/apple-icon-76x76.png differ diff --git a/apps/www/public/favicon/apple-icon-precomposed.png b/apps/www/public/favicon/apple-icon-precomposed.png index 7d55e102305..7583d2035e3 100644 Binary files a/apps/www/public/favicon/apple-icon-precomposed.png and b/apps/www/public/favicon/apple-icon-precomposed.png differ diff --git a/apps/www/public/favicon/apple-icon.png b/apps/www/public/favicon/apple-icon.png index 7d55e102305..7583d2035e3 100644 Binary files a/apps/www/public/favicon/apple-icon.png and b/apps/www/public/favicon/apple-icon.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-114x114.png b/apps/www/public/favicon/apple-touch-icon-114x114.png new file mode 100644 index 00000000000..4aa46d4d25d Binary files /dev/null and b/apps/www/public/favicon/apple-touch-icon-114x114.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-120x120.png b/apps/www/public/favicon/apple-touch-icon-120x120.png new file mode 100644 index 00000000000..d2b0e50ef41 Binary files /dev/null and b/apps/www/public/favicon/apple-touch-icon-120x120.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-144x144.png b/apps/www/public/favicon/apple-touch-icon-144x144.png new file mode 100644 index 00000000000..00a5d8b5180 Binary files /dev/null and b/apps/www/public/favicon/apple-touch-icon-144x144.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-152x152.png b/apps/www/public/favicon/apple-touch-icon-152x152.png new file mode 100644 index 00000000000..310532c4648 Binary files /dev/null and b/apps/www/public/favicon/apple-touch-icon-152x152.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-57x57.png b/apps/www/public/favicon/apple-touch-icon-57x57.png new file mode 100644 index 00000000000..1314e02c744 Binary files /dev/null and b/apps/www/public/favicon/apple-touch-icon-57x57.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-60x60.png b/apps/www/public/favicon/apple-touch-icon-60x60.png new file mode 100644 index 00000000000..0615675e809 Binary files /dev/null and b/apps/www/public/favicon/apple-touch-icon-60x60.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-72x72.png b/apps/www/public/favicon/apple-touch-icon-72x72.png new file mode 100644 index 00000000000..e4418058cef Binary files /dev/null and b/apps/www/public/favicon/apple-touch-icon-72x72.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-76x76.png b/apps/www/public/favicon/apple-touch-icon-76x76.png new file mode 100644 index 00000000000..9a76327f94b Binary files /dev/null and b/apps/www/public/favicon/apple-touch-icon-76x76.png differ diff --git a/apps/www/public/favicon/archive/lw8/android-icon-144x144.png b/apps/www/public/favicon/archive/lw8/android-icon-144x144.png new file mode 100644 index 00000000000..e34cdc489bf Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/android-icon-144x144.png differ diff --git a/apps/www/public/favicon/archive/lw8/android-icon-192x192.png b/apps/www/public/favicon/archive/lw8/android-icon-192x192.png new file mode 100644 index 00000000000..3779f7008a4 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/android-icon-192x192.png differ diff --git a/apps/www/public/favicon/archive/lw8/android-icon-36x36.png b/apps/www/public/favicon/archive/lw8/android-icon-36x36.png new file mode 100644 index 00000000000..620f828d767 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/android-icon-36x36.png differ diff --git a/apps/www/public/favicon/archive/lw8/android-icon-48x48.png b/apps/www/public/favicon/archive/lw8/android-icon-48x48.png new file mode 100644 index 00000000000..0918c9d5a5f Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/android-icon-48x48.png differ diff --git a/apps/www/public/favicon/archive/lw8/android-icon-72x72.png b/apps/www/public/favicon/archive/lw8/android-icon-72x72.png new file mode 100644 index 00000000000..83dfc47bd21 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/android-icon-72x72.png differ diff --git a/apps/www/public/favicon/archive/lw8/android-icon-96x96.png b/apps/www/public/favicon/archive/lw8/android-icon-96x96.png new file mode 100644 index 00000000000..5f1fda34086 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/android-icon-96x96.png differ diff --git a/apps/www/public/favicon/archive/lw8/apple-icon-114x114.png b/apps/www/public/favicon/archive/lw8/apple-icon-114x114.png new file mode 100644 index 00000000000..f32fa5c91e5 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/apple-icon-114x114.png differ diff --git a/apps/www/public/favicon/archive/lw8/apple-icon-120x120.png b/apps/www/public/favicon/archive/lw8/apple-icon-120x120.png new file mode 100644 index 00000000000..f740816a889 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/apple-icon-120x120.png differ diff --git a/apps/www/public/favicon/archive/lw8/apple-icon-144x144.png b/apps/www/public/favicon/archive/lw8/apple-icon-144x144.png new file mode 100644 index 00000000000..e34cdc489bf Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/apple-icon-144x144.png differ diff --git a/apps/www/public/favicon/archive/lw8/apple-icon-152x152.png b/apps/www/public/favicon/archive/lw8/apple-icon-152x152.png new file mode 100644 index 00000000000..07dbf228a9a Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/apple-icon-152x152.png differ diff --git a/apps/www/public/favicon/archive/lw8/apple-icon-180x180.png b/apps/www/public/favicon/archive/lw8/apple-icon-180x180.png new file mode 100644 index 00000000000..bf1bfbf7f00 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/apple-icon-180x180.png differ diff --git a/apps/www/public/favicon/archive/lw8/apple-icon-57x57.png b/apps/www/public/favicon/archive/lw8/apple-icon-57x57.png new file mode 100644 index 00000000000..e24842ebed2 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/apple-icon-57x57.png differ diff --git a/apps/www/public/favicon/archive/lw8/apple-icon-60x60.png b/apps/www/public/favicon/archive/lw8/apple-icon-60x60.png new file mode 100644 index 00000000000..7075a8eb8c5 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/apple-icon-60x60.png differ diff --git a/apps/www/public/favicon/archive/lw8/apple-icon-72x72.png b/apps/www/public/favicon/archive/lw8/apple-icon-72x72.png new file mode 100644 index 00000000000..83dfc47bd21 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/apple-icon-72x72.png differ diff --git a/apps/www/public/favicon/archive/lw8/apple-icon-76x76.png b/apps/www/public/favicon/archive/lw8/apple-icon-76x76.png new file mode 100644 index 00000000000..283e804eee7 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/apple-icon-76x76.png differ diff --git a/apps/www/public/favicon/archive/lw8/apple-icon-precomposed.png b/apps/www/public/favicon/archive/lw8/apple-icon-precomposed.png new file mode 100644 index 00000000000..7d55e102305 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/apple-icon-precomposed.png differ diff --git a/apps/www/public/favicon/archive/lw8/apple-icon.png b/apps/www/public/favicon/archive/lw8/apple-icon.png new file mode 100644 index 00000000000..7d55e102305 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/apple-icon.png differ diff --git a/apps/www/public/favicon/archive/lw8/favicon-16x16.png b/apps/www/public/favicon/archive/lw8/favicon-16x16.png new file mode 100644 index 00000000000..9dc90100bf3 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/favicon-16x16.png differ diff --git a/apps/www/public/favicon/archive/lw8/favicon-32x32.png b/apps/www/public/favicon/archive/lw8/favicon-32x32.png new file mode 100644 index 00000000000..b8fd7965f93 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/favicon-32x32.png differ diff --git a/apps/www/public/favicon/archive/lw8/favicon-96x96.png b/apps/www/public/favicon/archive/lw8/favicon-96x96.png new file mode 100644 index 00000000000..408eebc96d7 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/favicon-96x96.png differ diff --git a/apps/www/public/favicon/archive/lw8/favicon.ico b/apps/www/public/favicon/archive/lw8/favicon.ico new file mode 100644 index 00000000000..97615df1d2d Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/favicon.ico differ diff --git a/apps/www/public/favicon/archive/lw8/ms-icon-144x144.png b/apps/www/public/favicon/archive/lw8/ms-icon-144x144.png new file mode 100644 index 00000000000..bcbff0884b1 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/ms-icon-144x144.png differ diff --git a/apps/www/public/favicon/archive/lw8/ms-icon-150x150.png b/apps/www/public/favicon/archive/lw8/ms-icon-150x150.png new file mode 100644 index 00000000000..c61ccd6bc02 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/ms-icon-150x150.png differ diff --git a/apps/www/public/favicon/archive/lw8/ms-icon-310x310.png b/apps/www/public/favicon/archive/lw8/ms-icon-310x310.png new file mode 100644 index 00000000000..474d2d508f4 Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/ms-icon-310x310.png differ diff --git a/apps/www/public/favicon/archive/lw8/ms-icon-70x70.png b/apps/www/public/favicon/archive/lw8/ms-icon-70x70.png new file mode 100644 index 00000000000..c0f3a66542c Binary files /dev/null and b/apps/www/public/favicon/archive/lw8/ms-icon-70x70.png differ diff --git a/apps/www/public/favicon/favicon-128.png b/apps/www/public/favicon/favicon-128.png new file mode 100644 index 00000000000..d5dca345802 Binary files /dev/null and b/apps/www/public/favicon/favicon-128.png differ diff --git a/apps/www/public/favicon/favicon-16x16.png b/apps/www/public/favicon/favicon-16x16.png index 9dc90100bf3..fa07282ee8d 100644 Binary files a/apps/www/public/favicon/favicon-16x16.png and b/apps/www/public/favicon/favicon-16x16.png differ diff --git a/apps/www/public/favicon/favicon-196x196.png b/apps/www/public/favicon/favicon-196x196.png new file mode 100644 index 00000000000..adb05b43453 Binary files /dev/null and b/apps/www/public/favicon/favicon-196x196.png differ diff --git a/apps/www/public/favicon/favicon-32x32.png b/apps/www/public/favicon/favicon-32x32.png index b8fd7965f93..7fa29c547a6 100644 Binary files a/apps/www/public/favicon/favicon-32x32.png and b/apps/www/public/favicon/favicon-32x32.png differ diff --git a/apps/www/public/favicon/favicon-96x96.png b/apps/www/public/favicon/favicon-96x96.png index 408eebc96d7..0f1351f3670 100644 Binary files a/apps/www/public/favicon/favicon-96x96.png and b/apps/www/public/favicon/favicon-96x96.png differ diff --git a/apps/www/public/favicon/favicon.ico b/apps/www/public/favicon/favicon.ico index 97615df1d2d..5c4d1dcc5cf 100644 Binary files a/apps/www/public/favicon/favicon.ico and b/apps/www/public/favicon/favicon.ico differ diff --git a/apps/www/public/favicon/ms-icon-144x144.png b/apps/www/public/favicon/ms-icon-144x144.png index bcbff0884b1..00a5d8b5180 100644 Binary files a/apps/www/public/favicon/ms-icon-144x144.png and b/apps/www/public/favicon/ms-icon-144x144.png differ diff --git a/apps/www/public/favicon/ms-icon-150x150.png b/apps/www/public/favicon/ms-icon-150x150.png index c61ccd6bc02..4de1d9b1cc1 100644 Binary files a/apps/www/public/favicon/ms-icon-150x150.png and b/apps/www/public/favicon/ms-icon-150x150.png differ diff --git a/apps/www/public/favicon/ms-icon-310x310.png b/apps/www/public/favicon/ms-icon-310x310.png index 474d2d508f4..7ea95ae09c0 100644 Binary files a/apps/www/public/favicon/ms-icon-310x310.png and b/apps/www/public/favicon/ms-icon-310x310.png differ diff --git a/apps/www/public/favicon/ms-icon-70x70.png b/apps/www/public/favicon/ms-icon-70x70.png index c0f3a66542c..48f6391fcdc 100644 Binary files a/apps/www/public/favicon/ms-icon-70x70.png and b/apps/www/public/favicon/ms-icon-70x70.png differ diff --git a/apps/www/public/favicon/mstile-144x144.png b/apps/www/public/favicon/mstile-144x144.png new file mode 100644 index 00000000000..00a5d8b5180 Binary files /dev/null and b/apps/www/public/favicon/mstile-144x144.png differ diff --git a/apps/www/public/favicon/mstile-150x150.png b/apps/www/public/favicon/mstile-150x150.png new file mode 100644 index 00000000000..4de1d9b1cc1 Binary files /dev/null and b/apps/www/public/favicon/mstile-150x150.png differ diff --git a/apps/www/public/favicon/mstile-310x150.png b/apps/www/public/favicon/mstile-310x150.png new file mode 100644 index 00000000000..b1121df62aa Binary files /dev/null and b/apps/www/public/favicon/mstile-310x150.png differ diff --git a/apps/www/public/favicon/mstile-310x310.png b/apps/www/public/favicon/mstile-310x310.png new file mode 100644 index 00000000000..7ea95ae09c0 Binary files /dev/null and b/apps/www/public/favicon/mstile-310x310.png differ diff --git a/apps/www/public/favicon/mstile-70x70.png b/apps/www/public/favicon/mstile-70x70.png new file mode 100644 index 00000000000..d5dca345802 Binary files /dev/null and b/apps/www/public/favicon/mstile-70x70.png differ diff --git a/apps/www/public/images/launchweek/archive/lw6.jpg b/apps/www/public/images/launchweek/archive/lw6.jpg new file mode 100644 index 00000000000..c64bae219e9 Binary files /dev/null and b/apps/www/public/images/launchweek/archive/lw6.jpg differ diff --git a/apps/www/public/images/launchweek/archive/lw7.jpg b/apps/www/public/images/launchweek/archive/lw7.jpg new file mode 100644 index 00000000000..2c28a225357 Binary files /dev/null and b/apps/www/public/images/launchweek/archive/lw7.jpg differ diff --git a/apps/www/styles/index.css b/apps/www/styles/index.css index 20c211ab220..fff26b1ec50 100644 --- a/apps/www/styles/index.css +++ b/apps/www/styles/index.css @@ -782,12 +782,17 @@ launch week /* Zoomable image */ +[data-rmiz-modal]:focus, +[data-rmiz-modal-overlay]:focus { + outline: none !important; +} + [data-rmiz-modal-overlay], [data-rmiz-modal-img] { transition-timing-function: cubic-bezier(0.24, 0.25, 0.05, 1) !important; } [data-rmiz-modal-overlay='visible'] { - background-color: var(--colors-scale1) !important; + @apply !bg-scale-100 dark:!bg-scale-200; opacity: 0.8; } [data-rmiz-modal-img] { diff --git a/packages/common/assets/images/archive/supabase-logo-wordmark--dark-lw8.png b/packages/common/assets/images/archive/supabase-logo-wordmark--dark-lw8.png new file mode 100644 index 00000000000..6b3fe698337 Binary files /dev/null and b/packages/common/assets/images/archive/supabase-logo-wordmark--dark-lw8.png differ diff --git a/packages/common/assets/images/archive/supabase-logo-wordmark--dark-lw8.svg b/packages/common/assets/images/archive/supabase-logo-wordmark--dark-lw8.svg new file mode 100644 index 00000000000..020bdceabf4 --- /dev/null +++ b/packages/common/assets/images/archive/supabase-logo-wordmark--dark-lw8.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/common/assets/images/archive/supabase-logo-wordmark--dark.png b/packages/common/assets/images/archive/supabase-logo-wordmark--dark.png deleted file mode 100644 index 821c42ce283..00000000000 Binary files a/packages/common/assets/images/archive/supabase-logo-wordmark--dark.png and /dev/null differ diff --git a/packages/common/assets/images/archive/supabase-logo-wordmark--dark.svg b/packages/common/assets/images/archive/supabase-logo-wordmark--dark.svg deleted file mode 100644 index 9e96fab4ddc..00000000000 --- a/packages/common/assets/images/archive/supabase-logo-wordmark--dark.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/common/assets/images/archive/supabase-logo-wordmark--light-lw8.png b/packages/common/assets/images/archive/supabase-logo-wordmark--light-lw8.png new file mode 100644 index 00000000000..a01f8c96dd8 Binary files /dev/null and b/packages/common/assets/images/archive/supabase-logo-wordmark--light-lw8.png differ diff --git a/packages/common/assets/images/archive/supabase-logo-wordmark--light-lw8.svg b/packages/common/assets/images/archive/supabase-logo-wordmark--light-lw8.svg new file mode 100644 index 00000000000..7640c30020c --- /dev/null +++ b/packages/common/assets/images/archive/supabase-logo-wordmark--light-lw8.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/common/assets/images/archive/supabase-logo-wordmark--light.png b/packages/common/assets/images/archive/supabase-logo-wordmark--light.png deleted file mode 100644 index 0277fee2bbe..00000000000 Binary files a/packages/common/assets/images/archive/supabase-logo-wordmark--light.png and /dev/null differ diff --git a/packages/common/assets/images/archive/supabase-logo-wordmark--light.svg b/packages/common/assets/images/archive/supabase-logo-wordmark--light.svg deleted file mode 100644 index 60cbc71dc7c..00000000000 --- a/packages/common/assets/images/archive/supabase-logo-wordmark--light.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/common/assets/images/supabase-logo-wordmark--dark.png b/packages/common/assets/images/supabase-logo-wordmark--dark.png index 6b3fe698337..391cbd1e9b0 100644 Binary files a/packages/common/assets/images/supabase-logo-wordmark--dark.png and b/packages/common/assets/images/supabase-logo-wordmark--dark.png differ diff --git a/packages/common/assets/images/supabase-logo-wordmark--dark.svg b/packages/common/assets/images/supabase-logo-wordmark--dark.svg index 020bdceabf4..9e96fab4ddc 100644 --- a/packages/common/assets/images/supabase-logo-wordmark--dark.svg +++ b/packages/common/assets/images/supabase-logo-wordmark--dark.svg @@ -1,27 +1,23 @@ - - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - diff --git a/packages/common/assets/images/supabase-logo-wordmark--light.png b/packages/common/assets/images/supabase-logo-wordmark--light.png index a01f8c96dd8..2b369e1372e 100644 Binary files a/packages/common/assets/images/supabase-logo-wordmark--light.png and b/packages/common/assets/images/supabase-logo-wordmark--light.png differ diff --git a/packages/common/assets/images/supabase-logo-wordmark--light.svg b/packages/common/assets/images/supabase-logo-wordmark--light.svg index 7640c30020c..60cbc71dc7c 100644 --- a/packages/common/assets/images/supabase-logo-wordmark--light.svg +++ b/packages/common/assets/images/supabase-logo-wordmark--light.svg @@ -1,27 +1,23 @@ - - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - diff --git a/packages/ui/src/layout/banners/LW8CountdownBanner/LW8CountdownBanner.tsx b/packages/ui/src/layout/banners/LW8CountdownBanner/LW8CountdownBanner.tsx index 651acb2820f..e12413c5e65 100644 --- a/packages/ui/src/layout/banners/LW8CountdownBanner/LW8CountdownBanner.tsx +++ b/packages/ui/src/layout/banners/LW8CountdownBanner/LW8CountdownBanner.tsx @@ -1,6 +1,6 @@ import { useRouter } from 'next/router' import Lw8BannerBg from './Lw8BannerBg' -import VideoPreview from './VideoPreview' +// import VideoPreview from './VideoPreview' export function LW8CountdownBanner() { const { pathname } = useRouter() @@ -26,9 +26,9 @@ export function LW8CountdownBanner() { ].join(' ')} >

- Supabase Launch Week 8: Day 5 + Supabase Launch Week 8

- + {/* */}
diff --git a/packages/ui/src/layout/banners/LWAnnouncement.tsx b/packages/ui/src/layout/banners/LWAnnouncement.tsx index 01a9594a12e..c424722ad59 100644 --- a/packages/ui/src/layout/banners/LWAnnouncement.tsx +++ b/packages/ui/src/layout/banners/LWAnnouncement.tsx @@ -58,45 +58,23 @@ const LWAnnouncement = ({
-
- - - -
- Launch Week 8: Day 5 + Launch Week 8
- - Supabase Supavisor: 1M Postgres connections - + Explore all the announcements
-
+ {/*
-
+
*/} Youtube video thumbnail diff --git a/spec/cli_v1_commands.yaml b/spec/cli_v1_commands.yaml index 5d953ab7bd2..3f94d073f92 100644 --- a/spec/cli_v1_commands.yaml +++ b/spec/cli_v1_commands.yaml @@ -1,7 +1,7 @@ clispec: '001' info: id: cli - version: 1.82.2 + version: 1.86.1 title: Supabase CLI language: sh source: https://github.com/supabase/cli @@ -1191,7 +1191,7 @@ commands: To reset your migration history to a clean state, first delete your local migration file. ```bash - $ rm supabase/migrations/20230103054303_remote_commit.sql + $ rm supabase/migrations/20230103054303_remote_schema.sql $ supabase migration list LOCAL │ REMOTE │ TIME (UTC) ─────────────────┼────────────────┼────────────────────── @@ -2257,8 +2257,8 @@ commands: - supabase-db-diff - supabase-db-dump - supabase-db-lint + - supabase-db-pull - supabase-db-push - - supabase-db-remote - supabase-db-reset - supabase-db-start flags: [] @@ -2305,45 +2305,14 @@ commands: name: --linked description: Resets the linked project to current migrations. default_value: 'false' + - id: version + name: --version + description: Reset up to the specified version. + default_value: '' - id: db-url name: --db-url description: connect using the specified database url default_value: '' - - id: supabase-db-remote - title: supabase db remote - summary: Manage remote databases - tags: [] - links: [] - subcommands: - - supabase-db-remote-commit - flags: [] - - id: supabase-db-remote-commit - title: supabase db remote commit - summary: Commit remote changes as a new migration - description: |2 - - Pulls schema changes from a remote database and inserts a new row into the migration history table. - - Requires your local project to be linked to a remote database by running `supabase link`. For self-hosted databases, you can pass in the connection parameters using `--db-url` flag. - - If no entries exist in the migration history table, `pg_dump` will be used to capture all contents of the remote schemas you have created. After that, a new record will be inserted into the migration history table. Subsequent runs of this command will only diff schema changes against the remote database similar to `db diff --linked`. - tags: [] - links: [] - usage: supabase db remote commit - subcommands: [] - flags: - - id: db-url - name: --db-url - description: connect using the specified database url - default_value: '' - - id: password - name: -p, --password - description: Password to your remote Postgres database. - default_value: '' - - id: schema - name: -s, --schema - description: List of schema to include. - default_value: all - id: supabase-db-push title: supabase db push summary: Push new migrations to the remote database @@ -2408,6 +2377,35 @@ commands: name: --db-url description: connect using the specified database url default_value: '' + - id: supabase-db-pull + title: supabase db pull + summary: Pull schema from the remote database + description: |2 + + Pulls schema changes from a remote database. + + Requires your local project to be linked to a remote database by running `supabase link`. For self-hosted databases, you can pass in the connection parameters using `--db-url` flag. + + Optionally, a new row can be inserted into the migration history table to reflect the current state of the remote database. + + If no entries exist in the migration history table, `pg_dump` will be used to capture all contents of the remote schemas you have created. Otherwise, this command will only diff schema changes against the remote database, similar to running `db diff --linked`. + tags: [] + links: [] + usage: supabase db pull [flags] + subcommands: [] + flags: + - id: password + name: -p, --password + description: Password to your remote Postgres database. + default_value: '' + - id: schema + name: -s, --schema + description: List of schema to include. + default_value: all + - id: db-url + name: --db-url + description: connect using the specified database url + default_value: '' - id: supabase-db-lint title: supabase db lint summary: Checks local database for typing error @@ -2570,7 +2568,7 @@ commands: response: | Connecting to local database... Creating shadow database... - Applying migration 20230425064254_remote_commit.sql... + Applying migration 20230425064254_remote_schema.sql... Diffing schemas: auth,extensions,public,storage Finished supabase db diff on branch main. diff --git a/spec/cli_v1_config.yaml b/spec/cli_v1_config.yaml index 308a3e0c4ae..1726e69d937 100644 --- a/spec/cli_v1_config.yaml +++ b/spec/cli_v1_config.yaml @@ -260,6 +260,38 @@ parameters: links: - name: 'Auth Server configuration' link: 'https://supabase.com/docs/reference/auth' + + - id: 'auth.email.template.type.subject' + title: 'auth.email.template..subject' + tags: ['auth'] + required: false + description: | + The full list of email template types are: + + - `invite` + - `confirmation` + - `recovery` + - `magic_link` + - `email_change` + links: + - name: 'Auth Server configuration' + link: 'https://supabase.com/docs/reference/auth' + + - id: 'auth.email.template.type.content_path' + title: 'auth.email.template..content_path' + tags: ['auth'] + required: false + description: | + The full list of email template types are: + + - `invite` + - `confirmation` + - `recovery` + - `magic_link` + - `email_change` + links: + - name: 'Auth Server configuration' + link: 'https://supabase.com/docs/reference/auth' - id: 'auth.external.provider.enabled' title: 'auth.external..enabled' diff --git a/spec/common-cli-sections.json b/spec/common-cli-sections.json index 12b83619e6e..e46b921d5e5 100644 --- a/spec/common-cli-sections.json +++ b/spec/common-cli-sections.json @@ -120,9 +120,9 @@ "type": "cli-command" }, { - "id": "supabase-db-dump", - "title": "Dump schema from remote database", - "slug": "supabase-db-dump", + "id": "supabase-db-pull", + "title": "Pull schema changes from remote database", + "slug": "supabase-db-pull", "type": "cli-command" }, { @@ -137,6 +137,12 @@ "slug": "supabase-db-reset", "type": "cli-command" }, + { + "id": "supabase-db-dump", + "title": "Dump schema from remote database", + "slug": "supabase-db-dump", + "type": "cli-command" + }, { "id": "supabase-db-diff", "title": "Diff local database", @@ -148,18 +154,6 @@ "title": "Lint local database", "slug": "supabase-db-lint", "type": "cli-command" - }, - { - "id": "supabase-db-remote", - "title": "Manage remote databases", - "slug": "supabase-db-remote", - "type": "cli-command" - }, - { - "id": "supabase-db-remote-commit", - "title": "Commit remote database changes", - "slug": "supabase-db-remote-commit", - "type": "cli-command" } ] }, diff --git a/spec/supabase_js_v2.yml b/spec/supabase_js_v2.yml index 194d64f1927..0f261098ece 100644 --- a/spec/supabase_js_v2.yml +++ b/spec/supabase_js_v2.yml @@ -77,7 +77,7 @@ functions: ``` description: | By default the API server points to the `public` schema. You can enable other database schemas within the Dashboard. - Go to [Settings > API > Exposed schemas](https://supabase.com/dashboard/project/_/settings/api) and add the schema which you want to expose to the API. + Go to [Settings > API > Exposed schemas](/dashboard/project/_/settings/api) and add the schema which you want to expose to the API. Note: each client connection can only access a single schema, so the code above can access the `other_schema` schema but cannot access the `public` schema. - id: custom-fetch-implementation @@ -116,6 +116,15 @@ functions: title: 'Overview' notes: | - The auth methods can be accessed via the `supabase.auth` namespace. + - By default, the supabase client sets `persistSession` to true and attempts to store the session in local storage. When using the supabase client in an environment that doesn't support local storage, you might notice the following warning message being logged: + + > No storage option exists to persist the session, which may result in unexpected behavior when using auth. + If you want to set `persistSession` to true, please provide a storage option or you may set `persistSession` to false to disable this warning. + + This warning message can be safely ignored if you're not using auth on the server-side. If you are using auth and you want to set `persistSession` to true, you will need to provide a custom storage implementation that follows [this interface](https://github.com/supabase/gotrue-js/blob/master/src/lib/types.ts#L1027). + - Any email links and one-time passwords (OTPs) sent have a default expiry of 24 hours. We have the following [rate limits](/docs/guides/platform/going-into-prod#auth-rate-limits) in place to guard against brute force attacks. + - The expiry of an access token can be set in the "JWT expiry limit" field in [your project's auth settings](/dashboard/project/_/settings/auth). A refresh token never expires and can only be used once. + examples: - id: create-auth-client name: Create auth client @@ -145,13 +154,13 @@ functions: title: 'signUp()' $ref: '@supabase/gotrue-js.GoTrueClient.signUp' notes: | - - By default, the user needs to verify their email address before logging in. To turn this off, disable **Confirm email** in [your project](https://supabase.com/dashboard/project/_/auth/providers). + - By default, the user needs to verify their email address before logging in. To turn this off, disable **Confirm email** in [your project](/dashboard/project/_/auth/providers). - **Confirm email** determines if users need to confirm their email address after signing up. - If **Confirm email** is enabled, a `user` is returned but `session` is null. - If **Confirm email** is disabled, both a `user` and a `session` are returned. - - When the user confirms their email address, they are redirected to the [`SITE_URL`](https://supabase.com/docs/reference/auth/config#site_url) by default. You can modify your `SITE_URL` or add additional redirect URLs in [your project](https://supabase.com/dashboard/project/_/auth/url-configuration). + - When the user confirms their email address, they are redirected to the [`SITE_URL`](/docs/reference/auth/config#site_url) by default. You can modify your `SITE_URL` or add additional redirect URLs in [your project](/dashboard/project/_/auth/url-configuration). - If signUp() is called for an existing confirmed user: - - If **Confirm email** is enabled in [your project](https://supabase.com/dashboard/project/_/auth/providers), an obfuscated/fake user object is returned. + - If **Confirm email** is enabled in [your project](/dashboard/project/_/auth/providers), an obfuscated/fake user object is returned. - If **Confirm email** is disabled, the error message, `User already registered` is returned. - To fetch the currently logged-in user, refer to [`getUser()`](/docs/reference/javascript/auth-getuser). examples: @@ -244,7 +253,7 @@ functions: - If you're using phone, you can configure whether you want the user to receive a OTP. - The magic link's destination URL is determined by the [`SITE_URL`](/docs/reference/auth/config#site_url). - See [redirect URLs and wildcards](/docs/guides/auth#redirect-urls-and-wildcards) to add additional redirect URLs to your project. - - Magic links and OTPs share the same implementation. To send users a one-time code instead of a magic link, [modify the magic link email template](https://supabase.com/dashboard/project/_/auth/templates) to include `{{ .Token }}` instead of `{{ .ConfirmationURL }}`. + - Magic links and OTPs share the same implementation. To send users a one-time code instead of a magic link, [modify the magic link email template](/dashboard/project/_/auth/templates) to include `{{ .Token }}` instead of `{{ .ConfirmationURL }}`. - See our [Twilio Phone Auth Guide](/docs/guides/auth/phone-login/twilio) for details about configuring WhatsApp sign in. examples: - id: sign-in-with-email @@ -288,7 +297,7 @@ functions: $ref: '@supabase/gotrue-js.GoTrueClient.signInWithOAuth' notes: | - This method is used for signing in using a third-party provider. - - Supabase supports many different [third-party providers](https://supabase.com/docs/guides/auth#configure-third-party-providers). + - Supabase supports many different [third-party providers](/docs/guides/auth#configure-third-party-providers). examples: - id: sign-in-using-a-third-party-provider name: Sign in using a third-party provider @@ -449,8 +458,9 @@ functions: $ref: '@supabase/gotrue-js.GoTrueClient.updateUser' notes: | - In order to use the `updateUser()` method, the user needs to be signed in first. - - By Default, email updates sends a confirmation link to both the user's current and new email. - To only send a confirmation link to the user's new email, disable **Secure email change** in your project's [email auth provider settings](https://supabase.com/dashboard/project/_/auth/providers). + - By default, email updates sends a confirmation link to both the user's current and new email. + To only send a confirmation link to the user's new email, disable **Secure email change** in your project's [email auth provider settings](/dashboard/project/_/auth/providers). + examples: - id: update-the-email-for-an-authenticated-user name: Update the email for an authenticated user @@ -480,7 +490,8 @@ functions: ``` - id: update-password-with-reauthentication name: Update the user's password with a nonce - description: If "Secure password change" is enabled, updating the user's password would require a nonce. The nonce is sent to the user's email or phone number. + description: | + If **Secure password change** is enabled in your [project's email provider settings](/dashboard/project/_/auth/providers), updating the user's password would require a nonce if the user **hasn't recently signed in**. The nonce is sent to the user's email or phone number. A user is deemed recently signed in if the session was created in the last 24 hours. isSpotlight: true code: | ```js @@ -494,6 +505,8 @@ functions: $ref: '@supabase/gotrue-js.GoTrueClient.reauthenticate' notes: | - This method is used together with `updateUser()` when a user's password needs to be updated. + - If you require your user to reauthenticate before updating their password, you need to enable the **Secure password change** option in your [project's email provider settings](/dashboard/project/_/auth/providers). + - A user is only require to reauthenticate before updating their password if **Secure password change** is enabled and the user **hasn't recently signed in**. A user is deemed recently signed in if the session was created in the last 24 hours. - This method will send a nonce to the user's email. If the user doesn't have a confirmed email address, the method will send the nonce to the user's confirmed phone number instead. examples: - id: send-reauthentication-nonce @@ -561,7 +574,7 @@ functions: - `setSession()` takes in a refresh token and uses it to get a new session. - The refresh token can only be used once to obtain a new session. - [Refresh token rotation](/docs/reference/auth/config#refresh_token_rotation_enabled) is enabled by default on all projects to guard against replay attacks. - - You can configure the [`REFRESH_TOKEN_REUSE_INTERVAL`](https://supabase.com/docs/reference/auth/config#refresh_token_reuse_interval) which provides a short window in which the same refresh token can be used multiple times in the event of concurrency or offline issues. + - You can configure the [`REFRESH_TOKEN_REUSE_INTERVAL`](/docs/reference/auth/config#refresh_token_reuse_interval) which provides a short window in which the same refresh token can be used multiple times in the event of concurrency or offline issues. examples: - id: refresh-the-session name: Refresh the session @@ -980,7 +993,7 @@ functions: $ref: '@supabase/gotrue-js.GoTrueAdminApi.generateLink' notes: | - The following types can be passed into `generateLink()`: `signup`, `magiclink`, `invite`, `recovery`, `email_change_current`, `email_change_new`, `phone_change`. - - `generateLink()` only generates the email link for `email_change_email` if the "Secure email change" setting is enabled under the "Email" provider in your Supabase project. + - `generateLink()` only generates the email link for `email_change_email` if the **Secure email change** is enabled in your project's [email auth provider settings](/dashboard/project/_/auth/providers). - `generateLink()` handles the creation of the user for `signup`, `invite` and `magiclink`. examples: - id: generate-a-signup-link @@ -1137,7 +1150,7 @@ functions: title: 'Fetch data: select()' $ref: '@supabase/postgrest-js.PostgrestQueryBuilder.select' notes: | - - By default, Supabase projects return a maximum of 1,000 rows. This setting can be changed in your project's [API settings](https://supabase.com/dashboard/project/_/settings/api). It's recommended that you keep it low to limit the payload size of accidental or malicious requests. You can use `range()` queries to paginate through your data. + - By default, Supabase projects return a maximum of 1,000 rows. This setting can be changed in your project's [API settings](/dashboard/project/_/settings/api). It's recommended that you keep it low to limit the payload size of accidental or malicious requests. You can use `range()` queries to paginate through your data. - `select()` can be combined with [Filters](/docs/reference/javascript/using-filters) - `select()` can be combined with [Modifiers](/docs/reference/javascript/using-modifiers) - `apikey` is a reserved keyword if you're using the [Supabase Platform](/docs/guides/platform) and [should be avoided as a column name](https://github.com/supabase/supabase/issues/5465). diff --git a/studio/components/interfaces/Database/Functions/CreateFunction.tsx b/studio/components/interfaces/Database/Functions/CreateFunction.tsx index 048d0cbd75d..1786d2e0bac 100644 --- a/studio/components/interfaces/Database/Functions/CreateFunction.tsx +++ b/studio/components/interfaces/Database/Functions/CreateFunction.tsx @@ -733,7 +733,7 @@ const InputDefinition = observer(({}) => {

)}
-
+
{ diff --git a/studio/components/interfaces/Support/SupportForm.tsx b/studio/components/interfaces/Support/SupportForm.tsx index 65a25739e63..f77f92b2efc 100644 --- a/studio/components/interfaces/Support/SupportForm.tsx +++ b/studio/components/interfaces/Support/SupportForm.tsx @@ -76,12 +76,14 @@ const SupportForm = ({ setSentCategory }: SupportFormProps) => { if (option.value.toLowerCase() === ((category as string) ?? '').toLowerCase()) return option }) - const selectedProjectRef = + const [selectedProjectRef, setSelectedProjectRef] = useState( selectedProjectFromUrl !== undefined ? selectedProjectFromUrl.ref : projects.length > 0 ? projects[0].ref : 'no-project' + ) + const selectedOrganizationSlug = selectedProjectRef !== 'no-project' ? organizations?.find((org) => { @@ -304,7 +306,14 @@ const SupportForm = ({ setSentCategory }: SupportFormProps) => {
)} {isSuccessProjects && ( - + { + setSelectedProjectRef(val) + }} + > {projects.map((option) => { const organization = organizations?.find( (x) => x.id === option.organization_id @@ -344,7 +353,7 @@ const SupportForm = ({ setSentCategory }: SupportFormProps) => { This project is on the{' '} {subscription.plan.name} plan

- ) : isLoadingSubscription ? ( + ) : isLoadingSubscription && selectedProjectRef !== 'no-project' ? (

Checking project's plan

@@ -656,7 +665,9 @@ const SupportForm = ({ setSentCategory }: SupportFormProps) => {

{respondToEmail}

-

Please ensure you haven't blocked Hubspot in your emails

+

+ Please ensure you haven't blocked Hubspot in your emails +