Skip to content

CertMD — Format Specification v0.1

Part of the LearnSpec suite. Draft.

Core principle

CertMD is the macro-credential format of the LearnSpec suite. It defines a digital certification — its description, SVG image, issuer, award requirements, grade levels, and accreditation conditions — in a way that is human-readable and interoperable with the Open Badges 3.0 standard.

A certification attests mastery of a complete domain, as opposed to a badge (BadgeMD) which attests a targeted skill. It may require completing multiple TrackMD learning paths, passing a formal examination, and holding prerequisite badges.

CertMD is a leaf format in terms of imports. It is referenced from TrackMD (on_completion.certificate).

CertMD inherits its frontmatter and validation rules from the shared Architecture Charter.

PrincipleDescription
Markdown-firstA .cert.md file is valid Markdown readable in any editor
File-nativeAll metadata lives in the file — no database required
SVG-nativeThe certification is represented by a bakeable SVG file
Graceful degradationThe SVG image and description are visible in any standard reader
Open Badges compatibleFields map to Open Badges 3.0 for interoperability

Key differences from BadgeMD

DimensionBadgeMDCertMD
ScopeTargeted skillComplete domain
Requirements1 track or 1 checkpoint1 or N tracks + badges + formal exam
GradesNo — binary (earned/not earned)Yes — Pass / Merit / Distinction
Formal examNoYes (optional in v0.1)
CreditsNoYes (CPD, hours, ECTS…)
AccreditationNoYes (external body)
RenewalSimple expiryExplicit renewal conditions

Format levels

LevelMechanismPurpose
0# Title + image line + Markdown bodyMinimal certification, readable everywhere
1Full YAML frontmatterMetadata, grades, credits, accreditation
2requirements fenced blockMachine-readable award requirements

Level 0 — Pure Markdown

markdown
# Certification — Python Developer

![Python Developer Certification](./cert-python-developer.svg)

This certification attests complete mastery of the Python language, from fundamentals
to object-oriented programming, data manipulation, and advanced scripting.

To earn this certification, the learner must have completed all three Python curriculum
tracks and passed the final examination with a score of at least 70%.

Graceful degradation: the certification SVG displays, the title and criteria are readable in any standard reader.

Level 1 — YAML frontmatter

yaml
---
name: "Python Developer"
lang: en                                            # REQUIRED — BCP-47 code
description: "Complete mastery of Python."
image: ./cert-python-developer.svg                  # REQUIRED — SVG file
issuer:                                             # REQUIRED
  name: Example Academy
  url: https://academy.example.org
  email: certifications@academy.example.org
grade_levels:
  pass: 0.65
  merit: 0.80
  distinction: 0.92
credits:
  value: 35
  unit: hours                                       # hours | ects | cpd_points
  framework: CPD
accreditation:
  body: "European Digital Skills Certificate"
  url: https://digital-skills-jobs.europa.eu/...
  reference: "EDSC-PY-2026-001"
tags: [python, programming, development]
expires: P3Y                                        # ISO 8601 duration
renewal:
  before_expiry: P6M
  requires:
    - type: exam
      quiz: ./exam-python-renewal.quiz.md
      passing_score: 0.65
verification_url: https://academy.example.org/verify/
alignment:
  - framework: ESCO
    url: https://esco.ec.europa.eu/...
    name: "Python development"
created: 2026-05-10
updated: 2026-05-10
spec_version: "0.1"
---

Field reference

Universal LearnSpec fields

FieldRequiredDescription
langYesBCP-47 code
tagsNoThematic tags
createdNoCreation date, ISO 8601
updatedNoLast update date, ISO 8601
spec_versionNoTargeted spec version ("0.1")

CertMD-specific fields

