summaryrefslogtreecommitdiffstats
path: root/comm/docs
diff options
context:
space:
mode:
Diffstat (limited to 'comm/docs')
-rw-r--r--comm/docs/Makefile32
-rw-r--r--comm/docs/README.md18
-rw-r--r--comm/docs/_addons/bzlink.py63
-rw-r--r--comm/docs/_static/custom_theme.css71
-rw-r--r--comm/docs/_templates/breadcrumbs.html14
-rw-r--r--comm/docs/conf.py69
-rw-r--r--comm/docs/index.rst24
-rw-r--r--comm/docs/l10n/fluent_migrations.md190
-rw-r--r--comm/docs/l10n/index.md16
-rw-r--r--comm/docs/l10n/testing_migrations.md39
-rw-r--r--comm/docs/mots/index.rst630
-rw-r--r--comm/docs/requirements.in4
-rw-r--r--comm/docs/requirements.txt86
13 files changed, 1256 insertions, 0 deletions
diff --git a/comm/docs/Makefile b/comm/docs/Makefile
new file mode 100644
index 0000000000..a9bc6a02c3
--- /dev/null
+++ b/comm/docs/Makefile
@@ -0,0 +1,32 @@
+# Minimal makefile for Sphinx documentation
+#
+
+VENV = _venv
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= ./$(VENV)/bin/sphinx-build
+SOURCEDIR = .
+BUILDDIR = _build
+
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+venv: Makefile
+ python -m venv --upgrade-deps $(VENV)
+ ./$(VENV)/bin/pip install -r requirements.txt
+
+
+clean:
+ @rm -rf $(VENV) $(BUILDDIR)
+
+
+.PHONY: help Makefile $(SPHINXBUILD)
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: $(SPHINXBUILD)
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/comm/docs/README.md b/comm/docs/README.md
new file mode 100644
index 0000000000..4ffb083903
--- /dev/null
+++ b/comm/docs/README.md
@@ -0,0 +1,18 @@
+# Building documentation locally
+
+This process will improve over time.
+
+For now, manually create a Python virtual environment and install the
+dependencies:
+
+```shell
+make venv
+```
+
+The virtualenv will be created in **_venv**.
+
+Then to build the documentation:
+
+```shell
+make html
+```
diff --git a/comm/docs/_addons/bzlink.py b/comm/docs/_addons/bzlink.py
new file mode 100644
index 0000000000..6bdbdac8c5
--- /dev/null
+++ b/comm/docs/_addons/bzlink.py
@@ -0,0 +1,63 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import re
+
+from docutils.nodes import Text, paragraph, reference
+from sphinx.transforms import SphinxTransform
+
+
+class ConvertBugsToLinks(SphinxTransform):
+ # Convert text entries in paragraphs that are in the style of "bug xxxxx"
+ # to a hyperlink that leads to the appropriate bugzilla bug link.
+
+ default_priority = 400
+ bz_url = "https://bugzilla.mozilla.org/show_bug.cgi?id={0}"
+ bz_reg = r"bug[' '][0-9]\d*"
+
+ def apply(self):
+ def check_if_paragraph(o):
+ return isinstance(o, paragraph)
+
+ def check_if_text(o):
+ return (
+ not isinstance(o.parent, reference)
+ and isinstance(o, Text)
+ and re.search(self.bz_reg, o, re.IGNORECASE)
+ )
+
+ changed = True
+ while changed:
+ changed = self.textToReferences(check_if_paragraph, check_if_text)
+ return
+
+ def textToReferences(self, check_if_paragraph, check_if_text):
+ # Analyses the document and replaces from the paragraph nodes
+ # the Text element(s) that contain bz_reg matching strings.
+ # Whevever the matching strings are more than one and
+ # a correction is made, the function returns True.
+
+ for node in self.document.traverse(check_if_paragraph):
+ for text in node.traverse(check_if_text):
+ bugs = re.findall(self.bz_reg, text, re.IGNORECASE)
+ if len(bugs) == 0:
+ continue
+ bug = bugs[0]
+ txtparts = text.split(bug, 1)
+ new_ref = reference(
+ bug,
+ bug,
+ refuri=self.bz_url.format(bug.split()[1]),
+ )
+ txt_0 = Text(txtparts[0])
+ txt_1 = Text(txtparts[1])
+ text.parent.replace(text, [txt_0, new_ref, txt_1])
+ if len(bugs) > 1:
+ return True
+ return False
+
+
+def setup(app):
+ app.add_transform(ConvertBugsToLinks)
+ return
diff --git a/comm/docs/_static/custom_theme.css b/comm/docs/_static/custom_theme.css
new file mode 100644
index 0000000000..c8e34c03ca
--- /dev/null
+++ b/comm/docs/_static/custom_theme.css
@@ -0,0 +1,71 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* Increase the size of the content */
+.wy-nav-content {
+ max-width: 80% !important;
+}
+
+/* Increase the size of the tables */
+table.docutils {
+ width: 90%;
+}
+
+/* Override the default values for multiline text in a table */
+table.docutils td, table.docutils th
+{
+ font-size: 16px !important;
+}
+
+.rst-content .line-block {
+ margin-bottom: 0px !important;
+}
+
+/* Add the strikethrough feature */
+span.strikethrough {
+ text-decoration: line-through;
+}
+
+/* Better control over the table on this page */
+.matcher-cookbook td {
+ white-space: break-spaces !important;
+}
+
+.wy-table-responsive table td, .wy-table-responsive table th {
+ white-space: normal;
+}
+
+img.center {
+ display: block;
+ margin: auto;
+}
+
+img.border {
+ border: 1px solid black;
+ display: block;
+ margin: auto;
+}
+
+.center {
+ text-align: center;
+}
+
+/* Keyboard shortcuts styling */
+kbd {
+ background: linear-gradient(180deg,#f4f4f4,#d5d5d5);
+ background-color: #f4f4f4;
+ border: 1px solid #d5d5d5;
+ border-radius: 6px;
+ font-family: consolas,"Liberation Mono",courier,monospace;
+ font-size: .9rem;
+ font-weight: 700;
+ line-height: 2.3;
+ margin: 3px;
+ padding: 4px 6px 1px 6px;
+ white-space: nowrap;
+}
+
+table.docutils {
+ width: 100%;
+}
diff --git a/comm/docs/_templates/breadcrumbs.html b/comm/docs/_templates/breadcrumbs.html
new file mode 100644
index 0000000000..27bf66b65b
--- /dev/null
+++ b/comm/docs/_templates/breadcrumbs.html
@@ -0,0 +1,14 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ - You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+{%- extends "sphinx_rtd_theme/breadcrumbs.html" %}
+
+{% block breadcrumbs_aside %}
+<li class="wy-breadcrumbs-aside">
+ <a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Thunderbird&component=General&short_desc=Documentation+issue+on+{{ pagename }}&comment=URL+=+https://thunderbird-source-docs.readthedocs.io/{{ pagename }}.html&bug_file_loc=https://thunderbird-source-docs.readthedocs.io/{{ pagename }}.html" rel="nofollow">Report an issue</a> /
+ {%- if show_source and has_source and sourcename %}
+ <a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> {{ _('View page source') }}</a>
+ {%- endif %}
+</li>
+{% endblock %}
diff --git a/comm/docs/conf.py b/comm/docs/conf.py
new file mode 100644
index 0000000000..fc9c1fb9b3
--- /dev/null
+++ b/comm/docs/conf.py
@@ -0,0 +1,69 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Configuration file for the Sphinx documentation builder.
+
+import os
+import sys
+
+# Set up Python environment to load build system packages.
+OUR_DIR = os.path.dirname(__file__)
+topsrcdir = os.path.normpath(os.path.join(OUR_DIR, ".."))
+
+
+project = "Thunderbird Source Docs"
+html_show_copyright = False
+author = "Thunderbird Developers"
+
+EXTRA_PATHS = ("docs/_addons",)
+
+sys.path[:0] = [os.path.join(topsrcdir, p) for p in EXTRA_PATHS]
+
+sys.path.insert(0, OUR_DIR)
+
+extensions = [
+ "myst_parser",
+ "sphinx.ext.autodoc",
+ "sphinx.ext.autosectionlabel",
+ "sphinx.ext.doctest",
+ "sphinx.ext.graphviz",
+ "sphinx.ext.napoleon",
+ "sphinx.ext.todo",
+ "bzlink",
+]
+
+myst_enable_extensions = [
+ "deflist",
+ "fieldlist",
+ "html_admonition",
+ "html_image",
+ "linkify",
+ "replacements",
+ "smartquotes",
+ "strikethrough",
+ "tasklist",
+]
+
+myst_linkify_fuzzy_links = False
+myst_heading_anchors = 2
+
+templates_path = ["_templates"]
+source_suffix = [".rst", ".md"]
+exclude_patterns = [
+ "_build",
+ "Thumbs.db",
+ ".DS_Store",
+ "_staging",
+ "_venv",
+ "README.md",
+]
+
+html_theme = "sphinx_rtd_theme"
+html_static_path = ["_static"]
+
+autosectionlabel_maxdepth = 1
+
+
+def setup(app):
+ app.add_css_file("custom_theme.css")
diff --git a/comm/docs/index.rst b/comm/docs/index.rst
new file mode 100644
index 0000000000..02be507b3f
--- /dev/null
+++ b/comm/docs/index.rst
@@ -0,0 +1,24 @@
+.. Thunderbird documentation master file, created by
+ sphinx-quickstart on Thu Sep 15 02:19:30 2022.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Thunderbird Source Tree Documentation
+=====================================
+
+.. toctree::
+ :caption: Project Information
+ :maxdepth: 1
+
+ mots/index
+
+ l10n/index
+
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/comm/docs/l10n/fluent_migrations.md b/comm/docs/l10n/fluent_migrations.md
new file mode 100644
index 0000000000..13639ca187
--- /dev/null
+++ b/comm/docs/l10n/fluent_migrations.md
@@ -0,0 +1,190 @@
+# Migrating Strings to Fluent Files
+
+Like [Firefox](https://firefox-source-docs.mozilla.org/l10n/migrations/index.html),
+Thunderbird developers are working on migrating strings from legacy formats to
+Fluent. The process is very similar to how migrations are done for Firefox. The
+differences are detailed below.
+
+## Migration Recipes
+
+When part of Thunderbird’s UI is migrated to Fluent, a migration recipe should
+be included in the same patch that adds new strings to .ftl files. Recipies are
+stored in [comm-central](https://hg.mozilla.org/comm-central/file/tip/python/l10n/tb_fluent_migrations).
+After a patch with migrations landed, it will be run for all locales as part of
+the [Thunderbird Cross-Channel string quarantining process](cross_channel.md).
+
+Be sure to read [Migrating Legacy Formats](https://firefox-source-docs.mozilla.org/l10n/migrations/legacy.html)
+along with the below example.
+
+The migration recipe’s filename should start with a reference to the associated
+bug number, and include a brief description of the bug, e.g. `bug_1805746_calendar_view.py`
+for the below example.
+
+### Example: Migrate Multiple DTD strings to Fluent
+
+Often, strings are migrated as part of ongoing UI work to convert XUL code
+to HTML. Multiple DTD strings may convert to a single Fluent string with
+attributes. It really depends on the document structure and what the UI changes
+are doing.
+
+**Legacy strings are in `comm/calendar/locales/en-US/chrome/calendar/calendar.dtd`**
+
+```dtd
+<!ENTITY calendar.day.button.tooltip "Switch to day view" >
+<!ENTITY calendar.day.button.label "Day" >
+```
+
+**The (simplified) XUL code**
+
+```xml
+<radio id="calendar-day-view-button"
+ label="&calendar.day.button.label;"
+ tooltiptext="&calendar.day.button.tooltip;" />
+```
+
+**The new HTML**
+
+```html
+<button id="calTabDay" data-l10n-id="calendar-view-toggle-day"></button>
+```
+
+**The new FTL string**
+
+```fluent
+calendar-view-toggle-day = Day
+ .title = Switch to day view
+```
+
+**Renders as:**
+
+```html
+<button id="calTabDay" title="Switch to day view">Day</button>
+```
+
+This case migrates two DTD strings, `calendar.day.button.label` and `calendar.day.button.tooltip`
+to create a single FTL string, `calendar-view-toggle-day`, with one (`title`)
+attribute.
+
+**The migration recipe:**
+
+```python
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+from fluent.migratetb.helpers import transforms_from
+from fluent.migratetb import COPY
+
+def migrate(ctx):
+ """Bug 1805746 - Update Calendar View selection part {index}."""
+ target = reference = "calendar/calendar/calendar-widgets.ftl"
+ source = "calendar/chrome/calendar/calendar.dtd"
+
+ ctx.add_transforms(
+ target,
+ reference,
+ transforms_from(
+ """
+calendar-view-toggle-day = { COPY(from_path, "calendar.day.button.label") }
+ .title = { COPY(from_path, "calendar.day.button.tooltip") }
+""",
+ from_path=source,
+ ),
+ )
+```
+
+Migrations are Python modules, and implement
+a single `migrate(MigrationContext)` function. The `migrate()` function makes
+calls into `MigrationContext.add_transforms()`.
+
+The `add_transforms()` function takes three arguments:
+- `target_path`: Path to the target l10n file
+- `reference_path`: Path to the reference (en-US) file
+- A list of Transforms, the `source_path` (legacy translated strings file) is
+ set here
+
+```{note}
+For Thunderbird migrations, the target and reference path are the same.
+```
+
+Transforms are rather dense AST nodes. See
+[Transforms](https://firefox-source-docs.mozilla.org/l10n/migrations/overview.html#transforms)
+for the exact details.
+
+There are some helper functions that simplify creating the ASTs. The above example uses the
+`transforms_from()` helper function. It is equivalent to:
+
+```python
+target = reference = "calendar/calendar/calendar-widgets.ftl"
+source = "calendar/chrome/calendar/calendar.dtd"
+
+ctx.add_transforms(
+ target,
+ reference,
+ [
+ FTL.Message(
+ id=FTL.Identifier("calendar-view-toggle-day"),
+ value=COPY(source, "calendar.day.button.label"),
+ attributes=[
+ FTL.Attribute(
+ id=FTL.Identifier("title"),
+ value=COPY(
+ source,
+ "calendar.day.button.tooltip"
+ )
+ )
+ ]
+ )
+ ]
+)
+```
+
+`transforms_from()` allows copying reference FTL strings, and replacing the value
+of each message with a `COPY` Transform that copies values from the DTD file at
+`from_path`.
+
+There are other Transforms like `COPY`. See
+[Migrating Legacy Formats](https://firefox-source-docs.mozilla.org/l10n/migrations/legacy.html)
+for usage information.
+
+### Thunderbird migration helpers
+
+The `REPLACE` works with `transforms_from` if provided the extra context that
+it needs.
+
+Starting with `aboutDialog.dtd` containing:
+
+```xml
+<!ENTITY update.updateButton.label3 "Restart to update &brandShorterName;">
+```
+
+```python
+from fluent.migratetb.helpers import TERM_REFERENCE, transforms_from
+
+# This can't just be a straight up literal dict (eg: {"a":"b"}) because the
+# validator fails... so make it a function call that returns a dict.. it works
+about_replacements = dict({
+ "&brandShorterName;": TERM_REFERENCE("brand-shorter-name"),
+})
+
+
+def migrate(ctx):
+ """Bug 1816532 - Migrate aboutDialog.dtd strings to Fluent, part {index}"""
+ target = reference = "mail/messenger/aboutDialog.ftl"
+ source = "mail/chrome/messenger/aboutDialog.dtd"
+
+ ctx.add_transforms(
+ target,
+ reference,
+ transforms_from(
+ """
+update-update-button = { REPLACE(source, "update.updateButton.label3", about_replacements) }
+ .accesskey = { COPY(source, "update.updateButton.accesskey") }
+""", source=source, about_replacements=about_replacements))
+```
+
+The resulting `aboutDialog.ftl` will get:
+
+```ftl
+update-update-button = Restart to update { -brand-shorter-name }
+ .accesskey = R
+```
diff --git a/comm/docs/l10n/index.md b/comm/docs/l10n/index.md
new file mode 100644
index 0000000000..7b29d4a270
--- /dev/null
+++ b/comm/docs/l10n/index.md
@@ -0,0 +1,16 @@
+# Localization
+
+At Mozilla, localization refers to adapting the user interface and messages
+to different cultural and regional needs. Localization is a broader term than
+translation because it involves extensive research into the target culture, and
+in result touches not only text and UI translation but also cultural adaptation
+of icons, communication styles, colors, and UX.
+
+Questions about Thunderbird localization should be directed to the Localization
+Coordinator. Contact information is on the
+[Thunderbird Project page in Pontoon](https://pontoon.mozilla.org/projects/thunderbird/info/).
+
+```{toctree}
+fluent_migrations
+testing_migrations
+```
diff --git a/comm/docs/l10n/testing_migrations.md b/comm/docs/l10n/testing_migrations.md
new file mode 100644
index 0000000000..828b036c5a
--- /dev/null
+++ b/comm/docs/l10n/testing_migrations.md
@@ -0,0 +1,39 @@
+# Testing Migration Recipes
+
+## During Development
+
+To test migration recipes during development, use the following mach command:
+
+```bash
+./mach tb-fluent-migration-test comm/python/l10n/tb_fluent_migrations/bug_1805746_calendar_view.py
+```
+
+This will analyze your migration recipe to check that the migrate function exists,
+and interacts correctly with the migration context. Once that passes, it clones
+`comm-strings-quarantine` into `$OBJDIR/comm/python/l10n`, creates a reference
+localization by adding your local Fluent strings to the ones in
+`comm-strings-quarantine` (essentially the first part of the cross-channel
+process).
+
+It then runs the migration recipe, both as dry run and as actual migration.
+Finally it analyzes the commits, and checks if any migrations were actually run
+and the bug number in the commit message matches the migration name.
+
+It will also show the diff between the migrated files and the reference, ignoring
+blank lines.
+
+You can inspect the generated repository further by looking in
+`$OBJDIR/comm/python/l10n/bug_1805746_calendar_view/en-US`.
+
+## During Review
+
+During l10n review, migration scripts will be run against all Thunderbird locales.
+Any problems will be reported back to the author as part of the regular code
+review process in Phabricator.
+
+```{tip}
+Plan on extra review time for migration scripts in case changes are needed.
+
+Ask the Thunderbird L10n coordinator in [#maildev](https://matrix.to/#/#maildev:mozilla.org)
+or your manager if you run into problems.
+```
diff --git a/comm/docs/mots/index.rst b/comm/docs/mots/index.rst
new file mode 100644
index 0000000000..e986b16aad
--- /dev/null
+++ b/comm/docs/mots/index.rst
@@ -0,0 +1,630 @@
+..
+ This file was automatically generated using `mots export`.
+
+..
+ See https://mots.readthedocs.io/en/latest/#quick-start for quick start
+ documentation and how to modify this file.
+
+
+==========
+Governance
+==========
+
+--------
+Overview
+--------
+To add, remove, or update module information, see the `mots documentation <https://mots.readthedocs.io/en/latest/#adding-a-module>`_.
+
+Thunderbird operates under Mozilla's `module ownership governance system
+<https://www.mozilla.org/hacking/module-ownership.html>`_. A module is a
+discrete unit of code or activity. An owner is the person in charge of a
+module or sub-module. A peer is a person whom the owner has appointed to
+help them. A module may have multiple peers and, very occasionally, multiple
+owners.
+
+The system is overseen by the owner and peers of the Module Ownership module.
+For the modules that make up Thunderbird, oversight is provided by the
+Thunderbird Council module. Owners may add and remove peers from their modules
+as they wish, without reference to anyone else.
+
+
+-------
+Modules
+-------
+
+Thunderbird Council - 2023
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+The Thunderbird Council is the elected governing body for the Thunderbird
+Project, including the code modules that develop the code in Thunderbird
+product(s). It is the top-level module of the project, and Peers are members of
+the Council.
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Berna Alp (ba) <https://people.mozilla.org/s?query=ba>`__
+ * - Peer(s)
+ -
+ | `micah (micah) <https://people.mozilla.org/s?query=micah>`__
+ | `Danny Colin (sdk) <https://people.mozilla.org/s?query=sdk>`__
+ | `John Bieling (TbSync) <https://people.mozilla.org/s?query=TbSync>`__
+ | `Ben Bucksch (BenB) <https://people.mozilla.org/s?query=BenB>`__
+ | `Patrick Cloke (clokep) <https://people.mozilla.org/s?query=clokep>`__
+ | `Philipp Kewisch (Fallen) <https://people.mozilla.org/s?query=Fallen>`__
+ * - Excludes
+ -
+ | suite/\*\*
+
+Thunderbird Desktop
+~~~~~~~~~~~~~~~~~~~
+Standalone Mail Application.
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Peer(s)
+ -
+ | `Geoff Lankow (darktrojan) <https://people.mozilla.org/s?query=darktrojan>`__
+ | `Aceman (aceman) <https://people.mozilla.org/s?query=aceman>`__
+ | `Richard Marti (Paenglab) <https://people.mozilla.org/s?query=Paenglab>`__
+ * - Owner(s) Emeritus
+ - Mark Banner, David Bienvenu, Scott MacGregor
+ * - Peer(s) Emeritus
+ - Blake Winton, Mike Conley, Kent James, Jorg K
+ * - Includes
+ -
+ | mail/\*\*
+ | python/\*\*
+ | other-licenses/\*\*/thunderbird/\*\*
+ | third_party/\*\*
+ | tools/\*\*
+ * - URL
+ - https://developer.thunderbird.net/
+ * - Bugzilla Components
+ - Thunderbird
+
+Addon Support
+=============
+APIs to enable extensions, as well as their installation
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `John Bieling (TbSync) <https://people.mozilla.org/s?query=TbSync>`__
+ * - Peer(s)
+ -
+ | `Geoff Lankow (darktrojan) <https://people.mozilla.org/s?query=darktrojan>`__
+ | `Philipp Kewisch (Fallen) <https://people.mozilla.org/s?query=Fallen>`__
+ * - Includes
+ -
+ | mail/components/extensions/\*\*
+ * - Bugzilla Components
+ - Thunderbird::Add-Ons Extensions API, Thunderbird::Add-Ons General
+
+
+Build Config
+============
+Build, CI, Release Engineering
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Rob Lemley (rjl) <https://people.mozilla.org/s?query=rjl>`__
+ * - Peer(s)
+ -
+ | `Philipp Kewisch (Fallen) <https://people.mozilla.org/s?query=Fallen>`__
+ * - Peer(s) Emeritus
+ - Mark Banner, Siddharth Agarwal, Justin Wood, Joshua Cranmer, Tom Prince
+ * - Includes
+ -
+ | build/\*\*
+ | mail/config/\*\*
+ | taskcluster/\*\*
+ * - Bugzilla Components
+ - Thunderbird::Build Config
+
+
+Instant Messaging
+=================
+The chat and instant messaging component of Thunderbird
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Patrick Cloke (clokep) <https://people.mozilla.org/s?query=clokep>`__
+ * - Peer(s)
+ -
+ | `Martin Giger (freaktechnik) <https://people.mozilla.org/s?query=freaktechnik>`__
+ * - Owner(s) Emeritus
+ - Florian Quèze
+ * - Peer(s) Emeritus
+ - aleth, Benedikt Pfeifer
+ * - Includes
+ -
+ | mail/components/im/\*\*
+ | chat/\*\*
+ * - Bugzilla Components
+ - Thunderbird::Instant Messaging
+
+
+Message Security
+================
+OpenPGP and S/MIME message security
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Kai Engert (KaiE) <https://people.mozilla.org/s?query=KaiE>`__
+ * - Peer(s)
+ -
+ | `Patrick Brunschwig (patrick) <https://people.mozilla.org/s?query=patrick>`__
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Includes
+ -
+ | mail/extensions/openpgp/\*\*
+ | mail/extensions/smime/\*\*
+
+
+Theme
+=====
+The interface of Thunderbird related to the OS and custom themes
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Richard Marti (Paenglab) <https://people.mozilla.org/s?query=Paenglab>`__
+ * - Peer(s)
+ -
+ | `Alessandro Castellani (aleca) <https://people.mozilla.org/s?query=aleca>`__
+ * - Peer(s) Emeritus
+ - Josiah Bruner (:JosiahOne), Blake Winton, Mike Conley
+ * - Includes
+ -
+ | mail/themes/\*\*
+ * - Bugzilla Components
+ - Thunderbird::Theme
+
+
+UX (User Experience)
+====================
+Usability and user journey, including User Interface and Accessibility
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Alessandro Castellani (aleca) <https://people.mozilla.org/s?query=aleca>`__
+ * - Peer(s)
+ -
+ | `Richard Marti (Paenglab) <https://people.mozilla.org/s?query=Paenglab>`__
+ | `Henry Wilkes (henry-x) <https://people.mozilla.org/s?query=henry-x>`__
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Peer(s) Emeritus
+ - Blake Winton
+ * - Includes
+ -
+ | mail/branding/\*\*
+ * - Bugzilla Components
+ - Thunderbird::General
+
+
+Calendar
+~~~~~~~~
+Calendaring components
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Philipp Kewisch (Fallen) <https://people.mozilla.org/s?query=Fallen>`__
+ * - Peer(s)
+ -
+ | `Geoff Lankow (darktrojan) <https://people.mozilla.org/s?query=darktrojan>`__
+ * - Includes
+ -
+ | calendar/\*\*
+ * - Bugzilla Components
+ - Calendar
+
+User Interface (UI)
+===================
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Richard Marti (Paenglab) <https://people.mozilla.org/s?query=Paenglab>`__
+ * - Peer(s)
+ -
+ | `Alessandro Castellani (aleca) <https://people.mozilla.org/s?query=aleca>`__
+ * - Includes
+ -
+ | calendar/base/content/\*\*
+ | calendar/base/themes/\*\*
+ * - Bugzilla Components
+ - Calendar::Calendar Frontend
+
+
+Mail and News Core
+~~~~~~~~~~~~~~~~~~
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Joshua Cranmer (jcranmer) <https://people.mozilla.org/s?query=jcranmer>`__
+ * - Peer(s)
+ -
+ | `Ben Campbell (benc) <https://people.mozilla.org/s?query=benc>`__
+ | `Neil Rashbrook (neil) <https://people.mozilla.org/s?query=neil>`__
+ | `Aceman (aceman) <https://people.mozilla.org/s?query=aceman>`__
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Peer(s) Emeritus
+ - Karsten Düsterloh (mnyromyr), Kai Engert, David Bienvenu (bienvenu), Mark Banner, Kent James
+ * - Includes
+ -
+ | mailnews/\*\*
+ * - Bugzilla Components
+ - MailNews Core::Backend, Thunderbird::Account Manager, Thunderbird::Migration,
+ MailNews Core::Account Manager, MailNews Core::Composition, MailNews
+ Core::Filters, MailNews Core::Internationalization, MailNews Core::Movemail,
+ MailNews Core::Networking, MailNews Core::Networking - POP, MailNews
+ Core::Printing, MailNews Core::Profile Migration, MailNews Core::Search,
+ MailNews Core::Security, MailNews Core::Simple MAPI
+
+Addressbook
+===========
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Geoff Lankow (darktrojan) <https://people.mozilla.org/s?query=darktrojan>`__
+ * - Peer(s)
+ -
+ | `Aceman (aceman) <https://people.mozilla.org/s?query=aceman>`__
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Peer(s) Emeritus
+ - David Bienvenu (bienvenu), Mark Banner, Mike Conley
+ * - Includes
+ -
+ | mailnews/addrbook/\*\*
+ * - Bugzilla Components
+ - MailNews Core::Address Book
+
+
+Feeds
+=====
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Nobody (nobody) <https://people.mozilla.org/s?query=nobody>`__
+ * - Peer(s)
+ -
+ | `alta88 (alta88) <https://people.mozilla.org/s?query=alta88>`__
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Includes
+ -
+ | mailnews/extensions/newsblog/\*\*
+ * - Bugzilla Components
+ - MailNews Core::Feed Reader
+
+
+GloDa
+=====
+Global message database
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Nobody (nobody) <https://people.mozilla.org/s?query=nobody>`__
+ * - Peer(s)
+ -
+ | `Ben Campbell (benc) <https://people.mozilla.org/s?query=benc>`__
+ | `Neil Rashbrook (neil) <https://people.mozilla.org/s?query=neil>`__
+ | `Aceman (aceman) <https://people.mozilla.org/s?query=aceman>`__
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Peer(s) Emeritus
+ - Jonathan Protzenko
+ * - Includes
+ -
+ | mailnews/db/gloda/\*\*
+
+
+IMAP handling code
+==================
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `gene smith (gds) <https://people.mozilla.org/s?query=gds>`__
+ * - Peer(s)
+ -
+ | `Ben Campbell (benc) <https://people.mozilla.org/s?query=benc>`__
+ | `Neil Rashbrook (neil) <https://people.mozilla.org/s?query=neil>`__
+ | `Aceman (aceman) <https://people.mozilla.org/s?query=aceman>`__
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Peer(s) Emeritus
+ - Kent James
+ * - Includes
+ -
+ | mailnews/imap/\*\*
+ * - Bugzilla Components
+ - MailNews Core::Networking: IMAP
+
+
+Import
+======
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Joshua Cranmer (jcranmer) <https://people.mozilla.org/s?query=jcranmer>`__
+ * - Peer(s)
+ -
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Peer(s) Emeritus
+ - David Bienvenu (bienvenu), Mark Banner, Jorg K
+ * - Includes
+ -
+ | mailnews/import/\*\*
+ * - Bugzilla Components
+ - MailNews Core::Import
+
+
+Localization
+============
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Nobody (nobody) <https://people.mozilla.org/s?query=nobody>`__
+ * - Peer(s)
+ -
+ | `Philipp Kewisch (Fallen) <https://people.mozilla.org/s?query=Fallen>`__
+ * - Peer(s) Emeritus
+ - Mark Banner
+ * - Includes
+ -
+ | calendar/locales/\*\*
+ | chat/locales/\*\*
+ | mail/locales/\*\*
+ * - Bugzilla Components
+ - MailNews Core::Localization
+
+
+MIME Parser
+===========
+RFC822 MIME Parser
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Nobody (nobody) <https://people.mozilla.org/s?query=nobody>`__
+ * - Peer(s)
+ -
+ | `Jim Porter (squib) <https://people.mozilla.org/s?query=squib>`__
+ | `Joshua Cranmer (jcranmer) <https://people.mozilla.org/s?query=jcranmer>`__
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Owner(s) Emeritus
+ - David Bienvenu (bienvenu)
+ * - Peer(s) Emeritus
+ - Kai Engert, Jorg K
+ * - Includes
+ -
+ | mailnews/mime/\*\*
+ * - Bugzilla Components
+ - MailNews Core::MIME, MailNews Core::Attachments
+
+
+Message Database
+================
+MSF files
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Nobody (nobody) <https://people.mozilla.org/s?query=nobody>`__
+ * - Peer(s)
+ -
+ | `Aceman (aceman) <https://people.mozilla.org/s?query=aceman>`__
+ | `Joshua Cranmer (jcranmer) <https://people.mozilla.org/s?query=jcranmer>`__
+ * - Owner(s) Emeritus
+ - David Bienvenu (bienvenu)
+ * - Peer(s) Emeritus
+ - Kent James
+ * - Includes
+ -
+ | mailnews/db/\*\*
+ * - Bugzilla Components
+ - MailNews Core::Database
+
+
+News
+====
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Joshua Cranmer (jcranmer) <https://people.mozilla.org/s?query=jcranmer>`__
+ * - Peer(s)
+ -
+ | `Ben Campbell (benc) <https://people.mozilla.org/s?query=benc>`__
+ | `Neil Rashbrook (neil) <https://people.mozilla.org/s?query=neil>`__
+ | `Aceman (aceman) <https://people.mozilla.org/s?query=aceman>`__
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Peer(s) Emeritus
+ - David Bienvenu (bienvenu)
+ * - Includes
+ -
+ | mailnews/news/\*\*
+ * - Bugzilla Components
+ - MailNews Core::Networking: NNTP
+
+
+S/MIME
+======
+S/MIME backend
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Kai Engert (KaiE) <https://people.mozilla.org/s?query=KaiE>`__
+ * - Peer(s)
+ -
+ | `Ben Campbell (benc) <https://people.mozilla.org/s?query=benc>`__
+ | `Neil Rashbrook (neil) <https://people.mozilla.org/s?query=neil>`__
+ | `Aceman (aceman) <https://people.mozilla.org/s?query=aceman>`__
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Includes
+ -
+ | mailnews/extensions/smime/\*\*
+ * - Bugzilla Components
+ - MailNews Core::Security: S/MIME
+
+
+SMTP
+====
+Code responsible for sending messages over SMTP.
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Ping Chen (rnons) <https://people.mozilla.org/s?query=rnons>`__
+ * - Peer(s)
+ -
+ | `Ben Campbell (benc) <https://people.mozilla.org/s?query=benc>`__
+ | `Neil Rashbrook (neil) <https://people.mozilla.org/s?query=neil>`__
+ | `Aceman (aceman) <https://people.mozilla.org/s?query=aceman>`__
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Includes
+ -
+ | mailnews/compose/\*\*
+ * - Bugzilla Components
+ - MailNews Core::Networking: SMTP
+
+
+Unit Testing Infrastructure
+===========================
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Geoff Lankow (darktrojan) <https://people.mozilla.org/s?query=darktrojan>`__
+ * - Peer(s)
+ -
+ | `Joshua Cranmer (jcranmer) <https://people.mozilla.org/s?query=jcranmer>`__
+ | `Magnus Melin (mkmelin) <https://people.mozilla.org/s?query=mkmelin>`__
+ * - Owner(s) Emeritus
+ - Mark Banner
+ * - Includes
+ -
+ | mailnews/test/\*\*
+ | mailnews/base/test/\*\*
+ * - Bugzilla Components
+ - MailNews Core::Testing Infrastructure
+
+
+mots config
+~~~~~~~~~~~
+
+
+.. list-table::
+ :stub-columns: 1
+ :widths: 30 70
+
+ * - Owner(s)
+ -
+ | `Rob Lemley (rjl) <https://people.mozilla.org/s?query=rjl>`__
+ * - Includes
+ -
+ | mots.yaml
diff --git a/comm/docs/requirements.in b/comm/docs/requirements.in
new file mode 100644
index 0000000000..c1e8f3248e
--- /dev/null
+++ b/comm/docs/requirements.in
@@ -0,0 +1,4 @@
+Sphinx>=5,<6
+sphinx_rtd_theme
+myst-parser[linkify]
+fluent.pygments>=1,<2
diff --git a/comm/docs/requirements.txt b/comm/docs/requirements.txt
new file mode 100644
index 0000000000..025b2ee562
--- /dev/null
+++ b/comm/docs/requirements.txt
@@ -0,0 +1,86 @@
+#
+# This file is autogenerated by pip-compile with Python 3.10
+# by the following command:
+#
+# pip-compile --resolver=backtracking requirements.in
+#
+alabaster==0.7.13
+ # via sphinx
+babel==2.11.0
+ # via sphinx
+certifi==2022.12.7
+ # via requests
+charset-normalizer==3.0.1
+ # via requests
+docutils==0.17.1
+ # via
+ # myst-parser
+ # sphinx
+ # sphinx-rtd-theme
+fluent-pygments==1.0
+ # via -r requirements.in
+fluent-syntax==0.18.1
+ # via fluent-pygments
+idna==3.4
+ # via requests
+imagesize==1.4.1
+ # via sphinx
+jinja2==3.1.2
+ # via
+ # myst-parser
+ # sphinx
+linkify-it-py==1.0.3
+ # via myst-parser
+markdown-it-py==2.1.0
+ # via
+ # mdit-py-plugins
+ # myst-parser
+markupsafe==2.1.1
+ # via jinja2
+mdit-py-plugins==0.3.3
+ # via myst-parser
+mdurl==0.1.2
+ # via markdown-it-py
+myst-parser[linkify]==0.18.1
+ # via -r requirements.in
+packaging==23.0
+ # via sphinx
+pygments==2.14.0
+ # via
+ # fluent-pygments
+ # sphinx
+pytz==2022.7
+ # via babel
+pyyaml==6.0
+ # via myst-parser
+requests==2.28.2
+ # via sphinx
+six==1.16.0
+ # via fluent-pygments
+snowballstemmer==2.2.0
+ # via sphinx
+sphinx==5.3.0
+ # via
+ # -r requirements.in
+ # myst-parser
+ # sphinx-rtd-theme
+sphinx-rtd-theme==1.1.1
+ # via -r requirements.in
+sphinxcontrib-applehelp==1.0.3
+ # via sphinx
+sphinxcontrib-devhelp==1.0.2
+ # via sphinx
+sphinxcontrib-htmlhelp==2.0.0
+ # via sphinx
+sphinxcontrib-jsmath==1.0.1
+ # via sphinx
+sphinxcontrib-qthelp==1.0.3
+ # via sphinx
+sphinxcontrib-serializinghtml==1.1.5
+ # via sphinx
+typing-extensions==4.4.0
+ # via myst-parser
+uc-micro-py==1.0.1
+ # via linkify-it-py
+urllib3==1.26.14
+ # via requests