MkDocs plugin that renders process timeline shortcode content from YAML.
Project description
mkdocs-process-timeline
mkdocs-process-timeline renders a process timeline from YAML with a Markdown shortcode.
It is an MkDocs plugin that:
- finds
::process-timeline{file="..."}in page Markdown - loads a YAML file relative to
docs_dir - validates the YAML structure
- replaces the shortcode with rendered HTML
- automatically includes the bundled
process-timeline.cssasset
The rendered output contains:
- a summary header with counts
- a dark clickable timeline journey
- anchor links to detailed milestone sections
- responsive milestone detail cards
- no JavaScript
Install
pip install mkdocs-process-timeline
For local development:
pip install -e ".[dev]"
MkDocs configuration
Enable the plugin in mkdocs.yml:
plugins:
- search
- mkdocs-process-timeline
No extra CSS or JavaScript setup is required. The plugin injects its stylesheet automatically.
Usage
Add the shortcode to a page:
::process-timeline{file="processes/delivery.yml"}
Whitespace around file= is also supported:
::process-timeline{ file = "processes/delivery.yml" }
The YAML file path is resolved relative to docs_dir, not relative to the current Markdown file.
Example:
- if
docs_dirisdocs - and the shortcode is
::process-timeline{file="processes/delivery.yml"}
then the plugin reads:
docs/processes/delivery.yml
Minimal example
Markdown page:
# Delivery Process
::process-timeline{file="processes/delivery.yml"}
YAML file:
title: Delivery Process
description: A simple example showing how to define a delivery workflow in YAML.
milestones:
- id: intake
title: Intake
summary: Capture the incoming request and verify completeness.
description: Review the request, collect missing inputs, and log the work item.
duration_weeks: 1
contact:
name: Jordan Smith
role: Intake Coordinator
email: jordan@example.com
support:
label: Open intake support request
url: https://example.com/support/intake
references:
- label: Intake checklist
url: https://example.com/intake-checklist
tasks:
- title: Register request
description: Create the delivery request record in the intake workflow.
url: https://example.com/docs/register-request
- title: Confirm mandatory inputs
description: Verify the requester attached the required initial materials.
url: https://example.com/docs/confirm-inputs
- id: planning
title: Planning
summary: Convert the request into a structured delivery plan.
description: Agree scope, owners, and target dates before execution begins.
duration_weeks: 2
contact:
name: Casey Taylor
tasks:
- title: Define milestones
description: Break the delivery into measurable execution checkpoints.
YAML schema
Top-level fields:
title: stringdescription: stringmilestones: non-empty list
Milestone fields:
id: string, uniquetitle: stringsummary: stringdescription: stringduration_weeks: positive int or floatcontact:name: stringrole: optional stringemail: optional stringsupport: optionallabel: stringurl: string
references: optionallabel: stringurl: string
tasks: list of objectstitle: stringdescription: stringurl: optional string
Validation rules
The plugin validates input before rendering.
Top-level validation:
- the YAML file must exist
- the YAML root must be a mapping
milestonesmust be a non-empty list
Milestone validation:
- milestone ids must be unique
id,title,summary,descriptionare required non-empty stringsduration_weeksmust be a positive numbercontactmust be a mappingcontact.nameis required- when present,
contact.rolemust be a non-empty string - when present,
contact.emailmust be a string - when present,
contact.supportmust be a mapping withlabelandurl - when present,
referencesmust be a list of mappings withlabelandurl tasksmust be a list of mappings- each task must contain
titleanddescription - when present,
task.urlmust be a non-empty string
Validation errors include the filename and milestone id where possible.
Rendered structure
For each rendered timeline:
- timeline cards link to
#milestone-{id} - detailed milestone sections use matching
id="milestone-{id}" - summary stats include:
- milestones
- estimated duration
- required tasks
- references
- task titles render as links only when
task.urlis present - support renders only when
contact.supportis present - references panel renders only when references exist
Development
Install the project in editable mode:
python3 -m pip install -e ".[dev]"
Run tests:
pytest
Build the example site:
mkdocs build -f examples/basic/mkdocs.yml
Build distributable artifacts:
python3 -m build
Check the generated distributions before publishing:
python3 -m twine check dist/*
Serve the example locally:
mkdocs serve -f examples/basic/mkdocs.yml
Then open:
http://127.0.0.1:8000/
Example
See examples/basic for a working sample project:
Publishing
Typical release flow:
python3 -m pip install -e ".[dev]"
pytest
mkdocs build -f examples/basic/mkdocs.yml
python3 -m build
python3 -m twine check dist/*
python3 -m twine upload dist/*
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mkdocs_process_timeline-0.1.0.tar.gz.
File metadata
- Download URL: mkdocs_process_timeline-0.1.0.tar.gz
- Upload date:
- Size: 11.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c893ebd9a9c48fdfaba2bbd84bf167098d225546e0441110de61f40b9717dda
|
|
| MD5 |
7f94f705599fd4c46a64cd7c9d85fedb
|
|
| BLAKE2b-256 |
bda5919cb8758b2c4852a549bf0ca730faf820a7fff47b2c911303eeb32b8209
|
Provenance
The following attestation bundles were made for mkdocs_process_timeline-0.1.0.tar.gz:
Publisher:
publish.yml on lzelga/mkdocs-vibe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mkdocs_process_timeline-0.1.0.tar.gz -
Subject digest:
6c893ebd9a9c48fdfaba2bbd84bf167098d225546e0441110de61f40b9717dda - Sigstore transparency entry: 1394648013
- Sigstore integration time:
-
Permalink:
lzelga/mkdocs-vibe@ce71d8177fc47d7fc061166746e810775e26734a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/lzelga
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ce71d8177fc47d7fc061166746e810775e26734a -
Trigger Event:
push
-
Statement type:
File details
Details for the file mkdocs_process_timeline-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mkdocs_process_timeline-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8f6abb13cca09b15dbd5a87b5e9d4295243e47a60f0960e69b24eeb048540281
|
|
| MD5 |
7023f5fe9e509c11aa4b78d9fd794e08
|
|
| BLAKE2b-256 |
48a952a77d6092ed52c7fedbd03c31d3a7ae82a74c870da04368bb60985c565e
|
Provenance
The following attestation bundles were made for mkdocs_process_timeline-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on lzelga/mkdocs-vibe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mkdocs_process_timeline-0.1.0-py3-none-any.whl -
Subject digest:
8f6abb13cca09b15dbd5a87b5e9d4295243e47a60f0960e69b24eeb048540281 - Sigstore transparency entry: 1394648021
- Sigstore integration time:
-
Permalink:
lzelga/mkdocs-vibe@ce71d8177fc47d7fc061166746e810775e26734a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/lzelga
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ce71d8177fc47d7fc061166746e810775e26734a -
Trigger Event:
push
-
Statement type: