mirror of
https://github.com/supabase/supabase.git
synced 2026-10-09 03:15:06 +03:00
Merge pull request #12709 from vozmi/partner-pages-to-sitemap
Partner pages changes + sitemap generation
This commit is contained in:
5 files changed
+928
-272
No files matched your search
@@ -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')
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
Reference in new issue
Block a user