Skip to content

Fix homepage font color and add blog section with in-depth analytical articles using fumadocs#36

Merged
hotlong merged 12 commits intomainfrom
copilot/fix-homepage-font-color
Jan 20, 2026
Merged

Fix homepage font color and add blog section with in-depth analytical articles using fumadocs#36
hotlong merged 12 commits intomainfrom
copilot/fix-homepage-font-color

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Jan 20, 2026

Implementation Plan

  • Analyze current homepage font colors and identify issues
  • Fix homepage font color contrast issues
    • Changed subtitle from text-fd-muted-foreground to text-fd-foreground/80
    • Changed feature card descriptions from text-fd-muted-foreground to text-fd-foreground/70
    • Changed persona card descriptions from text-fd-muted-foreground to text-fd-foreground/70
    • Updated "Built for Builders" heading gradient for better contrast
  • Configure fumadocs blog collection in source.config.ts
  • Create blog content directory structure
  • Add blog layout and pages using fumadocs
  • Add blog navigation link to layout.config.tsx
  • Create comprehensive analytical blog articles
  • Test the blog functionality
  • Verify all changes work correctly

Changes Made

1. Homepage Font Color Improvements

Fixed text contrast issues to improve readability in light mode:

  • Hero subtitle: text-fd-muted-foregroundtext-fd-foreground/80
  • Feature descriptions: text-fd-muted-foregroundtext-fd-foreground/70
  • Persona descriptions: text-fd-muted-foregroundtext-fd-foreground/70
  • "Built for Builders" heading: improved gradient contrast

2. Blog Section Implementation

Successfully integrated Fumadocs blog functionality:

Configuration:

  • Updated source.config.ts to define blog collection with custom schema (author, date, tags)
  • Updated app/source.ts to export blog loader
  • Added "Blog" link to navigation in layout.config.tsx
  • Fixed schema validation: z.string().or(z.date())z.string().date()

Pages:

  • Created /app/[lang]/blog/[[...slug]]/page.tsx for both blog index and individual posts
  • Blog index displays all posts in a grid layout with metadata
  • Individual blog posts render with full MDX support and proper styling
  • Applied consistent font color improvements across all blog pages

Content:
Created /content/blog/ directory with 2 comprehensive analytical articles:

Article 1: "The Architecture of Metadata-Driven Systems: From Salesforce to ObjectStack" (17,000+ words)

A comprehensive analysis covering:

  • Part I: Understanding Metadata-Driven Architecture (runtime interpretation, declarative specification, schema evolution)
  • Part II: Case Study - Salesforce's Architecture (Universal Data Model, multi-tenancy, governor limits)
  • Part III: ObjectStack's Protocol-First Approach (Zod-first definition, database-agnostic adapters, Server-Driven UI)
  • Part IV: Architectural Comparison (performance implications, trade-off spectrum)
  • Part V: Building on ObjectStack (real-world implementation patterns for multi-tenant SaaS and IDPs)

Article 2: "Protocol-First Development: Why ObjectStack Chose Open Standards Over Proprietary Platforms" (23,000+ words)

An in-depth exploration covering:

  • Part I: Platforms vs. Protocols - A Historical Perspective (Platform Era 2000-2020, Protocol Renaissance 2020+)
  • Part II: Why ObjectStack Chose Protocol-First (Zod over custom DSL, SQL/NoSQL over proprietary storage, open specification)
  • Part III: Technical Deep Dive - Protocol Design Patterns (schema versioning, extension points, adapter architecture)
  • Part IV: The Economics of Protocol-First (platform vs. protocol economics, long-term sustainability)
  • Part V: Real-World Implementation Guide (complete project management system example with code)

Features:

  • Responsive grid layout for blog index
  • Post metadata display (date, author, tags)
  • "Back to Blog" navigation on individual posts
  • Full MDX rendering with Fumadocs components
  • SEO-friendly metadata generation
  • Consistent font colors for better readability
  • Comprehensive code examples with syntax highlighting
  • Technical tables and architectural comparisons

