-
diff --git a/apps/studio/pages/project/[ref]/realtime/policies.tsx b/apps/studio/pages/project/[ref]/realtime/policies.tsx
index 20555d9d1340d..028d3990d2e4b 100644
--- a/apps/studio/pages/project/[ref]/realtime/policies.tsx
+++ b/apps/studio/pages/project/[ref]/realtime/policies.tsx
@@ -1,8 +1,8 @@
import { RealtimePolicies } from 'components/interfaces/Realtime/Policies'
import type { NextPageWithLayout } from 'types'
-import RealtimeLayout from 'components/layouts/RealtimeLayout/RealtimeLayout'
import DefaultLayout from 'components/layouts/DefaultLayout'
+import RealtimeLayout from 'components/layouts/RealtimeLayout/RealtimeLayout'
const RealtimePoliciesPage: NextPageWithLayout = () => {
return
diff --git a/apps/studio/pages/project/[ref]/settings/addons.tsx b/apps/studio/pages/project/[ref]/settings/addons.tsx
index d9bf4b6368479..c24befee04940 100644
--- a/apps/studio/pages/project/[ref]/settings/addons.tsx
+++ b/apps/studio/pages/project/[ref]/settings/addons.tsx
@@ -1,4 +1,4 @@
-import Addons from 'components/interfaces/Settings/Addons/Addons'
+import { Addons } from 'components/interfaces/Settings/Addons/Addons'
import DefaultLayout from 'components/layouts/DefaultLayout'
import SettingsLayout from 'components/layouts/ProjectSettingsLayout/SettingsLayout'
import {
diff --git a/apps/studio/pages/project/[ref]/settings/auth.tsx b/apps/studio/pages/project/[ref]/settings/auth.tsx
deleted file mode 100644
index ce87957dfd9c0..0000000000000
--- a/apps/studio/pages/project/[ref]/settings/auth.tsx
+++ /dev/null
@@ -1,106 +0,0 @@
-import { useParams } from 'common'
-import DefaultLayout from 'components/layouts/DefaultLayout'
-import SettingsLayout from 'components/layouts/ProjectSettingsLayout/SettingsLayout'
-import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState'
-import { ChevronRight } from 'lucide-react'
-import Link from 'next/link'
-import type { NextPageWithLayout } from 'types'
-
-const ProjectSettings: NextPageWithLayout = () => {
- const { ref } = useParams() as { ref: string }
-
- return (
-
-
-
- All settings are now under configuration within the Authentication page.
-
-
- General user signup
-
-
-
- Password settings in email provider
-
-
-
- User sessions
-
-
-
- Refresh tokens
-
-
-
- Bot and abuse protection
-
-
-
- SMTP settings
-
-
-
- Access token expiry
-
-
-
- Multifactor authentication
-
-
-
- Third party authentication
-
-
-
- Max request duration
-
-
-
- Max direct database connections
-
-
-
-
- )
-}
-
-ProjectSettings.getLayout = (page) => (
-
- {page}
-
-)
-
-export default ProjectSettings
diff --git a/apps/studio/pages/project/[ref]/settings/general.tsx b/apps/studio/pages/project/[ref]/settings/general.tsx
index 894cf9b36eb72..11943bbd52f38 100644
--- a/apps/studio/pages/project/[ref]/settings/general.tsx
+++ b/apps/studio/pages/project/[ref]/settings/general.tsx
@@ -20,7 +20,8 @@ const ProjectSettings: NextPageWithLayout = () => {
const { data: selectedOrganization } = useSelectedOrganizationQuery()
const isBranch = !!project?.parent_project_ref
- const { projectsTransfer: projectTransferEnabled } = useIsFeatureEnabled(['projects:transfer'])
+ const { projectsTransfer: projectTransferEnabled, projectSettingsCustomDomains } =
+ useIsFeatureEnabled(['projects:transfer', 'project_settings:custom_domains'])
const { data: subscription } = useOrgSubscriptionQuery({ orgSlug: selectedOrganization?.slug })
const hasHipaaAddon = subscriptionHasHipaaAddon(subscription)
@@ -37,7 +38,7 @@ const ProjectSettings: NextPageWithLayout = () => {
{/* this is only settable on compliance orgs, currently that means HIPAA orgs */}
{!isBranch && hasHipaaAddon &&
}
-
+ {projectSettingsCustomDomains &&
}
{!isBranch && projectTransferEnabled &&
}
{!isBranch &&
}
diff --git a/apps/studio/pages/project/[ref]/settings/jwt/index.tsx b/apps/studio/pages/project/[ref]/settings/jwt/index.tsx
index 07f3565d8572c..02364d45227ed 100644
--- a/apps/studio/pages/project/[ref]/settings/jwt/index.tsx
+++ b/apps/studio/pages/project/[ref]/settings/jwt/index.tsx
@@ -8,16 +8,22 @@ import { JwtSecretUpdateError, JwtSecretUpdateStatus } from '@supabase/shared-ty
import { useQueryClient } from '@tanstack/react-query'
import { useParams } from 'common'
import { JWT_SECRET_UPDATE_ERROR_MESSAGES } from 'components/interfaces/JwtSecrets/jwt.constants'
+import { UnknownInterface } from 'components/ui/UnknownInterface'
import { useJwtSecretUpdatingStatusQuery } from 'data/config/jwt-secret-updating-status-query'
import { configKeys } from 'data/config/keys'
+import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled'
import { useEffect, useRef } from 'react'
import { toast } from 'sonner'
const JWTKeysLegacyPage: NextPageWithLayout = () => {
- const { ref: projectRef, source } = useParams()
const client = useQueryClient()
+ const { ref: projectRef } = useParams()
+ const { projectSettingsLegacyJwtKeys } = useIsFeatureEnabled(['project_settings:legacy_jwt_keys'])
- const { data } = useJwtSecretUpdatingStatusQuery({ projectRef })
+ const { data } = useJwtSecretUpdatingStatusQuery(
+ { projectRef },
+ { enabled: projectSettingsLegacyJwtKeys }
+ )
const jwtSecretUpdateStatus = data?.jwtSecretUpdateStatus
const jwtSecretUpdateError = data?.jwtSecretUpdateError
@@ -44,14 +50,20 @@ const JWTKeysLegacyPage: NextPageWithLayout = () => {
previousJwtSecretUpdateStatus.current = jwtSecretUpdateStatus
}, [jwtSecretUpdateStatus])
- return
+ if (!projectSettingsLegacyJwtKeys) {
+ return
+ }
+
+ return (
+
+
+
+ )
}
JWTKeysLegacyPage.getLayout = (page) => (
-
- {page}
-
+ {page}
)
diff --git a/apps/www/_blog/2025-08-20-lw15-hackathon-winners.mdx b/apps/www/_blog/2025-08-20-lw15-hackathon-winners.mdx
new file mode 100644
index 0000000000000..acf9ab4d1103f
--- /dev/null
+++ b/apps/www/_blog/2025-08-20-lw15-hackathon-winners.mdx
@@ -0,0 +1,123 @@
+---
+title: 'Supabase Launch Week 15 Hackathon Winner Announcement'
+description: Announcing the winners of the Supabase Launch Week 15 Hackathon.
+author: tyler_shukert
+image: launch-week-15/hackathon-winners/lw15-hackathon.png
+thumb: launch-week-15/hackathon-winners/lw15-hackathon.png
+launchweek: '15'
+categories:
+ - launch-week
+tags:
+ - launch-week
+ - hackathon
+date: '2025-08-20:08:00'
+toc_depth: 2
+---
+
+[Launch Week 15](https://supabase.com/launch-week) brought an incredible array of new Supabase features that got developers' creative engines revving. To harness this excitement, we challenged our amazing community with the Launch Week 15 Hackathon - and wow, did they deliver!
+
+The submissions were truly impressive, showcasing exceptional technical skill and creativity. Our team thoroughly enjoyed reviewing each project, making it challenging to select winners from such a strong pool of entries.
+
+## Best overall project
+
+### Winner
+
+[Figma AI Tickets](https://github.com/vickywane/figma-ai-tickets) by [vickywane](https://github.com/vickywane)
+
+The supabase-powered Figma plugin. It transforms design work into actionable development tasks automatically. The plugin exports selected frames from Figma as PNGs, feeds them into OpenAI’s GPT-4 model, and intelligently generates detailed user stories.
+
+
+
+### Runner Up
+
+[Cozy Keys](https://github.com/sultson/cozy-keys) by [sultson](https://github.com/sultson)
+
+Play, learn and record piano keys right from the browser.
+
+
+
+## Best use of AI
+
+### Winner
+
+[Aryn - Spatial Intelligence for Curated Knowledge ](https://github.com/adlai88/airena) by [adlai88](https://github.com/adlai88)
+
+Aryn transforms Are.na collections into intelligent spatial canvases using AI inferences, pgvector with Edge Functions for clustering analysis.
+
+
+
+### Runner Up
+
+[SommIA](https://github.com/SommIAapp/mvp) by [SommIAapp](https://github.com/SommIAapp)
+
+Your personal AI sommelier, take a photo or describe what you're going to eat and the AI gives you the best wine in your budget to go with it, or at the restaurant take a photo of the wine list and write down what you're ordering to find out the best wine to go with it.
+
+
+
+## Most fun / best easter egg
+
+### Winner
+
+[SupaClicker](https://github.com/Steellgold/supa-clicker) by [Steellgold](https://github.com/Steellgold)
+
+An addictive incremental clicker game, click the SUPA, earn power, buy upgrades, and compete with players worldwide in this highly polished clicker game that goes far beyond simple clicking!
+
+
+
+### Runner Up
+
+[LLM Breakout](https://github.com/akshaykripalani/supahack-lw15) by [akshaykripalani](https://github.com/akshaykripalani) and [MananGandhi1810](https://github.com/MananGandhi1810)
+
+LLM Breakout is a browser-based twist on the classic brick-breaker game. A tastefully sloppy homage to breakout - where your bricks are generated by prompts, rather than being pre-set colorful bricks.
+
+
+
+## Most technically impressive
+
+### Winner
+
+[Thrink](https://github.com/benjamin-anenu/-Thrink-) by [benjamin-anenu](https://github.com/benjamin-anenu)
+
+Thrink is an AI-powered project management platform built on Supabase, covering the full project lifecycle. It features intelligent assistance via OpenRouter.ai (Tink Chat), a sleek frontend developed with Lovable.dev, documentation powered by Claude AI, and AI-driven code reviews using Cursor.
+
+
+
+### Runner Up
+
+[Save Now Earn Later](https://github.com/rrh1441/savenow) by [rrh1441](https://github.com/rrh1441)
+
+This app shows users how much wealth they could build by investing their small daily purchases (like coffee or lunch) in the S&P 500 instead of spending.
+
+
+
+## Most visually pleasing
+
+### Winner
+
+[SupaLearn](https://github.com/imprakashraghu/supalearn) by [imprakashraghu](https://github.com/imprakashraghu)
+
+Learning Science using a game, gain knowledge about periodic elements and chemical reactions by having fun using OpenAI and Supabase. Know about reactions, molecules and compounds while you simulate your own laboratory and playground area to experiment various compounds of your choice.
+
+
+
+### Runner Up
+
+[NTB STICKER SUPAFINDING](https://github.com/Fur1uss/NTB-STICKERS-SUPAFINDING) by [Fur1uss](https://github.com/Fur1uss), [cisarsg](https://github.com/cisarsg), [CazuelaDePollo](https://github.com/CazuelaDePollo), and [Isidora-S-Lee](https://github.com/Isidora-S-Lee)
+
+NTB STICKER SUPAFINDING is a fast-paced web mini-game where players must find hidden stickers scattered across the screen before time runs out. Each correct sticker adds bonus time, encouraging quick thinking and sharp eyes. Designed with a playful interface, it's a fun challenge that tests your observation skills under pressure. With AI!
+
+
+
+## The Prizes
+
+
+
+The winner of the best overall project will receive a keyboard, and each winner and runner-up will receive a Supabase swag kit.
+
+## Getting Started Guides
+
+If you're inspired to build, check out some of the latest resources:
+
+- [Quick Start Guides](https://supabase.com/docs/guides/getting-started)
+- [AI & Vectors Guide](https://supabase.com/docs/guides/ai)
+- [Edge Functions Guide](https://supabase.com/docs/guides/functions)
diff --git a/apps/www/public/images/blog/launch-week-15/hackathon-winners/aryn.png b/apps/www/public/images/blog/launch-week-15/hackathon-winners/aryn.png
new file mode 100644
index 0000000000000..59740dbed7539
Binary files /dev/null and b/apps/www/public/images/blog/launch-week-15/hackathon-winners/aryn.png differ
diff --git a/apps/www/public/images/blog/launch-week-15/hackathon-winners/cozy-keys.png b/apps/www/public/images/blog/launch-week-15/hackathon-winners/cozy-keys.png
new file mode 100644
index 0000000000000..5ac2bbb4c6ed1
Binary files /dev/null and b/apps/www/public/images/blog/launch-week-15/hackathon-winners/cozy-keys.png differ
diff --git a/apps/www/public/images/blog/launch-week-15/hackathon-winners/figma-ai-tickets.png b/apps/www/public/images/blog/launch-week-15/hackathon-winners/figma-ai-tickets.png
new file mode 100644
index 0000000000000..701d98bbcf356
Binary files /dev/null and b/apps/www/public/images/blog/launch-week-15/hackathon-winners/figma-ai-tickets.png differ
diff --git a/apps/www/public/images/blog/launch-week-15/hackathon-winners/keyboard.png b/apps/www/public/images/blog/launch-week-15/hackathon-winners/keyboard.png
new file mode 100644
index 0000000000000..f26b475a95b0b
Binary files /dev/null and b/apps/www/public/images/blog/launch-week-15/hackathon-winners/keyboard.png differ
diff --git a/apps/www/public/images/blog/launch-week-15/hackathon-winners/llm-breakout.png b/apps/www/public/images/blog/launch-week-15/hackathon-winners/llm-breakout.png
new file mode 100644
index 0000000000000..16691a1b6952f
Binary files /dev/null and b/apps/www/public/images/blog/launch-week-15/hackathon-winners/llm-breakout.png differ
diff --git a/apps/www/public/images/blog/launch-week-15/hackathon-winners/lw15-hackathon.png b/apps/www/public/images/blog/launch-week-15/hackathon-winners/lw15-hackathon.png
new file mode 100644
index 0000000000000..ed39b4c63832f
Binary files /dev/null and b/apps/www/public/images/blog/launch-week-15/hackathon-winners/lw15-hackathon.png differ
diff --git a/apps/www/public/images/blog/launch-week-15/hackathon-winners/ntb.png b/apps/www/public/images/blog/launch-week-15/hackathon-winners/ntb.png
new file mode 100644
index 0000000000000..06eba031d1f19
Binary files /dev/null and b/apps/www/public/images/blog/launch-week-15/hackathon-winners/ntb.png differ
diff --git a/apps/www/public/images/blog/launch-week-15/hackathon-winners/save.png b/apps/www/public/images/blog/launch-week-15/hackathon-winners/save.png
new file mode 100644
index 0000000000000..d5f4a48738b62
Binary files /dev/null and b/apps/www/public/images/blog/launch-week-15/hackathon-winners/save.png differ
diff --git a/apps/www/public/images/blog/launch-week-15/hackathon-winners/sommia.png b/apps/www/public/images/blog/launch-week-15/hackathon-winners/sommia.png
new file mode 100644
index 0000000000000..7f36d38506436
Binary files /dev/null and b/apps/www/public/images/blog/launch-week-15/hackathon-winners/sommia.png differ
diff --git a/apps/www/public/images/blog/launch-week-15/hackathon-winners/supaclicker.png b/apps/www/public/images/blog/launch-week-15/hackathon-winners/supaclicker.png
new file mode 100644
index 0000000000000..a1dfc6ebb8ca2
Binary files /dev/null and b/apps/www/public/images/blog/launch-week-15/hackathon-winners/supaclicker.png differ
diff --git a/apps/www/public/images/blog/launch-week-15/hackathon-winners/supalearn.png b/apps/www/public/images/blog/launch-week-15/hackathon-winners/supalearn.png
new file mode 100644
index 0000000000000..d9995e48cab21
Binary files /dev/null and b/apps/www/public/images/blog/launch-week-15/hackathon-winners/supalearn.png differ
diff --git a/apps/www/public/images/blog/launch-week-15/hackathon-winners/thrink.png b/apps/www/public/images/blog/launch-week-15/hackathon-winners/thrink.png
new file mode 100644
index 0000000000000..09885359e78a4
Binary files /dev/null and b/apps/www/public/images/blog/launch-week-15/hackathon-winners/thrink.png differ
diff --git a/packages/common/enabled-features/enabled-features.json b/packages/common/enabled-features/enabled-features.json
index f2d63d6684692..41de346f04d7f 100644
--- a/packages/common/enabled-features/enabled-features.json
+++ b/packages/common/enabled-features/enabled-features.json
@@ -6,6 +6,16 @@
"ai:opt_in_level_schema_and_log": true,
"ai:opt_in_level_schema_and_log_and_data": true,
+ "authentication:sign_in_providers": true,
+ "authentication:third_party_auth": true,
+ "authentication:rate_limits": true,
+ "authentication:emails": true,
+ "authentication:multi_factor": true,
+ "authentication:attack_protection": true,
+ "authentication:advanced": true,
+
+ "authentication:show_providers": true,
+ "authentication:show_manual_linking": true,
"authentication:show_send_invitation": true,
"authentication:show_provider_filter": true,
"authentication:show_sort_by_email": true,
@@ -18,12 +28,15 @@
"database:roles": true,
"integrations:vercel": true,
+ "integrations:show_stripe_wrapper": true,
"logs:templates": true,
"logs:collections": true,
"profile:show_email": true,
"profile:show_information": true,
+ "profile:show_analytics_and_marketing": true,
+ "profile:show_account_deletion": true,
"project_connection:javascript_example": true,
"project_connection:dart_example": true,
@@ -34,5 +47,11 @@
"project_homepage:show_instance_size": true,
"project_homepage:show_examples": true,
- "table_editor:enable_rls_toggle": true
+ "project_addons:dedicated_ipv4_address": true,
+ "project_settings:custom_domains": true,
+ "project_settings:show_disable_legacy_api_keys": true,
+ "project_settings:legacy_jwt_keys": true,
+ "project_settings:log_drains": true,
+
+ "reports:all": true
}
diff --git a/packages/common/enabled-features/enabled-features.schema.json b/packages/common/enabled-features/enabled-features.schema.json
index 22081cf423dff..f75bab7b4b590 100644
--- a/packages/common/enabled-features/enabled-features.schema.json
+++ b/packages/common/enabled-features/enabled-features.schema.json
@@ -23,6 +23,43 @@
"description": "Enable the AI opt in level 'schema_and_log_and_data'"
},
+ "authentication:sign_in_providers": {
+ "type": "boolean",
+ "description": "Enable the authentication sign in / providers page"
+ },
+ "authentication:third_party_auth": {
+ "type": "boolean",
+ "description": "Enable the authentication third party auth page"
+ },
+ "authentication:rate_limits": {
+ "type": "boolean",
+ "description": "Enable the authentication rate limits page"
+ },
+ "authentication:emails": {
+ "type": "boolean",
+ "description": "Enable the authentication emails page"
+ },
+ "authentication:multi_factor": {
+ "type": "boolean",
+ "description": "Enable the authentication multi factor page"
+ },
+ "authentication:attack_protection": {
+ "type": "boolean",
+ "description": "Enable the authentication attack protection page"
+ },
+ "authentication:advanced": {
+ "type": "boolean",
+ "description": "Enable the authentication advanced page"
+ },
+
+ "authentication:show_providers": {
+ "type": "boolean",
+ "description": "Show the providers section in the authentication Sign In / Providers page"
+ },
+ "authentication:show_manual_linking": {
+ "type": "boolean",
+ "description": "Show the manual linking toggle in the authentication Sign In / Providers page under User Signups"
+ },
"authentication:show_send_invitation": {
"type": "boolean",
"description": "Show the send invitation option in the authentication users page"
@@ -62,6 +99,10 @@
"type": "boolean",
"description": "Enable the vercel integration section in the organization and project settings pages"
},
+ "integrations:show_stripe_wrapper": {
+ "type": "boolean",
+ "description": "Show the Stripe wrapper under project integrations"
+ },
"logs:templates": {
"type": "boolean",
@@ -80,6 +121,14 @@
"type": "boolean",
"description": "Shows the user's profile information (first name, last name) in account preferences"
},
+ "profile:show_analytics_and_marketing": {
+ "type": "boolean",
+ "description": "Shows the analytics and marketing section in account preferences"
+ },
+ "profile:show_account_deletion": {
+ "type": "boolean",
+ "description": "Shows the account deletion section in account preferences"
+ },
"project_connection:javascript_example": {
"type": "boolean",
@@ -108,9 +157,31 @@
"description": "Show all client libraries examples in the project homepage. When false, all client library examples will be hidden except the JavaScript client library."
},
- "table_editor:enable_rls_toggle": {
+ "project_addons:dedicated_ipv4_address": {
+ "type": "boolean",
+ "description": "Show the dedicated IPv4 address addon"
+ },
+
+ "project_settings:custom_domains": {
+ "type": "boolean",
+ "description": "Show the custom domain configuration section + custom domain addon"
+ },
+ "project_settings:show_disable_legacy_api_keys": {
+ "type": "boolean",
+ "description": "Show the disable legacy API keys section in project settings API Keys page"
+ },
+ "project_settings:legacy_jwt_keys": {
+ "type": "boolean",
+ "description": "Enable the legacy JWT secret page in project settings"
+ },
+ "project_settings:log_drains": {
+ "type": "boolean",
+ "description": "Enable the log drains page in project settings"
+ },
+
+ "reports:all": {
"type": "boolean",
- "description": "Show the RLS toggle in the table creation flow and table editor header"
+ "description": "Enable the project reports page"
}
},
"required": [
@@ -118,6 +189,15 @@
"ai:opt_in_level_schema",
"ai:opt_in_level_schema_and_log",
"ai:opt_in_level_schema_and_log_and_data",
+ "authentication:sign_in_providers",
+ "authentication:third_party_auth",
+ "authentication:rate_limits",
+ "authentication:emails",
+ "authentication:multi_factor",
+ "authentication:attack_protection",
+ "authentication:advanced",
+ "authentication:show_providers",
+ "authentication:show_manual_linking",
"authentication:show_provider_filter",
"authentication:show_send_invitation",
"authentication:show_sort_by_email",
@@ -127,17 +207,25 @@
"database:replication",
"database:roles",
"integrations:vercel",
+ "integrations:show_stripe_wrapper",
"profile:show_email",
"profile:show_information",
+ "profile:show_analytics_and_marketing",
+ "profile:show_account_deletion",
"logs:templates",
"logs:collections",
"project_creation:show_advanced_config",
"project_homepage:show_instance_size",
"project_homepage:show_examples",
"project_homepage:show_all_client_libraries",
+ "project_addons:dedicated_ipv4_address",
+ "project_settings:custom_domains",
+ "project_settings:show_disable_legacy_api_keys",
+ "project_settings:legacy_jwt_keys",
+ "project_settings:log_drains",
"project_connection:javascript_example",
"project_connection:dart_example",
- "table_editor:enable_rls_toggle"
+ "reports:all"
],
"additionalProperties": false
}
diff --git a/packages/ui/src/components/shadcn/ui/text-area.tsx b/packages/ui/src/components/shadcn/ui/text-area.tsx
index 3966b409a4ea0..3c24ef458c00f 100644
--- a/packages/ui/src/components/shadcn/ui/text-area.tsx
+++ b/packages/ui/src/components/shadcn/ui/text-area.tsx
@@ -11,7 +11,7 @@ const TextArea = React.forwardRef
(
return (