diff --git a/.claude/launch.json b/.claude/launch.json
new file mode 100644
index 0000000..1685a8a
--- /dev/null
+++ b/.claude/launch.json
@@ -0,0 +1,17 @@
+{
+ "version": "0.0.1",
+ "configurations": [
+ {
+ "name": "Next.js Dev (Turbopack)",
+ "runtimeExecutable": "npm",
+ "runtimeArgs": ["run", "dev"],
+ "port": 3000
+ },
+ {
+ "name": "Cloudflare Workers Preview",
+ "runtimeExecutable": "npm",
+ "runtimeArgs": ["run", "preview"],
+ "port": 8787
+ }
+ ]
+}
diff --git a/app/[lang]/(main)/blog/[slug]/page.tsx b/app/[lang]/(main)/blog/[slug]/page.tsx
index d054aac..8a4fc14 100644
--- a/app/[lang]/(main)/blog/[slug]/page.tsx
+++ b/app/[lang]/(main)/blog/[slug]/page.tsx
@@ -5,7 +5,7 @@ import defaultMdxComponents from "fumadocs-ui/mdx";
import { blog } from "@/lib/source";
import { File, Files, Folder } from "fumadocs-ui/components/files";
import { Tab, Tabs } from "fumadocs-ui/components/tabs";
-import { Language, uiDictionary, localizeUrl, i18n } from "@/lib/i18n";
+import { Language, localizeUrl, i18n } from "@/lib/i18n";
import { displayDate } from "@/lib/date";
import { createBlogMetadata, baseUrl } from "@/lib/metadata";
import { ArticleJsonLd } from "@/components/JsonLd";
@@ -32,7 +32,6 @@ export default async function Page(props: {
}) {
const params = await props.params;
const page = blog.getPage([params.slug], params.lang);
- const t = uiDictionary[params.lang].blog;
if (!page) notFound();
@@ -46,7 +45,7 @@ export default async function Page(props: {
return (
-
+
{/* Structured data for the article */}
@@ -55,18 +54,24 @@ export default async function Page(props: {
description={data.description ?? data.title}
datePublished={new Date(data.date).toISOString()}
dateModified={new Date(data.lastModified ?? data.date).toISOString()}
- authorName={data.author}
+ authorName={data.author ?? ""}
url={canonical}
imageUrl={data.image}
/>
-
-
+
+
+
{data.title}
{data.description}
-
-
+
+
-
-
-
{t.writtenBy}
-
{data.author}
-
-
-
{t.at}
-
- {displayDate(new Date(data.date), params.lang)}
-
-
-
@@ -133,7 +126,7 @@ export async function generateMetadata(props: {
description: data.description ?? data.title,
publishedTime,
modifiedTime,
- authors: [data.author],
+ authors: data.author ? [data.author] : [],
tags,
image: ogImageUrl,
url: canonical,
diff --git a/app/[lang]/(main)/blog/atom.xml/route.ts b/app/[lang]/(main)/blog/atom.xml/route.ts
index 8210875..866c659 100644
--- a/app/[lang]/(main)/blog/atom.xml/route.ts
+++ b/app/[lang]/(main)/blog/atom.xml/route.ts
@@ -38,7 +38,7 @@ export async function GET(
${link}
${updated}
${escape(data.description ?? data.title)}
-
${escape(data.author)}
+ ${data.author ? `
${escape(data.author)}` : ""}
`;
})
.join("");
diff --git a/app/[lang]/(main)/blog/page.tsx b/app/[lang]/(main)/blog/page.tsx
index 2d4923c..d5462d7 100644
--- a/app/[lang]/(main)/blog/page.tsx
+++ b/app/[lang]/(main)/blog/page.tsx
@@ -60,22 +60,6 @@ export default async function Page({
{post.data.description}
-
- {/* eslint-disable-next-line @next/next/no-img-element */}
-

-
-
))}
diff --git a/app/[lang]/(main)/blog/rss.xml/route.ts b/app/[lang]/(main)/blog/rss.xml/route.ts
index c1fbad8..832739c 100644
--- a/app/[lang]/(main)/blog/rss.xml/route.ts
+++ b/app/[lang]/(main)/blog/rss.xml/route.ts
@@ -38,7 +38,7 @@ export async function GET(
${link}
${pub}
${escape(data.description ?? data.title)}
-
${escape(data.author)}
+ ${data.author ? `
${escape(data.author)}` : ""}
`;
})
.join("");
diff --git a/source.config.ts b/source.config.ts
index 0559d72..e9ffdde 100644
--- a/source.config.ts
+++ b/source.config.ts
@@ -21,9 +21,9 @@ export const blog = defineCollections({
type: "doc",
dir: "content/blog",
schema: frontmatterSchema.extend({
- author: z.string(),
- authorAvatarLink: z.string().url().or(z.string()),
- authorLink: z.string().url(),
+ author: z.string().optional(),
+ authorAvatarLink: z.string().url().or(z.string()).optional(),
+ authorLink: z.string().url().optional(),
date: z.date(),
// Optional SEO fields
image: z.string().url().optional(),