diff --git a/.github/workflows/docs-e2e.yml b/.github/workflows/docs-e2e.yml index eae790a43ed97..f27fa3a407d18 100644 --- a/.github/workflows/docs-e2e.yml +++ b/.github/workflows/docs-e2e.yml @@ -25,7 +25,6 @@ concurrency: permissions: contents: read - deployments: read statuses: read pull-requests: read @@ -45,8 +44,20 @@ jobs: persist-credentials: false sparse-checkout: | e2e/docs + scripts patches + - uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9 + name: Install pnpm + with: + run_install: false + + - name: Use Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version-file: '.nvmrc' + cache: 'pnpm' + # Vercel skips the docs preview when a PR only changes the harness # (e2e/docs, workflow). Wait for a preview only when apps/docs changed. - name: Detect docs app changes @@ -58,14 +69,21 @@ jobs: docs_app: - 'apps/docs/**' + # Vercel's GitHub App stopped writing GitHub Deployment objects on + # 2026-02-17 (broken app auth), so vercel/wait-for-deployment-action + # times out polling that API even though the preview builds fine. + # Poll the "Vercel – docs" commit status instead — Vercel keeps posting + # those — then resolve the deployment it points to via Vercel's own API + # to get the actual preview URL. See scripts/waitForVercelDocsPreview.js. - name: Wait for Vercel docs preview if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && steps.filter.outputs.docs_app == 'true' id: deployment - uses: vercel/wait-for-deployment-action@0e2b0c5c5cce31f1648108aeec56467187aca037 - with: - project-slug: docs - environment: preview - timeout: '900' + run: node scripts/waitForVercelDocsPreview.js + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + HEAD_SHA: ${{ github.event.pull_request.head.sha }} + VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} + VERCEL_TEAM_ID: ${{ secrets.VERCEL_TEAM_ID }} - name: Resolve base URL id: base-url @@ -87,17 +105,6 @@ jobs: echo "use_bypass=false" >> "$GITHUB_OUTPUT" fi - - uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9 - name: Install pnpm - with: - run_install: false - - - name: Use Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version-file: '.nvmrc' - cache: 'pnpm' - - name: Install dependencies run: pnpm install --frozen-lockfile --filter=e2e-docs... diff --git a/apps/studio/components/ui/ProjectUpgradeFailedBanner.tsx b/apps/studio/components/ui/ProjectUpgradeFailedBanner.tsx index e80fc755f57ac..53b24331c066a 100644 --- a/apps/studio/components/ui/ProjectUpgradeFailedBanner.tsx +++ b/apps/studio/components/ui/ProjectUpgradeFailedBanner.tsx @@ -1,13 +1,16 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' import { DatabaseUpgradeStatus } from '@supabase/shared-types/out/events' -import { useParams } from 'common' +import { LOCAL_STORAGE_KEYS, useParams } from 'common' import dayjs from 'dayjs' +import { X } from 'lucide-react' import { Button } from 'ui' import { Admonition } from 'ui-patterns/admonition' +import { ButtonTooltip } from './ButtonTooltip' import { InlineLink } from './InlineLink' import { SupportLink } from '@/components/interfaces/Support/SupportLink' import { useProjectUpgradingStatusQuery } from '@/data/config/project-upgrade-status-query' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' import { useShowPostgresUpgradeLogs } from '@/hooks/misc/useShowPostgresUpgradeLogs' import { IS_PLATFORM } from '@/lib/constants' import { guessLocalTimezone } from '@/lib/dayjs' @@ -20,7 +23,12 @@ export const ProjectUpgradeFailedBanner = () => { const { status, initiated_at, latest_status_at, error } = data?.databaseUpgradeStatus ?? {} const showPostgresUpgradeLogs = useShowPostgresUpgradeLogs() - const isFailed = status === DatabaseUpgradeStatus.Failed + const [dismissedAt, setDismissedAt] = useLocalStorageQuery( + LOCAL_STORAGE_KEYS.PROJECT_UPGRADE_FAILED_BANNER_DISMISSED_AT(ref ?? 'unknown'), + null + ) + + const isFailed = status === DatabaseUpgradeStatus.Failed && initiated_at !== dismissedAt const initiatedAt = dayjs .utc(initiated_at ?? 0) .tz(guessLocalTimezone()) @@ -48,18 +56,28 @@ export const ProjectUpgradeFailedBanner = () => { type="warning" title={`Postgres version upgrade was not successful (Initiated at ${initiatedAt})`} actions={ - + <> + + } + variant="text" + className="w-6" + tooltip={{ content: { side: 'bottom', text: 'Dismiss' } }} + aria-label="Dismiss upgrade failed banner" + onClick={() => setDismissedAt(initiated_at ?? null)} + /> + } >
diff --git a/apps/www/_events/2026-07-22-supabase-trae-high-quality-apps.mdx b/apps/www/_events/2026-07-22-supabase-trae-high-quality-apps.mdx index ae8aefb5e6ebc..716e31acd6ff5 100644 --- a/apps/www/_events/2026-07-22-supabase-trae-high-quality-apps.mdx +++ b/apps/www/_events/2026-07-22-supabase-trae-high-quality-apps.mdx @@ -8,7 +8,8 @@ meta_description: >- and TRAE to see how TRAE SOLO uses your live Supabase context (schema, auth, RLS policies, and logs) to generate code that holds up in production. type: webinar -onDemand: false +type_label: 'Supabase Live' +onDemand: true date: '2026-07-22T19:00:00.000-07:00' timezone: America/Los_Angeles duration: 45 mins @@ -22,9 +23,9 @@ company: categories: - webinar main_cta: - url: 'https://attendee.gotowebinar.com/register/2865727980603383392' - target: _blank - label: Register now + url: '#recording' + target: _self + label: Watch the recording speakers: 'gerardo_estaba,gary_qi' --- @@ -34,15 +35,26 @@ More people than ever are shipping real products with AI tools. The gap between TRAE and Supabase are built for both. TRAE gives you the speed of a fully autonomous AI coding agent that takes you from prompt to working app. Supabase handles the backend: open-source managed Postgres with Auth, Storage, Edge Functions, and Realtime built in. When TRAE has live context of your Supabase projects, the code it generates is production-ready from the start. -In this session, Gerardo Estaba from Supabase and Gary Qi from TRAE will show you how to go from prompt to production without compromising on code quality. +In this session, Gerardo Estaba from Supabase and Gary Qi from TRAE show you how to go from prompt to production without compromising on code quality. -### What we'll cover +
+