From 8c37eb1389e95f739c3b8a22337a0a503056935f Mon Sep 17 00:00:00 2001 From: Crispy <12525875+Crispy1975@users.noreply.github.com> Date: Fri, 6 Dec 2024 10:14:07 +0000 Subject: [PATCH 01/10] docs: restore to new project docs (#30525) * docs: restore to new project docs and blog * Add Paul C to the authors. * chore: update blog text and make paul and engineer * docs: minor updates to r2np blog text * docs: a few more refinedments for the r2np blog entry * chore: update positions * chore: partially revert * docs: updates to r2np docs and blog * docs: last updates to r2np blog entry * image update * docs: minor update to blog wording for r2np --------- Co-authored-by: Ivan Vasilov Co-authored-by: Paul Cioanca Co-authored-by: Jonathan Summers-Muir --- apps/docs/content/guides/platform/backups.mdx | 35 ++++++++++ .../2024-12-06-restore-to-a-new-project.mdx | 64 ++++++++++++++++++ apps/www/lib/authors.json | 10 ++- .../restore-to-a-new-project/og.jpg | Bin 0 -> 50206 bytes .../restore-to-a-new-project/thumb.jpg | Bin 0 -> 27392 bytes 5 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 apps/www/_blog/2024-12-06-restore-to-a-new-project.mdx create mode 100644 apps/www/public/images/blog/launch-week-13/restore-to-a-new-project/og.jpg create mode 100644 apps/www/public/images/blog/launch-week-13/restore-to-a-new-project/thumb.jpg diff --git a/apps/docs/content/guides/platform/backups.mdx b/apps/docs/content/guides/platform/backups.mdx index 5f77fef5a5b75..c6c413027b62d 100644 --- a/apps/docs/content/guides/platform/backups.mdx +++ b/apps/docs/content/guides/platform/backups.mdx @@ -135,6 +135,41 @@ A date and time picker will be provided upon pressing the `Start a restore` butt After locking in the desired point in time to recover to, The Dashboard will then prompt for a review and confirmation before proceeding with the restoration. The project will be inaccessible following this. As such, do ensure to allot for downtime beforehand. This is dependent on the size of the database. The larger it is, the longer the downtime will be. Once the confirmation has been given, the latest physical backup available is downloaded to the project and the database is partially restored. WAL files generated after this physical backup up to the specified point-in-time are then downloaded. The underlying records of transactions in these files are replayed against the database to complete the restoration. The Dashboard will display a notification once the restoration completes. +## Restore to a new project + +Supabase provides a convenient way to restore data from an existing project into a completely new one. Whether you're using physical backups or Point-in-Time recovery (PITR), this feature allows you to duplicate project data with ease, perform testing safely, or recover data for analysis. Access to this feature is exclusive to users on paid plans and requires that physical backups are enabled for the source project. + + + +PITR is an additional add-on available for organizations on a paid plan with physical backups enabled. + + + +To begin, switch to the source project—the project containing the data you wish to restore—and go to the [database backups](https://supabase.com/dashboard/project/_/database/backups/restore-to-new-project) page. Select the **Restore to a New Project** tab. + +A list of available backups is displayed. Select the backup you want to use and click the "Restore" button. For projects with PITR enabled, use the date and time selector to specify the exact point in time from which you wish to restore data. + +Once you’ve made your choice, Supabase takes care of the rest. A new project is automatically created, replicating key configurations from the original, including the compute instance size, disk attributes, SSL enforcement settings, and network restrictions. The data will remain in the same region as the source project to ensure compliance with data residency requirements. The entire process is fully automated. + + + +The time required to complete the restoration can vary depending largely on the volume of data involved. If you have a large amount of data you can opt for higher performing disk attributes on the source project _before_ starting a clone operation. These disk attributes will be replicated to the new project. This incurs additional costs which will be displayed before starting. + + + +There are a few important restrictions to be aware of with the "Restore to a New Project" process: + +- Projects that are created through the restoration process cannot themselves be used as a source for further clones at this time. +- The feature is only accessible to paid plan users with physical backups enabled, ensuring that the necessary resources and infrastructure are available for the restore process. + +Before starting the restoration, you’ll be presented with an overview of the costs associated with creating the new project. The new project will incur additional monthly expenses based on the mirrored resources from the source project. It’s important to review these costs carefully before proceeding. + +Once the restoration is complete, the new project will be available in your dashboard and will include all data, tables, schemas, and selected settings from the chosen backup source. It is recommended to thoroughly review the new project and perform any necessary tests to ensure everything has been restored as expected. + +New projects are completely independent of their source, and as such can be modified and used as desired. + +Restoring to a new project is an excellent way to manage environments more effectively. You can use this feature to create staging environments for testing, experiment with changes without risk to production data, or swiftly recover from unexpected data loss scenarios. + ## Troubleshooting ### Logical backups diff --git a/apps/www/_blog/2024-12-06-restore-to-a-new-project.mdx b/apps/www/_blog/2024-12-06-restore-to-a-new-project.mdx new file mode 100644 index 0000000000000..4bcd68809b6cb --- /dev/null +++ b/apps/www/_blog/2024-12-06-restore-to-a-new-project.mdx @@ -0,0 +1,64 @@ +--- +title: 'Restore to a New Project' +description: Effortlessly Clone Data into a New Supabase Project +author: crispy1975 +image: launch-week-13/restore-to-a-new-project/og.jpg +thumb: launch-week-13/restore-to-a-new-project/thumb.jpg +categories: + - developers + - postgres +tags: + - cloning + - postgres +date: '2024-12-06T00:00:01' +toc_depth: 3 +launchweek: '13' +--- + +Today we’re adding [Restore to a New Project](https://supabase.com/docs/guides/platform/backups#restore-to-a-new-project). + +You can use this new tool to copy data easily from an existing Supabase project to a new one. **Restore to a New Project** integrates seamlessly with daily physical backups and Point-in-Time Recovery (PITR) to provide flexible restoration options. + + + +Restore to a New Project requires physical backups to be enabled. It is available to all customers on a paid plan. + + + +## How it Works + +When physical backups are enabled, Supabase triggers daily backups of project data. You can use this backup to restore to a new Supabase project. The new project should match the original project attributes: + +- Size of compute instance. +- Disk settings; volume type, size, IOPS, and throughput. +- SSL enforcement configuration. +- Network restrictions. +- Cloud region. + +After launching your restored project, the rest of the process is automated. The length of time for a new project to provision will depend on the size of the source dataset. + +The new project will be available in the Supabase Dashboard as soon as the copy process has completed. This project will behave as any other Supabase project and is completely independent of the source. + +### Point-in-Time Recovery + +In addition to daily backups it is possible to restore from a project with PITR enabled. This allows for very fine granularity when selecting the desired point to restore from. The process is very similar as with daily backup with the exception of being asked to select a specific time. + +## Unlimited Cloning from a Source Project + +To ensure maximum flexibility a source project can be _copied_ as many times as required, making the tool perfect for testing, development environments etc. However, please note that cloning from an already cloned project is not currently supported (this is in the works). + + + +New projects created with this process, as with any new Supabase project, will incur the usual compute and disk costs. These costs are displayed ahead of time to ensure there are no surprises. + + + +## Accessing Restore to a New Project + +The Restore to a New Project feature can be found on the Supabase dashboard under [database backups](https://supabase.com/dashboard/project/_/database/backups/restore-to-new-project). + + + +Please be aware that Restore to a New Project is currently in Private Alpha. You can reach out to [Supabase support](https://supabase.help) to get early access and report any issues. + + diff --git a/apps/www/lib/authors.json b/apps/www/lib/authors.json index e0ef3c8849181..5deee18338adf 100644 --- a/apps/www/lib/authors.json +++ b/apps/www/lib/authors.json @@ -586,8 +586,16 @@ "author_id": "pcnc", "author": "Paul Cioanca", "username": "pcnc", - "position": "Product", + "position": "Engineering", "author_url": "https://github.com/pcnc", "author_image_url": "https://github.com/pcnc.png" + }, + { + "author_id": "crispy1975", + "author": "Paul Caselton", + "username": "crispy1975", + "position": "Engineering", + "author_url": "https://github.com/crispy1975", + "author_image_url": "https://github.com/crispy1975.png" } ] diff --git a/apps/www/public/images/blog/launch-week-13/restore-to-a-new-project/og.jpg b/apps/www/public/images/blog/launch-week-13/restore-to-a-new-project/og.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba3d55074751cccaac40a7dc2104047ba7b88005 GIT binary patch literal 50206 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

sBY$VCTIG9+>VFYSmt&|nRcgSX#8IwN^z2|MuV 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 Date: Fri, 6 Dec 2024 11:21:46 +0100 Subject: [PATCH 02/10] remove warehouse settings page (#30919) * rm links and page * add some comments w context --- .../WarehouseCollectionDetail.tsx | 4 --- .../layouts/LogsLayout/LogsSidebarMenuV2.tsx | 8 ------ ...warehouse-access-tokens-create-mutation.ts | 4 +++ ...warehouse-access-tokens-delete-mutation.ts | 4 ++- .../warehouse-access-tokens-query.ts | 4 ++- .../project/[ref]/settings/warehouse.tsx | 28 ------------------- 6 files changed, 10 insertions(+), 42 deletions(-) delete mode 100644 apps/studio/pages/project/[ref]/settings/warehouse.tsx diff --git a/apps/studio/components/interfaces/DataWarehouse/WarehouseCollectionDetail.tsx b/apps/studio/components/interfaces/DataWarehouse/WarehouseCollectionDetail.tsx index dd6032a6ecee9..95c577f33045d 100644 --- a/apps/studio/components/interfaces/DataWarehouse/WarehouseCollectionDetail.tsx +++ b/apps/studio/components/interfaces/DataWarehouse/WarehouseCollectionDetail.tsx @@ -220,10 +220,6 @@ order by timestamp desc limit ${filters.limit} offset ${filters.offset} />

- -
diff --git a/apps/studio/data/analytics/warehouse-access-tokens-create-mutation.ts b/apps/studio/data/analytics/warehouse-access-tokens-create-mutation.ts index 417c69380fc95..adf6e022c8dd5 100644 --- a/apps/studio/data/analytics/warehouse-access-tokens-create-mutation.ts +++ b/apps/studio/data/analytics/warehouse-access-tokens-create-mutation.ts @@ -8,6 +8,10 @@ type WarehouseAccessTokenCreateVariables = { ref: string description: string } + +/** + * This will be deprecated or rewritten in favor of the new project API keys + */ async function createWarehouseAccessToken({ ref, description, diff --git a/apps/studio/data/analytics/warehouse-access-tokens-delete-mutation.ts b/apps/studio/data/analytics/warehouse-access-tokens-delete-mutation.ts index c71bf4a6068f5..bbecb6d485569 100644 --- a/apps/studio/data/analytics/warehouse-access-tokens-delete-mutation.ts +++ b/apps/studio/data/analytics/warehouse-access-tokens-delete-mutation.ts @@ -8,7 +8,9 @@ export type DeleteAccessTokenArgs = { projectRef: string token: string } - +/** + * This will be deprecated or rewritten in favor of the new project API keys + */ export async function deleteWarehouseAccessToken({ projectRef, token }: DeleteAccessTokenArgs) { const { data, error } = await del( '/platform/projects/{ref}/analytics/warehouse/access-tokens/{token}', diff --git a/apps/studio/data/analytics/warehouse-access-tokens-query.ts b/apps/studio/data/analytics/warehouse-access-tokens-query.ts index 282b7b439527e..bfa30ccb3049b 100644 --- a/apps/studio/data/analytics/warehouse-access-tokens-query.ts +++ b/apps/studio/data/analytics/warehouse-access-tokens-query.ts @@ -30,7 +30,9 @@ export async function getWarehouseAccessTokens( export type WarehouseAccessTokensData = Awaited> export type WarehouseAccessTokensError = ResponseError - +/** + * This will be deprecated or rewritten in favor of the new project API keys + */ export const useWarehouseAccessTokensQuery = ( { projectRef }: WarehouseAccessTokensVariables, { diff --git a/apps/studio/pages/project/[ref]/settings/warehouse.tsx b/apps/studio/pages/project/[ref]/settings/warehouse.tsx deleted file mode 100644 index 4fd0e7d174199..0000000000000 --- a/apps/studio/pages/project/[ref]/settings/warehouse.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import SettingsLayout from 'components/layouts/ProjectSettingsLayout/SettingsLayout' -import { - ScaffoldContainer, - ScaffoldDescription, - ScaffoldHeader, - ScaffoldTitle, -} from 'components/layouts/Scaffold' -import type { NextPageWithLayout } from 'types' -import { WarehouseAccessTokens } from 'components/interfaces/DataWarehouse/WarehouseAccessTokens' - -const WarehouseSettings: NextPageWithLayout = () => { - return ( - <> - - - Analytics Settings - Configure your analytics settings - - - - - - - ) -} - -WarehouseSettings.getLayout = (page) => {page} -export default WarehouseSettings From 7d74d69697f0ee747c1d02c79becbe7eda993669 Mon Sep 17 00:00:00 2001 From: Han Qiao Date: Fri, 6 Dec 2024 18:23:07 +0800 Subject: [PATCH 03/10] chore: update readme for employees example (#30964) * chore: update readme for employees example * chore: update readme title * chore: wrap code example in admonition * chore: revamp schema diff guide --- .../guides/deployment/database-migrations.mdx | 70 +++++++++++++++---- examples/database/employees/README.md | 17 +++++ 2 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 examples/database/employees/README.md diff --git a/apps/docs/content/guides/deployment/database-migrations.mdx b/apps/docs/content/guides/deployment/database-migrations.mdx index 3ad7b9f47841e..11059b17bd895 100644 --- a/apps/docs/content/guides/deployment/database-migrations.mdx +++ b/apps/docs/content/guides/deployment/database-migrations.mdx @@ -135,7 +135,11 @@ supabase migration up Finally, you should see the `department` column added to your `employees` table in the local Dashboard. -View the [complete code](https://github.com/supabase/supabase/tree/master/examples/database/employees) for this example. + + +View the [complete code](https://github.com/supabase/supabase/tree/master/examples/database/employees) for this example on GitHub. + + ### Seeding data @@ -175,7 +179,7 @@ values -```bash +```bash Terminal supabase db reset ``` @@ -190,25 +194,67 @@ You should now see the `employees` table, along with your seed data in the Dashb This workflow is great if you know SQL and are comfortable creating tables and columns. If not, you can still use the Dashboard to create tables and columns, and then use the CLI to diff your changes and create migrations. -Create a new table called `cities`, with columns `id`, `name` and `population`. To see the corresponding SQL for this, you can use the `supabase db diff --schema public` command. This will show you the SQL that will be run to create the table and columns. The output of `supabase db diff` will look something like this: + + + + + Create a new table called `cities`, with columns `id`, `name` and `population`. + Then generate a [schema diff](/docs/reference/cli/supabase-db-diff). + + + + +```bash Terminal +supabase db diff -f create_cities_table ``` -Diffing schemas: public -Finished supabase db diff on branch main. + + + + + + + + + + A new migration file is created for you. + + Alternately, you can copy the table definitions directly from the Table Editor. + + + + +```sql supabase/migrations/_create_cities_table.sql create table "public"."cities" ( "id" bigint primary key generated always as identity, "name" text, "population" bigint ); - ``` -Alternately, you can view your table definitions directly from the Table Editor: + -![SQL Definition](/docs/img/guides/cli/sql-definitions.png) + + + + + + + + Test your new migration file by resetting your local database. + -You can then copy this SQL into a new migration file, and run `supabase db reset` to apply the changes. + + +```bash Terminal +supabase db reset +``` + + + + + The last step is deploying these changes to a live Supabase project. @@ -222,7 +268,7 @@ Head over to [Supabase](https://supabase.com/dashboard) and create a new project - [Login](/docs/reference/cli/usage#supabase-login) to the Supabase CLI using an auto-generated Personal Access Token. + [Login](/docs/reference/cli/supabase-login) to the Supabase CLI using an auto-generated Personal Access Token. @@ -240,7 +286,7 @@ supabase login - [Link](/docs/reference/cli/usage#supabase-link) to your remote project by selecting from the on-screen prompt. + [Link](/docs/reference/cli/supabase-link) to your remote project by selecting from the on-screen prompt. @@ -258,7 +304,7 @@ supabase link - [Push](/docs/reference/cli/usage#supabase-db-push) your migrations to the remote database. + [Push](/docs/reference/cli/supabase-db-push) your migrations to the remote database. diff --git a/examples/database/employees/README.md b/examples/database/employees/README.md new file mode 100644 index 0000000000000..4692b41da296f --- /dev/null +++ b/examples/database/employees/README.md @@ -0,0 +1,17 @@ +# Database Migrations + +This example uses Supabase CLI as a migration tool to manage your database schema changes. + +## Local development + +```bash +npx supabase db start +``` + +## Push to remote project + +```bash +npx supabase login +npx supabase link +npx supabase db push +``` From 1cc9653e894bf61fcc0243b677e00de18413377b Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Fri, 6 Dec 2024 09:41:00 -0500 Subject: [PATCH 04/10] feat: add restore to new project to build stage (#30972) * feat: add restore to new project to build stage * updates * add icon --- .../13/Releases/data/lw13_build_stage.tsx | 20 ++++++++++++------- apps/www/public/rss.xml | 9 ++++++++- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/apps/www/components/LaunchWeek/13/Releases/data/lw13_build_stage.tsx b/apps/www/components/LaunchWeek/13/Releases/data/lw13_build_stage.tsx index 2661b570bd11e..172d08452d203 100644 --- a/apps/www/components/LaunchWeek/13/Releases/data/lw13_build_stage.tsx +++ b/apps/www/components/LaunchWeek/13/Releases/data/lw13_build_stage.tsx @@ -2,7 +2,7 @@ import { ReactNode } from 'react' import { type ClassValue } from 'clsx' -import { GitBranch, HardDrive } from 'lucide-react' +import { GitBranch, HardDrive, BookCopy } from 'lucide-react' export interface AdventDay { icon?: ReactNode // use svg jsx with 34x34px viewport @@ -92,11 +92,17 @@ export const days: AdventDay[] = [ icon: , }, { - title: '', - description: '', - id: '', - is_shipped: false, - links: [], - icon: null, + title: 'Restore to a New Project', + description: 'Effortlessly clone data into a new Supabase project', + id: 'restore', + is_shipped: true, + links: [ + { + url: '/blog/restore-to-a-new-project', + label: 'Blog post', + target: '_blank', + }, + ], + icon: , }, ] diff --git a/apps/www/public/rss.xml b/apps/www/public/rss.xml index ed30bfa8aec4d..0bff63deb7666 100644 --- a/apps/www/public/rss.xml +++ b/apps/www/public/rss.xml @@ -5,9 +5,16 @@ https://supabase.com Latest news from Supabase en - Thu, 05 Dec 2024 00:00:00 -0700 + Fri, 06 Dec 2024 00:00:00 -0700 + https://supabase.com/blog/restore-to-a-new-project + Restore to a New Project + https://supabase.com/blog/restore-to-a-new-project + Effortlessly Clone Data into a New Supabase Project + Fri, 06 Dec 2024 00:00:00 -0700 + + https://supabase.com/blog/supabase-queues Supabase Queues https://supabase.com/blog/supabase-queues From 058f9bbaa6bc7bf3ca86b8b72203f80f3baea624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Og=C3=B3rek?= Date: Fri, 6 Dec 2024 16:04:30 +0100 Subject: [PATCH 05/10] docs: Add note regarding Vercel braching synchronization (#30969) --- apps/docs/content/guides/deployment/branching.mdx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/docs/content/guides/deployment/branching.mdx b/apps/docs/content/guides/deployment/branching.mdx index e35d628ad9bf4..0fe04bb1bff6c 100644 --- a/apps/docs/content/guides/deployment/branching.mdx +++ b/apps/docs/content/guides/deployment/branching.mdx @@ -580,7 +580,7 @@ With the Supabase branching integration, you can sync the Git branch used by the ### Vercel - + The Vercel Integration for Supabase branching is working only with Supabase managed projects. There is currently no support for Vercel Marketplace managed resources, however the support is planned in the future. @@ -598,10 +598,12 @@ For branching to work with Vercel, you also need the [Vercel GitHub integration] Supabase automatically updates your Vercel project with the correct environment variables for the corresponding preview branches. +The synchronization happens at the time of Pull Request being opened, not at the time of branch creation. +As branching integration is tied to the Preview Deployments feature in Vercel, there are possible race conditions between Supabase setting correct variables, and Vercel running a deployment process. Because of that, Supabase is always automatically re-deploying the most recent deployment of the given pull request. -### Netlify +## Other Git providers -A Netlify integration is under consideration. If you're interested in branching with Netlify, [join the GitHub discussion](https://github.com/orgs/supabase/discussions/18938). +There are multiple alternative Git providers under consideration. If you're interested in branching for GitLab, Bitbucket, or some other provider, [join the GitHub discussion](https://github.com/orgs/supabase/discussions/18938). ## Alternatives to branching From 09143219a2e60b28cb58c837fe25ab7dffddb993 Mon Sep 17 00:00:00 2001 From: Craig Cannon Date: Fri, 6 Dec 2024 07:04:53 -0800 Subject: [PATCH 06/10] create lw13 hackathon event (#30912) * Create 2024-12-05-launch-week-13-hackathon.mdx * Update apps/www/_events/2024-12-05-launch-week-13-hackathon.mdx Co-authored-by: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> * Update apps/www/_events/2024-12-05-launch-week-13-hackathon.mdx Co-authored-by: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> * Update apps/www/_events/2024-12-05-launch-week-13-hackathon.mdx Co-authored-by: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> * Update apps/www/_events/2024-12-05-launch-week-13-hackathon.mdx Co-authored-by: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> * prettifying post * prettify --------- Co-authored-by: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Co-authored-by: Francesco Sansalvadore --- .../2024-12-05-launch-week-13-hackathon.mdx | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 apps/www/_events/2024-12-05-launch-week-13-hackathon.mdx diff --git a/apps/www/_events/2024-12-05-launch-week-13-hackathon.mdx b/apps/www/_events/2024-12-05-launch-week-13-hackathon.mdx new file mode 100644 index 0000000000000..c28ca1c7b937d --- /dev/null +++ b/apps/www/_events/2024-12-05-launch-week-13-hackathon.mdx @@ -0,0 +1,102 @@ +--- +title: 'Supabase Launch Week 13 Hackathon' +meta_title: 'Supabase Launch Week 13 Hackathon' +subtitle: 'Build an Open Source Project over 10 days. 5 prize categories.' +meta_description: 'Build an Open Source Project over 10 days. 5 prize categories.' +type: 'hackathon' +onDemand: false +date: '2024-12-06T09:00:00.000-07:00' +timezone: 'America/Los_Angeles' +duration: '10 days' +categories: + - hackathon +main_cta: { url: 'https://hackathon.dev/lw13', target: '_blank', label: 'Submit project' } +--- + +The hackathon starts on Friday, December 6th at 09:00 am PT and ends on Sunday, December 15th at 11:59 pm PT. You could win an extremely limited edition Supabase swag and add your name to the Supabase Hackathon Hall of Fame. + +For some inspiration, check out all the [winners from previous hackathons](https://supabase.com/blog/tags/hackathon). + +This is the perfect excuse to "Build in a weekend, scale to millions.” Since you retain all the rights to your submissions, you can use the hackathon as a launch pad for your new Startup ideas, side projects, or indie hacks. + +## Key Facts + +- You have 10 days to build a new **Open Source** project using Supabase in some capacity + - Starting 09:00 am PT Friday, December 6th 2024 + - The submission deadline is 11:59 pm Sunday midnight PT, December 15th 2024 +- Enter as an individual or as a team of up to 4 people +- Build whatever you want - a project, app, tool, library. Anything. +- 1-minute video containing the following: + - Name of the project + - Demonstration of the project + - How Supabase is used within the project +- [Here is an example video](https://youtu.be/KaWJQzTTx5k). We do not assess the quality of the video itself. Remember to keep it concise. + +## Prizes + +There are 5 categories there will be prizes for: + +- Best overall project (Swag kit) +- Best use of AI (Swag kit) +- Most fun / best easter egg (Swag kit) +- Most technically impressive (Swag kit) +- Most visually pleasing (Swag kit) + +There will be a winner and a runner-up prize for each category. Every team member on winning/runner-up teams gets a Supabase Launch Week swag kit. + +## Submission + +You should submit your project using [this form](https://hackathon.dev/lw13) before 11:59 pm Sunday midnight PT, December 15th, 2024. + +## Judges + +The Supabase team will judge the winners for each category. +We will be looking for: + +- creativity/inventiveness +- functions correctly/smoothly +- visually pleasing +- technically impressive +- use of Supabase features +- FUN! 😃 + +## Rules + +- Team size 1-4 (all team members on winning teams will receive a prize) +- You cannot be on multiple teams +- One submission per team +- It's not a requirement to use AI +- All design elements, code, etc., for your project must be created **during** the event +- All entries must be Open Source (link to source code required in entry) +- Must use Supabase in some capacity +- Can use any language or framework +- You must submit before the deadline (no late entries) +- Include a link to a 1-minute demo video + +## Resources + +### Supabase resources to get you started + +- [Real world RAG, the missing pieces for your AI application](https://www.youtube.com/watch?v=ibzlEQmgPPY) +- [Simplify complex SQL queries with Views](https://www.youtube.com/watch?v=IOYFS-2lFjU&t) +- [Row Level Security in Supabase](https://supabase.com/docs/guides/database/postgres/row-level-security) + +### Community help + +The Supabase Team will be taking part in the Hackathon and you'll find us live to build in our discord all week. Please join us by building in public: + +- Text channel: [#hackathon](https://discord.gg/UYyweApy) +- Audio channel: [#hackathon](https://discord.gg/Vj3mTPwH) + +If you need help or advice when building, find other people to join your team, or if you just want to chill and watch people build, come and join us! + +[Join our Discord](https://discord.supabase.com/) + +- [Previous Hackathon Prize Winners](https://supabase.com/blog/tags/hackathon) + +![Discord](/images/blog/lw12/hackathon/discord.png) + +## Additional Info + +- Any intellectual property developed during the hackathon will belong to the team that developed it. We expect that each team will have an agreement between themselves regarding the IP, but this is not required. +- By making a submission, you grant Supabase permission to use screenshots, code snippets, and/or links to your project or content of your README on our Twitter, blog, website, email updates, and in the Supabase discord server. Supabase does not make any claims over your IP. From 93df22db8db1f82b49f1d4becfc39846f1b00242 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Fri, 6 Dec 2024 10:05:18 -0500 Subject: [PATCH 07/10] feat: lw13 tiger d5 (#30963) * d5 * feat: database.build v2 blog post * light mode images * change hero to database.build v2 * add back Redesign section to blog post * fix(blog): special characters * feat(blog): add youtube video * feat(blog): update post title * wide blog images * sets up the wrap up post * fix attribute * feat(blog): mention wasm pg_dump * edits * images * Adds OG and thumb * grammar * blog assets * mobile fix * add video to launch week page * prettify * is * hackathon link --------- Co-authored-by: Francesco Sansalvadore Co-authored-by: Greg Richardson Co-authored-by: Copple <10214025+kiwicopple@users.noreply.github.com> Co-authored-by: Julien Goux Co-authored-by: Jonathan Summers-Muir --- .../2024-09-30-lw12-hackathon-winners.mdx | 2 +- .../_blog/2024-12-06-database-build-v2.mdx | 321 ++++++++++++++++++ .../2024-12-06-launch-week-13-top-10.mdx | 90 +++++ apps/www/components/Blog/BlogFilters.tsx | 12 +- apps/www/components/Hero/Hero.tsx | 6 +- .../LaunchWeek/13/Releases/data/lw13_data.tsx | 46 ++- apps/www/lib/mdx/mdxComponents.tsx | 8 +- apps/www/pages/blog/[slug].tsx | 4 +- .../byo-llm-api-key.png | Bin 0 -> 847185 bytes .../day-5-database-build-v2/byo-llm.mp4 | Bin 0 -> 7863602 bytes .../day-5-database-build-v2/byo-llm.png | Bin 0 -> 808659 bytes .../deploy-to-supabase-dark.png | Bin 0 -> 222719 bytes .../deploy-to-supabase-light.png | Bin 0 -> 129950 bytes .../deploy-to-supabase.mp4 | Bin 0 -> 13045299 bytes .../drag-drop-sql-clip.mp4 | Bin 0 -> 4789086 bytes .../drag-drop-sql-direct-drop.mp4 | Bin 0 -> 2671651 bytes .../day-5-database-build-v2/live-share.mp4 | Bin 0 -> 4800280 bytes .../llm-service-worker-dark.png | Bin 0 -> 320235 bytes .../llm-service-worker-light.png | Bin 0 -> 223805 bytes .../mobile-support.png | Bin 0 -> 592391 bytes .../day-5-database-build-v2/og.png | Bin 0 -> 81332 bytes .../day-5-database-build-v2/thumb.png | Bin 0 -> 46942 bytes .../blog/launch-week-13/wrap-up/og-top-10.png | Bin 0 -> 21841 bytes .../launch-week-13/wrap-up/thumb-top-10.png | Bin 0 -> 11684 bytes .../releases/d5/d5-database-build-v2-dark.png | Bin 0 -> 60304 bytes .../d5/d5-database-build-v2-light.png | Bin 0 -> 61162 bytes .../d5/d5-database-build-v2-mobile-dark.png | Bin 0 -> 34046 bytes .../d5/d5-database-build-v2-mobile-light.png | Bin 0 -> 38490 bytes apps/www/public/rss.xml | 16 +- apps/www/styles/index.css | 18 +- .../LW13CountdownBanner.tsx | 2 +- .../src/layout/banners/data/Announcement.json | 4 +- 32 files changed, 488 insertions(+), 41 deletions(-) create mode 100644 apps/www/_blog/2024-12-06-database-build-v2.mdx create mode 100644 apps/www/_blog/2024-12-06-launch-week-13-top-10.mdx create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/byo-llm-api-key.png create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/byo-llm.mp4 create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/byo-llm.png create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/deploy-to-supabase-dark.png create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/deploy-to-supabase-light.png create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/deploy-to-supabase.mp4 create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/drag-drop-sql-clip.mp4 create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/drag-drop-sql-direct-drop.mp4 create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/live-share.mp4 create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/llm-service-worker-dark.png create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/llm-service-worker-light.png create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/mobile-support.png create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/og.png create mode 100644 apps/www/public/images/blog/launch-week-13/day-5-database-build-v2/thumb.png create mode 100644 apps/www/public/images/blog/launch-week-13/wrap-up/og-top-10.png create mode 100644 apps/www/public/images/blog/launch-week-13/wrap-up/thumb-top-10.png create mode 100644 apps/www/public/images/launchweek/13/releases/d5/d5-database-build-v2-dark.png create mode 100644 apps/www/public/images/launchweek/13/releases/d5/d5-database-build-v2-light.png create mode 100644 apps/www/public/images/launchweek/13/releases/d5/d5-database-build-v2-mobile-dark.png create mode 100644 apps/www/public/images/launchweek/13/releases/d5/d5-database-build-v2-mobile-light.png diff --git a/apps/www/_blog/2024-09-30-lw12-hackathon-winners.mdx b/apps/www/_blog/2024-09-30-lw12-hackathon-winners.mdx index 490dc12acd099..9740902eeac23 100644 --- a/apps/www/_blog/2024-09-30-lw12-hackathon-winners.mdx +++ b/apps/www/_blog/2024-09-30-lw12-hackathon-winners.mdx @@ -1,5 +1,5 @@ --- -title: 'Supabase Launch Week 12 Hackathon' +title: 'Supabase Launch Week 12 Hackathon Winners' description: Announcing the winners of the Supabase Launch Week 12 Hackathon. author: tyler_shukert image: lw12/hackathon-winners/thumbnail.png diff --git a/apps/www/_blog/2024-12-06-database-build-v2.mdx b/apps/www/_blog/2024-12-06-database-build-v2.mdx new file mode 100644 index 0000000000000..f0fa53de4921b --- /dev/null +++ b/apps/www/_blog/2024-12-06-database-build-v2.mdx @@ -0,0 +1,321 @@ +--- +title: 'database.build v2: Bring-your-own-LLM' +description: Use any OpenAI API compatible LLMs in database.build +author: gregnr,jgoux +image: launch-week-13/day-5-database-build-v2/og.png +thumb: launch-week-13/day-5-database-build-v2/thumb.png +categories: + - launch-week + - developers + - postgres +tags: + - launch-week + - AI + - postgres +date: '2024-12-06T00:00:03' +toc_depth: 3 +launchweek: '13' +--- + +We've been hard at work since launching [database.build](https://database.build) (formerly postgres.new), and we're thrilled to unveil a lineup of new features, starting with: Bring-your-own-LLM. + +
+