diff --git a/about-runtimes.md b/about-runtimes.md
index cd32715b7c5aeac5fac3a8ae9d274fb216a4d360..1cd690924912662a528f8cd697caf7dd1f2d12d4 100644
--- a/about-runtimes.md
+++ b/about-runtimes.md
@@ -3,6 +3,9 @@ title: "Monado - About Runtimes"
 layout: main
 ---
 
+* TOC
+{:toc}
+
 # About OpenXR runtimes
 
 As an OpenXR runtime, Monado consists of various components necessary to implement the OpenXR API:
diff --git a/developing-with-monado.md b/developing-with-monado.md
index 4c2fefa48706133698cf92901085ff15602ba680..ef22bd4181d723518b28179e9ba2720af2874b7f 100644
--- a/developing-with-monado.md
+++ b/developing-with-monado.md
@@ -3,6 +3,9 @@ title: "Monado - Developing with Monado"
 layout: main
 ---
 
+* TOC
+{:toc}
+
 # Developing with OpenXR and Monado
 
 After installing the OpenXR SDK and Monado with the [Getting Started Guide]({% link getting-started.md %}) it is time to develop an OpenXR application.
diff --git a/direct-mode.md b/direct-mode.md
index 27ebaed927718e71d4751db657668c31db847da8..d8e2cc45cda8e19f5d9454f6e6acfb2e8f58e5b2 100644
--- a/direct-mode.md
+++ b/direct-mode.md
@@ -3,6 +3,9 @@ title: "Monado - What is Direct Mode"
 layout: main
 ---
 
+* TOC
+{:toc}
+
 # "Extended Mode" - Before Direct Mode
 
 Regardless of actual hardware display arrangement, HMD displays are usually connected with a single HDMI or Displayport connector to a GPU and present themselves as a conventional monitor to the operating systems.
@@ -124,5 +127,6 @@ When using Monado's SteamVR plugin, the SteamVR compositor and its direct mode i
 [Extended Mode notes in the OpenHMD wiki](https://github.com/OpenHMD/OpenHMD/wiki/Extended-Mode)
 
 # Footnotes
+{:.no_toc}
 
 [^vr_software]: In the early days each VR application included a part of a vendor SDK that was responsible for managing an extended mode window or direct mode for just this application. Nowadays the "VR software" responsible for managing direct mode is usually a long running VR runtime (Oculus Home, SteamVR, WMR Portal, Monado) that VR applications connect to.
diff --git a/edid-override.md b/edid-override.md
index bda5bd5bbf70370259c10ae2984792ff18b80296..77e05be6fb5f41ded25953bde5cca2c4b5791205 100644
--- a/edid-override.md
+++ b/edid-override.md
@@ -3,6 +3,9 @@ title: "Monado - EDID Override"
 layout: main
 ---
 
+* TOC
+{:toc}
+
 # Wrong colors on AMD GPUs
 
 ## Known affected HMDs
diff --git a/getting-started.md b/getting-started.md
index 630a81931a946bd73f5816d9f96df03b96ade7fc..bf84dde61f275b407a21939a6b76d15bc7754ef8 100644
--- a/getting-started.md
+++ b/getting-started.md
@@ -3,6 +3,9 @@ title: "Monado - Getting Started"
 layout: main
 ---
 
+* TOC
+{:toc}
+
 # About OpenXR and Monado
 
 Software that supports VR by using the OpenXR API requires two software packages to work:
diff --git a/index.md b/index.md
index 17bb30d1efcd5c47c4fd4765b9cf3dc3718a08c2..f29c42db88f2b0c24cfd0e6f34d59db10ded1c10 100644
--- a/index.md
+++ b/index.md
@@ -4,6 +4,10 @@ layout: main
 ---
 
 # Monado - XR Runtime (XRT)
+{:.no_toc}
+
+* TOC
+{:toc}
 
 ## What is Monado?
 
@@ -129,6 +133,7 @@ For other questions and just hanging out you can find us here:
 * [Discord](https://discord.gg/8RkJgRJ) server.
 
 # Footnotes
+{:.no_toc}
 
 [^yuv_edid]: An issue with the EDID results in wrong colors or black screen on AMD GPUS. See [EDID override]({% link edid-override.md %}) for details and workarounds.
 [^hdk_edid_fix]: Firmware was fixed [in this PR](https://github.com/OSVR/OSVR-HDK-MCU-Firmware/pull/31). Builds can be found [here](https://dev.azure.com/osvr/OSVR-HDK-MCU-Firmware/_build/results?buildId=9&view=artifacts&type=publishedArtifacts) - Choose a successful pipeline (green checkmark), choose "1 published", in the 3 dots menu choose "Download Artifacts".
diff --git a/multi-gpu.md b/multi-gpu.md
index c0f87415e7bbdf3e6420e27ff691613ba487696d..098988566ce3c0010c3d6a0e3f3d76a26f75865a 100644
--- a/multi-gpu.md
+++ b/multi-gpu.md
@@ -3,6 +3,9 @@ title: "Monado - Multi GPU"
 layout: main
 ---
 
+* TOC
+{:toc}
+
 # Intel integrated GPU + NVidia dedicated GPU.
 
 The following configurations have been tested on Ubuntu 20.04 with UHD Graphics 610 using Mesa 20.0.8 and a GeForce GTX 1050 Ti using nvidia 440.64.
diff --git a/positional-tracking-psmove.md b/positional-tracking-psmove.md
index 7cfc8bfe1b1b4faf793c401c3d917b7fbe682e4b..2fe86bb11e6eb0c323b66bb600e1c771bc568fff 100644
--- a/positional-tracking-psmove.md
+++ b/positional-tracking-psmove.md
@@ -3,6 +3,9 @@ title: "Monado - Positional Tracking with Playstation Move"
 layout: main
 ---
 
+* TOC
+{:toc}
+
 # Playstation Move and PSVR 6DoF tracking
 
 Playstation Move and PSVR tracking is a work in progress and the implementation described here will be improved/changed over time.
diff --git a/stylesheets/stylesheet.css b/stylesheets/stylesheet.css
index d40781f6ec21736102027052bde810f94237096b..8bbf176903666c6339764f8a4659d6ec3325166f 100644
--- a/stylesheets/stylesheet.css
+++ b/stylesheets/stylesheet.css
@@ -249,3 +249,19 @@ a {
 @media screen and (max-width: 42em) {
   .site-footer {
     font-size: 0.9rem; } }
+
+#markdown-toc::before {
+    content: "Contents";
+    font-weight: bold;
+}
+
+#markdown-toc ul {
+    list-style: decimal;
+}
+
+#markdown-toc {
+    border: 1px solid #aaa;
+    padding: 1.5em;
+    list-style: decimal;
+    display: inline-block;
+}