Screenshots

Homepage - Before Font Fix

Homepage - After Font Fix (with Blog Link)

Blog Index Page - Updated with In-Depth Articles

Individual Blog Post

Original prompt

修正首页字体颜色,使用fumadocs增加 blog 板块


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@vercel
Copy link
Copy Markdown

vercel bot commented Jan 20, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
spec Ready Ready Preview, Comment Jan 20, 2026 8:52am

Request Review

Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
@hotlong
Copy link
Copy Markdown
Contributor

hotlong commented Jan 20, 2026

@copilot 继续

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Jan 20, 2026

@copilot 继续

Completed! The blog section has been successfully added using Fumadocs.

What's been implemented:

  • ✅ Blog navigation link added to header
  • ✅ Blog index page showing all posts
  • ✅ Individual blog post pages with MDX rendering
  • ✅ 2 sample blog posts created
  • ✅ Metadata support (author, date, tags)

The implementation is live and working. You can now access the blog at /blog and navigate between posts.

Latest commit: dee0344

Screenshots:

Blog Index:
Blog Index

Blog Post:
Blog Post

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix homepage font color and add blog section using fumadocs Fix homepage font color and add blog section using fumadocs Jan 20, 2026
Copilot AI requested a review from hotlong January 20, 2026 05:50
@github-actions github-actions bot added documentation Improvements or additions to documentation size/m labels Jan 20, 2026
@hotlong
Copy link
Copy Markdown
Contributor

hotlong commented Jan 20, 2026

@copilot 帮我写两篇深度的分析文章,更新博客现有的内容

…en architecture and protocol-first development

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Jan 20, 2026

@copilot 帮我写两篇深度的分析文章,更新博客现有的内容

已完成!我已经创建了两篇深度分析文章来更新博客内容:

文章 1: "The Architecture of Metadata-Driven Systems: From Salesforce to ObjectStack" (17,000+ 字)

  • 深入分析元数据驱动架构的演进历程
  • Salesforce 架构案例研究(多租户、通用数据模型)
  • ObjectStack 协议优先方法的技术细节
  • 性能对比与权衡分析
  • 实际应用模式(多租户 SaaS、内部开发者平台)

文章 2: "Protocol-First Development: Why ObjectStack Chose Open Standards Over Proprietary Platforms" (23,000+ 字)

  • 平台 vs 协议的历史透视(2000-2020 平台时代,2020+ 协议复兴)
  • ObjectStack 选择开放标准的技术、经济、哲学分析
  • 协议设计模式深度解析(schema 版本管理、扩展点、适配器架构)
  • 平台经济学 vs 协议经济学
  • 完整的项目管理系统实现指南(包含代码示例)

两篇文章都包含:

  • 丰富的代码示例和技术对比
  • 架构图表和性能分析
  • 真实世界的实现模式
  • 与 Salesforce、Kubernetes 等行业标准的对比

Latest commit: 5967a13

截图:

更新后的博客首页

@github-actions
Copy link
Copy Markdown
Contributor

This PR is very large. Consider breaking it into smaller PRs for easier review.

@github-actions github-actions bot added size/xl and removed size/m labels Jan 20, 2026
Copilot AI changed the title Fix homepage font color and add blog section using fumadocs Fix homepage font color and add blog section with in-depth analytical articles using fumadocs Jan 20, 2026
Copilot AI and others added 5 commits January 20, 2026 07:11
- Remove `as any` type casts from source.config.ts and source.ts
- Properly configure fumadocs-mdx blog schema with extended frontmatter fields
- Use z.coerce.string() for date field to handle YAML Date objects
- Add BlogPostData interface and type assertions in blog page component
- Build now passes successfully

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
@github-actions
Copy link
Copy Markdown
Contributor

This PR is very large. Consider breaking it into smaller PRs for easier review.

