MLog

A bilingual blog crafted for our own voice

Back to posts
Build Log#Next.js#Bilingual#Engineering

Shipping MLog from Scratch

Published: Mar 2, 2026Updated: Mar 2, 2026Reading time: 1 min

How we shipped the first MLog release with bilingual routing, a Markdown content layer, and a warm glassmorphism system.

Why locale-prefixed routes

We adopted /zh and /en instead of runtime language toggles. This gives us:

  1. clearer SEO signals for each language,
  2. shareable URLs without extra parameters,
  3. stable slug-based switching between languages.

Content contract

Each post lives under content/posts/<slug>/ with zh.md and en.md. Frontmatter is validated at build time, so malformed dates and missing required fields fail fast.

title: string
date: ISO date
summary: string
tags: string[]
category: string
cover?: string
draft?: boolean
updated?: ISO date

Visual direction

We intentionally borrowed the feel of the reference project, not the exact layout:

  • warm gradient atmosphere,
  • translucent glass cards,
  • restrained spring motions,
  • single-column fallback on mobile.

The goal is clarity first, motion second.

What comes next

  • publish more real posts,
  • improve translation coverage,
  • iterate on homepage information architecture.