FieldRequiredTypeDescription
nameYesstringCertification display name
descriptionNostringShort summary of the domain attested
imageYespath/URLPath or URL to the certification SVG file
issuer.nameYesstringName of the issuing organisation
issuer.urlYesURLURL of the issuing organisation
issuer.emailNoemailIssuer contact email
grade_levels.passNofloatMinimum score to pass (0.0–1.0)
grade_levels.meritNofloatMerit grade threshold
grade_levels.distinctionNofloatDistinction grade threshold
credits.valueNonumberTraining credit value
credits.unitNoenumhours, ects, cpd_points
credits.frameworkNostringCredit framework (CPD, ECTS, CEC…)
accreditation.bodyNostringName of the accrediting body
accreditation.urlNoURLAccreditation URL
accreditation.referenceNostringAccreditation reference number
expiresNoISO 8601 durationValidity duration after award
renewal.before_expiryNoISO 8601 durationRenewal window before expiry
renewal.requiresNoobject[]Renewal requirements (same format as requirements block)
verification_urlNoURLPublic verification URL
alignmentNoobject[]Alignment to external skill frameworks

Level 2 — requirements block

A requirements fenced block defines the certification award conditions in a machine-readable way. It is placed in the document body, after the narrative description.

Simple requirements

markdown
```requirements
- type: track_complete
  track: ./python-beginner.track.md
  passing_score: 0.65
- type: track_complete
  track: ./python-intermediate.track.md
  passing_score: 0.70
- type: track_complete
  track: ./python-advanced.track.md
  passing_score: 0.70
- type: exam
  quiz: ./exam-final-python.quiz.md
  passing_score: 0.70
```

Requirement types

TypeTriggerSpecific fields
track_completeCompletion of a TrackMDtrack, passing_score (optional)
examPassing a dedicated QuizMD (formal examination)quiz, passing_score
badge_earnedHolding a BadgeMD badgebadge
manualManual award by a panel(no specific fields)

exam vs track_complete with quizzes

An exam is a QuizMD treated as a formal certification-level assessment — typically with feedback_mode: deferred, reveal: sequential, and time_limit. It is distinct from quizzes embedded within tracks. A track_complete with included quizzes assesses pedagogical progression; the exam assesses final mastery.

Referencing from TrackMD

CertMD is declared in the frontmatter of the final curriculum TrackMD via on_completion.certificate:

yaml
on_completion:
  badge: ./badge-python-advanced.badge.md
  certificate: ./cert-python-developer.cert.md

When the track completion conditions are satisfied, the player then evaluates the requirements block of the CertMD to determine whether the certification is awarded, and at which grade level.

SVG baking — implementation note

As with BadgeMD, the Open Badges 3.0 standard supports SVG baking for certifications: the JSON-LD assertion (learner, date, grade, credits) is embedded inside the certification SVG. The resulting file is self-verifiable and shareable. This is a player implementation feature, not a CertMD spec constraint.

Interoperability

MechanismSupport
Referenced from TrackMD (on_completion.certificate)
!import of other formats❌ — leaf format
!ref of other formats❌ — leaf format
Referenced from LearnMD❌ — TrackMD level only in v0.1

Validation

Lenient mode (default)

ConditionLevel
lang absent from frontmatterWarning
name absentError
image absentError
image not pointing to an SVG fileWarning
issuer.name absentError
issuer.url absentWarning
Markdown image line absent (after H1)Warning
requirements block absentWarning
Unrecognised requirement type in requirements blockWarning
grade_levels.merit < grade_levels.passError
grade_levels.distinction < grade_levels.meritError
expires in invalid format (not ISO 8601 duration)Error
credits.unit not recognisedWarning

Strict mode (--strict)

All warnings are promoted to errors.

Deferred to v0.2

FeatureReason
Conditional prerequisites between certificationsDependency graph — real-world usage feedback needed
Referencing from LearnMDCertification is a macro-credential — TrackMD level is appropriate in v0.1
Full renewal pathway (multi-track)renewal.requires already supports exams — multi-track extension is v0.2

Open Badges 3.0 mapping

CertMD fieldOpen Badges 3.0 fieldNotes
namenameIdentical
descriptiondescriptionIdentical
imageimage.idSVG URL or data URI
issuer.nameissuer.nameIdentical
issuer.urlissuer.urlIdentical
grade_levelsResolved into assertion at player level
credits.valuecreditsAvailableOB3 extension
accreditation.bodyendorsement.issuerVia EndorsementCredential
expiresexpiresISO 8601 duration
verification_urlverify.urlIdentical
alignment[].urlalignment.targetUrlIdentical
alignment[].namealignment.targetNameIdentical
requirements blockcriteria.narrative + criteria.idResolved by the player

Released under the MIT License.