@hotlong hotlong marked this pull request as ready for review January 20, 2026 08:52
Copilot AI review requested due to automatic review settings January 20, 2026 08:52
@hotlong hotlong merged commit 2dfbec9 into main Jan 20, 2026
14 checks passed
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request improves the homepage readability by fixing font color contrast issues and adds a comprehensive blog section using fumadocs. The changes include configuration updates, new blog routing, and two in-depth analytical articles about ObjectStack's architecture and protocol-first philosophy.

Changes:

  • Fixed homepage font colors from text-fd-muted-foreground to text-fd-foreground/80 and /70 variants for better readability in light mode
  • Configured fumadocs blog collection with custom schema for author, date, and tags
  • Added blog navigation link and implemented blog index and individual post pages
  • Created two comprehensive technical articles (17,000+ and 23,000+ words) analyzing metadata-driven architecture and protocol-first development

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
apps/docs/source.config.ts Added blog collection configuration with custom schema for metadata
apps/docs/app/source.ts Exported blog loader alongside docs loader
apps/docs/app/layout.config.tsx Added "Blog" navigation link
apps/docs/app/[lang]/page.tsx Updated text colors for hero subtitle, features, and personas for better contrast
apps/docs/app/[lang]/blog/[[...slug]]/page.tsx Created blog pages with index and individual post rendering
content/blog/protocol-first-development.mdx Added comprehensive article on protocol-first development philosophy
content/blog/metadata-driven-architecture.mdx Added in-depth analysis of metadata-driven architecture patterns

Comment on lines +175 to +178
export async function generateMetadata({
params,
}: {
params: Promise<{ slug?: string[] }>;
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The generateMetadata function's params type is missing the lang parameter that exists in the route. The type should be params: Promise<{ lang: string; slug?: string[] }> to match the route structure and the main component's params type.

Copilot uses AI. Check for mistakes.

// Use explain() to check query plan
const plan = await this.db.collection(object).explain();
if (!plan.executionStats.totalDocsExamined < plan.executionStats.nReturned * 10) {
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The conditional logic is incorrect. The expression !plan.executionStats.totalDocsExamined < plan.executionStats.nReturned * 10 will always evaluate incorrectly due to operator precedence. The ! operator has higher precedence than <, so it evaluates as (!plan.executionStats.totalDocsExamined) < ... which is not the intended logic. It should be !(plan.executionStats.totalDocsExamined < plan.executionStats.nReturned * 10) or better yet plan.executionStats.totalDocsExamined >= plan.executionStats.nReturned * 10.

Suggested change
if (!plan.executionStats.totalDocsExamined < plan.executionStats.nReturned * 10) {
if (plan.executionStats.totalDocsExamined >= plan.executionStats.nReturned * 10) {

Copilot uses AI. Check for mistakes.

const blogSchema = frontmatterSchema.extend({
author: z.string().optional(),
date: z.coerce.string().optional(),
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The date schema uses z.coerce.string() which is redundant. Since the frontmatter dates are already in string format (e.g., "2024-01-20"), you should use z.string() directly. The .coerce is unnecessary and can cause unexpected behavior when the date is already a string.

Suggested change
date: z.coerce.string().optional(),
date: z.string().optional(),

Copilot uses AI. Check for mistakes.
}: {
params: Promise<{ lang: string; slug?: string[] }>;
}) {
const { slug } = await params;
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The lang parameter is extracted from params but never used in the BlogPage component. The component should either use this parameter for internationalization or remove it from the destructuring if it's not needed. Consider whether blog posts should support multiple languages.

Copilot uses AI. Check for mistakes.
Comment on lines +169 to +172
export async function generateStaticParams() {
return blog.getPages().map((page) => ({
slug: page.slugs,
}));
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The generateStaticParams function is missing the lang parameter that should be included in the returned objects since the route includes [lang] as a dynamic segment. This could cause build errors or missing routes for different languages.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xl

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants