China Unlocked

An independent, free-to-read China travel guide for first-time visitors, built on a custom Python publishing pipeline that turns one Markdown source into a static website and a print-ready PDF.

PythonStatic SiteJinja2WeasyPrintCloudflare Pages
Visit site ↗

Overview

China Unlocked is an independent travel guide for first-time visitors to China. It pairs day-by-day city guides with an 80-chapter handbook that covers the unglamorous things that decide whether a trip works: visas, payments, connectivity, and trains. Everything is free to read, with no paywall, no account, and no ads.

I built it because travel content is full of affiliate fluff, and I wanted to make something that runs the other way. I also wanted the publishing side to be as simple as writing: every guide is a Markdown file, and one build step turns the whole content set into a website and a printable PDF.

Highlights

  • Custom publishing pipeline: Markdown with frontmatter is rendered through Jinja2 templates into a fully static site, and the same source produces a print-ready PDF with WeasyPrint
  • 80-chapter handbook in 10 parts, plus city guides and day-by-day itineraries for 23 cities; a script splits a single handbook manuscript into chapters and keeps hand-edited metadata intact
  • Verified-information workflow: guides carry a verified date and badge, so visas, prices, and opening hours can be rechecked before publishing
  • Editorial design system: warm paper background, ink text, and a vermilion seal-style logo, with Fraunces headings and Inter body text
  • Configuration-driven: site name, languages, and branding live in one config file, and adding a new language means adding a content folder and one config line
  • Automated delivery: GitHub Actions builds the site on every push and pull request and deploys main to Cloudflare Pages
  • Reader-supported model: guides stay free, an optional pay-what-you-want PDF covers days with no signal, and a monthly newsletter announces new guides

Tech Stack

Python (Jinja2, Markdown, PyYAML, Pillow, WeasyPrint), static HTML and CSS, GitHub Actions, Cloudflare Pages