@endhtmlonly"
+
+# common predefined
+PREDEFINED = DOXYGEN
+PREDEFINED += __APPLE__
+PREDEFINED += linux
+PREDEFINED += __linux
+PREDEFINED += __linux__
+PREDEFINED += __MACH__
+PREDEFINED += _WIN32
+
+# general settings
+CASE_SENSE_NAMES = YES
+CREATE_SUBDIRS = NO
+DISABLE_INDEX = NO
+DOCBOOK_OUTPUT = docbook
+DOT_IMAGE_FORMAT = svg
+DOT_NUM_THREADS = 1
+EXTRACT_ALL = NO
+FULL_SIDEBAR = NO
+GENERATE_HTML = YES
+GENERATE_LATEX = NO
+GENERATE_TREEVIEW = YES
+GENERATE_XML = NO
+HAVE_DOT = YES
+HTML_OUTPUT = html
+INTERACTIVE_SVG = YES
+LATEX_OUTPUT = latex
+MACRO_EXPANSION = YES
+MAN_OUTPUT = man
+MARKDOWN_ID_STYLE = GITHUB
+MARKDOWN_SUPPORT = YES
+NUM_PROC_THREADS = 1
+PROJECT_NUMBER = $(READTHEDOCS_VERSION)
+OUTPUT_DIRECTORY = $(READTHEDOCS_OUTPUT)
+RECURSIVE = YES
+RTF_OUTPUT = rtf
+SORT_BRIEF_DOCS = YES
+STRIP_FROM_INC_PATH = ../
+STRIP_FROM_PATH = ../
+WARN_AS_ERROR = FAIL_ON_WARNINGS
+WARN_IF_DOC_ERROR = YES
+WARN_IF_INCOMPLETE_DOC = YES
+WARN_IF_UNDOC_ENUM_VAL = YES
+WARN_NO_PARAMDOC = YES
+WARNINGS = YES
+XML_OUTPUT = xml
+
+# append the project specific settings here
diff --git a/README.md b/README.md
index fd3e658..9fff642 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,29 @@
-# template-base
-Base repository template for LizardByte.
+# doxyconfig
+
+This is a common Doxygen config for LizardByte projects.
+
+## Usage
+
+1. Add this repository as a submodule to your project.
+
+ ```bash
+ git submodule add https://github.com/LizardByte/doxyconfig.git third-party/doxyconfig
+ ```
+
+2. Place project specific Doxyfile config in `./docs/Doxyfile`. You can overwrite anything from the common config here.
+3. Add the following to your CMakeLists.txt file.
+
+ ```cmake
+ option(BUILD_DOCS "Build documentation" ON)
+ if(BUILD_DOCS)
+ add_subdirectory(third-party/doxyconfig docs)
+ endif()
+ ```
+
+4. Optionally, add the following to the input list in your Doxyfile.
+
+ ```doxyfile
+ INPUT += ../third-party/doxyconfig/docs/source_code.md
+ ```
+
+5. Optionally, copy the `.readthedocs.yaml` file to the root of your project.
diff --git a/docs/source_code.md b/docs/source_code.md
new file mode 100644
index 0000000..01f5156
--- /dev/null
+++ b/docs/source_code.md
@@ -0,0 +1,156 @@
+# Source Code
+
+Code should be documented using Doxygen syntax.
+
+## Guidelines
+
+### Doxygen Comments
+
+* Use Doxygen comments to document all files, functions, classes, and variables.
+* [Inline documenation block](#inline-documentation-blocks) should use the following format:
+
+ @verbatim
+///< A brief description of the member.
+@endverbatim
+
+* Multi-line comments, such as for a [documentation block](#documentation-blocks), should use the following format:
+
+ @verbatim
+/**
+* @brief A brief description of the member.
+* More detailed description of the member.
+*/
+@endverbatim
+
+### Documentation Blocks
+
+Documentation blocks should be placed above the declaration of the function, class, or variable. Below is an example
+of a documentation block for the main function.
+
+@verbatim
+/**
+ * @brief Main application entry point.
+ * @param argc The number of arguments.
+ * @param argv The arguments.
+ * @return The exit code.
+ * @examples
+ * main(1, const char* args[] = {"hello", "markdown", nullptr});
+ * @examples_end
+ */
+int main(int argc, char *argv[]);
+@endverbatim
+
+@note The \@examples and \@examples_end tags are not standard Doxygen tags. They are custom aliases
+we have specified to simplify documenting examples. Do not confuse this with the standard \@example tag.
+
+In some cases, it could be valuable to have slightly different documentation for the definitions, especially when
+the definition may change depending on the platform or other factors. In such cases, you should put the documentation
+that is common in the declaration and the definition-specific documentation in the definition. Below is an example of
+how to document the declaration and definition of a function.
+
+@verbatim
+// myFile.h
+/**
+ * @brief A brief description of the function.
+ * @param arg1 Describe the first argument.
+ * @param arg2 Describe the second argument.
+ * @return Describe the result.
+ */
+int myFunction(int arg1, int arg2);
+
+// myFile.cpp
+/**
+ * This describes anything which is specific to the implementation of the function.
+ */
+int myFunction(int arg1, int arg2)
+{
+ // Implementation
+}
+@endverbatim
+
+### File Documentation
+
+The file documentation block must be placed at the top of the file. If it is not present, Doxygen will ignore the file.
+Understandably, it is difficult to make a creative description for every file, although it is still required.
+Below is an example of a file documentation block.
+
+@verbatim
+/**
+ * @file src/main.cpp
+ * @brief Main application entry point.
+ */
+@endverbatim
+
+### Inline Documentation Blocks
+
+Inline comments can be used to describe enum values, variables, and other code constructs.
+To document the members of a file, struct, union, class, or enum, it is sometimes desired to place the documentation
+block after the member instead of before. For this purpose you have to put an additional `<` marker in the comment
+block. Below is an example of an inline comment for an enum value.
+
+@verbatim
+enum class MyEnum
+{
+ FIRST_VALUE, ///< A brief description of the FIRST_VALUE
+ SECOND_VALUE ///< A brief description of the SECOND_VALUE
+};
+@endverbatim
+
+### Custom Aliases
+
+We have defined some custom aliases to simplify documenting examples.
+
+* \@examples - Start of an example block. This will format the following text as `cpp`.
+* \@examples_end - End of an example block.
+* \@fa_icon{font awsome definition} - Insert a Font Awesome icon. Give the icon style and name as arguments.
+ e.g. \@fa_icon{fa-solid fa-check}.
+* Admonitions
+ * \@admonition{Custom Title | Content }
+ @admonition{The one with the custom titles | It’s got a certain charm to it.}
+ * \@attention{Content}
+ @attention{The sun causes global warming.}
+ * \@caution{Content}
+ @caution{Cliff ahead: Don’t drive off it.}
+ * \@danger{Content}
+ @danger{Mad scientist at work!}
+ * \@error{Content}
+ @error{Does not compute.}
+ * \@hint{Content}
+ @hint{Insulators insulate, until they are subject to ______ voltage.}
+ * \@important{Content}
+ @important{Tech is not neutral, nor is it apolitical.}
+ * \@note{Content}
+ @note{This is a note.}
+ * \@seealso{Content}
+ @seealso{Other relevant information.}
+ * \@tip{Content}
+ @tip{25% if the service is good.}
+ * \@todo{Content}
+ @todo{Fix this.}
+ * \@warning{Content}
+ @warning{Reader discretion is strongly advised.}
+* Tabs
+ @verbatim
+@tabs{
+ @tab{ Tab 1 Title | Tab 1 Content }
+ @tab{ Tab 2 Title | Tab 2 Content }
+}
+@endverbatim
+ @tabs{
+ @tab{ Tab 1 Title | Tab 1 Content }
+ @tab{ Tab 2 Title | Tab 2 Content }
+ }
+* Markers
+ * \@red{Content}
+ @red{This is red.}
+ * \@blue{Content}
+ @blue{This is blue.}
+ * \@green{Content}
+ @green{This is green.}
+ * \@yellow{Content}
+ @yellow{This is yellow.}
+* Expander
+ @verbatim
+@expander{Expander Title | Expander Content}
+@endverbatim
+ @expander{Expander Title | Expander Content}
diff --git a/doxygen-awesome-css b/doxygen-awesome-css
new file mode 160000
index 0000000..40e9b25
--- /dev/null
+++ b/doxygen-awesome-css
@@ -0,0 +1 @@
+Subproject commit 40e9b25b6174dd3b472d8868f63323a870dfeeb8
diff --git a/environment.yml b/environment.yml
new file mode 100644
index 0000000..bdf9e46
--- /dev/null
+++ b/environment.yml
@@ -0,0 +1,9 @@
+---
+name: RTD
+channels:
+ - conda-forge
+ - defaults
+dependencies:
+ - doxygen=1.10.0
+ - graphviz=11.0.0
+ - nodejs
diff --git a/header.html b/header.html
new file mode 100644
index 0000000..ee48c59
--- /dev/null
+++ b/header.html
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+$projectname: $title
+$title
+
+
+
+
+
+
+
+
+
+$treeview
+$search
+$mathjax
+$darkmode
+
+$extrastylesheet
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+