+ {days !== undefined && days != '0' ? (
<>
>
) : null}
- {hours !== undefined ? (
+ {hours !== undefined && hours != '0' ? (
<>
>
) : null}
- {minutes !== undefined ? (
+ {minutes !== undefined && minutes != '0' ? (
<>
{seconds !== undefined &&
}
diff --git a/packages/ui-patterns/PromoToast/PromoToast.tsx b/packages/ui-patterns/PromoToast/PromoToast.tsx
index 23e1755636..12bcb573d7 100644
--- a/packages/ui-patterns/PromoToast/PromoToast.tsx
+++ b/packages/ui-patterns/PromoToast/PromoToast.tsx
@@ -6,19 +6,19 @@ import { useEffect, useState } from 'react'
import { cn } from 'ui/src/lib/utils/cn'
import { Button } from 'ui/src/components/Button/Button'
import { LOCAL_STORAGE_KEYS } from 'common'
-import CountdownComponent from 'ui/src/layout/banners/LW11CountdownBanner/Countdown'
+import CountdownComponent from 'ui/src/layout/banners/LW12CountdownBanner/Countdown'
import announcement from 'ui/src/layout/banners/data/Announcement.json'
import { useTheme } from 'next-themes'
-const LW11BGDark =
- 'https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/lw11/assets/backgrounds/regular/001.png'
-const LW11BGLight =
- 'https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/lw11/assets/backgrounds/platinum/001.png'
+const LW12BGDark =
+ 'https://xguihxuzqibwxjnimxev.supabase.co/storage/v1/object/public/images/launch-week/lw12/assets/bg-dark.svg?t=2024-07-26T09%3A59%3A25.373Z'
+const LW12BGLight =
+ 'https://xguihxuzqibwxjnimxev.supabase.co/storage/v1/object/public/images/launch-week/lw12/assets/bg-light.svg?t=2024-07-26T09%3A59%3A25.373Z'
const PromoToast = () => {
const [visible, setVisible] = useState(false)
const { resolvedTheme } = useTheme()
- const bgImage = resolvedTheme?.includes('dark') ? LW11BGDark : LW11BGLight
+ const bgImage = resolvedTheme?.includes('dark') ? LW12BGDark : LW12BGLight
useEffect(() => {
const shouldHide =
@@ -44,16 +44,18 @@ const PromoToast = () => {
visible && 'opacity-100 translate-y-0'
)}
>
-
-
- General Availability Week
-
+
+ Launch Week 12
+
+
+ AUGUST 12-16 / 7AM PT
+
@@ -34,4 +39,4 @@ export function LW11CountdownBanner() {
)
}
-export default LW11CountdownBanner
+export default LW12CountdownBanner
diff --git a/packages/ui/src/layout/banners/LW11CountdownBanner/VideoPreview.tsx b/packages/ui/src/layout/banners/LW12CountdownBanner/VideoPreview.tsx
similarity index 100%
rename from packages/ui/src/layout/banners/LW11CountdownBanner/VideoPreview.tsx
rename to packages/ui/src/layout/banners/LW12CountdownBanner/VideoPreview.tsx
diff --git a/packages/ui/src/layout/banners/data/Announcement.json b/packages/ui/src/layout/banners/data/Announcement.json
index eda8f37d83..ce6a1000b0 100644
--- a/packages/ui/src/layout/banners/data/Announcement.json
+++ b/packages/ui/src/layout/banners/data/Announcement.json
@@ -1,7 +1,7 @@
{
"show": true,
- "text": "Supabase has reached General Availability",
- "launchDate": "2024-04-15T07:00:00.000-08:00",
- "link": "https://supabase.com/ga-week",
- "badge": "Learn more"
+ "text": "Launch Week 12",
+ "launchDate": "2024-08-12T07:00:00.000-08:00",
+ "link": "https://supabase.com/launch-week",
+ "cta": "Claim ticket"
}
diff --git a/packages/ui/src/layout/banners/index.tsx b/packages/ui/src/layout/banners/index.tsx
index b8cb19c8d8..7785bf9541 100644
--- a/packages/ui/src/layout/banners/index.tsx
+++ b/packages/ui/src/layout/banners/index.tsx
@@ -1,2 +1 @@
export { default as Announcement } from './Announcement'
-export { default as LW11CountdownBanner } from './LW11CountdownBanner/LW11CountdownBanner'
diff --git a/supabase/config.toml b/supabase/config.toml
index 6f09899cc5..961f4351a2 100644
--- a/supabase/config.toml
+++ b/supabase/config.toml
@@ -58,6 +58,15 @@ double_confirm_changes = true
# If enabled, users need to confirm their email address before signing in.
enable_confirmations = false
+# Uncomment the following to use gh oAuth app locally with your own test app
+# to use env vars locally, run > `source ./supabase/.env && supabase [command...]`
+[auth.external.github]
+enabled = true
+client_id = "env(GITHUB_CLIENT_ID)"
+secret = "env(GITHUB_SECRET)"
+# Overrides the default auth redirectUrl.
+redirect_uri = "http://localhost:54321/auth/v1/callback"
+
# Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`,
# `discord`, `facebook`, `figma`, `github`, `gitlab`, `google`, `keycloak`, `linkedin`, `linkedin_oidc`, `notion`,
# `twitch`, `twitter`, `slack`, `spotify`, `workos`, `zoom`.
diff --git a/supabase/functions/lw12-ticket-og/README.md b/supabase/functions/lw12-ticket-og/README.md
new file mode 100644
index 0000000000..f7847e4d45
--- /dev/null
+++ b/supabase/functions/lw12-ticket-og/README.md
@@ -0,0 +1,22 @@
+# Open Graph (OG) Image Generation with Supabase Storage CDN Caching
+
+Generate Open Graph images with Deno and Supabase Edge Functions and cache the generated image with Supabase Storage CDN.
+
+- Docs: https://deno.land/x/og_edge@0.0.2
+- Examples: https://vercel.com/docs/concepts/functions/edge-functions/og-image-examples
+- Demo: https://obuldanrptloktxcffvn.supabase.co/functions/v1/lw12-ticket-og?username=thorwebdev
+
+## Run locally
+
+```bash
+supabase start
+supabase functions serve lw12-ticket-og --no-verify-jwt --env-file ./supabase/.env.local
+```
+
+Navigate to http://localhost:54321/functions/v1/lw12-ticket-og?username=thorwebdev
+
+## Deploy
+
+```bash
+supabase functions deploy lw12-ticket-og --no-verify-jwt
+```
diff --git a/supabase/functions/lw12-ticket-og/handler.tsx b/supabase/functions/lw12-ticket-og/handler.tsx
new file mode 100644
index 0000000000..1e33090a82
--- /dev/null
+++ b/supabase/functions/lw12-ticket-og/handler.tsx
@@ -0,0 +1,610 @@
+import React from 'https://esm.sh/react@18.2.0?deno-std=0.140.0'
+import { ImageResponse } from 'https://deno.land/x/og_edge@0.0.4/mod.ts'
+import { createClient } from 'jsr:@supabase/supabase-js@2'
+
+const corsHeaders = {
+ 'Access-Control-Allow-Origin': '*',
+ 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
+}
+
+const SUPABASE_URL =
+ Deno.env.get('SUPABASE_URL') !== 'http://kong:8000'
+ ? Deno.env.get('SUPABASE_URL')
+ : 'http://host.docker.internal:54321'
+
+const STORAGE_URL = `${SUPABASE_URL}/storage/v1/object/public/images/launch-week/lw12`
+
+// Load custom font
+const FONT_URL = `${STORAGE_URL}/assets/font/CircularStd-Book.otf`
+const MONO_FONT_URL = `${STORAGE_URL}/assets/font/SourceCodePro-Regular.ttf`
+const font = fetch(new URL(FONT_URL, import.meta.url)).then((res) => res.arrayBuffer())
+const mono_font = fetch(new URL(MONO_FONT_URL, import.meta.url)).then((res) => res.arrayBuffer())
+// const BUCKET_FOLDER_VERSION = 'v1'
+
+const LW_TABLE = 'tickets'
+const LW_MATERIALIZED_VIEW = 'tickets_view'
+
+const STYLING_CONGIF = {
+ regular: {
+ BACKGROUND: '#060809',
+ FOREGROUND: '#F8F9FA',
+ FOREGROUND_LIGHT: '#8B9092',
+ TICKET_BORDER: '#292929',
+ TICKET_FOREGROUND: '#11181C',
+ TICKET_BACKGROUND: '#1F1F1F',
+ TICKET_BACKGROUND_CODE: '#141414',
+ TICKET_FOREGROUND_LIGHT: '#888888',
+ BORDER: '#adadad',
+ CODE_LINE_NUMBER: '#4D4D4D',
+ CODE_BASE: '#ddd',
+ CODE_HIGHLIGHT: '#292929',
+ CODE_FUNCTION: '#ddd',
+ CODE_VARIABLE: '#ddd',
+ CODE_METHOD: '#ddd',
+ CODE_EXPRESSION: '#FFF',
+ CODE_STRING: '#3ECF8E',
+ CODE_NUMBER: '#3ECF8E',
+ CODE_NULL: '#569cd6',
+ },
+ platinum: {
+ BACKGROUND: '#060809',
+ FOREGROUND: '#F8F9FA',
+ FOREGROUND_LIGHT: '#8B9092',
+ TICKET_BORDER: '#B2B2B2',
+ TICKET_BACKGROUND: '#FFFFFF',
+ TICKET_BACKGROUND_CODE: '#F8F9FA',
+ TICKET_FOREGROUND: '#171717',
+ TICKET_FOREGROUND_LIGHT: '#707070',
+ BORDER: '#B2B2B2',
+ CODE_LINE_NUMBER: '#707070',
+ CODE_BASE: '#171717',
+ CODE_HIGHLIGHT: '#E6E6E6',
+ CODE_FUNCTION: '#171717',
+ CODE_VARIABLE: '#171717',
+ CODE_METHOD: '#171717',
+ CODE_EXPRESSION: '#171717',
+ CODE_STRING: '#00bb68',
+ CODE_NUMBER: '#00bb68',
+ CODE_NULL: '#171717',
+ },
+ secret: {
+ BACKGROUND: '#0F2BE6',
+ FOREGROUND: '#EDEDED',
+ FOREGROUND_LIGHT: '#EDEDED',
+ TICKET_BORDER: '#3059F2',
+ TICKET_BACKGROUND: '#0F2BE6',
+ TICKET_BACKGROUND_CODE: '#0000B4',
+ TICKET_FOREGROUND: '#EDEDED',
+ TICKET_FOREGROUND_LIGHT: '#EDEDED',
+ BORDER: '#3059F2',
+ CODE_LINE_NUMBER: '#5F7BF6',
+ CODE_BASE: '#EDEDED',
+ CODE_HIGHLIGHT: '#3059F2',
+ CODE_FUNCTION: '#EDEDED',
+ CODE_VARIABLE: '#EDEDED',
+ CODE_METHOD: '#EDEDED',
+ CODE_EXPRESSION: '#EDEDED',
+ CODE_STRING: '#48FF1A',
+ CODE_NUMBER: '#48FF1A',
+ CODE_NULL: '#EDEDED',
+ },
+}
+
+export async function handler(req: Request) {
+ const url = new URL(req.url)
+ const username = url.searchParams.get('username') ?? url.searchParams.get('amp;username')
+ const assumePlatinum = url.searchParams.get('platinum') ?? url.searchParams.get('amp;platinum')
+ const userAgent = req.headers.get('user-agent')
+
+ console.log('force deploy')
+
+ try {
+ if (!username) throw new Error('missing username param')
+
+ const supabaseAdminClient = createClient(
+ // Supabase API URL - env var exported by default when deployed.
+ Deno.env.get('LIVE_SUPABASE_URL') ?? 'http://host.docker.internal:54321',
+ // Supabase API SERVICE ROLE KEY - env var exported by default when deployed.
+ Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? ''
+ )
+
+ // Track social shares
+ if (userAgent?.toLocaleLowerCase().includes('twitter')) {
+ await supabaseAdminClient
+ .from(LW_TABLE)
+ .update({ shared_on_twitter: 'now' })
+ .eq('launch_week', 'lw12')
+ .eq('username', username)
+ .is('shared_on_twitter', null)
+ } else if (userAgent?.toLocaleLowerCase().includes('linkedin')) {
+ await supabaseAdminClient
+ .from(LW_TABLE)
+ .update({ shared_on_linkedin: 'now' })
+ .eq('launch_week', 'lw12')
+ .eq('username', username)
+ .is('shared_on_linkedin', null)
+ }
+
+ // Get ticket data
+ const { data: user, error } = await supabaseAdminClient
+ .from(LW_MATERIALIZED_VIEW)
+ .select(
+ 'id, name, ticket_number, shared_on_twitter, shared_on_linkedin, platinum, secret, role, company, location'
+ )
+ .eq('launch_week', 'lw12')
+ .eq('username', username)
+ .maybeSingle()
+
+ if (error) console.log('fetch error', error.message)
+ if (!user) throw new Error(error?.message ?? 'user not found')
+
+ const {
+ name,
+ ticket_number: ticketNumber,
+ secret,
+ platinum: isPlatinum,
+ shared_on_twitter: sharedOnTwitter,
+ shared_on_linkedin: sharedOnLinkedIn,
+ } = user
+
+ const platinum = isPlatinum ?? (!!sharedOnTwitter && !!sharedOnLinkedIn) ?? false
+ if (assumePlatinum && !platinum)
+ return await fetch(`${STORAGE_URL}/assets/platinum_no_meme.jpg`)
+
+ // Generate image and upload to storage.
+ const ticketType = secret ? 'secret' : platinum ? 'platinum' : 'regular'
+
+ const fontData = await font
+ const monoFontData = await mono_font
+ const OG_WIDTH = 1200
+ const OG_HEIGHT = 628
+ const OG_PADDING_X = 60
+ const OG_PADDING_Y = 60
+ const TICKET_WIDTH = 550
+ const TICKET_RATIO = 396 / 613
+ const TICKET_HEIGHT = TICKET_WIDTH / TICKET_RATIO
+ const TICKET_POS_TOP = OG_PADDING_Y
+ const TICKET_POS_LEFT = 540
+ const LOGO_WIDTH = 40
+ const LOGO_RATIO = 436 / 449
+ const DISPLAY_NAME = name || username
+ const FIRST_NAME = DISPLAY_NAME?.split(' ')[0]
+
+ const BACKGROUND = {
+ regular: {
+ LOGO: `${STORAGE_URL}/assets/supabase/supabase-logo-icon.png`,
+ BACKGROUND_GRID: `${STORAGE_URL}/assets/bg-dark.png?t=2024-07-26T11%3A13%3A36.534Z`,
+ },
+ platinum: {
+ LOGO: `${STORAGE_URL}/assets/supabase/supabase-logo-icon.png`,
+ BACKGROUND_GRID: `${STORAGE_URL}/assets/bg-dark.png?t=2024-07-26T11%3A13%3A36.534Z`,
+ },
+ secret: {
+ LOGO: `${STORAGE_URL}/assets/supabase/supabase-logo-icon-white.png`,
+ BACKGROUND_GRID: `${STORAGE_URL}/assets/bg-light.png`,
+ },
+ }
+
+ const lineNumberStyle = {
+ paddingLeft: 24,
+ width: 46,
+ color: STYLING_CONGIF[ticketType].CODE_LINE_NUMBER,
+ }
+
+ const generatedTicketImage = new ImageResponse(
+ (
+ <>
+
+ {/* Background */}
+

+ {/* Ticket */}
+
+
+ Launch Week 12
+
+ Ticket
+
+
+ {/* Request code snippet */}
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+
+
+
+ await{' '}
+
+ supabase
+
+
+
+ .
+ from
+ (
+ 'tickets'
+ )
+
+
+ .
+ select
+ (
+ '*'
+ )
+
+
+ .
+ eq
+ (
+
+ 'username'
+
+ ,
+
+ {username}
+
+ )
+
+
+ .
+ single
+ (
+ )
+
+
+
+ {/* Response Json */}
+
+
+ TICKET RESPONSE
+
+
+
+ 1
+ {
+
+
+ 2
+
+
+ data:
+
+ {
+
+
+
+
+ 3
+
+
+ name
+
+ :
+
+ "{name}"
+
+ ,
+
+
+
+ 4
+
+
+ username
+
+ :
+
+ "{username}"
+
+ ,
+
+
+
+ 6
+
+
+ ticket_number
+
+ :
+
+ "{ticketNumber}"
+
+ ,
+
+
+
+ 7
+
+
+ role
+
+ :
+
+ "{user.role}"
+
+ ,
+
+
+
+ 8
+
+
+ company
+
+ :
+
+ "{user.company}"
+
+ ,
+
+
+
+ 9
+
+
+ location
+
+ :
+
+ "{user.location}"
+
+ ,
+
+
+
+
+ 10
+ },
+
+
+ 11
+
+
+ error
+
+ :
+
+ null
+
+
+
+
+ 12
+ }
+
+
+
+
+
+
+
+

+
+
+
+
+ Join {FIRST_NAME} for
+
+
+ Launch Week 12
+
+
+
+ August 12-16 / 7AM PT
+
+
+
+ >
+ ),
+ {
+ width: OG_WIDTH,
+ height: OG_HEIGHT,
+ fonts: [
+ {
+ name: 'Circular',
+ data: fontData,
+ style: 'normal',
+ },
+ {
+ name: 'SourceCodePro',
+ data: monoFontData,
+ style: 'normal',
+ },
+ ],
+ headers: {
+ 'content-type': 'image/png',
+ 'cache-control': 'public, max-age=31536000, s-maxage=31536000, no-transform, immutable',
+ 'cdn-cache-control': 'max-age=31536000',
+ },
+ }
+ )
+
+ // [Note] Uncomment only for local testing to return the image directly and skip storage upload.
+ // return await generatedTicketImage
+
+ // Upload image to storage.
+ const { error: storageError } = await supabaseAdminClient.storage
+ .from('images')
+ .upload(`launch-week/lw12/og/${ticketType}/${username}.png`, generatedTicketImage.body!, {
+ contentType: 'image/png',
+ // cacheControl: `${60 * 60 * 24 * 7}`,
+ cacheControl: `0`,
+ // Update cached og image, people might need to update info
+ upsert: true,
+ })
+
+ if (storageError) throw new Error(`storageError: ${storageError.message}`)
+
+ const NEW_TIMESTAMP = new Date()
+
+ return await fetch(`${STORAGE_URL}/og/${ticketType}/${username}.png?t=${NEW_TIMESTAMP}`)
+ } catch (error) {
+ return new Response(JSON.stringify({ error: error.message }), {
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ status: 400,
+ })
+ }
+}
diff --git a/supabase/functions/lw12-ticket-og/index.ts b/supabase/functions/lw12-ticket-og/index.ts
new file mode 100644
index 0000000000..d83ec16bac
--- /dev/null
+++ b/supabase/functions/lw12-ticket-og/index.ts
@@ -0,0 +1,11 @@
+// Follow this setup guide to integrate the Deno language server with your editor:
+// https://deno.land/manual/getting_started/setup_your_environment
+// This enables autocomplete, go to definition, etc.
+
+import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'
+
+import { handler } from './handler.tsx'
+
+console.log(`Function "lw12-ticket-og" up and running`)
+
+serve(handler)
diff --git a/supabase/migrations/20240723131601_drop_unused_tables.sql b/supabase/migrations/20240723131601_drop_unused_tables.sql
new file mode 100644
index 0000000000..34871d2eee
--- /dev/null
+++ b/supabase/migrations/20240723131601_drop_unused_tables.sql
@@ -0,0 +1,6 @@
+alter table "public"."active_pgbouncer_projects" drop constraint "active_pgbouncer_projects_pkey";
+alter table "public"."vercel_project_connections_without_supavisor" drop constraint "vercel_project_connections_without_supavisor_pkey";
+drop index if exists "public"."active_pgbouncer_projects_pkey";
+drop index if exists "public"."vercel_project_connections_without_supavisor_pkey";
+drop table "public"."active_pgbouncer_projects";
+drop table "public"."vercel_project_connections_without_supavisor";
\ No newline at end of file
diff --git a/supabase/migrations/20240723155310_add_lw12_ticketing_schema.sql b/supabase/migrations/20240723155310_add_lw12_ticketing_schema.sql
new file mode 100644
index 0000000000..467b01f84e
--- /dev/null
+++ b/supabase/migrations/20240723155310_add_lw12_ticketing_schema.sql
@@ -0,0 +1,142 @@
+create extension if not exists "uuid-ossp";
+
+create table public.launch_weeks (
+ id text not null primary key, -- 'lw12', 'lw13', etc
+ created_at timestamp with time zone not null default timezone ('utc'::text, now()),
+ start_date timestamp with time zone null,
+ end_date timestamp with time zone null
+);
+
+alter table public.launch_weeks enable row level security;
+
+create policy "Allow public read access"
+on "public"."launch_weeks"
+as PERMISSIVE
+for select
+using ( true );
+
+insert into public.launch_weeks (id) values ('lw12');
+
+create table
+ public.tickets (
+ id uuid not null default uuid_generate_v4(),
+ created_at timestamp with time zone not null default timezone('utc'::text, now()),
+ launch_week text not null references public.launch_weeks (id),
+ user_id uuid not null references auth.users (id),
+ email text null,
+ name text null,
+ username text null,
+ referred_by text null,
+ shared_on_twitter timestamp with time zone null,
+ shared_on_linkedin timestamp with time zone null,
+ game_won_at timestamp with time zone null,
+ ticket_number bigint generated by default as identity,
+ metadata jsonb null,
+ role text null,
+ company text null,
+ location text null,
+ constraint tickets_pkey primary key (id),
+ constraint tickets_email_key unique (email, launch_week),
+ constraint tickets_ticket_number_key unique (ticket_number, launch_week),
+ constraint tickets_username_key unique (username, launch_week),
+ constraint public_tickets_id_fkey foreign key (user_id) references auth.users (id)
+ );
+
+alter table public.tickets enable row level security;
+alter publication supabase_realtime add table public.tickets;
+
+GRANT UPDATE (role) ON TABLE public.tickets TO authenticated;
+GRANT UPDATE (company) ON TABLE public.tickets TO authenticated;
+GRANT UPDATE (location) ON TABLE public.tickets TO authenticated;
+
+create policy "Allow user to select own ticket"
+on public.tickets
+as PERMISSIVE
+for SELECT
+to authenticated
+using (user_id = auth.uid());
+
+create policy "Allow authenticated user to update its own ticket"
+on public.tickets
+as permissive
+for update
+to authenticated
+using (user_id = auth.uid())
+with check (user_id = auth.uid());
+
+create policy "Allow insert for authenticated users only"
+on public.tickets
+as permissive
+for insert
+to authenticated
+with check (user_id = auth.uid());
+
+-- public view without sensible data
+create or replace view
+ public.tickets_view with (security_invoker=on) as
+with
+ lw12_referrals as (
+ select
+ tickets_1.referred_by,
+ count(*) as referrals
+ from
+ tickets tickets_1
+ where
+ tickets_1.referred_by is not null
+ group by
+ tickets_1.referred_by
+ )
+select
+ tickets.id,
+ tickets.name,
+ tickets.username,
+ tickets.ticket_number,
+ tickets.created_at,
+ tickets.launch_week,
+ tickets.shared_on_twitter,
+ tickets.shared_on_linkedin,
+ tickets.metadata,
+ tickets.role,
+ tickets.company,
+ tickets.location,
+ case
+ when lw12_referrals.referrals is null then 0::bigint
+ else lw12_referrals.referrals
+ end as referrals,
+ case
+ when tickets.shared_on_twitter is not null
+ and tickets.shared_on_linkedin is not null then true
+ else false
+ end as platinum,
+ case
+ when tickets.game_won_at is not null then true
+ else false
+ end as secret
+from
+ tickets
+ left join lw12_referrals on tickets.username = lw12_referrals.referred_by;
+
+-- Create meetups table
+create table
+ public.meetups (
+ id uuid not null default uuid_generate_v4(),
+ created_at timestamp with time zone not null default now(),
+ launch_week text not null references public.launch_weeks (id),
+ title text null,
+ country text null,
+ start_at timestamp with time zone null,
+ link text null,
+ display_info text null,
+ is_live boolean not null default false,
+ is_published boolean not null default false,
+ constraint meetups_pkey primary key (id)
+ );
+
+alter table public.meetups enable row level security;
+alter publication supabase_realtime add table public.meetups;
+
+create policy "Allow anybody to select all meetups"
+on public.meetups
+as permissive
+for select
+using (true);
\ No newline at end of file
diff --git a/supabase/seed.sql b/supabase/seed.sql
index e69de29bb2..c9380d1bfb 100644
--- a/supabase/seed.sql
+++ b/supabase/seed.sql
@@ -0,0 +1,6 @@
+insert into meetups
+ (title, country, launch_week, start_at, is_published)
+values
+ ('New York', 'USA', 'lw12', now(), true),
+ ('London', 'UK', 'lw12', now(), true),
+ ('Singapore', 'Singapore', 'lw12', now(), true);
diff --git a/turbo.json b/turbo.json
index 4b327205f9..ad5c5da3ae 100644
--- a/turbo.json
+++ b/turbo.json
@@ -63,7 +63,9 @@
"NEXT_PUBLIC_*",
"NODE_ENV",
"OPENAI_API_KEY",
- "npm_lifecycle_event"
+ "npm_lifecycle_event",
+ "LIVE_SUPABASE_COM_SERVICE_ROLE_KEY",
+ "VERCEL_URL"
],
"outputs": [".next/**", "!.next/cache/**", ".contentlayer/**"]
},