'
+ echo '
'
+ # shellcheck disable=SC2086 # We actually want word splitting, here
+ COLUMNS=$OUTPUT_WIDTH_COLUMMNS rich-click --output html $cmd --help
+ echo '
'
+ echo '
'
+ echo ''
+ } > "$FILENAME"
+done
diff --git a/docs/source/_img/diagrams b/docs/source/_img/diagrams
new file mode 120000
index 0000000..dd2b380
--- /dev/null
+++ b/docs/source/_img/diagrams
@@ -0,0 +1 @@
+../../../diagrams
\ No newline at end of file
diff --git a/docs/source/_img/src/boardwalkd/static/boardwalk_icon.jpg b/docs/source/_img/src/boardwalkd/static/boardwalk_icon.jpg
new file mode 120000
index 0000000..80a4bb8
--- /dev/null
+++ b/docs/source/_img/src/boardwalkd/static/boardwalk_icon.jpg
@@ -0,0 +1 @@
+../../../../../../src/boardwalkd/static/boardwalk_icon.jpg
\ No newline at end of file
diff --git a/docs/source/_static/custom.css b/docs/source/_static/custom.css
new file mode 100644
index 0000000..4ae01bb
--- /dev/null
+++ b/docs/source/_static/custom.css
@@ -0,0 +1,3 @@
+div#boardwalk-readme-icon {
+ max-width: 200px;
+}
\ No newline at end of file
diff --git a/docs/source/_templates/.gitkeep b/docs/source/_templates/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/docs/source/cli_helpdocs/boardwalk/index.md b/docs/source/cli_helpdocs/boardwalk/index.md
new file mode 100644
index 0000000..dbb054c
--- /dev/null
+++ b/docs/source/cli_helpdocs/boardwalk/index.md
@@ -0,0 +1,26 @@
+
+
+# `boardwalk`
+
+This section contains auto-generated CLI manual pages for `boardwalk`.
+
+```{toctree}
+:titlesonly:
+
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_catch.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_check.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_init.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_login.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_release.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_run.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_version.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_workspace.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_workspace_dump.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_workspace_list.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_workspace_reset.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_workspace_show.md
+../../_autogenerated/cli_helpdocs/boardwalk/boardwalk_workspace_use.md
+```
diff --git a/docs/source/cli_helpdocs/boardwalkd/index.md b/docs/source/cli_helpdocs/boardwalkd/index.md
new file mode 100644
index 0000000..a8a92dc
--- /dev/null
+++ b/docs/source/cli_helpdocs/boardwalkd/index.md
@@ -0,0 +1,15 @@
+
+
+# `boardwalkd`
+
+This section contains auto-generated CLI manual pages for `boardwalkd`.
+
+```{toctree}
+:titlesonly:
+
+../../_autogenerated/cli_helpdocs/boardwalkd/boardwalkd.md
+../../_autogenerated/cli_helpdocs/boardwalkd/boardwalkd_serve.md
+../../_autogenerated/cli_helpdocs/boardwalkd/boardwalkd_version.md
+```
diff --git a/docs/source/cli_helpdocs/index.md b/docs/source/cli_helpdocs/index.md
new file mode 100644
index 0000000..5fbdbc4
--- /dev/null
+++ b/docs/source/cli_helpdocs/index.md
@@ -0,0 +1,16 @@
+
+
+# Command-line help reference
+
+This section contains auto-generated CLI manual pages.[^1]
+
+```{toctree}
+:titlesonly:
+
+boardwalk/index.md
+boardwalkd/index.md
+```
+
+[^1]: Auto-generated via the script at `docs/build_cli_help_pages.sh`.
diff --git a/docs/source/conf.py b/docs/source/conf.py
new file mode 100644
index 0000000..df9d505
--- /dev/null
+++ b/docs/source/conf.py
@@ -0,0 +1,150 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+import subprocess
+from datetime import UTC, datetime
+from importlib.metadata import version as lib_version
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = "Boardwalk"
+copyright = f"{datetime.now(tz=UTC).year}, Backblaze"
+author = "Backblaze"
+VERSION: str = lib_version("boardwalk")
+release = f"v{VERSION}"
+version = VERSION
+
+# -- Helper functions -----------------------------------------------------
+
+
+def get_git_revision_short_hash() -> str:
+ return subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).decode("ascii").strip()
+
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+extensions = [
+ "sphinx.ext.duration",
+ "sphinx.ext.intersphinx",
+ "sphinx.ext.doctest",
+ "sphinx.ext.autosummary",
+ "sphinx.ext.napoleon",
+ "autodoc2",
+ "myst_parser",
+ "sphinx_copybutton",
+]
+
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
+
+nitpicky = True
+nitpick_ignore = [
+ # I think these are just by virtue of the fact we have these behind an `if TYPE_CHECKING:` line? Need to (eventually) figure these out.
+ ("py:class", "boardwalk.ansible.AnsibleFacts"),
+ ("py:class", "boardwalk.ansible.AnsibleTasksType"),
+ ("py:class", "boardwalk.ansible.InventoryData"),
+ ("py:class", "boardwalk.ansible.InventoryHostVars"),
+ ("py:class", "boardwalk.ansible.HostVarsType"),
+]
+nitpick_ignore_regex = [
+ # Ignore the reference; the (myst-syntax)= for an explicit link works, but that's not supported
+ # by GFM, so it would be rendered in the markdown; so just silence the warning.
+ ("myst", "the-boardwalkfilepy"),
+ # slack_sdk and slack_bolt don't use Sphinx
+ ("py:class", "slack_bolt.*"),
+ ("py:class", "slack_sdk.*"),
+ # Neither does pydantic
+ ("py:class", "pydantic.*"),
+ ("py:obj", "pydantic.*"),
+ # TODO: Pretty sure we need to update some type references, here; ignoring these for now
+ ("py:class", "ansible_runner.*"),
+]
+
+suppress_warnings = [
+ # Can Sphinx have a more granular suppression than just ignore _everything_?
+ "image.not_readable",
+]
+
+templates_path = ["_templates"]
+
+intersphinx_mapping = {
+ "python": ("https://docs.python.org/3/", None),
+ "tornado": ("https://www.tornadoweb.org/en/stable/", None),
+ "click": ("https://click.palletsprojects.com/en/stable/", None),
+ "ansible_runner": ("https://ansible.readthedocs.io/projects/runner/en/latest/", None),
+}
+
+# -- sphinx-autodoc2 configuration ---------------------------------------------------
+# https://sphinx-autodoc2.readthedocs.io/en/stable/config.html
+
+autodoc2_index_template = """Auto-generated API
+==================
+
+This section contains auto-generated API reference documentation [#f1]_.
+
+.. toctree::
+ :titlesonly:
+{% for package in top_level %}
+ {{ package }}
+{%- endfor %}
+
+.. [#f1] Created with `sphinx-autodoc2