# Editorial Resume

> Generate a single-page A4 PDF resume in editorial bilingual (中/英) style — the kind that lands top-tier tech jobs. Trigger when the user asks to build, write, update, polish, or export their resume; or wants a "looks-like-Peng-Zhiwei's-resume" PDF. Reads the user's context (chat history, attached docs, GitHub repos, LinkedIn dump, prior drafts) and produces a printable PDF without asking 20 questions.

- Skill: `wilson534/editorial-resume` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add wilson534/editorial-resume`
- Raw SKILL.md: https://api.skillmd.com/api/skills/wilson534/editorial-resume/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: wilson534 (https://skillmd.com/u/wilson534)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/wilson534/editorial-resume

---


# Editorial Resume

A single-page A4 resume PDF generator with editorial bilingual layout. Outputs `resume.pdf` from the user's context with **zero or minimal questions**.

## When to use

- User asks "帮我做简历 / write my resume / update my CV / export my resume to PDF"
- User wants a printable PDF version of their portfolio/profile
- User uploads an old resume / LinkedIn export / GitHub README and wants it polished into a standard tier-1-tech resume

## What you do

You are responsible for end-to-end PDF generation. Do **NOT** make the user fill a form. The whole point is "one shot from context".

### Step 1 — Gather information from context

Mine the conversation history, any attached files, and the user's repo for:

| Field | Where to look |
|---|---|
| Name (Zh + En) | first message, signature, GitHub profile, prior resume |
| Role / title | inferred from job target the user mentions, or current role |
| Tagline / one-liner | what kind of work they ship; pull from their bio |
| Contacts | GitHub, email, WeChat, phone, personal site, LinkedIn |
| 个人简介 (summary) | 2-4 sentences synthesizing what they've shipped |
| 实习经历 (internships) | dated work entries with org, role, 3-4 bullets each |
| 项目经历 (projects) | independent projects with link, role, 3 bullets |
| 教育背景 | school + major + GPA + honors |
| 奖项荣誉 (awards) | competition wins, scholarships, recognitions |
| 技能 (skills) | grouped: tools / stack / methods / domain |
| 黑客松项目 (hackathons) | one-line each, optional |

**If a section is genuinely missing from context, omit it** — don't fabricate. Better a 1-page resume with 5 sections than a stretched one with empty padding.

**If critical fields are missing** (name, at least one work/project), ask **once** in a single bundled message (not a sequence of small questions).

### Step 2 — Read the reference

Open `examples/example-resume.html` to internalize:
- The CSS variables, fonts, font sizes, line heights — **copy these verbatim**, do not redesign
- The bilingual mixing: Chinese for sections/labels, English for tech terms wrapped in `<span class="en-lg">` for typographic harmony
- The bullet density: each bullet is 1-2 lines, leads with a verb or quantified outcome
- The 1-page A4 constraint — total content height must fit ~1090px

### Step 3 — Write the resume HTML

Create a new HTML file at the user's project root (e.g. `resume.html`) that:
1. Reuses `examples/example-resume.html`'s CSS block **byte-for-byte** (including the `:root` variables and all class definitions)
2. Replaces the content within `.page` with the user's data, following the same DOM structure
3. Embeds the avatar as `<img class="avatar" src="...">` — accept any local path or web URL the user provides; if no avatar, omit the `<img>` tag and let `.header-left` flex naturally
4. Keeps all `<span class="en-lg">…</span>` wrapping for English terms in titles (improves typographic balance with mixed CJK)

### Step 4 — Render PDF + auto-fit to one page

Run `scripts/render.py` with the HTML path:

```bash
python3 scripts/render.py /path/to/resume.html
```

This:
- Renders via Playwright's bundled Chromium (the only reliable headless renderer for CJK on macOS — system Chrome's headless mode renders CJK as blank)
- Outputs `resume.pdf` next to the HTML
- Reports the page count
- If >1 page: progressively tightens `.section` margin-top, `.entry` margin-bottom, and `.page` padding until it fits, or reports back so you can suggest content cuts

If rendering still spills to page 2 after auto-fit, **suggest the user cut content** (drop the weakest bullet, merge two short entries, etc.) — never let a resume be 1.05 pages.

### Step 5 — Show result

Print the absolute path of the generated PDF. If the environment supports it, also show a screenshot/preview of the first page so the user can sanity-check before sharing.

## Style rules (non-negotiable)

- **Single page A4** — never 2 pages. Density beats whitespace for fresh-grad/IC resumes.
- **No emojis** in the resume body.
- **No filler adjectives** ("热爱", "擅长沟通", "团队合作精神") — replace with quantified outcomes.
- **Bullets lead with verb + outcome**: "主导 X 0-1 定义与交付，达成 Y 指标" beats "参与了 X 的工作".
- **English tech terms keep their casing**: `LangChain`, `LangGraph`, `Agent`, `Marketplace`, `to-Reader` — wrap in `<span class="en-lg">` if it improves rhythm.
- **Numbers > prose**: "599 名学生扫描，识别 76 篇有论文记录" beats "扫描了大量论文".

## First-time setup (only if Playwright is missing)

```bash
pip3 install playwright
python3 -m playwright install chromium
```

The render script checks for these and prints clear errors if missing.

## Files

- `examples/example-resume.html` — reference resume (彭智炜's actual one). Read this to learn the style. Don't copy his content.
- `examples/example-avatar.jpg` — reference avatar (use only as visual reference for portrait crop ratio: 76×102, slight 3px radius).
- `scripts/render.py` — Playwright PDF renderer with auto-fit-to-one-page logic.

