Academic Pages includes an alternative CV page (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/academicpages/academicpages.github.io/llms.txt
Use this file to discover all available pages before exploring further.
_pages/cv-json.md) that reads its content from a structured JSON file (_data/cv.json) rather than from hand-written Markdown sections. The JSON file follows the JSONResume schema and is rendered by the _includes/cv-template.html Liquid template into a clean, consistently formatted CV page. This approach is useful when you want a single authoritative data source for your CV that can also be consumed by other tools.
The cv-json.md Page File
The page itself is minimal — all the rendering logic lives in cv-template.html:
author_profile: false — the JSON CV page hides the sidebar to give the CV content more horizontal space. The page also includes download and back-navigation links below the rendered CV.
The _data/cv.json Schema
_data/cv.json is a JSON object whose top-level keys map to CV sections. Jekyll makes the entire file available in Liquid templates as site.data.cv. The cv-template.html include renders each key as a section heading if it contains at least one entry.
Top-level structure
basics
Personal and contact information displayed in the CV header:
profiles array renders as a row of linked icons in the CV header. Each entry needs a network name and a url; username is optional.
education
work
publications
Each entry maps to a paper or article:
presentations
Talks and tutorials. Note the key is presentations, not talks:
teaching
portfolio
Other top-level arrays
| Key | Item fields |
|---|---|
skills | name, level, keywords (array) |
languages | language, fluency |
interests | name, keywords (array) |
references | name, reference |
[]) are safe to leave in place — cv-template.html checks cv.<section>.size > 0 before rendering each section, so empty arrays produce no output.
How cv-template.html Renders the JSON
_includes/cv-template.html starts by assigning the data file to a variable:
archive layout wraps the rendered content with the standard site header, sidebar, and footer.
Generating cv.json Automatically
Instead of editing _data/cv.json by hand, you can generate it from your existing _pages/cv.md file plus your site’s collections using scripts/cv_markdown_to_json.py.
What the script does
The Python script reads four sources and combines them into a single JSON file:_pages/cv.md— parses Education, Work experience, and Skills sections from Markdown_config.yml— extracts author info (name, email, location, employer, bio, social profiles)_publications/*.md— readstitle,venue,date,paperurl, andexcerptfront matter from each publication file_talks/*.md— readstitle,venue,date,location, andexcerptfrom each talk file_teaching/*.md— readstitle,venue,date,type, andexcerptfrom each teaching file_portfolio/*.md— readstitle,collection,date,permalink, andexcerptfrom each portfolio file
Running the script
Run cv_markdown_to_json.py
Run the script from the repository root, providing paths to the Markdown CV, the output JSON file, and the config:On success the script prints:
Review the generated file
Open
_data/cv.json and verify the output. Author information comes from _config.yml’s author: block; collection data comes from each item’s front matter.Command-line arguments
| Flag | Short | Required | Description |
|---|---|---|---|
--input | -i | Yes | Path to the Markdown CV file (e.g. _pages/cv.md) |
--output | -o | Yes | Path to write the JSON file (e.g. _data/cv.json) |
--config | -c | No | Path to _config.yml for author info |
Using the shell wrapper
scripts/update_cv_json.sh is a convenience wrapper that hard-codes all three paths relative to the repository root, so you do not need to type the full command each time:
- Resolves the repository root automatically using
${BASH_SOURCE[0]} - Verifies that both
cv_markdown_to_json.pyand_pages/cv.mdexist before running - Calls
python3 scripts/cv_markdown_to_json.pywith the resolved paths - On success, optionally offers to run
bundle exec jekyll serveso you can preview changes immediately
Switching Between Markdown and JSON CV
Only one CV entry should be active in_data/navigation.yml at a time. The file ships with the Markdown CV enabled and the JSON CV commented out:
- Use Markdown CV (default)
- Use JSON CV
Keep the
/cv/ entry uncommented and leave /cv-json/ commented out:Both pages remain built regardless of which navigation entry is active. Switching the navigation entry only changes which one is linked from the header — both URLs remain accessible directly.