diff --git a/docs/web/.gitignore b/docs/web/.gitignore
deleted file mode 100644
index 70a59f6b2..000000000
--- a/docs/web/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.doit.db.dat
-.doit.db.dir
-cache/
-output/
-pages/
-themes/
diff --git a/docs/web/conf.py b/docs/web/conf.py
deleted file mode 100644
index a6df74be8..000000000
--- a/docs/web/conf.py
+++ /dev/null
@@ -1,1329 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import time
-
-# !! This is the configuration of Nikola. !! #
-# !! You should edit it to your liking. !! #
-
-
-# ! Some settings can be different in different languages.
-# ! A comment stating (translatable) is used to denote those.
-# ! There are two ways to specify a translatable setting:
-# ! (a) BLOG_TITLE = "My Blog"
-# ! (b) BLOG_TITLE = {"en": "My Blog", "es": "Mi Blog"}
-# ! Option (a) is used when you don't want that setting translated.
-# ! Option (b) is used for settings that are different in different languages.
-
-
-# Data about this site
-BLOG_AUTHOR = "Seth Grover" # (translatable)
-BLOG_TITLE = "Malcolm" # (translatable)
-# This is the main URL for your site. It will be used
-# in a prominent link. Don't forget the protocol (http/https)!
-SITE_URL = "https://malcolm.fyi/"
-# This is the URL where Nikola's output will be deployed.
-# If not set, defaults to SITE_URL
-# BASE_URL = "https://malcolm.fyi/"
-BLOG_EMAIL = "malcolm.netsec@gmail.com"
-BLOG_DESCRIPTION = "Malcolm is a powerful, easily deployable network traffic analysis tool suite for full packet capture artifacts (PCAP files) and Zeek logs." # (translatable)
-
-# Nikola is multilingual!
-#
-# Currently supported languages are:
-#
-# en English
-# af Afrikaans
-# ar Arabic
-# az Azerbaijani
-# bg Bulgarian
-# bs Bosnian
-# ca Catalan
-# cs Czech [ALTERNATIVELY cz]
-# da Danish
-# de German
-# el Greek [NOT gr]
-# eo Esperanto
-# es Spanish
-# et Estonian
-# eu Basque
-# fa Persian
-# fi Finnish
-# fr French
-# fur Friulian
-# gl Galician
-# he Hebrew
-# hi Hindi
-# hr Croatian
-# hu Hungarian
-# ia Interlingua
-# id Indonesian
-# it Italian
-# ja Japanese [NOT jp]
-# ko Korean
-# lt Lithuanian
-# ml Malayalam
-# nb Norwegian (Bokmål)
-# nl Dutch
-# pa Punjabi
-# pl Polish
-# pt Portuguese
-# pt_br Portuguese (Brazil)
-# ru Russian
-# sk Slovak
-# sl Slovene
-# sq Albanian
-# sr Serbian (Cyrillic)
-# sr_latin Serbian (Latin)
-# sv Swedish
-# te Telugu
-# th Thai
-# tr Turkish [NOT tr_TR]
-# uk Ukrainian
-# ur Urdu
-# vi Vietnamese
-# zh_cn Chinese (Simplified)
-# zh_tw Chinese (Traditional)
-#
-# If you want to use Nikola with a non-supported language you have to provide
-# a module containing the necessary translations
-# (cf. the modules at nikola/data/themes/base/messages/).
-# If a specific post is not translated to a language, then the version
-# in the default language will be shown instead.
-
-# What is the default language?
-DEFAULT_LANG = "en"
-
-# What other languages do you have?
-# The format is {"translationcode" : "path/to/translation" }
-# the path will be used as a prefix for the generated pages location
-TRANSLATIONS = {
- DEFAULT_LANG: "",
- # Example for another language:
- # "es": "./es",
-}
-
-# What will translated input files be named like?
-
-# If you have a page something.rst, then something.pl.rst will be considered
-# its Polish translation.
-# (in the above example: path == "something", ext == "rst", lang == "pl")
-# this pattern is also used for metadata:
-# something.meta -> something.pl.meta
-
-TRANSLATIONS_PATTERN = '{path}.{lang}.{ext}'
-
-# Links for the sidebar / navigation bar. (translatable)
-# This is a dict. The keys are languages, and values are tuples.
-#
-# For regular links:
-# ('https://getnikola.com/', 'Nikola Homepage')
-#
-# For submenus:
-# (
-# (
-# ('https://apple.com/', 'Apple'),
-# ('https://orange.com/', 'Orange'),
-# ),
-# 'Fruits'
-# )
-#
-# WARNING: Support for submenus is theme-dependent.
-# Only one level of submenus is supported.
-# WARNING: Some themes, including the default Bootstrap 4 theme,
-# may present issues if the menu is too large.
-# (in Bootstrap, the navbar can grow too large and cover contents.)
-# WARNING: If you link to directories, make sure to follow
-# ``STRIP_INDEXES``. If it’s set to ``True``, end your links
-# with a ``/``, otherwise end them with ``/index.html`` — or
-# else they won’t be highlighted when active.
-
-NAVIGATION_LINKS = {
- DEFAULT_LANG: (
- ("/", "Home"),
- ("/documentation/#QuickStart", "Getting Started"),
- ("/documentation/#Components", "Components"),
- ("/documentation/#Protocols", "Supported Protocols"),
- ("/documentation/", "Documentation"),
- ("/hedgehog/", "Hedgehog Linux"),
- ("/download/", "Downloads"),
- ("/contributions/", "Contributions"),
- ("https://github.com/idaholab/Malcolm", "↪ GitHub"),
- ),
-}
-
-# Alternative navigation links. Works the same way NAVIGATION_LINKS does,
-# although themes may not always support them. (translatable)
-# (Bootstrap 4: right-side of navbar, Bootblog 4: right side of title)
-NAVIGATION_ALT_LINKS = {DEFAULT_LANG: ()}
-
-# Name of the theme to use.
-THEME = "hyde"
-
-# Primary color of your theme. This will be used to customize your theme.
-# Must be a HEX value.
-THEME_COLOR = '#5670d4'
-
-# POSTS and PAGES contains (wildcard, destination, template) tuples.
-# (translatable)
-#
-# The wildcard is used to generate a list of source files
-# (whatever/thing.rst, for example).
-#
-# That fragment could have an associated metadata file (whatever/thing.meta),
-# and optionally translated files (example for Spanish, with code "es"):
-# whatever/thing.es.rst and whatever/thing.es.meta
-#
-# This assumes you use the default TRANSLATIONS_PATTERN.
-#
-# From those files, a set of HTML fragment files will be generated:
-# cache/whatever/thing.html (and maybe cache/whatever/thing.html.es)
-#
-# These files are combined with the template to produce rendered
-# pages, which will be placed at
-# output/TRANSLATIONS[lang]/destination/pagename.html
-#
-# where "pagename" is the "slug" specified in the metadata file.
-# The page might also be placed in /destination/pagename/index.html
-# if PRETTY_URLS are enabled.
-#
-# The difference between POSTS and PAGES is that POSTS are added
-# to feeds, indexes, tag lists and archives and are considered part
-# of a blog, while PAGES are just independent HTML pages.
-#
-# Finally, note that destination can be translated, i.e. you can
-# specify a different translation folder per language. Example:
-# PAGES = (
-# ("pages/*.rst", {"en": "pages", "de": "seiten"}, "page.tmpl"),
-# ("pages/*.md", {"en": "pages", "de": "seiten"}, "page.tmpl"),
-# )
-
-POSTS = ()
-PAGES = (
- ("pages/*.rst", "", "page.tmpl"),
- ("pages/*.md", "", "page.tmpl"),
- ("pages/*.txt", "", "page.tmpl"),
- ("pages/*.html", "", "page.tmpl"),
-)
-
-
-# Below this point, everything is optional
-
-# Post's dates are considered in UTC by default, if you want to use
-# another time zone, please set TIMEZONE to match. Check the available
-# list from Wikipedia:
-# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
-# (e.g. 'Europe/Zurich')
-# Also, if you want to use a different time zone in some of your posts,
-# you can use the ISO 8601/RFC 3339 format (ex. 2012-03-30T23:00:00+02:00)
-TIMEZONE = "America/Denver"
-
-# If you want to use ISO 8601 (also valid RFC 3339) throughout Nikola
-# (especially in new_post), set this to True.
-# Note that this does not affect DATE_FORMAT.
-# FORCE_ISO8601 = False
-
-# Date format used to display post dates. (translatable)
-# Used by babel.dates, CLDR style: http://cldr.unicode.org/translation/date-time
-# You can also use 'full', 'long', 'medium', or 'short'
-# DATE_FORMAT = 'YYYY-MM-dd HH:mm'
-
-# Date format used to display post dates, if local dates are used. (translatable)
-# Used by moment.js: https://momentjs.com/docs/#/displaying/format/
-# JS_DATE_FORMAT = 'YYYY-MM-DD HH:mm'
-
-# Date fanciness.
-#
-# 0 = using DATE_FORMAT and TIMEZONE
-# 1 = using JS_DATE_FORMAT and local user time (via moment.js)
-# 2 = using a string like “2 days ago”
-#
-# Your theme must support it, Bootstrap already does.
-# DATE_FANCINESS = 0
-
-# Customize the locale/region used for a language.
-# For example, to use British instead of US English: LOCALES = {'en': 'en_GB'}
-# LOCALES = {}
-
-# One or more folders containing files to be copied as-is into the output.
-# The format is a dictionary of {source: relative destination}.
-# Default is:
-# FILES_FOLDERS = {'files': ''}
-# Which means copy 'files' into 'output'
-
-# One or more folders containing code listings to be processed and published on
-# the site. The format is a dictionary of {source: relative destination}.
-# Default is:
-# LISTINGS_FOLDERS = {'listings': 'listings'}
-# Which means process listings from 'listings' into 'output/listings'
-
-# A mapping of languages to file-extensions that represent that language.
-# Feel free to add or delete extensions to any list, but don't add any new
-# compilers unless you write the interface for it yourself.
-#
-# The default compiler for `new_post` is the first entry in the POSTS tuple.
-#
-# 'rest' is reStructuredText
-# 'markdown' is Markdown
-# 'html' assumes the file is HTML and just copies it
-COMPILERS = {
- "rest": ('.rst', '.txt'),
- "markdown": ('.md', '.mdown', '.markdown'),
- "textile": ('.textile',),
- "txt2tags": ('.t2t',),
- "bbcode": ('.bb',),
- "wiki": ('.wiki',),
- "ipynb": ('.ipynb',),
- "html": ('.html', '.htm'),
- # PHP files are rendered the usual way (i.e. with the full templates).
- # The resulting files have .php extensions, making it possible to run
- # them without reconfiguring your server to recognize them.
- "php": ('.php',),
- # Pandoc detects the input from the source filename
- # but is disabled by default as it would conflict
- # with many of the others.
- # "pandoc": ('.rst', '.md', '.txt'),
-}
-
-# Enable reST directives that insert the contents of external files such
-# as "include" and "raw." This maps directly to the docutils file_insertion_enabled
-# config. See: http://docutils.sourceforge.net/docs/user/config.html#file-insertion-enabled
-# REST_FILE_INSERTION_ENABLED = True
-
-# Create by default posts in one file format?
-# Set to False for two-file posts, with separate metadata.
-# ONE_FILE_POSTS = True
-
-# Preferred metadata format for new posts
-# "Nikola": reST comments, wrapped in a HTML comment if needed (default)
-# "YAML": YAML wrapped in "---"
-# "TOML": TOML wrapped in "+++"
-# "Pelican": Native markdown metadata or reST docinfo fields. Nikola style for other formats.
-# METADATA_FORMAT = "Nikola"
-
-# Use date-based path when creating posts?
-# Can be enabled on a per-post basis with `nikola new_post -d`.
-# The setting is ignored when creating pages.
-# NEW_POST_DATE_PATH = False
-
-# What format to use when creating posts with date paths?
-# Default is '%Y/%m/%d', other possibilities include '%Y' or '%Y/%m'.
-# NEW_POST_DATE_PATH_FORMAT = '%Y/%m/%d'
-
-# If this is set to True, the DEFAULT_LANG version will be displayed for
-# untranslated posts.
-# If this is set to False, then posts that are not translated to a language
-# LANG will not be visible at all in the pages in that language.
-# SHOW_UNTRANSLATED_POSTS = True
-
-# Nikola supports logo display. If you have one, you can put the URL here.
-# Final output is .
-# The URL may be relative to the site root.
-LOGO_URL = 'https://raw.githubusercontent.com/idaholab/Malcolm/main/docs/images/logo/Malcolm_reflection_white.png'
-
-# If you want to hide the title of your website (for example, if your logo
-# already contains the text), set this to False.
-SHOW_BLOG_TITLE = False
-
-# Paths for different autogenerated bits. These are combined with the
-# translation paths.
-
-# Final locations are:
-# output / TRANSLATION[lang] / TAG_PATH / index.html (list of tags)
-# output / TRANSLATION[lang] / TAG_PATH / tag.html (list of posts for a tag)
-# output / TRANSLATION[lang] / TAG_PATH / tag RSS_EXTENSION (RSS feed for a tag)
-# (translatable)
-# TAG_PATH = "categories"
-
-# By default, the list of tags is stored in
-# output / TRANSLATION[lang] / TAG_PATH / index.html
-# (see explanation for TAG_PATH). This location can be changed to
-# output / TRANSLATION[lang] / TAGS_INDEX_PATH
-# with an arbitrary relative path TAGS_INDEX_PATH.
-# (translatable)
-# TAGS_INDEX_PATH = "tags.html"
-
-# If TAG_PAGES_ARE_INDEXES is set to True, each tag's page will contain
-# the posts themselves. If set to False, it will be just a list of links.
-# TAG_PAGES_ARE_INDEXES = False
-
-# Set descriptions for tag pages to make them more interesting. The
-# default is no description. The value is used in the meta description
-# and displayed underneath the tag list or index page’s title.
-# TAG_DESCRIPTIONS = {
-# DEFAULT_LANG: {
-# "blogging": "Meta-blog posts about blogging.",
-# "open source": "My contributions to my many, varied, ever-changing, and eternal libre software projects."
-# },
-# }
-
-# Set special titles for tag pages. The default is "Posts about TAG".
-# TAG_TITLES = {
-# DEFAULT_LANG: {
-# "blogging": "Meta-posts about blogging",
-# "open source": "Posts about open source software"
-# },
-# }
-
-# If you do not want to display a tag publicly, you can mark it as hidden.
-# The tag will not be displayed on the tag list page and posts.
-# Tag pages will still be generated.
-HIDDEN_TAGS = ['mathjax']
-
-# Only include tags on the tag list/overview page if there are at least
-# TAGLIST_MINIMUM_POSTS number of posts or more with every tag. Every tag
-# page is still generated, linked from posts, and included in the sitemap.
-# However, more obscure tags can be hidden from the tag index page.
-# TAGLIST_MINIMUM_POSTS = 1
-
-# A list of dictionaries specifying tags which translate to each other.
-# Format: a list of dicts {language: translation, language2: translation2, …}
-# For example:
-# [
-# {'en': 'private', 'de': 'Privat'},
-# {'en': 'work', 'fr': 'travail', 'de': 'Arbeit'},
-# ]
-# TAG_TRANSLATIONS = []
-
-# If set to True, a tag in a language will be treated as a translation
-# of the literally same tag in all other languages. Enable this if you
-# do not translate tags, for example.
-# TAG_TRANSLATIONS_ADD_DEFAULTS = True
-
-# Final locations are:
-# output / TRANSLATION[lang] / CATEGORY_PATH / index.html (list of categories)
-# output / TRANSLATION[lang] / CATEGORY_PATH / CATEGORY_PREFIX category.html (list of posts for a category)
-# output / TRANSLATION[lang] / CATEGORY_PATH / CATEGORY_PREFIX category RSS_EXTENSION (RSS feed for a category)
-# (translatable)
-# CATEGORY_PATH = "categories"
-# CATEGORY_PREFIX = "cat_"
-
-# By default, the list of categories is stored in
-# output / TRANSLATION[lang] / CATEGORY_PATH / index.html
-# (see explanation for CATEGORY_PATH). This location can be changed to
-# output / TRANSLATION[lang] / CATEGORIES_INDEX_PATH
-# with an arbitrary relative path CATEGORIES_INDEX_PATH.
-# (translatable)
-# CATEGORIES_INDEX_PATH = "categories.html"
-
-# If CATEGORY_ALLOW_HIERARCHIES is set to True, categories can be organized in
-# hierarchies. For a post, the whole path in the hierarchy must be specified,
-# using a forward slash ('/') to separate paths. Use a backslash ('\') to escape
-# a forward slash or a backslash (i.e. '\//\\' is a path specifying the
-# subcategory called '\' of the top-level category called '/').
-CATEGORY_ALLOW_HIERARCHIES = False
-# If CATEGORY_OUTPUT_FLAT_HIERARCHY is set to True, the output written to output
-# contains only the name of the leaf category and not the whole path.
-CATEGORY_OUTPUT_FLAT_HIERARCHY = False
-
-# If CATEGORY_PAGES_ARE_INDEXES is set to True, each category's page will contain
-# the posts themselves. If set to False, it will be just a list of links.
-# CATEGORY_PAGES_ARE_INDEXES = False
-
-# Set descriptions for category pages to make them more interesting. The
-# default is no description. The value is used in the meta description
-# and displayed underneath the category list or index page’s title.
-# CATEGORY_DESCRIPTIONS = {
-# DEFAULT_LANG: {
-# "blogging": "Meta-blog posts about blogging.",
-# "open source": "My contributions to my many, varied, ever-changing, and eternal libre software projects."
-# },
-# }
-
-# Set special titles for category pages. The default is "Posts about CATEGORY".
-# CATEGORY_TITLES = {
-# DEFAULT_LANG: {
-# "blogging": "Meta-posts about blogging",
-# "open source": "Posts about open source software"
-# },
-# }
-
-# If you do not want to display a category publicly, you can mark it as hidden.
-# The category will not be displayed on the category list page.
-# Category pages will still be generated.
-HIDDEN_CATEGORIES = []
-
-# A list of dictionaries specifying categories which translate to each other.
-# Format: a list of dicts {language: translation, language2: translation2, …}
-# See TAG_TRANSLATIONS example above.
-# CATEGORY_TRANSLATIONS = []
-
-# If set to True, a category in a language will be treated as a translation
-# of the literally same category in all other languages. Enable this if you
-# do not translate categories, for example.
-# CATEGORY_TRANSLATIONS_ADD_DEFAULTS = True
-
-# If no category is specified in a post, the destination path of the post
-# can be used in its place. This replaces the sections feature. Using
-# category hierarchies is recommended.
-# CATEGORY_DESTPATH_AS_DEFAULT = False
-
-# If True, the prefix will be trimmed from the category name, eg. if the
-# POSTS destination is "foo/bar", and the path is "foo/bar/baz/quux",
-# the category will be "baz/quux" (or "baz" if only the first directory is considered).
-# Note that prefixes coming from translations are always ignored.
-# CATEGORY_DESTPATH_TRIM_PREFIX = False
-
-# If True, only the first directory of a path will be used.
-# CATEGORY_DESTPATH_FIRST_DIRECTORY_ONLY = True
-
-# Map paths to prettier category names. (translatable)
-# CATEGORY_DESTPATH_NAMES = {
-# DEFAULT_LANG: {
-# 'webdev': 'Web Development',
-# 'webdev/django': 'Web Development/Django',
-# 'random': 'Odds and Ends',
-# },
-# }
-
-# By default, category indexes will appear in CATEGORY_PATH and use
-# CATEGORY_PREFIX. If this is enabled, those settings will be ignored (except
-# for the index) and instead, they will follow destination paths (eg. category
-# 'foo' might appear in 'posts/foo'). If the category does not come from a
-# destpath, first entry in POSTS followed by the category name will be used.
-# For this setting, category hierarchies are required and cannot be flattened.
-# CATEGORY_PAGES_FOLLOW_DESTPATH = False
-
-# If ENABLE_AUTHOR_PAGES is set to True and there is more than one
-# author, author pages are generated.
-# ENABLE_AUTHOR_PAGES = True
-
-# Path to author pages. Final locations are:
-# output / TRANSLATION[lang] / AUTHOR_PATH / index.html (list of authors)
-# output / TRANSLATION[lang] / AUTHOR_PATH / author.html (list of posts by an author)
-# output / TRANSLATION[lang] / AUTHOR_PATH / author RSS_EXTENSION (RSS feed for an author)
-# (translatable)
-# AUTHOR_PATH = "authors"
-
-# If AUTHOR_PAGES_ARE_INDEXES is set to True, each author's page will contain
-# the posts themselves. If set to False, it will be just a list of links.
-# AUTHOR_PAGES_ARE_INDEXES = False
-
-# Set descriptions for author pages to make them more interesting. The
-# default is no description. The value is used in the meta description
-# and displayed underneath the author list or index page’s title.
-# AUTHOR_PAGES_DESCRIPTIONS = {
-# DEFAULT_LANG: {
-# "Juanjo Conti": "Python coder and writer.",
-# "Roberto Alsina": "Nikola father."
-# },
-# }
-
-
-# If you do not want to display an author publicly, you can mark it as hidden.
-# The author will not be displayed on the author list page and posts.
-# Tag pages will still be generated.
-HIDDEN_AUTHORS = ['Guest']
-
-# Final location for the main blog page and sibling paginated pages is
-# output / TRANSLATION[lang] / INDEX_PATH / index-*.html
-# (translatable)
-INDEX_PATH = "blog"
-
-# Optional HTML that displayed on “main” blog index.html files.
-# May be used for a greeting. (translatable)
-FRONT_INDEX_HEADER = {DEFAULT_LANG: ''}
-
-# Create per-month archives instead of per-year
-# CREATE_MONTHLY_ARCHIVE = False
-# Create one large archive instead of per-year
-# CREATE_SINGLE_ARCHIVE = False
-# Create year, month, and day archives each with a (long) list of posts
-# (overrides both CREATE_MONTHLY_ARCHIVE and CREATE_SINGLE_ARCHIVE)
-# CREATE_FULL_ARCHIVES = False
-# If monthly archives or full archives are created, adds also one archive per day
-# CREATE_DAILY_ARCHIVE = False
-# Create previous, up, next navigation links for archives
-# CREATE_ARCHIVE_NAVIGATION = False
-# Final locations for the archives are:
-# output / TRANSLATION[lang] / ARCHIVE_PATH / ARCHIVE_FILENAME
-# output / TRANSLATION[lang] / ARCHIVE_PATH / YEAR / index.html
-# output / TRANSLATION[lang] / ARCHIVE_PATH / YEAR / MONTH / index.html
-# output / TRANSLATION[lang] / ARCHIVE_PATH / YEAR / MONTH / DAY / index.html
-# (translatable)
-# ARCHIVE_PATH = ""
-# ARCHIVE_FILENAME = "archive.html"
-
-# If ARCHIVES_ARE_INDEXES is set to True, each archive page which contains a list
-# of posts will contain the posts themselves. If set to False, it will be just a
-# list of links.
-# ARCHIVES_ARE_INDEXES = False
-
-# URLs to other posts/pages can take 3 forms:
-# rel_path: a relative URL to the current page/post (default)
-# full_path: a URL with the full path from the root
-# absolute: a complete URL (that includes the SITE_URL)
-# URL_TYPE = 'rel_path'
-
-# Extension for RSS feed files
-# RSS_EXTENSION = ".xml"
-
-# RSS filename base (without extension); used for indexes and galleries.
-# (translatable)
-# RSS_FILENAME_BASE = "rss"
-
-# Final location for the blog main RSS feed is:
-# output / TRANSLATION[lang] / RSS_PATH / RSS_FILENAME_BASE RSS_EXTENSION
-# (translatable)
-# RSS_PATH = ""
-
-# Final location for the blog main Atom feed is:
-# output / TRANSLATION[lang] / ATOM_PATH / ATOM_FILENAME_BASE ATOM_EXTENSION
-# (translatable)
-# ATOM_PATH = ""
-
-# Atom filename base (without extension); used for indexes.
-# (translatable)
-ATOM_FILENAME_BASE = "feed"
-
-# Extension for Atom feed files
-# ATOM_EXTENSION = ".atom"
-
-# Slug the Tag URL. Easier for users to type, special characters are
-# often removed or replaced as well.
-# SLUG_TAG_PATH = True
-
-# Slug the Author URL. Easier for users to type, special characters are
-# often removed or replaced as well.
-# SLUG_AUTHOR_PATH = True
-
-# A list of redirection tuples, [("foo/from.html", "/bar/to.html")].
-#
-# A HTML file will be created in output/foo/from.html that redirects
-# to the "/bar/to.html" URL. notice that the "from" side MUST be a
-# relative URL.
-#
-# If you don't need any of these, just set to []
-REDIRECTIONS = []
-
-# Presets of commands to execute to deploy. Can be anything, for
-# example, you may use rsync:
-# "rsync -rav --delete output/ joe@my.site:/srv/www/site"
-# And then do a backup, or run `nikola ping` from the `ping`
-# plugin (`nikola plugin -i ping`). Or run `nikola check -l`.
-# You may also want to use github_deploy (see below).
-# You can define multiple presets and specify them as arguments
-# to `nikola deploy`. If no arguments are specified, a preset
-# named `default` will be executed. You can use as many presets
-# in a `nikola deploy` command as you like.
-# DEPLOY_COMMANDS = {
-# 'default': [
-# "rsync -rav --delete output/ joe@my.site:/srv/www/site",
-# ]
-# }
-
-# github_deploy configuration
-# For more details, read the manual:
-# https://getnikola.com/handbook.html#deploying-to-github
-# You will need to configure the deployment branch on GitHub.
-GITHUB_SOURCE_BRANCH = 'src'
-GITHUB_DEPLOY_BRANCH = 'main'
-
-# The name of the remote where you wish to push to, using github_deploy.
-GITHUB_REMOTE_NAME = 'origin'
-
-# Whether or not github_deploy should commit to the source branch automatically
-# before deploying.
-GITHUB_COMMIT_SOURCE = True
-
-# Where the output site should be located
-# If you don't use an absolute path, it will be considered as relative
-# to the location of conf.py
-# OUTPUT_FOLDER = 'output'
-
-# where the "cache" of partial generated content should be located
-# default: 'cache'
-# CACHE_FOLDER = 'cache'
-
-# Filters to apply to the output.
-# A directory where the keys are either: a file extensions, or
-# a tuple of file extensions.
-#
-# And the value is a list of commands to be applied in order.
-#
-# Each command must be either:
-#
-# A string containing a '%s' which will
-# be replaced with a filename. The command *must* produce output
-# in place.
-#
-# Or:
-#
-# A python callable, which will be called with the filename as
-# argument.
-#
-# By default, only .php files uses filters to inject PHP into
-# Nikola’s templates. All other filters must be enabled through FILTERS.
-#
-# Many filters are shipped with Nikola. A list is available in the manual:
-#
-#
-# from nikola import filters
-# FILTERS = {
-# ".html": [filters.typogrify],
-# ".js": [filters.closure_compiler],
-# ".jpg": ["jpegoptim --strip-all -m75 -v %s"],
-# }
-
-# Executable for the "yui_compressor" filter (defaults to 'yui-compressor').
-# YUI_COMPRESSOR_EXECUTABLE = 'yui-compressor'
-
-# Executable for the "closure_compiler" filter (defaults to 'closure-compiler').
-# CLOSURE_COMPILER_EXECUTABLE = 'closure-compiler'
-
-# Executable for the "optipng" filter (defaults to 'optipng').
-# OPTIPNG_EXECUTABLE = 'optipng'
-
-# Executable for the "jpegoptim" filter (defaults to 'jpegoptim').
-# JPEGOPTIM_EXECUTABLE = 'jpegoptim'
-
-# Executable for the "html_tidy_withconfig", "html_tidy_nowrap",
-# "html_tidy_wrap", "html_tidy_wrap_attr" and "html_tidy_mini" filters
-# (defaults to 'tidy5').
-# HTML_TIDY_EXECUTABLE = 'tidy5'
-
-# List of XPath expressions which should be used for finding headers
-# ({hx} is replaced by headers h1 through h6).
-# You must change this if you use a custom theme that does not use
-# "e-content entry-content" as a class for post and page contents.
-# HEADER_PERMALINKS_XPATH_LIST = ['*//div[@class="e-content entry-content"]//{hx}']
-# Include *every* header (not recommended):
-# HEADER_PERMALINKS_XPATH_LIST = ['*//{hx}']
-
-# File blacklist for header permalinks. Contains output path
-# (eg. 'output/index.html')
-# HEADER_PERMALINKS_FILE_BLACKLIST = []
-
-# Expert setting! Create a gzipped copy of each generated file. Cheap server-
-# side optimization for very high traffic sites or low memory servers.
-# GZIP_FILES = False
-# File extensions that will be compressed
-# GZIP_EXTENSIONS = ('.txt', '.htm', '.html', '.css', '.js', '.json', '.atom', '.xml')
-# Use an external gzip command? None means no.
-# Example: GZIP_COMMAND = "pigz -k {filename}"
-# GZIP_COMMAND = None
-# Make sure the server does not return a "Accept-Ranges: bytes" header for
-# files compressed by this option! OR make sure that a ranged request does not
-# return partial content of another representation for these resources. Do not
-# use this feature if you do not understand what this means.
-
-# #############################################################################
-# Image Gallery Options
-# #############################################################################
-
-# One or more folders containing galleries. The format is a dictionary of
-# {"source": "relative_destination"}, where galleries are looked for in
-# "source/" and the results will be located in
-# "OUTPUT_PATH/relative_destination/gallery_name"
-# Default is:
-# GALLERY_FOLDERS = {"galleries": "galleries"}
-# More gallery options:
-# THUMBNAIL_SIZE = 180
-# MAX_IMAGE_SIZE = 1280
-# USE_FILENAME_AS_TITLE = True
-# EXTRA_IMAGE_EXTENSIONS = []
-#
-# If set to False, it will sort by filename instead. Defaults to True
-# GALLERY_SORT_BY_DATE = True
-
-# If set to True, EXIF data will be copied when an image is thumbnailed or
-# resized. (See also EXIF_WHITELIST)
-# PRESERVE_EXIF_DATA = False
-
-# If you have enabled PRESERVE_EXIF_DATA, this option lets you choose EXIF
-# fields you want to keep in images. (See also PRESERVE_EXIF_DATA)
-#
-# For a full list of field names, please see here:
-# http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf
-#
-# This is a dictionary of lists. Each key in the dictionary is the
-# name of a IDF, and each list item is a field you want to preserve.
-# If you have a IDF with only a '*' item, *EVERY* item in it will be
-# preserved. If you don't want to preserve anything in a IDF, remove it
-# from the setting. By default, no EXIF information is kept.
-# Setting the whitelist to anything other than {} implies
-# PRESERVE_EXIF_DATA is set to True
-# To preserve ALL EXIF data, set EXIF_WHITELIST to {"*": "*"}
-
-# EXIF_WHITELIST = {}
-
-# Some examples of EXIF_WHITELIST settings:
-
-# Basic image information:
-# EXIF_WHITELIST['0th'] = [
-# "Orientation",
-# "XResolution",
-# "YResolution",
-# ]
-
-# If you want to keep GPS data in the images:
-# EXIF_WHITELIST['GPS'] = ["*"]
-
-# Embedded thumbnail information:
-# EXIF_WHITELIST['1st'] = ["*"]
-
-# If set to True, any ICC profile will be copied when an image is thumbnailed or
-# resized.
-# PRESERVE_ICC_PROFILES = False
-
-# Folders containing images to be used in normal posts or pages.
-# IMAGE_FOLDERS is a dictionary of the form {"source": "destination"},
-# where "source" is the folder containing the images to be published, and
-# "destination" is the folder under OUTPUT_PATH containing the images copied
-# to the site. Thumbnail images will be created there as well.
-
-# To reference the images in your posts, include a leading slash in the path.
-# For example, if IMAGE_FOLDERS = {'images': 'images'}, write
-#
-# .. image:: /images/tesla.jpg
-#
-# See the Nikola Handbook for details (in the “Embedding Images” and
-# “Thumbnails” sections)
-
-# Images will be scaled down according to IMAGE_THUMBNAIL_SIZE and MAX_IMAGE_SIZE
-# options, but will have to be referenced manually to be visible on the site
-# (the thumbnail has ``.thumbnail`` added before the file extension by default,
-# but a different naming template can be configured with IMAGE_THUMBNAIL_FORMAT).
-
-IMAGE_FOLDERS = {'images': 'images'}
-# IMAGE_THUMBNAIL_SIZE = 400
-# IMAGE_THUMBNAIL_FORMAT = '{name}.thumbnail{ext}'
-
-# #############################################################################
-# HTML fragments and diverse things that are used by the templates
-# #############################################################################
-
-# Data about post-per-page indexes.
-# INDEXES_PAGES defaults to ' old posts, page %d' or ' page %d' (translated),
-# depending on the value of INDEXES_PAGES_MAIN.
-#
-# (translatable) If the following is empty, defaults to BLOG_TITLE:
-# INDEXES_TITLE = ""
-#
-# (translatable) If the following is empty, defaults to ' [old posts,] page %d' (see above):
-# INDEXES_PAGES = ""
-#
-# If the following is True, INDEXES_PAGES is also displayed on the main (the
-# newest) index page (index.html):
-# INDEXES_PAGES_MAIN = False
-#
-# If the following is True, index-1.html has the oldest posts, index-2.html the
-# second-oldest posts, etc., and index.html has the newest posts. This ensures
-# that all posts on index-x.html will forever stay on that page, now matter how
-# many new posts are added.
-# If False, index-1.html has the second-newest posts, index-2.html the third-newest,
-# and index-n.html the oldest posts. When this is active, old posts can be moved
-# to other index pages when new posts are added.
-# INDEXES_STATIC = True
-#
-# (translatable) If PRETTY_URLS is set to True, this setting will be used to create
-# prettier URLs for index pages, such as page/2/index.html instead of index-2.html.
-# Valid values for this settings are:
-# * False,
-# * a list or tuple, specifying the path to be generated,
-# * a dictionary mapping languages to lists or tuples.
-# Every list or tuple must consist of strings which are used to combine the path;
-# for example:
-# ['page', '{number}', '{index_file}']
-# The replacements
-# {number} --> (logical) page number;
-# {old_number} --> the page number inserted into index-n.html before (zero for
-# the main page);
-# {index_file} --> value of option INDEX_FILE
-# are made.
-# Note that in case INDEXES_PAGES_MAIN is set to True, a redirection will be created
-# for the full URL with the page number of the main page to the normal (shorter) main
-# page URL.
-# INDEXES_PRETTY_PAGE_URL = False
-#
-# If the following is true, a page range navigation will be inserted to indices.
-# Please note that this will undo the effect of INDEXES_STATIC, as all index pages
-# must be recreated whenever the number of pages changes.
-# SHOW_INDEX_PAGE_NAVIGATION = False
-
-# If the following is True, a meta name="generator" tag is added to pages. The
-# generator tag is used to specify the software used to generate the page
-# (it promotes Nikola).
-# META_GENERATOR_TAG = True
-
-# Color scheme to be used for code blocks. If your theme provides
-# "assets/css/code.css" this is ignored. Set to None to disable.
-# Can be any of:
-# algol, algol_nu, autumn, borland, bw, colorful, default, emacs, friendly,
-# fruity, igor, lovelace, manni, monokai, murphy, native, paraiso-dark,
-# paraiso-light, pastie, perldoc, rrt, tango, trac, vim, vs, xcode
-# This list MAY be incomplete since pygments adds styles every now and then.
-# Check with list(pygments.styles.get_all_styles()) in an interpreter.
-#
-# CODE_COLOR_SCHEME = 'default'
-
-# FAVICONS contains (name, file, size) tuples.
-# Used to create favicon link like this:
-#
-# FAVICONS = (
-# ("icon", "/favicon.ico", "16x16"),
-# ("icon", "/icon_128x128.png", "128x128"),
-# )
-
-# Show teasers (instead of full posts) in indexes? Defaults to False.
-# INDEX_TEASERS = False
-
-# HTML fragments with the Read more... links.
-# The following tags exist and are replaced for you:
-# {link} A link to the full post page.
-# {read_more} The string “Read more” in the current language.
-# {reading_time} An estimate of how long it will take to read the post.
-# {remaining_reading_time} An estimate of how long it will take to read the post, sans the teaser.
-# {min_remaining_read} The string “{remaining_reading_time} min remaining to read” in the current language.
-# {paragraph_count} The amount of paragraphs in the post.
-# {remaining_paragraph_count} The amount of paragraphs in the post, sans the teaser.
-# {post_title} The title of the post.
-# {{ A literal { (U+007B LEFT CURLY BRACKET)
-# }} A literal } (U+007D RIGHT CURLY BRACKET)
-
-# 'Read more...' for the index page, if INDEX_TEASERS is True (translatable)
-INDEX_READ_MORE_LINK = '
-#
-#
-# """
-
-# Show link to source for the posts?
-# SHOW_SOURCELINK = True
-# Copy the source files for your pages?
-# Setting it to False implies SHOW_SOURCELINK = False
-# COPY_SOURCES = True
-
-# Modify the number of Post per Index Page
-# Defaults to 10
-# INDEX_DISPLAY_POST_COUNT = 10
-
-# By default, Nikola generates RSS files for the website and for tags, and
-# links to it. Set this to False to disable everything RSS-related.
-GENERATE_RSS = False
-
-# By default, Nikola does not generates Atom files for indexes and links to
-# them. Generate Atom for tags by setting TAG_PAGES_ARE_INDEXES to True.
-# Atom feeds are built based on INDEX_DISPLAY_POST_COUNT and not FEED_LENGTH
-# Switch between plain-text summaries and full HTML content using the
-# FEED_TEASER option. FEED_LINKS_APPEND_QUERY is also respected. Atom feeds
-# are generated even for old indexes and have pagination link relations
-# between each other. Old Atom feeds with no changes are marked as archived.
-GENERATE_ATOM = False
-
-# Only include teasers in Atom and RSS feeds. Disabling include the full
-# content. Defaults to True.
-# FEED_TEASERS = True
-
-# Strip HTML from Atom and RSS feed summaries and content. Defaults to False.
-# FEED_PLAIN = False
-
-# Number of posts in Atom and RSS feeds.
-# FEED_LENGTH = 10
-
-# RSS_LINK is a HTML fragment to link the RSS or Atom feeds. If set to None,
-# the base.tmpl will use the feed Nikola generates. However, you may want to
-# change it for a FeedBurner feed or something else.
-# RSS_LINK = None
-
-# A search form to search this site, for the sidebar. You can use a Google
-# custom search (https://www.google.com/cse/)
-# Or a DuckDuckGo search: https://duckduckgo.com/search_box.html
-# Default is no search form.
-# (translatable)
-# SEARCH_FORM = ""
-#
-# This search form works for any site and looks good in the "site" theme where
-# it appears on the navigation bar:
-#
-# SEARCH_FORM = """
-#
-#
-#
-# """ % SITE_URL
-#
-# If you prefer a Google search form, here's an example that should just work:
-# SEARCH_FORM = """
-#
-#
-#
-# """ % SITE_URL
-
-# Use content distribution networks for jQuery, twitter-bootstrap css and js,
-# and html5shiv (for older versions of Internet Explorer)
-# If this is True, jQuery and html5shiv are served from the Google CDN and
-# Bootstrap is served from BootstrapCDN (provided by MaxCDN)
-# Set this to False if you want to host your site without requiring access to
-# external resources.
-# USE_CDN = False
-
-# Check for USE_CDN compatibility.
-# If you are using custom themes, have configured the CSS properly and are
-# receiving warnings about incompatibility but believe they are incorrect, you
-# can set this to False.
-# USE_CDN_WARNING = True
-
-# Extra things you want in the pages HEAD tag. This will be added right
-# before
-# (translatable)
-# EXTRA_HEAD_DATA = ""
-# Google Analytics or whatever else you use. Added to the bottom of
-# in the default template (base.tmpl).
-# (translatable)
-# BODY_END = ""
-
-# The possibility to extract metadata from the filename by using a
-# regular expression.
-# To make it work you need to name parts of your regular expression.
-# The following names will be used to extract metadata:
-# - title
-# - slug
-# - date
-# - tags
-# - link
-# - description
-#
-# An example re is the following:
-# '.*\/(?P\d{4}-\d{2}-\d{2})-(?P.*)-(?P.*)\.rst'
-# (Note the '.*\/' in the beginning -- matches source paths relative to conf.py)
-# FILE_METADATA_REGEXP = None
-
-# Should titles fetched from file metadata be unslugified (made prettier?)
-# FILE_METADATA_UNSLUGIFY_TITLES = True
-
-# If enabled, extract metadata from docinfo fields in reST documents.
-# If your text files start with a level 1 heading, it will be treated as the
-# document title and will be removed from the text.
-# USE_REST_DOCINFO_METADATA = False
-
-# If enabled, hide docinfo fields in reST document output
-# HIDE_REST_DOCINFO = False
-
-# Map metadata from other formats to Nikola names.
-# Supported formats: yaml, toml, rest_docinfo, markdown_metadata
-# METADATA_MAPPING = {}
-#
-# Example for Pelican compatibility:
-# METADATA_MAPPING = {
-# "rest_docinfo": {"summary": "description", "modified": "updated"},
-# "markdown_metadata": {"summary": "description", "modified": "updated"}
-# }
-# Other examples: https://getnikola.com/handbook.html#mapping-metadata-from-other-formats
-
-# Map metadata between types/values. (Runs after METADATA_MAPPING.)
-# Supported formats: nikola, yaml, toml, rest_docinfo, markdown_metadata
-# The value on the right should be a dict of callables.
-# METADATA_VALUE_MAPPING = {}
-# Examples:
-# METADATA_VALUE_MAPPING = {
-# "yaml": {"keywords": lambda value: ', '.join(value)}, # yaml: 'keywords' list -> str
-# "nikola": {
-# "widgets": lambda value: value.split(', '), # nikola: 'widgets' comma-separated string -> list
-# "tags": str.lower # nikola: force lowercase 'tags' (input would be string)
-# }
-# }
-
-# Additional metadata that is added to a post when creating a new_post
-# ADDITIONAL_METADATA = {}
-
-# Nikola supports Twitter Card summaries, but they are disabled by default.
-# They make it possible for you to attach media to Tweets that link
-# to your content.
-#
-# Uncomment and modify to following lines to match your accounts.
-# Images displayed come from the `previewimage` meta tag.
-# You can specify the card type by using the `card` parameter in TWITTER_CARD.
-# TWITTER_CARD = {
-# # 'use_twitter_cards': True, # enable Twitter Cards
-# # 'card': 'summary', # Card type, you can also use 'summary_large_image',
-# # see https://dev.twitter.com/cards/types
-# # 'site': '@website', # twitter nick for the website
-# # 'creator': '@username', # Username for the content creator / author.
-# }
-
-# Bundle JS and CSS into single files to make site loading faster in a HTTP/1.1
-# environment but is not recommended for HTTP/2.0 when caching is used.
-# Defaults to True.
-# USE_BUNDLES = True
-
-# Plugins you don't want to use. Be careful :-)
-# DISABLED_PLUGINS = ["render_galleries"]
-
-# Special settings to disable only parts of the indexes plugin.
-# Use with care.
-# DISABLE_INDEXES = False
-# DISABLE_MAIN_ATOM_FEED = False
-# DISABLE_MAIN_RSS_FEED = False
-
-# Add the absolute paths to directories containing plugins to use them.
-# For example, the `plugins` directory of your clone of the Nikola plugins
-# repository.
-# EXTRA_PLUGINS_DIRS = []
-
-# Add the absolute paths to directories containing themes to use them.
-# For example, the `v7` directory of your clone of the Nikola themes
-# repository.
-# EXTRA_THEMES_DIRS = []
-
-# List of regular expressions, links matching them will always be considered
-# valid by "nikola check -l"
-# LINK_CHECK_WHITELIST = []
-
-# If set to True, enable optional hyphenation in your posts (requires pyphen)
-# Enabling hyphenation has been shown to break math support in some cases,
-# use with caution.
-# HYPHENATE = False
-
-# The tags in HTML generated by certain compilers (reST/Markdown)
-# will be demoted by that much (1 → h1 will become h2 and so on)
-# This was a hidden feature of the Markdown and reST compilers in the
-# past. Useful especially if your post titles are in
tags too, for
-# example.
-# (defaults to 1.)
-# DEMOTE_HEADERS = 1
-
-# If you don’t like slugified file names ([a-z0-9] and a literal dash),
-# and would prefer to use all the characters your file system allows.
-# USE WITH CARE! This is also not guaranteed to be perfect, and may
-# sometimes crash Nikola, your web server, or eat your cat.
-# USE_SLUGIFY = True
-
-# If set to True, the tags 'draft', 'mathjax' and 'private' have special
-# meaning. If set to False, these tags are handled like regular tags.
-USE_TAG_METADATA = False
-
-# If set to True, a warning is issued if one of the 'draft', 'mathjax'
-# and 'private' tags are found in a post. Useful for checking that
-# migration was successful.
-WARN_ABOUT_TAG_METADATA = False
-
-# Templates will use those filters, along with the defaults.
-# Consult your engine's documentation on filters if you need help defining
-# those.
-# TEMPLATE_FILTERS = {}
-
-# Put in global_context things you want available on all your templates.
-# It can be anything, data, functions, modules, etc.
-GLOBAL_CONTEXT = {}
-
-
-# Add functions here and they will be called with template
-# GLOBAL_CONTEXT as parameter when the template is about to be
-# rendered
-GLOBAL_CONTEXT_FILLER = []
diff --git a/docs/web/github_readme_to_pages.sh b/docs/web/github_readme_to_pages.sh
deleted file mode 100755
index 2721aa74b..000000000
--- a/docs/web/github_readme_to_pages.sh
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/bin/bash
-
-function GenerateMarkdownHeader() {
- TITLE="$1"
- SLUG="$2"
- DATE="$(date +'%Y-%m-%d %H:%M:%S UTC%:z')"
- cat <
-EOF
-}
-
-if [[ -n "$1" ]]; then
- BRANCH="$1"
-else
- BRANCH="main"
-fi
-
-OUTPUT_DIR=./pages
-FINAL_DIR=./output
-
-mkdir -p "$OUTPUT_DIR" "$FINAL_DIR"
-
-# main page
-OUTPUT_FILE="$OUTPUT_DIR"/index.md
-> $OUTPUT_FILE
-GenerateMarkdownHeader " " "index" >> $OUTPUT_FILE
-curl -sSL --silent https://raw.githubusercontent.com/idaholab/Malcolm/$BRANCH/README.md \
- | sed '/name="TableOfContents"/,$d' \
- | sed 's/^# Malcolm$//' \
- | sed "s@\](https://github.com/idaholab/[Mm]alcolm/*)@\](https://malcolm.fyi/)@g" \
- | sed "s@/[Mm]alcolm/blob/main/@/Malcolm/blob/$BRANCH/@g" \
- | sed "s@\](\./@\](https://raw.githubusercontent.com/idaholab/Malcolm/$BRANCH/@g" \
- >> $OUTPUT_FILE
-
-# documentation page
-OUTPUT_FILE="$OUTPUT_DIR"/documentation.md
-> $OUTPUT_FILE
-GenerateMarkdownHeader "Documentation" "documentation" >> $OUTPUT_FILE
-curl -sSL --silent https://raw.githubusercontent.com/idaholab/Malcolm/$BRANCH/README.md \
- | sed '0,/name="TableOfContents"/d' \
- | sed '/## Other Software/,$d' \
- | sed "s@./docs/contributing/README.md@/contributions/@g" \
- | sed "s@./sensor-iso/README.md@/hedgehog/@g" \
- | sed "s@./scripts/third-party-logs/README.md@/thirdpartylogs/@g" \
- | sed "s@\](https://github.com/idaholab/[Mm]alcolm/*)@\](https://malcolm.fyi/)@g" \
- | sed "s@/[Mm]alcolm/blob/main/@/Malcolm/blob/$BRANCH/@g" \
- | sed "s@\](\./@\](https://raw.githubusercontent.com/idaholab/Malcolm/$BRANCH/@g" \
- >> $OUTPUT_FILE
-
-# third-party logs ingestion page
-OUTPUT_FILE="$OUTPUT_DIR"/thirdpartylogs.md
-> $OUTPUT_FILE
-GenerateMarkdownHeader "Forwarding Third-Party Logs to Malcolm" "thirdpartylogs" >> $OUTPUT_FILE
-curl -sSL --silent https://raw.githubusercontent.com/idaholab/Malcolm/$BRANCH/scripts/third-party-logs/README.md \
- | sed "s@../../README.md@/documentation/@g" \
- | sed "s@../../docs/contributing/README.md@/contributions/@g" \
- | sed "s@\](https://github.com/idaholab/[Mm]alcolm/*)@\](https://malcolm.fyi/)@g" \
- | sed "s@/[Mm]alcolm/blob/main/@/Malcolm/blob/$BRANCH/@g" \
- | sed "s@\](\./@\](https://raw.githubusercontent.com/idaholab/Malcolm/$BRANCH/@g" \
- >> $OUTPUT_FILE
-
-# hedgehog Linux page
-OUTPUT_FILE="$OUTPUT_DIR"/hedgehog.md
-> $OUTPUT_FILE
-GenerateMarkdownHeader " " "hedgehog" >> $OUTPUT_FILE
-curl -sSL --silent https://raw.githubusercontent.com/idaholab/Malcolm/$BRANCH/sensor-iso/README.md \
- | sed "s@../README.md@/documentation/@g" \
- | sed "s@\](https://github.com/idaholab/[Mm]alcolm/*)@\](https://malcolm.fyi/)@g" \
- | sed "s@/[Mm]alcolm/blob/main/@/Malcolm/blob/$BRANCH/@g" \
- | sed "s@\](\./@\](https://raw.githubusercontent.com/idaholab/Malcolm/$BRANCH/sensor-iso/@g" \
- >> $OUTPUT_FILE
-
-# contribution Linux page
-OUTPUT_FILE="$OUTPUT_DIR"/contributions.md
-> $OUTPUT_FILE
-GenerateMarkdownHeader "Contributions" "contributions" >> $OUTPUT_FILE
-curl -sSL --silent https://raw.githubusercontent.com/idaholab/Malcolm/$BRANCH/docs/contributing/README.md \
- | sed "s@../../README.md@/documentation/@g" \
- | sed "s@\](https://github.com/idaholab/[Mm]alcolm/*)@\](https://malcolm.fyi/)@g" \
- | sed "s@/[Mm]alcolm/blob/main/@/Malcolm/blob/$BRANCH/@g" \
- | sed "s@\](\./@\](https://raw.githubusercontent.com/idaholab/Malcolm/$BRANCH/docs/contributing/@g" \
- >> $OUTPUT_FILE
-
-# downloads page
-OUTPUT_FILE="$OUTPUT_DIR"/download.md
-> $OUTPUT_FILE
-GenerateMarkdownHeader "Downloads" "download" >> $OUTPUT_FILE
-cat ./download.md >> $OUTPUT_FILE
-
-# build site
-nikola clean -a
-nikola build
-
-# clean up some stuff we don't use
-rm -rf $FINAL_DIR/archive* $FINAL_DIR/blog* $FINAL_DIR/categories* $FINAL_DIR/tags* $FINAL_DIR/rss*
-sed -i -re '//{:a;N;/<\/sitemap>/!ba};/rss\.xml/d' $FINAL_DIR/sitemapindex.xml
-sed -i -re '//{:a;N;/<\/url>/!ba};/(archive\.html|blog|categories)/d' $FINAL_DIR/sitemap.xml
diff --git a/docs/web/requirements.txt b/docs/web/requirements.txt
deleted file mode 100644
index 5b3e05575..000000000
--- a/docs/web/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-Nikola[extras]