diff --git a/doc/README.md b/doc/README.md
index 3d8ad6246839e6..5c37a1ecdbe435 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -8,38 +8,23 @@ formatting. You do not need to learn the entire style guide before contributing
to documentation. Someone can always edit your material later to conform with
this guide.
-* Documentation is in markdown files with names formatted as
- `lowercase-with-dashes.md`.
- * Use an underscore in the filename only if the underscore is part of the
- topic name (e.g., `child_process`).
- * Some files, such as top-level markdown files, are exceptions.
-* Documents should be word-wrapped at 80 characters.
-* `.editorconfig` describes the preferred formatting.
- * A [plugin][] is available for some editors to apply these rules.
-* Check changes to documentation with `make test-doc -j` or `vcbuild test-doc`.
-* [Use US spelling][].
-* [Use serial commas][].
-* Avoid first-person pronouns (_I_, _we_).
- * Exception: _we recommend foo_ is preferable to _foo is recommended_.
-* Use gender-neutral pronouns and gender-neutral plural nouns.
- * OK: _they_, _their_, _them_, _folks_, _people_, _developers_
- * NOT OK: _his_, _hers_, _him_, _her_, _guys_, _dudes_
-* When combining wrapping elements (parentheses and quotes), place terminal
- punctuation:
- * Inside the wrapping element if the wrapping element contains a complete
- clause.
- * Outside of the wrapping element if the wrapping element contains only a
- fragment of a clause.
-* Documents must start with a level-one heading.
+## Formatting and Structure
+
+### Headings
+
+* Each page must have a single `#`-level title at the top.
+* Chapters in the same page must have `##`-level headings.
+* Sub-chapters need to increase the number of `#` in the heading according to
+ their nesting depth.
+* The page's title must follow [APA title case][title-case].
+* All chapters must follow [sentence case][sentence-style].
+
+### Markdown Rules
+
* Prefer affixing links (`[a link][]`) to inlining links
(`[a link](http://example.com)`).
-* When documenting APIs, update the YAML comment associated with the API as
- appropriate. This is especially true when introducing or deprecating an API.
-* When documenting APIs, every function should have a usage example or
- link to an example that uses the function.
* For code blocks:
* Use [language][]-aware fences. (\`\`\`js
)
-
* For the [info string][], use one of the following.
| Meaning | Info string |
@@ -61,25 +46,39 @@ this guide.
If one of your language-aware fences needs an info string that is not
already on this list, you may use `text` until the grammar gets added to
[`remark-preset-lint-node`][].
-
* Code need not be complete. Treat code blocks as an illustration or aid to
your point, not as complete running programs. If a complete running program
is necessary, include it as an asset in `assets/code-examples` and link to
it.
-* When using underscores, asterisks, and backticks, please use
- backslash-escaping: `\_`, `\*`, and ``\` ``.
+ * When using underscores, asterisks, and backticks, please use
+ backslash-escaping: `\_`, `\*`, and ``\` ``.
+ * No nesting lists more than 2 levels (due to the markdown renderer).
+ * For unordered lists, use asterisks instead of dashes.
+
+### Document Rules
+
+* Documentation is in markdown files with names formatted as
+ `lowercase-with-dashes.md`.
+ * Use an underscore in the filename only if the underscore is part of the
+ topic name (e.g., `child_process`).
+ * Some files, such as top-level markdown files, are exceptions.
+* Documents should be word-wrapped at 80 characters.
+
+## Language
+
+### Spelling, Punctuation, Naming, and Referencing Rules
+
+* [Be direct][].
+* [Use US spelling][].
+* [Use serial commas][].
+* Avoid first-person pronouns (_I_, _we_).
+ * Exception: _we recommend foo_ is preferable to _foo is recommended_.
+* Use gender-neutral pronouns and gender-neutral plural nouns.
+ * OK: _they_, _their_, _them_, _folks_, _people_, _developers_
+ * NOT OK: _his_, _hers_, _him_, _her_, _guys_, _dudes_
* Constructors should use PascalCase.
* Instances should use camelCase.
* Denote methods with parentheses: `socket.end()` instead of `socket.end`.
-* Function arguments or object properties should use the following format:
- * ``* `name` {type|type2} Optional description. **Default:** `value`.``
-
- * For example: \* `byteOffset` {integer} Index of first byte to expose. **Default:** `0`.
-
- * The `type` should refer to a Node.js type or a [JavaScript type][].
-* Function returns should use the following format:
- * \* Returns: {type|type2} Optional description.
- * E.g. \* Returns: {AsyncHook} A reference to `asyncHook`.
* Use official styling for capitalization in products and projects.
* OK: JavaScript, Google's V8
@@ -87,31 +86,240 @@ this guide.
* Use _Node.js_ and not _Node_, _NodeJS_, or similar variants.
* When referring to the executable, _`node`_ is acceptable.
-* [Be direct][].
-
+## Additional Context and Rules
-* When referring to a version of Node.js in prose, use _Node.js_ and the version
- number. Do not prefix the version number with _v_ in prose. This is to avoid
- confusion about whether _v8_ refers to Node.js 8.x or the V8 JavaScript
- engine.
-
- * OK: _Node.js 14.x_, _Node.js 14.3.1_
- * NOT OK: _Node.js v14_
-* [Use sentence-style capitalization for headings][].
+* `.editorconfig` describes the preferred formatting.
+ * A [plugin][] is available for some editors to apply these rules.
+* Check changes to documentation with `make test-doc -j` or `vcbuild test-doc`.
+* When combining wrapping elements (parentheses and quotes), place terminal
+ punctuation:
+ * Inside the wrapping element if the wrapping element contains a complete
+ clause.
+ * Outside of the wrapping element if the wrapping element contains only a
+ fragment of a clause.
+* When documenting APIs, update the YAML comment associated with the API as
+ appropriate. This is especially true when introducing or deprecating an API.
+
+## API References
+
+The following rules only apply to the documentation of APIs.
+
+### Title and description
+
+Each module's API doc must use the actual object name returned by requiring it
+as its title (such as `path`, `fs`, and `querystring`).
+
+Directly under the page title, add a one-line description of the module
+as a markdown quote (beginning with `>`).
+
+Using the `querystring` module as an example:
+
+```markdown
+# querystring
+
+> Utilities for parsing and formatting URL query strings.
+```
+
+### Module methods and events
+
+For modules that are not classes, their methods and events must be listed under
+the `## Methods` and `## Events` chapters.
+
+Using `fs` as an example:
+
+```markdown
+# fs
+
+## Events
+
+### Event: 'close'
+
+## Methods
+
+### `fs.access(path[, mode], callback)`
+```
+
+### Methods and their arguments
+
+The methods chapter must be in the following form:
+
+```markdown
+### `objectName.methodName(required[, optional]))`
+
+* `required` string - A parameter description.
+* `optional` Integer (optional) - Another parameter description.
+
+...
+```
+
+#### Function signature
+
+For modules, the `objectName` is the module's name. For classes, it must be the
+name of the instance of the class, and must not be the same as the module's
+name.
+
+Optional arguments are notated by square brackets `[]` surrounding the optional
+argument as well as the comma required if this optional argument follows
+another argument:
+
+```markdown
+required[, optional]
+```
+
+#### Heading level
+
+The heading can be `###` or `####`-levels depending on whether the method
+belongs to a module or a class.
+
+### Classes
+
+* API classes or classes that are part of modules must be listed under a
+ `## Class: TheClassName` chapter.
+* One page can have multiple classes.
+* Constructors must be listed with `###`-level headings.
+* [Static Methods](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static)
+ must be listed under a `### Static Methods` chapter.
+* [Instance Methods](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Prototype_methods)
+ must be listed under an `### Instance Methods` chapter.
+* All methods that have a return value must start their description with
+ ``Returns `[TYPE]` - (Return description)``
+ * If the method returns an `Object`, its structure can be specified
+ using a colon followed by a newline then an unordered list of properties in
+ the same style as function parameters.
+* Instance Events must be listed under an `### Instance Events` chapter.
+* Instance Properties must be listed under an `### Instance Properties` chapter.
+ * Instance Properties must start with `A [Property Type] ...`
+
+Using the `v8` classes as an example of some of the outlined structure:
+
+```markdown
+# `v8`
+
+## Methods
+
+### `v8.cachedDataVersionTag()`
+
+## Class: Serializer
+
+### Instance Methods
+
+#### `serializer.writeHeader()`
+
+## Class: Deserializer
+
+### Instance Methods
+
+#### `deserializer.readHeader()`
+
+...
+```
+
+### Methods and their arguments
+
+The methods chapter must be in the following form:
+
+```markdown
+### `objectName.methodName(required[, optional]))`
+
+* `required` string - A parameter description.
+* `optional` Integer (optional) - Another parameter description.
+
+...
+```
+
+#### Heading level
+
+The heading can be `###` or `####`-levels depending on whether the method
+belongs to a module or a class.
+
+#### Function signature
+
+For modules, the `objectName` is the module's name. For classes, it must be the
+name of the instance of the class, and must not be the same as the module's
+name.
+
+Optional arguments are notated by square brackets `[]` surrounding the optional
+argument as well as the comma required if this optional argument follows
+another argument:
+
+```markdown
+required[, optional]
+```
+
+#### Argument descriptions
+
+More detailed information on each of the arguments is noted in an unordered list
+below the method. The type of argument is notated by either JavaScript
+primitives (e.g. `string`, `Promise`, or `Object`), a custom API structure,
+or the wildcard `any`.
+
+If the argument is of type `Array`, use `[]` shorthand with the type of value
+inside the array (for example,`any[]` or `string[]`).
+
+If the argument is of type `Promise`, parametrize the type with what the promise
+resolves to (for example, `Promise` or `Promise`).
+
+If an argument can be of multiple types, separate the types with `|`.
+
+The description for `Function` type arguments should make it clear how it may be
+called and list the types of the parameters that will be passed to it.
+
+#### Platform-specific functionality
+
+If an argument or a method is unique to certain platforms, those platforms are
+denoted using a space-delimited italicized list following the datatype. Values
+can be `macOS`, `Windows` or `Linux`.
+
+```markdown
+* `path` boolean (optional) _macOS_ _Windows_ - the path to write a file to.
+```
+
+### Events
+
+The events chapter must be in following form:
+
+```markdown
+#### Event: 'message'
+
+Returns:
+
+* `value` any - The transmitted value.
+
+...
+```
+
+The heading can be `###` or `####`-levels depending on whether the event
+belongs to a module or a class.
+
+The arguments of an event follow the same rules as methods.
+
+### Properties
+
+The properties chapter must be in following form:
+
+```markdown
+#### `port.close()`
+
+...
+```
+
+The heading can be `###` or `####`-levels depending on whether the property
+belongs to a module or a class.
-See also API documentation structure overview in [doctools README][].
+## See Also
-For topics not covered here, refer to the [Microsoft Writing Style Guide][].
+* API documentation structure overview in [doctools README][].
+* [Microsoft Writing Style Guide][].
[Be direct]: https://docs.microsoft.com/en-us/style-guide/word-choice/use-simple-words-concise-sentences
-[Javascript type]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Data_structures_and_types
[Microsoft Writing Style Guide]: https://docs.microsoft.com/en-us/style-guide/welcome/
[Use US spelling]: https://docs.microsoft.com/en-us/style-guide/word-choice/use-us-spelling-avoid-non-english-words
-[Use sentence-style capitalization for headings]: https://docs.microsoft.com/en-us/style-guide/scannable-content/headings#formatting-headings
[Use serial commas]: https://docs.microsoft.com/en-us/style-guide/punctuation/commas
[`remark-preset-lint-node`]: https://github.com/nodejs/remark-preset-lint-node
-[doctools README]: ../tools/doc/README.md
+[doctools README]: ../../tools/doc/README.md
[info string]: https://github.github.com/gfm/#info-string
[language]: https://github.com/highlightjs/highlight.js/blob/HEAD/SUPPORTED_LANGUAGES.md
[plugin]: https://editorconfig.org/#download
+[sentence-style]: https://docs.microsoft.com/en-us/style-guide/scannable-content/headings#formatting-headings
+[title-case]: https://apastyle.apa.org/style-grammar-guidelines/capitalization/title-case