Repository: regro/regolith (language: python)

Issue:
copy docs dir files to doc dir
Merge doc dir files with no change in content
use old version of conf.py and index.rst to cover cookiecut generated conf.py and index.rst and set to doc dir


Discussion / hints:

Fix patch:
diff --git a/.coveragerc b/.coveragerc
index 428fa75eb..a4d2293a9 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -1,6 +1,6 @@
 [run]
 source =
-    regolith/
+    src/regolith/
 [report]
 omit =
     */python?.?/*
diff --git a/.flake8 b/.flake8
index 5473b48e7..d58c2a826 100644
--- a/.flake8
+++ b/.flake8
@@ -11,4 +11,4 @@ max-line-length = 115
 # https://black.readthedocs.io/en/stable/guides/using_black_with_other_tools.html#labels-why-pycodestyle-warnings
 extend-ignore = E203
 per-file-ignores =
-    tests/test_helpers.py: E501
+    src/regolith/tests/test_helpers.py: E501
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..936d6ee22
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,1 @@
+regolith/_version.py export-subst
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 000000000..a4661f5c1
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,43 @@
+name: Build Documentation
+
+on:
+  push:
+    branches:
+      - main
+  release:
+
+jobs:
+  test:
+    runs-on: ubuntu-latest
+    defaults:
+      run:
+        shell: bash -l {0}
+    steps:
+      - uses: actions/checkout@v3
+        with:
+          fetch-depth: 0
+
+      - uses: conda-incubator/setup-miniconda@v2
+        with:
+          activate-environment: build
+          auto-update-conda: true
+
+      - name: install requirements
+        run: >-
+          conda install -n build -c conda-forge
+          --file requirements/build.txt
+          --file requirements/run.txt
+          --file requirements/docs.txt
+          --quiet --yes
+
+      - name: install the package
+        run: python -m pip install . --no-deps
+
+      - name: build documents
+        run: make -C doc html
+
+      - name: Deploy
+        uses: peaceiris/actions-gh-pages@v3
+        with:
+          github_token: ${{ secrets.GITHUB_TOKEN }}
+          publish_dir: ./doc/build/html
diff --git a/.github/workflows/python-package.yml b/.github/workflows/main.yml
similarity index 87%
rename from .github/workflows/python-package.yml
rename to .github/workflows/main.yml
index 4a488d826..cefb25c05 100644
--- a/.github/workflows/python-package.yml
+++ b/.github/workflows/main.yml
@@ -4,6 +4,7 @@ on:
   push:
     branches:
       - main
+      - CI
   pull_request:
   workflow_dispatch:
 
@@ -19,9 +20,8 @@ jobs:
         uses: actions/checkout@v3
         with:
           repository: regro/regolith
-          # for bookkeeping have regolith at the same level as everything else in the
-          # directory tree
           path: .
+          fetch-depth: 0  # avoid shallow clone with no tags
 
       - name: initialize miniconda
         # this uses a marketplace action that sets up miniconda in a way that makes
@@ -32,7 +32,7 @@ jobs:
           # environment.yml file is needed by this action.  Because I don't want
           # maintain this but rather maintain the requirements files it just has
           # basic things in it like conda and pip
-          environment-file: environment.yml
+          environment-file: ./environment.yml
           python-version: 3
           auto-activate-base: false
 
@@ -46,11 +46,10 @@ jobs:
           conda install --file requirements/test.txt
           pip install -r requirements/pip.txt
           pip install .
-
-      - name: run tests
+      - name: Validate regolith
         shell: bash -l {0}
         run: |
           conda activate test
-          coverage run run_tests.py
+          coverage run -m pytest -vv -s
           coverage report -m
           codecov
diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml
new file mode 100644
index 000000000..f2ff7e42e
--- /dev/null
+++ b/.github/workflows/pre-commit.yml
@@ -0,0 +1,19 @@
+name: pre-commit
+
+on:
+  pull_request:
+  push:
+  workflow_dispatch:
+
+jobs:
+  pre-commit:
+    # pull requests are a duplicate of a branch push if within the same repo.
+    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository
+
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - uses: actions/setup-python@v4
+      - uses: pre-commit/action@v3.0.0
+        with:
+          extra_args: --all-files
diff --git a/.isort.cfg b/.isort.cfg
new file mode 100644
index 000000000..e0926f425
--- /dev/null
+++ b/.isort.cfg
@@ -0,0 +1,4 @@
+[settings]
+line_length = 115
+multi_line_output = 3
+include_trailing_comma = True
diff --git a/AUTHORS.rst b/AUTHORS.rst
new file mode 100644
index 000000000..3c992f352
--- /dev/null
+++ b/AUTHORS.rst
@@ -0,0 +1,12 @@
+Authors
+=======
+
+Originally written by Anthony Scopatz
+Significant contributions by Christopher "CJ" Wright and Simon J. L. Billinge
+Billinge Group and other community contibutors.
+
+Contributors
+------------
+
+For a full list of contributors, visit
+https://github.com/regro/regolith/graphs/contributors
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 801bcc3b8..45dccaab7 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,6 +1,6 @@
-====================
-Regolith Change Log
-====================
+=============
+Release Notes
+=============
 
 .. current developments
 
diff --git a/CODE_OF_CONDUCT.rst b/CODE_OF_CONDUCT.rst
new file mode 100644
index 000000000..ff9c35614
--- /dev/null
+++ b/CODE_OF_CONDUCT.rst
@@ -0,0 +1,133 @@
+=====================================
+ Contributor Covenant Code of Conduct
+=====================================
+
+Our Pledge
+----------
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, caste, color, religion, or sexual
+identity and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+Our Standards
+-------------
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+  and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the overall
+  community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or advances of
+  any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email address,
+  without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+Enforcement Responsibilities
+----------------------------
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+Scope
+-----
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official email address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+Enforcement
+-----------
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+sb2896@columbia.edu. All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+Enforcement Guidelines
+----------------------
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+1. Correction
+****************
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+2. Warning
+*************
+
+**Community Impact**: A violation through a single incident or series of
+actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or permanent
+ban.
+
+3. Temporary Ban
+******************
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+4. Permanent Ban
+******************
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within the
+community.
+
+Attribution
+-----------
+
+This Code of Conduct is adapted from the `Contributor Covenant <https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>`_.
+
+Community Impact Guidelines were inspired by `Mozilla's code of conduct enforcement ladder <https://github.com/mozilla/inclusion>`_.
+
+For answers to common questions about this code of conduct, see the `FAQ <https://www.contributor-covenant.org/faq>`_. `Translations are available <https://www.contributor-covenant.org/translations>`_
diff --git a/LICENSE.rst b/LICENSE.rst
new file mode 100644
index 000000000..0e287f788
--- /dev/null
+++ b/LICENSE.rst
@@ -0,0 +1,117 @@
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator and
+subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for the
+purpose of contributing to a commons of creative, cultural and scientific
+works ("Commons") that the public can reliably and without fear of later
+claims of infringement build upon, modify, incorporate in other works, reuse
+and redistribute as freely as possible in any form whatsoever and for any
+purposes, including without limitation commercial purposes. These owners may
+contribute to the Commons to promote the ideal of a free culture and the
+further production of creative, cultural and scientific works, or to gain
+reputation or greater distribution for their Work in part through the use and
+efforts of others.
+
+For these and/or other purposes and motivations, and without any expectation
+of additional consideration or compensation, the person associating CC0 with a
+Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
+and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
+and publicly distribute the Work under its terms, with knowledge of his or her
+Copyright and Related Rights in the Work and the meaning and intended legal
+effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not limited
+to, the following:
+
+  i. the right to reproduce, adapt, distribute, perform, display, communicate,
+  and translate a Work;
+
+  ii. moral rights retained by the original author(s) and/or performer(s);
+
+  iii. publicity and privacy rights pertaining to a person's image or likeness
+  depicted in a Work;
+
+  iv. rights protecting against unfair competition in regards to a Work,
+  subject to the limitations in paragraph 4(a), below;
+
+  v. rights protecting the extraction, dissemination, use and reuse of data in
+  a Work;
+
+  vi. database rights (such as those arising under Directive 96/9/EC of the
+  European Parliament and of the Council of 11 March 1996 on the legal
+  protection of databases, and under any national implementation thereof,
+  including any amended or successor version of such directive); and
+
+  vii. other similar, equivalent or corresponding rights throughout the world
+  based on applicable law or treaty, and any national implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention of,
+applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
+unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
+and Related Rights and associated claims and causes of action, whether now
+known or unknown (including existing as well as future claims and causes of
+action), in the Work (i) in all territories worldwide, (ii) for the maximum
+duration provided by applicable law or treaty (including future time
+extensions), (iii) in any current or future medium and for any number of
+copies, and (iv) for any purpose whatsoever, including without limitation
+commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
+the Waiver for the benefit of each member of the public at large and to the
+detriment of Affirmer's heirs and successors, fully intending that such Waiver
+shall not be subject to revocation, rescission, cancellation, termination, or
+any other legal or equitable action to disrupt the quiet enjoyment of the Work
+by the public as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason be
+judged legally invalid or ineffective under applicable law, then the Waiver
+shall be preserved to the maximum extent permitted taking into account
+Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
+is so judged Affirmer hereby grants to each affected person a royalty-free,
+non transferable, non sublicensable, non exclusive, irrevocable and
+unconditional license to exercise Affirmer's Copyright and Related Rights in
+the Work (i) in all territories worldwide, (ii) for the maximum duration
+provided by applicable law or treaty (including future time extensions), (iii)
+in any current or future medium and for any number of copies, and (iv) for any
+purpose whatsoever, including without limitation commercial, advertising or
+promotional purposes (the "License"). The License shall be deemed effective as
+of the date CC0 was applied by Affirmer to the Work. Should any part of the
+License for any reason be judged legally invalid or ineffective under
+applicable law, such partial invalidity or ineffectiveness shall not
+invalidate the remainder of the License, and in such case Affirmer hereby
+affirms that he or she will not (i) exercise any of his or her remaining
+Copyright and Related Rights in the Work or (ii) assert any associated claims
+and causes of action with respect to the Work, in either case contrary to
+Affirmer's express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+  a. No trademark or patent rights held by Affirmer are waived, abandoned,
+  surrendered, licensed or otherwise affected by this document.
+
+  b. Affirmer offers the Work as-is and makes no representations or warranties
+  of any kind concerning the Work, express, implied, statutory or otherwise,
+  including without limitation warranties of title, merchantability, fitness
+  for a particular purpose, non infringement, or the absence of latent or
+  other defects, accuracy, or the present or absence of errors, whether or not
+  discoverable, all to the greatest extent permissible under applicable law.
+
+  c. Affirmer disclaims responsibility for clearing rights of other persons
+  that may apply to the Work or any use thereof, including without limitation
+  any person's Copyright and Related Rights in the Work. Further, Affirmer
+  disclaims responsibility for obtaining any necessary consents, permissions
+  or other rights required for any use of the Work.
+
+  d. Affirmer understands and acknowledges that Creative Commons is not a
+  party to this document and has no duty or obligation with respect to this
+  CC0 or use of the Work.
+
+For more information, please see
+<http://creativecommons.org/publicdomain/zero/1.0/>
+
+----------------------------------
+
+NOTE: ace and jsoneditor in the regolith/static/ dir are covered under their own
+licences.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 000000000..bd3a6600c
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,14 @@
+include AUTHORS.rst
+include LICENSE
+include README.rst
+include requirements.txt
+
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
+
+recursive-include docs *.rst conf.py Makefile make.bat
+
+include regolith/version.py
+
+# If including data files in the package, add them like:
+# include path/to/data_file
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 000000000..ac5036632
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,194 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = build
+BASENAME      = $(subst .,,$(subst $() $(),,regolith))
+
+# User-friendly check for sphinx-build
+ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
+$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
+endif
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  texinfo    to make Texinfo files"
+	@echo "  info       to make Texinfo files and run them through makeinfo"
+	@echo "  gettext    to make PO message catalogs"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  xml        to make Docutils-native XML files"
+	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/$(BASENAME).qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/$(BASENAME).qhc"
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/$(BASENAME)"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/$(BASENAME)"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+latexpdfja:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through platex and dvipdfmx..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+texinfo:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo
+	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+	@echo "Run \`make' in that directory to run these through makeinfo" \
+	      "(use \`make info' here to do that automatically)."
+
+info:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo "Running Texinfo files through makeinfo..."
+	make -C $(BUILDDIR)/texinfo info
+	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+gettext:
+	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+	@echo
+	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
+
+# Manual publishing to the gh-pages branch
+
+GITREPOPATH = $(shell cd $(CURDIR) && git rev-parse --git-dir)
+GITREMOTE = origin
+GITREMOTEURL = $(shell git config --get remote.$(GITREMOTE).url)
+GITLASTCOMMIT = $(shell git rev-parse --short HEAD)
+
+publish:
+	@test -d build/html || \
+	    ( echo >&2 "Run 'make html' first!"; false )
+	git show-ref --verify --quiet refs/heads/gh-pages || \
+	    git branch --track gh-pages $(GITREMOTE)/gh-pages
+	test -d build/gh-pages || \
+	    git clone -s -b gh-pages $(GITREPOPATH) build/gh-pages
+	cd build/gh-pages && \
+	    git pull $(GITREMOTEURL) gh-pages
+	rsync -acv --delete --exclude=.git --exclude=.rsync-exclude \
+	    --exclude-from=build/gh-pages/.rsync-exclude \
+	    --link-dest=$(CURDIR)/build/html build/html/ build/gh-pages/
+	cd build/gh-pages && \
+	    git add --all . && \
+	    git diff --cached --quiet || \
+	    git commit -m "Sync with the source at $(GITLASTCOMMIT)."
+	cd build/gh-pages && \
+	    git push origin gh-pages
diff --git a/doc/make.bat b/doc/make.bat
new file mode 100644
index 000000000..2be830693
--- /dev/null
+++ b/doc/make.bat
@@ -0,0 +1,36 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=source
+set BUILDDIR=build
+set SPHINXPROJ=PackagingScientificPython
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+	echo.
+	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+	echo.installed, then set the SPHINXBUILD environment variable to point
+	echo.to the full path of the 'sphinx-build' executable. Alternatively you
+	echo.may add the Sphinx directory to PATH.
+	echo.
+	echo.If you don't have Sphinx installed, grab it from
+	echo.http://sphinx-doc.org/
+	exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
+
+:end
+popd
diff --git a/docs/Makefile b/doc/source/Makefile
similarity index 100%
rename from docs/Makefile
rename to doc/source/Makefile
diff --git a/regolith/builders/__init__.py b/doc/source/_static/.placeholder
similarity index 100%
rename from regolith/builders/__init__.py
rename to doc/source/_static/.placeholder
diff --git a/docs/_static/regolith-logo-white.png b/doc/source/_static/regolith-logo-white.png
similarity index 100%
rename from docs/_static/regolith-logo-white.png
rename to doc/source/_static/regolith-logo-white.png
diff --git a/docs/_static/regolith-logo-white.svg b/doc/source/_static/regolith-logo-white.svg
similarity index 100%
rename from docs/_static/regolith-logo-white.svg
rename to doc/source/_static/regolith-logo-white.svg
diff --git a/docs/_static/regolith-logo.ico b/doc/source/_static/regolith-logo.ico
similarity index 100%
rename from docs/_static/regolith-logo.ico
rename to doc/source/_static/regolith-logo.ico
diff --git a/docs/_static/regolith-logo.png b/doc/source/_static/regolith-logo.png
similarity index 100%
rename from docs/_static/regolith-logo.png
rename to doc/source/_static/regolith-logo.png
diff --git a/docs/_static/regolith-logo.svg b/doc/source/_static/regolith-logo.svg
similarity index 100%
rename from docs/_static/regolith-logo.svg
rename to doc/source/_static/regolith-logo.svg
diff --git a/docs/_static/rg-dungeon.js b/doc/source/_static/rg-dungeon.js
similarity index 100%
rename from docs/_static/rg-dungeon.js
rename to doc/source/_static/rg-dungeon.js
diff --git a/docs/_static/unicodetiles.css b/doc/source/_static/unicodetiles.css
similarity index 100%
rename from docs/_static/unicodetiles.css
rename to doc/source/_static/unicodetiles.css
diff --git a/docs/_static/unicodetiles.min.js b/doc/source/_static/unicodetiles.min.js
similarity index 100%
rename from docs/_static/unicodetiles.min.js
rename to doc/source/_static/unicodetiles.min.js
diff --git a/docs/_themes/blackcloud/static/blackcloud.css_t b/doc/source/_themes/blackcloud/static/blackcloud.css_t
similarity index 100%
rename from docs/_themes/blackcloud/static/blackcloud.css_t
rename to doc/source/_themes/blackcloud/static/blackcloud.css_t
diff --git a/docs/_themes/blackcloud/theme.conf b/doc/source/_themes/blackcloud/theme.conf
similarity index 100%
rename from docs/_themes/blackcloud/theme.conf
rename to doc/source/_themes/blackcloud/theme.conf
diff --git a/docs/api/app.rst b/doc/source/api/app.rst
similarity index 100%
rename from docs/api/app.rst
rename to doc/source/api/app.rst
diff --git a/docs/api/basebuilder.rst b/doc/source/api/basebuilder.rst
similarity index 100%
rename from docs/api/basebuilder.rst
rename to doc/source/api/basebuilder.rst
diff --git a/docs/api/broker.rst b/doc/source/api/broker.rst
similarity index 100%
rename from docs/api/broker.rst
rename to doc/source/api/broker.rst
diff --git a/docs/api/builder.rst b/doc/source/api/builder.rst
similarity index 100%
rename from docs/api/builder.rst
rename to doc/source/api/builder.rst
diff --git a/docs/api/chained_db.rst b/doc/source/api/chained_db.rst
similarity index 100%
rename from docs/api/chained_db.rst
rename to doc/source/api/chained_db.rst
diff --git a/docs/api/commands.rst b/doc/source/api/commands.rst
similarity index 100%
rename from docs/api/commands.rst
rename to doc/source/api/commands.rst
diff --git a/docs/api/cvbuilder.rst b/doc/source/api/cvbuilder.rst
similarity index 100%
rename from docs/api/cvbuilder.rst
rename to doc/source/api/cvbuilder.rst
diff --git a/docs/api/database.rst b/doc/source/api/database.rst
similarity index 100%
rename from docs/api/database.rst
rename to doc/source/api/database.rst
diff --git a/docs/api/dates.rst b/doc/source/api/dates.rst
similarity index 100%
rename from docs/api/dates.rst
rename to doc/source/api/dates.rst
diff --git a/docs/api/deploy.rst b/doc/source/api/deploy.rst
similarity index 100%
rename from docs/api/deploy.rst
rename to doc/source/api/deploy.rst
diff --git a/docs/api/htmlbuilder.rst b/doc/source/api/htmlbuilder.rst
similarity index 100%
rename from docs/api/htmlbuilder.rst
rename to doc/source/api/htmlbuilder.rst
diff --git a/docs/api/index.rst b/doc/source/api/index.rst
similarity index 100%
rename from docs/api/index.rst
rename to doc/source/api/index.rst
diff --git a/docs/api/interactive.rst b/doc/source/api/interactive.rst
similarity index 100%
rename from docs/api/interactive.rst
rename to doc/source/api/interactive.rst
diff --git a/docs/api/main.rst b/doc/source/api/main.rst
similarity index 100%
rename from docs/api/main.rst
rename to doc/source/api/main.rst
diff --git a/doc/source/api/regolith.example_package.rst b/doc/source/api/regolith.example_package.rst
new file mode 100644
index 000000000..e8fdb885f
--- /dev/null
+++ b/doc/source/api/regolith.example_package.rst
@@ -0,0 +1,31 @@
+.. _example_package documentation:
+
+|title|
+=======
+
+.. |title| replace:: regolith.example_package package
+
+.. automodule:: regolith.example_package
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+|foo|
+-----
+
+.. |foo| replace:: regolith.example_package.foo module
+
+.. automodule::  regolith.example_package.foo
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+|bar|
+-----
+
+.. |bar| replace:: regolith.example_package.bar module
+
+.. automodule:: regolith.example_package.foo
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/source/api/regolith.rst b/doc/source/api/regolith.rst
new file mode 100644
index 000000000..44aceb0e3
--- /dev/null
+++ b/doc/source/api/regolith.rst
@@ -0,0 +1,30 @@
+:tocdepth: -1
+
+|title|
+=======
+
+.. |title| replace:: regolith package
+
+.. automodule:: regolith
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+Subpackages
+-----------
+
+.. toctree::
+   regolith.example_package
+
+Submodules
+----------
+
+|module|
+--------
+
+.. |module| replace:: regolith.example_submodule module
+
+.. automodule:: regolith.example_submodule
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/docs/api/runcontrol.rst b/doc/source/api/runcontrol.rst
similarity index 100%
rename from docs/api/runcontrol.rst
rename to doc/source/api/runcontrol.rst
diff --git a/docs/api/tools.rst b/doc/source/api/tools.rst
similarity index 100%
rename from docs/api/tools.rst
rename to doc/source/api/tools.rst
diff --git a/docs/api/validators.rst b/doc/source/api/validators.rst
similarity index 100%
rename from docs/api/validators.rst
rename to doc/source/api/validators.rst
diff --git a/docs/collections/citations.rst b/doc/source/collections/citations.rst
similarity index 100%
rename from docs/collections/citations.rst
rename to doc/source/collections/citations.rst
diff --git a/docs/collections/courses.rst b/doc/source/collections/courses.rst
similarity index 100%
rename from docs/collections/courses.rst
rename to doc/source/collections/courses.rst
diff --git a/docs/collections/index.rst b/doc/source/collections/index.rst
similarity index 100%
rename from docs/collections/index.rst
rename to doc/source/collections/index.rst
diff --git a/docs/collections/jobs.rst b/doc/source/collections/jobs.rst
similarity index 100%
rename from docs/collections/jobs.rst
rename to doc/source/collections/jobs.rst
diff --git a/docs/collections/news.rst b/doc/source/collections/news.rst
similarity index 100%
rename from docs/collections/news.rst
rename to doc/source/collections/news.rst
diff --git a/docs/commands/fs-to-mongo.rst b/doc/source/commands/fs-to-mongo.rst
similarity index 100%
rename from docs/commands/fs-to-mongo.rst
rename to doc/source/commands/fs-to-mongo.rst
diff --git a/docs/commands/index.rst b/doc/source/commands/index.rst
similarity index 100%
rename from docs/commands/index.rst
rename to doc/source/commands/index.rst
diff --git a/docs/commands/validate.rst b/doc/source/commands/validate.rst
similarity index 100%
rename from docs/commands/validate.rst
rename to doc/source/commands/validate.rst
diff --git a/doc/source/conf.py b/doc/source/conf.py
new file mode 100644
index 000000000..5f7abb709
--- /dev/null
+++ b/doc/source/conf.py
@@ -0,0 +1,424 @@
+# -*- coding: utf-8 -*-
+#
+# xo documentation build configuration file, created by
+# sphinx-quickstart on Sun Jan 27 00:12:33 2013.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import json
+import tempfile
+from collections.abc import MutableMapping
+from subprocess import check_output
+from textwrap import indent
+
+import cloud_sptheme as csp
+
+from regolith import __version__ as REGOLITH_VERSION
+from regolith.fsclient import _id_key, dump_json, json_to_yaml
+from regolith.main import CONNECTED_COMMANDS, DISCONNECTED_COMMANDS
+from regolith.schemas import EXEMPLARS, SCHEMAS
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+# sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+# needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = [
+    "sphinx.ext.autodoc",
+    "sphinx.ext.mathjax",
+    "sphinx.ext.napoleon",
+    "sphinx.ext.viewcode",
+]
+
+napoleon_google_docstring = False
+napoleon_use_param = False
+napoleon_use_ivar = True
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ["_templates"]
+
+# The suffix of source filenames.
+source_suffix = ".rst"
+
+# The encoding of source files.
+# source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = "index"
+
+# General information about the project.
+project = "regolith"
+copyright = "2015, Anthony Scopatz"
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = REGOLITH_VERSION.rsplit(".", 1)[0]
+
+# The full version, including alpha/beta/rc tags.
+release = REGOLITH_VERSION
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+# language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+# today = ''
+# Else, today_fmt is used as the format for a strftime call.
+# today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ["_build"]
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+# default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+# add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+# add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+# show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+# pygments_style = 'sphinx'
+pygments_style = "pastie"
+
+# A list of ignored prefixes for module index sorting.
+# modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = "redcloud"
+# html_theme = 'blackcloud'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+# html_theme_options = {}
+html_theme_options = {"roottarget": "index"}
+
+# Add any paths that contain custom themes here, relative to this directory.
+# html_theme_path = []
+# html_theme_path = [csp.get_theme_dir()]
+html_theme_path = ["_themes", csp.get_theme_dir()]
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+html_title = "regolith - software group content managment system"
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+html_short_title = "regolith"
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+html_logo = "_static/regolith-logo.svg"
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+html_favicon = "_static/regolith-logo.ico"
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ["_static"]
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+# html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+# html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+# html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+# html_additional_pages = {}
+
+# If false, no module index is generated.
+html_domain_indices = False
+
+# If false, no index is generated.
+html_use_index = False
+
+# If true, the index is split into individual pages for each letter.
+html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+html_show_sourcelink = False
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+html_show_sphinx = False
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+# html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+# html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+# html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = "regolithdoc"
+
+# -- Options for LaTeX output --------------------------------------------------
+
+latex_elements = {
+    # The paper size ('letterpaper' or 'a4paper').
+    # 'papersize': 'letterpaper',
+    # The font size ('10pt', '11pt' or '12pt').
+    # 'pointsize': '10pt',
+    # Additional stuff for the LaTeX preamble.
+    # 'preamble': '',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+    (
+        "index",
+        "regolith.tex",
+        "Regolith Documentation",
+        "Anthony Scopatz",
+        "manual",
+    )
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+# latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+# latex_use_parts = False
+
+# If true, show page references after internal links.
+# latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+# latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+# latex_appendices = []
+
+# If false, no module index is generated.
+# latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [("index", "regolith", "regolith docs", ["Anthony Scopatz"], 1)]
+
+# If true, show URL addresses after external links.
+# man_show_urls = False
+
+
+# -- Options for Texinfo output ------------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+    (
+        "index",
+        "regolith",
+        "regolith documentation",
+        "Anthony Scopatz",
+        "regolith",
+        "Research group managment software.",
+        "Miscellaneous",
+    )
+]
+
+
+# Documents to append as an appendix to all manuals.
+# texinfo_appendices = []
+
+# If false, no module index is generated.
+# texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+# texinfo_show_urls = 'footnote'
+
+
+def format_key(schema, key, indent_str=""):
+    s = ""
+    if key == "schema" or key == "required":
+        return s
+    line_format = ":{key}: {type}, {description}, required\n"
+    line_format_o = ":{key}: {type}, {description}, optional\n"
+    if not schema.get("required", False):
+        lf = line_format_o
+    else:
+        lf = line_format
+    if "type" in schema.get(key, {}) or "anyof_type" in schema.get(key, {}):
+        schema = schema[key]
+    if "type" in schema or "anyof_type" in schema:
+        s += indent(
+            lf.format(
+                key=key,
+                description=schema.get("description", ""),
+                type=schema.get("type", schema.get("anyof_type", "")),
+            ),
+            indent_str,
+        )
+    allowed = schema.get("allowed", "") or schema.get("eallowed", "")
+    if allowed:
+        s += indent("\nAllowed values: \n", indent_str + "\t")
+        for allow in allowed:
+            if allow:
+                s += indent("* {}\n".format(allow), indent_str + "\t" * 2)
+            else:
+                s += indent("* ``''``\n", indent_str + "\t" * 2)
+    s = s.replace(", , ", ", ")
+    if schema.get("schema", False):
+        s += "\n"
+    for inner_key in schema.get("schema", ()):
+        s += format_key(schema["schema"], inner_key, indent_str=indent_str + "\t")
+
+    return s
+
+
+def build_schema_doc(key):
+    fn = "collections/" + key + ".rst"
+    with open(fn, "w") as f:
+        s = ""
+        s += key.title() + "\n"
+        s += "=" * len(key) + "\n"
+        s += SCHEMAS[key]["_description"]["description"] + "\n\n"
+        s += "Schema\n------\nThe following lists key names mapped to its " "type and meaning for each entry.\n\n"
+        schema = SCHEMAS[key]
+        schema_list = list(schema.keys())
+        schema_list.sort()
+        for k in schema_list:
+            if k not in ["_description"]:
+                s += format_key(schema[k], key=k)
+        s += "\n\n"
+        s += "YAML Example\n------------\n\n"
+        s += ".. code-block:: yaml\n\n"
+        temp = tempfile.NamedTemporaryFile()
+        temp2 = tempfile.NamedTemporaryFile()
+        documents = EXEMPLARS[key]
+        if isinstance(documents, MutableMapping):
+            documents = [documents]
+        documents = {doc["_id"]: doc for doc in documents}
+        dump_json(temp.name, documents)
+        docs = sorted(documents.values(), key=_id_key)
+        lines = [json.dumps(doc, sort_keys=True, indent=4, separators=(",", ": ")) for doc in docs]
+        jd = "\n".join(lines)
+        json_to_yaml(temp.name, temp2.name)
+        with open(temp2.name, "r") as ff:
+            s += indent(ff.read(), "\t")
+        s += "\n\n"
+        s += "JSON/Mongo Example\n------------------\n\n"
+        s += ".. code-block:: json\n\n"
+        s += indent(jd, "\t")
+        s += "\n"
+        f.write(s)
+
+
+for k in SCHEMAS:
+    build_schema_doc(k)
+
+
+docs_not_in_schemas = ["citations", "courses", "jobs", "news"]
+all_collection_docs = sorted(list(SCHEMAS.keys()) + docs_not_in_schemas)
+
+collections_header = """.. _regolith_collections:
+
+=================
+Collections
+=================
+The following contain the regolith schemas and examples in both YAML and JSON/Mongo.
+
+.. toctree::
+    :maxdepth: 1
+
+"""
+
+collections_header += indent("\n".join(all_collection_docs), "    ")
+
+with open("collections/index.rst", "w") as f:
+    f.write(collections_header)
+
+
+def build_cli_doc(cli):
+    fn = "commands/" + cli + ".rst"
+    out = check_output(["regolith", cli, "-h"]).decode("utf-8")
+    s = "{}\n".format(cli) + "=" * len(cli) + "\n\n"
+    s += ".. code-block:: bash\n\n"
+    s += indent(out, "\t") + "\n"
+    if cli == "validate":
+        s += """Misc
+----
+
+This can also be added as a git hook by adding the following to
+``.git/hooks/pre-commit``
+
+.. code-block:: sh
+
+    #!/bin/sh
+    regolith validate
+
+This can be enabled with ``chmod +x .git/hooks/pre-commit``"""
+    with open(fn, "w") as f:
+        f.write(s)
+
+
+# build CLI docs
+clis = sorted(set(CONNECTED_COMMANDS.keys()) | set(DISCONNECTED_COMMANDS.keys()))
+for cli in clis:
+    build_cli_doc(cli)
+
+cli_index = """.. _commands:
+
+=================
+Regolith Commands
+=================
+Shell commands for regolith
+
+{}
+
+.. toctree::
+    :maxdepth: 1
+
+"""
+cli_index += indent("\n".join(clis), "    ")
+with open("commands/index.rst", "w") as f:
+    out = check_output(["regolith", "-h"]).decode("utf-8")
+    s = ".. code-block:: bash\n\n"
+    s += indent(out, "\t") + "\n"
+    f.write(cli_index.format(s))
diff --git a/docs/database_maintenance/index.rst b/doc/source/database_maintenance/index.rst
similarity index 100%
rename from docs/database_maintenance/index.rst
rename to doc/source/database_maintenance/index.rst
diff --git a/docs/database_maintenance/mongo_maintenance.rst b/doc/source/database_maintenance/mongo_maintenance.rst
similarity index 100%
rename from docs/database_maintenance/mongo_maintenance.rst
rename to doc/source/database_maintenance/mongo_maintenance.rst
diff --git a/docs/developer_notes/dp_regolith_prums_to_mongodb.md b/doc/source/developer_notes/dp_regolith_prums_to_mongodb.md
similarity index 100%
rename from docs/developer_notes/dp_regolith_prums_to_mongodb.md
rename to doc/source/developer_notes/dp_regolith_prums_to_mongodb.md
diff --git a/docs/helper_gui.rst b/doc/source/helper_gui.rst
similarity index 100%
rename from docs/helper_gui.rst
rename to doc/source/helper_gui.rst
diff --git a/docs/helper_gui_images/a_projectum.png b/doc/source/helper_gui_images/a_projectum.png
similarity index 100%
rename from docs/helper_gui_images/a_projectum.png
rename to doc/source/helper_gui_images/a_projectum.png
diff --git a/docs/helper_gui_images/l_members.png b/doc/source/helper_gui_images/l_members.png
similarity index 100%
rename from docs/helper_gui_images/l_members.png
rename to doc/source/helper_gui_images/l_members.png
diff --git a/docs/helper_gui_images/layout.png b/doc/source/helper_gui_images/layout.png
similarity index 100%
rename from docs/helper_gui_images/layout.png
rename to doc/source/helper_gui_images/layout.png
diff --git a/docs/helper_gui_images/u_logurl.png b/doc/source/helper_gui_images/u_logurl.png
similarity index 100%
rename from docs/helper_gui_images/u_logurl.png
rename to doc/source/helper_gui_images/u_logurl.png
diff --git a/docs/helper_gui_images/workflow1.png b/doc/source/helper_gui_images/workflow1.png
similarity index 100%
rename from docs/helper_gui_images/workflow1.png
rename to doc/source/helper_gui_images/workflow1.png
diff --git a/docs/helper_gui_images/workflow10.png b/doc/source/helper_gui_images/workflow10.png
similarity index 100%
rename from docs/helper_gui_images/workflow10.png
rename to doc/source/helper_gui_images/workflow10.png
diff --git a/docs/helper_gui_images/workflow12.png b/doc/source/helper_gui_images/workflow12.png
similarity index 100%
rename from docs/helper_gui_images/workflow12.png
rename to doc/source/helper_gui_images/workflow12.png
diff --git a/docs/helper_gui_images/workflow3.png b/doc/source/helper_gui_images/workflow3.png
similarity index 100%
rename from docs/helper_gui_images/workflow3.png
rename to doc/source/helper_gui_images/workflow3.png
diff --git a/docs/helper_gui_images/workflow6.png b/doc/source/helper_gui_images/workflow6.png
similarity index 100%
rename from docs/helper_gui_images/workflow6.png
rename to doc/source/helper_gui_images/workflow6.png
diff --git a/docs/helper_gui_images/workflow8.png b/doc/source/helper_gui_images/workflow8.png
similarity index 100%
rename from docs/helper_gui_images/workflow8.png
rename to doc/source/helper_gui_images/workflow8.png
diff --git a/doc/source/index.rst b/doc/source/index.rst
new file mode 100644
index 000000000..8dd6b62dd
--- /dev/null
+++ b/doc/source/index.rst
@@ -0,0 +1,721 @@
+.. role:: bash(code)
+   :language: bash
+.. role:: python(code)
+   :language: python
+
+.. raw:: html
+
+    <link href="_static/unicodetiles.css" rel="stylesheet" type="text/css" />
+    <script src="_static/unicodetiles.min.js"></script>
+    <script src="_static/rg-dungeon.js"></script>
+    <div style="text-align:center;">
+        <div id="game"><h1>welcome to the regolith docs</h1></div>
+    </div>
+    <script type="text/javascript">initRgDungeon();</script>
+
+Regolith
+========
+Regolith is a content management system for software & research groups.
+Regolith creates and manages a database of people, publications, projects,
+proposals & grants, courses, and more! From this database, regolith is then
+able to:
+
+* Generate a group website,
+* Generate CVs and publication lists for the group members,
+* Act as a grade book for your courses, and more!
+
+Databases may be file-based (JSON and YAML) or MongoDB-based.
+
+Regolith is developed as a `regro project <https://regro.github.io/>`_
+
+Example Sites
+=============
+The following are some sample websites that are powered by regolith, even though
+building
+websites is just one of the many facets of this tool:
+
+1. `ERGS Home Page <http://www.ergs.sc.edu>`_
+2. `Technical WorkShop on Fuel Cycle Simulation <http://twofcs.ergs.sc.edu>`_
+
+Installation
+============
+1. Make your first database
+----------------------------
+The quickest way to get started is to set up your first minimal database using a
+handy cookie cutter.  These instructions use the command line and assume you know
+how to use the terminal/cmd prompt, and that you know how to install software from
+either Pypi using :bash:`pip` or Anaconda/Miniconda using :bash:`conda`.  The
+instructions use the linux shell commands which should work on Mac and linux
+computers, and on windows if you are running from at Git Bash terminal (recommended)
+but will be slightly different (but still work) on a windows cmd terminal.
+
+First install the cookiecutter package if you don't already have it
+
+.. code-block:: sh
+
+    $ conda install cookiecutter
+
+or
+
+.. code-block:: sh
+
+    $ pip install cookiecutter
+
+Next, clone the GitHub repository with the handy beginning database template
+
+.. code-block:: sh
+
+    $ git clone git@github.com/sbillinge/regolithdb-cookiecutter.git
+
+to get it using SSH or
+
+.. code-block:: sh
+
+    $ git clone https://github.com/sbillinge/regolithdb-cookiecutter.git
+
+to get it using the HTTPS protocol (just use whichever works for you)
+
+Make a note of the path to the resulting :bash:`regolithdb-cookiecutter` directory,
+(e.g., :bash:`/c/Users/me/scratch/regolithdb-cookiecutter` but yours will be different).
+This is not your database, this is just the template and will be removed shortly.
+
+Next, in a new terminal, or in the same terminal, move to the directory where
+you want to install your own permanent database.  For example, we like to
+create a directory off our home directory called :bash:`dbs` where we will keep
+all of our databases (believe me, once you start using Regolith you will want
+to make more and more)
+
+.. code-block:: bash
+
+    $ cd ~        # takes you to your home directory
+    $ mkdir dbs   # creates the dbs directory if it is not already there
+    $ cd dbs      # change dir to the new dbs directory
+
+Now by running cookiecutter your starting db will be built from the template
+
+.. code-block:: bash
+
+    $ cookiecutter <path>/<to>/regolithdb-cookiecutter
+
+The program will ask a series of questions and you can type responses.  Take your
+time and answer the questions as accurately as possible, because you are already
+entering data into your database!
+
+Here is an example, and the questions look like
+
+.. code-block:: bash
+
+    $ cookiecutter ~/scratch/regolithdb-cookiecutter/
+    database_name [my-cv-db]:
+    my_first_name [Albert]: Simon
+    my_last_name [Einstein]: Billinge
+    id_for_me [aeinstein]: sbillinge
+    my_group_name [Einstein Group]: Billinge Group
+
+and so on.  If you just hit enter the cookie-cutter will use the default values
+and you will build a database for Einstein, but type the values you want in
+answer to each question to make your own.
+
+If you make a mistake just type CTL^C
+and do it again.  You may have to remove the directory if it has already been
+created, for example, :bash:`$ rm -r my-cv-db`.  Watch what you type here and
+be careful not to remove something you care about by mistake!
+
+When you are happy with your database setup, type
+
+.. code-block:: bash
+
+    $ ls
+
+which lists all the files in your current directory,
+and you should see a directory called :bash:`my-cv-db` or whatever you chose to
+call you database.  OK, let's go and look at our database.  change directory into it and do a directory
+listing,
+
+.. code-block:: bash
+
+    $ cd my-cv-db
+    $ ls
+
+or open a file
+browser such as windows explorer and check out what is in there.
+
+You will see a direcotry called :bash:`db` and a file called :bash:`regolithrc.json`.
+All of the collections in your database are in the :bash:`db` directory.  The
+:bash:`regolithrc.json` contains a bunch of information that Regolith needs to run and do its business.
+
+You can use the Regolith program to do many things with, and to, your
+database. But you must always run Regolith from a directory that contains a
+:bash:`regolithrc.json` file.  Since you are in a directory that contains one,
+you can run Regolith from here, but first you have to install it....
+
+2. install Regolith
+---------------------
+Regolith packages are available from conda-forge and PyPI:
+
+**conda:**
+
+.. code-block:: sh
+
+    $ conda install -c conda-forge regolith
+
+**pip:**
+
+.. code-block:: sh
+
+    $ pip install regolith
+
+The Regolith code is migrating quickly these days.  If you prefer you can
+install from the GitHub repository mode and get the latest changes.
+In that case, clone the `GitHub repository  <https://github.com/regro/regolith>`_,
+change directory to the top level directory in that cloned repository where the
+:bash:`setup.py` file is.  From inside your virtual environment, type
+
+.. code-block:: sh
+
+    $ pip install regolith -e
+
+which installs regolith in this environment in develop mode.  In this mode, the
+version of Regolith you run will change each time you update from the repo
+leading to instability so be careful.
+
+To check that your installation is working, let's have Regolith make us a
+todo list from our database.
+
+Make sure you are in a directory that
+contains a :bash:`regolithrc.json` file (which you should be, i.e., the
+top level directory of :bash:`~/dbs/my-cv-db`, if you have been
+following these instructions) and type
+
+.. code-block:: sh
+
+    $ regolith helper l_todos
+
+and you should see something like
+
+.. code-block:: sh
+
+    loading .\./db\todos.yml...
+    dumping todos...
+    usage: regolith helper [-h] [-s STATI [STATI ...]] [--short [SHORT]]
+                           [-t TAGS [TAGS ...]] [-a ASSIGNED_TO]
+                           [-b [ASSIGNED_BY]] [--date DATE]
+                           [-f FILTER [FILTER ...]]
+                           helper_target
+
+    positional arguments:
+      helper_target         helper target to run. Currently valid targets are:
+                            ['a_expense', 'a_grppub_readlist', 'a_manurev',
+                            'a_presentation', 'a_projectum', 'a_proposal',
+                            'a_proprev', 'a_todo', 'f_prum', 'f_todo',
+                            'l_abstract', 'l_contacts', 'l_grants', 'l_members',
+                            'l_milestones', 'l_progress', 'l_projecta', 'l_todo',
+                            'u_contact', 'u_institution', 'u_logurl',
+                            'u_milestone', 'u_todo', 'v_meetings', 'lister',
+                            'makeappointments']
+
+    optional arguments:
+      -h, --help            show this help message and exit
+      -s STATI [STATI ...], --stati STATI [STATI ...]
+                            Filter tasks with specific status from ['started',
+                            'finished', 'cancelled', 'paused']. Default is
+                            started.
+      --short [SHORT]       Filter tasks with estimated duration <= 30 mins, but
+                            if a number is specified, the duration of the filtered
+                            tasks will be less than that number of minutes.
+      -t TAGS [TAGS ...], --tags TAGS [TAGS ...]
+                            Filter tasks by tags. Items are returned if they
+                            contain any of the tags listed
+      -a ASSIGNED_TO, --assigned-to ASSIGNED_TO
+                            Filter tasks that are assigned to this user id.
+                            Default id is saved in user.json.
+      -b [ASSIGNED_BY], --assigned-by [ASSIGNED_BY]
+                            Filter tasks that are assigned to other members by
+                            this user id. Default id is saved in user.json.
+      --date DATE           Enter a date such that the helper can calculate how
+                            many days are left from that date to the due-date.
+                            Default is today.
+      -f FILTER [FILTER ...], --filter FILTER [FILTER ...]
+                            Search this collection by giving key element pairs.
+                            '-f description paper' will return tasks with
+                            description containing 'paper'
+    If the indices are far from being in numerical order, please renumber them by running regolith helper u_todo -r
+    (index) action (days to due date|importance|expected duration (mins)|tags|assigned by)
+    --------------------------------------------------------------------------------
+    started:
+    (1) Do all the things to set up todos in regolith (59|3|60.0||None)
+    ------------------------------
+    Tasks (decreasing priority going up)
+    ------------------------------
+    2021-07-29(59 days): (1) Do all the things to set up todos in regolith (59|3|60.0||None)
+    ------------------------------
+    Deadlines:
+    ------------------------------
+
+After all the help messages is your list of Todo items.  There is just one item,
+:bash:`Do all the things to set up todos in regolith`.
+
+OK, your Regolith is working.  If it isn't working, consider joining, browsing
+and posting questions to the `regolith-users <https://groups.google.com/u/1/g/regolith-users>`_
+Google group.
+
+Quick(ish) Start
+================
+OK, let's use Regolith to build our cv.  Why not.  again, in a terminal navigate
+to the top level directory of your database (where the :bash:`regolithrc.json`
+file is). and type:
+
+.. code-block:: sh
+
+    $ regolith build cv
+
+Regolith will take information from the various collections in your database and
+build them into your academic cv according to a pre-determined template.  The
+current template builds the cv using latex.  If your computer has latex installed
+and Regolith can find it, your cv should appear as a pdf document in the directory
+:bash:`my-cv-db/_build` (or more generally :bash:`<path>/<to>/<database_name>/_build`).
+All your built documents will appear in the :bash:`_build`
+directory.
+
+If you don't have latex installed we can  have Regolith build the latex
+source file for the cv but without trying to
+render it to PDF,
+
+.. code-block:: sh
+
+    $ regolith build cv --no-pdf
+
+The latex source is a text file that you will find in the :bash:`_build` directory
+and you can open it in a text editor.  Even without latex installed you can
+render it by opening a free account at http://overleaf.com starting a new blank
+project, uploading the :bash:`<filename>.tex` and :bash:`<filename>.bib` files to
+that project and hitting the :bash:`recompile` button.
+
+Whether it builds on your computer or on overleaf, it should look something like
+
+.. image:: ../_static/cv.pdf
+
+If, for some reason, the publication list doesn't render
+correctly, try running the latex command again.  If you are going to
+do much building with regolith it is definitely recommended to install latex on
+your computer, such as MikTeX for windows (latex comes installed with many linux
+systems and is easily installed on IOS).
+
+What Next?
+===========
+
+You have not spent too much time entering data into your database yet, but you
+can already build a number of different things.  Try building your
+resume (:bash:`$ regolith build resume`), your publication list
+(:bash:`$ regolith build publist`) and your presentation list
+(:bash:`$ regolith build preslist`).  You can even build a web-page
+for your group (:bash:`$ regolith build html`).  It will look pretty
+ugly until we set it up properly with a nice template, but all the content
+will be dynamically built from the latest info in your databases.
+
+To see everything you can build, type :bash:`$ regolith build --help`.
+To build some of those things you will need more collections that are not
+in the cookie cutter template, for example,
+:bash:`proposals` and :bash:`grants` collections, but you get the idea.
+
+So next we might want to work on those collections and start adding more data.
+This can be done in a couple of ways.  Probably the simplest to begin
+with is just use a text editor or IDE like PyCharm.   The :bash:`yml` files are
+yaml files, which is a human readable way of storing information that can be
+read and understood by python.  Please read about it `here <https://en.wikipedia.org/wiki/YAML>`_
+if you are not familiar with it. However, briefly to get you started, it encodes
+whether information is part of a list or a dictionary by indentation and semantics.
+For example,
+
+.. code-block:: sh
+
+    key:
+      - list item
+      - another list item
+
+would be read by python as :python:`{"key": ["list item", "another list item"]}`,
+and a collection consisting of a list of dictionaries would look like this in yaml:
+
+.. code-block:: sh
+
+    id:
+      - name: Arthur
+        quest: To find the Holy Grail
+        favorite_color: Blue
+      - name: Sir Lancelot
+        quest: To find the Holy Grail
+        favorite_color: Green, no pink
+
+Long story short, you can update your database by directly editing the file,
+and this is quick and easy when you get comfortable with the YAML syntax,
+but can be frustrating as you are learning it.
+
+If you want to check what
+fields are allowed or required in a collection look at the Collections part of
+the docs, :ref:`regolith_collections`, which are built from the Regolith schema
+(or directly look at the
+schema in :bash:`schema.py`).  You can automatically check if your database
+edits are valid by running :bash:`$ regolith validate`.
+
+Getting Help from Helpers
+==========================
+Regolith builders build documents, but there are a small but growing number of
+tools that either will run popular queries on the database and print the results
+to the terminal ("lister helpers" with :bash:`l_` prefixes -- you
+already used one,
+it was the lister helper that builds your todo list).
+
+There are also helpers
+that help you to add documents to your database collections.  These are
+"adder helpers"  with :bash:`a_` prefixes.  An important adder helper is
+:bash:`a_todo` helper that will add a todo item to your list.
+
+"Updater
+helpers" will update existing entries in your databases and have prefix
+:bash:`u_`.
+
+An important special kind of updater helper is a "finish helper" that will mark
+something as finished (and give it a finish date).  So when you do that
+pesky 15th todo item on your todo list, run
+:bash:`regolith helper f_todo -i 15` to finish it.
+
+That is a lot of typing to finish a todo, so consider setting up an alias in
+the config file for your terminal program (my terminals run bash so I put the
+alias in the :bash:`.bashrc` file in my home directory (:bash:`$ cd ~` to get there).
+With this alias I just type :bash:`rhlt 15` to finish that 15th todo item.
+
+To explore what helpers are there so you can play with them, type
+
+.. code-block:: sh
+
+    $ regolith helper
+
+and hit return.  It will return a list of available helpers, e.g.,
+
+.. code-block:: sh
+
+    $ regolith helper
+        usage: regolith helper [-h] helper_target
+        regolith helper: error: the following arguments are required: helper_target
+        usage: regolith helper [-h] helper_target
+
+        positional arguments:
+          helper_target  helper target to run. Currently valid targets are:
+                         ['a_expense', 'a_grppub_readlist', 'a_manurev',
+                         'a_presentation', 'a_projectum', 'a_proposal', 'a_proprev',
+                         'a_todo', 'f_prum', 'f_todo', 'l_abstract', 'l_contacts',
+                         'l_grants', 'l_members', 'l_milestones', 'l_progress',
+                         'l_projecta', 'l_todo', 'u_contact', 'u_institution',
+                         'u_logurl', 'u_milestone', 'u_todo', 'v_meetings', 'lister',
+                         'makeappointments']
+
+then if you want to know how to use any of the helpers type
+
+.. code-block:: sh
+
+    $ regolith helper <helper target>
+
+and hit return, e.g.,
+
+.. code-block:: sh
+
+    $ regolith helper l_contacts
+    usage: regolith helper [-h] [-v] [-n NAME] [-i INST] [-d DATE] [-r RANGE]
+                           [-o NOTES] [-f FILTER [FILTER ...]]
+                           [-k KEYS [KEYS ...]]
+                           helper_target run
+    regolith helper: error: the following arguments are required: run
+    usage: regolith helper [-h] [-v] [-n NAME] [-i INST] [-d DATE] [-r RANGE]
+                           [-o NOTES] [-f FILTER [FILTER ...]]
+                           [-k KEYS [KEYS ...]]
+                           helper_target run
+
+    positional arguments:
+      helper_target         helper target to run. Currently valid targets are:
+                            ['a_expense', 'a_grppub_readlist', 'a_manurev',
+                            'a_presentation', 'a_projectum', 'a_proposal',
+                            'a_proprev', 'a_todo', 'f_prum', 'f_todo',
+                            'l_abstract', 'l_contacts', 'l_grants', 'l_members',
+                            'l_milestones', 'l_progress', 'l_projecta', 'l_todo',
+                            'u_contact', 'u_institution', 'u_logurl',
+                            'u_milestone', 'u_todo', 'v_meetings', 'lister',
+                            'makeappointments']
+      run                   run the lister. To see allowed optional arguments,
+                            type "regolith helper l_contacts".
+
+    optional arguments:
+      -h, --help            show this help message and exit
+      -v, --verbose         Increases the verbosity of the output.
+      -n NAME, --name NAME  name or name fragment (single argument only) to use to
+                            find contacts.
+      -i INST, --inst INST  institution or an institution fragment (single
+                            argument only) to use to find contacts.
+      -d DATE, --date DATE  approximate date in ISO format (YYYY-MM-DD)
+                            corresponding to when the contact was entered in the
+                            database. Comes with a default range of 4 months
+                            centered around the date; change range using --range
+                            argument.
+      -r RANGE, --range RANGE
+                            range (in months) centered around date d specified by
+                            --date, i.e. (d +/- r/2).
+      -o NOTES, --notes NOTES
+                            fragment (single argument only) to be found in the
+                            notes section of a contact.
+      -f FILTER [FILTER ...], --filter FILTER [FILTER ...]
+                            Search this collection by giving key element pairs.
+      -k KEYS [KEYS ...], --keys KEYS [KEYS ...]
+                            Specify what keys to return values from when running
+                            --filter. If no argument is given the default is just
+                            the id.
+
+you then would rerun the command giving all required, and any
+optional, command
+line arguments. e.g.,
+
+.. code-block:: sh
+
+    $ regolith helper l_contacts run --name frank -v
+
+will return all contacts in the contacts collection where :bash:`frank` appears anywhere
+in the name, such as :bash:`Frankie Valli`, :bash:`Baron von Frankenstein`
+and :bash:`Anne Frank` (if they are in your contacts).  The :bash:`-v`
+command stands for :bash:`verbose` which means more information is
+returned than if you don't type :bash:`-v`.  You can try it now:
+
+.. code-block:: sh
+
+    $ regolith helper l_contacts run -n auth -v
+
+Setting up Gitlab repository information for API requests
+=========================================================
+
+Some helpers have features that make API requests to GitLab (or GitHub). For example, the a_presentation helper has a functionality that
+creates a repository in a designated GitLab group. In order to use these features, the target repository
+information needs to be defined in your configuration files (:code:`regolithrc.json`, :code:`user.json`).
+
+Setting up Destination Repo Information
+---------------------------------------
+
+The designated repository information should be defined in :code:`regolithrc.json` in the directory in which you are
+running the helper. Create a collection of repository targets designated as :code:`repos` (see below for an example).
+according to the following pattern.  We will use as an example an entry that will
+allow :code:`a_presentation` to successfully create a repository in a group called `talks`
+on a GitLab instance.
+
+:code:`a_presentation` looks for a rep with the entry :code:`_id` with value ``"talk_repo"``.
+
+.. code-block:: json
+
+"repos":[
+        {"_id": "talk_repo",     # a_presentation looks for the entry with this ID
+         "params": {"namespace_id": "35",             # These params are handed to the API post request.
+                    "initialize_with_readme": "True"  # "name" is also needed but a_presentation generates that automatially
+                    },
+         "url": "https://gitlab.example.com",  # The URL of the main GitLab/GitHub instance
+         "api_route": "/api/v4/projects/",     # This is the route to the REST-API.  The value
+                                               #   shown here is correct for GitLab at the time of writing
+         "namespace_name": "talks"      # the name of group/org which corresponds to the namespace_id above.
+        },
+        {
+            "_id": "another_example_repo",
+            [...]
+        }
+    ]
+
+The namespace ID is the repository's group ID which can be found on the target repository's main page.
+The :code:`url` and :code:`api_route` should be in the format above, including the dashes.
+
+For more information on the required request info, or to see a list of additional attributes
+that can also be defined in the request (e.g. ``initialize_with_readme``, ``description``, etc.),
+see GitHub or GitLab API documentation, e.g., for GitLab the `GitLab docs <https://docs.gitlab.com/ee/api/projects.html#create-project>`_.
+(Note that additional attributes can be defined under ``params``, where needed.)
+
+Setting up your Private Access Token
+------------------------------------
+
+Your personal/private API request token should be defined in :code:`user.json`, which can be found in your
+~/.config directory. Similarly, define a distinct ID for each private token. For example, to create a repo
+in GitLab, you should define your authentication token with the ID, ``"gitlab_private_token"``:
+
+.. code-block:: json
+
+    [
+        {
+            "_id": "gitlab_private_token",
+            "token": "<private-token>"
+        },
+        {
+            "_id": "example_token",
+            [...]
+        }
+    ]
+
+To learn more about creating a personal access token, refer to the
+`Gitlab docs <https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#personal-access-tokens>`_.
+Note that your personal access token should have the ``api`` scope enabled in order to make a successful request.
+
+To change the target directory, you can change the parameters (or IDs) in the function
+:code:`create_repo(destination_id, token_info_id, rc)` in `a_presentationhelper.py` to
+the IDs of your desired repo info and corresponding token.
+
+Setting up GitHub repository information for API requests
+=========================================================
+
+Using the filter capabilities in the helpers
+============================================
+
+Most helpers have a filter  field.  This allows you to filter the relevant collection
+before running the helper functionality.
+
+The logic of filter is the following.  A document will be valid if the value of key contains value for all keys and values using AND logic.
+
+As an example, if we consider filtering in the :bash:`l_milestones` helper we will get the following behavior. :bash:`l_milestones` operates on the :bash:`projecta` collection, so the filter will be applied to this collection.
+If you specify :bash:`--filter lead voe` it will return all documents where :bash:`voe` appears in the value for the :bash:`lead` field (e.g., if there is someone with an id of :bash:`carvoe` and another person with and id of :bash:`voedemort` the filter will return all the documents where either of these people are :bash:`lead`).
+
+If you then select :bash:`current` and :bash:`verbose` the helper will do the normal thing of returning in verbose form the current milestones, but it will do it on the filtered collection.
+
+A slight gotcha is that since filter uses "in" in its logic, if the type of the key value is a string it will find all strings that contain that fragment, as above, but if the type of the key value is a list it will return documents where the specified value is in the list, so :bash:`--filter group_member voe` will return all the documents where :bash:`voe` is listed as a group member, but it won't return any documents where :bash:`carvoe` or :bash:`voedemort` are listed as a group member.
+
+The filter uses AND logic and operates such that :bash:`--filter lead voe grants mygrant21 status finished` will return all prums that are led by :bash:`carvoe` or :bash:`voedemort` that acknowledge the mygrant21 grant and are finished.  Actually, similar behavior can be obtained also by selecting :bash:`--lead voe --stati finished --filter grants mygrant21`
+
+unfortunately the filter function does not currently recurse, so it will only operate on top level key-value pairs where the type of the value is a string or a list or a tuple.
+
+Backing up and protecting your work
+===================================
+Now you have started saving your precious life's work in your regolith database
+you better start protecting it and backing it up.  One low overhead approach
+for this is simply to set up your database directory to be backed up remotely as
+a Google drive or Dropbox synced directory, for example.
+
+However, Regolith is set up to
+work with git and GitHub and this is a powerful option if you are
+comfortable with it.  This gets more useful when you want to start
+sharing databases with group members, for example, using GitHub access rights.
+It is also possible to make sure people's edits to the database won't
+break things by setting up continuous integration (CI) that runs some
+validation and builders and makes sure they don't crash before the
+edits are accepted.  This is much more advanced usage which you
+should save for later.
+
+To get started with the GitHub option, the next thing to do is to turn your database directory
+on your filesystem into a git repository and link it to a repository on
+your personal space on GitHub (you will need a GitHub account).  You can make
+that repo private so the world
+cannot see your todo list, or public so that the world can see the web-page
+you build from it.  We will get back to this later, but Regolith will build
+collections from across databases, so you can have parts of your :bash:`people`
+collection private and other parts public.  Depending which :bash:`regolithrc.json`
+file you use to build with, you can pull from the public, or private, or both
+parts.  Again, this is a peep to the future.
+For now, let's assume you just want to back up and keep versions of
+you private database.  You will make a repository on your personal GitHub account
+and synchronize your local database with this repo.
+`Instructions for doing this are here <https://docs.github.com/en/github/importing-your-projects-to-github/importing-source-code-to-github/adding-an-existing-project-to-github-using-the-command-line>`_
+
+Once you get everything set up you will want to periodically (meaning
+frequently) type
+
+
+.. code-block:: sh
+
+    $ git commit -a -m "my commit message"
+    $ git push
+
+This will add, commit and push all files that git is tracking that have been
+updated locally.  If you add a new file to the repository and want it in the
+GitHub backup, you will have to explicitly add it before committing,
+
+.. code-block:: sh
+
+    $ git add my_new_file.py
+    $ git commit -m "an even more informative commit message"
+
+:bash:`$ git commit` commits (i.e., checks in) to the git database (yes,
+git, like you now, is using a database backend) everything that has been added, or staged, for commit.
+:bash:`$ git commit -a` automatically adds all files that git is tracking
+(have been previously committed in the past) that have been edited and then
+commits them.
+
+They are now safely captured in the git database and you can retrieve them
+later if you accidentally delete your personal database or mess it up some other way.
+But this version of the git database is still stored on your local computer, so
+if you spill coffee on your computer, you may lose everything.  :bash:`$ git push` pushes all
+these updates to a remote computer on the internet at the GitHub headquarters.
+Git and GitHub form a wonderful but complicated infrastructure, it is well worth
+getting to know how to use them well.  For now, we have used it to
+secure your precious database.  Remember to make frequent pushes.
+
+OK, you are started with your Regolith database.  Go play.  Regolith
+can do many more complicated things to help with administering your
+research group, or whatever you are working on.  We will continue to
+add tutorials below explaining some of these things, so check back
+from time to time.  And remember join and to ask questions at the `regolith-users <https://groups.google.com/u/1/g/regolith-users>`_
+Google group.  They will get answered.
+
+
+
+Tutorials
+=========
+.. toctree::
+    :maxdepth: 1
+
+    tutorials/index
+
+Run Control
+===========
+
+.. toctree::
+    :maxdepth: 1
+
+    rc
+
+
+Database Collections
+====================
+**Collections** are the regolith (and mongo) abstraction for *tables*.
+**Entries** (or *rows*) in
+a collection must follow the schema defined below. In general, the following notions
+hold:
+
+* An entry is a dictionary with string keys.
+* Each entry must contain a unique identifier. This is called ``"_id"`` in JSON
+  and Mongo, and is simply the top-level key in YAML.
+* A collection is a list of entries that follow the same schema.
+
+Not all regolith actions will use every collection type. It is common for regolith
+projects to just use some of the collections below. For example, building a group
+website will use different collections than managing students and grades in a course!
+With these points in mind, feel free to dive into the databases below!
+
+.. toctree::
+    :maxdepth: 2
+
+    collections/index
+
+
+Regolith API
+============
+For those who want to dive deeper into the library itself.
+
+.. toctree::
+    :maxdepth: 1
+
+    api/index
+
+
+Regolith Commands
+=================
+Shell commmands for regolith
+
+.. toctree::
+     :maxdepth: 2
+
+     commands/index
+
+
+Database Maintenance
+=========
+.. toctree::
+    :maxdepth: 1
+
+    database_maintenance/index
diff --git a/doc/source/license.rst b/doc/source/license.rst
new file mode 100644
index 000000000..3ba00c3d5
--- /dev/null
+++ b/doc/source/license.rst
@@ -0,0 +1,34 @@
+:tocdepth: -1
+
+.. index:: license
+
+License
+#######
+
+OPEN SOURCE LICENSE AGREEMENT
+=============================
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/make.bat b/doc/source/make.bat
similarity index 100%
rename from docs/make.bat
rename to doc/source/make.bat
diff --git a/docs/rc.rst b/doc/source/rc.rst
similarity index 100%
rename from docs/rc.rst
rename to doc/source/rc.rst
diff --git a/docs/regolithrc.json b/doc/source/regolithrc.json
similarity index 100%
rename from docs/regolithrc.json
rename to doc/source/regolithrc.json
diff --git a/doc/source/release.rst b/doc/source/release.rst
new file mode 100644
index 000000000..27cd0cc94
--- /dev/null
+++ b/doc/source/release.rst
@@ -0,0 +1,5 @@
+:tocdepth: -1
+
+.. index:: release notes
+
+.. include:: ../../CHANGELOG.rst
diff --git a/docs/tutorials/broker.rst b/doc/source/tutorials/broker.rst
similarity index 100%
rename from docs/tutorials/broker.rst
rename to doc/source/tutorials/broker.rst
diff --git a/docs/tutorials/index.rst b/doc/source/tutorials/index.rst
similarity index 100%
rename from docs/tutorials/index.rst
rename to doc/source/tutorials/index.rst
diff --git a/news/regolith_cookiecut.rst b/news/regolith_cookiecut.rst
index c265f51bc..4b96dc575 100644
--- a/news/regolith_cookiecut.rst
+++ b/news/regolith_cookiecut.rst
@@ -16,7 +16,7 @@
 
 **Fixed:**
 
-* Fix Regolith by flake8 and black under PEP-8 standard.
+* Rearrange Regolith package to new Billingegroup package standards
 
 **Security:**
 
diff --git a/pyproject.toml b/pyproject.toml
index 09d82ee7c..abce09f05 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -47,7 +47,7 @@ dev_template = "{tag}"
 dirty_template = "{tag}"
 
 [tool.setuptools.packages.find]
-where = ["."]  # list of folders that contain the packages (["."] by default)
+where = ["src"]  # list of folders that contain the packages (["."] by default)
 include = ["regolith*"]  # package names should match these glob patterns (["*"] by default)
 exclude = []  # exclude packages matching these glob patterns (empty by default)
 namespaces = true  # to disable scanning PEP 420 namespaces (true by default)
diff --git a/requirements/docs.txt b/requirements/docs.txt
new file mode 100644
index 000000000..ab17b1c8d
--- /dev/null
+++ b/requirements/docs.txt
@@ -0,0 +1,4 @@
+sphinx
+sphinx_rtd_theme
+doctr
+m2r
diff --git a/regolith/__init__.py b/src/regolith/__init__.py
similarity index 100%
rename from regolith/__init__.py
rename to src/regolith/__init__.py
diff --git a/regolith/app.py b/src/regolith/app.py
similarity index 100%
rename from regolith/app.py
rename to src/regolith/app.py
diff --git a/regolith/broker.py b/src/regolith/broker.py
similarity index 100%
rename from regolith/broker.py
rename to src/regolith/broker.py
diff --git a/regolith/builder.py b/src/regolith/builder.py
similarity index 100%
rename from regolith/builder.py
rename to src/regolith/builder.py
diff --git a/regolith/helpers/__init__.py b/src/regolith/builders/__init__.py
similarity index 100%
rename from regolith/helpers/__init__.py
rename to src/regolith/builders/__init__.py
diff --git a/regolith/builders/activitylogbuilder.py b/src/regolith/builders/activitylogbuilder.py
similarity index 100%
rename from regolith/builders/activitylogbuilder.py
rename to src/regolith/builders/activitylogbuilder.py
diff --git a/regolith/builders/appraisalbuilder.py b/src/regolith/builders/appraisalbuilder.py
similarity index 100%
rename from regolith/builders/appraisalbuilder.py
rename to src/regolith/builders/appraisalbuilder.py
diff --git a/regolith/builders/basebuilder.py b/src/regolith/builders/basebuilder.py
similarity index 96%
rename from regolith/builders/basebuilder.py
rename to src/regolith/builders/basebuilder.py
index 21bf4dee8..9ce2e0ebe 100644
--- a/regolith/builders/basebuilder.py
+++ b/src/regolith/builders/basebuilder.py
@@ -16,15 +16,7 @@
     HAVE_BIBTEX_PARSER = False
 
 from regolith.sorters import category_val, date_key, doc_date_key, level_val
-from regolith.tools import (
-    LATEX_OPTS,
-    date_to_rfc822,
-    gets,
-    latex_safe,
-    latex_safe_url,
-    month_and_year,
-    rfc822now,
-)
+from regolith.tools import LATEX_OPTS, date_to_rfc822, gets, latex_safe, latex_safe_url, month_and_year, rfc822now
 
 
 class BuilderBase(object):
diff --git a/regolith/builders/beamplanbuilder.py b/src/regolith/builders/beamplanbuilder.py
similarity index 100%
rename from regolith/builders/beamplanbuilder.py
rename to src/regolith/builders/beamplanbuilder.py
diff --git a/regolith/builders/coabuilder.py b/src/regolith/builders/coabuilder.py
similarity index 99%
rename from regolith/builders/coabuilder.py
rename to src/regolith/builders/coabuilder.py
index dfc1d2dd1..766fba389 100644
--- a/regolith/builders/coabuilder.py
+++ b/src/regolith/builders/coabuilder.py
@@ -18,11 +18,7 @@
 from regolith.builders.basebuilder import BuilderBase
 from regolith.dates import get_dates, is_after, month_to_int
 from regolith.sorters import position_key
-from regolith.tools import (
-    all_docs_from_collection,
-    filter_publications,
-    fuzzy_retrieval,
-)
+from regolith.tools import all_docs_from_collection, filter_publications, fuzzy_retrieval
 
 NUM_COAUTHOR_MONTHS = 48
 NUM_POSTDOC_MONTHS = None
diff --git a/regolith/builders/cpbuilder.py b/src/regolith/builders/cpbuilder.py
similarity index 97%
rename from regolith/builders/cpbuilder.py
rename to src/regolith/builders/cpbuilder.py
index ab4c7598e..8156ee4a1 100644
--- a/regolith/builders/cpbuilder.py
+++ b/src/regolith/builders/cpbuilder.py
@@ -9,12 +9,7 @@
 from regolith.dates import get_dates, is_current
 from regolith.fsclient import _id_key
 from regolith.sorters import position_key
-from regolith.tools import (
-    all_docs_from_collection,
-    filter_grants,
-    fuzzy_retrieval,
-    merge_collections_all,
-)
+from regolith.tools import all_docs_from_collection, filter_grants, fuzzy_retrieval, merge_collections_all
 
 
 def is_pending(status):
diff --git a/regolith/builders/cvbuilder.py b/src/regolith/builders/cvbuilder.py
similarity index 100%
rename from regolith/builders/cvbuilder.py
rename to src/regolith/builders/cvbuilder.py
diff --git a/regolith/builders/figurebuilder.py b/src/regolith/builders/figurebuilder.py
similarity index 100%
rename from regolith/builders/figurebuilder.py
rename to src/regolith/builders/figurebuilder.py
diff --git a/regolith/builders/formalletterbuilder.py b/src/regolith/builders/formalletterbuilder.py
similarity index 100%
rename from regolith/builders/formalletterbuilder.py
rename to src/regolith/builders/formalletterbuilder.py
diff --git a/regolith/builders/gradebuilder.py b/src/regolith/builders/gradebuilder.py
similarity index 100%
rename from regolith/builders/gradebuilder.py
rename to src/regolith/builders/gradebuilder.py
diff --git a/regolith/builders/grantreportbuilder.py b/src/regolith/builders/grantreportbuilder.py
similarity index 99%
rename from regolith/builders/grantreportbuilder.py
rename to src/regolith/builders/grantreportbuilder.py
index e0091fb61..7ab1ffb70 100644
--- a/regolith/builders/grantreportbuilder.py
+++ b/src/regolith/builders/grantreportbuilder.py
@@ -10,11 +10,7 @@
 from regolith.builders.basebuilder import LatexBuilderBase
 from regolith.dates import get_dates, is_current
 from regolith.fsclient import _id_key
-from regolith.tools import (
-    all_docs_from_collection,
-    filter_presentations,
-    fuzzy_retrieval,
-)
+from regolith.tools import all_docs_from_collection, filter_presentations, fuzzy_retrieval
 
 
 class GrantReportBuilder(LatexBuilderBase):
diff --git a/regolith/builders/htmlbuilder.py b/src/regolith/builders/htmlbuilder.py
similarity index 100%
rename from regolith/builders/htmlbuilder.py
rename to src/regolith/builders/htmlbuilder.py
diff --git a/regolith/builders/internalhtmlbuilder.py b/src/regolith/builders/internalhtmlbuilder.py
similarity index 100%
rename from regolith/builders/internalhtmlbuilder.py
rename to src/regolith/builders/internalhtmlbuilder.py
diff --git a/regolith/builders/manuscriptreviewbuilder.py b/src/regolith/builders/manuscriptreviewbuilder.py
similarity index 100%
rename from regolith/builders/manuscriptreviewbuilder.py
rename to src/regolith/builders/manuscriptreviewbuilder.py
diff --git a/regolith/builders/postdocadbuilder.py b/src/regolith/builders/postdocadbuilder.py
similarity index 100%
rename from regolith/builders/postdocadbuilder.py
rename to src/regolith/builders/postdocadbuilder.py
diff --git a/regolith/builders/preslistbuilder.py b/src/regolith/builders/preslistbuilder.py
similarity index 97%
rename from regolith/builders/preslistbuilder.py
rename to src/regolith/builders/preslistbuilder.py
index 0652b717e..335fb33ec 100644
--- a/regolith/builders/preslistbuilder.py
+++ b/src/regolith/builders/preslistbuilder.py
@@ -22,11 +22,7 @@
 from regolith.fsclient import _id_key
 from regolith.sorters import position_key
 from regolith.stylers import month_fullnames, sentencecase
-from regolith.tools import (
-    all_docs_from_collection,
-    filter_presentations,
-    group_member_ids,
-)
+from regolith.tools import all_docs_from_collection, filter_presentations, group_member_ids
 
 
 class PresListBuilder(LatexBuilderBase):
diff --git a/regolith/builders/proposalreviewbuilder.py b/src/regolith/builders/proposalreviewbuilder.py
similarity index 100%
rename from regolith/builders/proposalreviewbuilder.py
rename to src/regolith/builders/proposalreviewbuilder.py
diff --git a/regolith/builders/publistbuilder.py b/src/regolith/builders/publistbuilder.py
similarity index 98%
rename from regolith/builders/publistbuilder.py
rename to src/regolith/builders/publistbuilder.py
index ad7fccbbf..73bfb2150 100644
--- a/regolith/builders/publistbuilder.py
+++ b/src/regolith/builders/publistbuilder.py
@@ -4,11 +4,7 @@
 
 from regolith.builders.basebuilder import LatexBuilderBase
 from regolith.sorters import ene_date_key, position_key
-from regolith.tools import (
-    all_docs_from_collection,
-    filter_publications,
-    make_bibtex_file,
-)
+from regolith.tools import all_docs_from_collection, filter_publications, make_bibtex_file
 
 LATEX_OPTS = ["-halt-on-error", "-file-line-error"]
 
diff --git a/regolith/builders/readinglistsbuilder.py b/src/regolith/builders/readinglistsbuilder.py
similarity index 100%
rename from regolith/builders/readinglistsbuilder.py
rename to src/regolith/builders/readinglistsbuilder.py
diff --git a/regolith/builders/reimbursementbuilder.py b/src/regolith/builders/reimbursementbuilder.py
similarity index 100%
rename from regolith/builders/reimbursementbuilder.py
rename to src/regolith/builders/reimbursementbuilder.py
diff --git a/regolith/builders/resumebuilder.py b/src/regolith/builders/resumebuilder.py
similarity index 100%
rename from regolith/builders/resumebuilder.py
rename to src/regolith/builders/resumebuilder.py
diff --git a/regolith/chained_db.py b/src/regolith/chained_db.py
similarity index 100%
rename from regolith/chained_db.py
rename to src/regolith/chained_db.py
diff --git a/regolith/classlist.py b/src/regolith/classlist.py
similarity index 100%
rename from regolith/classlist.py
rename to src/regolith/classlist.py
diff --git a/regolith/client_manager.py b/src/regolith/client_manager.py
similarity index 100%
rename from regolith/client_manager.py
rename to src/regolith/client_manager.py
diff --git a/regolith/commands.py b/src/regolith/commands.py
similarity index 100%
rename from regolith/commands.py
rename to src/regolith/commands.py
diff --git a/regolith/credentials.json b/src/regolith/credentials.json
similarity index 100%
rename from regolith/credentials.json
rename to src/regolith/credentials.json
diff --git a/regolith/database.xsh b/src/regolith/database.xsh
similarity index 100%
rename from regolith/database.xsh
rename to src/regolith/database.xsh
diff --git a/regolith/dates.py b/src/regolith/dates.py
similarity index 100%
rename from regolith/dates.py
rename to src/regolith/dates.py
diff --git a/regolith/deploy.py b/src/regolith/deploy.py
similarity index 100%
rename from regolith/deploy.py
rename to src/regolith/deploy.py
diff --git a/regolith/emailer.py b/src/regolith/emailer.py
similarity index 100%
rename from regolith/emailer.py
rename to src/regolith/emailer.py
diff --git a/regolith/exemplars.json b/src/regolith/exemplars.json
similarity index 100%
rename from regolith/exemplars.json
rename to src/regolith/exemplars.json
diff --git a/regolith/fsclient.py b/src/regolith/fsclient.py
similarity index 100%
rename from regolith/fsclient.py
rename to src/regolith/fsclient.py
diff --git a/regolith/grader.py b/src/regolith/grader.py
similarity index 100%
rename from regolith/grader.py
rename to src/regolith/grader.py
diff --git a/regolith/helper.py b/src/regolith/helper.py
similarity index 100%
rename from regolith/helper.py
rename to src/regolith/helper.py
diff --git a/regolith/helper_connect_main.py b/src/regolith/helper_connect_main.py
similarity index 100%
rename from regolith/helper_connect_main.py
rename to src/regolith/helper_connect_main.py
diff --git a/regolith/helper_gui_main.py b/src/regolith/helper_gui_main.py
similarity index 100%
rename from regolith/helper_gui_main.py
rename to src/regolith/helper_gui_main.py
diff --git a/tests/__init__.py b/src/regolith/helpers/__init__.py
similarity index 100%
rename from tests/__init__.py
rename to src/regolith/helpers/__init__.py
diff --git a/regolith/helpers/a_expensehelper.py b/src/regolith/helpers/a_expensehelper.py
similarity index 100%
rename from regolith/helpers/a_expensehelper.py
rename to src/regolith/helpers/a_expensehelper.py
diff --git a/regolith/helpers/a_grppub_readlisthelper.py b/src/regolith/helpers/a_grppub_readlisthelper.py
similarity index 100%
rename from regolith/helpers/a_grppub_readlisthelper.py
rename to src/regolith/helpers/a_grppub_readlisthelper.py
diff --git a/regolith/helpers/a_manurevhelper.py b/src/regolith/helpers/a_manurevhelper.py
similarity index 100%
rename from regolith/helpers/a_manurevhelper.py
rename to src/regolith/helpers/a_manurevhelper.py
diff --git a/regolith/helpers/a_presentationhelper.py b/src/regolith/helpers/a_presentationhelper.py
similarity index 100%
rename from regolith/helpers/a_presentationhelper.py
rename to src/regolith/helpers/a_presentationhelper.py
diff --git a/regolith/helpers/a_projectumhelper.py b/src/regolith/helpers/a_projectumhelper.py
similarity index 100%
rename from regolith/helpers/a_projectumhelper.py
rename to src/regolith/helpers/a_projectumhelper.py
diff --git a/regolith/helpers/a_proposalhelper.py b/src/regolith/helpers/a_proposalhelper.py
similarity index 100%
rename from regolith/helpers/a_proposalhelper.py
rename to src/regolith/helpers/a_proposalhelper.py
diff --git a/regolith/helpers/a_proprevhelper.py b/src/regolith/helpers/a_proprevhelper.py
similarity index 100%
rename from regolith/helpers/a_proprevhelper.py
rename to src/regolith/helpers/a_proprevhelper.py
diff --git a/regolith/helpers/a_todohelper.py b/src/regolith/helpers/a_todohelper.py
similarity index 98%
rename from regolith/helpers/a_todohelper.py
rename to src/regolith/helpers/a_todohelper.py
index 9f1c6450c..607daeccd 100644
--- a/regolith/helpers/a_todohelper.py
+++ b/src/regolith/helpers/a_todohelper.py
@@ -9,12 +9,7 @@
 from regolith.chained_db import _convert_to_dict
 from regolith.fsclient import _id_key
 from regolith.helpers.basehelper import DbHelperBase
-from regolith.tools import (
-    all_docs_from_collection,
-    fragment_retrieval,
-    get_pi_id,
-    get_uuid,
-)
+from regolith.tools import all_docs_from_collection, fragment_retrieval, get_pi_id, get_uuid
 
 TARGET_COLL = "todos"
 ALLOWED_IMPORTANCE = [3, 2, 1, 0]
diff --git a/regolith/helpers/basehelper.py b/src/regolith/helpers/basehelper.py
similarity index 96%
rename from regolith/helpers/basehelper.py
rename to src/regolith/helpers/basehelper.py
index fb45f7fac..6f60e3545 100644
--- a/regolith/helpers/basehelper.py
+++ b/src/regolith/helpers/basehelper.py
@@ -8,15 +8,7 @@
 from xonsh.lib import subprocess
 
 from regolith.sorters import category_val, date_key, doc_date_key, level_val
-from regolith.tools import (
-    LATEX_OPTS,
-    date_to_rfc822,
-    gets,
-    latex_safe,
-    latex_safe_url,
-    month_and_year,
-    rfc822now,
-)
+from regolith.tools import LATEX_OPTS, date_to_rfc822, gets, latex_safe, latex_safe_url, month_and_year, rfc822now
 
 
 class HelperBase(object):
diff --git a/regolith/helpers/f_todohelper.py b/src/regolith/helpers/f_todohelper.py
similarity index 100%
rename from regolith/helpers/f_todohelper.py
rename to src/regolith/helpers/f_todohelper.py
diff --git a/regolith/helpers/hellohelper.py b/src/regolith/helpers/hellohelper.py
similarity index 100%
rename from regolith/helpers/hellohelper.py
rename to src/regolith/helpers/hellohelper.py
diff --git a/regolith/helpers/l_abstracthelper.py b/src/regolith/helpers/l_abstracthelper.py
similarity index 98%
rename from regolith/helpers/l_abstracthelper.py
rename to src/regolith/helpers/l_abstracthelper.py
index c35346dca..07151cfc3 100644
--- a/regolith/helpers/l_abstracthelper.py
+++ b/src/regolith/helpers/l_abstracthelper.py
@@ -5,12 +5,7 @@
 from regolith.dates import get_dates
 from regolith.fsclient import _id_key
 from regolith.helpers.basehelper import SoutHelperBase
-from regolith.tools import (
-    all_docs_from_collection,
-    dereference_institution,
-    get_person_contact,
-    get_pi_id,
-)
+from regolith.tools import all_docs_from_collection, dereference_institution, get_person_contact, get_pi_id
 
 TARGET_COLL = "presentations"
 HELPER_TARGET = "l_abstract"
diff --git a/regolith/helpers/l_contactshelper.py b/src/regolith/helpers/l_contactshelper.py
similarity index 97%
rename from regolith/helpers/l_contactshelper.py
rename to src/regolith/helpers/l_contactshelper.py
index 4a3800199..96fe47ae6 100644
--- a/regolith/helpers/l_contactshelper.py
+++ b/src/regolith/helpers/l_contactshelper.py
@@ -9,12 +9,7 @@
 from regolith.dates import get_dates, is_current
 from regolith.fsclient import _id_key
 from regolith.helpers.basehelper import SoutHelperBase
-from regolith.tools import (
-    all_docs_from_collection,
-    fuzzy_retrieval,
-    get_pi_id,
-    search_collection,
-)
+from regolith.tools import all_docs_from_collection, fuzzy_retrieval, get_pi_id, search_collection
 
 TARGET_COLL = "contacts"
 HELPER_TARGET = "l_contacts"
diff --git a/regolith/helpers/l_currentappointmentshelper.py b/src/regolith/helpers/l_currentappointmentshelper.py
similarity index 95%
rename from regolith/helpers/l_currentappointmentshelper.py
rename to src/regolith/helpers/l_currentappointmentshelper.py
index 1cabe8fe0..94f627d8f 100644
--- a/regolith/helpers/l_currentappointmentshelper.py
+++ b/src/regolith/helpers/l_currentappointmentshelper.py
@@ -6,11 +6,7 @@
 from regolith.helpers.basehelper import SoutHelperBase
 from regolith.helpers.makeappointmentshelper import _future_grant
 from regolith.sorters import position_key
-from regolith.tools import (
-    all_docs_from_collection,
-    fuzzy_retrieval,
-    merge_collections_superior,
-)
+from regolith.tools import all_docs_from_collection, fuzzy_retrieval, merge_collections_superior
 
 SEMESTER_START_MONTH = {"fall": (9, 12), "spring": (1, 5), "summer": (6, 8)}
 
@@ -84,7 +80,7 @@ def sout(self):
                 for _id, appt in p_appt.items():
                     grantid = appt.get("grant")
                     if not grantid:
-                        print(f"No grant found in {person.get("_id")} appt {person.get("appt")}")
+                        print(f"No grant found in {person.get('_id')} appt {person.get('appt')}")
                     grant = fuzzy_retrieval(grants, ["name", "_id", "alias"], grantid)
                     if not grant:
                         print(f"No grant found for {grantid}")
diff --git a/regolith/helpers/l_generalhelper.py b/src/regolith/helpers/l_generalhelper.py
similarity index 96%
rename from regolith/helpers/l_generalhelper.py
rename to src/regolith/helpers/l_generalhelper.py
index c5d1e9a99..9d3adb6a5 100644
--- a/regolith/helpers/l_generalhelper.py
+++ b/src/regolith/helpers/l_generalhelper.py
@@ -2,12 +2,7 @@
 
 from regolith.fsclient import _id_key
 from regolith.helpers.basehelper import SoutHelperBase
-from regolith.tools import (
-    all_docs_from_collection,
-    collection_str,
-    get_pi_id,
-    search_collection,
-)
+from regolith.tools import all_docs_from_collection, collection_str, get_pi_id, search_collection
 
 HELPER_TARGET = "lister"
 
diff --git a/regolith/helpers/l_grantshelper.py b/src/regolith/helpers/l_grantshelper.py
similarity index 100%
rename from regolith/helpers/l_grantshelper.py
rename to src/regolith/helpers/l_grantshelper.py
diff --git a/regolith/helpers/l_membershelper.py b/src/regolith/helpers/l_membershelper.py
similarity index 100%
rename from regolith/helpers/l_membershelper.py
rename to src/regolith/helpers/l_membershelper.py
diff --git a/regolith/helpers/l_milestoneshelper.py b/src/regolith/helpers/l_milestoneshelper.py
similarity index 98%
rename from regolith/helpers/l_milestoneshelper.py
rename to src/regolith/helpers/l_milestoneshelper.py
index 86ec0139c..441189785 100644
--- a/regolith/helpers/l_milestoneshelper.py
+++ b/src/regolith/helpers/l_milestoneshelper.py
@@ -16,12 +16,7 @@
     PROJECTUM_PAUSED_STATI,
     alloweds,
 )
-from regolith.tools import (
-    all_docs_from_collection,
-    collection_str,
-    get_pi_id,
-    key_value_pair_filter,
-)
+from regolith.tools import all_docs_from_collection, collection_str, get_pi_id, key_value_pair_filter
 
 PROJECTUM_STATI = alloweds.get("PROJECTUM_STATI")
 TARGET_COLL = "projecta"
diff --git a/regolith/helpers/l_progressreporthelper.py b/src/regolith/helpers/l_progressreporthelper.py
similarity index 100%
rename from regolith/helpers/l_progressreporthelper.py
rename to src/regolith/helpers/l_progressreporthelper.py
diff --git a/regolith/helpers/l_projectahelper.py b/src/regolith/helpers/l_projectahelper.py
similarity index 98%
rename from regolith/helpers/l_projectahelper.py
rename to src/regolith/helpers/l_projectahelper.py
index 2dd2f5d81..ef2452d5a 100644
--- a/regolith/helpers/l_projectahelper.py
+++ b/src/regolith/helpers/l_projectahelper.py
@@ -17,12 +17,7 @@
     PROJECTUM_FINISHED_STATI,
     PROJECTUM_PAUSED_STATI,
 )
-from regolith.tools import (
-    all_docs_from_collection,
-    collection_str,
-    get_pi_id,
-    key_value_pair_filter,
-)
+from regolith.tools import all_docs_from_collection, collection_str, get_pi_id, key_value_pair_filter
 
 TARGET_COLL = "projecta"
 HELPER_TARGET = "l_projecta"
diff --git a/regolith/helpers/l_todohelper.py b/src/regolith/helpers/l_todohelper.py
similarity index 100%
rename from regolith/helpers/l_todohelper.py
rename to src/regolith/helpers/l_todohelper.py
diff --git a/regolith/helpers/makeappointmentshelper.py b/src/regolith/helpers/makeappointmentshelper.py
similarity index 100%
rename from regolith/helpers/makeappointmentshelper.py
rename to src/regolith/helpers/makeappointmentshelper.py
diff --git a/regolith/helpers/reimbstatushelper.py b/src/regolith/helpers/reimbstatushelper.py
similarity index 100%
rename from regolith/helpers/reimbstatushelper.py
rename to src/regolith/helpers/reimbstatushelper.py
diff --git a/regolith/helpers/u_contacthelper.py b/src/regolith/helpers/u_contacthelper.py
similarity index 100%
rename from regolith/helpers/u_contacthelper.py
rename to src/regolith/helpers/u_contacthelper.py
diff --git a/regolith/helpers/u_finishprumhelper.py b/src/regolith/helpers/u_finishprumhelper.py
similarity index 100%
rename from regolith/helpers/u_finishprumhelper.py
rename to src/regolith/helpers/u_finishprumhelper.py
diff --git a/regolith/helpers/u_institutionshelper.py b/src/regolith/helpers/u_institutionshelper.py
similarity index 100%
rename from regolith/helpers/u_institutionshelper.py
rename to src/regolith/helpers/u_institutionshelper.py
diff --git a/regolith/helpers/u_logurlhelper.py b/src/regolith/helpers/u_logurlhelper.py
similarity index 100%
rename from regolith/helpers/u_logurlhelper.py
rename to src/regolith/helpers/u_logurlhelper.py
diff --git a/regolith/helpers/u_milestonehelper.py b/src/regolith/helpers/u_milestonehelper.py
similarity index 100%
rename from regolith/helpers/u_milestonehelper.py
rename to src/regolith/helpers/u_milestonehelper.py
diff --git a/regolith/helpers/u_todohelper.py b/src/regolith/helpers/u_todohelper.py
similarity index 100%
rename from regolith/helpers/u_todohelper.py
rename to src/regolith/helpers/u_todohelper.py
diff --git a/regolith/helpers/v_meetingshelper.py b/src/regolith/helpers/v_meetingshelper.py
similarity index 100%
rename from regolith/helpers/v_meetingshelper.py
rename to src/regolith/helpers/v_meetingshelper.py
diff --git a/regolith/interact.py b/src/regolith/interact.py
similarity index 100%
rename from regolith/interact.py
rename to src/regolith/interact.py
diff --git a/regolith/main.py b/src/regolith/main.py
similarity index 100%
rename from regolith/main.py
rename to src/regolith/main.py
diff --git a/regolith/mongoclient.py b/src/regolith/mongoclient.py
similarity index 100%
rename from regolith/mongoclient.py
rename to src/regolith/mongoclient.py
diff --git a/regolith/runcontrol.py b/src/regolith/runcontrol.py
similarity index 100%
rename from regolith/runcontrol.py
rename to src/regolith/runcontrol.py
diff --git a/regolith/schemas.json b/src/regolith/schemas.json
similarity index 100%
rename from regolith/schemas.json
rename to src/regolith/schemas.json
diff --git a/regolith/schemas.py b/src/regolith/schemas.py
similarity index 100%
rename from regolith/schemas.py
rename to src/regolith/schemas.py
diff --git a/regolith/sorters.py b/src/regolith/sorters.py
similarity index 100%
rename from regolith/sorters.py
rename to src/regolith/sorters.py
diff --git a/regolith/static/ace.js b/src/regolith/static/ace.js
similarity index 100%
rename from regolith/static/ace.js
rename to src/regolith/static/ace.js
diff --git a/regolith/static/bootstrap.min.css b/src/regolith/static/bootstrap.min.css
similarity index 100%
rename from regolith/static/bootstrap.min.css
rename to src/regolith/static/bootstrap.min.css
diff --git a/regolith/static/img/jsoneditor-icons.png b/src/regolith/static/img/jsoneditor-icons.png
similarity index 100%
rename from regolith/static/img/jsoneditor-icons.png
rename to src/regolith/static/img/jsoneditor-icons.png
diff --git a/regolith/static/jquery.min.js b/src/regolith/static/jquery.min.js
similarity index 100%
rename from regolith/static/jquery.min.js
rename to src/regolith/static/jquery.min.js
diff --git a/regolith/static/jsoneditor.map b/src/regolith/static/jsoneditor.map
similarity index 100%
rename from regolith/static/jsoneditor.map
rename to src/regolith/static/jsoneditor.map
diff --git a/regolith/static/jsoneditor.min.css b/src/regolith/static/jsoneditor.min.css
similarity index 100%
rename from regolith/static/jsoneditor.min.css
rename to src/regolith/static/jsoneditor.min.css
diff --git a/regolith/static/jsoneditor.min.js b/src/regolith/static/jsoneditor.min.js
similarity index 100%
rename from regolith/static/jsoneditor.min.js
rename to src/regolith/static/jsoneditor.min.js
diff --git a/regolith/static/lodash.min.js b/src/regolith/static/lodash.min.js
similarity index 100%
rename from regolith/static/lodash.min.js
rename to src/regolith/static/lodash.min.js
diff --git a/regolith/static/sensei-grid.min.css b/src/regolith/static/sensei-grid.min.css
similarity index 100%
rename from regolith/static/sensei-grid.min.css
rename to src/regolith/static/sensei-grid.min.css
diff --git a/regolith/static/sensei-grid.min.js b/src/regolith/static/sensei-grid.min.js
similarity index 100%
rename from regolith/static/sensei-grid.min.js
rename to src/regolith/static/sensei-grid.min.js
diff --git a/regolith/storage.py b/src/regolith/storage.py
similarity index 100%
rename from regolith/storage.py
rename to src/regolith/storage.py
diff --git a/regolith/stylers.py b/src/regolith/stylers.py
similarity index 100%
rename from regolith/stylers.py
rename to src/regolith/stylers.py
diff --git a/regolith/templates/abstract.html b/src/regolith/templates/abstract.html
similarity index 100%
rename from regolith/templates/abstract.html
rename to src/regolith/templates/abstract.html
diff --git a/regolith/templates/base.html b/src/regolith/templates/base.html
similarity index 100%
rename from regolith/templates/base.html
rename to src/regolith/templates/base.html
diff --git a/regolith/templates/beamplan.tex b/src/regolith/templates/beamplan.tex
similarity index 100%
rename from regolith/templates/beamplan.tex
rename to src/regolith/templates/beamplan.tex
diff --git a/regolith/templates/beamplan.txt b/src/regolith/templates/beamplan.txt
similarity index 100%
rename from regolith/templates/beamplan.txt
rename to src/regolith/templates/beamplan.txt
diff --git a/regolith/templates/blog_index.html b/src/regolith/templates/blog_index.html
similarity index 100%
rename from regolith/templates/blog_index.html
rename to src/regolith/templates/blog_index.html
diff --git a/regolith/templates/blog_post.html b/src/regolith/templates/blog_post.html
similarity index 100%
rename from regolith/templates/blog_post.html
rename to src/regolith/templates/blog_post.html
diff --git a/regolith/templates/blog_summary.html b/src/regolith/templates/blog_summary.html
similarity index 100%
rename from regolith/templates/blog_summary.html
rename to src/regolith/templates/blog_summary.html
diff --git a/regolith/templates/coa_template_doe.xlsx b/src/regolith/templates/coa_template_doe.xlsx
similarity index 100%
rename from regolith/templates/coa_template_doe.xlsx
rename to src/regolith/templates/coa_template_doe.xlsx
diff --git a/regolith/templates/coa_template_nsf.xlsx b/src/regolith/templates/coa_template_nsf.xlsx
similarity index 100%
rename from regolith/templates/coa_template_nsf.xlsx
rename to src/regolith/templates/coa_template_nsf.xlsx
diff --git a/regolith/templates/collection.html b/src/regolith/templates/collection.html
similarity index 100%
rename from regolith/templates/collection.html
rename to src/regolith/templates/collection.html
diff --git a/regolith/templates/columbia_annual_report.tex b/src/regolith/templates/columbia_annual_report.tex
similarity index 100%
rename from regolith/templates/columbia_annual_report.tex
rename to src/regolith/templates/columbia_annual_report.tex
diff --git a/regolith/templates/current_pending.tex b/src/regolith/templates/current_pending.tex
similarity index 100%
rename from regolith/templates/current_pending.tex
rename to src/regolith/templates/current_pending.tex
diff --git a/regolith/templates/cv.tex b/src/regolith/templates/cv.tex
similarity index 100%
rename from regolith/templates/cv.tex
rename to src/regolith/templates/cv.tex
diff --git a/regolith/templates/former.html b/src/regolith/templates/former.html
similarity index 100%
rename from regolith/templates/former.html
rename to src/regolith/templates/former.html
diff --git a/regolith/templates/grader.html b/src/regolith/templates/grader.html
similarity index 100%
rename from regolith/templates/grader.html
rename to src/regolith/templates/grader.html
diff --git a/regolith/templates/gradereport.tex b/src/regolith/templates/gradereport.tex
similarity index 100%
rename from regolith/templates/gradereport.tex
rename to src/regolith/templates/gradereport.tex
diff --git a/regolith/templates/grantreport.txt b/src/regolith/templates/grantreport.txt
similarity index 100%
rename from regolith/templates/grantreport.txt
rename to src/regolith/templates/grantreport.txt
diff --git a/regolith/templates/grpmeetings.html b/src/regolith/templates/grpmeetings.html
similarity index 100%
rename from regolith/templates/grpmeetings.html
rename to src/regolith/templates/grpmeetings.html
diff --git a/regolith/templates/index.html b/src/regolith/templates/index.html
similarity index 100%
rename from regolith/templates/index.html
rename to src/regolith/templates/index.html
diff --git a/regolith/templates/intbase.html b/src/regolith/templates/intbase.html
similarity index 100%
rename from regolith/templates/intbase.html
rename to src/regolith/templates/intbase.html
diff --git a/regolith/templates/intindex.html b/src/regolith/templates/intindex.html
similarity index 100%
rename from regolith/templates/intindex.html
rename to src/regolith/templates/intindex.html
diff --git a/regolith/templates/introot_index.html b/src/regolith/templates/introot_index.html
similarity index 100%
rename from regolith/templates/introot_index.html
rename to src/regolith/templates/introot_index.html
diff --git a/regolith/templates/job.html b/src/regolith/templates/job.html
similarity index 100%
rename from regolith/templates/job.html
rename to src/regolith/templates/job.html
diff --git a/regolith/templates/jobs.html b/src/regolith/templates/jobs.html
similarity index 100%
rename from regolith/templates/jobs.html
rename to src/regolith/templates/jobs.html
diff --git a/regolith/templates/jobs_closed.html b/src/regolith/templates/jobs_closed.html
similarity index 100%
rename from regolith/templates/jobs_closed.html
rename to src/regolith/templates/jobs_closed.html
diff --git a/regolith/templates/jobs_open.html b/src/regolith/templates/jobs_open.html
similarity index 100%
rename from regolith/templates/jobs_open.html
rename to src/regolith/templates/jobs_open.html
diff --git a/regolith/templates/naval_correspondence.tex b/src/regolith/templates/naval_correspondence.tex
similarity index 100%
rename from regolith/templates/naval_correspondence.tex
rename to src/regolith/templates/naval_correspondence.tex
diff --git a/regolith/templates/news.html b/src/regolith/templates/news.html
similarity index 100%
rename from regolith/templates/news.html
rename to src/regolith/templates/news.html
diff --git a/regolith/templates/people.html b/src/regolith/templates/people.html
similarity index 100%
rename from regolith/templates/people.html
rename to src/regolith/templates/people.html
diff --git a/regolith/templates/person.html b/src/regolith/templates/person.html
similarity index 100%
rename from regolith/templates/person.html
rename to src/regolith/templates/person.html
diff --git a/regolith/templates/postdocad.tex b/src/regolith/templates/postdocad.tex
similarity index 100%
rename from regolith/templates/postdocad.tex
rename to src/regolith/templates/postdocad.tex
diff --git a/regolith/templates/preslist.tex b/src/regolith/templates/preslist.tex
similarity index 100%
rename from regolith/templates/preslist.tex
rename to src/regolith/templates/preslist.tex
diff --git a/regolith/templates/preslist.txt b/src/regolith/templates/preslist.txt
similarity index 100%
rename from regolith/templates/preslist.txt
rename to src/regolith/templates/preslist.txt
diff --git a/regolith/templates/projects.html b/src/regolith/templates/projects.html
similarity index 100%
rename from regolith/templates/projects.html
rename to src/regolith/templates/projects.html
diff --git a/regolith/templates/propreport.txt b/src/regolith/templates/propreport.txt
similarity index 100%
rename from regolith/templates/propreport.txt
rename to src/regolith/templates/propreport.txt
diff --git a/regolith/templates/publist.tex b/src/regolith/templates/publist.tex
similarity index 100%
rename from regolith/templates/publist.tex
rename to src/regolith/templates/publist.tex
diff --git a/regolith/templates/publist_ackno.tex b/src/regolith/templates/publist_ackno.tex
similarity index 100%
rename from regolith/templates/publist_ackno.tex
rename to src/regolith/templates/publist_ackno.tex
diff --git a/regolith/templates/publist_nobold.tex b/src/regolith/templates/publist_nobold.tex
similarity index 100%
rename from regolith/templates/publist_nobold.tex
rename to src/regolith/templates/publist_nobold.tex
diff --git a/regolith/templates/publist_pandoc_friendly.tex b/src/regolith/templates/publist_pandoc_friendly.tex
similarity index 100%
rename from regolith/templates/publist_pandoc_friendly.tex
rename to src/regolith/templates/publist_pandoc_friendly.tex
diff --git a/regolith/templates/recentcollabs.csv b/src/regolith/templates/recentcollabs.csv
similarity index 100%
rename from regolith/templates/recentcollabs.csv
rename to src/regolith/templates/recentcollabs.csv
diff --git a/regolith/templates/refreport_author.txt b/src/regolith/templates/refreport_author.txt
similarity index 100%
rename from regolith/templates/refreport_author.txt
rename to src/regolith/templates/refreport_author.txt
diff --git a/regolith/templates/refreport_editor.txt b/src/regolith/templates/refreport_editor.txt
similarity index 100%
rename from regolith/templates/refreport_editor.txt
rename to src/regolith/templates/refreport_editor.txt
diff --git a/regolith/templates/reimb.xlsx b/src/regolith/templates/reimb.xlsx
similarity index 100%
rename from regolith/templates/reimb.xlsx
rename to src/regolith/templates/reimb.xlsx
diff --git a/regolith/templates/res_open.html b/src/regolith/templates/res_open.html
similarity index 100%
rename from regolith/templates/res_open.html
rename to src/regolith/templates/res_open.html
diff --git a/regolith/templates/resume.tex b/src/regolith/templates/resume.tex
similarity index 100%
rename from regolith/templates/resume.tex
rename to src/regolith/templates/resume.tex
diff --git a/regolith/templates/rlistbibfile.bib b/src/regolith/templates/rlistbibfile.bib
similarity index 100%
rename from regolith/templates/rlistbibfile.bib
rename to src/regolith/templates/rlistbibfile.bib
diff --git a/regolith/templates/rlistbibfile.txt b/src/regolith/templates/rlistbibfile.txt
similarity index 100%
rename from regolith/templates/rlistbibfile.txt
rename to src/regolith/templates/rlistbibfile.txt
diff --git a/regolith/templates/root_index.html b/src/regolith/templates/root_index.html
similarity index 100%
rename from regolith/templates/root_index.html
rename to src/regolith/templates/root_index.html
diff --git a/regolith/templates/rss.xml b/src/regolith/templates/rss.xml
similarity index 100%
rename from regolith/templates/rss.xml
rename to src/regolith/templates/rss.xml
diff --git a/regolith/tools.py b/src/regolith/tools.py
similarity index 100%
rename from regolith/tools.py
rename to src/regolith/tools.py
diff --git a/regolith/validators.py b/src/regolith/validators.py
similarity index 100%
rename from regolith/validators.py
rename to src/regolith/validators.py
diff --git a/regolith/version.py b/src/regolith/version.py
similarity index 100%
rename from regolith/version.py
rename to src/regolith/version.py


Test patch:
diff --git a/requirements/test.txt b/requirements/test.txt
index 5043224cb..ab09a129f 100644
--- a/requirements/test.txt
+++ b/requirements/test.txt
@@ -1,6 +1,8 @@
+flake8
 mock
 pytest
 coverage
 codecov
 requests-mock
 pytest-mock
+pytest-env
diff --git a/regolith/helpers/attestationshelper.py b/src/regolith/helpers/attestationshelper.py
similarity index 98%
rename from regolith/helpers/attestationshelper.py
rename to src/regolith/helpers/attestationshelper.py
index 671e4a7a0..0ca2ca0f5 100644
--- a/regolith/helpers/attestationshelper.py
+++ b/src/regolith/helpers/attestationshelper.py
@@ -9,12 +9,7 @@
 from regolith.fsclient import _id_key
 from regolith.helpers.basehelper import DbHelperBase
 from regolith.sorters import position_key
-from regolith.tools import (
-    all_docs_from_collection,
-    fuzzy_retrieval,
-    get_appointments,
-    merge_collections_superior,
-)
+from regolith.tools import all_docs_from_collection, fuzzy_retrieval, get_appointments, merge_collections_superior
 
 # print([k for k,v in chained_db['people'].items()])
 
diff --git a/tests/outputs/annual-activity/sbillinge.bib b/src/regolith/tests/__init__.py
similarity index 100%
rename from tests/outputs/annual-activity/sbillinge.bib
rename to src/regolith/tests/__init__.py
diff --git a/tests/bootstrap_builders.py b/src/regolith/tests/bootstrap_builders.py
similarity index 100%
rename from tests/bootstrap_builders.py
rename to src/regolith/tests/bootstrap_builders.py
diff --git a/tests/conftest.py b/src/regolith/tests/conftest.py
similarity index 100%
rename from tests/conftest.py
rename to src/regolith/tests/conftest.py
diff --git a/tests/outputs/a_expense/expenses.yaml b/src/regolith/tests/outputs/a_expense/expenses.yaml
similarity index 100%
rename from tests/outputs/a_expense/expenses.yaml
rename to src/regolith/tests/outputs/a_expense/expenses.yaml
diff --git a/tests/outputs/a_grppub_readlist/reading_lists.yaml b/src/regolith/tests/outputs/a_grppub_readlist/reading_lists.yaml
similarity index 100%
rename from tests/outputs/a_grppub_readlist/reading_lists.yaml
rename to src/regolith/tests/outputs/a_grppub_readlist/reading_lists.yaml
diff --git a/tests/outputs/a_manurev/refereeReports.yaml b/src/regolith/tests/outputs/a_manurev/refereeReports.yaml
similarity index 100%
rename from tests/outputs/a_manurev/refereeReports.yaml
rename to src/regolith/tests/outputs/a_manurev/refereeReports.yaml
diff --git a/tests/outputs/a_presentation/expenses.yaml b/src/regolith/tests/outputs/a_presentation/expenses.yaml
similarity index 100%
rename from tests/outputs/a_presentation/expenses.yaml
rename to src/regolith/tests/outputs/a_presentation/expenses.yaml
diff --git a/tests/outputs/a_presentation/presentations.yaml b/src/regolith/tests/outputs/a_presentation/presentations.yaml
similarity index 100%
rename from tests/outputs/a_presentation/presentations.yaml
rename to src/regolith/tests/outputs/a_presentation/presentations.yaml
diff --git a/tests/outputs/a_projectum/projecta.yaml b/src/regolith/tests/outputs/a_projectum/projecta.yaml
similarity index 100%
rename from tests/outputs/a_projectum/projecta.yaml
rename to src/regolith/tests/outputs/a_projectum/projecta.yaml
diff --git a/tests/outputs/a_proposal/proposals.yaml b/src/regolith/tests/outputs/a_proposal/proposals.yaml
similarity index 100%
rename from tests/outputs/a_proposal/proposals.yaml
rename to src/regolith/tests/outputs/a_proposal/proposals.yaml
diff --git a/tests/outputs/a_todo/todos.yaml b/src/regolith/tests/outputs/a_todo/todos.yaml
similarity index 100%
rename from tests/outputs/a_todo/todos.yaml
rename to src/regolith/tests/outputs/a_todo/todos.yaml
diff --git a/tests/outputs/annual-activity/sbillinge-ann-report.tex b/src/regolith/tests/outputs/annual-activity/sbillinge-ann-report.tex
similarity index 100%
rename from tests/outputs/annual-activity/sbillinge-ann-report.tex
rename to src/regolith/tests/outputs/annual-activity/sbillinge-ann-report.tex
diff --git a/tests/outputs/html/people/sbillinge.bib b/src/regolith/tests/outputs/annual-activity/sbillinge.bib
similarity index 100%
rename from tests/outputs/html/people/sbillinge.bib
rename to src/regolith/tests/outputs/annual-activity/sbillinge.bib
diff --git a/tests/outputs/beamplan/2020-1-XPD.tex b/src/regolith/tests/outputs/beamplan/2020-1-XPD.tex
similarity index 100%
rename from tests/outputs/beamplan/2020-1-XPD.tex
rename to src/regolith/tests/outputs/beamplan/2020-1-XPD.tex
diff --git a/tests/outputs/beamplan/2020-1-XPD.txt b/src/regolith/tests/outputs/beamplan/2020-1-XPD.txt
similarity index 100%
rename from tests/outputs/beamplan/2020-1-XPD.txt
rename to src/regolith/tests/outputs/beamplan/2020-1-XPD.txt
diff --git a/tests/outputs/current-pending/current-pending-ergs-scopatz.tex b/src/regolith/tests/outputs/current-pending/current-pending-ergs-scopatz.tex
similarity index 100%
rename from tests/outputs/current-pending/current-pending-ergs-scopatz.tex
rename to src/regolith/tests/outputs/current-pending/current-pending-ergs-scopatz.tex
diff --git a/tests/outputs/cv/scopatz.bib b/src/regolith/tests/outputs/cv/scopatz.bib
similarity index 100%
rename from tests/outputs/cv/scopatz.bib
rename to src/regolith/tests/outputs/cv/scopatz.bib
diff --git a/tests/outputs/cv/scopatz.tex b/src/regolith/tests/outputs/cv/scopatz.tex
similarity index 100%
rename from tests/outputs/cv/scopatz.tex
rename to src/regolith/tests/outputs/cv/scopatz.tex
diff --git a/tests/outputs/f_prum/projecta.yaml b/src/regolith/tests/outputs/f_prum/projecta.yaml
similarity index 100%
rename from tests/outputs/f_prum/projecta.yaml
rename to src/regolith/tests/outputs/f_prum/projecta.yaml
diff --git a/tests/outputs/f_todo/todos.yaml b/src/regolith/tests/outputs/f_todo/todos.yaml
similarity index 100%
rename from tests/outputs/f_todo/todos.yaml
rename to src/regolith/tests/outputs/f_todo/todos.yaml
diff --git a/tests/outputs/figure/figure_rend.tex b/src/regolith/tests/outputs/figure/figure_rend.tex
similarity index 100%
rename from tests/outputs/figure/figure_rend.tex
rename to src/regolith/tests/outputs/figure/figure_rend.tex
diff --git a/tests/outputs/formalletter/first_letter_nc.tex b/src/regolith/tests/outputs/formalletter/first_letter_nc.tex
similarity index 100%
rename from tests/outputs/formalletter/first_letter_nc.tex
rename to src/regolith/tests/outputs/formalletter/first_letter_nc.tex
diff --git a/tests/outputs/grant-report/SymPy-1.1_report_2017-04-01_2018-03-31.txt b/src/regolith/tests/outputs/grant-report/SymPy-1.1_report_2017-04-01_2018-03-31.txt
similarity index 100%
rename from tests/outputs/grant-report/SymPy-1.1_report_2017-04-01_2018-03-31.txt
rename to src/regolith/tests/outputs/grant-report/SymPy-1.1_report_2017-04-01_2018-03-31.txt
diff --git a/tests/outputs/helper/proposalReviews.yml b/src/regolith/tests/outputs/helper/proposalReviews.yml
similarity index 100%
rename from tests/outputs/helper/proposalReviews.yml
rename to src/regolith/tests/outputs/helper/proposalReviews.yml
diff --git a/tests/outputs/html/.nojekyll b/src/regolith/tests/outputs/html/.nojekyll
similarity index 100%
rename from tests/outputs/html/.nojekyll
rename to src/regolith/tests/outputs/html/.nojekyll
diff --git a/tests/outputs/html/abstracts/Mouginot.Model.html b/src/regolith/tests/outputs/html/abstracts/Mouginot.Model.html
similarity index 100%
rename from tests/outputs/html/abstracts/Mouginot.Model.html
rename to src/regolith/tests/outputs/html/abstracts/Mouginot.Model.html
diff --git a/tests/outputs/html/blog/index.html b/src/regolith/tests/outputs/html/blog/index.html
similarity index 100%
rename from tests/outputs/html/blog/index.html
rename to src/regolith/tests/outputs/html/blog/index.html
diff --git a/tests/outputs/html/blog/my-vision.html b/src/regolith/tests/outputs/html/blog/my-vision.html
similarity index 100%
rename from tests/outputs/html/blog/my-vision.html
rename to src/regolith/tests/outputs/html/blog/my-vision.html
diff --git a/tests/outputs/html/blog/rss.xml b/src/regolith/tests/outputs/html/blog/rss.xml
similarity index 100%
rename from tests/outputs/html/blog/rss.xml
rename to src/regolith/tests/outputs/html/blog/rss.xml
diff --git a/tests/outputs/html/former/index.html b/src/regolith/tests/outputs/html/former/index.html
similarity index 100%
rename from tests/outputs/html/former/index.html
rename to src/regolith/tests/outputs/html/former/index.html
diff --git a/tests/outputs/html/group.bib b/src/regolith/tests/outputs/html/group.bib
similarity index 100%
rename from tests/outputs/html/group.bib
rename to src/regolith/tests/outputs/html/group.bib
diff --git a/tests/outputs/html/index.html b/src/regolith/tests/outputs/html/index.html
similarity index 100%
rename from tests/outputs/html/index.html
rename to src/regolith/tests/outputs/html/index.html
diff --git a/tests/outputs/html/jobs/0004.html b/src/regolith/tests/outputs/html/jobs/0004.html
similarity index 100%
rename from tests/outputs/html/jobs/0004.html
rename to src/regolith/tests/outputs/html/jobs/0004.html
diff --git a/tests/outputs/html/jobs/index.html b/src/regolith/tests/outputs/html/jobs/index.html
similarity index 100%
rename from tests/outputs/html/jobs/index.html
rename to src/regolith/tests/outputs/html/jobs/index.html
diff --git a/tests/outputs/html/people/index.html b/src/regolith/tests/outputs/html/people/index.html
similarity index 100%
rename from tests/outputs/html/people/index.html
rename to src/regolith/tests/outputs/html/people/index.html
diff --git a/tests/outputs/internalhtml/.nojekyll b/src/regolith/tests/outputs/html/people/sbillinge.bib
similarity index 100%
rename from tests/outputs/internalhtml/.nojekyll
rename to src/regolith/tests/outputs/html/people/sbillinge.bib
diff --git a/tests/outputs/html/people/sbillinge.html b/src/regolith/tests/outputs/html/people/sbillinge.html
similarity index 100%
rename from tests/outputs/html/people/sbillinge.html
rename to src/regolith/tests/outputs/html/people/sbillinge.html
diff --git a/tests/outputs/html/people/scopatz.bib b/src/regolith/tests/outputs/html/people/scopatz.bib
similarity index 100%
rename from tests/outputs/html/people/scopatz.bib
rename to src/regolith/tests/outputs/html/people/scopatz.bib
diff --git a/tests/outputs/html/people/scopatz.html b/src/regolith/tests/outputs/html/people/scopatz.html
similarity index 100%
rename from tests/outputs/html/people/scopatz.html
rename to src/regolith/tests/outputs/html/people/scopatz.html
diff --git a/tests/outputs/html/projects.html b/src/regolith/tests/outputs/html/projects.html
similarity index 100%
rename from tests/outputs/html/projects.html
rename to src/regolith/tests/outputs/html/projects.html
diff --git a/src/regolith/tests/outputs/internalhtml/.nojekyll b/src/regolith/tests/outputs/internalhtml/.nojekyll
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/outputs/internalhtml/grpmeetings.html b/src/regolith/tests/outputs/internalhtml/grpmeetings.html
similarity index 100%
rename from tests/outputs/internalhtml/grpmeetings.html
rename to src/regolith/tests/outputs/internalhtml/grpmeetings.html
diff --git a/tests/outputs/internalhtml/intindex.html b/src/regolith/tests/outputs/internalhtml/intindex.html
similarity index 100%
rename from tests/outputs/internalhtml/intindex.html
rename to src/regolith/tests/outputs/internalhtml/intindex.html
diff --git a/tests/outputs/preslist/presentations-ergs-scopatz.tex b/src/regolith/tests/outputs/preslist/presentations-ergs-scopatz.tex
similarity index 100%
rename from tests/outputs/preslist/presentations-ergs-scopatz.tex
rename to src/regolith/tests/outputs/preslist/presentations-ergs-scopatz.tex
diff --git a/tests/outputs/publist/scopatz.bib b/src/regolith/tests/outputs/publist/scopatz.bib
similarity index 100%
rename from tests/outputs/publist/scopatz.bib
rename to src/regolith/tests/outputs/publist/scopatz.bib
diff --git a/tests/outputs/publist/scopatz.tex b/src/regolith/tests/outputs/publist/scopatz.tex
similarity index 100%
rename from tests/outputs/publist/scopatz.tex
rename to src/regolith/tests/outputs/publist/scopatz.tex
diff --git a/tests/outputs/publist/scopatz_ackno.bib b/src/regolith/tests/outputs/publist/scopatz_ackno.bib
similarity index 100%
rename from tests/outputs/publist/scopatz_ackno.bib
rename to src/regolith/tests/outputs/publist/scopatz_ackno.bib
diff --git a/tests/outputs/publist/scopatz_ackno.tex b/src/regolith/tests/outputs/publist/scopatz_ackno.tex
similarity index 100%
rename from tests/outputs/publist/scopatz_ackno.tex
rename to src/regolith/tests/outputs/publist/scopatz_ackno.tex
diff --git a/tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii.tex b/src/regolith/tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii.tex
similarity index 100%
rename from tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii.tex
rename to src/regolith/tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii.tex
diff --git a/tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii_ackno.tex b/src/regolith/tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii_ackno.tex
similarity index 100%
rename from tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii_ackno.tex
rename to src/regolith/tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii_ackno.tex
diff --git a/tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii_nobold.tex b/src/regolith/tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii_nobold.tex
similarity index 100%
rename from tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii_nobold.tex
rename to src/regolith/tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii_nobold.tex
diff --git a/tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii_pandoc.tex b/src/regolith/tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii_pandoc.tex
similarity index 100%
rename from tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii_pandoc.tex
rename to src/regolith/tests/outputs/publist/scopatz_from2016-01-01_to2018-12-01_facility_nslsii_pandoc.tex
diff --git a/tests/outputs/publist/scopatz_nobold.bib b/src/regolith/tests/outputs/publist/scopatz_nobold.bib
similarity index 100%
rename from tests/outputs/publist/scopatz_nobold.bib
rename to src/regolith/tests/outputs/publist/scopatz_nobold.bib
diff --git a/tests/outputs/publist/scopatz_nobold.tex b/src/regolith/tests/outputs/publist/scopatz_nobold.tex
similarity index 100%
rename from tests/outputs/publist/scopatz_nobold.tex
rename to src/regolith/tests/outputs/publist/scopatz_nobold.tex
diff --git a/tests/outputs/publist/scopatz_pandoc.tex b/src/regolith/tests/outputs/publist/scopatz_pandoc.tex
similarity index 100%
rename from tests/outputs/publist/scopatz_pandoc.tex
rename to src/regolith/tests/outputs/publist/scopatz_pandoc.tex
diff --git a/tests/outputs/recent-collabs/scopatz_doe.xlsx b/src/regolith/tests/outputs/recent-collabs/scopatz_doe.xlsx
similarity index 100%
rename from tests/outputs/recent-collabs/scopatz_doe.xlsx
rename to src/regolith/tests/outputs/recent-collabs/scopatz_doe.xlsx
diff --git a/tests/outputs/recent-collabs/scopatz_nsf.xlsx b/src/regolith/tests/outputs/recent-collabs/scopatz_nsf.xlsx
similarity index 100%
rename from tests/outputs/recent-collabs/scopatz_nsf.xlsx
rename to src/regolith/tests/outputs/recent-collabs/scopatz_nsf.xlsx
diff --git a/tests/outputs/reimb/test.xlsx b/src/regolith/tests/outputs/reimb/test.xlsx
similarity index 100%
rename from tests/outputs/reimb/test.xlsx
rename to src/regolith/tests/outputs/reimb/test.xlsx
diff --git a/tests/outputs/resume/scopatz.bib b/src/regolith/tests/outputs/resume/scopatz.bib
similarity index 100%
rename from tests/outputs/resume/scopatz.bib
rename to src/regolith/tests/outputs/resume/scopatz.bib
diff --git a/tests/outputs/resume/scopatz.tex b/src/regolith/tests/outputs/resume/scopatz.tex
similarity index 100%
rename from tests/outputs/resume/scopatz.tex
rename to src/regolith/tests/outputs/resume/scopatz.tex
diff --git a/tests/outputs/review-man/1902nature_sbillinge_author.txt b/src/regolith/tests/outputs/review-man/1902nature_sbillinge_author.txt
similarity index 100%
rename from tests/outputs/review-man/1902nature_sbillinge_author.txt
rename to src/regolith/tests/outputs/review-man/1902nature_sbillinge_author.txt
diff --git a/tests/outputs/review-man/1902nature_sbillinge_editor.txt b/src/regolith/tests/outputs/review-man/1902nature_sbillinge_editor.txt
similarity index 100%
rename from tests/outputs/review-man/1902nature_sbillinge_editor.txt
rename to src/regolith/tests/outputs/review-man/1902nature_sbillinge_editor.txt
diff --git a/tests/outputs/review-prop/1906doeExample_sbillinge.txt b/src/regolith/tests/outputs/review-prop/1906doeExample_sbillinge.txt
similarity index 100%
rename from tests/outputs/review-prop/1906doeExample_sbillinge.txt
rename to src/regolith/tests/outputs/review-prop/1906doeExample_sbillinge.txt
diff --git a/tests/outputs/review-prop/1906nsfExample_sbillinge.txt b/src/regolith/tests/outputs/review-prop/1906nsfExample_sbillinge.txt
similarity index 100%
rename from tests/outputs/review-prop/1906nsfExample_sbillinge.txt
rename to src/regolith/tests/outputs/review-prop/1906nsfExample_sbillinge.txt
diff --git a/tests/outputs/u_contact/contacts.yaml b/src/regolith/tests/outputs/u_contact/contacts.yaml
similarity index 100%
rename from tests/outputs/u_contact/contacts.yaml
rename to src/regolith/tests/outputs/u_contact/contacts.yaml
diff --git a/tests/outputs/u_institutions/institutions.yaml b/src/regolith/tests/outputs/u_institutions/institutions.yaml
similarity index 100%
rename from tests/outputs/u_institutions/institutions.yaml
rename to src/regolith/tests/outputs/u_institutions/institutions.yaml
diff --git a/tests/outputs/u_logurl/projecta.yaml b/src/regolith/tests/outputs/u_logurl/projecta.yaml
similarity index 100%
rename from tests/outputs/u_logurl/projecta.yaml
rename to src/regolith/tests/outputs/u_logurl/projecta.yaml
diff --git a/tests/outputs/u_milestone/projecta.yaml b/src/regolith/tests/outputs/u_milestone/projecta.yaml
similarity index 100%
rename from tests/outputs/u_milestone/projecta.yaml
rename to src/regolith/tests/outputs/u_milestone/projecta.yaml
diff --git a/tests/outputs/u_todo/todos.yaml b/src/regolith/tests/outputs/u_todo/todos.yaml
similarity index 100%
rename from tests/outputs/u_todo/todos.yaml
rename to src/regolith/tests/outputs/u_todo/todos.yaml
diff --git a/tests/test_broker.py b/src/regolith/tests/test_broker.py
similarity index 100%
rename from tests/test_broker.py
rename to src/regolith/tests/test_broker.py
diff --git a/tests/test_builders.py b/src/regolith/tests/test_builders.py
similarity index 100%
rename from tests/test_builders.py
rename to src/regolith/tests/test_builders.py
diff --git a/tests/test_chain_db.py b/src/regolith/tests/test_chain_db.py
similarity index 100%
rename from tests/test_chain_db.py
rename to src/regolith/tests/test_chain_db.py
diff --git a/tests/test_client_manager.py b/src/regolith/tests/test_client_manager.py
similarity index 100%
rename from tests/test_client_manager.py
rename to src/regolith/tests/test_client_manager.py
diff --git a/tests/test_commands.py b/src/regolith/tests/test_commands.py
similarity index 97%
rename from tests/test_commands.py
rename to src/regolith/tests/test_commands.py
index f395a710e..e0a2cc77a 100644
--- a/tests/test_commands.py
+++ b/src/regolith/tests/test_commands.py
@@ -12,7 +12,7 @@
 from regolith.main import main
 from regolith.mongoclient import load_mongo_col
 from regolith.runcontrol import DEFAULT_RC, load_rcfile
-from tests.conftest import ALTERNATE_REGOLITH_MONGODB_NAME, FS_DB_NAME
+from regolith.tests.conftest import ALTERNATE_REGOLITH_MONGODB_NAME, FS_DB_NAME
 
 BILLINGE_TEST = False  # special tests for Billinge group, switch it to False before push to remote
 
diff --git a/tests/test_dates.py b/src/regolith/tests/test_dates.py
similarity index 100%
rename from tests/test_dates.py
rename to src/regolith/tests/test_dates.py
diff --git a/tests/test_fsclient.py b/src/regolith/tests/test_fsclient.py
similarity index 100%
rename from tests/test_fsclient.py
rename to src/regolith/tests/test_fsclient.py
diff --git a/tests/test_helpers.py b/src/regolith/tests/test_helpers.py
similarity index 100%
rename from tests/test_helpers.py
rename to src/regolith/tests/test_helpers.py
diff --git a/tests/test_main.py b/src/regolith/tests/test_main.py
similarity index 100%
rename from tests/test_main.py
rename to src/regolith/tests/test_main.py
diff --git a/tests/test_runcontrol.py b/src/regolith/tests/test_runcontrol.py
similarity index 100%
rename from tests/test_runcontrol.py
rename to src/regolith/tests/test_runcontrol.py
diff --git a/tests/test_schemas.py b/src/regolith/tests/test_schemas.py
similarity index 100%
rename from tests/test_schemas.py
rename to src/regolith/tests/test_schemas.py
diff --git a/tests/test_storage.py b/src/regolith/tests/test_storage.py
similarity index 100%
rename from tests/test_storage.py
rename to src/regolith/tests/test_storage.py
diff --git a/tests/test_tools.py b/src/regolith/tests/test_tools.py
similarity index 100%
rename from tests/test_tools.py
rename to src/regolith/tests/test_tools.py
diff --git a/tests/test_validate.py b/src/regolith/tests/test_validate.py
similarity index 100%
rename from tests/test_validate.py
rename to src/regolith/tests/test_validate.py
diff --git a/tests/test_validators.py b/src/regolith/tests/test_validators.py
similarity index 100%
rename from tests/test_validators.py
rename to src/regolith/tests/test_validators.py