summaryrefslogtreecommitdiff
path: root/apps/web/src/app
diff options
context:
space:
mode:
authoriza <59828082+izadoesdev@users.noreply.github.com>2025-07-23 20:46:02 +0300
committerGitHub <noreply@github.com>2025-07-23 20:46:02 +0300
commit81ad5c1782bfed92c2fdcd78b5131748871f098e (patch)
tree64484ef01958bd660462d821e645bd3a87911ca3 /apps/web/src/app
parent41a78b4e4c128e45353a0a1a516ea3ac4b796623 (diff)
parent17d1336c8068b42cb0f48dad511dec41d2285bfb (diff)
downloadopencut-81ad5c1782bfed92c2fdcd78b5131748871f098e.tar.gz
Merge pull request #443 from OpenCut-app/feat/sitemap
feat: add sitemap and robots generation
Diffstat (limited to 'apps/web/src/app')
-rw-r--r--apps/web/src/app/robots.ts13
-rw-r--r--apps/web/src/app/sitemap.ts61
2 files changed, 74 insertions, 0 deletions
diff --git a/apps/web/src/app/robots.ts b/apps/web/src/app/robots.ts
new file mode 100644
index 00000000..ad6c31c8
--- /dev/null
+++ b/apps/web/src/app/robots.ts
@@ -0,0 +1,13 @@
+import type { MetadataRoute } from "next";
+import { SITE_URL } from "@/constants/site";
+
+export default function robots(): MetadataRoute.Robots {
+ return {
+ rules: {
+ userAgent: "*",
+ allow: "/",
+ disallow: ["/_next/", "/projects/", "/editor/"],
+ },
+ sitemap: `${SITE_URL}/sitemap.xml`,
+ };
+}
diff --git a/apps/web/src/app/sitemap.ts b/apps/web/src/app/sitemap.ts
new file mode 100644
index 00000000..81a5ebf4
--- /dev/null
+++ b/apps/web/src/app/sitemap.ts
@@ -0,0 +1,61 @@
+import { SITE_URL } from "@/constants/site";
+import { getPosts } from "@/lib/blog-query";
+import type { MetadataRoute } from "next";
+
+export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
+ const data = await getPosts();
+
+ const postPages: MetadataRoute.Sitemap =
+ data?.posts?.map((post) => ({
+ url: `${SITE_URL}/blog/${post.slug}`,
+ lastModified: new Date(post.publishedAt),
+ changeFrequency: "weekly",
+ priority: 0.8,
+ })) ?? [];
+
+ return [
+ {
+ url: SITE_URL,
+ lastModified: new Date(),
+ changeFrequency: "weekly",
+ priority: 1,
+ },
+ {
+ url: `${SITE_URL}/contributors`,
+ lastModified: new Date(),
+ changeFrequency: "daily",
+ priority: 0.5,
+ },
+ {
+ url: `${SITE_URL}/roadmap`,
+ lastModified: new Date(),
+ changeFrequency: "weekly",
+ priority: 1,
+ },
+ {
+ url: `${SITE_URL}/privacy`,
+ lastModified: new Date(),
+ changeFrequency: "monthly",
+ priority: 0.5,
+ },
+ {
+ url: `${SITE_URL}/terms`,
+ lastModified: new Date(),
+ changeFrequency: "monthly",
+ priority: 0.5,
+ },
+ {
+ url: `${SITE_URL}/why-not-capcut`,
+ lastModified: new Date(),
+ changeFrequency: "yearly",
+ priority: 1,
+ },
+ {
+ url: `${SITE_URL}/blog`,
+ lastModified: new Date(),
+ changeFrequency: "weekly",
+ priority: 1,
+ },
+ ...postPages,
+ ];
+}