diff --git a/docs/header_graph.mmd b/docs/header_graph.mmd
new file mode 100644
index 0000000..b771ba7
--- /dev/null
+++ b/docs/header_graph.mmd
@@ -0,0 +1,107 @@
+flowchart BT
+ %% level 0
+ compiler(compiler.hpp)
+
+ %% level 1
+ array(array.hpp)
+ atomic(atomic.hpp)
+ ct_conversions(ct_conversions.hpp)
+ array ~~~ compiler
+ atomic ~~~ compiler
+ ct_conversions --> compiler
+ priority(priority.hpp)
+ numeric(numeric.hpp)
+ priority ~~~ compiler
+ numeric ~~~ compiler
+
+ %% level 2
+ type_traits(type_traits.hpp)
+ type_traits --> ct_conversions
+
+ %% level 3
+ memory(memory.hpp)
+ memory --> type_traits
+ iterator(iterator.hpp)
+ iterator --> type_traits
+ concepts(concepts.hpp)
+ concepts --> type_traits
+ udls(udls.hpp)
+ udls --> type_traits
+ function_traits(function_traits.hpp)
+ function_traits --> type_traits
+
+ %% level 4
+ cx_vector(cx_vector.hpp)
+ cx_vector --> iterator
+ cx_vector --> concepts
+ rollover(rollover.hpp)
+ rollover --> concepts
+ utility(utility.hpp)
+ utility --> concepts
+ utility --> udls
+
+ %% level 5
+ cx_map(cx_map.hpp)
+ cx_map ---> iterator
+ cx_map --> utility
+ bit(bit.hpp)
+ bit --> utility
+ ct_string(ct_string.hpp)
+ ct_string --> utility
+ tuple(tuple.hpp)
+ tuple --> utility
+
+ %% level 6
+ span(span.hpp)
+ span ----> memory
+ span ----> iterator
+ span --> bit
+ byterator(byterator.hpp)
+ byterator ----> memory
+ byterator --> bit
+ cx_set(cx_set.hpp)
+ cx_set ---> cx_map
+ bitset(bitset.hpp)
+ bitset --> bit
+ bitset --> ct_string
+ panic(panic.hpp)
+ panic --> ct_string
+ A(env.hpp
static_assert.hpp)
+ A --> ct_string
+ tuple_algorithms(tuple_algorithms.hpp)
+ tuple_algorithms --> tuple
+ functional(functional.hpp)
+ functional --> tuple
+ C(algorithm.hpp
tuple_destructure.hpp)
+ C --> tuple
+ for_each_n_args(for_each_n_args.hpp)
+ for_each_n_args ----> function_traits
+ for_each_n_args --> tuple
+
+ %% level 7
+ cx_multimap(cx_multimap.hpp)
+ cx_multimap --> cx_set
+ cx_queue(cx_queue.hpp)
+ cx_queue ----> iterator
+ cx_queue --> panic
+ atomic_bitset(atomic_bitset.hpp)
+ atomic_bitset ---> bitset
+ B(intrusive_forward_list.hpp
intrusive_list.hpp)
+ B --> panic
+ ct_format(ct_format.hpp)
+ pp_map(pp_map.hpp)
+ ranges(ranges.hpp)
+ ct_format ----> ct_string
+ ct_format ---> tuple_algorithms
+ ct_format --> pp_map
+ ct_format --> ranges
+ call_by_need(call_by_need.hpp)
+ call_by_need --> tuple_algorithms
+ latched(latched.hpp)
+ latched --> functional
+ optional(optional.hpp)
+ optional --> functional
+
+ %% level 8
+ cached(cached.hpp)
+ cached --> latched
diff --git a/docs/intro.adoc b/docs/intro.adoc
index 68cd3e4..1a3764e 100644
--- a/docs/intro.adoc
+++ b/docs/intro.adoc
@@ -104,3 +104,10 @@ The following headers are available:
* https://github.com/intel/cpp-std-extensions/blob/main/include/stdx/type_traits.hpp[`type_traits.hpp`]
* https://github.com/intel/cpp-std-extensions/blob/main/include/stdx/udls.hpp[`udls.hpp`]
* https://github.com/intel/cpp-std-extensions/blob/main/include/stdx/utility.hpp[`utility.hpp`]
+
+
+=== Header Graph
+
+mermaid::header_graph.mmd[format="svg" config="mermaid.conf"]
+
+(The rendering makes this small. Either right-click and open in new tab, or https://github.com/intel/cpp-std-extensions/blob/main/docs/header_graph.mmd[view the file on GitHub].)