diff --git a/accessible/docs/Architecture.md b/accessible/docs/Architecture.md
index 186a031f3dd9890e7dac6dc4306b9ec69ade601e..b74c007787836e6a9135433861abb58079047ecb 100644
--- a/accessible/docs/Architecture.md
+++ b/accessible/docs/Architecture.md
@@ -1,6 +1,6 @@
 # Architecture
 
-This document provides a high-level overview of how the accessibility code is structured. See [the Document Accessibility Lifecycle page](/accessible/DocumentAccessibilityLifecycle.html#docaccessible-creation) for a lower level description of the code.
+This document provides a high-level overview of how the accessibility code is structured. See [the Document Accessibility Lifecycle page](DocumentAccessibilityLifecycle.md#docaccessible-creation) for a lower level description of the code.
 
 ## Process Model
 The accessibility component spans multiple processes. In the parent process, it creates an accessibility tree of the Firefox UI and responds to requests from screen readers. In content processes, the accessibility component creates accessibility trees from web content.
diff --git a/browser/components/newtab/content-src/asrouter/docs/targeting-attributes.md b/browser/components/newtab/content-src/asrouter/docs/targeting-attributes.md
index 32f5420a5b8e26da1743244b03198bd45e3cab3e..0412878f465685e9718b73f4eee45128e8918aac 100644
--- a/browser/components/newtab/content-src/asrouter/docs/targeting-attributes.md
+++ b/browser/components/newtab/content-src/asrouter/docs/targeting-attributes.md
@@ -31,11 +31,11 @@ Please note that some targeting attributes require stricter controls on the tele
 * [topFrecentSites](#topfrecentsites)
 * [totalBookmarksCount](#totalbookmarkscount)
 * [usesFirefoxSync](#usesfirefoxsync)
-* [isFxAEnabled](#isFxAEnabled)
-* [isFxASignedIn](#isFxASignedIn)
+* [isFxAEnabled](#isfxaenabled)
+* [isFxASignedIn](#isfxasignedin)
 * [creditCardsSaved](#creditcardssaved)
 * [addressesSaved](#addressessaved)
-* [xpinstallEnabled](#xpinstallEnabled)
+* [xpinstallEnabled](#xpinstallenabled)
 * [hasPinnedTabs](#haspinnedtabs)
 * [hasAccessedFxAPanel](#hasaccessedfxapanel)
 * [isWhatsNewPanelEnabled](#iswhatsnewpanelenabled)
@@ -59,12 +59,12 @@ Please note that some targeting attributes require stricter controls on the tele
 * [doesAppNeedPrivatePin](#doesappneedprivatepin)
 * [isBackgroundTaskMode](#isbackgroundtaskmode)
 * [backgroundTaskName](#backgroundtaskname)
-* [userPrefersReducedMotion](#userPrefersReducedMotion)
-* [colorwaysActive](#colorwaysActive)
-* [userEnabledActiveColorway](#userEnabledActiveColorway)
-* [inMr2022Holdback](#inMr2022Holdback)
-* [distributionId](#distributionId)
-* [fxViewButtonAreaType](#fxViewButtonAreaType)
+* [userPrefersReducedMotion](#userprefersreducedmotion)
+* [colorwaysActive](#colorwaysactive)
+* [userEnabledActiveColorway](#userenabledactivecolorway)
+* [inMr2022Holdback](#inmr2022holdback)
+* [distributionId](#distributionid)
+* [fxViewButtonAreaType](#fxviewbuttonareatype)
 
 ## Detailed usage
 
diff --git a/devtools/docs/contributor/backend/protocol.md b/devtools/docs/contributor/backend/protocol.md
index a577d6e7229623516fe3563aad5a12dbd3755e4c..55aa61d0300d24b499ca2ace14c585740a88b5d1 100644
--- a/devtools/docs/contributor/backend/protocol.md
+++ b/devtools/docs/contributor/backend/protocol.md
@@ -261,7 +261,7 @@ A descriptor for an accessor property has the form:
 
 where *getter* and *setter* are grips on the property's getter and setter functions. These may be `{ "type":"undefined" }` if the property lacks the given accessor function.
 
-A **safe getter value descriptor** provides a value that an inherited accessor returned when applied to an instance. (See [Finding An Object's Prototype And Properties](#finding-an-objects-prototype-and-properties) for an explanation of why and when such descriptors are used.) Such a descriptor has the form:
+A **safe getter value descriptor** provides a value that an inherited accessor returned when applied to an instance. (See [Finding An Object's Prototype And Properties](#finding-an-object-s-prototype-and-properties) for an explanation of why and when such descriptors are used.) Such a descriptor has the form:
 
 ```
 { "getterValue": <value>, "getterPrototypeLevel": <level>,
@@ -282,7 +282,7 @@ then a grip on this value would have the form:
 { "type":"object", "class":"Object", "actor":<actor> }
 ```
 
-and sending a ["prototypeAndProperties"](#finding-an-objects-prototype-and-properties) request to *actor* would produce the following reply:
+and sending a ["prototypeAndProperties"](#finding-an-object-s-prototype-and-properties) request to *actor* would produce the following reply:
 
 ```
 { "from":<actor>, "prototype":{ "type":"object", "class":"Object", "actor":<objprotoActor> },
@@ -297,7 +297,7 @@ and sending a ["prototypeAndProperties"](#finding-an-objects-prototype-and-prope
 ```
 
 
-Sending a ["prototypeAndProperties"](#finding-an-objects-prototype-and-properties) request to an object actor referring to a DOM mouse event might produce the following reply:
+Sending a ["prototypeAndProperties"](#finding-an-object-s-prototype-and-properties) request to an object actor referring to a DOM mouse event might produce the following reply:
 
 ```
 { "from":<mouseEventActor>, "prototype":{ "type":"object", "class":"MouseEvent", "actor":<mouseEventProtoActor> },
diff --git a/devtools/docs/contributor/contributing/code-reviews-checklist.md b/devtools/docs/contributor/contributing/code-reviews-checklist.md
index fb4959d3a11bacb9edc3d7550ebd38346c5b996b..566c152fa51d5aa406a64f762da169c91f55bedc 100644
--- a/devtools/docs/contributor/contributing/code-reviews-checklist.md
+++ b/devtools/docs/contributor/contributing/code-reviews-checklist.md
@@ -40,12 +40,12 @@ It can also be useful for patch authors: if the changes comply with these guidel
 * Test changes:
   * The feature or bug is [tested by new tests, or a modification of existing tests](../tests/writing-tests.md).
   * [Test logging](../tests/writing-tests.md#logs-and-comments) is sufficient to help investigating test failures/timeouts.
-  * [Test is e10s compliant](../tests/writing-tests.md#e10s-electrolysis) (doesn't try to access web content from the parent process, etc…).
+  * [Test is e10s compliant](../tests/writing-tests.md#electrolysis) (doesn't try to access web content from the parent process, etc…).
   * Tests are [clean and maintainable](../tests/writing-tests.md#writing-clean-maintainable-test-code).
   * A try push has started (or even better, is green already).
 * User facing changes:
   * If any user-facing interfaces are added/modified, double-check the changes with the UX mockups or specs, if available. If there's any confusion, need-info the UX designer.<!--TODO this needs updating with the new process-->
-  * If a user facing string has been added, it is localized and follows [the localization guidelines](../files/adding-files.html#localization-l10n).
+  * If a user facing string has been added, it is localized and follows [the localization guidelines](../files/adding-files.md#localization-l10n).
   * If a user-facing string has changed meaning, [the key has been updated](https://mozilla-l10n.github.io/documentation/localization/making_string_changes.html).
   * If a new image is added, it is a SVG image or there is a reason for not using a SVG.
   * If a SVG is added/modified, it follows [the SVG guidelines](../frontend/svgs.md).
diff --git a/docs/performance/Benchmarking.md b/docs/performance/Benchmarking.md
index a7852838dcc859a678e5f1fb76cd56f97c7eec83..3b429463f73701e624c1cd0256594854fb6df517 100644
--- a/docs/performance/Benchmarking.md
+++ b/docs/performance/Benchmarking.md
@@ -23,7 +23,7 @@ ac_add_options RUSTC_OPT_LEVEL=2
 
 ## Profile Guided Optimization (PGO)
 [Profile Guided
-Optimization](/build/buildsystem/pgo.html#profile-guided-optimization) is
+Optimization](/build/buildsystem/pgo.rst#profile-guided-optimization) is
 disabled by default and may improve runtime by up to 20%. However, it takes a
 long time to build. To enable, add the following to your [mozconfig]:
 ```
@@ -95,4 +95,4 @@ include Instruments on OSX (part of XCode), [RotateRight
 Zoom](http://www.rotateright.com/) on Linux (uses perf underneath), and
 Intel VTune on Windows or Linux.
 
-[mozconfig]: /setup/configuring_build_options.html#using-a-mozconfig-configuration-file
+[mozconfig]: /setup/configuring_build_options.rst#using-a-mozconfig-configuration-file
diff --git a/docs/performance/memory/aggregate_view.md b/docs/performance/memory/aggregate_view.md
index 65264bfc01410f6f675ecae728865576967eff55..9a4f01e01e2b71ef1a85640bd1dfa460a2f6ae28 100644
--- a/docs/performance/memory/aggregate_view.md
+++ b/docs/performance/memory/aggregate_view.md
@@ -73,7 +73,7 @@ instances:
 ![](../img/memory-tool-in-group.png)
 
 For each instance, you can see the [retained size and shallow
-size](dominators.html#shallow_and_retained_size) of
+size](dominators.md#shallow_and_retained_size) of
 that instance. In this case, you can see that the first three arrays
 have a fairly large shallow size (5% of the total heap usage) and a much
 larger retained size (26% of the total).
@@ -81,7 +81,7 @@ larger retained size (26% of the total).
 On the right-hand side is a pane that just says \"Select an item to view
 its retaining paths\". If you select an item, you\'ll see the [Retaining
 paths
-panel](/dominators_view.html#retaining_paths_panel)
+panel](dominators_view.md#retaining_paths_panel)
 for that item:
 
 ![](../img/memory-tool-in-group-retaining-paths.png)
diff --git a/docs/performance/memory/bloatview.md b/docs/performance/memory/bloatview.md
index 1c585a5844f1459cc19a3b5e68b5ef023bc7b2c0..9e290011b1fdd3a574cb4d88edb1b7a20448395f 100644
--- a/docs/performance/memory/bloatview.md
+++ b/docs/performance/memory/bloatview.md
@@ -78,7 +78,7 @@ Interesting things to look for:
     having your classes in the list is *not* ok. That means no one is
     looking at them, and we won't be able to tell if someone introduces
     a leak. (See
-    [below](bloatview.html#how-to-instrument-your-objects-for-bloatview)
+    [below](#how-to-instrument-your-objects-for-bloatview)
     for how to fix this.)
 -   **The Bytes Leaked for your classes should be zero!** - Need I say
     more? If it isn't, you should use the other tools to fix it.
diff --git a/docs/performance/memory/dominators_view.md b/docs/performance/memory/dominators_view.md
index ba2f2b337aa39bb03cfbb03bf4a4cb370f9f7787..05de01fa4e1b27e4a596be9a74fe71e224f1bb0f 100644
--- a/docs/performance/memory/dominators_view.md
+++ b/docs/performance/memory/dominators_view.md
@@ -23,16 +23,16 @@ To see the Dominators view for a snapshot, select \"Dominators\" in the
 The Dominators view consists of two panels:
 
 -   the [Dominators Tree
-    panel](dominators_view.html#dominators_tree_panel)
+    panel](#dominators-tree-panel)
     shows you which nodes in the snapshot are retaining the most memory
 -   the [Retaining Paths
-    panel](dominators_view.html#retaining_paths_panel)
+    panel](#retaining-paths-panel)
     (new in Firefox 47) shows the 5 shortest retaining paths for a
     single node.
 
 ![](../img/dominators-2.png)
 
-### Dominators Tree panel {#Dominators_Tree_panel}
+### Dominators Tree panel
 
 The Dominators Tree tells you which objects in the snapshot are
 retaining the most memory.
@@ -117,7 +117,7 @@ allocation stacks are currently only recorded for objects, not for
 arrays, strings, or internal structures.
 :::
 
-### Retaining Paths panel {#Retaining_Paths_panel}
+### Retaining Paths panel
 
 ::: {.geckoVersionNote}
 The Retaining Paths panel is new in Firefox 47.
diff --git a/docs/performance/memory/memory.md b/docs/performance/memory/memory.md
index 4378de27fcf3492d4889046d79f779a68a460f76..d571fb6b9c2be11717ff5968c52b06d7e199671e 100644
--- a/docs/performance/memory/memory.md
+++ b/docs/performance/memory/memory.md
@@ -12,17 +12,17 @@ your code you are allocating memory.
 
 ## The basics
 -   Opening [the memory
-    tool](basic_operations.html#opening-the-memory-tool)
+    tool](basic_operations.md#opening-the-memory-tool)
 -   [Taking a heap
-    snapshot](basic_operations.html#saving-and-loading-snapshots)
+    snapshot](basic_operations.md#saving-and-loading-snapshots)
 -   [Comparing two
-    snapshots](basic_operations.html#comparing-snapshots)
+    snapshots](basic_operations.md#comparing-snapshots)
 -   [Deleting
-    snapshots](basic_operations.html#clearing-a-snapshot)
+    snapshots](basic_operations.md#clearing-a-snapshot)
 -   [Saving and loading
-    snapshots](basic_operations.html#saving-and-loading-snapshots)
+    snapshots](basic_operations.md#saving-and-loading-snapshots)
 -   [Recording call
-    stacks](basic_operations.html#recording-call-stacks)
+    stacks](basic_operations.md#recording-call-stacks)
 
 ------------------------------------------------------------------------
 
diff --git a/docs/performance/power_profiling_overview.md b/docs/performance/power_profiling_overview.md
index f6d0585aa2f029aac29c81863ad1c502ee012071..bb8f511fe2ba4700e8f992422f19d455b88db2ba 100644
--- a/docs/performance/power_profiling_overview.md
+++ b/docs/performance/power_profiling_overview.md
@@ -214,7 +214,7 @@ physical meaning. Avoid them.
 
 The most notable example of a hybrid proxy measurement is the ["Energy
 Impact" used by OS X's Activity
-Monitor](Activity_Monitor_and_top.md#What_does_Energy_Impact_measure).
+[Monitor](activity_monitor_and_top.md#What-does-Energy-Impact-measure).
 
 ## Ways to user power-related measurements
 
@@ -305,7 +305,7 @@ power consumption.
     residency, GPU usage, etc.) may be helpful.
 -   Animations are sometimes the cause of high power consumption. The
     [animation
-    inspector](/en-US/docs/Tools/Page_Inspector/How_to/Work_with_animations#Animation_inspector)
+    inspector](/devtools-user/page_inspector/how_to/work_with_animations/index.rst#animation-inspector)
     in the Firefox Devtools can identify them. Alternatively, [here is
     an
     explanation](https://bugzilla.mozilla.org/show_bug.cgi?id=1190721#c10)
diff --git a/docs/performance/tools_power_rapl.md b/docs/performance/tools_power_rapl.md
index 4347d9d5f367b6b1f80c519966153e4f3c11f108..3bf2555bd69c0ee5b94c3913d432f55ff4703e4f 100644
--- a/docs/performance/tools_power_rapl.md
+++ b/docs/performance/tools_power_rapl.md
@@ -108,6 +108,6 @@ The distribution data is omitted if there was zero or one samples taken.
 
 ## Combining with `powermetrics`
 
-On Mac, you can use the [mach power](powermetrics.html#mach-power) command
+On Mac, you can use the [mach power](powermetrics.md#mach-power) command
 to run `rapl` in combination with `powermetrics` in a way that gives the
 most useful summary measurements for each of Firefox, Chrome and Safari.
diff --git a/js/src/doc/Debugger/Conventions.md b/js/src/doc/Debugger/Conventions.md
index 76728924fcfdf3f74ecc2430480156067d41cf67..5d89eb734330cf1db5a9997486131219c730627f 100644
--- a/js/src/doc/Debugger/Conventions.md
+++ b/js/src/doc/Debugger/Conventions.md
@@ -251,4 +251,4 @@ it will leave the exception's `cause` property undefined.
 
 
 [debugger]: Debugger-API.md
-[inv fr]: Debugger.Frame.html#invocation-functions-and-debugger-frames
+[inv fr]: Debugger.Frame.md#invocation-functions-and-debugger-frames
diff --git a/js/src/doc/Debugger/Debugger.Frame.md b/js/src/doc/Debugger/Debugger.Frame.md
index 42f7a0fb8ad996ce5c2df8b51203496094bda095..32ae5027de73f2062d2087fc0fc7a4804724ba26 100644
--- a/js/src/doc/Debugger/Debugger.Frame.md
+++ b/js/src/doc/Debugger/Debugger.Frame.md
@@ -479,11 +479,11 @@ Accessing this property will throw if `.onStack == false`.
 [vf]: #visible-frames
 [debugger-object]: Debugger.md
 [object]: Debugger.Object.md
-[dbg code]: Conventions.html#debuggee-code
+[dbg code]: Conventions.md#debuggee-code
 [inv fr]: #invocation-functions-and-debugger-frames
-[cv]: Conventions.html#completion-values
+[cv]: Conventions.md#completion-values
 [script]: Debugger.Script.md
 [environment]: Debugger.Environment.md
-[rv]: Conventions.html#resumption-values
+[rv]: Conventions.md#resumption-values
 [fr eval]: #eval-code-options
 [saved-frame]: ../SavedFrame/index
diff --git a/js/src/doc/Debugger/Debugger.Memory.md b/js/src/doc/Debugger/Debugger.Memory.md
index 585e4723c47fadbf6967cccb6ed570ef9545d4a9..c20354ef3cfe62bf3fbd3eb322c76808c84c8b61 100644
--- a/js/src/doc/Debugger/Debugger.Memory.md
+++ b/js/src/doc/Debugger/Debugger.Memory.md
@@ -567,9 +567,9 @@ In a census, all the various forms of JavaScript code are placed in the
 [bernoulli-trial]: https://en.wikipedia.org/wiki/Bernoulli_trial
 [alloc-sampling-probability]: #allocsamplingprobability
 [object]: Debugger.Object.md
-[allocation-site]: Debugger.Object.html#allocationsite
+[allocation-site]: Debugger.Object.md#allocationsite
 [saved-frame]: ../SavedFrame/index
 [drain-alloc-log]: #drainAllocationsLog
 [max-alloc-log]: #maxAllocationsLogLength
 [take-census]: #takecensus-options
-[timestamps]: ./Conventions.html#timestamps
+[timestamps]: ./Conventions.md#timestamps
diff --git a/js/src/doc/Debugger/Debugger.Object.md b/js/src/doc/Debugger/Debugger.Object.md
index 3affab313fa7bc5600ce8c940ce220ce2f6496e4..c0fb134d26ab527900b5edb6279c2752640fb678 100644
--- a/js/src/doc/Debugger/Debugger.Object.md
+++ b/js/src/doc/Debugger/Debugger.Object.md
@@ -675,8 +675,8 @@ promise. There are several different sorts of reaction records:
 [promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
 [saved-frame]: ../SavedFrame/index
 
-[tracking-allocs]: Debugger.Memory.html#trackingallocationsites
-[inv fr]: Debugger.Frame.html#invocation-functions-and-debugger-frames
-[wouldrun]: Conventions.html#the-debugger-debuggeewouldrun-exception
-[cv]: Conventions.html#completion-values
-[fr eval]: Debugger.Frame.html#eval-code-options
+[tracking-allocs]: Debugger.Memory.md#trackingallocationsites
+[inv fr]: Debugger.Frame.md#invocation-functions-and-debugger-frames
+[wouldrun]: Conventions.md#the-debugger-debuggeewouldrun-exception
+[cv]: Conventions.md#completion-values
+[fr eval]: Debugger.Frame.md#eval-code-options
diff --git a/js/src/doc/Debugger/Debugger.Script.md b/js/src/doc/Debugger/Debugger.Script.md
index a587af0ad45417fadc3b7fde1f9fcdbd85547884..1788e5230d1ec314300fdbdf302984e44389b36b 100644
--- a/js/src/doc/Debugger/Debugger.Script.md
+++ b/js/src/doc/Debugger/Debugger.Script.md
@@ -502,4 +502,4 @@ script.  The object has the following properties:
 [source]: Debugger.Source.md
 [object]: Debugger.Object.md
 [frame]: Debugger.Frame.md
-[rv]: ./Conventions.html#resumption-values
+[rv]: Conventions.md#resumption-values
diff --git a/js/src/doc/Debugger/Debugger.md b/js/src/doc/Debugger/Debugger.md
index aa37697f16b7c6b0d6f89b8d71bd3521c194bab6..29f115241f0c32182ff90212138d9cea470f0b2d 100644
--- a/js/src/doc/Debugger/Debugger.md
+++ b/js/src/doc/Debugger/Debugger.md
@@ -540,8 +540,8 @@ The functions described below are not called with a `this` value.
 [add]: #adddebuggee-global
 [source]: Debugger.Source.md
 [script]: Debugger.Script.md
-[rv]: Conventions.html#resumption-values
+[rv]: Conventions.md#resumption-values
 [object]: Debugger.Object.md
-[vf]: Debugger.Frame.html#visible-frames
-[tracking-allocs]: Debugger.Memory.html#trackingallocationsites
+[vf]: Debugger.Frame.md#visible-frames
+[tracking-allocs]: Debugger.Memory.md#trackingallocationsites
 [frame]: Debugger.Frame.md
diff --git a/remote/doc/CodeStyle.md b/remote/doc/CodeStyle.md
index 4a6571324ceb8e2c658d110fa51c3f3fec43ada8..2d6c02ab26e0be10b841b7d54ea49567a04e0aff 100644
--- a/remote/doc/CodeStyle.md
+++ b/remote/doc/CodeStyle.md
@@ -70,4 +70,4 @@ a try run failing due to a simple linting issue.
 
 [mozlint]: /code-quality/lint/mozlint.rst
 [eslint]: /code-quality/lint/linters/eslint.rst
-[enable automatic linting]: /tools/lint/usage.html#using-a-vcs-hook
+[enable automatic linting]: /code-quality/lint/usage.rst#using-a-vcs-hook
diff --git a/remote/doc/marionette/CodeStyle.md b/remote/doc/marionette/CodeStyle.md
index ad6f03092fe4e232f57a0053b2a1a948e3c89398..abd70e09c3b31e556bfdb8a0c52a7e7513f0509b 100644
--- a/remote/doc/marionette/CodeStyle.md
+++ b/remote/doc/marionette/CodeStyle.md
@@ -200,7 +200,7 @@ other modules.  Documentation for non-exported symbols is not required.
 
 Marionette consists mostly of JavaScript (server) and Python (client,
 harness, test runner) code.  We lint our code with [mozlint],
-which harmonises the output from [eslint] and [flake8].
+which harmonises the output from [eslint] and [ruff].
 
 To run the linter with a sensible output:
 
@@ -225,5 +225,5 @@ failing due to a stupid linting issue.
 
 [mozlint]: /code-quality/lint/mozlint.rst
 [eslint]: /code-quality/lint/linters/eslint.rst
-[flake8]: /code-quality/lint/linters/flake8.rst
-[enable automatic linting]: /code-quality/lint/usage.html#using-a-vcs-hook
+[ruff]: /code-quality/lint/linters/ruff.rst
+[enable automatic linting]: /code-quality/lint/usage.rst#using-a-vcs-hook
diff --git a/remote/doc/marionette/Contributing.md b/remote/doc/marionette/Contributing.md
index 13fe137905661ab382464aca9313627277e7ac52..70678a35fe9c707fdf3c379e146a2e1d9e7c899b 100644
--- a/remote/doc/marionette/Contributing.md
+++ b/remote/doc/marionette/Contributing.md
@@ -50,7 +50,7 @@ have a curated set of [good first bugs] you may consider attempting first.
 We have collected a lot of good advice for working on Marionette
 code in our [code style document], which we highly recommend you read.
 
-[ask questions]: ./index.rst#communication
+[ask questions]: index.rst#communication
 [mozilla-central]: https://searchfox.org/mozilla-central/source/remote/marionette/
 [Testing :: Marionette]: https://bugzilla.mozilla.org/buglist.cgi?resolution=---&component=Marionette
 [good first bugs]: https://codetribute.mozilla.org/projects/automation?project%3DMarionette
diff --git a/remote/doc/marionette/NewContributors.md b/remote/doc/marionette/NewContributors.md
index 06051090f4917f2a373901f70790cc7556603e55..cde397a9fb4360954b55d0fb766422eeae6b5b02 100644
--- a/remote/doc/marionette/NewContributors.md
+++ b/remote/doc/marionette/NewContributors.md
@@ -33,7 +33,7 @@ actual bug, yay!
      someone may have answered you in the mean time.
 
   5. If you're having trouble reaching us over Element, you are welcome to send an
-     email to our [mailing list](index.html#communication) instead. It's a good
+     email to our [mailing list](index.rst#communication) instead. It's a good
      idea to include your Element nick in your email message.
 
 [Element]: https://chat.mozilla.org
diff --git a/testing/docs/browser-chrome/index.md b/testing/docs/browser-chrome/index.md
index e4af9685d6a41a2514ecca03fdd6c99c61755775..8240fa1dafaf105e13ef13eb2ce7eb01b4e4c29e 100644
--- a/testing/docs/browser-chrome/index.md
+++ b/testing/docs/browser-chrome/index.md
@@ -11,7 +11,7 @@ implemented in [`Assert.sys.mjs`](../assert.rst).
 These tests are used to test UI-related behaviour in Firefox for
 Desktop. They do not run on Android. If you're testing internal code that
 does not directly interact with the user interface,
-[xpcshell tests](../xpcshell/index.md) are probably a better fit for your needs.
+[xpcshell tests](../xpcshell/index.rst) are probably a better fit for your needs.
 
 
 Running the tests
diff --git a/testing/docs/browser-chrome/writing.md b/testing/docs/browser-chrome/writing.md
index c16cf8ee8714012226e3f6692b678d330d1bb45a..28978be502c061f05ab12667eb8b5f89666a9a5c 100644
--- a/testing/docs/browser-chrome/writing.md
+++ b/testing/docs/browser-chrome/writing.md
@@ -1,6 +1,6 @@
 # Writing new browser mochitests
 
-After [creating a new empty test file](index.html#adding-new-tests), you will
+After [creating a new empty test file](index.md#adding-new-tests), you will
 have an empty `add_task` into which you can write your test.
 
 ## General guidance
@@ -29,7 +29,7 @@ To help do this, a number of useful primitives are available:
 - `add_setup` allows you to add setup tasks that run before any `add_task` tasks.
 - `SpecialPowers.pushPrefEnv` ([see below](#changing-preferences)) allows you to set prefs that will be automatically
   reverted when the test file has finished running.
-- [`BrowserTestUtils.withNewTab`](browsertestutils.html#BrowserTestUtils.withNewTab), allows you to easily run async code
+- [`BrowserTestUtils.withNewTab`](browsertestutils.rst#BrowserTestUtils.withNewTab), allows you to easily run async code
   talking to a tab that you open and close it when done.
 - `registerCleanupFunction` takes an async callback function that you can use
   to do any other cleanup your test might need.
@@ -95,13 +95,13 @@ order for your test to pass reliably on macOS if it uses keyboard focus.
 
 ### Wait for an observer service notification topic or DOM event
 
-Use the utilities for this on [`TestUtils`](../testutils.html#TestUtils.topicObserved):
+Use the utilities for this on [`TestUtils`](../testutils.rst#TestUtils.topicObserved):
 
 ```js
 await TestUtils.topicObserved("sync-pane-loaded");
 ```
 
-and [`BrowserTestUtils`](browsertestutils.html#BrowserTestUtils.waitForEvent), respectively:
+and [`BrowserTestUtils`](browsertestutils.rst#BrowserTestUtils.waitForEvent), respectively:
 
 ```js
 await BrowserTestUtils.waitForEvent(domElement, "click");
@@ -109,7 +109,7 @@ await BrowserTestUtils.waitForEvent(domElement, "click");
 
 ### Wait for some DOM to update.
 
-Use [`BrowserTestUtils.waitForMutationCondition`](browsertestutils.html#BrowserTestUtils.waitForMutationCondition).
+Use [`BrowserTestUtils.waitForMutationCondition`](browsertestutils.rst#BrowserTestUtils.waitForMutationCondition).
 Do **not** use `waitForCondition`, which uses a timeout loop and often
 leads to intermittent failures.
 
diff --git a/testing/geckodriver/doc/Bugs.md b/testing/geckodriver/doc/Bugs.md
index 6823e5dee596311c5ec759dbcff41b8da86f9865..b561bd41b584e64a35ba06a9c909bcdc437e5b66 100644
--- a/testing/geckodriver/doc/Bugs.md
+++ b/testing/geckodriver/doc/Bugs.md
@@ -38,7 +38,7 @@ character, we will continue with triaging it and file a bug where it
 is appropriate.  Bugs specific to geckodriver will be filed in the
 [`Testing :: geckodriver`] component in Bugzilla.
 
-[mailing list]: ./#communication
+[mailing list]: index.rst/#communication
 [trace-level log]: TraceLogs.md
 [GitHub issue tracker]: https://github.com/mozilla/geckodriver/issues
 [ISSUE_TEMPLATE.md]: https://raw.githubusercontent.com/mozilla/geckodriver/master/ISSUE_TEMPLATE.md
diff --git a/testing/geckodriver/doc/Support.md b/testing/geckodriver/doc/Support.md
index 5ff189037d354a40360319699570ae83c6ab9374..2d7db52abcf8d8274259de3b60abe11a8f6e6806 100644
--- a/testing/geckodriver/doc/Support.md
+++ b/testing/geckodriver/doc/Support.md
@@ -162,7 +162,7 @@ supported release from Mozilla.
 
 To run tests on Android specific capabilities under `moz:firefoxOptions`
 have to be set when requesting a new session. See the Android section under
-[Firefox Capabilities](Capabilities.html#android) for more details.
+[Firefox Capabilities](Capabilities.md#android) for more details.
 
 [geckodriver releases]: https://github.com/mozilla/geckodriver/releases
 [Selenium]: https://github.com/seleniumhq/selenium
diff --git a/toolkit/components/antitracking/docs/cookie-purging/index.md b/toolkit/components/antitracking/docs/cookie-purging/index.md
index 2bf9919759d823d5380bfd180071d5ecd635d972..7b8c76cd3952779f218f79b452a466271a13b4ac 100644
--- a/toolkit/components/antitracking/docs/cookie-purging/index.md
+++ b/toolkit/components/antitracking/docs/cookie-purging/index.md
@@ -196,7 +196,7 @@ into sets of 100 (controlled by the pref
 #### Debugging
 
 For debugging purposes, it's easiest to trigger storage clearing by
-triggering the service directly via the [Browser Console command line](/devtools-user/browser_console/index.html#browser_console_command_line).
+triggering the service directly via the [Browser Console command line](/devtools-user/browser_console/index.rst#browser_console_command_line).
 Note that this is different from the normal [Web Console](/devtools-user/web_console/index.rst)
 you might use to debug a website, and requires the
 `devtools.chrome.enabled` pref to be set to true to use it interactively.
diff --git a/toolkit/components/glean/docs/dev/ipc.md b/toolkit/components/glean/docs/dev/ipc.md
index b571aa7275851eab39b79c289b089eb4b129ccb3..e008235c051ff687326a537cd055f3ee1ee69ad1 100644
--- a/toolkit/components/glean/docs/dev/ipc.md
+++ b/toolkit/components/glean/docs/dev/ipc.md
@@ -83,7 +83,7 @@ XPCOM component to await child data's arrival:
 ```js
 await Services.fog.testFlushAllChildren();
 ```
-See [the test documentation](testing) for more details on testing FOG.
+See [the test documentation](testing.md) for more details on testing FOG.
 For writing tests about instrumentation, see
 [the instrumentation test documentation](../user/instrumentation_tests).
 
diff --git a/toolkit/components/glean/docs/dev/testing.md b/toolkit/components/glean/docs/dev/testing.md
index f964793bc04c5077cfb2d199b5fd79fe166ea065..fe6c3e0fe7638155d144c90f0a2714d1301c3926 100644
--- a/toolkit/components/glean/docs/dev/testing.md
+++ b/toolkit/components/glean/docs/dev/testing.md
@@ -74,7 +74,7 @@ If you are in C++ and didn't come from JS, use `MOZ_LOG` with module `fog`.
 
 Use the logging macros from `log`, e.g. `log::info!` or `log::error!`.
 Remember that, no matter the log level, `log::debug!` and `log::trace!`
-[will not appear in non-debug builds](/testing-rust-code/index.html#gecko-logging)
+[will not appear in non-debug builds](/testing-rust-code/index.md#gecko-logging)
 
 If you are logging due to a situation caused by and fixable by a developer using the API,
 use `log::error!(...)`. Otherwise, use a quieter level.
diff --git a/toolkit/components/glean/docs/user/index.md b/toolkit/components/glean/docs/user/index.md
index 79b4163a44f3fbf2246bdec858ebfcd4724940ec..f5ddf6d9e3758bb3153d283f108be05356e5d7c5 100644
--- a/toolkit/components/glean/docs/user/index.md
+++ b/toolkit/components/glean/docs/user/index.md
@@ -1,9 +1,9 @@
 # Using Firefox on Glean
 
 This section of docs is designed to be helpful to people instrumenting Firefox Desktop.
-You may wish to begin with the [Getting Started](./getting_started.md) docs.
+You may wish to begin with the [Getting Started](getting_started.md) docs.
 Or, if you're already acquainted with Glean concepts and what FOG is,
-you might want to know [how to migrate a piece of Firefox Telemetry to Glean](migration).
+you might want to know [how to migrate a piece of Firefox Telemetry to Glean](migration.md).
 
 ```{toctree}
 :titlesonly:
diff --git a/toolkit/components/glean/docs/user/instrumentation_tests.md b/toolkit/components/glean/docs/user/instrumentation_tests.md
index 15c049f300e705776aaa0628baf8e7f672b8cad7..4de962c6a8b3633fbc808759335260799b1455ab 100644
--- a/toolkit/components/glean/docs/user/instrumentation_tests.md
+++ b/toolkit/components/glean/docs/user/instrumentation_tests.md
@@ -194,7 +194,7 @@ is a good thing to review first.
 Unfortunately, FOG requires gecko
 (to tell it where the profile dir is, and other things),
 which means we need to use the
-[GTest + FFI approach](/testing-rust-code/index.html#gtests)
+[GTest + FFI approach](/testing-rust-code/index.md#gtests)
 where GTest is the runner and Rust is just the language the test is written in.
 
 This means your test will look like a GTest like this:
diff --git a/widget/cocoa/docs/macos-apis.md b/widget/cocoa/docs/macos-apis.md
index 8e54a2c1bfd5af9c4a05cf3c074bbcffde86b312..20fa9b6f36ebdf9d77f1a1461b2890f109343109 100644
--- a/widget/cocoa/docs/macos-apis.md
+++ b/widget/cocoa/docs/macos-apis.md
@@ -1,7 +1,7 @@
 # Using macOS APIs
 
 With each new macOS release, new APIs are added. Due to the wide range of platforms that Firefox runs on,
-and due to the [wide range of SDKs that we support building with](./sdks.html#supported-sdks),
+and due to the [wide range of SDKs that we support building with](sdks.md#supported-sdks),
 using macOS APIs in Firefox requires some extra care.
 
 ## Availability of APIs, and runtime checks
@@ -66,7 +66,7 @@ if CONFIG['OS_ARCH'] == 'Darwin':
 If you want to use an API that was introduced after 10.12, you now have one extra thing to worry about.
 In addition to the runtime check [described in the previous section](#using-macos-apis), you also
 have to jump through extra hoops in order to allow the build to succeed, because
-[our build target for Firefox has to remain at 10.12 in order for Firefox to run on macOS versions all the way down to macOS 10.12](./sdks.html#supported-sdks).
+[our build target for Firefox has to remain at 10.12 in order for Firefox to run on macOS versions all the way down to macOS 10.12](sdks.md#supported-sdks).
 
 In order to make the compiler accept your code, you will need to copy some amount of the API declaration
 into your own code. Copy it from the newest recent SDK you can get your hands on.
@@ -82,7 +82,7 @@ but the general approach looks like this:
 #endif
 ```
 
-See the [Supporting Multiple SDKs](./sdks.html#supporting-multiple-sdks) docs for more information on the `MAC_OS_X_VERSION_MAX_ALLOWED` macro.
+See the [Supporting Multiple SDKs](sdks.md#supporting-multiple-sdks) docs for more information on the `MAC_OS_X_VERSION_MAX_ALLOWED` macro.
 
 Keep these three things in mind:
 
diff --git a/widget/cocoa/docs/sdks.md b/widget/cocoa/docs/sdks.md
index 66aa2b7519705f99e8ebdb9763d7bbd5e5449352..a8ae632183805918bcc1dd144510533c6fff7c48 100644
--- a/widget/cocoa/docs/sdks.md
+++ b/widget/cocoa/docs/sdks.md
@@ -167,7 +167,7 @@ being used. Here's [an example](https://searchfox.org/mozilla-central/rev/9ad88f
 
 We can also use this macro to supply missing API definitions in such a way that
 they don't conflict with the definitions from the SDK.
-This is described in the "Using macOS APIs" document, under [Using new APIs with old SDKs](./macos-apis.html#using-new-apis-with-old-sdks).
+This is described in the "Using macOS APIs" document, under [Using new APIs with old SDKs](./macos-apis.md#using-new-apis-with-old-sdks).
 
 ## Overriding SDK-dependent runtime behavior