Merge pull request #12709 from vozmi/partner-pages-to-sitemap

Partner pages changes + sitemap generation
This commit is contained in:
Terry Sutton authored and GitHub committed 2023-05-30 12:15:05 -02:30
commit 30c30e2248
5 files changed
+928 -272

No files matched your search

+4 -5
View File
@@ -24,8 +24,8 @@ async function generate() {
'!pages/*/index.tsx',
'!pages/api',
'!pages/404.js',
//get the generated partner pages
'.next/server/pages/partners/*.html',
'.next/server/pages/partners/integrations/*.html',
'.next/server/pages/partners/experts/*.html',
])
const blogUrl = 'blog'
@@ -39,9 +39,9 @@ async function generate() {
.filter((page) => !page.includes('_document.tsx'))
.map((page) => {
const path = page
//replace the path for the generated partner pages
.replace('.next/server/pages/partners/', '/partners/')
.replace('.next/server/pages', '')
.replace('pages', '')
.replace('.html', '')
// add a `/` for blog posts
.replace('_blog', `/${blogUrl}`)
.replace('_case-studies', `/${caseStudiesUrl}`)
@@ -49,7 +49,6 @@ async function generate() {
.replace('_alternatives', '/alternatives')
.replace('.tsx', '')
.replace('.mdx', '')
.replace('.html', '')
// replace the paths for nested 'index' based routes
.replace('/auth/Auth', '/auth')
.replace('/database/Database', '/database')
+17 -198
View File
@@ -1,202 +1,12 @@
import { IconChevronLeft, IconExternalLink } from 'ui'
import { marked } from 'marked'
import { GetStaticPaths, GetStaticProps } from 'next'
import { NextSeo } from 'next-seo'
import Image from 'next/image'
import Link from 'next/link'
import { Swiper, SwiperSlide } from 'swiper/react'
import 'swiper/swiper.min.css'
import DefaultLayout from '~/components/Layouts/Default'
import SectionContainer from '~/components/Layouts/SectionContainer'
import supabase from '~/lib/supabase'
import { Partner } from '~/types/partners'
import Error404 from '../404'
function PartnerPage({ partner }: { partner: Partner }) {
if (!partner) return <Error404 />
return (
<>
<NextSeo
title={`${partner.title} | Works With Supabase`}
description={partner.description}
openGraph={{
title: `${partner.title} | Works With Supabase`,
description: partner.description,
url: `https://supabase.com/partners/${partner.slug}`,
images: [
{
url: partner.images[0] ?? partner.logo,
},
],
}}
/>
<DefaultLayout>
<SectionContainer>
<div className="col-span-12 mx-auto mb-2 max-w-5xl space-y-12 lg:col-span-2">
{/* Back button */}
<Link href={`/partners/${partner.type === 'technology' ? 'integrations' : 'experts'}`}>
<a className="text-scale-1200 hover:text-scale-1000 flex cursor-pointer items-center transition-colors">
<IconChevronLeft style={{ padding: 0 }} />
Back
</a>
</Link>
<div className="flex items-center space-x-4">
<Image
layout="fixed"
width={56}
height={56}
className="bg-scale-400 flex-shrink-f0 h-14 w-14 rounded-full"
src={partner.logo}
alt={partner.title}
/>
<h1 className="h1" style={{ marginBottom: 0 }}>
{partner.title}
</h1>
</div>
<div
className="bg-scale-300 py-6"
style={{ marginLeft: 'calc(50% - 50vw)', marginRight: 'calc(50% - 50vw)' }}
>
<Swiper
initialSlide={0}
spaceBetween={0}
slidesPerView={4}
speed={300}
// slidesOffsetBefore={300}
centerInsufficientSlides={true}
breakpoints={{
320: {
slidesPerView: 1,
},
720: {
slidesPerView: 2,
},
920: {
slidesPerView: 3,
},
1024: {
slidesPerView: 4,
},
1208: {
slidesPerView: 5,
},
}}
>
{partner.images.map((image: any, i: number) => {
return (
<SwiperSlide key={i}>
<div className="relative ml-3 mr-3 block cursor-move overflow-hidden rounded-md">
<Image
layout="responsive"
objectFit="contain"
width={1460}
height={960}
src={image}
alt={partner.title}
/>
</div>
</SwiperSlide>
)
})}
</Swiper>
</div>
<div className="grid gap-3 space-y-16 lg:grid-cols-4 lg:space-y-0 lg:space-x-3">
<div className="lg:col-span-3">
<h2
className="text-scale-1200"
style={{ fontSize: '1.5rem', marginBottom: '1rem' }}
>
Overview
</h2>
{partner.video && (
<div
className="bg-scale-1000 relative w-full rounded-md shadow-lg"
style={{ padding: '56.25% 0 0 0', marginBottom: '1rem' }}
>
<iframe
title="Demo video showcasing Supabase"
className="absolute h-full w-full rounded-md"
src={`https://www.youtube-nocookie.com/embed/${partner.video}?autoplay=0&loop=0&controls=1&modestbranding=1&rel=0&disablekb=1`}
style={{ top: 0, left: 0 }}
frameBorder="0"
allow="autoplay; modestbranding; encrypted-media"
/>
</div>
)}
<div className="prose" dangerouslySetInnerHTML={{ __html: partner.overview }} />
</div>
<div>
<h2
className="text-scale-1200"
style={{ fontSize: '1.5rem', marginBottom: '1rem' }}
>
Details
</h2>
<div className="text-scale-1200 divide-y">
{partner.type === 'technology' && (
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Developer</span>
<span className="text-scale-1200">{partner.developer}</span>
</div>
)}
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Category</span>
<Link
href={`/partners/${
partner.type === 'technology' ? 'integrations' : 'experts'
}#${partner.category.toLowerCase()}`}
>
<a className="text-brand-900 hover:text-brand-800 transition-colors">
{partner.category}
</a>
</Link>
</div>
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Website</span>
<a
href={partner.website}
target="_blank"
rel="noreferrer"
className="text-brand-900 hover:text-brand-800 transition-colors"
>
{new URL(partner.website).host}
</a>
</div>
{partner.type === 'technology' && (
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Documentation</span>
<a
href={partner.docs}
target="_blank"
rel="noreferrer"
className="text-brand-900 hover:text-brand-800 transition-colors"
>
<span className="flex items-center space-x-1">
<span>Learn</span>
<IconExternalLink size="small" />
</span>
</a>
</div>
)}
</div>
</div>
</div>
</div>
</SectionContainer>
</DefaultLayout>
</>
)
function PartnerPage() {
// Should be redirected to ./experts/:slug or ./integrations/:slug
return <Error404 />
}
// This function gets called at build time
@@ -228,18 +38,27 @@ export const getStaticProps: GetStaticProps = async ({ params }) => {
.eq('slug', params!.slug as string)
.single()
if (!partner) {
if (!partner || process.env.npm_lifecycle_event === 'build') {
return {
notFound: true,
}
}
// Parse markdown
partner.overview = marked.parse(partner.overview)
let redirectUrl: string
switch (partner.type) {
case 'technology':
redirectUrl = `/partners/integrations/${partner.slug}`
break
case 'expert':
redirectUrl = `/partners/experts/${partner.slug}`
break
}
return {
props: { partner },
revalidate: 18000, // In seconds - refresh every 5 hours
redirect: {
permanent: false,
destination: redirectUrl,
},
}
}
+242
View File
@@ -0,0 +1,242 @@
import { marked } from 'marked'
import { GetStaticPaths, GetStaticProps } from 'next'
import { NextSeo } from 'next-seo'
import Image from 'next/image'
import Link from 'next/link'
import { Swiper, SwiperSlide } from 'swiper/react'
import 'swiper/swiper.min.css'
import { IconChevronLeft, IconExternalLink } from 'ui'
import DefaultLayout from '~/components/Layouts/Default'
import SectionContainer from '~/components/Layouts/SectionContainer'
import supabase from '~/lib/supabase'
import { Partner } from '~/types/partners'
import Error404 from '../../404'
function Partner({ partner }: { partner: Partner }) {
if (!partner) return <Error404 />
return (
<>
<NextSeo
title={`${partner.title} | Works With Supabase`}
description={partner.description}
openGraph={{
title: `${partner.title} | Works With Supabase`,
description: partner.description,
url: `https://supabase.com/partners/experts/${partner.slug}`,
images: [
{
url: partner.images[0] ?? partner.logo,
},
],
}}
/>
<DefaultLayout>
<SectionContainer>
<div className="col-span-12 mx-auto mb-2 max-w-5xl space-y-12 lg:col-span-2">
{/* Back button */}
<Link href="/partners/experts">
<a className="text-scale-1200 hover:text-scale-1000 flex cursor-pointer items-center transition-colors">
<IconChevronLeft style={{ padding: 0 }} />
Back
</a>
</Link>
<div className="flex items-center space-x-4">
<Image
layout="fixed"
width={56}
height={56}
className="bg-scale-400 flex-shrink-f0 h-14 w-14 rounded-full"
src={partner.logo}
alt={partner.title}
/>
<h1 className="h1" style={{ marginBottom: 0 }}>
{partner.title}
</h1>
</div>
<div
className="bg-scale-300 py-6"
style={{ marginLeft: 'calc(50% - 50vw)', marginRight: 'calc(50% - 50vw)' }}
>
<Swiper
initialSlide={0}
spaceBetween={0}
slidesPerView={4}
speed={300}
// slidesOffsetBefore={300}
centerInsufficientSlides={true}
breakpoints={{
320: {
slidesPerView: 1,
},
720: {
slidesPerView: 2,
},
920: {
slidesPerView: 3,
},
1024: {
slidesPerView: 4,
},
1208: {
slidesPerView: 5,
},
}}
>
{partner.images.map((image: any, i: number) => {
return (
<SwiperSlide key={i}>
<div className="relative ml-3 mr-3 block cursor-move overflow-hidden rounded-md">
<Image
layout="responsive"
objectFit="contain"
width={1460}
height={960}
src={image}
alt={partner.title}
/>
</div>
</SwiperSlide>
)
})}
</Swiper>
</div>
<div className="grid gap-3 space-y-16 lg:grid-cols-4 lg:space-y-0 lg:space-x-3">
<div className="lg:col-span-3">
<h2
className="text-scale-1200"
style={{ fontSize: '1.5rem', marginBottom: '1rem' }}
>
Overview
</h2>
{partner.video && (
<div
className="bg-scale-1000 relative w-full rounded-md shadow-lg"
style={{ padding: '56.25% 0 0 0', marginBottom: '1rem' }}
>
<iframe
title="Demo video showcasing Supabase"
className="absolute h-full w-full rounded-md"
src={`https://www.youtube-nocookie.com/embed/${partner.video}?autoplay=0&loop=0&controls=1&modestbranding=1&rel=0&disablekb=1`}
style={{ top: 0, left: 0 }}
frameBorder="0"
allow="autoplay; modestbranding; encrypted-media"
/>
</div>
)}
<div className="prose" dangerouslySetInnerHTML={{ __html: partner.overview }} />
</div>
<div>
<h2
className="text-scale-1200"
style={{ fontSize: '1.5rem', marginBottom: '1rem' }}
>
Details
</h2>
<div className="text-scale-1200 divide-y">
{partner.type === 'technology' && (
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Developer</span>
<span className="text-scale-1200">{partner.developer}</span>
</div>
)}
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Category</span>
<Link href={`/partners/experts#${partner.category.toLowerCase()}`}>
<a className="text-brand-900 hover:text-brand-800 transition-colors">
{partner.category}
</a>
</Link>
</div>
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Website</span>
<a
href={partner.website}
target="_blank"
rel="noreferrer"
className="text-brand-900 hover:text-brand-800 transition-colors"
>
{new URL(partner.website).host}
</a>
</div>
{partner.type === 'technology' && (
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Documentation</span>
<a
href={partner.docs}
target="_blank"
rel="noreferrer"
className="text-brand-900 hover:text-brand-800 transition-colors"
>
<span className="flex items-center space-x-1">
<span>Learn</span>
<IconExternalLink size="small" />
</span>
</a>
</div>
)}
</div>
</div>
</div>
</div>
</SectionContainer>
</DefaultLayout>
</>
)
}
// This function gets called at build time
export const getStaticPaths: GetStaticPaths = async () => {
const { data: slugs } = await supabase.from('partners').select('slug')
const paths: {
params: { slug: string }
locale?: string | undefined
}[] =
slugs?.map(({ slug }) => ({
params: {
slug,
},
})) ?? []
return {
paths,
fallback: 'blocking',
}
}
// This also gets called at build time
export const getStaticProps: GetStaticProps = async ({ params }) => {
let { data: partner } = await supabase
.from('partners')
.select('*')
.eq('approved', true)
.eq('slug', params!.slug as string)
.single()
if (!partner) {
return {
notFound: true,
}
}
// Parse markdown
partner.overview = marked.parse(partner.overview)
return {
props: { partner },
revalidate: 18000, // In seconds - refresh every 5 hours
}
}
export default Partner
@@ -0,0 +1,242 @@
import { marked } from 'marked'
import { GetStaticPaths, GetStaticProps } from 'next'
import { NextSeo } from 'next-seo'
import Image from 'next/image'
import Link from 'next/link'
import { Swiper, SwiperSlide } from 'swiper/react'
import 'swiper/swiper.min.css'
import { IconChevronLeft, IconExternalLink } from 'ui'
import DefaultLayout from '~/components/Layouts/Default'
import SectionContainer from '~/components/Layouts/SectionContainer'
import supabase from '~/lib/supabase'
import { Partner } from '~/types/partners'
import Error404 from '../../404'
function Partner({ partner }: { partner: Partner }) {
if (!partner) return <Error404 />
return (
<>
<NextSeo
title={`${partner.title} | Works With Supabase`}
description={partner.description}
openGraph={{
title: `${partner.title} | Works With Supabase`,
description: partner.description,
url: `https://supabase.com/partners/integrations/${partner.slug}`,
images: [
{
url: partner.images[0] ?? partner.logo,
},
],
}}
/>
<DefaultLayout>
<SectionContainer>
<div className="col-span-12 mx-auto mb-2 max-w-5xl space-y-12 lg:col-span-2">
{/* Back button */}
<Link href="/partners/integrations">
<a className="text-scale-1200 hover:text-scale-1000 flex cursor-pointer items-center transition-colors">
<IconChevronLeft style={{ padding: 0 }} />
Back
</a>
</Link>
<div className="flex items-center space-x-4">
<Image
layout="fixed"
width={56}
height={56}
className="bg-scale-400 flex-shrink-f0 h-14 w-14 rounded-full"
src={partner.logo}
alt={partner.title}
/>
<h1 className="h1" style={{ marginBottom: 0 }}>
{partner.title}
</h1>
</div>
<div
className="bg-scale-300 py-6"
style={{ marginLeft: 'calc(50% - 50vw)', marginRight: 'calc(50% - 50vw)' }}
>
<Swiper
initialSlide={0}
spaceBetween={0}
slidesPerView={4}
speed={300}
// slidesOffsetBefore={300}
centerInsufficientSlides={true}
breakpoints={{
320: {
slidesPerView: 1,
},
720: {
slidesPerView: 2,
},
920: {
slidesPerView: 3,
},
1024: {
slidesPerView: 4,
},
1208: {
slidesPerView: 5,
},
}}
>
{partner.images.map((image: any, i: number) => {
return (
<SwiperSlide key={i}>
<div className="relative ml-3 mr-3 block cursor-move overflow-hidden rounded-md">
<Image
layout="responsive"
objectFit="contain"
width={1460}
height={960}
src={image}
alt={partner.title}
/>
</div>
</SwiperSlide>
)
})}
</Swiper>
</div>
<div className="grid gap-3 space-y-16 lg:grid-cols-4 lg:space-y-0 lg:space-x-3">
<div className="lg:col-span-3">
<h2
className="text-scale-1200"
style={{ fontSize: '1.5rem', marginBottom: '1rem' }}
>
Overview
</h2>
{partner.video && (
<div
className="bg-scale-1000 relative w-full rounded-md shadow-lg"
style={{ padding: '56.25% 0 0 0', marginBottom: '1rem' }}
>
<iframe
title="Demo video showcasing Supabase"
className="absolute h-full w-full rounded-md"
src={`https://www.youtube-nocookie.com/embed/${partner.video}?autoplay=0&loop=0&controls=1&modestbranding=1&rel=0&disablekb=1`}
style={{ top: 0, left: 0 }}
frameBorder="0"
allow="autoplay; modestbranding; encrypted-media"
/>
</div>
)}
<div className="prose" dangerouslySetInnerHTML={{ __html: partner.overview }} />
</div>
<div>
<h2
className="text-scale-1200"
style={{ fontSize: '1.5rem', marginBottom: '1rem' }}
>
Details
</h2>
<div className="text-scale-1200 divide-y">
{partner.type === 'technology' && (
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Developer</span>
<span className="text-scale-1200">{partner.developer}</span>
</div>
)}
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Category</span>
<Link href={`/partners/integrations#${partner.category.toLowerCase()}`}>
<a className="text-brand-900 hover:text-brand-800 transition-colors">
{partner.category}
</a>
</Link>
</div>
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Website</span>
<a
href={partner.website}
target="_blank"
rel="noreferrer"
className="text-brand-900 hover:text-brand-800 transition-colors"
>
{new URL(partner.website).host}
</a>
</div>
{partner.type === 'technology' && (
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Documentation</span>
<a
href={partner.docs}
target="_blank"
rel="noreferrer"
className="text-brand-900 hover:text-brand-800 transition-colors"
>
<span className="flex items-center space-x-1">
<span>Learn</span>
<IconExternalLink size="small" />
</span>
</a>
</div>
)}
</div>
</div>
</div>
</div>
</SectionContainer>
</DefaultLayout>
</>
)
}
// This function gets called at build time
export const getStaticPaths: GetStaticPaths = async () => {
const { data: slugs } = await supabase.from('partners').select('slug')
const paths: {
params: { slug: string }
locale?: string | undefined
}[] =
slugs?.map(({ slug }) => ({
params: {
slug,
},
})) ?? []
return {
paths,
fallback: 'blocking',
}
}
// This also gets called at build time
export const getStaticProps: GetStaticProps = async ({ params }) => {
let { data: partner } = await supabase
.from('partners')
.select('*')
.eq('approved', true)
.eq('slug', params!.slug as string)
.single()
if (!partner) {
return {
notFound: true,
}
}
// Parse markdown
partner.overview = marked.parse(partner.overview)
return {
props: { partner },
revalidate: 18000, // In seconds - refresh every 5 hours
}
}
export default Partner
+423 -69
View File
@@ -42,12 +42,6 @@
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/oss</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/support</loc>
<changefreq>weekly</changefreq>
@@ -601,7 +595,7 @@
</url>
<url>
<loc>https://supabase.com/blog/audit</loc>
<loc>https://supabase.com/blog/postgres-audit</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
@@ -1172,6 +1166,24 @@
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/blog/flutter-multi-factor-authentication</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/blog/supabase-beta-update-april-2023</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/blog/flutter-hackathon</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/customers/epsilon3</loc>
<changefreq>weekly</changefreq>
@@ -1184,6 +1196,12 @@
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/customers/mendableai</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/customers/mobbin</loc>
<changefreq>weekly</changefreq>
@@ -1215,373 +1233,709 @@
</url>
<url>
<loc>https://supabase.com/partners/antstack</loc>
<loc>https://supabase.com/partners/integrations/antstack</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/appsmith</loc>
<loc>https://supabase.com/partners/integrations/appsmith</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/arceptive</loc>
<loc>https://supabase.com/partners/integrations/arceptive</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/arengu</loc>
<loc>https://supabase.com/partners/integrations/arengu</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/authsignal</loc>
<loc>https://supabase.com/partners/integrations/authsignal</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/basedash</loc>
<loc>https://supabase.com/partners/integrations/basedash</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/clerk</loc>
<loc>https://supabase.com/partners/integrations/clerk</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/clutch</loc>
<loc>https://supabase.com/partners/integrations/clutch</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/codesandbox</loc>
<loc>https://supabase.com/partners/integrations/codesandbox</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/dashibase</loc>
<loc>https://supabase.com/partners/integrations/dashibase</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/deepnote</loc>
<loc>https://supabase.com/partners/integrations/deepnote</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/dhiwise</loc>
<loc>https://supabase.com/partners/integrations/dhiwise</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/directus</loc>
<loc>https://supabase.com/partners/integrations/directus</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/doppler</loc>
<loc>https://supabase.com/partners/integrations/doppler</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/draftbit</loc>
<loc>https://supabase.com/partners/integrations/draftbit</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/drapcode</loc>
<loc>https://supabase.com/partners/integrations/drapcode</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/enginedigital</loc>
<loc>https://supabase.com/partners/integrations/enginedigital</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/estuary</loc>
<loc>https://supabase.com/partners/integrations/estuary</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts</loc>
<loc>https://supabase.com/partners/integrations/feelantera</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/feelantera</loc>
<loc>https://supabase.com/partners/integrations/fezto</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/fezto</loc>
<loc>https://supabase.com/partners/integrations/flutterflow</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/flutterflow</loc>
<loc>https://supabase.com/partners/integrations/getstream_io</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/getstream_io</loc>
<loc>https://supabase.com/partners/integrations/illa</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/illa</loc>
<loc>https://supabase.com/partners/integrations/internalio</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/integrations</loc>
<loc>https://supabase.com/partners/integrations/jetadmin</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/internalio</loc>
<loc>https://supabase.com/partners/integrations/keyri</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/jetadmin</loc>
<loc>https://supabase.com/partners/integrations/morrow</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/keyri</loc>
<loc>https://supabase.com/partners/integrations/nextauth</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/morrow</loc>
<loc>https://supabase.com/partners/integrations/nuxt</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/nextauth</loc>
<loc>https://supabase.com/partners/integrations/onesignal</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/nuxt</loc>
<loc>https://supabase.com/partners/integrations/ory</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/onesignal</loc>
<loc>https://supabase.com/partners/integrations/passageidentity</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/ory</loc>
<loc>https://supabase.com/partners/integrations/pgmustard</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/passageidentity</loc>
<loc>https://supabase.com/partners/integrations/picket</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/pgmustard</loc>
<loc>https://supabase.com/partners/integrations/plasmic</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/picket</loc>
<loc>https://supabase.com/partners/integrations/polyscale</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/plasmic</loc>
<loc>https://supabase.com/partners/integrations/prisma</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/polyscale</loc>
<loc>https://supabase.com/partners/integrations/quinence</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/prisma</loc>
<loc>https://supabase.com/partners/integrations/readyset</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/quinence</loc>
<loc>https://supabase.com/partners/integrations/replibyte</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/readyset</loc>
<loc>https://supabase.com/partners/integrations/replicache</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/replibyte</loc>
<loc>https://supabase.com/partners/integrations/retool</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/replicache</loc>
<loc>https://supabase.com/partners/integrations/sequin_io</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/retool</loc>
<loc>https://supabase.com/partners/integrations/snaplet</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/sequin_io</loc>
<loc>https://supabase.com/partners/integrations/solid_software</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/snaplet</loc>
<loc>https://supabase.com/partners/integrations/streamlit</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/solid_software</loc>
<loc>https://supabase.com/partners/integrations/stytch</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/streamlit</loc>
<loc>https://supabase.com/partners/integrations/supertokens</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/stytch</loc>
<loc>https://supabase.com/partners/integrations/teta</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/supertokens</loc>
<loc>https://supabase.com/partners/integrations/tinloof</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/teta</loc>
<loc>https://supabase.com/partners/integrations/trevor_io</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/tinloof</loc>
<loc>https://supabase.com/partners/integrations/uncommonpurpose</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/trevor_io</loc>
<loc>https://supabase.com/partners/integrations/vercel</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/tribehealthsolutions</loc>
<loc>https://supabase.com/partners/integrations/voltapp</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/uncommonpurpose</loc>
<loc>https://supabase.com/partners/integrations/voypost</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/vercel</loc>
<loc>https://supabase.com/partners/integrations/weweb</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/voltapp</loc>
<loc>https://supabase.com/partners/integrations/yepcode</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/voypost</loc>
<loc>https://supabase.com/partners/integrations/zapp_run</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/weweb</loc>
<loc>https://supabase.com/partners/integrations/zuplo</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/yepcode</loc>
<loc>https://supabase.com/partners/experts/antstack</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/zapp_run</loc>
<loc>https://supabase.com/partners/experts/appsmith</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/zuplo</loc>
<loc>https://supabase.com/partners/experts/arceptive</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/arengu</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/authsignal</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/basedash</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/clerk</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/clutch</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/codesandbox</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/dashibase</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/deepnote</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/dhiwise</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/directus</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/doppler</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/draftbit</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/drapcode</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/enginedigital</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/estuary</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/feelantera</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/fezto</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/flutterflow</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/getstream_io</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/illa</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/internalio</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/jetadmin</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/keyri</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/morrow</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/nextauth</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/nuxt</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/onesignal</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/ory</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/passageidentity</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/pgmustard</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/picket</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/plasmic</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/polyscale</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/prisma</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/quinence</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/readyset</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/replibyte</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/replicache</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/retool</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/sequin_io</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/snaplet</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/solid_software</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/streamlit</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/stytch</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/supertokens</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/teta</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/tinloof</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/trevor_io</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/uncommonpurpose</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/vercel</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/voltapp</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/voypost</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/weweb</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/yepcode</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/zapp_run</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>
<url>
<loc>https://supabase.com/partners/experts/zuplo</loc>
<changefreq>weekly</changefreq>
<changefreq>0.5</changefreq>
</url>