Build log · Software & apps

梗史 2000—2026 — a 27-year Chinese meme history

Software & appsdone2 versionsChinese internet27 years250 memesSingle fileSearch

reflection not written yet · every fact below is generated from this project’s own spec and files

What it is

A meme history of China, 2000 to 2026: 250 entries across 27 year sections, each with where the meme came from and what it was doing — plus a long-form 'meme of the year' for every single year and five eras. One 120 KB HTML file, zero network requests, full-text search, tag filter, print-ready.

Version history

Straight from the project’s own card data — what each version added.

V1

2026 only, 47 entries, month by month

V2

27 years, 250 entries, 5 eras, one king per year — shipped

Files on the site

What broke, and what I’d change

Not written yet. This is the part only I can write — what actually went wrong, and what I’d do differently. It lives in builds/reflections/meme-history.md (see _TEMPLATE.md); as soon as that file has words in it, this section fills in on the next build.

Everything else on this page — the spec, the version history, the file counts — is generated from the project’s own build notes and files, so nothing here is guesswork.

Build spec

The project’s own build notes, rendered. Open the raw .md ↗

Show the spec

Build spec — 梗史 2000—2026 (Chinese internet meme history)

Goal. One self-contained HTML file that documents Chinese internet memes year by year, 2000 → 2026, with the origin of each meme rather than a naked list of names.

Hard requirements

  • Single file, zero network requests (no CDN, no webfonts, no images). Must open from a USB stick and print cleanly.
  • Every year 2000–2026 gets the same skeleton: giant numeral, one-line note for the year, one tier-1
  • “meme of the year” card (3-paragraph origin story + why this one + how to use it), then 5–11 short cards (origin line + one paragraph).

  • Preserve user-supplied names verbatim, including lowercase Latin (mj, city 不 city, 栓 Q).
  • Search, tag filter, and year jump. A bare four-digit query must take a year branch (exact year match),
  • not a substring match.

  • Counts in the header/footer are computed from the payload, never hard-coded.

Data shape

{"y":2009,"name":"贾君鹏你妈妈喊你回家吃饭","tag":"围观事件","tier":1,
 "origin":"one line: where it came from",
 "story":["para","para","para"],
 "why":"why this is the year's meme","use":"how people actually use the phrase",
 "src":["维基百科","https://…"]}

tier:2 entries carry origin + story[] only. The year is the only grouping key — adding a year is one array.

Editorial rules

  1. Year = widest spread, not birth. 很黄很暴力 aired Dec 2007, filed 2008. State the rule on the page.
  2. Do not pad. 2000–2007 has 6–9 entries a year and that is the honest shape; the era text says why
  3. (memes grew out of typing habits then, and documentation is thin).

  4. No invented numbers. A figure appears only if a source had it. Where media conflict (the MJ effect,
  5. the 牛来 box office), give both and say they conflict.

  6. Judgement is visible. Each king carries a why this one box so a reader can disagree with the pick.
  7. Five eras, each naming the medium that produced the memes of that period:
  8. 2000–2007 网络方言 / 2008–2012 围观 / 2013–2017 造词 / 2018–2022 短视频 / 2023–2026 抽象与情绪.

Verification (all of it ran)

# headless Chromium, DOM read-back
chromium --headless=new --virtual-time-budget=4000 --dump-dom file://…/meme-history.html | grep -c '<article'
# → 250 ; sections → 27 ; .card.hl → 27

Interaction was tested by dispatching real input/click events and writing the result into document.title, then reading the DOM: 2003 → 8 cards, 馒头 → 3, zzzz → 0, clear → 250, tag 网络方言 → 20. Layout: scrollWidth ≤ innerWidth at 500/768/1280/1440 px, 0 JS errors.

Known gaps

  • No images (deliberate — keeps the zero-request property).
  • 2026 stops at August; September–October still moving.
  • 2000–2007 dates are year-level, not month-level.