LabEx Skill Trees is an open catalog of technology skills designed for hands-on learning and skill assessment.
LabEx Skill Trees V2: A More Precise Skill Model for Hands-On Learning
The repository contains the public source data behind the LabEx skill assessment model: each skill tree describes the stable, assessable capabilities in one technical domain such as Linux, Python, Docker, Git, Kubernetes, SQL, or cybersecurity. The model is intended to help individuals, educators, and organizations map learning content, practice labs, challenge labs, and assessment evidence to a shared skill taxonomy.
A skill tree is not a course outline. It is a domain skill map.
- A skill tree represents one technology domain, for example
linux,python, ordocker. - A skill represents a concept-level capability that can be taught, practiced, and assessed.
- The
skillsarray is the canonical order for that domain, but it should not be treated as a strict learning path. - Skill mastery should be inferred from evidence, such as guided labs, challenge labs, projects, or assessments.
LabEx uses this model to connect hands-on labs and challenges to measurable skills. Other projects can use the same data model to build curricula, assessment rubrics, progress dashboards, recommendation systems, or internal capability maps.
v2/ Current canonical skill tree data
v1/ Legacy skill tree data kept for compatibility
docs/skill-tree-design.md
Design principles for contributors
scripts/ Catalog generation and validation scripts
src/ Optional JSON API implementation
skilltree.schema.json JSON Schema for one skill tree file
The current canonical dataset is v2. It contains 25 skill trees and 1,129 skills. The v1 dataset is retained in the repository for historical reference, but the public API only serves the current canonical dataset.
Each v2/{key}.json file contains one skill tree:
{
"key": "linux",
"slug": "linux",
"name": "Linux",
"skills": [
{
"key": "linux/terminal_sessions",
"slug": "terminal_sessions",
"name": "Terminal Sessions",
"desc": "Terminal sessions cover working in interactive shell environments and recognizing prompt, session, and terminal context."
}
]
}Required fields:
key: stable lowercase identifier for the skill tree.slug: URL/display slug; for skill trees this should matchkey.name: English display name.skills: ordered list of assessable skills.skill.key:{skilltreeKey}/{skillSlug}.skill.slug: stable identifier used for binding labs and assessments.skill.name: short English display name.skill.desc: English description of the capability.
Skills may include an optional i18n object for localized name and desc values. English remains the canonical fallback.
You can consume the JSON files directly from the repository, validate them with skilltree.schema.json, use the public LabEx API, or run the included API locally.
Public API base URL:
https://skilltrees.labex.app
Common public endpoints:
GET https://skilltrees.labex.app/api/manifestGET https://skilltrees.labex.app/api/skilltrees/summaryGET https://skilltrees.labex.app/api/skilltreesGET https://skilltrees.labex.app/api/skilltrees/{key}GET https://skilltrees.labex.app/api/{locale}/skilltreesGET https://skilltrees.labex.app/api/{locale}/skilltrees/{key}GET https://skilltrees.labex.app/badges/skills/{skilltreeKey}/{skillSlug}.svgGET https://skilltrees.labex.app/badges/skilltrees/{skilltreeKey}.svg
/api/skilltrees/summary is the lightweight index endpoint. It returns each skill tree's key, slug, name, skill_count, and relative API path, so clients can discover valid keys before requesting /api/skilltrees/{key}.
Localized API routes are available for en, zh, es, fr, de, ja, ru, ko, and pt:
GET /api/{locale}/skilltrees
GET /api/{locale}/skilltrees/{key}
Localized skill responses replace name and desc with the requested locale when available, fall back to English when a translation is missing, and omit the full i18n payload. For example, /api/zh/skilltrees/linux returns Chinese skill names and descriptions directly in name and desc.
Canonical skill responses include a badge field on each skill. The field is a relative SVG badge path that can be rendered directly in HTML or Markdown.
Badge endpoint:
GET /badges/skills/{skilltreeKey}/{skillSlug}.svg
HEAD /badges/skills/{skilltreeKey}/{skillSlug}.svg
The default badge language is English. Use the optional lang query parameter to request localized badge text. Supported badge languages are en, zh, es, fr, de, ja, ru, ko, and pt. Non-English locales use localized skill names when available and fall back to English otherwise.
Badge variants are controlled with the optional earned query parameter:
?earned=trueor?earned=1: earned badge with a check mark.?earned=falseor?earned=0: unearned badge style.- Omit
earned: default badge style.
Badge themes are controlled with the optional theme query parameter:
?theme=dark: dark badge theme.?theme=light: light badge theme.- Omit
theme: dark badge theme.
Example:
https://skilltrees.labex.app/badges/skills/linux/terminal-sessions.svg
https://skilltrees.labex.app/badges/skills/linux/terminal-sessions.svg?lang=zh
https://skilltrees.labex.app/badges/skills/linux/terminal-sessions.svg?theme=light
Skilltree badge endpoint:
GET /badges/skilltrees/{skilltreeKey}.svg
HEAD /badges/skilltrees/{skilltreeKey}.svg
Skilltree badge themes use the same optional theme query parameter as skill badges.
Example:
https://skilltrees.labex.app/badges/skilltrees/linux.svg
https://skilltrees.labex.app/badges/skilltrees/linux.svg?theme=light
Prerequisite: Node.js 22 or newer.
npm install
npm run validate
npm run buildStart the local API:
npm run devCommon API endpoints:
GET /api/manifestGET /api/skilltrees/summaryGET /api/skilltreesGET /api/skilltrees/{key}GET /api/{locale}/skilltreesGET /api/{locale}/skilltrees/{key}GET /badges/skills/{skilltreeKey}/{skillSlug}.svgGET /badges/skilltrees/{skilltreeKey}.svg
The API implementation is optional. The skill tree data model is independent of any hosting provider.
Contributions are welcome when they improve the quality, consistency, or coverage of the skill model.
Good contributions usually do one of the following:
- Improve a skill name or description without changing its intended boundary.
- Add a missing core skill that can be taught and assessed.
- Remove or merge skills that are too narrow, duplicated, or not assessable.
- Improve translations while preserving the English skill boundary.
- Add a new skill tree for a clearly scoped technology domain.
Before opening a pull request:
npm run validate
npm run buildRead docs/skill-tree-design.md and CONTRIBUTING.md before making larger model changes.
The short version:
- Model skills, not course chapters.
- Keep each skill assessable through hands-on work.
- Keep skill boundaries stable and domain-specific.
- Prefer core, common capabilities over exhaustive coverage.
- Put difficulty in labs or assessment rubrics, not in skill names.
- Keep user progress, recommendations, lab metadata, and display grouping outside the canonical skill tree JSON.
This repository is being prepared for open-source release. Add the final license file before publishing the public repository.