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.cssandprocess-timeline.jsassets
The rendered output contains:
- a summary header with counts
- a dark clickable timeline journey
- a sticky left-side page progress bar inside the rendered timeline on desktop layouts
- anchor links to detailed milestone sections
- responsive milestone detail cards
- lightweight JavaScript for viewport progress tracking
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 bundled stylesheet and progress script 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
Progress bar
The timeline can render a sticky progress bar beside the milestone details on desktop layouts. It shows page scroll progress: empty at the top of the page and full at the bottom.
Progress is enabled by default. To make the setting explicit, add this top-level YAML field:
show_progress: true
To hide the progress bar for a specific timeline:
show_progress: false
When the progress bar is disabled, the milestone detail sections use the full available content width.
Browser support
The bundled styles are scoped to the rendered timeline and are designed for current versions of Chrome, Edge, Firefox, and Safari on Windows, Linux, and macOS. The layout uses CSS Grid and supports responsive, print, reduced-motion, and Windows forced-colors/high-contrast modes.
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.
show_progress: true
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: stringshow_progress: optional boolean, defaults totruemilestones: 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- when present,
show_progressmust be a boolean
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}" - a sticky left-side page progress bar appears inside the rendered timeline on desktop unless
show_progress: false - 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:
rm -rf dist build *.egg-info
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
rm -rf dist build *.egg-info
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.2.1.tar.gz.
File metadata
- Download URL: mkdocs_process_timeline-0.2.1.tar.gz
- Upload date:
- Size: 14.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 |
18f91a814f103a43fb23de753ca32cb3d4a1190327585c87bed894a5431b115e
|
|
| MD5 |
e5dd171c120ee34d026ab449bf4e6a15
|
|
| BLAKE2b-256 |
de8689ba983662b3d878fba758b055d81d777c5740042c89c107d8b8191fd092
|
Provenance
The following attestation bundles were made for mkdocs_process_timeline-0.2.1.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.2.1.tar.gz -
Subject digest:
18f91a814f103a43fb23de753ca32cb3d4a1190327585c87bed894a5431b115e - Sigstore transparency entry: 1575344282
- Sigstore integration time:
-
Permalink:
lzelga/mkdocs-vibe@36784dc87e067f9b66b2b3064d46f97ecc3ae334 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/lzelga
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@36784dc87e067f9b66b2b3064d46f97ecc3ae334 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mkdocs_process_timeline-0.2.1-py3-none-any.whl.
File metadata
- Download URL: mkdocs_process_timeline-0.2.1-py3-none-any.whl
- Upload date:
- Size: 13.0 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 |
79393398f998720c8cb68b7bb30317f58f988d00e78bd211a3d731283f298345
|
|
| MD5 |
078ea15af865fc4ec60a176ba029a03c
|
|
| BLAKE2b-256 |
df3fadeabb8ac62f7343a69e6debe4033e9e503b687a94796378b9f0af72b974
|
Provenance
The following attestation bundles were made for mkdocs_process_timeline-0.2.1-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.2.1-py3-none-any.whl -
Subject digest:
79393398f998720c8cb68b7bb30317f58f988d00e78bd211a3d731283f298345 - Sigstore transparency entry: 1575344340
- Sigstore integration time:
-
Permalink:
lzelga/mkdocs-vibe@36784dc87e067f9b66b2b3064d46f97ecc3ae334 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/lzelga
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@36784dc87e067f9b66b2b3064d46f97ecc3ae334 -
Trigger Event:
push
-
Statement type: