diff --git a/app/about/page.tsx b/app/about/page.tsx index e4f68c5..350f2e5 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -1,3 +1,4 @@ +import { Metadata } from 'next'; import React from 'react'; import '@/styles/about.scss'; import Missions from '@/components/about/missions'; @@ -5,6 +6,16 @@ import Community from '@/components/about/community'; import OurValues from '@/components/about/our-values'; import OurInvestors from '@/components/about/our-investors'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; + +export async function generateMetadata(): Promise { + return { + alternates: { + canonical: `${site_url}/about`, + }, + }; +} + function Page() { return (
diff --git a/app/appflowy-blocks/page.tsx b/app/appflowy-blocks/page.tsx index 2fb81cb..6f7081c 100644 --- a/app/appflowy-blocks/page.tsx +++ b/app/appflowy-blocks/page.tsx @@ -1,9 +1,20 @@ +import { Metadata } from 'next'; import React from 'react'; import { blocksPageConfig } from '@/lib/config/pages'; import '@/styles/blocks.scss'; import AppflowyBlocks from '@/components/blocks/appflowy-blocks'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; + +export async function generateMetadata(): Promise { + return { + alternates: { + canonical: `${site_url}/appflowy-about`, + }, + }; +} + function Page() { return (
@@ -11,12 +22,18 @@ function Page() {
{blocksPageConfig.title}
- +
diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx index 331f476..07ce61e 100644 --- a/app/blog/[slug]/page.tsx +++ b/app/blog/[slug]/page.tsx @@ -21,7 +21,7 @@ interface Props { params: { slug: string }; } -const site_url = process.env.ENVIRONMENT === 'test' ? 'https://test.appflowy.io' : 'https://appflowy.io'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL!; export async function generateMetadata({ params }: Props): Promise { const post = await getPostData(params.slug); @@ -106,7 +106,7 @@ async function getData(slug: string) { const relatedPosts = await getRelatedPosts(post); return { post, relatedPosts }; - } catch (error) { + } catch(error) { notFound(); } } @@ -122,7 +122,7 @@ export default async function BlogPost({ params }: { params: { slug: string } }) 'pb-[170px] pt-[170px]', 'max-xl:px-14', 'max-md:px-8 max-md:pb-[150px]', - 'max-sm:px-6 max-sm:pb-[100px]' + 'max-sm:px-6 max-sm:pb-[100px]', )} > - -
+ +
{post.categories && ( -
+
{post.categories.map((tag) => ( {tag} @@ -165,30 +165,36 @@ export default async function BlogPost({ params }: { params: { slug: string } }) 'whitespace-pre-wrap break-words text-left font-medium', 'text-4xl !leading-[120%] sm:text-5xl md:text-6xl lg:text-[58px]', 'leading-tight', - 'max-sm:text-center' + 'max-sm:text-center', )} > {post.title}
-
-
+
+
- - + + {post.author.substring(0, 2).toUpperCase()} - {post.author} + {post.author}
-
-
-
- +
+ {post.reading_time} min read
@@ -244,7 +250,10 @@ export default async function BlogPost({ params }: { params: { slug: string } }) )}
- diff --git a/app/blog/feed.xml/route.ts b/app/blog/feed.xml/route.ts index e63265f..b6c2430 100644 --- a/app/blog/feed.xml/route.ts +++ b/app/blog/feed.xml/route.ts @@ -1,7 +1,7 @@ import { getAllPosts } from '@/lib/posts'; import RSS from 'rss'; -const site_url = process.env.ENVIRONMENT === 'test' ? 'https://test.appflowy.io' : 'https://appflowy.io'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; export async function GET() { const posts = getAllPosts(); @@ -27,9 +27,9 @@ export async function GET() { categories: post.categories, enclosure: post.thumb_image ? { - url: post.thumb_image.startsWith('http') ? post.thumb_image : `${site_url}${post.thumb_image}`, - type: 'image/jpeg', // Adjust based on your image type - } + url: post.thumb_image.startsWith('http') ? post.thumb_image : `${site_url}${post.thumb_image}`, + type: 'image/jpeg', // Adjust based on your image type + } : undefined, }); }); diff --git a/app/blog/page.tsx b/app/blog/page.tsx index 09c9e8c..fd796fc 100644 --- a/app/blog/page.tsx +++ b/app/blog/page.tsx @@ -6,7 +6,7 @@ import React from 'react'; import OpenGraphImage from '../../public/images/og-image.png'; import { getAllPosts, PostData } from '@/lib/posts'; -const site_url = process.env.ENVIRONMENT === 'test' ? 'https://test.appflowy.io' : 'https://appflowy.io'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; const name = 'AppFlowy Blog | In the Flow'; export async function generateMetadata(): Promise { @@ -94,7 +94,10 @@ function Blog() { return ( <> -
@@ -112,7 +115,7 @@ function Blog() { Blog diff --git a/app/compare/notion-vs-appflowy/page.tsx b/app/compare/notion-vs-appflowy/page.tsx index 12a36d9..0cf1cc7 100644 --- a/app/compare/notion-vs-appflowy/page.tsx +++ b/app/compare/notion-vs-appflowy/page.tsx @@ -14,7 +14,7 @@ import React from 'react'; import Image from 'next/image'; import 'styles/vs-notion.scss'; -const site_url = process.env.ENVIRONMENT === 'test' ? 'https://test.appflowy.io' : 'https://appflowy.io'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; const title = 'Notion vs AppFlowy | The #1 Open Source Notion Alternative is AppFlowy'; const description = 'Open source, fast, offline support, self-hosting'; @@ -102,27 +102,35 @@ function generateListSchema() { } const points = ['Offline mode', 'Self-hosting', 'AI model selection', 'Customization', 'Native mobile and desktop apps']; -const environment = process.env.ENVIRONMENT || 'development'; -let importBaseURL: string = 'https://appflowy.com'; - -if (environment === 'test') { - importBaseURL = 'https://test.appflowy.com'; -} +const importBaseURL: string = `${process.env.NEXT_PUBLIC_SITE_BASE_URL}/app`; function Page() { return ( <> -
- {'AppFlowy'} + {'AppFlowy'} vs - {'Notion'} + {'Notion'}

@@ -142,7 +150,12 @@ function Page() {

- {'AI + {'AI
AI model selection
@@ -152,7 +165,12 @@ function Page() {
- {'Available + {'Available
Available everywhere @@ -161,7 +179,12 @@ function Page() {
- {'100% + {'100%
100% offline mode @@ -175,9 +198,9 @@ function Page() { } >
-
Compare features
-
Notion
-
AppFlowy
+
Compare features
+
Notion
+
AppFlowy
{points.map((point) => (
-
{point}
-
- {'Close'} +
{point}
+
+ {'Close'}
-
- {'Right'} +
+ {'Right'}
))} diff --git a/app/contact/page.tsx b/app/contact/page.tsx index 7cf6eaa..bae70cd 100644 --- a/app/contact/page.tsx +++ b/app/contact/page.tsx @@ -1,8 +1,19 @@ +import { Metadata } from 'next'; import React from 'react'; import { contactPageConfig } from '@/lib/config/pages'; import '@/styles/contact.scss'; import Form from '@/components/contact/form'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; + +export async function generateMetadata(): Promise { + return { + alternates: { + canonical: `${site_url}/contact`, + }, + }; +} + function Page() { return (
@@ -11,21 +22,33 @@ function Page() {
{contactPageConfig.desc}
- +
- +
diff --git a/app/contributors/page.tsx b/app/contributors/page.tsx index b05423d..9b0cd76 100644 --- a/app/contributors/page.tsx +++ b/app/contributors/page.tsx @@ -1,3 +1,4 @@ +import { Metadata } from 'next'; import React from 'react'; import { contributorsPageConfig } from '@/lib/config/pages'; import Link from 'next/link'; @@ -5,6 +6,16 @@ import '@/styles/contributors.scss'; import ContributorsList from '@/components/contributors/contributors-list'; import { fetchContributors } from '@/lib/githubAPI'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; + +export async function generateMetadata(): Promise { + return { + alternates: { + canonical: `${site_url}/contributors`, + }, + }; +} + async function Page() { const contributors = await getData(); @@ -15,14 +26,18 @@ async function Page() {
{contributorsPageConfig.subtitle}
{contributorsPageConfig.learnMoreTitle}
- + Learn more
); } -const getData = async () => { +const getData = async() => { try { return await fetchContributors(); } catch { diff --git a/app/download/page.tsx b/app/download/page.tsx index 7c895db..342072a 100644 --- a/app/download/page.tsx +++ b/app/download/page.tsx @@ -1,3 +1,4 @@ +import { Metadata } from 'next'; import React from 'react'; import '@/styles/download.scss'; @@ -6,6 +7,16 @@ import DownloadMobile from '@/components/download/mobile'; import DownloadAcross from '@/components/download/across'; import ModalDownload from '@/components/download/modal-download'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; + +export async function generateMetadata(): Promise { + return { + alternates: { + canonical: `${site_url}/download`, + }, + }; +} + function Page() { return (
diff --git a/app/downloaded/page.tsx b/app/downloaded/page.tsx index 6143fc1..0850744 100644 --- a/app/downloaded/page.tsx +++ b/app/downloaded/page.tsx @@ -1,7 +1,18 @@ +import { Metadata } from 'next'; import React from 'react'; import Downloading from '@/components/shared/downloading'; import '@/styles/downloading.scss'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; + +export async function generateMetadata(): Promise { + return { + alternates: { + canonical: `${site_url}/download`, + }, + }; +} + function Page() { return
{}
; } diff --git a/app/join/page.tsx b/app/join/page.tsx index 4045306..da1af33 100644 --- a/app/join/page.tsx +++ b/app/join/page.tsx @@ -1,3 +1,4 @@ +import { Metadata } from 'next'; import React from 'react'; import { joinPageConfig } from '@/lib/config/pages'; import Logo from '@/assets/images/logo.svg'; @@ -5,18 +6,34 @@ import Image from 'next/image'; import Link from 'next/link'; import '@/styles/join.scss'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; + +export async function generateMetadata(): Promise { + return { + alternates: { + canonical: `${site_url}/join`, + }, + }; +} + function Page() { return (
{joinPageConfig.title}
- +
@@ -27,10 +44,19 @@ function Page() {
- {''} + {''}
{joinPageConfig.goodPoints.map((point, index) => ( -
+
{point.icon}
{point.content}
@@ -39,20 +65,34 @@ function Page() { ))}
-
+
{joinPageConfig.currentJobTitle}
{joinPageConfig.jobs.length > 0 ? ( joinPageConfig.jobs.map((item: { title: string; link: string }) => ( - +
{item.title}
- +
diff --git a/app/layout.tsx b/app/layout.tsx index cc90acf..2749beb 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -17,12 +17,13 @@ export const viewport: Viewport = { const metaTitle = 'AppFlowy.IO'; const metaDescription = 'AppFlowy is an AI collaborative workspace where you achieve more without losing control of your data'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; export const metadata: Metadata = { title: metaTitle, description: metaDescription, alternates: { - canonical: 'https://appflowy.io', + canonical: site_url, }, icons: [ { @@ -33,7 +34,7 @@ export const metadata: Metadata = { openGraph: { type: 'website', locale: 'en_US', - url: 'https://appflowy.io', + url: site_url, title: metaTitle, description: metaDescription, siteName: 'AppFlowy.IO', @@ -56,7 +57,7 @@ function generateListSchema() { { '@type': 'ListItem', position: 1, - url: 'https://appflowy.io', + url: site_url, name: metaTitle, description: metaDescription, image: Favicon.src, @@ -70,19 +71,27 @@ export default async function RootLayout({ children }: { children: React.ReactNo const gitData = await getGitData(); return ( - - - {process.env.ENVIRONMENT !== 'production' && } - - - - - - {children} - - + + + {process.env.ENVIRONMENT !== 'production' && } + + + + + {children} + + ); } diff --git a/app/pricing/page.tsx b/app/pricing/page.tsx index 715baa2..9932fea 100644 --- a/app/pricing/page.tsx +++ b/app/pricing/page.tsx @@ -2,6 +2,7 @@ import ScrollIcons from '@/components/shared/scroll-icons'; import { LearnMore } from '@/components/pricing/icons'; import Prices from '@/components/pricing/prices'; import UnlockCards from '@/components/pricing/unlock-cards'; +import { Metadata } from 'next'; import Image from 'next/image'; import Link from 'next/link'; import React from 'react'; @@ -14,119 +15,181 @@ import Affiliate from '@/assets/images/pricing/affiliate.png'; import Contact from '@/assets/images/pricing/contact.png'; import '@/styles/pricing.scss'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; + +export async function generateMetadata(): Promise { + return { + alternates: { + canonical: `${site_url}/pricing`, + }, + }; +} + function Page() { return ( -
-
-
-
-
Your work solution.
-
Start free.
+ <> +
+
+
+
+
Your work solution.
+
Start free.
+
+
-
-
-
-
-
-
+
+
+
+
Unlock unlimited AI power -
AppFlowy AI includes
-
-
-
- {''} -
Find inspiration
+
AppFlowy AI includes
-
- {''} -
Write better
-
-
- {''} -
Autofill tables
-
-
- {''} -
Get answers
+
+
+ {''} +
Find inspiration
+
+
+ {''} +
Write better
+
+
+ {''} +
Autofill tables
+
+
+ {''} +
Get answers
+
-
-
-
- Prices in $ USD +
+
+ Prices in $ USD +
+
-
-
-
- -
-
-
-
-
+
+ +
+
+
+
+
Have additional questions? -
-
-
-
- {''} -
Help articles
- - Learn more -
-
-
- {''} -
Affiliate programs
+
+
+
+ {''} +
Help articles
+ + Learn more + +
+
+
+ {''} +
Affiliate programs
- - {/*Learn more */} - Coming soon - -
-
-
- {''} -
Contact support
- - Contact Us - + + {/*Learn more */} + Coming soon + +
+
+
+ {''} +
Contact support
+ + Contact Us + +
-
-
-
-
-
-
+
+
+
+
+
Get started for free +
+
Choose to own your data and a smarter way to work
-
Choose to own your data and a smarter way to work
-
-
- - Download - - - Templates - +
+ + Download + + + Templates + +
-
+ ); } diff --git a/app/privacy/page.tsx b/app/privacy/page.tsx index 403bdac..1d420fe 100644 --- a/app/privacy/page.tsx +++ b/app/privacy/page.tsx @@ -1,4 +1,15 @@ import DocxPreview from '@/components/privacy/docx-preview'; +import { Metadata } from 'next'; + +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; + +export async function generateMetadata(): Promise { + return { + alternates: { + canonical: `${site_url}/privacy`, + }, + }; +} function Page() { return ( diff --git a/app/templates/page.tsx b/app/templates/page.tsx index 3881a34..87d2139 100644 --- a/app/templates/page.tsx +++ b/app/templates/page.tsx @@ -4,20 +4,31 @@ import Sidebar from '@/components/template-center/sidebar'; import TemplateList from '@/components/template-center/template-list'; import { TemplatesProvider } from '@/components/template-center/templates-context'; import { getCategories, getTemplateHomeList } from '@/lib/templateAPI'; +import { Metadata } from 'next'; import React from 'react'; import '@/styles/template.scss'; import { notFound } from 'next/navigation'; +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; + +export async function generateMetadata(): Promise { + return { + alternates: { + canonical: `${site_url}/templates`, + }, + }; +} + async function Page() { let data = null; - if (process.env.NODE_ENV === 'production' && process.env.NEXT_PHASE === 'phase-production-build') { + if(process.env.NODE_ENV === 'production' && process.env.NEXT_PHASE === 'phase-production-build') { return null; } try { data = await getData(); - } catch (error) { + } catch(error) { console.error(error); notFound(); } @@ -27,7 +38,10 @@ async function Page() { return (
- +
@@ -48,7 +62,7 @@ async function getData() { const homepageTemplates = await getTemplateHomeList(); const categories = await getCategories(); - if (!homepageTemplates || !categories) { + if(!homepageTemplates || !categories) { throw new Error('Failed to fetch templates'); } diff --git a/app/terms/page.tsx b/app/terms/page.tsx index 7c004a5..ed1a52e 100644 --- a/app/terms/page.tsx +++ b/app/terms/page.tsx @@ -1,4 +1,15 @@ import DocxPreview from '@/components/privacy/docx-preview'; +import { Metadata } from 'next'; + +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; + +export async function generateMetadata(): Promise { + return { + alternates: { + canonical: `${site_url}/terms`, + }, + }; +} function Page() { return ( diff --git a/app/what-is-new/page.tsx b/app/what-is-new/page.tsx index ef18012..347fc78 100644 --- a/app/what-is-new/page.tsx +++ b/app/what-is-new/page.tsx @@ -3,21 +3,38 @@ import { fetchVersions } from '@/lib/githubAPI'; import { whatIsNewConfig } from '@/lib/config/pages'; import Versions from '@/components/what-is-new/versions'; import { parseChangelog } from '@/lib/parseChangelog'; +import { Metadata } from 'next'; + +const site_url = process.env.NEXT_PUBLIC_SITE_BASE_URL; + +export async function generateMetadata(): Promise { + return { + alternates: { + canonical: `${site_url}/what-is-new`, + }, + }; +} async function Page() { const versions = await getData(); return ( -
+
{whatIsNewConfig.title}
- +
@@ -29,7 +46,7 @@ async function Page() { ); } -const getData = async () => { +const getData = async() => { try { return await fetchVersions(); } catch { diff --git a/components/layout/nav/drawer-nav.tsx b/components/layout/nav/drawer-nav.tsx index 058f19d..0e82829 100644 --- a/components/layout/nav/drawer-nav.tsx +++ b/components/layout/nav/drawer-nav.tsx @@ -1,4 +1,5 @@ import { useClient } from '@/lib/hooks/use-client'; +import { webApplicationUrl } from '@/lib/web-application'; import Accordion from '@mui/material/Accordion'; import AccordionSummary from '@mui/material/AccordionSummary'; import Typography from '@mui/material/Typography'; @@ -33,7 +34,7 @@ export default function DrawerNavbar({ onClose, activePageKey, open }: DrawerNav return (
-
- +
+ @@ -56,7 +63,10 @@ export default function DrawerNavbar({ onClose, activePageKey, open }: DrawerNav
{links.map((page) => ( -
+
} > {page.link ? ( - onClose()} href={page.link}> + onClose()} + href={page.link} + > {page.name} ) : ( @@ -106,9 +119,16 @@ export default function DrawerNavbar({ onClose, activePageKey, open }: DrawerNav {page.children?.map((child) => ( -
+
{child.link ? ( - onClose()} href={child.link}> + onClose()} + href={child.link} + > {child.name} ) : ( @@ -125,8 +145,8 @@ export default function DrawerNavbar({ onClose, activePageKey, open }: DrawerNav
- setOpenDrawer(true)} className={'trigger-btn'}> + setOpenDrawer(true)} + className={'trigger-btn'} + >
- - setOpenDrawer(false)} open={openDrawer} /> + + setOpenDrawer(false)} + open={openDrawer} + /> ); } diff --git a/components/product/get-start.tsx b/components/product/get-start.tsx index d812327..f895c32 100644 --- a/components/product/get-start.tsx +++ b/components/product/get-start.tsx @@ -1,14 +1,16 @@ 'use client'; import { useClient } from '@/lib/hooks/use-client'; +import { webApplicationUrl } from '@/lib/web-application'; import Link from 'next/link'; import React from 'react'; function GetStart() { const { isMobile } = useClient(); + return (
-
+
Get started for @@ -17,11 +19,17 @@ function GetStart() {
Choose to own your data and a smarter way to work
- + Download {!isMobile && ( - + Try it free )} diff --git a/components/product/main-download.tsx b/components/product/main-download.tsx index 4c26977..f25ed5c 100644 --- a/components/product/main-download.tsx +++ b/components/product/main-download.tsx @@ -4,6 +4,7 @@ import HeroDesc from '@/components/shared/hero-desc'; import { Button } from '@/components/ui/button'; import { useClient } from '@/lib/hooks/use-client'; import { useDownload } from '@/lib/hooks/use-download'; +import { webApplicationUrl } from '@/lib/web-application'; import React, { useEffect, useRef } from 'react'; import { useInView } from 'framer-motion'; import { collectEvent, EventName } from '@/lib/collect'; @@ -18,7 +19,7 @@ function MainDownload({ showDesc = true }: { showDesc?: boolean }) { }); useEffect(() => { - if (inView && isClient) { + if(inView && isClient) { collectEvent(EventName.homePageDownloadBtn, { type: 'view', }); @@ -36,7 +37,7 @@ function MainDownload({ showDesc = true }: { showDesc?: boolean }) { onClick={() => { const link = getOsDownloadLink(); - if (!link) return; + if(!link) return; collectEvent(EventName.homePageDownloadBtn, { type: 'click', @@ -55,7 +56,7 @@ function MainDownload({ showDesc = true }: { showDesc?: boolean }) { type: 'click', }); - window.open('https://appflowy.com', '_current'); + window.open(webApplicationUrl, '_current'); }} className={'flex-1'} size={'2xl'} diff --git a/lib/config/footer.tsx b/lib/config/footer.tsx index 4d4db92..a0013e7 100644 --- a/lib/config/footer.tsx +++ b/lib/config/footer.tsx @@ -2,6 +2,7 @@ import Twitter from '@/components/icons/twitter'; import Reddit from '@/components/icons/reddit'; import Github from '@/components/icons/github'; import Discord from '@/components/icons/discord'; +import { webApplicationUrl } from '@/lib/web-application'; export const externalLinks = [ { @@ -51,7 +52,7 @@ export const links = [ link: '/templates', }, { - name: "What's New", + name: 'What\'s New', link: '/what-is-new', }, { @@ -97,7 +98,7 @@ export const links = [ }, { name: 'Browser', - link: 'https://appflowy.com', + link: webApplicationUrl, }, ], }, diff --git a/lib/web-application.ts b/lib/web-application.ts new file mode 100644 index 0000000..97288c2 --- /dev/null +++ b/lib/web-application.ts @@ -0,0 +1 @@ +export const webApplicationUrl = `${process.env.NEXT_PUBLIC_SITE_BASE_URL}/app`; \ No newline at end of file diff --git a/next.config.mjs b/next.config.mjs index 4fca36d..0c2d188 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -3,6 +3,7 @@ import { createRequire } from 'module'; const require = createRequire(import.meta.url); const path = require('path'); const __dirname = path.dirname(new URL(import.meta.url).pathname); + import remarkGfm from 'remark-gfm'; const withMDX = require('@next/mdx')({ @@ -23,16 +24,13 @@ try { } const isProd = process.env.NODE_ENV === 'production'; -const environment = process.env.ENVIRONMENT || 'development'; let assetPrefix = undefined; + if (isProd) { - if (environment === 'production') { - assetPrefix = 'https://appflowy.io'; - } else if (environment === 'test') { - assetPrefix = 'https://test.appflowy.io'; - } + assetPrefix = process.env.NEXT_PUBLIC_SITE_BASE_URL; } + const securityHeaders = [ { key: 'X-Frame-Options', @@ -91,6 +89,7 @@ const rewrites = () => { }, ]; }; + /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: false, @@ -112,7 +111,7 @@ const nextConfig = { minimumCacheTTL: 60 * 60 * 24 * 7, unoptimized: true, }, - async headers() { + async headers () { return [ { // Apply these headers to all routes in your application. diff --git a/public/sitemap.xml b/public/sitemap.xml index 385d2bc..91c4e61 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -1,135 +1,135 @@ - - https://appflowy.io/about - 2024-10-15T04:21:21.665Z - weekly - 1.0 - - - - https://appflowy.io/appflowy-blocks - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/compare/notion-vs-appflowy - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/contact - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/contributors - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/download - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/downloaded - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/invitation/expired - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/join - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/ - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/ - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/pricing - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/privacy - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/subscribe-newsletter - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/templates - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/templates/[category_name] - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/templates/[category_name]/[id] - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/terms - 2024-10-15T04:21:21.666Z - weekly - 1.0 - - - - https://appflowy.io/what-is-new - 2024-10-15T04:21:21.666Z - weekly - 1.0 - + + https://appflowy.com/about + 2024-10-15T04:21:21.665Z + weekly + 1.0 + + + + https://appflowy.com/appflowy-blocks + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/compare/notion-vs-appflowy + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/contact + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/contributors + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/download + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/downloaded + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/invitation/expired + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/join + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/ + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/ + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/pricing + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/privacy + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/subscribe-newsletter + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/templates + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/templates/[category_name] + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/templates/[category_name]/[id] + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/terms + 2024-10-15T04:21:21.666Z + weekly + 1.0 + + + + https://appflowy.com/what-is-new + 2024-10-15T04:21:21.666Z + weekly + 1.0 + diff --git a/tsconfig.json b/tsconfig.json index 47b7e60..5d1c798 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,7 +21,8 @@ } ], "paths": { - "@/*": ["./*"] + "@/*": ["./*"], + "@/assets/*": ["./assets/*"], }, "forceConsistentCasingInFileNames": true },