Skip to content
Back to skills

Homepage Generator

ASecurity

Generate a fact-checked academic personal homepage from a CV, optionally augmented by an existing manual homepage and an assets directory. Produces editable structured source files (profile.yml + publications.bib + bio.md + news.md) and a single-file HTML page. Uses Codex MCP for independent factual review against DBLP / arXiv. Optionally uses Gemini multimodal for screenshot critique when available. Use when the user says '做个学术主页', '从CV生成主页', 'aris-homepage', 'generate academic homepage from...

  • 573 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added June 10, 2026
educationpythongoshellbashgitapi

Works with

  • cli
  • api
  • mcp

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 2 files and shows the line behind each finding

Scanned June 10, 2026

npx -y skills add wanshuiyin/ARIS-in-AI-Offer --skill homepage-generator --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Homepage Generator?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Homepage Generator
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/wanshuiyin-homepage-generator/badge)](https://www.skillsdirectory.com/skills/wanshuiyin-homepage-generator)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: homepage-generator
description: "Generate a fact-checked academic personal homepage from a CV, optionally augmented by an existing manual homepage and an assets directory. Produces editable structured source files (profile.yml + publications.bib + bio.md + news.md) and a single-file HTML page. Uses Codex MCP for independent factual review against DBLP / arXiv. Optionally uses Gemini multimodal for screenshot critique when available. Use when the user says '做个学术主页', '从CV生成主页', 'aris-homepage', 'generate academic homepage from CV', 'PhD homepage', 'GitHub Pages personal site', or wants a fact-checked academic site."
argument-hint: init --from-cv <cv.docx|cv.pdf|cv.txt> [--from-repos owner/repo,...] [--include-private] [--manual-homepage <url>] [--assets-dir <path>] [--out <dir>] [--force|--merge] | finalize | render --persona theory-minimal [--out <html>] [--override-all] [--no-audit] [--offline] | check [--strict] | doctor
allowed-tools: Bash(*), Read, Write, Edit, WebFetch, mcp__codex__codex
---

# /homepage-generator — fact-checked academic homepage from CV

> **The only personal-site generator that fact-checks your CV before publishing.**
> Cross-model adversarial review: the LLM that drafts your homepage never grades it — a fresh Codex thread audits every claim against DBLP / arXiv before the HTML is signed off.

## When to use

Generate a single-file HTML academic homepage. Optimized for PhD candidates, postdocs, and early-career researchers with public publications. v1 ships the `theory-minimal` persona (text-heavy academic page in the Zhxie / Avicenna lineage); `active-researcher` (paper thumbnails + news ticker variant) is planned.

**Use when** the user says `做个学术主页` · `from CV generate homepage` · `aris-homepage` · `PhD personal site` · `GitHub Pages homepage`.

**Do NOT use for**: portfolio sites needing image galleries; newsletter-funnel sites needing audience metrics; pure blog sites (use Jekyll/Hugo); tenured-faculty pages with student/teaching as top-level sections (use [academicpages](https://academicpages.github.io/)).

## Public demo

A real-world dogfood example: **https://wanshuiyin.github.io/** — homepage generated by this skill from a CV + the maintainer's previous manual page. Use it as a style and capability reference; **do not copy any names, affiliations, advisors, awards, paper titles, or filenames into your own examples or tests** (see *Privacy* below).

## Quick start

```bash
# Step 1 — bootstrap workspace from CV
aris-homepage init --from-cv ./cv.pdf --out ./site
cd ./site

# Step 2 — calling LLM agent (Claude / your agent) reads .aris-homepage/EXTRACTION_HANDOFF.md,
#          then writes the extraction JSON to .aris-homepage/extraction.json.
#          This step is NOT automated by the CLI — it's a designed handoff so the agent
#          can use richer context (manual homepage URL, asset folder, your judgement).

# Step 3 — persist the extracted JSON into editable source files
aris-homepage finalize

# Step 4 — review + tweak
$EDITOR profile.yml publications.bib bio.md news.md EXTRACTION_REVIEW.md

# Step 5 — render with fact-check (writes index.html + audit-report.md)
aris-homepage render --persona theory-minimal
```

## Input model — three sources for the LLM agent

The `init` CLI only handles the CV → text conversion. The other two inputs are consumed by the **calling LLM agent** when it fills `extraction.json`. Recommend supplying all three for best results:

| Input | How to supply | Purpose |
|---|---|---|
| **CV** | `--from-cv cv.docx/pdf/txt` on the CLI | The **factual** source — identity, education, jobs, publications, awards |
| **GitHub repos** (v1.1) | `--from-repos owner/repo,owner/repo2` on the CLI | The **project-evidence** source — stars / releases / topics / README per repo; merged into News + featured projects (issue #2) |
| **Manual homepage** | Provide URL in the prompt; the agent uses WebFetch | The **editorial** source — section ordering, topic groupings, tone, link priorities, photo URL |
| **Assets directory** | Provide path in the prompt; the agent inspects + copies into `assets/` | The **visual** source — headshot, paper thumbnails, project logos |

**Reconciliation rule**: the CV is authoritative for **facts** (paper venues, dates, author lists), the manual homepage is authoritative for **how you present yourself** (what to group, what to surface, what voice), and the assets folder provides **visuals**. If the three sources conflict, do **not** silently merge — write the conflict to `EXTRACTION_REVIEW.md` for user resolution.

**If you have no manual homepage yet**: skip it. The generator falls back to CV-only structure with sensible academic defaults.

> **Coming in v1.1**: native CLI flags `--manual-homepage URL` and `--assets-dir PATH` will fetch + stage these inputs automatically. For v1, the calling agent handles them.

## Commands

```bash
aris-homepage init --from-cv <file> [--from-repos owner/repo,...] [--include-private] [--out DIR] [--force|--merge]
  # Step 1. Extract CV to plain text (via textutil / python-docx / pdftotext).
  # Step 1b. (v1.1) If --from-repos given, snapshot each repo via `gh` CLI
  #          (GraphQL metadata + REST README, truncated 20KB) →
  #          .aris-homepage/github_repos.json. Private repos skipped unless
  #          --include-private.
  # Step 2.  Emit .aris-homepage/EXTRACTION_HANDOFF.md describing what the calling
  #          LLM agent should write to .aris-homepage/extraction.json
  #          (handoff doc auto-includes guidance on github_repos.json if present).
  # --force: backup *.bak-TIMESTAMP and overwrite; --merge: fill-only (v1.2)
  # NOTE: --manual-homepage and --assets-dir flags coming in v1.2; for now,
  #       the calling agent handles those sources via prompt context.

aris-homepage finalize [--out DIR]
  # Ingest .aris-homepage/extraction.json → profile.yml + publications.bib +
  # bio.md + news.md + EXTRACTION_REVIEW.md.

aris-homepage render --persona theory-minimal [--out index.html] [--override-all] [--no-audit] [--offline]
  # Run fact-check (unless --no-audit) and render. Hard-fail blocks ship unless
  # --override-all (loudly logged in audit-report.md).

aris-homepage check [--strict]
  # Fact-check only; updates audit-report.md. --strict treats WARN as FAIL.

aris-homepage doctor
  # Environment + dependency diagnostic (Python, pyyaml, textutil, DBLP reachability).
```

## Generated editable source files

After `finalize`, your working dir contains these editable files. Edit them in your IDE; they are the source of truth — re-run `render` after each change.

| File | Role |
|---|---|
| `profile.yml` | Structured facts: identity, affiliations, education, research, links, awards, talks, teaching, featured projects, publication metadata, audit overrides |
| `publications.bib` | BibTeX entries — paper truth source |
| `bio.md` | 1-3 paragraph self-introduction in Markdown |
| `news.md` | Reverse-chronological news bullets; supports inline `<img>` for embedded badges |
| `assets/` | Optional local images (photo, paper thumbnails) — remote `https://` URLs also accepted in profile.yml |
| `EXTRACTION_REVIEW.md` | LLM extraction confidence flags — read this before the first `render` |
| `.aris-homepage/` | Internal cache (DBLP responses, extraction handoff JSON); safe to delete |
| `audit-report.md` | Generated by `render` / `check` — your evidence trail |

## Schema reference

`profile.yml` has many optional fields; the complete reference lives in **[`PROFILE_SCHEMA.md`](PROFILE_SCHEMA.md)** in this skill directory. Keep that as the single source of truth for fields.

Core schema groups (read `PROFILE_SCHEMA.md` for the exact field shapes):

- **`identity`**: name, name_native (bilingual), title, email, wechat, office, photo (local path or remote URL)
- **`affiliations`**: current + past arrays with role / institution / department / start / end
- **`education`** · **`research`** (summary + interests) · **`links`** (scholar / github / dblp / orcid / etc.)
- **`featured_projects`**: first-class section for flagship OSS work — logo, stats grid, link cluster, sub-projects, open problems
- **`awards`** · **`talks`** · **`teaching`** · **`blogs_tutorials`** (rendered combined with talks)
- **`professional_services`**: conference reviewer / journal reviewer / editorial board list
- **`selected_publications`**: flat list OR ordered topic groups (`[{group: "Topic Title", keys: [bibkey1, ...]}]`)
- **`publications`**: `preamble` (intro sentence before first H3)
- **`publications_meta.<bibkey>`**: `thumbnail`, `description` (blue blurb box), `awards` (list of badges), `co_first` (equal-contribution markers), `links` (arXiv / paper / code / slides / openreview / etc. — any key supported)
- **`audit.overrides.<bibkey>`**: per-paper, per-field bypass with required `reason` and optional `expires: YYYY-MM-DD`
- **`ship`**: `persona`, `accent_color`, `lang`, `awards_heading` (override "Awards" → custom string)

## Fact-check protocol

Runs automatically during every `render` (unless `--no-audit`). Three outcomes per claim:

| Outcome | Trigger | Effect |
|---|---|---|
| **PASS (silent)** | Title fuzzy-matches DBLP; venue + year + author set agree | No mention in audit-report |
| **WARN (soft)** | DBLP returns 0 hits OR ≥2 ambiguous; arXiv-only paper; award has no external URL | Render proceeds; logged in audit-report |
| **FAIL (hard)** | DBLP venue ≠ profile venue; year mismatch; author list missing user; fabricated award badge; missing bibkey in publications.bib | HTML still renders but verdict = `BLOCKED`; user must `--override-all` to ship |

**Override two-layer**:
- Per-paper, per-field in profile.yml: `audit.overrides.<bibkey>.<field>: true` with required `reason:` and optional `expires:` date
- CLI emergency: `aris-homepage render --override-all` (every override loudly logged)

**Honest scope of fact-check**: catches venue/year/author mismatch and fabricated award claims. Does NOT verify: workshop papers without DBLP entries, industry tech reports, blog/talk content, OSS star counts, or arbitrary claims in the bio. Treat the audit as a **diagnostic floor**, not a guarantee.

## Cross-model review — what's automated vs optional

Two distinct review layers; do not confuse them:

**Layer 1 — automated factual audit (always runs)**
`aris-homepage render` and `aris-homepage check` run a deterministic Python pipeline that queries DBLP (with a 4-attempt backoff + local cache at `.aris-homepage/dblp-cache.json`) and falls back to arXiv hints. No external LLM needed. This is the **floor** of fact-check, and it works with **zero** AI-runtime dependencies beyond Python + the calling shell.

**Layer 2 — optional adversarial LLM review (recommended for high-stakes)**
If the calling agent has access to **Codex MCP** (`mcp__codex__codex`), run a fresh-thread Codex review after `render` to scrutinize: bio prose tone, claim phrasing, sub-project list, schema consistency. Codex acts as the cross-family reviewer (ARIS's adversarial-review invariant).

If the calling agent has access to **Gemini** (`mcp__gemini__analyzeFile` or `mcp__gemini-cli__ask-gemini` with `model: auto-gemini-3`), additionally use it to critique a Chrome-headless screenshot of the rendered HTML for visual issues (layout collisions, font sizes, image proportions).

**Minimum required runtime**: Python + the calling shell. The skill renders + fact-checks fully without Codex or Gemini. Codex strengthens the review; Gemini adds visual-design feedback. **Neither is required** to generate or ship the homepage.

| Runtime | What you get |
|---|---|
| Python only | Layer-1 DBLP fact-check; full render |
| + Codex MCP | + Adversarial LLM review of prose / claims / schema |
| + Gemini multimodal | + Visual-design critique of rendered screenshot |

## Pipeline

```
                ┌────────────────────────────────────────────┐
cv.{pdf,docx} ─►│ Step 1: extract → cv.txt                   │
                │ Step 1b: if --manual-homepage, WebFetch    │
                │ Step 1c: if --assets-dir, link to workspace│
                └─────────────────┬──────────────────────────┘
                                  ▼
                ┌──────────────────────────────────────────┐
                │ Step 2: LLM agent fills extraction.json  │
                │   (JSON-schema-constrained output)       │
                └─────────────────┬────────────────────────┘
                                  ▼
                ┌──────────────────────────────────────────┐
                │ Step 3: aris-homepage finalize           │
                │   → profile.yml + publications.bib       │
                │   + bio.md + news.md + EXTRACTION_REVIEW │
                └─────────────────┬────────────────────────┘
                                  │
                       ✋ USER EDITS IN IDE ✋
                                  │
                                  ▼
                ┌──────────────────────────────────────────┐
                │ Step 4: render (with Layer-1 DBLP audit) │
                │   ↳ Python DBLP/arXiv fact-check         │
                │   ↳ Python builds per-section HTML       │
                │   ↳ inject into homepage-<persona>.html  │
                │   ↳ (optional) Codex MCP adversarial pass│
                │   ↳ (optional) Gemini screenshot critique│
                └─────────────────┬────────────────────────┘
                                  ▼
                ┌──────────────────────────────────────────┐
                │ index.html + audit-report.md             │
                └──────────────────────────────────────────┘
```

## Pipeline: dependencies

- **Python 3.10+**, `pyyaml` (`pip install pyyaml`, may need `--break-system-packages` on modern macOS)
- **BibTeX**: parsed by a bundled stdlib parser — no `bibtexparser` dependency
- **DOCX**: `textutil` on macOS (bundled) OR `python-docx` (`pip install python-docx`)
- **PDF**: `pdftotext` (install via `brew install poppler` / `apt install poppler-utils`)
- **DBLP**: official `https://dblp.org/search/publ/api` (rate-limited 4-attempt backoff + local cache in `.aris-homepage/dblp-cache.json`)
- **Codex MCP**: for cross-model factual audit (required for the audit; the generator runs without it via `--no-audit`)

`aris-homepage doctor` checks all of the above.

## Privacy and generic examples

**All examples in this skill must be generic** unless explicitly marked as the public demo URL (`wanshuiyin.github.io`).

**Never include** in examples, schema docs, or tests:
- maintainer / collaborator / advisor / student names
- institution-specific names (university, department, lab)
- local filesystem paths (`/Users/...`, `~/...`)
- private CV filenames
- email addresses, phone numbers, WeChat IDs, office locations
- copied publication lists, awards, employment history, unpublished project names
- API keys or credentials

**Use placeholders**:
- `Dr. Example Researcher` · `Jane Doe`
- `Example University` · `Department of CS`
- `cv.pdf` · `assets/photo.jpg`
- `https://example.github.io/`
- `example2026paper` (bibkey)
- `advisor@example.edu`

The public demo at `wanshuiyin.github.io` is the **only exception** — it's an authorized, named real-world example of generator output, not a source to copy data from.

## Acceptance criteria (v1 done)

1. `aris-homepage init --from-cv` produces editable scaffolding from any user's CV (single-file `.docx` or `.pdf`).
2. `aris-homepage render --persona theory-minimal` produces a single HTML file ≤500KB (no images) or ≤2MB (with photo + thumbnails inline), or smaller still when images are referenced via remote URLs.
3. Fact-check correctly hard-fails on a corrupted profile.yml (e.g., venue swap NeurIPS↔ICML) and passes when corrected.
4. The HTML is publishable on GitHub Pages / Netlify / S3 / any static host without a build step.
5. `aris-homepage doctor` accurately reports environment readiness.
6. No personal info from the maintainer's dogfood leaks into shipped examples or tests.

## What's deferred (v1.1+)

- `active-researcher` template (placeholder exists; `theory-minimal` is the only fully-shipping persona)
- Builder-Engineer / PM personas (v2 — these target non-academic users)
- Multi-page output (sidebar nav for sites with 50+ pubs)
- Bilingual side-by-side mode (`lang: bilingual`)
- Automated `--manual-homepage` editorial-extraction helpers (currently the calling LLM agent reads the fetched HTML and reconciles)
- Auto-thumbnail downscaling and WebP conversion

## Related

- `skills/interview-cheatsheet/SKILL.md` — sister skill for ML interview cheat sheets (shared cross-model review pattern)
- `skills/render-html/SKILL.md` — Markdown → single-file HTML primitive
- `tools/aris_homepage.py` — implementation
- `tools/templates/homepage-theory-minimal.html` — template
- `PROFILE_SCHEMA.md` (sibling file) — complete schema reference

Files in this skill

  • PROFILE_SCHEMA.md11.9 KB
  • SKILL.md17.6 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…