diff --git a/apps/www/_case-studies/epsilon3.mdx b/apps/www/_customers/epsilon3.mdx similarity index 100% rename from apps/www/_case-studies/epsilon3.mdx rename to apps/www/_customers/epsilon3.mdx diff --git a/apps/www/_case-studies/happyteams.mdx b/apps/www/_customers/happyteams.mdx similarity index 100% rename from apps/www/_case-studies/happyteams.mdx rename to apps/www/_customers/happyteams.mdx diff --git a/apps/www/_case-studies/mobbin.mdx b/apps/www/_customers/mobbin.mdx similarity index 100% rename from apps/www/_case-studies/mobbin.mdx rename to apps/www/_customers/mobbin.mdx diff --git a/apps/www/_case-studies/replenysh.mdx b/apps/www/_customers/replenysh.mdx similarity index 100% rename from apps/www/_case-studies/replenysh.mdx rename to apps/www/_customers/replenysh.mdx diff --git a/apps/www/_case-studies/xendit.mdx b/apps/www/_customers/xendit.mdx similarity index 100% rename from apps/www/_case-studies/xendit.mdx rename to apps/www/_customers/xendit.mdx diff --git a/apps/www/components/Nav/Product.tsx b/apps/www/components/Nav/Product.tsx index 5ced2463e55..236b75f7768 100644 --- a/apps/www/components/Nav/Product.tsx +++ b/apps/www/components/Nav/Product.tsx @@ -1,11 +1,12 @@ import React from 'react' import SolutionsData from 'data/Solutions.json' -import CaseStudiesData from 'data/CaseStudies.json' +import CustomerStoriesData from 'data/CustomerStories.json' import { useRouter } from 'next/router' import ProductIcon from '../ProductIcon' -import { Badge, Button, IconArrowRight } from 'ui' +import { Badge } from 'ui' import Image from 'next/image' import Link from 'next/link' +import TextLink from '../TextLink' const Product = () => { const { basePath } = useRouter() @@ -47,9 +48,9 @@ const Product = () => {
-

Latest case studies

+

Latest customer stories

- - - +
+ +
diff --git a/apps/www/data/CustomerStories.json b/apps/www/data/CustomerStories.json index a0846af7313..c94eb20b47c 100644 --- a/apps/www/data/CustomerStories.json +++ b/apps/www/data/CustomerStories.json @@ -1,53 +1,53 @@ [ { "type": "Customer Story", - "title": "A web crawler handling millions of API requests.", - "description": "See how Monitoro built and automated a scraping platform using Supabase.", - "imgUrl": "images/case-study-monitoro.jpg", - "logoUrl": "images/logos/monitoro.png", - "organization": "Monitoro", - "url": "/blog/case-study-monitoro", - "path": "/blog/case-study-monitoro", + "title": "HappyTeams unlocks better performance and reduces cost with Supabase.", + "description": "How a bootstrapped startup migrated from Heroku to Supabase in 30 minutes and never looked back.", + "imgUrl": "images/case-studies/logos/happyteams.png", + "logoUrl": "images/case-studies/logos/happyteams.png", + "organization": "HappyTeams", + "url": "/customers/happyteams", + "path": "/customers/happyteams", "postMeta": { "name": "Paul Copplestone", "avatarUrl": "https://avatars0.githubusercontent.com/u/10214025?v=4", - "publishDate": "Mar 16, 2020", + "publishDate": "Feb 16, 2023", "readLength": 6 }, - "ctaText": "View case study" + "ctaText": "View story" }, { "type": "Customer Story", - "title": "Counter-fraud watchlists for the fintech industry.", - "description": "See how Xendit use Supabase to build a full-text search engine.", - "imgUrl": "images/case-study-xendit.jpg", - "logoUrl": "images/logos/xendit.png", - "organization": "Llama Lab", - "url": "/blog/case-study-xendit", - "path": "/blog/case-study-xendit", + "title": "Xendit use Supabase and create a full solution shipped to production in less than one week.", + "description": "As a payment processor, Xendit are responsible for verifying that all transactions are legal.", + "imgUrl": "images/case-studies/logos/xendit.png", + "logoUrl": "images/case-studies/logos/xendit.png", + "organization": "Xendit", + "url": "/customers/xendit", + "path": "/customers/xendit", "postMeta": { "name": "Paul Copplestone", "avatarUrl": "https://avatars0.githubusercontent.com/u/10214025?v=4", - "publishDate": "Mar 20, 2020", - "readLength": 10 + "publishDate": "Feb 14, 2023", + "readLength": 6 }, - "ctaText": "View case study" + "ctaText": "View story" }, { "type": "Customer Story", - "title": "A no-code website builder, deployed in seven days.", - "description": "See how Tayfa went from idea to paying customer in less than 30 days.", - "imgUrl": "images/case-study-tayfab.jpg", - "logoUrl": "images/logos/monitoro.png", - "organization": "Tayfab", - "url": "/blog/case-study-tayfa", - "path": "/blog/case-study-tayfa", + "title": "Replenysh uses Supabase to implement OTP in less than 24 hours.", + "description": "With Supabase, Replenysh gets a slick auth experience, reduces DevOps overhead, and continues to scale with Postgres.", + "imgUrl": "images/case-studies/logos/replenysh.png", + "logoUrl": "images/case-studies/logos/replenysh.png", + "organization": "Replenysh", + "url": "/customers/replenysh", + "path": "/customers/replenysh", "postMeta": { "name": "Paul Copplestone", "avatarUrl": "https://avatars0.githubusercontent.com/u/10214025?v=4", - "publishDate": "Mar 27, 2020", - "readLength": 5 + "publishDate": "Feb 14, 2023", + "readLength": 6 }, - "ctaText": "View case study" + "ctaText": "View story" } ] diff --git a/apps/www/data/Footer.json b/apps/www/data/Footer.json index cf5f6dcb29b..d7a8da8c24a 100644 --- a/apps/www/data/Footer.json +++ b/apps/www/data/Footer.json @@ -106,8 +106,8 @@ "url": "/blog" }, { - "text": "Case Studies", - "url": "/case-studies" + "text": "Customer Stories", + "url": "/customers" }, { "text": "Careers", diff --git a/apps/www/internals/generate-sitemap.mjs b/apps/www/internals/generate-sitemap.mjs index 7cb919fe006..35dde9ce42c 100644 --- a/apps/www/internals/generate-sitemap.mjs +++ b/apps/www/internals/generate-sitemap.mjs @@ -16,6 +16,7 @@ async function generate() { 'data/**/*.mdx', '_blog/*.mdx', '_case-studies/*.mdx', + '_customers/*.mdx', '_alternatives/*.mdx', '!pages/index.tsx', '!data/*.mdx', @@ -27,6 +28,7 @@ async function generate() { const blogUrl = 'blog' const caseStudiesUrl = 'case-studies' + const customerStoriesUrl = 'customers' const sitemap = ` @@ -39,6 +41,7 @@ async function generate() { // add a `/` for blog posts .replace('_blog', `/${blogUrl}`) .replace('_case-studies', `/${caseStudiesUrl}`) + .replace('_customers', `/${customerStoriesUrl}`) .replace('_alternatives', '/alternatives') .replace('.tsx', '') .replace('.mdx', '') @@ -55,6 +58,7 @@ async function generate() { if (route === '/alternatives/[slug]') return null if (route === '/partners/[slug]') return null if (route === '/case-studies/[slug]') return null + if (route === '/customers/[slug]') return null if (route === '/launch-week/ticket-image') return null /** diff --git a/apps/www/lib/posts.tsx b/apps/www/lib/posts.tsx index 7b33f339012..1b9080bf7d8 100644 --- a/apps/www/lib/posts.tsx +++ b/apps/www/lib/posts.tsx @@ -3,7 +3,7 @@ import path from 'path' import matter from 'gray-matter' import { generateReadingTime } from './helpers' -type Directories = '_blog' | '_case-studies' | '_alternatives' +type Directories = '_blog' | '_case-studies' | '_customers' | '_alternatives' // substring amount for file names // based on YYYY-MM-DD format diff --git a/apps/www/pages/customers/[slug].tsx b/apps/www/pages/customers/[slug].tsx index f4cc0b43c6c..a31ba97d671 100644 --- a/apps/www/pages/customers/[slug].tsx +++ b/apps/www/pages/customers/[slug].tsx @@ -17,7 +17,7 @@ import { getAllPostSlugs, getPostdata, getSortedPosts } from '~/lib/posts' const toc = require('markdown-toc') export async function getStaticPaths() { - const paths = getAllPostSlugs('_case-studies') + const paths = getAllPostSlugs('_customers') return { paths, fallback: false, @@ -26,13 +26,13 @@ export async function getStaticPaths() { export async function getStaticProps({ params }: any) { const filePath = `${params.slug}` - const postContent = await getPostdata(filePath, '_case-studies') + const postContent = await getPostdata(filePath, '_customers') const { data, content } = matter(postContent) const mdxSource: any = await mdxSerialize(content) - const relatedPosts = getSortedPosts('_case-studies', 5, mdxSource.scope.tags) + const relatedPosts = getSortedPosts('_customers', 5, mdxSource.scope.tags) - const allPosts = getSortedPosts('_case-studies') + const allPosts = getSortedPosts('_customers') const currentIndex = allPosts .map(function (e) { return e.slug @@ -125,7 +125,7 @@ function CaseStudyPage(props: any) { {/* Back button */}

@@ -142,8 +142,10 @@ function CaseStudyPage(props: any) {

- - Case Studies + + + Customer Stories +

{props.blog.title} diff --git a/apps/www/pages/customers/index.tsx b/apps/www/pages/customers/index.tsx index 67db005108e..4fbf7f6ee33 100644 --- a/apps/www/pages/customers/index.tsx +++ b/apps/www/pages/customers/index.tsx @@ -16,13 +16,13 @@ import Link from 'next/link' import { GlassPanel } from 'ui' export async function getStaticProps() { - const allPostsData = getSortedPosts('_case-studies') - const categories = getAllCategories('_case-studies') + const allPostsData = getSortedPosts('_customers') + const categories = getAllCategories('_customers') const rss = generateRss(allPostsData) // create a rss feed in public directory // rss feed is added via component in render return - fs.writeFileSync('./public/case-studies-rss.xml', rss) + fs.writeFileSync('./public/customers-rss.xml', rss) return { props: { @@ -64,8 +64,8 @@ function CustomerStoriesPage(props: any) { { } export async function getStaticProps() { - const customerStories = getSortedPosts('_case-studies', 3) + const customerStories = getSortedPosts('_customers', 3) return { props: { diff --git a/apps/www/public/customers-rss.xml b/apps/www/public/customers-rss.xml new file mode 100644 index 00000000000..afd1ea7d986 --- /dev/null +++ b/apps/www/public/customers-rss.xml @@ -0,0 +1,47 @@ + + + + Blog - Supabase + https://supabase.com + Latest news from Supabase + en + Wed, 15 Feb 2023 23:11:00 +0000 + + + https://supabase.com/customers/happyteams + HappyTeams unlocks better performance and reduces cost with Supabase. + https://supabase.com/customers/happyteams + How a bootstrapped startup migrated from Heroku to Supabase in 30 minutes and never looked back. + Wed, 15 Feb 2023 23:11:00 +0000 + + + https://supabase.com/customers/xendit + Xendit use Supabase and create a full solution shipped to production in less than one week. + https://supabase.com/customers/xendit + As a payment processor, Xendit are responsible for verifying that all transactions are legal. + Mon, 13 Feb 2023 23:11:00 +0000 + + + https://supabase.com/customers/replenysh + Replenysh uses Supabase to implement OTP in less than 24 hours. + https://supabase.com/customers/replenysh + With Supabase, Replenysh gets a slick auth experience, reduces DevOps overhead, and continues to scale with Postgres. + Mon, 13 Feb 2023 23:11:00 +0000 + + + https://supabase.com/customers/mobbin + How Mobbin migrated 200,000 users from Firebase for a better authentication experience. + https://supabase.com/customers/mobbin + Mobbin helps over 200,000 creators globally search and view the latest design patterns from well-known apps. + Mon, 13 Feb 2023 23:11:00 +0000 + + + https://supabase.com/customers/epsilon3 + Epsilon3 digitize paper-based procedures in the space industry using telemetry data, simplifying testing and operations. + https://supabase.com/customers/epsilon3 + Epsilon3 uses Supabase to help teams execute secure and reliable operations in an industry where project spend runs into the billions. + Mon, 13 Feb 2023 23:11:00 +0000 + + + +