diff --git a/docs/docs.html.in b/docs/docs.html.in
index 142c79bfa9823fff7ddb15f858eb1dabdc05f205..6bdf0c32b82b40b4b41d5970744ad2f92ba01db0 100644
--- a/docs/docs.html.in
+++ b/docs/docs.html.in
@@ -172,6 +172,9 @@
Functional testing
Testing libvirt with TCK test suite and
Libvirt-test-API
+
+ New repo setup
+ Procedure for configuring new git repositories for libvirt
diff --git a/docs/newreposetup.rst b/docs/newreposetup.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ce54aa09d33e0e3b65e02bed98d0f89211df7436
--- /dev/null
+++ b/docs/newreposetup.rst
@@ -0,0 +1,137 @@
+===============================
+Repository infrastructure setup
+===============================
+
+GitLab Configuration
+====================
+
+The `GitLab organization `_ hosts the master copy
+of all the libvirt Git repositories.
+
+When creating a new repository the following changes to the defaults are
+required under the **Settings** page:
+
+* **General**
+
+ * **Naming, topics, avatar**
+
+ * *Project avatar*: upload ``docs/logos/logo-square-256.png``
+
+ * **Visibility, project features, permissions**
+
+ * *Packages*: disabled
+
+ * *Wiki*: disabled
+
+ * *Snippets*: disabled
+
+ * **Merge Requests**
+
+ * *Merge method*: Fast-forward merge
+
+ * *Merge options*: Enable 'delete source branch' option by default
+
+ * *Merge checks*: Pipelines must succeed
+
+ * **Merge request approvals**
+
+ * *Any eligible user*: Num approvals required == 1
+
+* **Integrations**
+
+ * **Pipelines emails**
+
+ * *Recipients*: ``libvirt-ci@redhat.com``
+
+* **Repository**
+
+ * **Push rules**
+
+ * *Do not allow users to remove git tags with git push*: enabled
+
+ * *Commit message*: ``Signed-off-by:``
+
+ * *Branch name*: ``^(master|v.*-maint)$``
+
+ * **Mirroring repositories**
+
+ * *Git repository URL*: ``https://libvirtmirror@github.com/libvirt/$repo.git``
+
+ * *Mirror direction*: push
+
+ * *Password*: see ``/root/libvirt-mirror-github-api-token.txt`` on ``libvirt.org``
+
+ * **Protected branches**
+
+ * *Branch*: ``master``
+
+ * *Allowed to merge*: Developers + Maintainers
+
+ * *Allowed to push*: None (or Developers + Maintainers if MRs not used)
+
+ * *Require approval from code owners*: disabled
+
+GitHub configuration
+====================
+
+The `GitHub organization `_ hosts read-only
+mirrors of all the libvirt Git repositories.
+
+When creating a new repository the following changes to the defaults are
+required under the **Settings** page:
+
+* **Options**
+
+ * **Features**
+
+ * *Wikis*: disabled
+
+ * *Sponsorships*: disabled
+
+ * *Projects*: disabled
+
+ * **Manage access**
+
+ * Add the ``@committers`` team with the role "Write", which
+ grants the ``libvirtmirror`` user access to sync from GitLab.
+
+ * **Integrations**
+
+ * Check for *Repo Lockdown* (should be set automatically for all projects)
+
+In the master git repository create a file `.github/lockdown.yml` to restrict
+use of issue tracker and pull requests.
+
+
+libvirt.org
+===========
+
+The `libvirt project server `_ hosts read-only mirrors of
+all the libvirt Git repositories in the directory ``/data/git``.
+
+When creating a new repository the following steps are required:
+
+* Create repo with
+ ::
+
+ $ sudo su -
+ # cd /data/git
+ # mkdir $repo.git
+ # cd $repo.git
+ # git init --bare
+ # touch export
+ # touch git-daemon-export-ok
+ # cd ..
+ # chown -R gitmirror.gitmirror $repo.git
+ # chmod -R g+w $repo.git
+ # find -type d $repo.git | xargs chmod g+s
+
+* Set the ``description`` and ``config`` files following other repos' example
+
+* Setup mirroring
+ ::
+
+ $ sudo su - gitmirror
+ # ./newrepo.sh /data/git/$repo.git
+ # cd mirrors
+ # $HOME/sync-one.sh $repo.git