Import Cobalt 24.lts.30.1032870
diff --git a/.github/actions/on_device_tests/action.yaml b/.github/actions/on_device_tests/action.yaml
index d07f984..7b9ef1e 100644
--- a/.github/actions/on_device_tests/action.yaml
+++ b/.github/actions/on_device_tests/action.yaml
@@ -43,7 +43,7 @@
           echo "USE_SHARDING=1" >> $GITHUB_ENV
         fi
       shell: bash
-    - name: trigger ${{ env.SHARD_NAME }} tests on ${{ matrix.platform }} platform
+    - name: run ${{ env.SHARD_NAME }} tests on ${{ matrix.platform }} platform
       env:
         GITHUB_SHA: ${{ github.sha }}
         GITHUB_TOKEN: ${{ github.token }}
@@ -59,44 +59,30 @@
         GITHUB_COMMIT_AUTHOR_EMAIL: ${{ github.event.commits[0].author.email }}
       run: |
         set -uxe
-        SESSION_ID=$(
-          python3 tools/on_device_tests_gateway_client.py \
-            --token ${GITHUB_TOKEN} \
-            --change_id "${GITHUB_PR_HEAD_SHA:-$GITHUB_SHA}" \
-            trigger \
-            --test_type ${{ env.TEST_TYPE }} \
-            --platform ${{ matrix.target_platform }} \
-            --config ${{ matrix.config }} \
-            --tag cobalt_github_${GITHUB_EVENT_NAME} \
-            --builder_name github_${{ matrix.platform }}_tests \
-            --build_number ${GITHUB_RUN_NUMBER} \
-            ${LOADER_PLATFORM:+"--loader_config" "$LOADER_CONFIG"} \
-            ${LOADER_PLATFORM:+"--loader_platform" "$LOADER_PLATFORM"} \
-            ${DIMENSION:+"--dimension" "$DIMENSION"} \
-            ${USE_SHARDING:+"--unittest_shard_index" "${{ matrix.shard }}"} \
-            ${ON_DEVICE_TEST_ATTEMPTS:+"--test_attempts" "$ON_DEVICE_TEST_ATTEMPTS"} \
-            --archive_path gs://${PROJECT_NAME}-test-artifacts/${WORKFLOW}/${GITHUB_RUN_NUMBER}/${{ matrix.platform }}_${{ matrix.config }}/artifacts.tar \
-            --label github \
-            --label ${GITHUB_EVENT_NAME} \
-            --label ${WORKFLOW} \
-            --label actor-${GITHUB_ACTOR} \
-            --label actor_id-${GITHUB_ACTOR_ID} \
-            --label triggering_actor-${GITHUB_TRIGGERING_ACTOR} \
-            --label sha-${GITHUB_SHA} \
-            --label repository-${GITHUB_REPO} \
-            --label author-${GITHUB_PR_HEAD_USER_LOGIN:-$GITHUB_COMMIT_AUTHOR_USERNAME} \
-            --label author_id-${GITHUB_PR_HEAD_USER_ID:-$GITHUB_COMMIT_AUTHOR_EMAIL}
-        )
-        echo "SESSION_ID=$SESSION_ID" >> $GITHUB_ENV
-      shell: bash
-    - name: watch ${{ env.SHARD_NAME }} tests on ${{ matrix.platform }} platform
-      env:
-        GITHUB_TOKEN: ${{ github.token }}
-        GITHUB_SHA: ${{ github.sha }}
-      run: |
-        set -uxe
         python3 tools/on_device_tests_gateway_client.py \
-          --token "${GITHUB_TOKEN}" \
-          --change_id "${GITHUB_SHA}" \
-          watch ${{ env.SESSION_ID }}
+          --token ${GITHUB_TOKEN} \
+          --change_id "${GITHUB_PR_HEAD_SHA:-$GITHUB_SHA}" \
+          trigger \
+          --test_type ${{ env.TEST_TYPE }} \
+          --platform ${{ matrix.target_platform }} \
+          --config ${{ matrix.config }} \
+          --tag cobalt_github_${GITHUB_EVENT_NAME} \
+          --builder_name github_${{ matrix.platform }}_tests \
+          --build_number ${GITHUB_RUN_NUMBER} \
+          ${LOADER_PLATFORM:+"--loader_config" "$LOADER_CONFIG"} \
+          ${LOADER_PLATFORM:+"--loader_platform" "$LOADER_PLATFORM"} \
+          ${DIMENSION:+"--dimension" "$DIMENSION"} \
+          ${USE_SHARDING:+"--unittest_shard_index" "${{ matrix.shard }}"} \
+          ${ON_DEVICE_TEST_ATTEMPTS:+"--test_attempts" "$ON_DEVICE_TEST_ATTEMPTS"} \
+          --archive_path gs://${PROJECT_NAME}-test-artifacts/${WORKFLOW}/${GITHUB_RUN_NUMBER}/${{ matrix.platform }}_${{ matrix.config }}/artifacts.tar \
+          --label github \
+          --label ${GITHUB_EVENT_NAME} \
+          --label ${WORKFLOW} \
+          --label actor-${GITHUB_ACTOR} \
+          --label actor_id-${GITHUB_ACTOR_ID} \
+          --label triggering_actor-${GITHUB_TRIGGERING_ACTOR} \
+          --label sha-${GITHUB_SHA} \
+          --label repository-${GITHUB_REPO} \
+          --label author-${GITHUB_PR_HEAD_USER_LOGIN:-$GITHUB_COMMIT_AUTHOR_USERNAME} \
+          --label author_id-${GITHUB_PR_HEAD_USER_ID:-$GITHUB_COMMIT_AUTHOR_EMAIL}
       shell: bash
diff --git a/.github/config/linux-clang-3-9.json b/.github/config/linux-clang-3-9.json
index 59bcc19..f994506 100644
--- a/.github/config/linux-clang-3-9.json
+++ b/.github/config/linux-clang-3-9.json
@@ -10,7 +10,7 @@
       "name":"clang-3-9",
       "platform":"linux-x64x11-clang-3-9",
       "target_platform":"linux-x64x11-clang-3-9",
-      "extra_gn_arguments":"using_old_compiler=true"
+      "extra_gn_arguments":"using_old_compiler=true build_with_separate_cobalt_toolchain=true"
     }
   ]
 }
diff --git a/.github/config/linux-gcc-6-3.json b/.github/config/linux-gcc-6-3.json
index 9b65750..4223ca8 100644
--- a/.github/config/linux-gcc-6-3.json
+++ b/.github/config/linux-gcc-6-3.json
@@ -1,5 +1,7 @@
 {
   "docker_service": "build-linux-gcc",
+  "on_host_test": true,
+  "on_host_test_shards": ["0", "1", "2", "3", "blackbox", "wpt"],
   "platforms": [
     "linux-x64x11-gcc-6-3"
   ],
@@ -8,7 +10,7 @@
       "name":"gcc-6-3",
       "platform":"linux-x64x11-gcc-6-3",
       "target_platform":"linux-x64x11-gcc-6-3",
-      "extra_gn_arguments":"is_clang=false using_old_compiler=true"
+      "extra_gn_arguments":"using_old_compiler=true build_with_separate_cobalt_toolchain=true"
     }
   ]
 }
diff --git a/.github/release.yml b/.github/release.yml
new file mode 100644
index 0000000..d8d6482
--- /dev/null
+++ b/.github/release.yml
@@ -0,0 +1,4 @@
+changelog:
+  exclude:
+    labels:
+      - ignore-for-release
diff --git a/.github/workflows/linux_24.lts.1+.yaml b/.github/workflows/linux_24.lts.1+.yaml
index c5a684a..46a0da6 100644
--- a/.github/workflows/linux_24.lts.1+.yaml
+++ b/.github/workflows/linux_24.lts.1+.yaml
@@ -36,6 +36,7 @@
     with:
       platform: linux-clang-3-9
       nightly: ${{ github.event.inputs.nightly }}
+      modular: true
   linux-gcc-6-3:
     uses: ./.github/workflows/main.yaml
     permissions:
@@ -44,6 +45,7 @@
     with:
       platform: linux-gcc-6-3
       nightly: ${{ github.event.inputs.nightly }}
+      modular: true
   # TODO(b/285632780): Enable blackbox tests for modular linux workflows.
   linux-modular:
     uses: ./.github/workflows/main.yaml
diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml
index b34f41e..9ccebb8 100644
--- a/.github/workflows/main.yaml
+++ b/.github/workflows/main.yaml
@@ -47,7 +47,7 @@
   STARBOARD_TOOLCHAINS_DIR: /root/starboard-toolchains
 
 concurrency:
-  group: '${{ github.workflow }}-${{ github.event_name }}-${{ inputs.platform }} @ ${{ github.event.pull_request.number || github.sha }}'
+  group: '${{ github.workflow }}-${{ github.event_name }}-${{ github.event.action }}-${{ inputs.platform }} @ ${{ github.event.pull_request.number || github.sha }}'
   cancel-in-progress: true
 
 # A workflow run is made up of one or more jobs that can run sequentially or in parallel
@@ -119,7 +119,7 @@
   # Builds, tags, and pushes Cobalt docker build images to ghr.
   docker-build-image:
     needs: [initialize]
-    runs-on: [self-hosted, linux, X64]
+    runs-on: [self-hosted, linux-runner]
     permissions:
       packages: write
     steps:
@@ -154,7 +154,7 @@
     needs: [initialize]
     permissions:
       packages: write
-    runs-on: [self-hosted, linux, X64]
+    runs-on: [self-hosted, linux-runner]
     steps:
       - name: Checkout files
         uses: kaidokert/checkout@v3.5.999
@@ -185,7 +185,7 @@
   build:
     needs: [initialize, docker-build-image]
     permissions: {}
-    runs-on: [self-hosted, linux, X64]
+    runs-on: [self-hosted, linux-runner]
     name: ${{matrix.name}}_${{matrix.config}}
     strategy:
       fail-fast: false
@@ -267,7 +267,7 @@
             inputs.nightly == 'true' || github.event_name == 'schedule') &&
             vars.RUN_ODT_TESTS_ON_NIGHTLY != 'False') ||
           ( github.event_name == 'push' && vars.RUN_ODT_TESTS_ON_POSTSUBMIT != 'False' ) )
-    runs-on: [self-hosted, linux, X64]
+    runs-on: [self-hosted, odt-runner]
     name: ${{ matrix.name }}_on_device_${{ matrix.shard }}
     container: ${{ needs.docker-unittest-image.outputs.docker_unittest_tag }}
     permissions: {}
@@ -296,7 +296,7 @@
     needs: [initialize, docker-unittest-image, build]
     permissions: {}
     if: needs.initialize.outputs.on_host_test == 'true'
-    runs-on: [self-hosted, linux, X64]
+    runs-on: [self-hosted, linux-runner]
     name: ${{matrix.name}}_${{matrix.shard}}_test
     strategy:
       fail-fast: false
diff --git a/.github/workflows/main_win.yaml b/.github/workflows/main_win.yaml
index 798394c..b1a121e 100644
--- a/.github/workflows/main_win.yaml
+++ b/.github/workflows/main_win.yaml
@@ -38,7 +38,7 @@
   STARBOARD_TOOLCHAINS_DIR: /root/starboard-toolchains
 
 concurrency:
-  group: '${{ github.workflow }}-${{ github.event_name }}-${{ inputs.platform }} @ ${{ github.event.pull_request.number || github.sha }}'
+  group: '${{ github.workflow }}-${{ github.event_name }}-${{ github.event.action }}-${{ inputs.platform }} @ ${{ github.event.pull_request.number || github.sha }}'
   cancel-in-progress: true
 
 # A workflow run is made up of one or more jobs that can run sequentially or in parallel
diff --git a/base/BUILD.gn b/base/BUILD.gn
index fbfd6b0..3617d54 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -1562,7 +1562,7 @@
     deps += [
       "//nb",
       "//starboard/common",
-      "//starboard",
+      "//starboard:starboard_group",
       "//starboard/client_porting/eztime",
     ]
     deps -= [
diff --git a/base/files/file.cc b/base/files/file.cc
index 36ae965..db43fad 100644
--- a/base/files/file.cc
+++ b/base/files/file.cc
@@ -64,7 +64,13 @@
       tracing_path_(other.tracing_path_),
       error_details_(other.error_details()),
       created_(other.created()),
-      async_(other.async_) {}
+      async_(other.async_)
+#if defined(STARBOARD)
+      ,
+      append_(other.append_)
+#endif
+{
+}
 
 File::~File() {
   // Go through the AssertIOAllowed logic.
@@ -78,6 +84,9 @@
   error_details_ = other.error_details();
   created_ = other.created();
   async_ = other.async_;
+#if defined(STARBOARD)
+  append_ = other.append_;
+#endif
   return *this;
 }
 
diff --git a/base/files/file.h b/base/files/file.h
index 336fe37..443abf8 100644
--- a/base/files/file.h
+++ b/base/files/file.h
@@ -380,7 +380,7 @@
   bool async_;
 
 #if defined(STARBOARD)
-  bool append_;
+  bool append_ = false;
 #endif
 
   DISALLOW_COPY_AND_ASSIGN(File);
diff --git a/base/i18n/icu_util.cc b/base/i18n/icu_util.cc
index 5a812c7..dccc1ac 100644
--- a/base/i18n/icu_util.cc
+++ b/base/i18n/icu_util.cc
@@ -52,7 +52,7 @@
 #if defined(STARBOARD)
 
 bool InitializeICU() {
-  SbIcuInit();
+  IcuInit();
   return true;
 }
 
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index a4e3b91..dbfb550 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -378,7 +378,9 @@
   }
 }
 
-static_library("run_all_unittests") {
+# TODO: b/315170518 - Revert to static library after fixing
+# symbol visibility issues for windows based modular platform builds.
+source_set("run_all_unittests") {
   testonly = true
   sources = [
     "run_all_unittests.cc",
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni
index 2a2cc3c..02218b6 100644
--- a/build/toolchain/gcc_toolchain.gni
+++ b/build/toolchain/gcc_toolchain.gni
@@ -12,6 +12,10 @@
 import("//build/toolchain/rbe.gni")
 import("//build/toolchain/toolchain.gni")
 
+if (use_cobalt_customizations) {
+  import("//starboard/build/config/os_definitions.gni")
+}
+
 if (is_nacl) {
   # To keep NaCl variables out of builds that don't include NaCl, all
   # variables defined in nacl/config.gni referenced here should be protected by
@@ -609,7 +613,12 @@
       if (using_old_compiler) {
         link_command = "$ld {{ldflags}}${extra_ldflags} -o \"$unstripped_outfile\" $start_group_flag @\"$rspfile\" {{solibs}} $end_group_flag {{libs}} $tail_lib_dependencies"
       } else {
-        link_command = "$ld {{ldflags}}${extra_ldflags} {{libs}} -o \"$unstripped_outfile\" $start_group_flag @\"$rspfile\" {{solibs}} $end_group_flag$tail_lib_dependencies"
+        # Windows based platform modular builds dont link directly with the shared library.
+        if (is_host_win && sb_is_modular) {
+          link_command = "$ld {{ldflags}}${extra_ldflags} {{libs}} -o \"$unstripped_outfile\" $start_group_flag @\"$rspfile\"  $end_group_flag$tail_lib_dependencies"
+        } else {
+          link_command = "$ld {{ldflags}}${extra_ldflags} {{libs}} -o \"$unstripped_outfile\" $start_group_flag @\"$rspfile\" {{solibs}} $end_group_flag$tail_lib_dependencies"
+        }
       }
 
       # Generate a map file to be used for binary size analysis.
diff --git a/cobalt/base/BUILD.gn b/cobalt/base/BUILD.gn
index f2652cc..1f78912 100644
--- a/cobalt/base/BUILD.gn
+++ b/cobalt/base/BUILD.gn
@@ -122,7 +122,7 @@
   deps = [
     ":base",
     "//cobalt/test:run_all_unittests",
-    "//starboard",
+    "//starboard:starboard_group",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/cobalt/bindings/_env.py b/cobalt/bindings/_env.py
deleted file mode 100644
index 4b705c2..0000000
--- a/cobalt/bindings/_env.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Sets PYTHONPATH for third_party/blink modules to work correctly."""
-
-from os import path
-import sys
-
-_REPO_ROOT = path.abspath(
-    path.join(path.dirname(__file__), path.pardir, path.pardir))
-_BLINK_PATHS = [
-    path.join(_REPO_ROOT, 'third_party', 'blink', 'Tools', 'Scripts'),
-    path.join(_REPO_ROOT, 'third_party', 'blink', 'Source', 'bindings',
-              'scripts'),
-]
-
-if _REPO_ROOT not in sys.path:
-  sys.path.insert(0, _REPO_ROOT)
-
-for path in _BLINK_PATHS:
-  if path not in sys.path:
-    sys.path.append(path)
diff --git a/cobalt/bindings/code_generator_cobalt.py b/cobalt/bindings/code_generator_cobalt.py
index 6756410..18f0a15 100644
--- a/cobalt/bindings/code_generator_cobalt.py
+++ b/cobalt/bindings/code_generator_cobalt.py
@@ -22,7 +22,12 @@
 import os
 import sys
 
-import _env  # pylint: disable=unused-import
+bindings_dir = os.path.join(
+    os.path.dirname(__file__),
+    '../../third_party/blink/Source/bindings/scripts')
+sys.path.insert(0, bindings_dir)
+
+# pylint:disable=wrong-import-position
 from cobalt.bindings import path_generator
 from cobalt.bindings.contexts import ContextBuilder
 from cobalt.bindings.name_conversion import get_interface_name
diff --git a/cobalt/bindings/contexts.py b/cobalt/bindings/contexts.py
index 7cdbea0..4f4543a 100644
--- a/cobalt/bindings/contexts.py
+++ b/cobalt/bindings/contexts.py
@@ -18,7 +18,6 @@
 dicts that will be used by Jinja in JS bindings generation.
 """
 
-import _env  # pylint: disable=unused-import
 from cobalt.bindings.name_conversion import capitalize_function_name
 from cobalt.bindings.name_conversion import convert_to_cobalt_constant_name
 from cobalt.bindings.name_conversion import convert_to_cobalt_enumeration_value
diff --git a/cobalt/bindings/flatten_idls_test.py b/cobalt/bindings/flatten_idls_test.py
index 0401c72..eea743e 100644
--- a/cobalt/bindings/flatten_idls_test.py
+++ b/cobalt/bindings/flatten_idls_test.py
@@ -20,7 +20,6 @@
 import platform
 import unittest
 
-from . import _env  # pylint: disable=unused-import
 from cobalt.bindings import flatten_idls
 
 
diff --git a/cobalt/bindings/generate_conversion_header.py b/cobalt/bindings/generate_conversion_header.py
index 69d0c1e..e7822f0 100644
--- a/cobalt/bindings/generate_conversion_header.py
+++ b/cobalt/bindings/generate_conversion_header.py
@@ -20,7 +20,14 @@
 from optparse import OptionParser  # pylint: disable=deprecated-module
 import os
 import pickle
+import sys
 
+bindings_dir = os.path.join(
+    os.path.dirname(__file__),
+    '../../third_party/blink/Source/bindings/scripts')
+sys.path.insert(0, bindings_dir)
+
+# pylint:disable=wrong-import-position
 from utilities import ComponentInfoProviderCobalt
 from utilities import write_file
 
diff --git a/cobalt/bindings/idl_compiler_cobalt.py b/cobalt/bindings/idl_compiler_cobalt.py
index 6b8c09d..fa2622f 100644
--- a/cobalt/bindings/idl_compiler_cobalt.py
+++ b/cobalt/bindings/idl_compiler_cobalt.py
@@ -21,7 +21,6 @@
 import os
 import pickle
 
-import _env  # pylint: disable=unused-import
 from idl_compiler import IdlCompiler
 from utilities import ComponentInfoProviderCobalt
 from utilities import idl_filename_to_interface_name
diff --git a/cobalt/bindings/path_generator_test.py b/cobalt/bindings/path_generator_test.py
index a6f2ce0..65cacaf 100644
--- a/cobalt/bindings/path_generator_test.py
+++ b/cobalt/bindings/path_generator_test.py
@@ -16,7 +16,6 @@
 
 import unittest
 
-from . import _env  # pylint: disable=unused-import
 from cobalt.bindings.path_generator import PathBuilder
 
 
diff --git a/cobalt/bindings/run_cobalt_bindings_tests.py b/cobalt/bindings/run_cobalt_bindings_tests.py
index b843085..2bcc26b 100755
--- a/cobalt/bindings/run_cobalt_bindings_tests.py
+++ b/cobalt/bindings/run_cobalt_bindings_tests.py
@@ -25,7 +25,6 @@
 import argparse
 import os
 import sys
-import _env  # pylint: disable=unused-import
 
 from cobalt.bindings.idl_compiler_cobalt import IdlCompilerCobalt
 from cobalt.bindings.v8c.code_generator_v8c import CodeGeneratorV8c
diff --git a/cobalt/bindings/v8c/_env.py b/cobalt/bindings/v8c/_env.py
deleted file mode 100644
index ea1f9b1..0000000
--- a/cobalt/bindings/v8c/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source  # pylint: disable=deprecated-module
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print(f'{__file__}: Can\'t find repo root.\nMissing parent: {_ENV}')
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/bindings/v8c/generate_conversion_header_v8c.py b/cobalt/bindings/v8c/generate_conversion_header_v8c.py
index c14dea7..4d48b39 100644
--- a/cobalt/bindings/v8c/generate_conversion_header_v8c.py
+++ b/cobalt/bindings/v8c/generate_conversion_header_v8c.py
@@ -15,7 +15,6 @@
 
 import sys
 
-import _env  # pylint: disable=unused-import
 from cobalt.bindings.generate_conversion_header import generate_header
 from cobalt.bindings.v8c.code_generator_v8c import CodeGeneratorV8c
 
diff --git a/cobalt/bindings/v8c/idl_compiler_v8c.py b/cobalt/bindings/v8c/idl_compiler_v8c.py
index 09ca3f4..da13a0e 100644
--- a/cobalt/bindings/v8c/idl_compiler_v8c.py
+++ b/cobalt/bindings/v8c/idl_compiler_v8c.py
@@ -19,8 +19,14 @@
 
 import logging
 import sys
+import os
 
-import _env  #pylint: disable=import-error,unused-import
+bindings_dir = os.path.join(
+    os.path.dirname(__file__),
+    '../../../third_party/blink/Source/bindings/scripts')
+sys.path.insert(0, bindings_dir)
+
+# pylint:disable=wrong-import-position
 from cobalt.bindings.idl_compiler_cobalt import generate_bindings
 from cobalt.bindings.v8c.code_generator_v8c import CodeGeneratorV8c
 
diff --git a/cobalt/black_box_tests/black_box_tests.py b/cobalt/black_box_tests/black_box_tests.py
index 2e86d0f..7dc6fd7 100755
--- a/cobalt/black_box_tests/black_box_tests.py
+++ b/cobalt/black_box_tests/black_box_tests.py
@@ -34,7 +34,6 @@
 from starboard.tools import log_level
 
 _DISABLED_BLACKBOXTEST_CONFIGS = [
-    'android-arm/devel',
     'android-arm64/devel',
     'android-x86/devel',
     'evergreen-arm/devel',
@@ -180,6 +179,9 @@
       loader_out_directory=launcher_params.loader_out_directory)
 
   test_targets = []
+  test_filters = build.GetPlatformConfig(
+      _launcher_params.platform).GetApplicationConfiguration(
+          'cobalt').GetTestFilters()
 
   if test_set in ['all', 'blackbox']:
     test_targets = _TESTS_NO_SIGNAL
@@ -195,8 +197,14 @@
 
   test_suite = unittest.TestSuite()
   for test in test_targets:
-    test_suite.addTest(unittest.TestLoader().loadTestsFromModule(
-        importlib.import_module(_TEST_DIR_PATH + test)))
+    filter_hit = 0
+    for filtered_test in test_filters:
+      if test == filtered_test.test_name:
+        filter_hit = 1
+        continue
+    if filter_hit == 0:
+      test_suite.addTest(unittest.TestLoader().loadTestsFromModule(
+          importlib.import_module(_TEST_DIR_PATH + test)))
   return test_suite
 
 
@@ -252,12 +260,13 @@
 
     # TODO: Remove generation of --dev_servers_listen_ip once executable will
     # be able to bind correctly with incomplete support of IPv6
-    if args.device_id and IsValidIpAddress(args.device_id):
-      _launcher_params.target_params.append(
-          f'--dev_servers_listen_ip={args.device_id}')
-    elif IsValidIpAddress(_server_binding_address):
-      _launcher_params.target_params.append(
-          f'--dev_servers_listen_ip={_server_binding_address}')
+    if _launcher_params.platform not in ['android-arm', 'android-arm64']:
+      if args.device_id and IsValidIpAddress(args.device_id):
+        _launcher_params.target_params.append(
+            f'--dev_servers_listen_ip={args.device_id}')
+      elif IsValidIpAddress(_server_binding_address):
+        _launcher_params.target_params.append(
+            f'--dev_servers_listen_ip={_server_binding_address}')
     _launcher_params.target_params.append(
         f'--web-platform-test-server=http://web-platform.test:{_wpt_http_port}')
 
diff --git a/cobalt/black_box_tests/testdata/persistent_cookie.html b/cobalt/black_box_tests/testdata/persistent_cookie.html
index d7e838f..f141b39 100644
--- a/cobalt/black_box_tests/testdata/persistent_cookie.html
+++ b/cobalt/black_box_tests/testdata/persistent_cookie.html
@@ -18,7 +18,12 @@
   <script>
     document.body.style.backgroundColor = "green";
     const persistent_cookie = "persistent_cookie_status=exists";
-    const persistent_cookie_expire_time = "; expires=Fri, 18 Dec 2023 12:00:00 UTC";
+
+    // Set the cookie expiration date 2 days in the future.
+    var cookie_date = new Date();
+    cookie_date.setDate(cookie_date.getDate() + 2 /*days*/);
+    const persistent_cookie_expire_time = "; expires=" + cookie_date;
+
     const very_old_date = "; expires=Fri, 18 Dec 2003 12:00:00 UTC";
 
     function firstRun() {
@@ -71,4 +76,4 @@
     }
     setupFinished();
   </script>
-</body>
\ No newline at end of file
+</body>
diff --git a/cobalt/browser/BUILD.gn b/cobalt/browser/BUILD.gn
index 9b7b12c..412247a 100644
--- a/cobalt/browser/BUILD.gn
+++ b/cobalt/browser/BUILD.gn
@@ -168,6 +168,7 @@
     "//cobalt/fetch",
     "//cobalt/h5vcc",
     "//cobalt/input",
+    "//cobalt/js_profiler",
     "//cobalt/layout",
     "//cobalt/loader",
     "//cobalt/math",
@@ -200,7 +201,7 @@
     "//crypto",
     "//nb",
     "//net",
-    "//starboard",
+    "//starboard:starboard_group",
     "//starboard/common",
     "//third_party/icu:icui18n",
     "//third_party/protobuf:protobuf_lite",
diff --git a/cobalt/browser/idl_files.gni b/cobalt/browser/idl_files.gni
index 41539c3..4eba479 100644
--- a/cobalt/browser/idl_files.gni
+++ b/cobalt/browser/idl_files.gni
@@ -255,6 +255,9 @@
   "//cobalt/xhr/xml_http_request.idl",
   "//cobalt/xhr/xml_http_request_event_target.idl",
   "//cobalt/xhr/xml_http_request_upload.idl",
+
+  "//cobalt/js_profiler/profiler.idl",
+  "//cobalt/js_profiler/profiler_trace_wrapper.idl",
 ]
 
 if (!is_gold) {
@@ -313,6 +316,11 @@
   "//cobalt/encoding/text_decode_options.idl",
   "//cobalt/encoding/text_decoder_options.idl",
   "//cobalt/encoding/text_encoder_encode_into_result.idl",
+  "//cobalt/js_profiler/profiler_frame.idl",
+  "//cobalt/js_profiler/profiler_init_options.idl",
+  "//cobalt/js_profiler/profiler_sample.idl",
+  "//cobalt/js_profiler/profiler_stack.idl",
+  "//cobalt/js_profiler/profiler_trace.idl",
   "//cobalt/h5vcc/h5vcc_crash_type.idl",
   "//cobalt/h5vcc/h5vcc_metric_type.idl",
   "//cobalt/h5vcc/h5vcc_storage_resource_type_quota_bytes_dictionary.idl",
diff --git a/cobalt/build/build_info.py b/cobalt/build/build_info.py
index 52f4494..51172fa 100755
--- a/cobalt/build/build_info.py
+++ b/cobalt/build/build_info.py
@@ -24,7 +24,7 @@
 FILE_DIR = os.path.dirname(__file__)
 COMMIT_COUNT_BUILD_ID_OFFSET = 1000000
 
-_BUILD_ID_PATTERN = '^BUILD_NUMBER=([1-9][0-9]{6,})$'
+_BUILD_ID_PATTERN = '^(Build-Id: |BUILD_NUMBER=)([1-9][0-9]{6,})$'
 _GIT_REV_PATTERN = '^GitOrigin-RevId: ([0-9a-f]{40})$'
 _COBALT_VERSION_PATTERN = '^#define COBALT_VERSION "(.*)"$'
 
@@ -40,7 +40,7 @@
   match_build_id = compiled_build_id_pattern.search(output)
   if not match_build_id:
     return None, None
-  build_id = match_build_id.group(1)
+  build_id = match_build_id.group(2)
 
   # Gets git rev.
   compiled_git_rev_pattern = re.compile(_GIT_REV_PATTERN, flags=re.MULTILINE)
diff --git a/cobalt/build/cobalt_configuration.py b/cobalt/build/cobalt_configuration.py
index ca1c943..3c499a4 100644
--- a/cobalt/build/cobalt_configuration.py
+++ b/cobalt/build/cobalt_configuration.py
@@ -143,6 +143,7 @@
         'persistent_settings_test',
         'png_utils_test',
         'poem_unittests',
+        'js_profiler_test',
         'renderer_test',
         'render_tree_test',
         'scroll_engine_tests',
@@ -158,3 +159,8 @@
         'xhr_test',
         'zip_unittests',
     ]
+
+  def GetTestBlackBoxTargets(self):
+    return [
+        'blackbox',
+    ]
diff --git a/cobalt/content/ssl/certs/349f2832.0 b/cobalt/content/ssl/certs/349f2832.0
deleted file mode 100644
index 87a13f6..0000000
--- a/cobalt/content/ssl/certs/349f2832.0
+++ /dev/null
@@ -1,31 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB
-8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy
-dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1
-YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3
-dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh
-IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD
-LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG
-EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g
-KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD
-ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu
-bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg
-ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R
-85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm
-4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV
-HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd
-QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t
-lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB
-o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4
-opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo
-dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW
-ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN
-AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y
-/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k
-SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy
-Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS
-Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl
-nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI=
------END CERTIFICATE-----
diff --git a/cobalt/content/ssl/certs/3e44d2f7.0 b/cobalt/content/ssl/certs/3e44d2f7.0
deleted file mode 100644
index aa392ab..0000000
--- a/cobalt/content/ssl/certs/3e44d2f7.0
+++ /dev/null
@@ -1,36 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV
-BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
-IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
-dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig
-Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk
-MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg
-Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD
-VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy
-dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+
-QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq
-1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp
-2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK
-DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape
-az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF
-3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88
-oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM
-g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3
-mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
-8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd
-BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U
-nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw
-DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX
-dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+
-MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL
-/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX
-CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa
-ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW
-2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7
-N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3
-Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB
-As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp
-5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu
-1uwJ
------END CERTIFICATE-----
diff --git a/cobalt/content/ssl/certs/3e45d192.0 b/cobalt/content/ssl/certs/3e45d192.0
deleted file mode 100644
index a28e9a0..0000000
--- a/cobalt/content/ssl/certs/3e45d192.0
+++ /dev/null
@@ -1,20 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
-FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
-Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG
-A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr
-b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ
-jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn
-PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh
-ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9
-nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h
-q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED
-MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC
-mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3
-7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB
-oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs
-EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO
-fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi
-AmvZWg==
------END CERTIFICATE-----
diff --git a/cobalt/content/ssl/certs/40547a79.0 b/cobalt/content/ssl/certs/40547a79.0
index 6146dcb..dc99810 100644
--- a/cobalt/content/ssl/certs/40547a79.0
+++ b/cobalt/content/ssl/certs/40547a79.0
@@ -1,9 +1,9 @@
 -----BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
+MIID0DCCArigAwIBAgIQIKTEf93f4cdTYwcTiHdgEjANBgkqhkiG9w0BAQUFADCB
 gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
 A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
-BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
-MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
+BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMTAxMDEwMDAw
+MDBaFw0zMDEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
 YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
 RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
@@ -12,14 +12,12 @@
 Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
 +2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
 DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
-nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
-/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
-PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
-QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
-SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
-IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
-zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
-BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
-ZQ==
+nKVIrLsm9wIDAQABo0IwQDAdBgNVHQ4EFgQUC1jli8ZMFTekQKkwqSG+RzZaVv8w
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBAC/JxBwHO89hAgCx2SFRdXIDMLDEFh9sAIsQrK/xR9SuEDwMGvjUk2ysEDd8
+t6aDZK3N3w6HM503sMZ7OHKx8xoOo/lVem0DZgMXlUrxsXrfViEGQo+x06iF3u6X
+HWLrp+cxEmbDD6ZLLkGC9/3JG6gbr+48zuOcrigHoSybJMIPIyaDMouGDx8rEkYl
+Fo92kANr3ryqImhrjKGsKxE5pttwwn1y6TPn/CbxdFqR5p2ErPioBhlG5qfpqjQi
+pKGfeq23sqSaM4hxAjwu1nqyH6LKwN0vEJT9s4yEIHlG1QXUEOTS22RPuFvuG8Ug
+R1uUq27UlTMdphVx8fiUylQ5PsE=
 -----END CERTIFICATE-----
diff --git a/cobalt/content/ssl/certs/4304c5e5.0 b/cobalt/content/ssl/certs/4304c5e5.0
deleted file mode 100644
index 11289bc..0000000
--- a/cobalt/content/ssl/certs/4304c5e5.0
+++ /dev/null
@@ -1,23 +0,0 @@
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
-MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
-dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
-UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
-ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
-c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
-OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
-mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
-BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
-qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
-gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
-bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
-dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
-6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
-h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
-/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
-pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
------END CERTIFICATE-----
diff --git a/cobalt/content/ssl/certs/5860aaa6.0 b/cobalt/content/ssl/certs/5860aaa6.0
new file mode 100644
index 0000000..e52c5ee
--- /dev/null
+++ b/cobalt/content/ssl/certs/5860aaa6.0
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT
+AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD
+VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx
+NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT
+HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5
+IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
+AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl
+dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK
+ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu
+9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O
+be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k=
+-----END CERTIFICATE-----
diff --git a/cobalt/content/ssl/certs/5a7722fb.0 b/cobalt/content/ssl/certs/5a7722fb.0
deleted file mode 100644
index 049a4da..0000000
--- a/cobalt/content/ssl/certs/5a7722fb.0
+++ /dev/null
@@ -1,17 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMw
-gYAxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVn
-cmEgRUJHIEEuUy4xHTAbBgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYD
-VQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENBIEVDQyB2MzAeFw0yMDAzMTgwOTQ2
-NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEPMA0GA1UEBxMGQW5r
-YXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1Z3Jh
-IFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBF
-Q0MgdjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQ
-KczLWYHMjLiSF4mDKpL2w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YK
-fWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMB
-Af8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQzPUwHQYDVR0OBBYEFP+C
-MXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNp
-ADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/6
-7W4WAie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFx
-vmjkI6TZraE3
------END CERTIFICATE-----
diff --git a/cobalt/content/ssl/certs/5d3033c5.0 b/cobalt/content/ssl/certs/5d3033c5.0
deleted file mode 100644
index 23969fe..0000000
--- a/cobalt/content/ssl/certs/5d3033c5.0
+++ /dev/null
@@ -1,25 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD
-VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
-MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
-cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y
-IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB
-pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h
-IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG
-A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU
-cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid
-RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V
-seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme
-9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV
-EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW
-hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/
-DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw
-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD
-ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I
-/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
-ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ
-yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts
-L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN
-zl/HHk484IkzlQsPpTLWPFp5LBk=
------END CERTIFICATE-----
diff --git a/cobalt/content/ssl/certs/66445960.0 b/cobalt/content/ssl/certs/66445960.0
deleted file mode 100644
index 9592787..0000000
--- a/cobalt/content/ssl/certs/66445960.0
+++ /dev/null
@@ -1,34 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIF8zCCA9ugAwIBAgIUDU3FzRYilZYIfrgLfxUGNPt5EDQwDQYJKoZIhvcNAQEL
-BQAwgYAxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUt
-VHVncmEgRUJHIEEuUy4xHTAbBgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYw
-JAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENBIFJTQSB2MzAeFw0yMDAzMTgw
-OTA3MTdaFw00NTAzMTIwOTA3MTdaMIGAMQswCQYDVQQGEwJUUjEPMA0GA1UEBxMG
-QW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1
-Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBD
-QSBSU0EgdjMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCiZvCJt3J7
-7gnJY9LTQ91ew6aEOErxjYG7FL1H6EAX8z3DeEVypi6Q3po61CBxyryfHUuXCscx
-uj7X/iWpKo429NEvx7epXTPcMHD4QGxLsqYxYdE0PD0xesevxKenhOGXpOhL9hd8
-7jwH7eKKV9y2+/hDJVDqJ4GohryPUkqWOmAalrv9c/SF/YP9f4RtNGx/ardLAQO/
-rWm31zLZ9Vdq6YaCPqVmMbMWPcLzJmAy01IesGykNz709a/r4d+ABs8qQedmCeFL
-l+d3vSFtKbZnwy1+7dZ5ZdHPOrbRsV5WYVB6Ws5OUDGAA5hH5+QYfERaxqSzO8bG
-wzrwbMOLyKSRBfP12baqBqG3q+Sx6iEUXIOk/P+2UNOMEiaZdnDpwA+mdPy70Bt4
-znKS4iicvObpCdg604nmvi533wEKb5b25Y08TVJ2Glbhc34XrD2tbKNSEhhw5oBO
-M/J+JjKsBY04pOZ2PJ8QaQ5tndLBeSBrW88zjdGUdjXnXVXHt6woq0bM5zshtQoK
-5EpZ3IE1S0SVEgpnpaH/WwAH0sDM+T/8nzPyAPiMbIedBi3x7+PmBvrFZhNb/FAH
-nnGGstpvdDDPk1Po3CLW3iAfYY2jLqN4MpBs3KwytQXk9TwzDdbgh3cXTJ2w2Amo
-DVf3RIXwyAS+XF1a4xeOVGNpf0l0ZAWMowIDAQABo2MwYTAPBgNVHRMBAf8EBTAD
-AQH/MB8GA1UdIwQYMBaAFLK0ruYt9ybVqnUtdkvAG1Mh0EjvMB0GA1UdDgQWBBSy
-tK7mLfcm1ap1LXZLwBtTIdBI7zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEL
-BQADggIBAImocn+M684uGMQQgC0QDP/7FM0E4BQ8Tpr7nym/Ip5XuYJzEmMmtcyQ
-6dIqKe6cLcwsmb5FJ+Sxce3kOJUxQfJ9emN438o2Fi+CiJ+8EUdPdk3ILY7r3y18
-Tjvarvbj2l0Upq7ohUSdBm6O++96SmotKygY/r+QLHUWnw/qln0F7psTpURs+APQ
-3SPh/QMSEgj0GDSz4DcLdxEBSL9htLX4GdnLTeqjjO/98Aa1bZL0SmFQhO3sSdPk
-vmjmLuMxC1QLGpLWgti2omU8ZgT5Vdps+9u1FGZNlIM7zR6mK7L+d0CGq+ffCsn9
-9t2HVhjYsCxVYJb6CH5SkPVLpi6HfMsg2wY+oF0Dd32iPBMbKaITVaA9FCKvb7jQ
-mhty3QUBjYZgv6Rn7rWlDdF/5horYmbDB7rnoEgcOMPpRfunf/ztAmgayncSd6YA
-VSgU7NbHEqIbZULpkejLPoeJVF3Zr52XnGnnCv8PWniLYypMfUeUP95L6VPQMPHF
-9p5J3zugkaOj/s1YzOrfr28oO6Bpm4/srK4rVJ2bBLFHIK+WEj5jlB0E5y67hscM
-moi/dkfv97ALl2bSRM9gUgfh1SxKOidhd8rXj+eHDjD/DLsE4mHDosiXYY60MGo8
-bcIHX0pzLz/5FooBZu+6kcpSV3uu1OYP3Qt6f4ueJiDPO++BcYNZ
------END CERTIFICATE-----
diff --git a/cobalt/content/ssl/certs/7aaf71c0.0 b/cobalt/content/ssl/certs/7aaf71c0.0
deleted file mode 100644
index ba7bddb..0000000
--- a/cobalt/content/ssl/certs/7aaf71c0.0
+++ /dev/null
@@ -1,25 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD
-VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
-MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
-cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y
-IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV
-BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
-IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
-dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig
-RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb
-3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA
-BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5
-3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou
-owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/
-wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF
-ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf
-BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/
-MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv
-civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2
-AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
-hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50
-soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI
-WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi
-tJ/X5g==
------END CERTIFICATE-----
diff --git a/cobalt/content/ssl/certs/9b46e03d.0 b/cobalt/content/ssl/certs/9b46e03d.0
new file mode 100644
index 0000000..b3d6014
--- /dev/null
+++ b/cobalt/content/ssl/certs/9b46e03d.0
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM
+MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx
+MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00
+MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD
+QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z
+4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv
+Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ
+kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs
+GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln
+nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh
+3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD
+0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy
+geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8
+ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB
+c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI
+pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
+dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
+DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS
+4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs
+o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ
+qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw
+xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM
+rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4
+AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR
+0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY
+o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5
+dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE
+oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ==
+-----END CERTIFICATE-----
diff --git a/cobalt/content/ssl/certs/fb717492.0 b/cobalt/content/ssl/certs/fb717492.0
new file mode 100644
index 0000000..aa1615f
--- /dev/null
+++ b/cobalt/content/ssl/certs/fb717492.0
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w
+LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w
+CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0
+MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF
+Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI
+zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X
+tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4
+AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2
+KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD
+aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu
+CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo
+9H1/IISpQuQo
+-----END CERTIFICATE-----
diff --git a/cobalt/css_parser/parser.cc b/cobalt/css_parser/parser.cc
index aaaf474..9b60505 100644
--- a/cobalt/css_parser/parser.cc
+++ b/cobalt/css_parser/parser.cc
@@ -23,7 +23,6 @@
 #include <string>
 
 #include "base/bind.h"
-#include "base/command_line.h"
 #include "base/containers/hash_tables.h"
 #include "base/lazy_instance.h"
 #include "base/optional.h"
@@ -40,7 +39,6 @@
 #include "cobalt/css_parser/ref_counted_util.h"
 #include "cobalt/css_parser/scanner.h"
 #include "cobalt/css_parser/string_pool.h"
-#include "cobalt/css_parser/switches.h"
 #include "cobalt/css_parser/trivial_string_piece.h"
 #include "cobalt/css_parser/trivial_type_pairs.h"
 #include "cobalt/cssom/active_pseudo_class.h"
@@ -90,6 +88,10 @@
 #include "cobalt/cssom/unicode_range_value.h"
 #include "cobalt/cssom/universal_selector.h"
 #include "cobalt/cssom/url_value.h"
+#if !defined(COBALT_BUILD_TYPE_GOLD)
+#include "base/command_line.h"
+#include "cobalt/css_parser/switches.h"
+#endif  // !defined(COBALT_BUILD_TYPE_GOLD)
 
 namespace cobalt {
 namespace css_parser {
@@ -541,19 +543,23 @@
 void LogWarningCallback(const ::base::DebuggerHooks* debugger_hooks,
                         const std::string& message) {
   CLOG(WARNING, *debugger_hooks) << message;
+#if !defined(COBALT_BUILD_TYPE_GOLD)
   ::base::CommandLine* command_line = ::base::CommandLine::ForCurrentProcess();
   if (command_line->GetSwitchValueASCII(switches::kOnCssWarning) == "crash") {
     IMMEDIATE_CRASH() << message;
   }
+#endif  // !defined(COBALT_BUILD_TYPE_GOLD)
 }
 
 void LogErrorCallback(const ::base::DebuggerHooks* debugger_hooks,
                       const std::string& message) {
   CLOG(ERROR, *debugger_hooks) << message;
+#if !defined(COBALT_BUILD_TYPE_GOLD)
   ::base::CommandLine* command_line = ::base::CommandLine::ForCurrentProcess();
   if (command_line->GetSwitchValueASCII(switches::kOnCssError) == "crash") {
     IMMEDIATE_CRASH() << message;
   }
+#endif  // !defined(COBALT_BUILD_TYPE_GOLD)
 }
 
 }  // namespace
diff --git a/cobalt/css_parser/switches.cc b/cobalt/css_parser/switches.cc
index bb4e085..3818593 100644
--- a/cobalt/css_parser/switches.cc
+++ b/cobalt/css_parser/switches.cc
@@ -20,18 +20,21 @@
 namespace css_parser {
 namespace switches {
 
+#if !defined(COBALT_BUILD_TYPE_GOLD)
 const char kOnCssError[] = "on_css_error";
 const char kOnCssErrorHelp[] =
     "If set to \"crash\", crashes on CSS error even when recoverable.";
 
 const char kOnCssWarning[] = "on_css_warning";
 const char kOnCssWarningHelp[] = "If set to \"crash\", crashes on CSS warning.";
+#endif  // !defined(COBALT_BUILD_TYPE_GOLD)
 
 std::string HelpMessage() {
   std::string help_message;
-  std::map<std::string, const char*> help_map{
-      {kOnCssError, kOnCssErrorHelp},
-      {kOnCssWarning, kOnCssWarningHelp},
+  std::map<std::string, const char*> help_map {
+#if !defined(COBALT_BUILD_TYPE_GOLD)
+    {kOnCssError, kOnCssErrorHelp}, {kOnCssWarning, kOnCssWarningHelp},
+#endif  // !defined(COBALT_BUILD_TYPE_GOLD)
   };
 
   for (const auto& switch_message : help_map) {
diff --git a/cobalt/css_parser/switches.h b/cobalt/css_parser/switches.h
index cd3943f..a59ea7a 100644
--- a/cobalt/css_parser/switches.h
+++ b/cobalt/css_parser/switches.h
@@ -21,10 +21,12 @@
 namespace css_parser {
 namespace switches {
 
+#if !defined(COBALT_BUILD_TYPE_GOLD)
 extern const char kOnCssError[];
 extern const char kOnCssErrorHelp[];
 extern const char kOnCssWarning[];
 extern const char kOnCssWarningHelp[];
+#endif  // !defined(COBALT_BUILD_TYPE_GOLD)
 
 std::string HelpMessage();
 
diff --git a/cobalt/debug/BUILD.gn b/cobalt/debug/BUILD.gn
index 0bdf9b5..eb383aa 100644
--- a/cobalt/debug/BUILD.gn
+++ b/cobalt/debug/BUILD.gn
@@ -46,8 +46,8 @@
     "backend/render_overlay.h",
     "backend/script_debugger_agent.cc",
     "backend/script_debugger_agent.h",
-    "backend/tracing_agent.cc",
-    "backend/tracing_agent.h",
+    "backend/tracing_controller.cc",
+    "backend/tracing_controller.h",
     "command.h",
     "console/debug_hub.cc",
     "console/debug_hub.h",
@@ -77,7 +77,7 @@
     "//cobalt/web",
     "//net",
     "//net:http_server",
-    "//starboard",
+    "//starboard:starboard_group",
     "//third_party/devtools:devtools_frontend_resources",
   ]
 }
diff --git a/cobalt/debug/backend/debug_module.cc b/cobalt/debug/backend/debug_module.cc
index ea767af..b1b09c2 100644
--- a/cobalt/debug/backend/debug_module.cc
+++ b/cobalt/debug/backend/debug_module.cc
@@ -30,7 +30,7 @@
 constexpr char kCssAgent[] = "CssAgent";
 constexpr char kOverlayAgent[] = "OverlayAgent";
 constexpr char kPageAgent[] = "PageAgent";
-constexpr char kTracingAgent[] = "TracingAgent";
+constexpr char kTracingController[] = "TracingController";
 
 // Move the state for a particular agent out of the dictionary holding the
 // state for all agents. Returns a NULL JSONObject if either |agents_state| is
@@ -161,8 +161,8 @@
                                     std::move(page_render_layer),
                                     data.resource_provider));
   }
-  tracing_agent_.reset(
-      new TracingAgent(debug_dispatcher_.get(), script_debugger_.get()));
+  tracing_controller_.reset(
+      new TracingController(debug_dispatcher_.get(), script_debugger_.get()));
 
   // Hook up hybrid agent JavaScript to the DebugBackend.
   debug_backend_->BindAgents(css_agent_);
@@ -190,7 +190,7 @@
     overlay_agent_->Thaw(RemoveAgentState(kOverlayAgent, agents_state));
   if (page_agent_)
     page_agent_->Thaw(RemoveAgentState(kPageAgent, agents_state));
-  tracing_agent_->Thaw(RemoveAgentState(kTracingAgent, agents_state));
+  tracing_controller_->Thaw(RemoveAgentState(kTracingController, agents_state));
 
   is_frozen_ = false;
 }
@@ -213,7 +213,8 @@
     StoreAgentState(agents_state, kOverlayAgent, overlay_agent_->Freeze());
   if (page_agent_)
     StoreAgentState(agents_state, kPageAgent, page_agent_->Freeze());
-  StoreAgentState(agents_state, kTracingAgent, tracing_agent_->Freeze());
+  StoreAgentState(agents_state, kTracingController,
+                  tracing_controller_->Freeze());
 
   // Take the clients from the dispatcher last so they still get events that the
   // agents might send as part of being frozen.
diff --git a/cobalt/debug/backend/debug_module.h b/cobalt/debug/backend/debug_module.h
index 4736968..9185a3c 100644
--- a/cobalt/debug/backend/debug_module.h
+++ b/cobalt/debug/backend/debug_module.h
@@ -33,7 +33,7 @@
 #include "cobalt/debug/backend/page_agent.h"
 #include "cobalt/debug/backend/render_overlay.h"
 #include "cobalt/debug/backend/script_debugger_agent.h"
-#include "cobalt/debug/backend/tracing_agent.h"
+#include "cobalt/debug/backend/tracing_controller.h"
 #include "cobalt/debug/json_object.h"
 #include "cobalt/dom/window.h"
 #include "cobalt/render_tree/resource_provider.h"
@@ -142,7 +142,7 @@
   std::unique_ptr<OverlayAgent> overlay_agent_;
   std::unique_ptr<PageAgent> page_agent_;
   std::unique_ptr<ScriptDebuggerAgent> script_debugger_agent_;
-  std::unique_ptr<TracingAgent> tracing_agent_;
+  std::unique_ptr<TracingController> tracing_controller_;
 };
 
 }  // namespace backend
diff --git a/cobalt/debug/backend/tracing_agent.cc b/cobalt/debug/backend/tracing_agent.cc
deleted file mode 100644
index 1e10129..0000000
--- a/cobalt/debug/backend/tracing_agent.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/debug/backend/tracing_agent.h"
-
-#include "base/bind.h"
-#include "base/values.h"
-#include "cobalt/script/script_debugger.h"
-
-namespace cobalt {
-namespace debug {
-namespace backend {
-
-namespace {
-// Definitions from the set specified here:
-// https://chromedevtools.github.io/devtools-protocol/tot/Tracing
-constexpr char kInspectorDomain[] = "Tracing";
-
-// State parameters
-constexpr char kStarted[] = "started";
-constexpr char kCategories[] = "categories";
-
-// Size in characters of JSON to batch dataCollected events.
-constexpr size_t kDataCollectedSize = 24 * 1024;
-}  // namespace
-
-TracingAgent::TracingAgent(DebugDispatcher* dispatcher,
-                           script::ScriptDebugger* script_debugger)
-    : dispatcher_(dispatcher),
-      script_debugger_(script_debugger),
-      tracing_started_(false),
-      collected_size_(0),
-      commands_(kInspectorDomain) {
-  DCHECK(dispatcher_);
-
-  commands_["end"] = base::Bind(&TracingAgent::End, base::Unretained(this));
-  commands_["start"] = base::Bind(&TracingAgent::Start, base::Unretained(this));
-}
-
-void TracingAgent::Thaw(JSONObject agent_state) {
-  dispatcher_->AddDomain(kInspectorDomain, commands_.Bind());
-  if (!agent_state) return;
-
-  // Restore state
-  categories_.clear();
-  for (const auto& category : agent_state->FindKey(kCategories)->GetList()) {
-    categories_.emplace_back(category.GetString());
-  }
-  tracing_started_ = agent_state->FindKey(kStarted)->GetBool();
-  if (tracing_started_) {
-    script_debugger_->StartTracing(categories_, this);
-  }
-}
-
-JSONObject TracingAgent::Freeze() {
-  if (tracing_started_) {
-    script_debugger_->StopTracing();
-  }
-
-  dispatcher_->RemoveDomain(kInspectorDomain);
-
-  // Save state
-  JSONObject agent_state(new base::DictionaryValue());
-  agent_state->SetKey(kStarted, base::Value(tracing_started_));
-  base::Value::ListStorage categories_list;
-  for (const auto& category : categories_) {
-    categories_list.emplace_back(category);
-  }
-  agent_state->SetKey(kCategories, base::Value(std::move(categories_list)));
-
-  return agent_state;
-}
-
-void TracingAgent::End(Command command) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  if (!tracing_started_) {
-    command.SendErrorResponse(Command::kInvalidRequest, "Tracing not started");
-    return;
-  }
-  tracing_started_ = false;
-  categories_.clear();
-  command.SendResponse();
-
-  script_debugger_->StopTracing();
-}
-
-void TracingAgent::Start(Command command) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  if (tracing_started_) {
-    command.SendErrorResponse(Command::kInvalidRequest,
-                              "Tracing already started");
-    return;
-  }
-
-  JSONObject params = JSONParse(command.GetParams());
-
-  // Parse comma-separated tracing categories parameter.
-  categories_.clear();
-  std::string category_param;
-  if (params->GetString("categories", &category_param)) {
-    for (size_t pos = 0, comma; pos < category_param.size(); pos = comma + 1) {
-      comma = category_param.find(',', pos);
-      if (comma == std::string::npos) comma = category_param.size();
-      std::string category = category_param.substr(pos, comma - pos);
-      categories_.push_back(category);
-    }
-  }
-
-  tracing_started_ = true;
-  script_debugger_->StartTracing(categories_, this);
-
-  command.SendResponse();
-}
-
-void TracingAgent::AppendTraceEvent(const std::string& trace_event_json) {
-  // We initialize a new list into which we collect events both when we start,
-  // and after each time it's released in |SendDataCollectedEvent|.
-  if (!collected_events_) {
-    collected_events_.reset(new base::ListValue());
-  }
-
-  JSONObject event = JSONParse(trace_event_json);
-  if (event) {
-    collected_events_->Append(std::move(event));
-    collected_size_ += trace_event_json.size();
-  }
-
-  if (collected_size_ >= kDataCollectedSize) {
-    SendDataCollectedEvent();
-  }
-}
-
-void TracingAgent::FlushTraceEvents() {
-  SendDataCollectedEvent();
-  dispatcher_->SendEvent(std::string(kInspectorDomain) + ".tracingComplete");
-}
-
-void TracingAgent::SendDataCollectedEvent() {
-  if (collected_events_) {
-    collected_size_ = 0;
-    JSONObject params(new base::DictionaryValue());
-    // Releasing the list into the value param avoids copying it.
-    params->Set("value", std::move(collected_events_));
-    dispatcher_->SendEvent(std::string(kInspectorDomain) + ".dataCollected",
-                           params);
-  }
-}
-
-}  // namespace backend
-}  // namespace debug
-}  // namespace cobalt
diff --git a/cobalt/debug/backend/tracing_agent.h b/cobalt/debug/backend/tracing_agent.h
deleted file mode 100644
index a9c0bda..0000000
--- a/cobalt/debug/backend/tracing_agent.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_DEBUG_BACKEND_TRACING_AGENT_H_
-#define COBALT_DEBUG_BACKEND_TRACING_AGENT_H_
-
-#include <string>
-#include <vector>
-
-#include "base/threading/thread_checker.h"
-#include "base/time/time.h"
-#include "cobalt/debug/backend/command_map.h"
-#include "cobalt/debug/backend/debug_dispatcher.h"
-#include "cobalt/debug/command.h"
-#include "cobalt/script/script_debugger.h"
-
-namespace cobalt {
-namespace debug {
-namespace backend {
-
-// There aren't enable/disable commands in the Tracing domain, so the
-// TracingAgent doesn't use AgentBase.
-//
-// https://chromedevtools.github.io/devtools-protocol/tot/Tracing
-class TracingAgent : public script::ScriptDebugger::TraceDelegate  {
- public:
-  explicit TracingAgent(DebugDispatcher* dispatcher,
-                        script::ScriptDebugger* script_debugger);
-
-  void Thaw(JSONObject agent_state);
-  JSONObject Freeze();
-
-  // TraceDelegate
-  void AppendTraceEvent(const std::string& trace_event_json) override;
-  void FlushTraceEvents() override;
-
- private:
-  void End(Command command);
-  void Start(Command command);
-
-  void SendDataCollectedEvent();
-
-  DebugDispatcher* dispatcher_;
-  script::ScriptDebugger* script_debugger_;
-
-  THREAD_CHECKER(thread_checker_);
-
-  bool tracing_started_;
-  std::vector<std::string> categories_;
-  size_t collected_size_;
-  JSONList collected_events_;
-
-  // Map of member functions implementing commands.
-  CommandMap commands_;
-};
-
-}  // namespace backend
-}  // namespace debug
-}  // namespace cobalt
-
-#endif  // COBALT_DEBUG_BACKEND_TRACING_AGENT_H_
diff --git a/cobalt/debug/backend/tracing_controller.cc b/cobalt/debug/backend/tracing_controller.cc
new file mode 100644
index 0000000..e67c749
--- /dev/null
+++ b/cobalt/debug/backend/tracing_controller.cc
@@ -0,0 +1,291 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/debug/backend/tracing_controller.h"
+
+#include <iostream>
+#include <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/threading/thread.h"
+#include "base/trace_event/trace_event.h"
+#include "base/values.h"
+#include "cobalt/script/script_debugger.h"
+#include "starboard/common/string.h"
+
+namespace cobalt {
+namespace debug {
+namespace backend {
+
+namespace {
+// Definitions from the set specified here:
+// https://chromedevtools.github.io/devtools-protocol/tot/Tracing
+constexpr char kInspectorDomain[] = "Tracing";
+
+// State parameters
+constexpr char kStarted[] = "started";
+constexpr char kCategories[] = "categories";
+
+}  // namespace
+
+
+///////////////// TRACE EVENT AGENT ///////////////////////////////////
+
+void TraceEventAgent::StartAgentTracing(
+    const TraceConfig& trace_config,
+    StartAgentTracingCallback on_start_callback) {
+  json_output_.json_output.clear();
+  trace_buffer_.SetOutputCallback(json_output_.GetCallback());
+
+  base::trace_event::TraceLog* tracelog =
+      base::trace_event::TraceLog::GetInstance();
+  DCHECK(!tracelog->IsEnabled());
+
+  tracelog->SetEnabled(trace_config,
+                       base::trace_event::TraceLog::RECORDING_MODE);
+
+  std::move(on_start_callback).Run(agent_name_, true);
+}
+
+void TraceEventAgent::StopAgentTracing(
+    StopAgentTracingCallback on_stop_callback) {
+  base::trace_event::TraceLog* trace_log =
+      base::trace_event::TraceLog::GetInstance();
+
+  DCHECK(trace_log->IsEnabled());
+  trace_log->SetDisabled(base::trace_event::TraceLog::RECORDING_MODE);
+
+  base::Thread thread("json_outputter");
+  thread.Start();
+
+  trace_buffer_.Start();
+  base::WaitableEvent waitable_event;
+  auto collect_data_callback =
+      base::Bind(&TraceEventAgent::CollectTraceData, base::Unretained(this),
+                 base::BindRepeating(&base::WaitableEvent::Signal,
+                                     base::Unretained(&waitable_event)));
+  //  Write out the actual data by calling Flush().  Within Flush(), this
+  //  will call OutputTraceData(), possibly multiple times.  We have to do this
+  //  on a thread as there will be tasks posted to the current thread for data
+  //  writing.
+  thread.message_loop()->task_runner()->PostTask(
+      FROM_HERE, base::BindRepeating(&base::trace_event::TraceLog::Flush,
+                                     base::Unretained(trace_log),
+                                     collect_data_callback, false));
+  waitable_event.Wait();
+  trace_buffer_.Finish();
+
+  std::move(on_stop_callback)
+      .Run(agent_name_, agent_event_label_,
+           base::RefCountedString::TakeString(&json_output_.json_output));
+}
+
+
+void TraceEventAgent::CollectTraceData(
+    base::OnceClosure finished_cb,
+    const scoped_refptr<base::RefCountedString>& event_string,
+    bool has_more_events) {
+  trace_buffer_.AddFragment(event_string->data());
+  if (!has_more_events) {
+    std::move(finished_cb).Run();
+  }
+}
+
+///////////////// TRACE V8 AGENT ///////////////////////////////////
+TraceV8Agent::TraceV8Agent(script::ScriptDebugger* script_debugger)
+    : script_debugger_(script_debugger) {}
+
+void TraceV8Agent::AppendTraceEvent(const std::string& trace_event_json) {
+  trace_buffer_.AddFragment(trace_event_json);
+}
+
+void TraceV8Agent::FlushTraceEvents() {
+  trace_buffer_.Finish();
+  std::move(on_stop_callback_)
+      .Run(agent_name_, agent_event_label_,
+           base::RefCountedString::TakeString(&json_output_.json_output));
+}
+
+void TraceV8Agent::StartAgentTracing(const TraceConfig& trace_config,
+                                     StartAgentTracingCallback callback) {
+  json_output_.json_output.clear();
+  trace_buffer_.SetOutputCallback(json_output_.GetCallback());
+  trace_buffer_.Start();
+
+  std::vector<std::string> categories = {"v8", "v8.wasm", "v8.compile",
+                                         "v8.stack_trace"};
+  script_debugger_->StartTracing(categories, this);
+  std::move(callback).Run(agent_name_, true);
+}
+
+void TraceV8Agent::StopAgentTracing(StopAgentTracingCallback callback) {
+  on_stop_callback_ = std::move(callback);
+  script_debugger_->StopTracing();
+}
+
+///////////////// TRACING CONTROLLER //////////////////////////////////
+TracingController::TracingController(DebugDispatcher* dispatcher,
+                                     script::ScriptDebugger* script_debugger)
+    : dispatcher_(dispatcher),
+      tracing_started_(false),
+      collected_size_(0),
+      commands_(kInspectorDomain) {
+  DCHECK(dispatcher_);
+
+  commands_["end"] =
+      base::Bind(&TracingController::End, base::Unretained(this));
+  commands_["start"] =
+      base::Bind(&TracingController::Start, base::Unretained(this));
+
+  agents_.push_back(std::make_unique<TraceEventAgent>());
+  agents_.push_back(std::make_unique<TraceV8Agent>(script_debugger));
+}
+
+void TracingController::Thaw(JSONObject agent_state) {
+  dispatcher_->AddDomain(kInspectorDomain, commands_.Bind());
+  if (!agent_state) return;
+
+  // Restore state
+  categories_.clear();
+  for (const auto& category : agent_state->FindKey(kCategories)->GetList()) {
+    categories_.emplace_back(category.GetString());
+  }
+  tracing_started_ = agent_state->FindKey(kStarted)->GetBool();
+  if (tracing_started_) {
+    agents_responded_ = 0;
+    auto config = base::trace_event::TraceConfig();
+    for (const auto& a : agents_) {
+      a->StartAgentTracing(config,
+                           base::BindOnce(&TracingController::OnStartTracing,
+                                          base::Unretained(this)));
+    }
+  }
+}
+
+JSONObject TracingController::Freeze() {
+  if (tracing_started_) {
+    for (const auto& a : agents_) {
+      a->StopAgentTracing(base::BindOnce(&TracingController::OnCancelTracing,
+                                         base::Unretained(this)));
+    }
+  }
+
+  dispatcher_->RemoveDomain(kInspectorDomain);
+
+  // Save state
+  JSONObject agent_state(new base::DictionaryValue());
+  agent_state->SetKey(kStarted, base::Value(tracing_started_));
+  base::Value::ListStorage categories_list;
+  for (const auto& category : categories_) {
+    categories_list.emplace_back(category);
+  }
+  agent_state->SetKey(kCategories, base::Value(std::move(categories_list)));
+
+  return agent_state;
+}
+
+void TracingController::End(Command command) {
+  if (!tracing_started_) {
+    command.SendErrorResponse(Command::kInvalidRequest, "Tracing not started");
+    return;
+  }
+  tracing_started_ = false;
+  categories_.clear();
+  command.SendResponse();
+
+  for (const auto& a : agents_) {
+    a->StopAgentTracing(base::BindOnce(&TracingController::OnStopTracing,
+                                       base::Unretained(this)));
+  }
+}
+
+void TracingController::Start(Command command) {
+  if (tracing_started_) {
+    command.SendErrorResponse(Command::kInvalidRequest,
+                              "Tracing already started");
+    return;
+  }
+  JSONObject params = JSONParse(command.GetParams());
+  // Parse comma-separated tracing categories parameter.
+  categories_.clear();
+  std::string category_param;
+  if (params->GetString("categories", &category_param)) {
+    for (size_t pos = 0, comma; pos < category_param.size(); pos = comma + 1) {
+      comma = category_param.find(',', pos);
+      if (comma == std::string::npos) comma = category_param.size();
+      std::string category = category_param.substr(pos, comma - pos);
+      categories_.push_back(category);
+    }
+  }
+
+  collected_events_.reset(new base::ListValue());
+
+  agents_responded_ = 0;
+  auto config = base::trace_event::TraceConfig();
+  for (const auto& a : agents_) {
+    a->StartAgentTracing(config,
+                         base::BindOnce(&TracingController::OnStartTracing,
+                                        base::Unretained(this)));
+  }
+  tracing_started_ = true;
+  command.SendResponse();
+}
+
+void TracingController::OnStartTracing(const std::string& agent_name,
+                                       bool success) {
+  LOG(INFO) << "Tracing Agent:" << agent_name << " Start tracing successful? "
+            << (success ? "true" : "false");
+}
+
+void TracingController::OnStopTracing(
+    const std::string& agent_name, const std::string& events_label,
+    const scoped_refptr<base::RefCountedString>& events_str_ptr) {
+  LOG(INFO) << "Tracing Agent:" << agent_name << " Stop tracing.";
+
+  collected_events_ = base::ListValue::From(
+      base::JSONReader::Read(events_str_ptr->data(), base::JSON_PARSE_RFC));
+  FlushTraceEvents();
+}
+
+void TracingController::OnCancelTracing(
+    const std::string& agent_name, const std::string& events_label,
+    const scoped_refptr<base::RefCountedString>& events_str_ptr) {
+  LOG(INFO) << "Tracing Agent:" << agent_name << " Cancel tracing.";
+}
+
+void TracingController::SendDataCollectedEvent() {
+  if (collected_events_) {
+    std::string events;
+    collected_events_->GetString(0, &events);
+    JSONObject params(new base::DictionaryValue());
+    // Releasing the list into the value param avoids copying it.
+    params->Set("value", std::move(collected_events_));
+    dispatcher_->SendEvent(std::string(kInspectorDomain) + ".dataCollected",
+                           params);
+    collected_size_ = 0;
+  }
+}
+
+void TracingController::FlushTraceEvents() {
+  SendDataCollectedEvent();
+  agents_responded_++;
+  if (agents_responded_ == static_cast<int>(agents_.size())) {
+    dispatcher_->SendEvent(std::string(kInspectorDomain) + ".tracingComplete");
+  }
+}
+
+}  // namespace backend
+}  // namespace debug
+}  // namespace cobalt
diff --git a/cobalt/debug/backend/tracing_controller.h b/cobalt/debug/backend/tracing_controller.h
new file mode 100644
index 0000000..63b6735
--- /dev/null
+++ b/cobalt/debug/backend/tracing_controller.h
@@ -0,0 +1,153 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_DEBUG_BACKEND_TRACING_CONTROLLER_H_
+#define COBALT_DEBUG_BACKEND_TRACING_CONTROLLER_H_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/ref_counted_memory.h"
+#include "base/threading/thread_checker.h"
+#include "base/time/time.h"
+#include "base/trace_event/trace_buffer.h"
+#include "base/trace_event/tracing_agent.h"
+#include "cobalt/debug/backend/command_map.h"
+#include "cobalt/debug/backend/debug_dispatcher.h"
+#include "cobalt/debug/command.h"
+#include "cobalt/script/script_debugger.h"
+
+namespace cobalt {
+namespace debug {
+namespace backend {
+
+
+using base::trace_event::TraceConfig;
+using base::trace_event::TracingAgent;
+
+//////////////////////////////////////////////////////////////////////////////
+
+class TraceEventAgent : public TracingAgent {
+ public:
+  TraceEventAgent() = default;
+  ~TraceEventAgent() = default;
+
+  // TracingAgent Interface
+  std::string GetTracingAgentName() override { return agent_name_; }
+  std::string GetTraceEventLabel() override { return agent_event_label_; }
+  void StartAgentTracing(const TraceConfig& trace_config,
+                         StartAgentTracingCallback callback) override;
+  void StopAgentTracing(StopAgentTracingCallback callback) override;
+
+  void CancelTracing();
+
+ private:
+  void CollectTraceData(
+      base::OnceClosure finished_cb,
+      const scoped_refptr<base::RefCountedString>& event_string,
+      bool has_more_events);
+
+ private:
+  std::string agent_name_{"TraceEventAgent"};
+  std::string agent_event_label_{"Performance Tracing"};
+
+  base::trace_event::TraceResultBuffer trace_buffer_;
+  base::trace_event::TraceResultBuffer::SimpleOutput json_output_;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TraceV8Agent : public TracingAgent,
+                     public script::ScriptDebugger::TraceDelegate {
+ public:
+  explicit TraceV8Agent(script::ScriptDebugger* script_debugger);
+  ~TraceV8Agent() = default;
+
+  // TraceDelegate Interface
+  void AppendTraceEvent(const std::string& trace_event_json) override;
+  void FlushTraceEvents() override;
+
+  // TracingAgent Interface
+  std::string GetTracingAgentName() override { return agent_name_; }
+  std::string GetTraceEventLabel() override { return agent_event_label_; }
+  void StartAgentTracing(const TraceConfig& trace_config,
+                         StartAgentTracingCallback callback) override;
+  void StopAgentTracing(StopAgentTracingCallback callback) override;
+
+ private:
+  std::string agent_name_{"TraceV8Agent"};
+  std::string agent_event_label_{"Performance Tracing"};
+
+  StopAgentTracingCallback on_stop_callback_;
+
+  THREAD_CHECKER(thread_checker_);
+  script::ScriptDebugger* script_debugger_;
+
+  // size_t collected_size_;
+  // JSONList collected_events_;
+  base::trace_event::TraceResultBuffer trace_buffer_;
+  base::trace_event::TraceResultBuffer::SimpleOutput json_output_;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+// https://chromedevtools.github.io/devtools-protocol/tot/Tracing
+class TracingController {
+ public:
+  explicit TracingController(DebugDispatcher* dispatcher,
+                             script::ScriptDebugger* script_debugger);
+  ~TracingController() = default;
+
+  void Thaw(JSONObject agent_state);
+  JSONObject Freeze();
+
+ private:
+  void End(Command command);
+  void Start(Command command);
+
+  void OnStartTracing(const std::string& agent_name, bool success);
+  void OnStopTracing(
+      const std::string& agent_name, const std::string& events_label,
+      const scoped_refptr<base::RefCountedString>& events_str_ptr);
+  void OnCancelTracing(
+      const std::string& agent_name, const std::string& events_label,
+      const scoped_refptr<base::RefCountedString>& events_str_ptr);
+
+
+ private:
+  void SendDataCollectedEvent();
+  void FlushTraceEvents();
+
+ private:
+  DebugDispatcher* dispatcher_;
+  std::vector<std::unique_ptr<TracingAgent>> agents_;
+  std::atomic_int agents_responded_{0};
+
+  bool tracing_started_;
+  std::vector<std::string> categories_;
+
+  size_t collected_size_;
+  JSONList collected_events_;
+
+  // Map of member functions implementing commands.
+  CommandMap commands_;
+};
+
+}  // namespace backend
+}  // namespace debug
+}  // namespace cobalt
+
+#endif  // COBALT_DEBUG_BACKEND_TRACING_CONTROLLER_H_
diff --git a/cobalt/demos/content/configure-max-video-input-size/configure-max-video-input-size.html b/cobalt/demos/content/configure-max-video-input-size/configure-max-video-input-size.html
new file mode 100644
index 0000000..a1d0615
--- /dev/null
+++ b/cobalt/demos/content/configure-max-video-input-size/configure-max-video-input-size.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<!--
+ | Copyright 2024 The Cobalt Authors. All Rights Reserved.
+ |
+ | Licensed under the Apache License, Version 2.0 (the "License");
+ | you may not use this file except in compliance with the License.
+ | You may obtain a copy of the License at
+ |
+ |     http://www.apache.org/licenses/LICENSE-2.0
+ |
+ | Unless required by applicable law or agreed to in writing, software
+ | distributed under the License is distributed on an "AS IS" BASIS,
+ | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ | See the License for the specific language governing permissions and
+ | limitations under the License.
+ -->
+
+<html>
+<head>
+  <title>Configure Max Video Input Size</title>
+  <style>
+    body {
+      background-color: #0f0;
+    }
+    video {
+      height: 240px;
+      width: 426px;
+    }
+  </style>
+</head>
+<body>
+  <script type="text/javascript" src="configure-max-video-input-size.js"></script>
+  <div id="ui-layer">
+    <div class="item">
+      <video id="video1"></video>
+    </div>
+    <div class="item">
+      <video id="video2" muted="1" style="background-color: #4285F4">
+      </video>
+    </div>
+  </div>
+  <br>
+  <div id="status"></div>
+</body>
+</html>
diff --git a/cobalt/demos/content/configure-max-video-input-size/configure-max-video-input-size.js b/cobalt/demos/content/configure-max-video-input-size/configure-max-video-input-size.js
new file mode 100644
index 0000000..405854b
--- /dev/null
+++ b/cobalt/demos/content/configure-max-video-input-size/configure-max-video-input-size.js
@@ -0,0 +1,98 @@
+// Copyright 2024 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+var audioData;
+var videoData;
+
+let status_div;
+
+function downloadMediaData(downloadedCallback) {
+  var xhr = new XMLHttpRequest;
+
+  xhr.onload = function() {
+    audioData = xhr.response;
+    console.log("Downloaded " + audioData.byteLength + " of audio data.");
+
+    xhr.onload = function() {
+      videoData = xhr.response;
+      console.log("Downloaded " + videoData.byteLength + " of video data.");
+      downloadedCallback();
+    }
+
+    xhr.open("GET", "vp9-720p.webm", true);
+    xhr.send();
+  }
+
+  xhr.open("GET", "dash-audio.mp4", true);
+  xhr.responseType = "arraybuffer";
+  xhr.send();
+}
+
+function playVideoOn(videoElement) {
+  var ms = new MediaSource;
+  ms.addEventListener('sourceopen', function() {
+    console.log("Creating SourceBuffer objects.");
+    var audioBuffer = ms.addSourceBuffer('audio/mp4; codecs="mp4a.40.2"');
+    var videoBuffer = ms.addSourceBuffer('video/webm; codecs="vp9"');
+    audioBuffer.addEventListener("updateend", function() {
+      audioBuffer.abort();
+      videoBuffer.addEventListener("updateend", function() {
+        setTimeout(function() {
+          videoBuffer.addEventListener("updateend", function() {
+            videoBuffer.abort();
+            ms.endOfStream();
+            videoElement.ontimeupdate = function() {
+              if (videoElement.currentTime > 10) {
+                console.log("Stop playback.");
+                videoElement.src = '';
+                videoElement.load();
+                videoElement.ontimeupdate = null;
+              }
+            }
+            console.log("Start playback.");
+            videoElement.play();
+          });
+          videoBuffer.appendBuffer(videoData.slice(1024));
+        }, 5000);
+      });
+      videoBuffer.appendBuffer(videoData.slice(0, 1024));
+    });
+    audioBuffer.appendBuffer(audioData);
+  });
+
+  console.log("Attaching MediaSource to video element.");
+  videoElement.src = URL.createObjectURL(ms);
+}
+
+function setupPlayerHandler() {
+  // Setup one primary player and one sub player.
+  // i = 0: primary player, buffer size is 3110500
+  // i = 1: sub player, buffer size is 777000
+  const maxVideoInputSizes = [3110500, 777000];
+  videoElements = document.getElementsByTagName('video');
+  status_div = document.getElementById('status');
+  status_div.innerHTML += 'Video Get Element By Id...<br>';
+  for(let i = 0; i < maxVideoInputSizes.length; i++) {
+    if (videoElements[i].setMaxVideoInputSize && i < videoElements.length) {
+      videoElements[i].setMaxVideoInputSize(maxVideoInputSizes[i]);
+      status_div.innerHTML += 'Set Max Video Input Size of Video Element '+ i + ' to '+ maxVideoInputSizes[i] + '<br>';
+    }
+    if (i == 1 && videoElements[i].setMaxVideoCapabilities) {
+      videoElements[i].setMaxVideoCapabilities("width=1920; height=1080");
+    }
+    playVideoOn(videoElements[i]);
+  }
+}
+
+downloadMediaData(setupPlayerHandler);
diff --git a/cobalt/demos/content/configure-max-video-input-size/dash-audio.mp4 b/cobalt/demos/content/configure-max-video-input-size/dash-audio.mp4
new file mode 100644
index 0000000..b26721c
--- /dev/null
+++ b/cobalt/demos/content/configure-max-video-input-size/dash-audio.mp4
Binary files differ
diff --git a/cobalt/demos/content/configure-max-video-input-size/vp9-720p.webm b/cobalt/demos/content/configure-max-video-input-size/vp9-720p.webm
new file mode 100644
index 0000000..08a670e
--- /dev/null
+++ b/cobalt/demos/content/configure-max-video-input-size/vp9-720p.webm
Binary files differ
diff --git a/cobalt/demos/content/enable-background-playback/enable-background-playback-test.html b/cobalt/demos/content/enable-background-playback/enable-background-playback-test.html
new file mode 100644
index 0000000..a00216b
--- /dev/null
+++ b/cobalt/demos/content/enable-background-playback/enable-background-playback-test.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+
+<head>
+    <title>Test Enable Background Playback</title>
+</head>
+
+<body style="color: white;">
+    <script>
+    function main() {
+        if (window.h5vcc && window.h5vcc.settings) {
+            h5vcc.settings.set('Media.BackgroundPlaybackEnabled', 1);
+        }
+    }
+    main();
+    </script>
+</body>
diff --git a/cobalt/doc/memory_tuning.md b/cobalt/doc/memory_tuning.md
index 662fb59..297a7e4 100644
--- a/cobalt/doc/memory_tuning.md
+++ b/cobalt/doc/memory_tuning.md
@@ -1,4 +1,4 @@
-# Memory Tuning #
+# Memory Tuning
 
 Cobalt is designed to choose sensible parameters for memory-related options and
 parameters through a system called "AutoMem".
@@ -16,7 +16,7 @@
 *Setting `--max_cobalt_cpu_usage` and `--max_cobalt_gpu_usage` on the
 command line is a beta feature.*
 
-### Memory Settings Table ###
+### Memory Settings Table
 
 A table similar to the one below, will be printed on startup.
 
@@ -79,7 +79,7 @@
       * This value was AutoSet to a default value, but then was reduced in
       response to `max_cobalt_cpu_usage` or `max_cobalt_gpu_usage being` set too low.
 
-### Maximum Memory Table ###
+### Maximum Memory Table
 
 This second table is also printed at startup and details the sum of memory and
 maximum memory limits as reported by cobalt.
@@ -128,13 +128,13 @@
 will reduce their memory consumption. When this happens, look for the string
 *`AutoSet (Constrained)`* in the first table.
 
-## Setting Maximum Memory Values ##
+## Setting Maximum Memory Values
 
 The max cpu and gpu memory of the system can be set by command line:
   * `--max_cobalt_cpu_usage=160MB`
   * `--max_cobalt_gpu_usage=160MB`
 
-### Memory Scaling ###
+### Memory Scaling
 
 There are two primary ways in which the memory consumption settings will scale down.
 One is by specifying `--max_cobalt_cpu_usage` (or `max_cobalt_gpu_usage`) to a
@@ -152,7 +152,7 @@
  `--image_cache_size_in_bytes=auto` will allow `image_cache_size_in_bytes` to be
 flexible by disabling the value being set by a build setting.
 
-### Memory Warnings ###
+### Memory Warnings
 
 Cobalt will periodically check to see if the memory consumed by the application
 is less than the `--max_cobalt_cpu_usage` and `--max_cobalt_gpu_usage` amount.
@@ -160,7 +160,7 @@
 once to stdout for cpu and/or gpu memory systems.
 
 
-### Example 1 - Configuring for a memory restricted platform ###
+### Example 1 - Configuring for a memory restricted platform
 
 Let's say that we are configuring platform called "XXX":
 
@@ -186,7 +186,7 @@
 
   * `cobalt --max_cobalt_cpu_usage=160MB`
 
-### Example 2 - Configuring for a memory-plentiful platform ###
+### Example 2 - Configuring for a memory-plentiful platform
 
 The following command line will give a lot of memory to image cache and give
 500MB to `max_cobalt_cpu_usage` and `max_cobalt_gpu_usage`.
@@ -196,9 +196,9 @@
 --image_cache_size_in_bytes=80MB
 ~~~
 
-## API Reference ##
+## API Reference
 
-#### Memory System API ####
+#### Memory System API
 
   * `max_cobalt_cpu_usage`
     * This setting will set the maximum cpu memory that the app will consume.
@@ -218,7 +218,7 @@
       for `max_cobalt_gpu_usage` in commandline/starboard settings then no
       GPU memory checking is performed.
 
-#### Memory Setting API ####
+#### Memory Setting API
 
   * `image_cache_size_in_bytes`
     * See documentation *Image cache capacity* in `performance_tuning.md` for what
@@ -252,7 +252,7 @@
       for what this setting does.
     * Set via command line, or else Cobalt extension, or else automatically by Cobalt.
 
-#### Units for Command Line Settings ####
+#### Units for Command Line Settings
 
 Memory values passed into Cobalt via command line arguments support units such
 kb, mb, and gb for kilo-byte, megabyte, gigabytes. These units are case insensitive.
diff --git a/cobalt/doc/voice_search.md b/cobalt/doc/voice_search.md
index 6a72bee..d002a27 100644
--- a/cobalt/doc/voice_search.md
+++ b/cobalt/doc/voice_search.md
@@ -23,15 +23,15 @@
 
 In `starboard/linux/shared/soft_mic_platform_service.cc` there is an example
 stub implementation of the SoftMicPlatformService. Platforms can optionally
-implement this [CobaltPlatformService](https://cobalt.dev/gen/cobalt/doc/\
-platform_services.html) to specify if they support the `soft mic` and/or `hard mic`
-for voice search. The `soft mic` refers to the software activation of the microphone
-for voice search through the UI microphone button on the Youtube Web Application
-search page. The `hard mic` refers to hardware button activation of the microphone
-for voice search. Platforms can also specify the optional `micGesture`. This
-specifies the type of UI prompt the YouTube Web Application should display to guide
-the user to start voice search. The options include an empty or `null` value for no
-prompt, `"TAP"` for tap the `soft mic` and/or `hard mic` to start voice search, or
+implement this [CobaltPlatformService](platform_services.md) to specify if they
+support the `soft mic` and/or `hard mic` for voice search. The `soft mic` refers
+to the software activation of the microphone for voice search through the UI
+microphone button on the Youtube Web Application search page. The `hard mic`
+refers to hardware button activation of the microphone for voice search.
+Platforms can also specify the optional `micGesture`. This specifies the type of
+UI prompt the YouTube Web Application should display to guide the user to start
+voice search. The options include an empty or `null` value for no prompt,
+`"TAP"` for tap the `soft mic` and/or `hard mic` to start voice search, or
 `"HOLD"` for hold the `soft mic` and/or the `hard mic` to start voice search.
 
 The Web Application messages to the platform will be singular strings, encoded with
diff --git a/cobalt/dom/html_media_element.cc b/cobalt/dom/html_media_element.cc
index da10b2e..45a49ca 100644
--- a/cobalt/dom/html_media_element.cc
+++ b/cobalt/dom/html_media_element.cc
@@ -130,6 +130,7 @@
 
 HTMLMediaElement::HTMLMediaElement(Document* document, base::Token tag_name)
     : HTMLElement(document, tag_name),
+      max_video_input_size_(0),
       load_state_(kWaitingForSource),
       ALLOW_THIS_IN_INITIALIZER_LIST(event_queue_(this)),
       playback_rate_(1.f),
@@ -984,11 +985,6 @@
     MediaEngineError(new MediaError(
         MediaError::kMediaErrDecode,
         message.empty() ? "Media loading failed with decode error." : message));
-  } else if (error == WebMediaPlayer::kNetworkStateCapabilityChangedError) {
-    MediaEngineError(new MediaError(
-        MediaError::kMediaErrCapabilityChanged,
-        message.empty() ? "Media loading failed with capability changed error."
-                        : message));
   } else if ((error == WebMediaPlayer::kNetworkStateFormatError ||
               error == WebMediaPlayer::kNetworkStateNetworkError) &&
              load_state_ == kLoadingFromSrcAttr) {
@@ -1232,7 +1228,6 @@
     case WebMediaPlayer::kNetworkStateFormatError:
     case WebMediaPlayer::kNetworkStateNetworkError:
     case WebMediaPlayer::kNetworkStateDecodeError:
-    case WebMediaPlayer::kNetworkStateCapabilityChangedError:
       NOTREACHED() << "Passed SetNetworkState an error state";
       break;
   }
@@ -1246,7 +1241,6 @@
     case WebMediaPlayer::kNetworkStateFormatError:
     case WebMediaPlayer::kNetworkStateNetworkError:
     case WebMediaPlayer::kNetworkStateDecodeError:
-    case WebMediaPlayer::kNetworkStateCapabilityChangedError:
       MediaLoadingFailed(state, message);
       break;
     case WebMediaPlayer::kNetworkStateEmpty:
@@ -1667,6 +1661,10 @@
   return max_video_capabilities_;
 }
 
+int HTMLMediaElement::MaxVideoInputSize() const {
+  return max_video_input_size_;
+}
+
 bool HTMLMediaElement::PreferDecodeToTexture() {
   TRACE_EVENT0("cobalt::dom", "HTMLMediaElement::PreferDecodeToTexture()");
 
@@ -1762,5 +1760,20 @@
   max_video_capabilities_ = max_video_capabilities;
 }
 
+void HTMLMediaElement::SetMaxVideoInputSize(
+    unsigned int max_video_input_size,
+    script::ExceptionState* exception_state) {
+  if (GetAttribute("src").value_or("").length() > 0) {
+    LOG(WARNING) << "Cannot set max_video_input_size after src is defined.";
+    web::DOMException::Raise(web::DOMException::kInvalidStateErr,
+                             exception_state);
+    return;
+  }
+
+  LOG(INFO) << "max_video_input_size is changed from " << max_video_input_size_
+            << " to " << max_video_input_size;
+  max_video_input_size_ = static_cast<int>(max_video_input_size);
+}
+
 }  // namespace dom
 }  // namespace cobalt
diff --git a/cobalt/dom/html_media_element.h b/cobalt/dom/html_media_element.h
index 612e21c..559c72a 100644
--- a/cobalt/dom/html_media_element.h
+++ b/cobalt/dom/html_media_element.h
@@ -159,6 +159,10 @@
     return !max_video_capabilities_.empty();
   }
 
+  // Set max video input size.
+  void SetMaxVideoInputSize(unsigned int max_video_input_size,
+                            script::ExceptionState* exception_state);
+
   DEFINE_WRAPPABLE_TYPE(HTMLMediaElement);
   void TraceMembers(script::Tracer* tracer) override;
 
@@ -240,6 +244,7 @@
   void SourceOpened(ChunkDemuxer* chunk_demuxer) override;
   std::string SourceURL() const override;
   std::string MaxVideoCapabilities() const override;
+  int MaxVideoInputSize() const override;
   bool PreferDecodeToTexture() override;
   void EncryptedMediaInitDataEncountered(
       const char* init_data_type, const unsigned char* init_data,
@@ -252,6 +257,8 @@
 
   std::string max_video_capabilities_;
 
+  int max_video_input_size_;
+
   // Loading state.
   enum LoadState { kWaitingForSource, kLoadingFromSrcAttr };
   LoadState load_state_;
diff --git a/cobalt/dom/html_video_element.idl b/cobalt/dom/html_video_element.idl
index c54a9f4..565cd62 100644
--- a/cobalt/dom/html_video_element.idl
+++ b/cobalt/dom/html_video_element.idl
@@ -33,4 +33,12 @@
   // is the same as the format for the string passed in to
   // HTMLMediaElement.canPlayType().
   [RaisesException] void setMaxVideoCapabilities(DOMString max_video_capabilities);
+
+  // Non standard interface (b/176923480). Set the maximum size in bytes of an
+  // input buffer for video. This communicates to the platform that the size of
+  // a single input buffer will not exceed the size passed in this function.
+  // This function must be called before the src attribute is set on the element,
+  // otherwise an INVALID_STATE_ERR exception is raised. Use default buffer size
+  // if set to 0.
+  [RaisesException] void setMaxVideoInputSize(unsigned long maxVideoInputSize);
 };
diff --git a/cobalt/dom/media_error.h b/cobalt/dom/media_error.h
index 898af55..c4d9e4e 100644
--- a/cobalt/dom/media_error.h
+++ b/cobalt/dom/media_error.h
@@ -36,7 +36,6 @@
     kMediaErrDecode = 3,
     kMediaErrSrcNotSupported = 4,
     kMediaErrEncrypted = 5,
-    kMediaErrCapabilityChanged = 1000,
   };
 
   // Custom, not in any spec.
diff --git a/cobalt/h5vcc/BUILD.gn b/cobalt/h5vcc/BUILD.gn
index 1de4356..40fccd4 100644
--- a/cobalt/h5vcc/BUILD.gn
+++ b/cobalt/h5vcc/BUILD.gn
@@ -87,7 +87,7 @@
     "//cobalt/web:dom_exception",
     "//cobalt/worker",
     "//net",
-    "//starboard",
+    "//starboard:starboard_group",
     "//third_party/protobuf:protobuf_lite",
   ]
   if (enable_in_app_dial) {
diff --git a/cobalt/h5vcc/h5vcc_settings.cc b/cobalt/h5vcc/h5vcc_settings.cc
index 4c47039..59d76c8 100644
--- a/cobalt/h5vcc/h5vcc_settings.cc
+++ b/cobalt/h5vcc/h5vcc_settings.cc
@@ -104,5 +104,22 @@
   return false;
 }
 
+void H5vccSettings::SetPersistentSettingAsInt(const std::string& key,
+                                              int value) const {
+  if (persistent_settings_) {
+    persistent_settings_->SetPersistentSetting(
+        key, std::make_unique<base::Value>(value));
+  }
+}
+
+int H5vccSettings::GetPersistentSettingAsInt(const std::string& key,
+                                             int default_setting) const {
+  if (persistent_settings_) {
+    return persistent_settings_->GetPersistentSettingAsInt(key,
+                                                           default_setting);
+  }
+  return default_setting;
+}
+
 }  // namespace h5vcc
 }  // namespace cobalt
diff --git a/cobalt/h5vcc/h5vcc_settings.h b/cobalt/h5vcc/h5vcc_settings.h
index f7e10cf..d958c72 100644
--- a/cobalt/h5vcc/h5vcc_settings.h
+++ b/cobalt/h5vcc/h5vcc_settings.h
@@ -58,6 +58,11 @@
   // invalid or not set to the expected value.
   bool Set(const std::string& name, SetValueType value) const;
 
+  void SetPersistentSettingAsInt(const std::string& key, int value) const;
+
+  int GetPersistentSettingAsInt(const std::string& key,
+                                int default_setting) const;
+
   DEFINE_WRAPPABLE_TYPE(H5vccSettings);
 
  private:
diff --git a/cobalt/h5vcc/h5vcc_settings.idl b/cobalt/h5vcc/h5vcc_settings.idl
index 34650a9..703e483 100644
--- a/cobalt/h5vcc/h5vcc_settings.idl
+++ b/cobalt/h5vcc/h5vcc_settings.idl
@@ -14,4 +14,6 @@
 
 interface H5vccSettings {
   boolean set(DOMString name, (long or DOMString) value);
+  void setPersistentSettingAsInt(DOMString name, long value);
+  long getPersistentSettingAsInt(DOMString name, long default_setting);
 };
diff --git a/cobalt/input/BUILD.gn b/cobalt/input/BUILD.gn
index 912eb83..978550d 100644
--- a/cobalt/input/BUILD.gn
+++ b/cobalt/input/BUILD.gn
@@ -51,6 +51,6 @@
     "//cobalt/overlay_info",
     "//cobalt/speech",
     "//cobalt/system_window",
-    "//starboard",
+    "//starboard:starboard_group",
   ]
 }
diff --git a/cobalt/js_profiler/BUILD.gn b/cobalt/js_profiler/BUILD.gn
new file mode 100644
index 0000000..2a025d1
--- /dev/null
+++ b/cobalt/js_profiler/BUILD.gn
@@ -0,0 +1,53 @@
+# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+static_library("js_profiler") {
+  sources = [
+    "profiler.cc",
+    "profiler.h",
+    "profiler_trace_builder.cc",
+    "profiler_trace_builder.h",
+    "profiler_trace_wrapper.h",
+  ]
+
+  deps = [
+    "//cobalt/base",
+    "//cobalt/browser:generated_bindings",
+    "//cobalt/browser:generated_types",
+    "//cobalt/dom",
+    "//cobalt/script",
+    "//cobalt/script/v8c:engine",
+    "//cobalt/web",
+    "//third_party/chromium/media:media",
+    "//third_party/v8:cppgc",
+  ]
+}
+
+target(gtest_target_type, "js_profiler_test") {
+  testonly = true
+
+  sources = [ "js_profiler_test.cc" ]
+
+  deps = [
+    ":js_profiler",
+    "//cobalt/dom",
+    "//cobalt/dom/testing:dom_testing",
+    "//cobalt/dom/testing:dom_testing",
+    "//cobalt/script",
+    "//cobalt/test:run_all_unittests",
+    "//cobalt/web:dom_exception",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
+}
diff --git a/cobalt/js_profiler/js_profiler_test.cc b/cobalt/js_profiler/js_profiler_test.cc
new file mode 100644
index 0000000..98bb584
--- /dev/null
+++ b/cobalt/js_profiler/js_profiler_test.cc
@@ -0,0 +1,115 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "base/callback.h"
+#include "base/memory/ref_counted.h"
+#include "cobalt/dom/testing/stub_environment_settings.h"
+#include "cobalt/dom/testing/stub_window.h"
+#include "cobalt/dom/testing/test_with_javascript.h"
+#include "cobalt/js_profiler/profiler.h"
+#include "cobalt/js_profiler/profiler_trace_wrapper.h"
+#include "cobalt/script/testing/mock_exception_state.h"
+#include "cobalt/web/dom_exception.h"
+#include "cobalt/web/environment_settings_helper.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::_;
+using ::testing::Return;
+using ::testing::StrictMock;
+
+namespace cobalt {
+namespace js_profiler {
+
+class ProfilerTest : public dom::testing::TestWithJavaScript {
+ public:
+  ProfilerTest() {}
+
+ protected:
+  dom::testing::StubWindow window_;
+  StrictMock<script::testing::MockExceptionState> exception_state_;
+};
+
+TEST_F(ProfilerTest, ProfilerStop) {
+  v8::HandleScope scope(web::get_isolate(window_.environment_settings()));
+  ProfilerInitOptions init_options;
+  init_options.set_sample_interval(10);
+  init_options.set_max_buffer_size(1000);
+
+  scoped_refptr<Profiler> profiler_(new Profiler(
+      window_.environment_settings(), init_options, &exception_state_));
+
+  auto promise = profiler_->Stop(window_.environment_settings());
+  EXPECT_EQ(profiler_->stopped(), true);
+  EXPECT_TRUE(promise->State() == cobalt::script::PromiseState::kPending);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(promise->State() == cobalt::script::PromiseState::kFulfilled);
+}
+
+TEST_F(ProfilerTest, ProfilerAlreadyStopped) {
+  v8::HandleScope scope(web::get_isolate(window_.environment_settings()));
+  ProfilerInitOptions init_options;
+  init_options.set_sample_interval(10);
+  init_options.set_max_buffer_size(0);
+
+  scoped_refptr<Profiler> profiler_(new Profiler(
+      window_.environment_settings(), init_options, &exception_state_));
+
+  auto promise = profiler_->Stop(window_.environment_settings());
+  EXPECT_EQ(profiler_->stopped(), true);
+  EXPECT_TRUE(promise->State() == cobalt::script::PromiseState::kPending);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(promise->State() == cobalt::script::PromiseState::kFulfilled);
+  auto promise2 = profiler_->Stop(window_.environment_settings());
+  EXPECT_TRUE(promise2->State() == cobalt::script::PromiseState::kRejected);
+}
+
+TEST_F(ProfilerTest, ProfilerZeroSampleInterval) {
+  v8::HandleScope scope(web::get_isolate(window_.environment_settings()));
+  ProfilerInitOptions init_options;
+  init_options.set_sample_interval(0);
+  init_options.set_max_buffer_size(0);
+
+  scoped_refptr<Profiler> profiler_(new Profiler(
+      window_.environment_settings(), init_options, &exception_state_));
+  EXPECT_EQ(profiler_->sample_interval(), 10);
+  auto promise = profiler_->Stop(window_.environment_settings());
+  EXPECT_EQ(profiler_->stopped(), true);
+  EXPECT_TRUE(promise->State() == cobalt::script::PromiseState::kPending);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(promise->State() == cobalt::script::PromiseState::kFulfilled);
+}
+
+TEST_F(ProfilerTest, ProfilerOutRangeSampleInterval) {
+  v8::HandleScope scope(web::get_isolate(window_.environment_settings()));
+  ProfilerInitOptions init_options;
+  init_options.set_sample_interval(-1);
+  init_options.set_max_buffer_size(0);
+
+  scoped_refptr<Profiler> profiler_(new Profiler(
+      window_.environment_settings(), init_options, &exception_state_));
+  EXPECT_EQ(profiler_->sample_interval(), 10);
+  auto promise = profiler_->Stop(window_.environment_settings());
+  EXPECT_EQ(profiler_->stopped(), true);
+  EXPECT_TRUE(promise->State() == cobalt::script::PromiseState::kPending);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(promise->State() == cobalt::script::PromiseState::kFulfilled);
+}
+
+TEST_F(ProfilerTest, ProfilerJSCode) {
+  std::string result;
+  EXPECT_TRUE(EvaluateScript("Profiler", &result));
+  EXPECT_EQ(result, "function Profiler() { [native code] }");
+}
+}  // namespace js_profiler
+}  // namespace cobalt
diff --git a/cobalt/js_profiler/profiler.cc b/cobalt/js_profiler/profiler.cc
new file mode 100644
index 0000000..c380aed
--- /dev/null
+++ b/cobalt/js_profiler/profiler.cc
@@ -0,0 +1,158 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/js_profiler/profiler.h"
+
+#include <iostream>
+#include <limits>
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "cobalt/base/polymorphic_downcast.h"
+#include "cobalt/js_profiler/profiler_trace_builder.h"
+#include "cobalt/js_profiler/profiler_trace_wrapper.h"
+#include "cobalt/web/cache_utils.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/dom_exception.h"
+#include "cobalt/web/environment_settings.h"
+#include "cobalt/web/environment_settings_helper.h"
+
+namespace {
+v8::Local<v8::String> toV8String(v8::Isolate* isolate,
+                                 const std::string& string) {
+  if (string.empty()) return v8::String::Empty(isolate);
+  return v8::String::NewFromUtf8(isolate, string.c_str(),
+                                 v8::NewStringType::kNormal, string.length())
+      .ToLocalChecked();
+}
+}  // namespace
+
+namespace cobalt {
+namespace js_profiler {
+
+volatile uint32_t s_lastProfileId = 0;
+
+static constexpr int kBaseSampleIntervalMs = 10;
+
+Profiler::Profiler(script::EnvironmentSettings* settings,
+                   ProfilerInitOptions options,
+                   script::ExceptionState* exception_state)
+    : cobalt::web::EventTarget(settings),
+      stopped_(false),
+      time_origin_{base::TimeTicks::Now()} {
+  profiler_id_ = nextProfileId();
+
+  const base::TimeDelta sample_interval =
+      base::Milliseconds(options.sample_interval());
+
+  int64_t sample_interval_us = sample_interval.InMicroseconds();
+
+  if (sample_interval_us < 0 ||
+      sample_interval_us > std::numeric_limits<int>::max()) {
+    sample_interval_us = 0;
+  }
+
+  int effective_sample_interval_ms =
+      static_cast<int>(sample_interval.InMilliseconds());
+  if (effective_sample_interval_ms % kBaseSampleIntervalMs != 0 ||
+      effective_sample_interval_ms == 0) {
+    effective_sample_interval_ms +=
+        (kBaseSampleIntervalMs -
+         effective_sample_interval_ms % kBaseSampleIntervalMs);
+  }
+  sample_interval_ = effective_sample_interval_ms;
+
+  auto isolate = web::get_isolate(settings);
+
+  auto status = ImplProfilingStart(
+      profiler_id_,
+      v8::CpuProfilingOptions(v8::kLeafNodeLineNumbers,
+                              options.max_buffer_size(), sample_interval_us),
+      settings);
+
+  if (status == v8::CpuProfilingStatus::kAlreadyStarted) {
+    web::DOMException::Raise(web::DOMException::kInvalidStateErr,
+                             "Profiler Already started", exception_state);
+  } else if (status == v8::CpuProfilingStatus::kErrorTooManyProfilers) {
+    web::DOMException::Raise(web::DOMException::kInvalidStateErr,
+                             "Too Many Profilers", exception_state);
+  }
+}
+
+Profiler::~Profiler() {
+  if (cpu_profiler_) {
+    cpu_profiler_->Dispose();
+    cpu_profiler_ = nullptr;
+  }
+}
+
+v8::CpuProfilingStatus Profiler::ImplProfilingStart(
+    std::string profiler_id, v8::CpuProfilingOptions options,
+    script::EnvironmentSettings* settings) {
+  auto isolate = web::get_isolate(settings);
+  cpu_profiler_ = v8::CpuProfiler::New(isolate);
+  cpu_profiler_->SetSamplingInterval(kBaseSampleIntervalMs *
+                                     base::Time::kMicrosecondsPerMillisecond);
+  return cpu_profiler_->StartProfiling(
+      toV8String(isolate, profiler_id), options,
+      std::make_unique<ProfilerMaxSamplesDelegate>(this));
+}
+
+std::string Profiler::nextProfileId() {
+  s_lastProfileId++;
+  return "cobalt::profiler[" + std::to_string(s_lastProfileId) + "]";
+}
+
+void Profiler::PerformStop(
+    script::EnvironmentSettings* environment_settings,
+    std::unique_ptr<script::ValuePromiseWrappable::Reference> promise_reference,
+    base::TimeTicks time_origin, std::string profiler_id) {
+  auto isolate = web::get_isolate(environment_settings);
+  auto profile =
+      cpu_profiler_->StopProfiling(toV8String(isolate, profiler_id_));
+  auto trace = ProfilerTraceBuilder::FromProfile(profile, time_origin_);
+  scoped_refptr<ProfilerTraceWrapper> result(new ProfilerTraceWrapper(trace));
+  cpu_profiler_->Dispose();
+  cpu_profiler_ = nullptr;
+  promise_reference->value().Resolve(result);
+}
+
+Profiler::ProfilerTracePromise Profiler::Stop(
+    script::EnvironmentSettings* environment_settings) {
+  script::HandlePromiseWrappable promise =
+      web::get_script_value_factory(environment_settings)
+          ->CreateInterfacePromise<scoped_refptr<ProfilerTraceWrapper>>();
+  if (!stopped()) {
+    stopped_ = true;
+    auto* global_wrappable = web::get_global_wrappable(environment_settings);
+    auto* context = web::get_context(environment_settings);
+    std::unique_ptr<script::ValuePromiseWrappable::Reference> promise_reference(
+        new script::ValuePromiseWrappable::Reference(global_wrappable,
+                                                     promise));
+
+    context->message_loop()->task_runner()->PostTask(
+        FROM_HERE,
+        base::BindOnce(&Profiler::PerformStop, base::Unretained(this),
+                       environment_settings, std::move(promise_reference),
+                       std::move(time_origin_), std::move(profiler_id_)));
+  } else {
+    promise->Reject(new web::DOMException(web::DOMException::kInvalidStateErr,
+                                          "Profiler already stopped."));
+  }
+  return promise;
+}
+
+}  // namespace js_profiler
+}  // namespace cobalt
diff --git a/cobalt/js_profiler/profiler.h b/cobalt/js_profiler/profiler.h
new file mode 100644
index 0000000..a6da1e7
--- /dev/null
+++ b/cobalt/js_profiler/profiler.h
@@ -0,0 +1,85 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_JS_PROFILER_PROFILER_H_
+#define COBALT_JS_PROFILER_PROFILER_H_
+
+#include <memory>
+#include <string>
+
+#include "cobalt/dom/performance_high_resolution_time.h"
+#include "cobalt/js_profiler/profiler_init_options.h"
+#include "cobalt/js_profiler/profiler_trace.h"
+#include "cobalt/script/promise.h"
+#include "cobalt/script/value_handle.h"
+#include "cobalt/script/wrappable.h"
+#include "cobalt/web/event_target.h"
+#include "third_party/v8/include/cppgc/member.h"
+#include "third_party/v8/include/v8-profiler.h"
+
+namespace cobalt {
+namespace js_profiler {
+
+class Profiler : public cobalt::web::EventTarget {
+ public:
+  using ProfilerTracePromise = script::HandlePromiseWrappable;
+
+  Profiler(script::EnvironmentSettings* settings, ProfilerInitOptions options,
+           script::ExceptionState* exception_state);
+  ~Profiler();
+
+  ProfilerTracePromise Stop(script::EnvironmentSettings* environment_settings);
+
+  bool stopped() const { return stopped_; }
+
+  dom::DOMHighResTimeStamp sample_interval() const { return sample_interval_; }
+
+  DEFINE_WRAPPABLE_TYPE(Profiler);
+
+  virtual v8::CpuProfilingStatus ImplProfilingStart(
+      std::string profiler_id, v8::CpuProfilingOptions options,
+      script::EnvironmentSettings* settings);
+
+ private:
+  void PerformStop(script::EnvironmentSettings* environment_settings,
+                   std::unique_ptr<script::ValuePromiseWrappable::Reference>
+                       promise_reference,
+                   base::TimeTicks time_origin, std::string profiler_id);
+
+  std::string nextProfileId();
+
+  bool stopped_;
+  dom::DOMHighResTimeStamp sample_interval_;
+  v8::CpuProfiler* cpu_profiler_ = nullptr;
+  base::TimeTicks time_origin_;
+  std::string profiler_id_;
+};
+
+class ProfilerMaxSamplesDelegate : public v8::DiscardedSamplesDelegate {
+ public:
+  explicit ProfilerMaxSamplesDelegate(Profiler* profiler)
+      : profiler_(profiler) {}
+  void Notify() override {
+    if (profiler_.Get()) {
+      profiler_->DispatchEvent(new web::Event("samplebufferfull"));
+    }
+  }
+
+ private:
+  cppgc::WeakMember<Profiler> profiler_;
+};
+
+}  // namespace js_profiler
+}  // namespace cobalt
+#endif  // COBALT_JS_PROFILER_PROFILER_H_
diff --git a/cobalt/js_profiler/profiler.idl b/cobalt/js_profiler/profiler.idl
new file mode 100644
index 0000000..6f37933
--- /dev/null
+++ b/cobalt/js_profiler/profiler.idl
@@ -0,0 +1,28 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://wicg.github.io/js-self-profiling/#the-profiler-interface
+
+[
+  Exposed=Window,
+  Constructor(ProfilerInitOptions options),
+  ConstructorCallWith=EnvironmentSettings,
+  RaisesException = Constructor,
+]
+interface Profiler : EventTarget {
+  readonly attribute DOMHighResTimeStamp sampleInterval;
+  readonly attribute boolean stopped;
+
+  [CallWith=EnvironmentSettings] Promise<ProfilerTraceWrapper> stop();
+};
diff --git a/cobalt/js_profiler/profiler_frame.idl b/cobalt/js_profiler/profiler_frame.idl
new file mode 100644
index 0000000..84c5e6b
--- /dev/null
+++ b/cobalt/js_profiler/profiler_frame.idl
@@ -0,0 +1,22 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://wicg.github.io/js-self-profiling/#the-profilerframe-dictionary
+
+dictionary ProfilerFrame {
+  required DOMString name;
+  unsigned long long resourceId;
+  unsigned long long line;
+  unsigned long long column;
+};
diff --git a/cobalt/js_profiler/profiler_init_options.idl b/cobalt/js_profiler/profiler_init_options.idl
new file mode 100644
index 0000000..7086803
--- /dev/null
+++ b/cobalt/js_profiler/profiler_init_options.idl
@@ -0,0 +1,20 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://wicg.github.io/js-self-profiling/#dom-profilerinitoptions
+
+dictionary ProfilerInitOptions {
+  required DOMHighResTimeStamp sampleInterval;
+  required unsigned long maxBufferSize;
+};
diff --git a/cobalt/js_profiler/profiler_sample.idl b/cobalt/js_profiler/profiler_sample.idl
new file mode 100644
index 0000000..0b50acc
--- /dev/null
+++ b/cobalt/js_profiler/profiler_sample.idl
@@ -0,0 +1,20 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://wicg.github.io/js-self-profiling/#the-profilersample-dictionary
+
+dictionary ProfilerSample {
+  required DOMHighResTimeStamp timestamp;
+  unsigned long long stackId;
+};
diff --git a/cobalt/js_profiler/profiler_stack.idl b/cobalt/js_profiler/profiler_stack.idl
new file mode 100644
index 0000000..073bf00
--- /dev/null
+++ b/cobalt/js_profiler/profiler_stack.idl
@@ -0,0 +1,20 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://wicg.github.io/js-self-profiling/#the-profilerstack-dictionary
+
+dictionary ProfilerStack {
+  unsigned long long parentId;
+  required unsigned long long frameId;
+};
diff --git a/cobalt/js_profiler/profiler_trace.idl b/cobalt/js_profiler/profiler_trace.idl
new file mode 100644
index 0000000..199f339
--- /dev/null
+++ b/cobalt/js_profiler/profiler_trace.idl
@@ -0,0 +1,22 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://wicg.github.io/js-self-profiling/#the-profilertrace-dictionary
+
+dictionary ProfilerTrace {
+  required sequence<DOMString> resources;
+  required sequence<ProfilerFrame> frames;
+  required sequence<ProfilerStack> stacks;
+  required sequence<ProfilerSample> samples;
+};
diff --git a/cobalt/js_profiler/profiler_trace_builder.cc b/cobalt/js_profiler/profiler_trace_builder.cc
new file mode 100644
index 0000000..5f8c06d
--- /dev/null
+++ b/cobalt/js_profiler/profiler_trace_builder.cc
@@ -0,0 +1,172 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/js_profiler/profiler_trace_builder.h"
+
+#include "base/time/time.h"
+#include "cobalt/dom/performance.h"
+#include "cobalt/js_profiler/profiler_frame.h"
+#include "cobalt/js_profiler/profiler_sample.h"
+#include "cobalt/js_profiler/profiler_stack.h"
+#include "cobalt/js_profiler/profiler_trace.h"
+#include "v8/include/v8.h"
+
+namespace cobalt {
+namespace js_profiler {
+
+ProfilerTrace ProfilerTraceBuilder::FromProfile(const v8::CpuProfile* profile,
+                                                base::TimeTicks time_origin) {
+  ProfilerTraceBuilder builder(time_origin);
+  if (profile) {
+    for (int i = 0; i < profile->GetSamplesCount(); i++) {
+      const auto* node = profile->GetSample(i);
+      auto timestamp = base::TimeTicks() +
+                       base::Microseconds(profile->GetSampleTimestamp(i));
+      builder.AddSample(node, timestamp);
+    }
+  }
+  return builder.GetTrace();
+}
+
+ProfilerTraceBuilder::ProfilerTraceBuilder(base::TimeTicks time_origin)
+    : time_origin_(time_origin) {}
+
+void ProfilerTraceBuilder::AddSample(const v8::CpuProfileNode* node,
+                                     base::TimeTicks timestamp) {
+  ProfilerSample sample;
+
+  auto relative_timestamp =
+      dom::Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
+                                                           timestamp);
+
+  sample.set_timestamp(relative_timestamp);
+  absl::optional<uint64_t> stack_id = GetOrInsertStackId(node);
+  if (stack_id.has_value()) sample.set_stack_id(stack_id.value());
+
+  samples_.push_back(sample);
+}
+
+absl::optional<uint64_t> ProfilerTraceBuilder::GetOrInsertStackId(
+    const v8::CpuProfileNode* node) {
+  if (!node) return absl::nullopt;
+
+  if (!ShouldIncludeStackFrame(node))
+    return GetOrInsertStackId(node->GetParent());
+
+  auto existing_stack_id = node_to_stack_map_.find(node);
+  if (existing_stack_id != node_to_stack_map_.end()) {
+    // If we found a stack entry for this node ID, the subpath to the root
+    // already exists in the trace, and we may coalesce.
+    return existing_stack_id->second;
+  }
+
+  ProfilerStack stack;
+  uint64_t frame_id = GetOrInsertFrameId(node);
+  stack.set_frame_id(frame_id);
+  absl::optional<int> parent_stack_id = GetOrInsertStackId(node->GetParent());
+  if (parent_stack_id.has_value()) stack.set_parent_id(parent_stack_id.value());
+
+  uint64_t stack_id = stacks_.size();
+  stacks_.push_back(stack);
+  node_to_stack_map_[node] = stack_id;
+  return stack_id;
+}
+
+uint64_t ProfilerTraceBuilder::GetOrInsertFrameId(
+    const v8::CpuProfileNode* node) {
+  auto existing_frame_id = node_to_frame_map_.find(node);
+
+  if (existing_frame_id != node_to_frame_map_.end())
+    return existing_frame_id->second;
+
+  ProfilerFrame frame;
+  std::string function_name(node->GetFunctionNameStr());
+  frame.set_name(function_name);
+  if (*node->GetScriptResourceNameStr() != '\0') {
+    uint64_t resource_id =
+        GetOrInsertResourceId(node->GetScriptResourceNameStr());
+    frame.set_resource_id(resource_id);
+  }
+  if (node->GetLineNumber() != v8::CpuProfileNode::kNoLineNumberInfo)
+    frame.set_line(node->GetLineNumber());
+  if (node->GetColumnNumber() != v8::CpuProfileNode::kNoColumnNumberInfo)
+    frame.set_column(node->GetColumnNumber());
+
+  uint64_t frame_id = frames_.size();
+  frames_.push_back(frame);
+  node_to_frame_map_[node] = frame_id;
+
+  return frame_id;
+}
+
+uint64_t ProfilerTraceBuilder::GetOrInsertResourceId(
+    const char* resource_name) {
+  auto existing_resource_id = resource_indices_.find(resource_name);
+
+  if (existing_resource_id != resource_indices_.end())
+    return existing_resource_id->second;
+
+  uint64_t resource_id = resources_.size();
+  resources_.push_back(resource_name);
+
+  resource_indices_[resource_name] = resource_id;
+
+  return resource_id;
+}
+
+ProfilerTrace ProfilerTraceBuilder::GetTrace() const {
+  ProfilerTrace trace;
+  trace.set_resources(resources_);
+  trace.set_frames(frames_);
+  trace.set_stacks(stacks_);
+  trace.set_samples(samples_);
+  return trace;
+}
+
+bool ProfilerTraceBuilder::ShouldIncludeStackFrame(
+    const v8::CpuProfileNode* node) {
+  DCHECK(node);
+
+  // Omit V8 metadata frames.
+  const v8::CpuProfileNode::SourceType source_type = node->GetSourceType();
+  if (source_type != v8::CpuProfileNode::kScript &&
+      source_type != v8::CpuProfileNode::kBuiltin &&
+      source_type != v8::CpuProfileNode::kCallback) {
+    return false;
+  }
+
+  // Attempt to attribute each stack frame to a script.
+  // - For JS functions, this is their own script.
+  // - For builtins, this is the first attributable caller script.
+  const v8::CpuProfileNode* resource_node = node;
+  if (source_type != v8::CpuProfileNode::kScript) {
+    while (resource_node &&
+           resource_node->GetScriptId() == v8::UnboundScript::kNoScriptId) {
+      resource_node = resource_node->GetParent();
+    }
+  }
+  if (!resource_node) return false;
+
+  int script_id = resource_node->GetScriptId();
+
+  // If we already tested whether or not this script was cross-origin, return
+  // the cached results.
+  auto it = script_same_origin_cache_.find(script_id);
+  if (it != script_same_origin_cache_.end()) return it->second;
+  // insert in pair script_same_origin_cache_ (script_id, true)
+  script_same_origin_cache_[script_id] = true;
+  return true;
+}
+}  // namespace js_profiler
+}  // namespace cobalt
diff --git a/cobalt/js_profiler/profiler_trace_builder.h b/cobalt/js_profiler/profiler_trace_builder.h
new file mode 100644
index 0000000..adf88bf
--- /dev/null
+++ b/cobalt/js_profiler/profiler_trace_builder.h
@@ -0,0 +1,82 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_JS_PROFILER_PROFILER_TRACE_BUILDER_H_
+#define COBALT_JS_PROFILER_PROFILER_TRACE_BUILDER_H_
+
+#include <map>
+#include <string>
+
+#include "base/time/time.h"
+#include "cobalt/script/sequence.h"
+#include "third_party/chromium/media/cobalt/third_party/abseil-cpp/absl/types/optional.h"
+#include "v8/include/v8-profiler.h"
+
+namespace cobalt {
+namespace js_profiler {
+
+class ProfilerFrame;
+class ProfilerSample;
+class ProfilerStack;
+class ProfilerTrace;
+
+class ProfilerTraceBuilder {
+ public:
+  static ProfilerTrace FromProfile(const v8::CpuProfile* profile,
+                                   base::TimeTicks time_origin);
+
+  explicit ProfilerTraceBuilder(base::TimeTicks time_origin);
+
+  ProfilerTraceBuilder(const ProfilerTraceBuilder&) = delete;
+  ProfilerTraceBuilder& operator=(const ProfilerTraceBuilder&) = delete;
+
+ private:
+  // Adds a stack sample from V8 to the trace, performing necessary filtering
+  // and coalescing.
+  void AddSample(const v8::CpuProfileNode* node, base::TimeTicks timestamp);
+
+  // Obtains the stack ID of the substack with the given node as its leaf,
+  // performing origin-based filtering.
+  absl::optional<uint64_t> GetOrInsertStackId(const v8::CpuProfileNode* node);
+
+  // Obtains the frame ID of the stack frame represented by the given node.
+  uint64_t GetOrInsertFrameId(const v8::CpuProfileNode* node);
+
+  // Obtains the resource ID for the given resource name.
+  uint64_t GetOrInsertResourceId(const char* resource_name);
+
+  ProfilerTrace GetTrace() const;
+
+  // Discards metadata frames and performs an origin check on the given stack
+  // frame, returning true if it either has the same origin as the profiler, or
+  // if it should be shared cross origin.
+  bool ShouldIncludeStackFrame(const v8::CpuProfileNode* node);
+
+  base::TimeTicks time_origin_;
+
+  script::Sequence<std::string> resources_;
+  script::Sequence<ProfilerFrame> frames_;
+  script::Sequence<ProfilerStack> stacks_;
+  script::Sequence<ProfilerSample> samples_;
+
+  // Maps V8-managed resource strings to their indices in the resources table.
+  std::map<const char*, uint64_t> resource_indices_;
+  std::map<const v8::CpuProfileNode*, uint64_t> node_to_stack_map_;
+  std::map<const v8::CpuProfileNode*, uint64_t> node_to_frame_map_;
+
+  std::map<int, bool> script_same_origin_cache_;
+};
+}  // namespace js_profiler
+}  // namespace cobalt
+#endif  // COBALT_JS_PROFILER_PROFILER_TRACE_BUILDER_H_
diff --git a/cobalt/js_profiler/profiler_trace_wrapper.h b/cobalt/js_profiler/profiler_trace_wrapper.h
new file mode 100644
index 0000000..9968527
--- /dev/null
+++ b/cobalt/js_profiler/profiler_trace_wrapper.h
@@ -0,0 +1,48 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_JS_PROFILER_PROFILER_TRACE_WRAPPER_H_
+#define COBALT_JS_PROFILER_PROFILER_TRACE_WRAPPER_H_
+
+#include <string>
+
+#include "cobalt/js_profiler/profiler_trace.h"
+
+namespace cobalt {
+namespace js_profiler {
+class ProfilerTraceWrapper : public script::Wrappable {
+ public:
+  DEFINE_WRAPPABLE_TYPE(ProfilerTraceWrapper);
+  explicit ProfilerTraceWrapper(ProfilerTrace trace) {
+    resources_ = trace.resources();
+    frames_ = trace.frames();
+    stacks_ = trace.stacks();
+    samples_ = trace.samples();
+  }
+  ProfilerTraceWrapper() {}
+  script::Sequence<std::string> resources() const { return resources_; }
+  script::Sequence<ProfilerFrame> frames() const { return frames_; }
+  script::Sequence<ProfilerStack> stacks() const { return stacks_; }
+  script::Sequence<ProfilerSample> samples() const { return samples_; }
+
+ private:
+  script::Sequence<std::string> resources_;
+  script::Sequence<ProfilerFrame> frames_;
+  script::Sequence<ProfilerStack> stacks_;
+  script::Sequence<ProfilerSample> samples_;
+};
+}  // namespace js_profiler
+}  // namespace cobalt
+
+#endif  // COBALT_JS_PROFILER_PROFILER_TRACE_WRAPPER_H_
diff --git a/cobalt/js_profiler/profiler_trace_wrapper.idl b/cobalt/js_profiler/profiler_trace_wrapper.idl
new file mode 100644
index 0000000..b564ab2
--- /dev/null
+++ b/cobalt/js_profiler/profiler_trace_wrapper.idl
@@ -0,0 +1,24 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Custom, not in spec. Interface wrapper for ProfilerTrace to make
+// compatible with Promises implementation in Cobalt.
+
+[Constructor(optional ProfilerTrace trace)]
+interface ProfilerTraceWrapper {
+    readonly attribute sequence<DOMString> resources;
+    readonly attribute sequence<ProfilerFrame> frames;
+    readonly attribute sequence<ProfilerStack> stacks;
+    readonly attribute sequence<ProfilerSample> samples;
+};
diff --git a/cobalt/loader/fetcher_cache.cc b/cobalt/loader/fetcher_cache.cc
index 1e6adb5..d797c27 100644
--- a/cobalt/loader/fetcher_cache.cc
+++ b/cobalt/loader/fetcher_cache.cc
@@ -348,6 +348,9 @@
 
   total_size_ += entry->capacity();
   ++count_resources_cached_;
+  // TODO(b/270993319): For debugging cache integrity issues in production
+  //                    only, remove after identifying the root cause.
+  CHECK_EQ(count_resources_cached_, static_cast<int>(cache_entries_.size()));
 
   while (total_size_ > capacity_) {
     // TODO(b/270993319): For debugging cache integrity issues in production
diff --git a/cobalt/media/BUILD.gn b/cobalt/media/BUILD.gn
index bde4beb..11bc212 100644
--- a/cobalt/media/BUILD.gn
+++ b/cobalt/media/BUILD.gn
@@ -107,7 +107,7 @@
     "//cobalt/system_window:system_window",
     "//nb",
     "//net",
-    "//starboard",
+    "//starboard:starboard_group",
     "//third_party/chromium/media",
     "//third_party/protobuf:protobuf_lite",
     "//url",
@@ -121,6 +121,7 @@
     "base/cval_stats_test.cc",
     "base/decoder_buffer_cache_test.cc",
     "file_data_source_test.cc",
+    "media_module_test.cc",
     "progressive/demuxer_extension_wrapper_test.cc",
     "progressive/mock_data_source_reader.h",
     "progressive/mp4_map_unittest.cc",
diff --git a/cobalt/media/base/pipeline.h b/cobalt/media/base/pipeline.h
index d0f9175..265743a 100644
--- a/cobalt/media/base/pipeline.h
+++ b/cobalt/media/base/pipeline.h
@@ -126,7 +126,8 @@
                      const base::Closure& duration_change_cb,
                      const base::Closure& output_mode_change_cb,
                      const base::Closure& content_size_change_cb,
-                     const std::string& max_video_capabilities) = 0;
+                     const std::string& max_video_capabilities,
+                     const int max_video_input_size) = 0;
 
 #if SB_HAS(PLAYER_WITH_URL)
   // Build a pipeline with an url-base player.
diff --git a/cobalt/media/base/sbplayer_bridge.cc b/cobalt/media/base/sbplayer_bridge.cc
index 0f3ec4c..c22512e 100644
--- a/cobalt/media/base/sbplayer_bridge.cc
+++ b/cobalt/media/base/sbplayer_bridge.cc
@@ -30,6 +30,7 @@
 #include "starboard/common/player.h"
 #include "starboard/common/string.h"
 #include "starboard/configuration.h"
+#include "starboard/extension/player_set_max_video_input_size.h"
 #include "starboard/memory.h"
 #include "starboard/once.h"
 #include "third_party/chromium/media/base/starboard_utils.h"
@@ -226,7 +227,8 @@
     SbPlayerSetBoundsHelper* set_bounds_helper, bool allow_resume_after_suspend,
     SbPlayerOutputMode default_output_mode,
     DecodeTargetProvider* const decode_target_provider,
-    const std::string& max_video_capabilities, std::string pipeline_identifier)
+    const std::string& max_video_capabilities, int max_video_input_size,
+    std::string pipeline_identifier)
     : sbplayer_interface_(interface),
       task_runner_(task_runner),
       get_decode_target_graphics_context_provider_func_(
@@ -242,6 +244,7 @@
       video_config_(video_config),
       decode_target_provider_(decode_target_provider),
       max_video_capabilities_(max_video_capabilities),
+      max_video_input_size_(max_video_input_size),
       cval_stats_(&interface->cval_stats_),
       pipeline_identifier_(pipeline_identifier)
 #if SB_HAS(PLAYER_WITH_URL)
@@ -731,6 +734,15 @@
 
   is_creating_player_ = true;
 
+  if (output_mode_ == kSbPlayerOutputModeInvalid) {
+    PlayerErrorCB(kSbPlayerInvalid, this, kSbPlayerErrorDecode,
+                  "Invalid output mode returned by "
+                  "SbPlayerBridge::ComputeSbPlayerOutputMode()");
+    is_creating_player_ = false;
+    player_ = kSbPlayerInvalid;
+    return;
+  }
+
   if (max_video_capabilities_.empty()) {
     FormatSupportQueryMetrics::PrintAndResetMetrics();
   }
@@ -760,6 +772,18 @@
   DCHECK_EQ(sbplayer_interface_->GetPreferredOutputMode(&creation_param),
             output_mode_);
   cval_stats_->StartTimer(MediaTiming::SbPlayerCreate, pipeline_identifier_);
+  const StarboardExtensionPlayerSetMaxVideoInputSizeApi*
+      player_set_max_video_input_size_extension =
+          static_cast<const StarboardExtensionPlayerSetMaxVideoInputSizeApi*>(
+              SbSystemGetExtension(
+                  kStarboardExtensionPlayerSetMaxVideoInputSizeName));
+  if (player_set_max_video_input_size_extension &&
+      strcmp(player_set_max_video_input_size_extension->name,
+             kStarboardExtensionPlayerSetMaxVideoInputSizeName) == 0 &&
+      player_set_max_video_input_size_extension->version >= 1) {
+    player_set_max_video_input_size_extension
+        ->SetMaxVideoInputSizeForCurrentThread(max_video_input_size_);
+  }
   player_ = sbplayer_interface_->Create(
       window_, &creation_param, &SbPlayerBridge::DeallocateSampleCB,
       &SbPlayerBridge::DecoderStatusCB, &SbPlayerBridge::PlayerStatusCB,
@@ -1268,7 +1292,6 @@
 
   LOG(INFO) << "Output mode is set to " << GetPlayerOutputModeName(output_mode);
 
-  CHECK_NE(kSbPlayerOutputModeInvalid, output_mode);
   return output_mode;
 }
 
diff --git a/cobalt/media/base/sbplayer_bridge.h b/cobalt/media/base/sbplayer_bridge.h
index a48e53c..d8a2abc 100644
--- a/cobalt/media/base/sbplayer_bridge.h
+++ b/cobalt/media/base/sbplayer_bridge.h
@@ -94,7 +94,7 @@
                  SbPlayerOutputMode default_output_mode,
                  DecodeTargetProvider* const decode_target_provider,
                  const std::string& max_video_capabilities,
-                 std::string pipeline_identifier);
+                 int max_video_input_size, std::string pipeline_identifier);
 
   ~SbPlayerBridge();
 
@@ -301,6 +301,9 @@
   // A string of video maximum capabilities.
   std::string max_video_capabilities_;
 
+  // Set the maximum size in bytes of an input buffer for video.
+  int max_video_input_size_;
+
   // Keep track of errors during player creation.
   bool is_creating_player_ = false;
   std::string player_creation_error_message_;
diff --git a/cobalt/media/base/sbplayer_pipeline.cc b/cobalt/media/base/sbplayer_pipeline.cc
index 8b29628..994f7b9 100644
--- a/cobalt/media/base/sbplayer_pipeline.cc
+++ b/cobalt/media/base/sbplayer_pipeline.cc
@@ -229,7 +229,8 @@
                              const base::Closure& duration_change_cb,
                              const base::Closure& output_mode_change_cb,
                              const base::Closure& content_size_change_cb,
-                             const std::string& max_video_capabilities) {
+                             const std::string& max_video_capabilities,
+                             const int max_video_input_size) {
   TRACE_EVENT0("cobalt::media", "SbPlayerPipeline::Start");
 
   DCHECK(!ended_cb.is_null());
@@ -252,6 +253,7 @@
   parameters.output_mode_change_cb = output_mode_change_cb;
   parameters.content_size_change_cb = content_size_change_cb;
   parameters.max_video_capabilities = max_video_capabilities;
+  parameters.max_video_input_size = max_video_input_size;
 #if SB_HAS(PLAYER_WITH_URL)
   parameters.is_url_based = false;
 #endif  // SB_HAS(PLAYER_WITH_URL)
@@ -640,6 +642,7 @@
   output_mode_change_cb_ = parameters.output_mode_change_cb;
   content_size_change_cb_ = parameters.content_size_change_cb;
   max_video_capabilities_ = parameters.max_video_capabilities;
+  max_video_input_size_ = parameters.max_video_input_size;
 #if SB_HAS(PLAYER_WITH_URL)
   is_url_based_ = parameters.is_url_based;
   if (is_url_based_) {
@@ -837,7 +840,7 @@
         audio_mime_type, video_config, video_mime_type, window_, drm_system,
         this, set_bounds_helper_.get(), allow_resume_after_suspend_,
         default_output_mode_, decode_target_provider_, max_video_capabilities_,
-        pipeline_identifier_));
+        max_video_input_size_, pipeline_identifier_));
     if (player_bridge_->IsValid()) {
 #if SB_API_VERSION >= 15
       // TODO(b/267678497): When `player_bridge_->GetAudioConfigurations()`
@@ -1229,7 +1232,12 @@
       CallErrorCB(::media::PIPELINE_ERROR_DECODE, message);
       break;
     case kSbPlayerErrorCapabilityChanged:
-      CallErrorCB(::media::PLAYBACK_CAPABILITY_CHANGED, message);
+      CallErrorCB(::media::PIPELINE_ERROR_DECODE,
+                  message.empty()
+                      ? kSbPlayerCapabilityChangedErrorMessage
+                      : ::starboard::FormatString(
+                            "%s: %s", kSbPlayerCapabilityChangedErrorMessage,
+                            message.c_str()));
       break;
     case kSbPlayerErrorMax:
       NOTREACHED();
diff --git a/cobalt/media/base/sbplayer_pipeline.h b/cobalt/media/base/sbplayer_pipeline.h
index dc851c8..9b793f5 100644
--- a/cobalt/media/base/sbplayer_pipeline.h
+++ b/cobalt/media/base/sbplayer_pipeline.h
@@ -82,7 +82,8 @@
              const base::Closure& duration_change_cb,
              const base::Closure& output_mode_change_cb,
              const base::Closure& content_size_change_cb,
-             const std::string& max_video_capabilities) override;
+             const std::string& max_video_capabilities,
+             const int max_video_input_size) override;
 #if SB_HAS(PLAYER_WITH_URL)
   void Start(const SetDrmSystemReadyCB& set_drm_system_ready_cb,
              const OnEncryptedMediaInitDataEncounteredCB&
@@ -133,6 +134,7 @@
     base::Closure output_mode_change_cb;
     base::Closure content_size_change_cb;
     std::string max_video_capabilities;
+    int max_video_input_size;
 #if SB_HAS(PLAYER_WITH_URL)
     std::string source_url;
     bool is_url_based;
@@ -344,6 +346,8 @@
   size_t retrograde_media_time_counter_ = 0;
   // The maximum video playback capabilities required for the playback.
   base::CVal<std::string> max_video_capabilities_;
+  // Set the maximum size in bytes of an input buffer for video.
+  int max_video_input_size_;
 
   PlaybackStatistics playback_statistics_;
 
@@ -351,6 +355,12 @@
 
   SbTimeMonotonic set_drm_system_ready_cb_time_ = -1;
 
+  // Message to signal a capability changed error.
+  // "MEDIA_ERR_CAPABILITY_CHANGED" must be in the error message to be
+  // understood as a capability changed error. Do not change this message.
+  static constexpr const char* kSbPlayerCapabilityChangedErrorMessage =
+      "MEDIA_ERR_CAPABILITY_CHANGED";
+
   DISALLOW_COPY_AND_ASSIGN(SbPlayerPipeline);
 };
 
diff --git a/cobalt/media/media_module.cc b/cobalt/media/media_module.cc
index 06e7e26..024c660 100644
--- a/cobalt/media/media_module.cc
+++ b/cobalt/media/media_module.cc
@@ -26,6 +26,7 @@
 #include "base/synchronization/waitable_event.h"
 #include "cobalt/media/base/format_support_query_metrics.h"
 #include "starboard/common/string.h"
+#include "starboard/extension/h5vcc_config.h"
 #include "starboard/media.h"
 #include "starboard/window.h"
 #include "third_party/chromium/media/base/mime_util.h"
@@ -198,6 +199,20 @@
     LOG(INFO) << (value ? "Enabling" : "Disabling")
               << " media metrics collection.";
     return true;
+  } else if (name == "BackgroundPlaybackEnabled") {
+    const StarboardExtensionH5vccConfigApi* h5vcc_config_api =
+        static_cast<const StarboardExtensionH5vccConfigApi*>(
+            SbSystemGetExtension(kStarboardExtensionH5vccConfigName));
+    if (h5vcc_config_api &&
+        strcmp(h5vcc_config_api->name, kStarboardExtensionH5vccConfigName) ==
+            0 &&
+        h5vcc_config_api->version >= 1) {
+      bool enable_background_playback = value;
+      LOG(INFO) << "Set BackgroundPlaybackEnabled to "
+                << (enable_background_playback ? "enabled" : "disabled");
+      h5vcc_config_api->EnableBackgroundPlayback(enable_background_playback);
+    }
+    return true;
 #if SB_API_VERSION >= 15
   } else if (name == "AudioWriteDurationLocal" && value > 0) {
     audio_write_duration_local_ = value;
diff --git a/cobalt/media/media_module_test.cc b/cobalt/media/media_module_test.cc
new file mode 100644
index 0000000..af3c93f
--- /dev/null
+++ b/cobalt/media/media_module_test.cc
@@ -0,0 +1,29 @@
+// Copyright 2024 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/media/media_module.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cobalt {
+namespace media {
+
+TEST(MediaModuleTest, SetConfiguration) {
+  MediaModule mediaModule(nullptr, nullptr);
+
+  EXPECT_EQ(mediaModule.SetConfiguration("BackgroundPlaybackEnabled", 1), true);
+  EXPECT_EQ(mediaModule.SetConfiguration("BackgroundPlaybackEnabled", 0), true);
+}
+}  // namespace media
+}  // namespace cobalt
diff --git a/cobalt/media/player/web_media_player.h b/cobalt/media/player/web_media_player.h
index 459ec6e..a850cc7 100644
--- a/cobalt/media/player/web_media_player.h
+++ b/cobalt/media/player/web_media_player.h
@@ -51,7 +51,6 @@
     kNetworkStateFormatError,
     kNetworkStateNetworkError,
     kNetworkStateDecodeError,
-    kNetworkStateCapabilityChangedError,
   };
 
   enum ReadyState {
@@ -217,6 +216,7 @@
   virtual void SourceOpened(::media::ChunkDemuxer* chunk_demuxer) = 0;
   virtual std::string SourceURL() const = 0;
   virtual std::string MaxVideoCapabilities() const = 0;
+  virtual int MaxVideoInputSize() const = 0;
 
   // Clients should implement this in order to indicate a preference for whether
   // a video should be decoded to a texture or through a punch out system.  If
diff --git a/cobalt/media/player/web_media_player_impl.cc b/cobalt/media/player/web_media_player_impl.cc
index 6941c04..e773474 100644
--- a/cobalt/media/player/web_media_player_impl.cc
+++ b/cobalt/media/player/web_media_player_impl.cc
@@ -762,11 +762,6 @@
       SetNetworkError(WebMediaPlayer::kNetworkStateDecodeError,
                       message.empty() ? "Hardware context reset." : message);
       break;
-
-    case ::media::PLAYBACK_CAPABILITY_CHANGED:
-      SetNetworkError(WebMediaPlayer::kNetworkStateCapabilityChangedError,
-                      message.empty() ? "Capability changed." : message);
-      break;
     default:
       NOTREACHED();
       break;
@@ -851,7 +846,7 @@
       BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChanged),
       BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOutputModeChanged),
       BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnContentSizeChanged),
-      GetClient()->MaxVideoCapabilities());
+      GetClient()->MaxVideoCapabilities(), GetClient()->MaxVideoInputSize());
 }
 
 void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) {
diff --git a/cobalt/media/sandbox/BUILD.gn b/cobalt/media/sandbox/BUILD.gn
index 84d2620..5edbfc4 100644
--- a/cobalt/media/sandbox/BUILD.gn
+++ b/cobalt/media/sandbox/BUILD.gn
@@ -24,7 +24,7 @@
     "//cobalt/base",
     "//cobalt/math",
     "//cobalt/media",
-    "//starboard",
+    "//starboard:starboard_group",
     "//third_party/chromium/media",
   ]
 }
@@ -57,7 +57,7 @@
     "//cobalt/storage",
     "//cobalt/system_window",
     "//cobalt/trace_event",
-    "//starboard",
+    "//starboard:starboard_group",
     "//third_party/chromium/media",
     "//url",
   ]
diff --git a/cobalt/media/sandbox/web_media_player_helper.cc b/cobalt/media/sandbox/web_media_player_helper.cc
index c2364a5..0cb8447 100644
--- a/cobalt/media/sandbox/web_media_player_helper.cc
+++ b/cobalt/media/sandbox/web_media_player_helper.cc
@@ -54,6 +54,7 @@
   }
   std::string SourceURL() const override { return ""; }
   std::string MaxVideoCapabilities() const override { return std::string(); };
+  int MaxVideoInputSize() const override { return 0; };
 
   void EncryptedMediaInitDataEncountered(const char*, const unsigned char*,
                                          unsigned) override {}
diff --git a/cobalt/media_capture/BUILD.gn b/cobalt/media_capture/BUILD.gn
index 9e7ffc9..df692af 100644
--- a/cobalt/media_capture/BUILD.gn
+++ b/cobalt/media_capture/BUILD.gn
@@ -49,7 +49,7 @@
     "//cobalt/script:engine",
     "//cobalt/speech",
     "//cobalt/web:dom_exception",
-    "//starboard",
+    "//starboard:starboard_group",
   ]
 }
 
diff --git a/cobalt/media_stream/BUILD.gn b/cobalt/media_stream/BUILD.gn
index b10e1fc..058ee06 100644
--- a/cobalt/media_stream/BUILD.gn
+++ b/cobalt/media_stream/BUILD.gn
@@ -47,7 +47,7 @@
     "//cobalt/media",
     "//cobalt/script",
     "//cobalt/speech",
-    "//starboard",
+    "//starboard:starboard_group",
   ]
 }
 
diff --git a/cobalt/network/BUILD.gn b/cobalt/network/BUILD.gn
index 73e33ca..e0ef901 100644
--- a/cobalt/network/BUILD.gn
+++ b/cobalt/network/BUILD.gn
@@ -12,6 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import("//cobalt/network/certs.gni")
+
 static_library("network") {
   has_pedantic_warnings = true
 
@@ -84,146 +86,7 @@
 
 copy("copy_ssl_certificates") {
   install_content = true
-  sources = [
-    "//cobalt/content/ssl/certs/002c0b4f.0",
-    "//cobalt/content/ssl/certs/02265526.0",
-    "//cobalt/content/ssl/certs/062cdee6.0",
-    "//cobalt/content/ssl/certs/064e0aa9.0",
-    "//cobalt/content/ssl/certs/06dc52d5.0",
-    "//cobalt/content/ssl/certs/09789157.0",
-    "//cobalt/content/ssl/certs/0a775a30.0",
-    "//cobalt/content/ssl/certs/0b1b94ef.0",
-    "//cobalt/content/ssl/certs/0b9bc432.0",
-    "//cobalt/content/ssl/certs/0bf05006.0",
-    "//cobalt/content/ssl/certs/0f5dc4f3.0",
-    "//cobalt/content/ssl/certs/0f6fa695.0",
-    "//cobalt/content/ssl/certs/1001acf7.0",
-    "//cobalt/content/ssl/certs/106f3e4d.0",
-    "//cobalt/content/ssl/certs/14bc7599.0",
-    "//cobalt/content/ssl/certs/18856ac4.0",
-    "//cobalt/content/ssl/certs/1d3472b9.0",
-    "//cobalt/content/ssl/certs/1e08bfd1.0",
-    "//cobalt/content/ssl/certs/1e09d511.0",
-    "//cobalt/content/ssl/certs/244b5494.0",
-    "//cobalt/content/ssl/certs/2923b3f9.0",
-    "//cobalt/content/ssl/certs/2ae6433e.0",
-    "//cobalt/content/ssl/certs/2b349938.0",
-    "//cobalt/content/ssl/certs/32888f65.0",
-    "//cobalt/content/ssl/certs/349f2832.0",
-    "//cobalt/content/ssl/certs/3513523f.0",
-    "//cobalt/content/ssl/certs/3bde41ac.0",
-    "//cobalt/content/ssl/certs/3e44d2f7.0",
-    "//cobalt/content/ssl/certs/3e45d192.0",
-    "//cobalt/content/ssl/certs/3fb36b73.0",
-    "//cobalt/content/ssl/certs/40193066.0",
-    "//cobalt/content/ssl/certs/4042bcee.0",
-    "//cobalt/content/ssl/certs/40547a79.0",
-    "//cobalt/content/ssl/certs/406c9bb1.0",
-    "//cobalt/content/ssl/certs/4304c5e5.0",
-    "//cobalt/content/ssl/certs/48bec511.0",
-    "//cobalt/content/ssl/certs/4b718d9b.0",
-    "//cobalt/content/ssl/certs/4bfab552.0",
-    "//cobalt/content/ssl/certs/4f316efb.0",
-    "//cobalt/content/ssl/certs/5443e9e3.0",
-    "//cobalt/content/ssl/certs/54657681.0",
-    "//cobalt/content/ssl/certs/57bcb2da.0",
-    "//cobalt/content/ssl/certs/5931b5bc.0",
-    "//cobalt/content/ssl/certs/5a7722fb.0",
-    "//cobalt/content/ssl/certs/5ad8a5d6.0",
-    "//cobalt/content/ssl/certs/5cd81ad7.0",
-    "//cobalt/content/ssl/certs/5d3033c5.0",
-    "//cobalt/content/ssl/certs/5e98733a.0",
-    "//cobalt/content/ssl/certs/5f15c80c.0",
-    "//cobalt/content/ssl/certs/5f618aec.0",
-    "//cobalt/content/ssl/certs/607986c7.0",
-    "//cobalt/content/ssl/certs/626dceaf.0",
-    "//cobalt/content/ssl/certs/653b494a.0",
-    "//cobalt/content/ssl/certs/66445960.0",
-    "//cobalt/content/ssl/certs/68dd7389.0",
-    "//cobalt/content/ssl/certs/6b99d060.0",
-    "//cobalt/content/ssl/certs/6d41d539.0",
-    "//cobalt/content/ssl/certs/6fa5da56.0",
-    "//cobalt/content/ssl/certs/706f604c.0",
-    "//cobalt/content/ssl/certs/749e9e03.0",
-    "//cobalt/content/ssl/certs/75d1b2ed.0",
-    "//cobalt/content/ssl/certs/76faf6c0.0",
-    "//cobalt/content/ssl/certs/7719f463.0",
-    "//cobalt/content/ssl/certs/773e07ad.0",
-    "//cobalt/content/ssl/certs/7a3adc42.0",
-    "//cobalt/content/ssl/certs/7a780d93.0",
-    "//cobalt/content/ssl/certs/7aaf71c0.0",
-    "//cobalt/content/ssl/certs/7f3d5d1d.0",
-    "//cobalt/content/ssl/certs/8160b96c.0",
-    "//cobalt/content/ssl/certs/8508e720.0",
-    "//cobalt/content/ssl/certs/8cb5ee0f.0",
-    "//cobalt/content/ssl/certs/8d86cdd1.0",
-    "//cobalt/content/ssl/certs/8d89cda1.0",
-    "//cobalt/content/ssl/certs/8f103249.0",
-    "//cobalt/content/ssl/certs/90c5a3c8.0",
-    "//cobalt/content/ssl/certs/930ac5d2.0",
-    "//cobalt/content/ssl/certs/93bc0acc.0",
-    "//cobalt/content/ssl/certs/9482e63a.0",
-    "//cobalt/content/ssl/certs/9846683b.0",
-    "//cobalt/content/ssl/certs/988a38cb.0",
-    "//cobalt/content/ssl/certs/9b5697b0.0",
-    "//cobalt/content/ssl/certs/9c8dfbd4.0",
-    "//cobalt/content/ssl/certs/9d04f354.0",
-    "//cobalt/content/ssl/certs/9ef4a08a.0",
-    "//cobalt/content/ssl/certs/9f727ac7.0",
-    "//cobalt/content/ssl/certs/a3418fda.0",
-    "//cobalt/content/ssl/certs/a94d09e5.0",
-    "//cobalt/content/ssl/certs/aee5f10d.0",
-    "//cobalt/content/ssl/certs/b0e59380.0",
-    "//cobalt/content/ssl/certs/b1159c4c.0",
-    "//cobalt/content/ssl/certs/b433981b.0",
-    "//cobalt/content/ssl/certs/b66938e9.0",
-    "//cobalt/content/ssl/certs/b727005e.0",
-    "//cobalt/content/ssl/certs/b7a5b843.0",
-    "//cobalt/content/ssl/certs/b81b93f0.0",
-    "//cobalt/content/ssl/certs/bf53fb88.0",
-    "//cobalt/content/ssl/certs/c01eb047.0",
-    "//cobalt/content/ssl/certs/c28a8a30.0",
-    "//cobalt/content/ssl/certs/ca6e4ad9.0",
-    "//cobalt/content/ssl/certs/cbf06781.0",
-    "//cobalt/content/ssl/certs/cc450945.0",
-    "//cobalt/content/ssl/certs/cd58d51e.0",
-    "//cobalt/content/ssl/certs/cd8c0d63.0",
-    "//cobalt/content/ssl/certs/ce5e74ef.0",
-    "//cobalt/content/ssl/certs/d4dae3dd.0",
-    "//cobalt/content/ssl/certs/d52c538d.0",
-    "//cobalt/content/ssl/certs/d6325660.0",
-    "//cobalt/content/ssl/certs/d7e8dc79.0",
-    "//cobalt/content/ssl/certs/d887a5bb.0",
-    "//cobalt/content/ssl/certs/dc4d6a89.0",
-    "//cobalt/content/ssl/certs/dd8e9d41.0",
-    "//cobalt/content/ssl/certs/de6d66f3.0",
-    "//cobalt/content/ssl/certs/e113c810.0",
-    "//cobalt/content/ssl/certs/e18bfb83.0",
-    "//cobalt/content/ssl/certs/e35234b1.0",
-    "//cobalt/content/ssl/certs/e36a6752.0",
-    "//cobalt/content/ssl/certs/e73d606e.0",
-    "//cobalt/content/ssl/certs/e868b802.0",
-    "//cobalt/content/ssl/certs/e8de2f56.0",
-    "//cobalt/content/ssl/certs/ecccd8db.0",
-    "//cobalt/content/ssl/certs/ed858448.0",
-    "//cobalt/content/ssl/certs/ee64a828.0",
-    "//cobalt/content/ssl/certs/eed8c118.0",
-    "//cobalt/content/ssl/certs/ef954a4e.0",
-    "//cobalt/content/ssl/certs/f081611a.0",
-    "//cobalt/content/ssl/certs/f0c70a8d.0",
-    "//cobalt/content/ssl/certs/f249de83.0",
-    "//cobalt/content/ssl/certs/f30dd6ad.0",
-    "//cobalt/content/ssl/certs/f3377b1b.0",
-    "//cobalt/content/ssl/certs/f387163d.0",
-    "//cobalt/content/ssl/certs/f39fc864.0",
-    "//cobalt/content/ssl/certs/f51bb24c.0",
-    "//cobalt/content/ssl/certs/fa5da96b.0",
-    "//cobalt/content/ssl/certs/fc5a8f99.0",
-    "//cobalt/content/ssl/certs/fd64f3fc.0",
-    "//cobalt/content/ssl/certs/fe8a2cd8.0",
-    "//cobalt/content/ssl/certs/feffd413.0",
-    "//cobalt/content/ssl/certs/ff34af3f.0",
-  ]
+  sources = network_certs
   outputs =
       [ "$sb_static_contents_output_data_dir/ssl/certs/{{source_file_part}}" ]
 }
diff --git a/cobalt/network/certs.gni b/cobalt/network/certs.gni
new file mode 100644
index 0000000..a8be5b3
--- /dev/null
+++ b/cobalt/network/certs.gni
@@ -0,0 +1,135 @@
+network_certs = [
+  "//cobalt/content/ssl/certs/002c0b4f.0",
+  "//cobalt/content/ssl/certs/02265526.0",
+  "//cobalt/content/ssl/certs/062cdee6.0",
+  "//cobalt/content/ssl/certs/064e0aa9.0",
+  "//cobalt/content/ssl/certs/06dc52d5.0",
+  "//cobalt/content/ssl/certs/09789157.0",
+  "//cobalt/content/ssl/certs/0a775a30.0",
+  "//cobalt/content/ssl/certs/0b1b94ef.0",
+  "//cobalt/content/ssl/certs/0b9bc432.0",
+  "//cobalt/content/ssl/certs/0bf05006.0",
+  "//cobalt/content/ssl/certs/0f5dc4f3.0",
+  "//cobalt/content/ssl/certs/0f6fa695.0",
+  "//cobalt/content/ssl/certs/1001acf7.0",
+  "//cobalt/content/ssl/certs/106f3e4d.0",
+  "//cobalt/content/ssl/certs/14bc7599.0",
+  "//cobalt/content/ssl/certs/18856ac4.0",
+  "//cobalt/content/ssl/certs/1d3472b9.0",
+  "//cobalt/content/ssl/certs/1e08bfd1.0",
+  "//cobalt/content/ssl/certs/1e09d511.0",
+  "//cobalt/content/ssl/certs/244b5494.0",
+  "//cobalt/content/ssl/certs/2923b3f9.0",
+  "//cobalt/content/ssl/certs/2ae6433e.0",
+  "//cobalt/content/ssl/certs/2b349938.0",
+  "//cobalt/content/ssl/certs/32888f65.0",
+  "//cobalt/content/ssl/certs/3513523f.0",
+  "//cobalt/content/ssl/certs/3bde41ac.0",
+  "//cobalt/content/ssl/certs/3fb36b73.0",
+  "//cobalt/content/ssl/certs/40193066.0",
+  "//cobalt/content/ssl/certs/4042bcee.0",
+  "//cobalt/content/ssl/certs/40547a79.0",
+  "//cobalt/content/ssl/certs/406c9bb1.0",
+  "//cobalt/content/ssl/certs/48bec511.0",
+  "//cobalt/content/ssl/certs/4b718d9b.0",
+  "//cobalt/content/ssl/certs/4bfab552.0",
+  "//cobalt/content/ssl/certs/4f316efb.0",
+  "//cobalt/content/ssl/certs/5443e9e3.0",
+  "//cobalt/content/ssl/certs/54657681.0",
+  "//cobalt/content/ssl/certs/57bcb2da.0",
+  "//cobalt/content/ssl/certs/5860aaa6.0",
+  "//cobalt/content/ssl/certs/5931b5bc.0",
+  "//cobalt/content/ssl/certs/5ad8a5d6.0",
+  "//cobalt/content/ssl/certs/5cd81ad7.0",
+  "//cobalt/content/ssl/certs/5e98733a.0",
+  "//cobalt/content/ssl/certs/5f15c80c.0",
+  "//cobalt/content/ssl/certs/5f618aec.0",
+  "//cobalt/content/ssl/certs/607986c7.0",
+  "//cobalt/content/ssl/certs/626dceaf.0",
+  "//cobalt/content/ssl/certs/653b494a.0",
+  "//cobalt/content/ssl/certs/68dd7389.0",
+  "//cobalt/content/ssl/certs/6b99d060.0",
+  "//cobalt/content/ssl/certs/6d41d539.0",
+  "//cobalt/content/ssl/certs/6fa5da56.0",
+  "//cobalt/content/ssl/certs/706f604c.0",
+  "//cobalt/content/ssl/certs/749e9e03.0",
+  "//cobalt/content/ssl/certs/75d1b2ed.0",
+  "//cobalt/content/ssl/certs/76faf6c0.0",
+  "//cobalt/content/ssl/certs/7719f463.0",
+  "//cobalt/content/ssl/certs/773e07ad.0",
+  "//cobalt/content/ssl/certs/7a3adc42.0",
+  "//cobalt/content/ssl/certs/7a780d93.0",
+  "//cobalt/content/ssl/certs/7f3d5d1d.0",
+  "//cobalt/content/ssl/certs/8160b96c.0",
+  "//cobalt/content/ssl/certs/8508e720.0",
+  "//cobalt/content/ssl/certs/8cb5ee0f.0",
+  "//cobalt/content/ssl/certs/8d86cdd1.0",
+  "//cobalt/content/ssl/certs/8d89cda1.0",
+  "//cobalt/content/ssl/certs/8f103249.0",
+  "//cobalt/content/ssl/certs/90c5a3c8.0",
+  "//cobalt/content/ssl/certs/930ac5d2.0",
+  "//cobalt/content/ssl/certs/93bc0acc.0",
+  "//cobalt/content/ssl/certs/9482e63a.0",
+  "//cobalt/content/ssl/certs/9846683b.0",
+  "//cobalt/content/ssl/certs/988a38cb.0",
+  "//cobalt/content/ssl/certs/9b46e03d.0",
+  "//cobalt/content/ssl/certs/9b5697b0.0",
+  "//cobalt/content/ssl/certs/9c8dfbd4.0",
+  "//cobalt/content/ssl/certs/9d04f354.0",
+  "//cobalt/content/ssl/certs/9ef4a08a.0",
+  "//cobalt/content/ssl/certs/9f727ac7.0",
+  "//cobalt/content/ssl/certs/a3418fda.0",
+  "//cobalt/content/ssl/certs/a94d09e5.0",
+  "//cobalt/content/ssl/certs/aee5f10d.0",
+  "//cobalt/content/ssl/certs/b0e59380.0",
+  "//cobalt/content/ssl/certs/b1159c4c.0",
+  "//cobalt/content/ssl/certs/b433981b.0",
+  "//cobalt/content/ssl/certs/b66938e9.0",
+  "//cobalt/content/ssl/certs/b727005e.0",
+  "//cobalt/content/ssl/certs/b7a5b843.0",
+  "//cobalt/content/ssl/certs/b81b93f0.0",
+  "//cobalt/content/ssl/certs/bf53fb88.0",
+  "//cobalt/content/ssl/certs/c01eb047.0",
+  "//cobalt/content/ssl/certs/c28a8a30.0",
+  "//cobalt/content/ssl/certs/ca6e4ad9.0",
+  "//cobalt/content/ssl/certs/cbf06781.0",
+  "//cobalt/content/ssl/certs/cc450945.0",
+  "//cobalt/content/ssl/certs/cd58d51e.0",
+  "//cobalt/content/ssl/certs/cd8c0d63.0",
+  "//cobalt/content/ssl/certs/ce5e74ef.0",
+  "//cobalt/content/ssl/certs/d4dae3dd.0",
+  "//cobalt/content/ssl/certs/d52c538d.0",
+  "//cobalt/content/ssl/certs/d6325660.0",
+  "//cobalt/content/ssl/certs/d7e8dc79.0",
+  "//cobalt/content/ssl/certs/d887a5bb.0",
+  "//cobalt/content/ssl/certs/dc4d6a89.0",
+  "//cobalt/content/ssl/certs/dd8e9d41.0",
+  "//cobalt/content/ssl/certs/de6d66f3.0",
+  "//cobalt/content/ssl/certs/e113c810.0",
+  "//cobalt/content/ssl/certs/e18bfb83.0",
+  "//cobalt/content/ssl/certs/e35234b1.0",
+  "//cobalt/content/ssl/certs/e36a6752.0",
+  "//cobalt/content/ssl/certs/e73d606e.0",
+  "//cobalt/content/ssl/certs/e868b802.0",
+  "//cobalt/content/ssl/certs/e8de2f56.0",
+  "//cobalt/content/ssl/certs/ecccd8db.0",
+  "//cobalt/content/ssl/certs/ed858448.0",
+  "//cobalt/content/ssl/certs/ee64a828.0",
+  "//cobalt/content/ssl/certs/eed8c118.0",
+  "//cobalt/content/ssl/certs/ef954a4e.0",
+  "//cobalt/content/ssl/certs/f081611a.0",
+  "//cobalt/content/ssl/certs/f0c70a8d.0",
+  "//cobalt/content/ssl/certs/f249de83.0",
+  "//cobalt/content/ssl/certs/f30dd6ad.0",
+  "//cobalt/content/ssl/certs/f3377b1b.0",
+  "//cobalt/content/ssl/certs/f387163d.0",
+  "//cobalt/content/ssl/certs/f39fc864.0",
+  "//cobalt/content/ssl/certs/f51bb24c.0",
+  "//cobalt/content/ssl/certs/fa5da96b.0",
+  "//cobalt/content/ssl/certs/fb717492.0",
+  "//cobalt/content/ssl/certs/fc5a8f99.0",
+  "//cobalt/content/ssl/certs/fd64f3fc.0",
+  "//cobalt/content/ssl/certs/fe8a2cd8.0",
+  "//cobalt/content/ssl/certs/feffd413.0",
+  "//cobalt/content/ssl/certs/ff34af3f.0",
+]
diff --git a/cobalt/network/network_module.cc b/cobalt/network/network_module.cc
index 0c8f67e..343d7a4 100644
--- a/cobalt/network/network_module.cc
+++ b/cobalt/network/network_module.cc
@@ -37,6 +37,7 @@
 const char kCaptureModeIncludeSocketBytes[] = "IncludeSocketBytes";
 const char kDefaultNetLogName[] = "cobalt_netlog.json";
 #endif
+constexpr size_t kNetworkModuleStackSize = 512 * 1024;
 }  // namespace
 
 NetworkModule::NetworkModule(const Options& options) : options_(options) {
@@ -175,7 +176,10 @@
   // Launch the IO thread.
   base::Thread::Options thread_options;
   thread_options.message_loop_type = base::MessageLoop::TYPE_IO;
-  thread_options.stack_size = 256 * 1024;
+  // Without setting a stack size here, the system default will be used
+  // which can be quite a bit larger (e.g. 4MB on Linux)
+  // Setting it manually keeps it managed.
+  thread_options.stack_size = kNetworkModuleStackSize;
   thread_options.priority = base::ThreadPriority::NORMAL;
   thread_->StartWithOptions(thread_options);
 
diff --git a/cobalt/renderer/BUILD.gn b/cobalt/renderer/BUILD.gn
index 54d2187..41633ef 100644
--- a/cobalt/renderer/BUILD.gn
+++ b/cobalt/renderer/BUILD.gn
@@ -25,7 +25,7 @@
     "//base",
     "//cobalt/render_tree",
     "//cobalt/render_tree:animations",
-    "//starboard",
+    "//starboard:starboard_group",
   ]
 }
 
diff --git a/cobalt/site/README.md b/cobalt/site/README.md
new file mode 100644
index 0000000..4a17edb
--- /dev/null
+++ b/cobalt/site/README.md
@@ -0,0 +1,22 @@
+# Regenerating developer site contents
+
+1.  Update documents and images. Note that files in `cobalt/site/gen` and
+    `cobalt/site/reference` are autogenerated and changes in these directories
+    will be overwritten by the steps below.
+
+2.  From the root of your repository run the following to build the docsite
+    Docker image.
+
+    ```shell
+    $ docker build -t docsite --build-arg UID=$(id -u) --build-arg GID=$(id -g) cobalt/site/docker
+    ```
+
+3.  Run it to regenerate the site.
+
+    ```shell
+    $ docker run -it --mount type=bind,source=$(pwd),target=/code docsite
+    ```
+
+4.  (Optional) To preview the changes you must commit the generated files and
+    create a Pull Request. That pull request can be previewed in staging by
+    following the direction for deploying the developer site.
diff --git a/cobalt/site/docker/Dockerfile b/cobalt/site/docker/Dockerfile
new file mode 100644
index 0000000..b22bc09
--- /dev/null
+++ b/cobalt/site/docker/Dockerfile
@@ -0,0 +1,65 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ARG FROM_IMAGE
+FROM ${FROM_IMAGE:-gcr.io/cloud-marketplace-containers/google/debian10}
+
+RUN apt update -qqy \
+    && apt install -qqy --no-install-recommends \
+        curl \
+        doxygen \
+        git \
+        python3 \
+        unzip \
+    && apt-get clean autoclean \
+    && apt-get autoremove -y --purge \
+    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
+    && rm -rf /var/lib/{apt,dpkg,cache,log}
+
+# Tell GN that we are building with Docker.
+ENV IS_DOCKER=1
+
+# Set python path for gn.
+ENV PYTHONPATH=/code
+
+# Mark the source directory safe.
+RUN git config --global --add safe.directory /code
+
+# === Get GN via CIPD
+ARG GN_SHA256SUM="af7b2dcb3905bca56655e12131b365f1cba8e159db80d2022330c4f522fab2ef  /tmp/gn.zip"
+ARG GN_HASH=r3styzkFvKVmVeEhMbNl8cuo4VnbgNICIzDE9SL6su8C
+RUN curl --location --silent --output /tmp/gn.zip \
+    "https://chrome-infra-packages.appspot.com/dl/gn/gn/linux-amd64/+/${GN_HASH}" \
+    && echo ${GN_SHA256SUM} | sha256sum --check \
+    && unzip /tmp/gn.zip -d /usr/local/bin \
+    && rm /tmp/gn.zip
+RUN chmod a+x /usr/local/bin/gn
+
+# We create and use a non-root user explicitly so that the generated and
+# modified files maintain the same permissions as the user that launched the
+# Docker container.
+ARG USER
+ARG UID
+ARG GID
+RUN addgroup --group --gid "${GID}" defaultgroup \
+    && adduser --disabled-password --gecos '' --uid "${UID}" --gid "${GID}" defaultuser
+
+# Create an out directory for gn. Its name is hardcoded in the docsite script.
+RUN mkdir /project_out_dir \
+    && chown ${USER:-defaultuser}:defaultgroup /project_out_dir
+
+# Once the directory has been created we can switch to the new user.
+USER ${USER:-defaultuser}
+
+CMD /code/cobalt/site/scripts/generate_site.py
diff --git a/cobalt/site/docs/blog/index.md b/cobalt/site/docs/blog/index.md
deleted file mode 100644
index 7a9b5c2..0000000
--- a/cobalt/site/docs/blog/index.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-layout: postlist
-title: Posts
-bodyclass: postslist
-tocDepth: h2
-tocHeader: Blog posts
----
-
-{% for post in site.posts %}
-
-  {% if site.blog.posts_before_list and forloop.index > site.blog.posts_before_list %}
-
-{% if forloop.index0 == site.blog.posts_before_list %}
-## {{ site.blog.previous_post_text }}
-{% endif %}
-
-* [{{ post.title }}]({{ post.url | prepend: site.baseurl }}), {{ post.date | date_to_string }}
-
-  {% elsif site.excerpt_separator %}
-
-<p style="font-size: 0.8em; margin: 0;"><b>{{ post.date | date_to_string }}{% if post.attribution %}, {{ post.attribution }}{% endif %}</b></p>
-
-## {{ post.title }} <span>({{ post.date | date: "%b.&nbsp;%d&nbsp;%Y" }})</span>
-
-<p>{{ post.excerpt | remove: '<p>' | remove: '</p>' }} <a href="{{ post.url | prepend: site.baseurl }}">[read more]</a></p>
-
-{% unless forloop.last %}<hr>{% endunless %}
-
-  {% else %}
-
-## {{ post.title }} <span>({{ post.date | date: "%b.&nbsp;%d&nbsp;%Y" }})</span>
-
-<div class="postdate">
-Posted on {{ post.date | date: "%A, %B %d %Y" }} (<a href="{{ post.url }}">permanent link</a>)
-</div>
-{{ post.content }}
-
-{% unless forloop.last %}<hr>{% endunless %}
-
-  {% endif  %}
-
-{% endfor %}
diff --git a/cobalt/site/docs/codelabs/starboard_extensions/codelab.md b/cobalt/site/docs/codelabs/starboard_extensions/codelab.md
index 09e2870..63e3cee 100644
--- a/cobalt/site/docs/codelabs/starboard_extensions/codelab.md
+++ b/cobalt/site/docs/codelabs/starboard_extensions/codelab.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Extensions codelab"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Extensions codelab
 
 The Starboard Extension framework provides a way to add optional, platform-specific
 features to the Starboard application. A Starboard Extension is an optional interface
@@ -17,13 +17,13 @@
 
 Because it's helpful to build and run Cobalt during the exercises, you'll first
 want to set up your environment and make sure you can build Cobalt. You can
-follow <a href="/development/setup-linux.html">Set up your environment -
+follow <a href="../../development/setup-linux.md">Set up your environment -
 Linux</a> to do this if you're a Linux user. Please note that the exercise
 solutions assume you're using Linux but should be comparable to implementations
 for other platforms.
 
 Also note that while this codelab doesn't require it, you'll need to
-<a href="/starboard/porting.html">Port Cobalt to your platform</a> before you
+<a href="../../starboard/porting.md">Port Cobalt to your platform</a> before you
 can actually use a Starboard Extension to customize it for your platform.
 
 Finally, the exercises assume the ability to program in C and C++.
@@ -785,5 +785,5 @@
 team will review the proposal accordingly. If the Cobalt team approves of the
 use case and design then a member of the team will assign the feature request
 back to you for implementation. At this point, please follow the
-<a href="/contributors/index.html">Contributing to Cobalt</a> guide to ensure
+<a href="../../contributors/index.md">Contributing to Cobalt</a> guide to ensure
 your code is compliant and can be reviewed and submitted.
diff --git a/cobalt/site/docs/communication.md b/cobalt/site/docs/communication.md
index d8d4d40..fc26c2b 100644
--- a/cobalt/site/docs/communication.md
+++ b/cobalt/site/docs/communication.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "How to Communicate with the Cobalt Team"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# How to Communicate with the Cobalt Team
 
 We have several communication channels that we actively support, each for
 different purposes.
diff --git a/cobalt/site/docs/contributors/index.md b/cobalt/site/docs/contributors/index.md
index 3eb235f..f576f5f 100644
--- a/cobalt/site/docs/contributors/index.md
+++ b/cobalt/site/docs/contributors/index.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Contributing to Cobalt"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Contributing to Cobalt
 
 We'd love to hear about how you would like to contribute to Cobalt!
 
diff --git a/cobalt/site/docs/development/reference/supported-features.md b/cobalt/site/docs/development/reference/supported-features.md
index d4e41e4..ef52f0c 100644
--- a/cobalt/site/docs/development/reference/supported-features.md
+++ b/cobalt/site/docs/development/reference/supported-features.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Cobalt Support Quick Reference"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Cobalt Support Quick Reference
 
 ## HTML elements
 
diff --git a/cobalt/site/docs/development/setup-android.md b/cobalt/site/docs/development/setup-android.md
index 82e26aa..08fc953 100644
--- a/cobalt/site/docs/development/setup-android.md
+++ b/cobalt/site/docs/development/setup-android.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Set up your environment - Android"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Set up your environment - Android
 
 These instructions explain how to set up Cobalt for your workstation and Android
 device. The package being built here is referred to as CoAT (Cobalt on Android TV).
@@ -98,11 +98,11 @@
     Android Studio, you can add the roots, or if not then choose to ignore them.
 1.  If you didn't already get prompted to install the SDK, do it now by going to
     Tools -> SDK Manager (or
-    <img src="/images/android-sdk-manager-icon.png" style="display:inline;"></img>
+    <img src="../../images/android-sdk-manager-icon.png" style="display:inline;"></img>
     ) on the toolbar) and making the same choices as shown in step 4.
 1.  Make a new virtual device (= emulator) via
     Tools -> AVD Manager (or
-    <img src="/images/android-avd-manager-icon.png" style="display: inline;"></img>
+    <img src="../../images/android-avd-manager-icon.png" style="display: inline;"></img>
     on the toolbar).
       *   Category: TV -> Android TV (720p)
       *   System image: Pie (API 28) x86 (you'll have to download the image)
@@ -178,7 +178,7 @@
 1.  In the sidebar on the left, you should see `app` appear as bolded top-level
     item.  If you don't see this, restart Android Studio.
 1.  To run the app and attach the debugger: Run -> Debug 'app' (or
-    <img src="/images/android-debug-icon.png" style="display: inline;"></img>
+    <img src="../../images/android-debug-icon.png" style="display: inline;"></img>
     in the toolbar)
 1.  If it's taking awhile, it's probably the ninja build. You can see that it is
     still processing by looking for a rotating spinner labeled "Gradle Build
diff --git a/cobalt/site/docs/development/setup-docker.md b/cobalt/site/docs/development/setup-docker.md
index ae9c1b1..3632e75 100644
--- a/cobalt/site/docs/development/setup-docker.md
+++ b/cobalt/site/docs/development/setup-docker.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Set up your environment - Docker"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Set up your environment - Docker
 
 We provide <a
 href="https://github.com/youtube/cobalt/tree/main/docker/linux/">Docker image definitions</a> to simplify managing build environments.
diff --git a/cobalt/site/docs/development/setup-linux.md b/cobalt/site/docs/development/setup-linux.md
index 124a3d0..889c4d0 100644
--- a/cobalt/site/docs/development/setup-linux.md
+++ b/cobalt/site/docs/development/setup-linux.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Set up your environment - Linux"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Set up your environment - Linux
 
 These instructions explain how Linux users set up their Cobalt development
 environment, clone a copy of the Cobalt code repository, and build a Cobalt
@@ -133,7 +133,7 @@
     The previous command contains three variables:
 
     1.  `<platform>` is the [platform
-        configuration](/starboard/porting.html#1-enumerate-and-name-your-platform-configurations)
+        configuration](../starboard/porting.md#1-enumerate-and-name-your-platform-configurations)
         that identifies the platform. As described in the Starboard porting
         guide, it contains a `family name` (like `linux`) and a
         `binary variant` (like `x64x11`), separated by a hyphen.
diff --git a/cobalt/site/docs/development/setup-raspi.md b/cobalt/site/docs/development/setup-raspi.md
index 84952f3..8a3acdc 100644
--- a/cobalt/site/docs/development/setup-raspi.md
+++ b/cobalt/site/docs/development/setup-raspi.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Set up your environment - Raspberry Pi"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Set up your environment - Raspberry Pi
 
 These instructions explain how to set up Cobalt for your workstation and your
 Raspberry Pi device. They have been tested with Ubuntu:20.04 and a Raspberry Pi
@@ -40,7 +40,7 @@
 
 <aside class="note">
 <b>Note:</b> Before proceeding further, refer to the documentation for
-<a href="setup-linux.html">"Set up your environment - Linux"</a>. Complete the
+<a href="setup-linux.md">"Set up your environment - Linux"</a>. Complete the
 sections <b>Set up your workstation</b> and <b>Set up developer tools</b>, then
 return and complete the following steps.
 </aside>
diff --git a/cobalt/site/docs/development/setup-rdk.md b/cobalt/site/docs/development/setup-rdk.md
index 6a16461..21ec792 100644
--- a/cobalt/site/docs/development/setup-rdk.md
+++ b/cobalt/site/docs/development/setup-rdk.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Set up your environment - RDK"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Set up your environment - RDK
 
 The detailed documentation for building and using RDK-V reference port is
 provided by the RDK project. Please see details in
diff --git a/cobalt/site/docs/development/setup-windows.md b/cobalt/site/docs/development/setup-windows.md
index 47a98cc..6da9189 100644
--- a/cobalt/site/docs/development/setup-windows.md
+++ b/cobalt/site/docs/development/setup-windows.md
@@ -1,7 +1,7 @@
----

-layout: doc

-title: "Set up your environment - Windows"

----

+Project: /youtube/cobalt/_project.yaml

+Book: /youtube/cobalt/_book.yaml

+

+# Set up your environment - Windows

 

 These instructions explain how Windows users can set up their Cobalt development

 environment, clone a copy of the Cobalt code repository, and build a Cobalt

@@ -138,7 +138,7 @@
     The previous command contains three variables:

 

     1.  `<platform>` is the [platform

-        configuration](/starboard/porting.html#1-enumerate-and-name-your-platform-configurations)

+        configuration](../starboard/porting.md#1-enumerate-and-name-your-platform-configurations)

         that identifies the platform. As described in the Starboard porting

         guide, it contains a `family name` (like `linux`) and a

         `binary variant` (like `x64x11`), separated by a hyphen. For Windows

diff --git a/cobalt/site/docs/gen/cobalt/doc/branching.md b/cobalt/site/docs/gen/cobalt/doc/branching.md
index c3b9cd9..42b8b34 100644
--- a/cobalt/site/docs/gen/cobalt/doc/branching.md
+++ b/cobalt/site/docs/gen/cobalt/doc/branching.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Cobalt Branching"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt Branching
 
 *(This document assumes you are already familiar
diff --git a/cobalt/site/docs/gen/cobalt/doc/clients_performance_guide.md b/cobalt/site/docs/gen/cobalt/doc/clients_performance_guide.md
index bfed2e7..65676a8 100644
--- a/cobalt/site/docs/gen/cobalt/doc/clients_performance_guide.md
+++ b/cobalt/site/docs/gen/cobalt/doc/clients_performance_guide.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Cobalt Clients Performance Guide"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt Clients Performance Guide
 
 This document contains a list of hints and tricks for using web technologies
diff --git a/cobalt/site/docs/gen/cobalt/doc/cvals.md b/cobalt/site/docs/gen/cobalt/doc/cvals.md
index 665c6a1..d8d870a 100644
--- a/cobalt/site/docs/gen/cobalt/doc/cvals.md
+++ b/cobalt/site/docs/gen/cobalt/doc/cvals.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Cobalt CVals"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt CVals
 
 ## Overview
@@ -123,6 +122,18 @@
     compatibility violations encountered.
 *   **Count.XHR** - The total number of xhr::XMLHttpRequest in existence
     globally.
+*   **Count.MainWebModule.AnimatedImage.Active** - The total number of currently
+    active animated image decoders. Same image from a single URL source rendered
+    multiple times across the content counts as one decoder.
+*   **Count.MainWebModule.AnimatedImage.DecodedFrames** - Total number of decoded
+    frames across all active image decoders. This number resets only when
+    WebModule gets re-created - e.g. page reload, navigation.
+*   **Count.MainWebModule.AnimatedImage.DecodingUnderruns** - Total number of
+    frames when animated image decoding has fallen behind real-time, as defined
+    by image frame exposure times. This indicates a CPU bottleneck.
+*   **Count.MainWebModule.AnimatedImage.DecodingOverruns** - Total number of
+    frames when animated image decoding has been attempted too early, before
+    next frame exposure time. This indicates a timing issue in platform.
 
 ### Event
 
diff --git a/cobalt/site/docs/gen/cobalt/doc/deep_links.md b/cobalt/site/docs/gen/cobalt/doc/deep_links.md
index c73491f..cdf20f8 100644
--- a/cobalt/site/docs/gen/cobalt/doc/deep_links.md
+++ b/cobalt/site/docs/gen/cobalt/doc/deep_links.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Cobalt Deep Links"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt Deep Links
 
 - [Cobalt Deep Links](#cobalt-deep-links)
diff --git a/cobalt/site/docs/gen/cobalt/doc/device_authentication.md b/cobalt/site/docs/gen/cobalt/doc/device_authentication.md
index c7dcb7c..8d9f7e2 100644
--- a/cobalt/site/docs/gen/cobalt/doc/device_authentication.md
+++ b/cobalt/site/docs/gen/cobalt/doc/device_authentication.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Device Authentication"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Device Authentication
 
 Starting in Cobalt 20, initial URL requests will now have query parameters
diff --git a/cobalt/site/docs/gen/cobalt/doc/docker_build.md b/cobalt/site/docs/gen/cobalt/doc/docker_build.md
index 9f49f2d..06a183f 100644
--- a/cobalt/site/docs/gen/cobalt/doc/docker_build.md
+++ b/cobalt/site/docs/gen/cobalt/doc/docker_build.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Cobalt Docker builds"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt Docker builds
 
 Cobalt includes [Docker image][docker.com](https://www.docker.com/)
diff --git a/cobalt/site/docs/gen/cobalt/doc/lifecycle.md b/cobalt/site/docs/gen/cobalt/doc/lifecycle.md
index d945ff1..a07d1a5 100644
--- a/cobalt/site/docs/gen/cobalt/doc/lifecycle.md
+++ b/cobalt/site/docs/gen/cobalt/doc/lifecycle.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Application Lifecycle"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Application Lifecycle
 
 In order to meet common needs of applications running on CE devices, Cobalt
diff --git a/cobalt/site/docs/gen/cobalt/doc/memory_tuning.md b/cobalt/site/docs/gen/cobalt/doc/memory_tuning.md
index 1c09787..eaf8f58 100644
--- a/cobalt/site/docs/gen/cobalt/doc/memory_tuning.md
+++ b/cobalt/site/docs/gen/cobalt/doc/memory_tuning.md
@@ -1,8 +1,7 @@
----
-layout: doc
-title: ""
----
-# Memory Tuning #
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Memory Tuning
 
 Cobalt is designed to choose sensible parameters for memory-related options and
 parameters through a system called "AutoMem".
@@ -20,7 +19,7 @@
 *Setting `--max_cobalt_cpu_usage` and `--max_cobalt_gpu_usage` on the
 command line is a beta feature.*
 
-### Memory Settings Table ###
+### Memory Settings Table
 
 A table similar to the one below, will be printed on startup.
 
@@ -83,7 +82,7 @@
       * This value was AutoSet to a default value, but then was reduced in
       response to `max_cobalt_cpu_usage` or `max_cobalt_gpu_usage being` set too low.
 
-### Maximum Memory Table ###
+### Maximum Memory Table
 
 This second table is also printed at startup and details the sum of memory and
 maximum memory limits as reported by cobalt.
@@ -132,13 +131,13 @@
 will reduce their memory consumption. When this happens, look for the string
 *`AutoSet (Constrained)`* in the first table.
 
-## Setting Maximum Memory Values ##
+## Setting Maximum Memory Values
 
 The max cpu and gpu memory of the system can be set by command line:
   * `--max_cobalt_cpu_usage=160MB`
   * `--max_cobalt_gpu_usage=160MB`
 
-### Memory Scaling ###
+### Memory Scaling
 
 There are two primary ways in which the memory consumption settings will scale down.
 One is by specifying `--max_cobalt_cpu_usage` (or `max_cobalt_gpu_usage`) to a
@@ -156,7 +155,7 @@
  `--image_cache_size_in_bytes=auto` will allow `image_cache_size_in_bytes` to be
 flexible by disabling the value being set by a build setting.
 
-### Memory Warnings ###
+### Memory Warnings
 
 Cobalt will periodically check to see if the memory consumed by the application
 is less than the `--max_cobalt_cpu_usage` and `--max_cobalt_gpu_usage` amount.
@@ -164,7 +163,7 @@
 once to stdout for cpu and/or gpu memory systems.
 
 
-### Example 1 - Configuring for a memory restricted platform ###
+### Example 1 - Configuring for a memory restricted platform
 
 Let's say that we are configuring platform called "XXX":
 
@@ -190,7 +189,7 @@
 
   * `cobalt --max_cobalt_cpu_usage=160MB`
 
-### Example 2 - Configuring for a memory-plentiful platform ###
+### Example 2 - Configuring for a memory-plentiful platform
 
 The following command line will give a lot of memory to image cache and give
 500MB to `max_cobalt_cpu_usage` and `max_cobalt_gpu_usage`.
@@ -200,9 +199,9 @@
 --image_cache_size_in_bytes=80MB
 ~~~
 
-## API Reference ##
+## API Reference
 
-#### Memory System API ####
+#### Memory System API
 
   * `max_cobalt_cpu_usage`
     * This setting will set the maximum cpu memory that the app will consume.
@@ -222,7 +221,7 @@
       for `max_cobalt_gpu_usage` in commandline/starboard settings then no
       GPU memory checking is performed.
 
-#### Memory Setting API ####
+#### Memory Setting API
 
   * `image_cache_size_in_bytes`
     * See documentation *Image cache capacity* in `performance_tuning.md` for what
@@ -256,7 +255,7 @@
       for what this setting does.
     * Set via command line, or else Cobalt extension, or else automatically by Cobalt.
 
-#### Units for Command Line Settings ####
+#### Units for Command Line Settings
 
 Memory values passed into Cobalt via command line arguments support units such
 kb, mb, and gb for kilo-byte, megabyte, gigabytes. These units are case insensitive.
diff --git a/cobalt/site/docs/gen/cobalt/doc/net_log.md b/cobalt/site/docs/gen/cobalt/doc/net_log.md
index 0dbea4c..2358f81 100644
--- a/cobalt/site/docs/gen/cobalt/doc/net_log.md
+++ b/cobalt/site/docs/gen/cobalt/doc/net_log.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Cobalt NetLog"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt NetLog
 
 Chromium has a very useful network diagnostic tool called the NetLog and Cobalt
diff --git a/cobalt/site/docs/gen/cobalt/doc/performance_tuning.md b/cobalt/site/docs/gen/cobalt/doc/performance_tuning.md
index 90936c3..ea27a56 100644
--- a/cobalt/site/docs/gen/cobalt/doc/performance_tuning.md
+++ b/cobalt/site/docs/gen/cobalt/doc/performance_tuning.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Performance Tuning"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Performance Tuning
 
 Cobalt is designed to choose sensible parameters for all performance-related
diff --git a/cobalt/site/docs/gen/cobalt/doc/platform_services.md b/cobalt/site/docs/gen/cobalt/doc/platform_services.md
index 2228aa7..84d3e2e 100644
--- a/cobalt/site/docs/gen/cobalt/doc/platform_services.md
+++ b/cobalt/site/docs/gen/cobalt/doc/platform_services.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Cobalt Platform Services"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt Platform Services
 
 _NOTE: The Cobalt Platform Services API replaces the deprecated Cobalt Custom Web API Extensions_
diff --git a/cobalt/site/docs/gen/cobalt/doc/spherical_video.md b/cobalt/site/docs/gen/cobalt/doc/spherical_video.md
index b82de1e..ecdd5b1 100644
--- a/cobalt/site/docs/gen/cobalt/doc/spherical_video.md
+++ b/cobalt/site/docs/gen/cobalt/doc/spherical_video.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Enabling Spherical Video in Cobalt"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Enabling Spherical Video in Cobalt
 
 Cobalt supports playback of 360 spherical videos.  Cobalt does not expose
diff --git a/cobalt/site/docs/gen/cobalt/doc/splash_screen.md b/cobalt/site/docs/gen/cobalt/doc/splash_screen.md
index 16651c3..9181758 100644
--- a/cobalt/site/docs/gen/cobalt/doc/splash_screen.md
+++ b/cobalt/site/docs/gen/cobalt/doc/splash_screen.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Cobalt Splash Screen"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt Splash Screen
 
 ## Startup splash screen sequence
diff --git a/cobalt/site/docs/gen/cobalt/doc/versioning.md b/cobalt/site/docs/gen/cobalt/doc/versioning.md
index 020d607..4cf9e66 100644
--- a/cobalt/site/docs/gen/cobalt/doc/versioning.md
+++ b/cobalt/site/docs/gen/cobalt/doc/versioning.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Cobalt Versioning"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt Versioning
 
 Cobalt versions, as they appear in the user agent, have the following structure:
diff --git a/cobalt/site/docs/gen/cobalt/doc/voice_search.md b/cobalt/site/docs/gen/cobalt/doc/voice_search.md
index 503428f..e0eabb7 100644
--- a/cobalt/site/docs/gen/cobalt/doc/voice_search.md
+++ b/cobalt/site/docs/gen/cobalt/doc/voice_search.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Enabling voice search in Cobalt"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Enabling voice search in Cobalt
 
 Cobalt enables voice search through a subset of the
@@ -27,15 +26,15 @@
 
 In `starboard/linux/shared/soft_mic_platform_service.cc` there is an example
 stub implementation of the SoftMicPlatformService. Platforms can optionally
-implement this [CobaltPlatformService](https://cobalt.dev/gen/cobalt/doc/\
-platform_services.html) to specify if they support the `soft mic` and/or `hard mic`
-for voice search. The `soft mic` refers to the software activation of the microphone
-for voice search through the UI microphone button on the Youtube Web Application
-search page. The `hard mic` refers to hardware button activation of the microphone
-for voice search. Platforms can also specify the optional `micGesture`. This
-specifies the type of UI prompt the YouTube Web Application should display to guide
-the user to start voice search. The options include an empty or `null` value for no
-prompt, `"TAP"` for tap the `soft mic` and/or `hard mic` to start voice search, or
+implement this [CobaltPlatformService](platform_services.md) to specify if they
+support the `soft mic` and/or `hard mic` for voice search. The `soft mic` refers
+to the software activation of the microphone for voice search through the UI
+microphone button on the Youtube Web Application search page. The `hard mic`
+refers to hardware button activation of the microphone for voice search.
+Platforms can also specify the optional `micGesture`. This specifies the type of
+UI prompt the YouTube Web Application should display to guide the user to start
+voice search. The options include an empty or `null` value for no prompt,
+`"TAP"` for tap the `soft mic` and/or `hard mic` to start voice search, or
 `"HOLD"` for hold the `soft mic` and/or the `hard mic` to start voice search.
 
 The Web Application messages to the platform will be singular strings, encoded with
diff --git a/cobalt/site/docs/gen/cobalt/doc/web_debugging.md b/cobalt/site/docs/gen/cobalt/doc/web_debugging.md
index 63ff1af..185faca 100644
--- a/cobalt/site/docs/gen/cobalt/doc/web_debugging.md
+++ b/cobalt/site/docs/gen/cobalt/doc/web_debugging.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Cobalt Web Debugging"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt Web Debugging
 
 ## Overview
diff --git a/cobalt/site/docs/gen/starboard/build/doc/gn_migrate_stub_to_platform.md b/cobalt/site/docs/gen/starboard/build/doc/gn_migrate_stub_to_platform.md
index 12c9356..15bfcaa 100644
--- a/cobalt/site/docs/gen/starboard/build/doc/gn_migrate_stub_to_platform.md
+++ b/cobalt/site/docs/gen/starboard/build/doc/gn_migrate_stub_to_platform.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Stub to Platform GN Migration"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Stub to Platform GN Migration
 
 This document outlines a step by step process for converting the stub platform's
diff --git a/cobalt/site/docs/gen/starboard/build/doc/migrating_gyp_to_gn.md b/cobalt/site/docs/gen/starboard/build/doc/migrating_gyp_to_gn.md
index 5645ced..c0e46b5 100644
--- a/cobalt/site/docs/gen/starboard/build/doc/migrating_gyp_to_gn.md
+++ b/cobalt/site/docs/gen/starboard/build/doc/migrating_gyp_to_gn.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Migrating GYP to GN"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Migrating GYP to GN
 
 Cobalt is currently in the process of migrating from our current build system
@@ -205,7 +204,7 @@
 ### Validating a Target
 
 If you're migrating a single target, it's simple to check: just configure the
-build using the the necessary arguments then build that target with `ninja`,
+build using the necessary arguments then build that target with `ninja`,
 i.e.:
 
 ```
@@ -267,8 +266,8 @@
 process for converting the stub platform's GN files to GN files that will be
 able to be built for your platform.
 
-[cobalt_porting_guide]: https://cobalt.dev/starboard/porting.html
-[dev_setup_linux]: https://cobalt.dev/development/setup-linux.html
+[cobalt_porting_guide]: https://developers.google.com/youtube/cobalt/docs/starboard/porting
+[dev_setup_linux]: https://developers.google.com/youtube/cobalt/docs/development/setup-linux
 [gn_check_tool]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/reference.md#cmd_check
 [gn_doc_home]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs
 [gn_format_tool]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/reference.md#cmd_format
diff --git a/cobalt/site/docs/gen/starboard/build/doc/migration_changes.md b/cobalt/site/docs/gen/starboard/build/doc/migration_changes.md
index 468de10..dd5419c 100644
--- a/cobalt/site/docs/gen/starboard/build/doc/migration_changes.md
+++ b/cobalt/site/docs/gen/starboard/build/doc/migration_changes.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "GYP to GN Migration Changes"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # GYP to GN Migration Changes
 
 This file tracks changes to configuration meta build configuration variables in
@@ -46,7 +45,7 @@
 ## Notes:
 
 *   *Starboard Implementation:* If your platform defined
-    `STARBOARD_IMPLENTATION` in its implementation, you would now add the above
+    `STARBOARD_IMPLEMENTATION` in its implementation, you would now add the above
     config with `configs +=
     ["//starboard/build/config:starboard_implementation"]`.
 
diff --git a/cobalt/site/docs/gen/starboard/doc/api_process.md b/cobalt/site/docs/gen/starboard/doc/api_process.md
index 0d699d2..37023ad 100644
--- a/cobalt/site/docs/gen/starboard/doc/api_process.md
+++ b/cobalt/site/docs/gen/starboard/doc/api_process.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Starboard API Review Process"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Starboard API Review Process
 
 ## Why do we need a process?
diff --git a/cobalt/site/docs/gen/starboard/doc/building.md b/cobalt/site/docs/gen/starboard/doc/building.md
index 99fecd9..306b2c5 100644
--- a/cobalt/site/docs/gen/starboard/doc/building.md
+++ b/cobalt/site/docs/gen/starboard/doc/building.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Building Starboard"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Building Starboard
 
 Starboard currently uses GYP as the basis of its build system, though there is
diff --git a/cobalt/site/docs/gen/starboard/doc/c99.md b/cobalt/site/docs/gen/starboard/doc/c99.md
index 0c32d93..5fb5f90 100644
--- a/cobalt/site/docs/gen/starboard/doc/c99.md
+++ b/cobalt/site/docs/gen/starboard/doc/c99.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Starboard and C99"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Starboard and C99
 
 ## Background
diff --git a/cobalt/site/docs/gen/starboard/doc/crash_handlers.md b/cobalt/site/docs/gen/starboard/doc/crash_handlers.md
index 36ba542..93d3de5 100644
--- a/cobalt/site/docs/gen/starboard/doc/crash_handlers.md
+++ b/cobalt/site/docs/gen/starboard/doc/crash_handlers.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Installing Crash Handlers in Cobalt"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Installing Crash Handlers in Cobalt
 
 Partners can install Crashpad's crash handlers to create crash reports in the
diff --git a/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_lite.md b/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_lite.md
index 93ff983..55b54e2 100644
--- a/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_lite.md
+++ b/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_lite.md
@@ -1,9 +1,7 @@
----
-layout: doc
-title: "Evergreen Lite Partner Doc"
----
-Evergreen Lite Partner Doc
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
 
+# Evergreen Lite Partner Doc
 
 ## What is Cobalt Evergreen Lite?
 
diff --git a/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_overview.md b/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_overview.md
index 98de330..75f2ac7 100644
--- a/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_overview.md
+++ b/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_overview.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Cobalt Evergreen Overview"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt Evergreen Overview
 
 ![Cobalt non-Evergreen vs
@@ -94,38 +93,46 @@
 
 ### Building Cobalt Evergreen Components
 
-Cobalt Evergreen requires that there are two separate build(`gyp`)
-configurations used due to the separation of the Cobalt core(`libcobalt.so`) and
-the platform-specific Starboard layer(`loader_app`). As a result, you will have
-to initiate a separate gyp process for each. This is required since the Cobalt
-core binary is built with the Google toolchain settings and the
-platform-specific Starboard layer is built with partner toolchain
-configurations.
+Because of its separation of the Cobalt core (`libcobalt.so`) and platform-
+specific Starboard layers, Cobalt Evergreen requires two build configurations.
+This means there are two relevant GN platforms defined in the build code, and
+that `gn gen` must be run twice to generate ninja files for two separate
+platforms.
 
-Cobalt Evergreen is built by a separate gyp platform using the Google toolchain:
+#### Configuring your port for Evergreen
+
+The Evergreen platforms for the different supported architectures, which are
+used to build Cobalt core (`libcobalt.so`), are maintained by Google. So, no
+changes are needed by the partner here.
+
+However, a few small changes are needed in the partner's port, which is used to
+build the partner-built components, to make it compatible with Evergreen.
+
+First, partners should set `sb_is_evergreen_compatible = true` in the platform's
+`platform_configuration/configuration.gni` file. (Please DO NOT set
+`sb_is_evergreen` to `true`, as this should only be set in the Evergreen
+platforms that are maintained by Google and used to build Cobalt core.)
+
+Second, in the platform's `toolchain/BUILD.gn` file partners should copy their
+"target" toolchain to add a "native_target" toolchain that is identical except
+that it sets `is_starboard = false` and `is_native_target_build = true`.
+
+For example:
 
 ```
-$ cobalt/build/gn.py -p evergreen-arm-softfp -c qa
-$ ninja -C out/evergreen-arm-softfp_qa cobalt
+gcc_toolchain("target") {
+  ...
+}
+
+gcc_toolchain("native_target") {
+  ...
+  is_starboard = false
+  is_native_target_build = true
+}
 ```
 
-Which produces a shared library `libcobalt.so` targeted for specific
-architecture, ABI and Starboard version.
-
-The gyp variable `sb_evergreen` is set to 1 when building `libcobalt.so`.
-
-The partner port of Starboard is built with the partner’s toolchain and is
-linked into the `loader_app` which knows how to dynamically load
-`libcobalt.so`, and the `crashpad_handler` which handles crashes.
-
-```
-$ cobalt/build/gn.py -p <partner_port_name> -c qa
-$ ninja -C out/<partner_port_name>_qa loader_app crashpad_handler
-```
-
-Partners should set `sb_evergreen_compatible` to 1 in their gyp platform config.
-DO NOT set the `sb_evergreen` to 1 in your platform-specific configuration as it
-is used only by Cobalt when building with the Google toolchain.
+This "native_target" toolchain is required in order to build the
+`crashpad_handler` binary, which should NOT use the Starboard porting layer.
 
 Additionally, partners should install crash handlers as instructed in the
 [Installing Crash Handlers for Cobalt guide](../crash_handlers.md).
@@ -135,7 +142,7 @@
 
 *   `kSbSystemPathStorageDirectory`
     *   Dedicated location for storing Cobalt Evergreen-related binaries
-    *   This path must be writable and have at least 96MB of reserved space for
+    *   This path must be writable and have at least 64MB of reserved space for
         Evergreen updates. Please see the “Platforms Requirements” section below
         for more details.
 *   `kSbMemoryMapProtectExec`
@@ -156,7 +163,36 @@
 If your target architecture falls outside the support list above, please reach
 out to us for guidance.
 
-#### Adding Crash Handlers to Evergreen
+#### Build commands
+
+As mentioned, the Google-maintained Evergreen toolchain is used to build Cobalt
+core (`libcobalt.so`). For example:
+
+```
+$ gn gen out/evergreen-arm-softfp_qa --args="target_platform=\"evergreen-arm-softfp\" build_type=\"qa\" target_cpu=\"arm\" target_os=\"linux\" sb_api_version=15"
+$ ninja -C out/evergreen-arm-softfp_qa cobalt_install
+```
+
+This produces a `libcobalt.so` shared library targeted for a specific
+architecture, ABI, and Starboard version.
+
+Note: `sb_api_version` defaults to the latest supported Starboard version in the
+current branch.
+
+
+The partner port of Starboard is built with the partner’s "target" toolchain and
+is linked into the `loader_app`, which knows how to dynamically load
+`libcobalt.so`. And the `crashpad_handler` binary is built with the partner's
+"native_target" toolchain. For example:
+
+```
+$ gn gen out/<partner_port_name>_qa --args='target_platform="<partner_port_name>" build_type="qa" sb_api_version=15'
+$ ninja -C out/<partner_port_name>_qa loader_app
+$ ninja -C out/<partner_port_name>_qa native_target/crashpad_handler
+```
+
+Note that when building `crashpad_handler`, a special prefix is used to have
+Ninja compile the target in the non-default, "native_target" toolchain.
 
 ### What is an example for how this would help me?
 
@@ -199,12 +235,12 @@
 
 *   V8
 
-Additional reserved storage (96MB) is required for Evergreen binaries. We expect
+Additional reserved storage (64MB) is required for Evergreen binaries. We expect
 Evergreen implementations to have an initial Cobalt preloaded on the device and
 an additional reserved space for additional Cobalt update storage.
 
 *   Initial Cobalt binary deployment - 64MB
-*   Additional Cobalt update storage - 96MB
+*   Additional Cobalt update storage - 64MB
     *   Required for 2 update slots under `kSbSystemPathStorageDirectory`
 
 As Cobalt Evergreen is intended to be updated from Google Cloud architecture
@@ -272,8 +308,8 @@
 
 1. Build the `crashpad_database_util` target and deploy it onto the device.
 ```
-$ cobalt/build/gn.py -p <partner_port_name> -c qa
-$ ninja -C out/<partner_port_name>_qa crashpad_database_util
+$ gn gen out/<partner_port_name>_qa --args='target_platform="<partner_port_name>" build_type="qa"'
+$ ninja -C out/<partner_port_name>_qa native_target/crashpad_database_util
 ```
 2. Remove the existing state for crashpad as it throttles uploads to 1 per hour:
 ```
diff --git a/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md b/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md
index 549fe70..b9c3d45 100644
--- a/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md
+++ b/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md
@@ -1,14 +1,12 @@
----
-layout: doc
-title: "Cobalt Evergreen Raspi-2 Reference Port"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt Evergreen Raspi-2 Reference Port
 
 ## Requirements
 
-*   Raspberry Pi 2 (image configured per
-    [instructions](https://cobalt.dev/development/setup-raspi.html) on
-    cobalt.dev)
+*   Raspberry Pi environment setup per
+    [instructions](https://developers.google.com/youtube/cobalt/docs/development/setup-raspi).
 
 ## Build instructions
 
diff --git a/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_update_framework.md b/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_update_framework.md
index f1b1cf8..bd27bce 100644
--- a/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_update_framework.md
+++ b/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_update_framework.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Cobalt Update Framework"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Cobalt Update Framework
 
 ## Background
diff --git a/cobalt/site/docs/gen/starboard/doc/evergreen/evergreen_binary_compression.md b/cobalt/site/docs/gen/starboard/doc/evergreen/evergreen_binary_compression.md
index 3d37997..568eb8a 100644
--- a/cobalt/site/docs/gen/starboard/doc/evergreen/evergreen_binary_compression.md
+++ b/cobalt/site/docs/gen/starboard/doc/evergreen/evergreen_binary_compression.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Evergreen Binary Compression"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Evergreen Binary Compression
 
 ## What is Evergreen Binary Compression?
diff --git a/cobalt/site/docs/gen/starboard/doc/evergreen/symbolizing_minidumps.md b/cobalt/site/docs/gen/starboard/doc/evergreen/symbolizing_minidumps.md
index df7a502..08e8d39 100644
--- a/cobalt/site/docs/gen/starboard/doc/evergreen/symbolizing_minidumps.md
+++ b/cobalt/site/docs/gen/starboard/doc/evergreen/symbolizing_minidumps.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "How to Symbolize Dumps"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # How to Symbolize Dumps
 
 Evergreen will store the minidumps (`.dmp` files) from the 2 most recent
diff --git a/cobalt/site/docs/gen/starboard/doc/howto_decode_to_texture.md b/cobalt/site/docs/gen/starboard/doc/howto_decode_to_texture.md
index b15eb5e..fd6bbd5 100644
--- a/cobalt/site/docs/gen/starboard/doc/howto_decode_to_texture.md
+++ b/cobalt/site/docs/gen/starboard/doc/howto_decode_to_texture.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "**HOWTO:** Decode to Texture"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # **HOWTO:** Decode to Texture
 
 Starboard declares the interfaces necessary to allow applications to query for
diff --git a/cobalt/site/docs/gen/starboard/doc/principles.md b/cobalt/site/docs/gen/starboard/doc/principles.md
index 04e039c..3c96a19 100644
--- a/cobalt/site/docs/gen/starboard/doc/principles.md
+++ b/cobalt/site/docs/gen/starboard/doc/principles.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Starboard Design Principles"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Starboard Design Principles
 
 An overview of the goals and design principles of Starboard with the perspective
diff --git a/cobalt/site/docs/gen/starboard/doc/starboard_abi.md b/cobalt/site/docs/gen/starboard/doc/starboard_abi.md
index 9272001..6d99001 100644
--- a/cobalt/site/docs/gen/starboard/doc/starboard_abi.md
+++ b/cobalt/site/docs/gen/starboard/doc/starboard_abi.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Starboard ABI"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Starboard ABI
 
 The Starboard ABI was introduced to provide a single, consistent method for
diff --git a/cobalt/site/docs/gen/starboard/doc/starboard_split.md b/cobalt/site/docs/gen/starboard/doc/starboard_split.md
index 6eeaf95..b5f6720 100644
--- a/cobalt/site/docs/gen/starboard/doc/starboard_split.md
+++ b/cobalt/site/docs/gen/starboard/doc/starboard_split.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Separation of Starboard from Cobalt"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Separation of Starboard from Cobalt
 
 ### Background
diff --git a/cobalt/site/docs/gen/starboard/doc/style.md b/cobalt/site/docs/gen/starboard/doc/style.md
index c837ed1..6c0358b 100644
--- a/cobalt/site/docs/gen/starboard/doc/style.md
+++ b/cobalt/site/docs/gen/starboard/doc/style.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Starboard C and C++ Style Guide"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Starboard C and C++ Style Guide
 
 A description of the coding conventions for Starboard code and API headers.
diff --git a/cobalt/site/docs/gen/starboard/doc/versioning.md b/cobalt/site/docs/gen/starboard/doc/versioning.md
index c3e07f1..b33e73b 100644
--- a/cobalt/site/docs/gen/starboard/doc/versioning.md
+++ b/cobalt/site/docs/gen/starboard/doc/versioning.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Starboard Versioning"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Starboard Versioning
 
 ## Motivation
diff --git a/cobalt/site/docs/gen/starboard/tools/doc/abstract_launcher.md b/cobalt/site/docs/gen/starboard/tools/doc/abstract_launcher.md
index d75ba45..c156602 100644
--- a/cobalt/site/docs/gen/starboard/tools/doc/abstract_launcher.md
+++ b/cobalt/site/docs/gen/starboard/tools/doc/abstract_launcher.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "App Launchers"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # App Launchers
 
 The app launcher framework is used to run an executable on a given platform,
diff --git a/cobalt/site/docs/gen/starboard/tools/doc/testing.md b/cobalt/site/docs/gen/starboard/tools/doc/testing.md
index 12d372b..6a74af5 100644
--- a/cobalt/site/docs/gen/starboard/tools/doc/testing.md
+++ b/cobalt/site/docs/gen/starboard/tools/doc/testing.md
@@ -1,7 +1,6 @@
----
-layout: doc
-title: "Test Runner Documentation"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
 # Test Runner Documentation
 
 The scripts in this folder comprise a cross-platform unit test runner. The
diff --git a/cobalt/site/docs/index.md b/cobalt/site/docs/index.md
deleted file mode 100644
index 6a981fc..0000000
--- a/cobalt/site/docs/index.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-layout: home
----
-
-<div class="row">
-  <div class="col-md-4">
-    <h2><i class="material-icons">sd_card</i>&nbsp;Efficient</h2>
-    <p class="desc">Cobalt's small binary is optimized for memory, reducing the likelihood of out-of-memory crashes.</p>
-  </div>
-  <div class="col-md-4">
-    <h2><i class="material-icons">security</i>&nbsp;Secure</h2>
-    <p class="desc">Cobalt ensures strong security by requiring use of HTTPS and CSP.</p>
-  </div>
-  <div class="col-md-4">
-    <h2><i class="material-icons">devices_other</i>&nbsp;Cross-platform</h2>
-    <p class="desc">Cobalt's targeted, streamlined porting process supports a wide range of platforms and device types.</p>
-  </div>
-</div>
diff --git a/cobalt/site/docs/overview.md b/cobalt/site/docs/overview.md
index 2f02f5c..fcb2349 100644
--- a/cobalt/site/docs/overview.md
+++ b/cobalt/site/docs/overview.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Getting started"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Getting started
 
 Cobalt is a lightweight HTML5/CSS/JS application container that is designed
 to provide a rich application development environment with minimal resource
@@ -69,20 +69,20 @@
 
 ### Porters
 
-Porters should begin with the [porting guide](/starboard/porting.html),
+Porters should begin with the [porting guide](starboard/porting.md),
 which explains how to use Starboard, Cobalt's porting layer, to customize the
 platform-specific functionality that Cobalt uses. There are several reference
 documents to help porters customize configuration files and to implement
 module-specific functionality. The [Testing with
-NPLB](/starboard/testing.html) document provides an overview of
+NPLB](starboard/testing.md) document provides an overview of
 Starboard's compliance test suite.
 
 ### Developers
 
 Developers can follow the setup instructions for
-[Linux](/development/setup-linux.html) or
-[RasPi](/development/setup-raspi.html) to set up their Cobalt development
+[Linux](development/setup-linux.md) or
+[RasPi](development/setup-raspi.md) to set up their Cobalt development
 environment, clone a copy of the Cobalt code repository, and build a Cobalt
-binary. The [Cobalt support](/development/reference/supported-features.html)
+binary. The [Cobalt support](development/reference/supported-features.md)
 guide lists the HTML elements, CSS properties, CSS selectors, and JavaScript Web
 APIs that developers can use in their Cobalt applications.
diff --git a/cobalt/site/docs/reference/starboard/configuration-public.md b/cobalt/site/docs/reference/starboard/configuration-public.md
index 44659a2..cf083d9 100644
--- a/cobalt/site/docs/reference/starboard/configuration-public.md
+++ b/cobalt/site/docs/reference/starboard/configuration-public.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Configuration Reference Guide"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Configuration Reference Guide
 
 ## Architecture Configuration
 
diff --git a/cobalt/site/docs/reference/starboard/gn-configuration.md b/cobalt/site/docs/reference/starboard/gn-configuration.md
index 18db1ee..7675560 100644
--- a/cobalt/site/docs/reference/starboard/gn-configuration.md
+++ b/cobalt/site/docs/reference/starboard/gn-configuration.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard: configuration.gni Reference Guide"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard: configuration.gni Reference Guide
 
 | Variables |
 | :--- |
@@ -25,7 +25,7 @@
 | **`path_to_nasm`**<br><br> Where yasm can be found on the host device.<br><br>The default value is `"nasm"`. |
 | **`platform_tests_path`**<br><br> Set to the starboard_platform_tests target if the platform implements them.<br><br>The default value is `""`. |
 | **`sabi_path`**<br><br> Where the Starboard ABI file for this platform can be found.<br><br>The default value is `"starboard/sabi/default/sabi.json"`. |
-| **`sb_api_version`**<br><br> The Starboard API version of the current build configuration. The default value is meant to be overridden by a Starboard ABI file.<br><br>The default value is `16`. |
+| **`sb_api_version`**<br><br> The Starboard API version of the current build configuration. The default value is meant to be overridden by a Starboard ABI file.<br><br>The default value is `15`. |
 | **`sb_enable_benchmark`**<br><br> Used to enable benchmarks.<br><br>The default value is `false`. |
 | **`sb_enable_cpp17_audit`**<br><br> Enables an NPLB audit of C++17 support.<br><br>The default value is `true`. |
 | **`sb_enable_lib`**<br><br> Enables embedding Cobalt as a shared library within another app. This requires a 'lib' starboard implementation for the corresponding platform.<br><br>The default value is `false`. |
@@ -33,6 +33,7 @@
 | **`sb_evergreen_compatible_package`**<br><br> Whether to generate the whole package containing both Loader app and Cobalt core on the Evergreen compatible platform.<br><br>The default value is `false`. |
 | **`sb_evergreen_compatible_use_libunwind`**<br><br> Whether to use the libunwind library on Evergreen compatible platform.<br><br>The default value is `false`. |
 | **`sb_filter_based_player`**<br><br> Used to indicate that the player is filter based.<br><br>The default value is `true`. |
+| **`sb_has_unused_symbol_issue`**<br><br> Set this to true if the modular toolchain linker doesn't strip all unused symbols and nplb fails to link.<br><br>The default value is `false`. |
 | **`sb_is_evergreen`**<br><br> Whether this is an Evergreen build.<br><br>The default value is `false`. |
 | **`sb_is_evergreen_compatible`**<br><br> Whether this is an Evergreen compatible platform. A compatible platform can run the elf_loader and launch the Evergreen build.<br><br>The default value is `false`. |
 | **`sb_libevent_method`**<br><br> The event polling mechanism available on this platform to support libevent. Platforms may redefine to 'poll' if necessary. Other mechanisms, e.g. devpoll, kqueue, select, are not yet supported.<br><br>The default value is `"epoll"`. |
diff --git a/cobalt/site/docs/reference/starboard/modules/13/accessibility.md b/cobalt/site/docs/reference/starboard/modules/13/accessibility.md
index a6c8460..8f2a652 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/accessibility.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/accessibility.md
@@ -1,17 +1,17 @@
----
-layout: doc
-title: "Starboard Module Reference: accessibility.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `accessibility.h`
 
 Provides access to the system options and settings related to accessibility.
 
-## Enums ##
+## Enums
 
-### SbAccessibilityCaptionCharacterEdgeStyle ###
+### SbAccessibilityCaptionCharacterEdgeStyle
 
 Enum for possible closed captioning character edge styles.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionCharacterEdgeStyleNone`
 *   `kSbAccessibilityCaptionCharacterEdgeStyleRaised`
@@ -19,11 +19,11 @@
 *   `kSbAccessibilityCaptionCharacterEdgeStyleUniform`
 *   `kSbAccessibilityCaptionCharacterEdgeStyleDropShadow`
 
-### SbAccessibilityCaptionColor ###
+### SbAccessibilityCaptionColor
 
 Enum for possible closed captioning colors.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionColorBlue`
 *   `kSbAccessibilityCaptionColorBlack`
@@ -34,11 +34,11 @@
 *   `kSbAccessibilityCaptionColorWhite`
 *   `kSbAccessibilityCaptionColorYellow`
 
-### SbAccessibilityCaptionFontFamily ###
+### SbAccessibilityCaptionFontFamily
 
 Enum for possible closed captioning font families
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionFontFamilyCasual`
 *   `kSbAccessibilityCaptionFontFamilyCursive`
@@ -48,11 +48,11 @@
 *   `kSbAccessibilityCaptionFontFamilyProportionalSerif`
 *   `kSbAccessibilityCaptionFontFamilySmallCapitals`
 
-### SbAccessibilityCaptionFontSizePercentage ###
+### SbAccessibilityCaptionFontSizePercentage
 
 Enum for possible closed captioning font size percentages.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionFontSizePercentage25`
 *   `kSbAccessibilityCaptionFontSizePercentage50`
@@ -67,11 +67,11 @@
 *   `kSbAccessibilityCaptionFontSizePercentage275`
 *   `kSbAccessibilityCaptionFontSizePercentage300`
 
-### SbAccessibilityCaptionOpacityPercentage ###
+### SbAccessibilityCaptionOpacityPercentage
 
 Enum for possible closed captioning opacity percentages.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionOpacityPercentage0`
 *   `kSbAccessibilityCaptionOpacityPercentage25`
@@ -79,11 +79,11 @@
 *   `kSbAccessibilityCaptionOpacityPercentage75`
 *   `kSbAccessibilityCaptionOpacityPercentage100`
 
-### SbAccessibilityCaptionState ###
+### SbAccessibilityCaptionState
 
 Enum for possible states of closed captioning properties.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionStateUnsupported`
 
@@ -115,14 +115,14 @@
     SbAccessibilityCaptionSettings.supportsOverride contains false, then no
     fields of SbAccessibilityCaptionSettings will ever contain this value.
 
-## Structs ##
+## Structs
 
-### SbAccessibilityCaptionSettings ###
+### SbAccessibilityCaptionSettings
 
 A group of settings related to system-level closed captioning settings, for
 platforms that expose closed captioning settings.
 
-#### Members ####
+#### Members
 
 *   `SbAccessibilityCaptionColor background_color`
 *   `SbAccessibilityCaptionState background_color_state`
@@ -166,9 +166,9 @@
     false, the values of `SbAccessibilityCaptionState` should be interpreted
     differently.
 
-### SbAccessibilityDisplaySettings ###
+### SbAccessibilityDisplaySettings
 
-#### Members ####
+#### Members
 
 *   `bool has_high_contrast_text_setting`
 
@@ -177,12 +177,12 @@
 
     Whether the high contrast text setting is enabled or not.
 
-### SbAccessibilityTextToSpeechSettings ###
+### SbAccessibilityTextToSpeechSettings
 
 A group of settings related to text-to-speech functionality, for platforms that
 expose system settings for text-to-speech.
 
-#### Members ####
+#### Members
 
 *   `bool has_text_to_speech_setting`
 
@@ -192,9 +192,9 @@
     Whether the text-to-speech setting is enabled or not. This setting is only
     valid if `has_text_to_speech_setting` is set to true.
 
-## Functions ##
+## Functions
 
-### SbAccessibilityGetCaptionSettings ###
+### SbAccessibilityGetCaptionSettings
 
 Get the platform's settings for system-level closed captions. This function
 returns false if `caption_settings` is NULL or if it is not zero-initialized.
@@ -202,13 +202,13 @@
 `caption_settings`: A pointer to a zero-initialized
 SbAccessibilityTextToSpeechSettings struct.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilityGetCaptionSettings(SbAccessibilityCaptionSettings *caption_settings)
 ```
 
-### SbAccessibilityGetDisplaySettings ###
+### SbAccessibilityGetDisplaySettings
 
 Get the platform settings related to high contrast text. This function returns
 false if `out_settings` is NULL or if it is not zero-initialized.
@@ -216,13 +216,13 @@
 `out_settings`: A pointer to a zero-initialized SbAccessibilityDisplaySettings*
 struct.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilityGetDisplaySettings(SbAccessibilityDisplaySettings *out_settings)
 ```
 
-### SbAccessibilityGetTextToSpeechSettings ###
+### SbAccessibilityGetTextToSpeechSettings
 
 Get the platform settings related to the text-to-speech accessibility feature.
 This function returns false if `out_settings` is NULL or if it is not zero-
@@ -231,13 +231,13 @@
 `out_settings`: A pointer to a zero-initialized
 SbAccessibilityTextToSpeechSettings struct.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilityGetTextToSpeechSettings(SbAccessibilityTextToSpeechSettings *out_settings)
 ```
 
-### SbAccessibilitySetCaptionsEnabled ###
+### SbAccessibilitySetCaptionsEnabled
 
 Modifies whether closed captions are enabled at a system level. This function
 returns false if this feature is not supported by the platform, or if changing
@@ -246,7 +246,7 @@
 `enabled`: A boolean indicating whether captions should be turned on (true) or
 off (false).
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilitySetCaptionsEnabled(bool enabled)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/atomic.md b/cobalt/site/docs/reference/starboard/modules/13/atomic.md
index 5f79990..9653e53 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/atomic.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/atomic.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: atomic.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `atomic.h`
 
 Defines a set of atomic integer operations that can be used as lightweight
 synchronization or as building blocks for heavier synchronization primitives.
@@ -9,32 +9,32 @@
 supported architectures, so their direct use is not recommended except when
 rigorously deemed absolutely necessary for performance reasons.
 
-## Typedefs ##
+## Typedefs
 
-### SbAtomic64 ###
+### SbAtomic64
 
 64-bit atomic operations (only available on 64-bit processors).
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int64_t SbAtomic64
 ```
 
-### SbAtomicPtr ###
+### SbAtomicPtr
 
 Pointer-sized atomic operations. Forwards to either 32-bit or 64-bit functions
 as appropriate.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbAtomic32 SbAtomicPtr
 ```
 
-## Functions ##
+## Functions
 
-### SbAtomicAcquire_CompareAndSwap ###
+### SbAtomicAcquire_CompareAndSwap
 
 These following lower-level operations are typically useful only to people
 implementing higher-level synchronization operations like spinlocks, mutexes,
@@ -45,23 +45,23 @@
 operation. "Barrier" operations have both "Acquire" and "Release" semantics. A
 SbAtomicMemoryBarrier() has "Barrier" semantics, but does no memory access.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicAcquire_CompareAndSwap(volatile SbAtomic32 *ptr, SbAtomic32 old_value, SbAtomic32 new_value)
 ```
 
-### SbAtomicBarrier_Increment ###
+### SbAtomicBarrier_Increment
 
 Same as SbAtomicNoBarrier_Increment, but with a memory barrier.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicBarrier_Increment(volatile SbAtomic32 *ptr, SbAtomic32 increment)
 ```
 
-### SbAtomicNoBarrier_CompareAndSwap ###
+### SbAtomicNoBarrier_CompareAndSwap
 
 Atomically execute: result = *ptr; if (*ptr == old_value) *ptr = new_value;
 return result;
@@ -71,39 +71,39 @@
 
 This routine implies no memory barriers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicNoBarrier_CompareAndSwap(volatile SbAtomic32 *ptr, SbAtomic32 old_value, SbAtomic32 new_value)
 ```
 
-### SbAtomicNoBarrier_Exchange ###
+### SbAtomicNoBarrier_Exchange
 
 Atomically store new_value into *ptr, returning the previous value held in *ptr.
 This routine implies no memory barriers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicNoBarrier_Exchange(volatile SbAtomic32 *ptr, SbAtomic32 new_value)
 ```
 
-### SbAtomicNoBarrier_Increment ###
+### SbAtomicNoBarrier_Increment
 
 Atomically increment *ptr by "increment". Returns the new value of *ptr with the
 increment applied. This routine implies no memory barriers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicNoBarrier_Increment(volatile SbAtomic32 *ptr, SbAtomic32 increment)
 ```
 
-### SbAtomicRelease_CompareAndSwap8 ###
+### SbAtomicRelease_CompareAndSwap8
 
 Overloaded functions for Atomic8.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic8 SbAtomicRelease_CompareAndSwap8(volatile SbAtomic8 *ptr, SbAtomic8 old_value, SbAtomic8 new_value)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/audio_sink.md b/cobalt/site/docs/reference/starboard/modules/13/audio_sink.md
index b0e652f..9277c70 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/audio_sink.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/audio_sink.md
@@ -1,53 +1,53 @@
----
-layout: doc
-title: "Starboard Module Reference: audio_sink.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `audio_sink.h`
 
 Provides an interface to output raw audio data.
 
-## Macros ##
+## Macros
 
-### kSbAudioSinkInvalid ###
+### kSbAudioSinkInvalid
 
 Well-defined value for an invalid audio sink.
 
-## Typedefs ##
+## Typedefs
 
-### SbAudioSink ###
+### SbAudioSink
 
 An opaque handle to an implementation-private structure representing an audio
 sink.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbAudioSinkPrivate* SbAudioSink
 ```
 
-### SbAudioSinkConsumeFramesFunc ###
+### SbAudioSinkConsumeFramesFunc
 
 Callback used to report frames consumed. The consumed frames will be removed
 from the source frame buffer to free space for new audio frames.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbAudioSinkConsumeFramesFunc) (int frames_consumed, void *context)
 ```
 
-### SbAudioSinkFrameBuffers ###
+### SbAudioSinkFrameBuffers
 
 An array of frame buffers. For interleaved audio streams, there will be only one
 element in the array. For planar audio streams, the number of elements in the
 array equal to the number of channels.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void** SbAudioSinkFrameBuffers
 ```
 
-### SbAudioSinkUpdateSourceStatusFunc ###
+### SbAudioSinkUpdateSourceStatusFunc
 
 Callback being called periodically to retrieve the status of the audio source.
 The first two output parameters indicating the filling level of the audio frame
@@ -64,15 +64,15 @@
 NULL. Note that this function only reports the status of the source, it doesn't
 remove audio data from the source frame buffer.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbAudioSinkUpdateSourceStatusFunc) (int *frames_in_buffer, int *offset_in_frames, bool *is_playing, bool *is_eos_reached, void *context)
 ```
 
-## Functions ##
+## Functions
 
-### SbAudioSinkCreate ###
+### SbAudioSinkCreate
 
 Creates an audio sink for the specified `channels` and `sampling_frequency_hz`,
 acquires all resources needed to operate the audio sink, and returns an opaque
@@ -113,13 +113,13 @@
     value that is passed back to all callbacks and is generally used to point at
     a class or struct that contains state associated with the audio sink.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbAudioSink SbAudioSinkCreate(int channels, int sampling_frequency_hz, SbMediaAudioSampleType audio_sample_type, SbMediaAudioFrameStorageType audio_frame_storage_type, SbAudioSinkFrameBuffers frame_buffers, int frames_per_channel, SbAudioSinkUpdateSourceStatusFunc update_source_status_func, SbAudioSinkConsumeFramesFunc consume_frames_func, void *context)
 ```
 
-### SbAudioSinkDestroy ###
+### SbAudioSinkDestroy
 
 Destroys `audio_sink`, freeing all associated resources. Before returning, the
 function waits until all callbacks that are in progress have finished. After the
@@ -132,24 +132,24 @@
 
 `audio_sink`: The audio sink to destroy.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbAudioSinkDestroy(SbAudioSink audio_sink)
 ```
 
-### SbAudioSinkGetMaxChannels ###
+### SbAudioSinkGetMaxChannels
 
 Returns the maximum number of channels supported on the platform. For example,
 the number would be `2` if the platform only supports stereo.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbAudioSinkGetMaxChannels()
 ```
 
-### SbAudioSinkGetMinBufferSizeInFrames ###
+### SbAudioSinkGetMinBufferSizeInFrames
 
 Returns the minimum frames required by audio sink to play without underflows.
 Returns -1, if `channels`, `sample_type` or `sampling_frequency_hz` is not
@@ -162,52 +162,52 @@
 audio data being streamed. For example, 22,000 Hz means 22,000 sample elements
 represents one second of audio data.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbAudioSinkGetMinBufferSizeInFrames(int channels, SbMediaAudioSampleType sample_type, int sampling_frequency_hz)
 ```
 
-### SbAudioSinkGetNearestSupportedSampleFrequency ###
+### SbAudioSinkGetNearestSupportedSampleFrequency
 
 Returns the supported sample rate closest to `sampling_frequency_hz`. On
 platforms that don't support all sample rates, it is the caller's responsibility
 to resample the audio frames into the supported sample rate returned by this
 function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbAudioSinkGetNearestSupportedSampleFrequency(int sampling_frequency_hz)
 ```
 
-### SbAudioSinkIsAudioFrameStorageTypeSupported ###
+### SbAudioSinkIsAudioFrameStorageTypeSupported
 
 Indicates whether `audio_frame_storage_type` is supported on this platform.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAudioSinkIsAudioFrameStorageTypeSupported(SbMediaAudioFrameStorageType audio_frame_storage_type)
 ```
 
-### SbAudioSinkIsAudioSampleTypeSupported ###
+### SbAudioSinkIsAudioSampleTypeSupported
 
 Indicates whether `audio_sample_type` is supported on this platform.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAudioSinkIsAudioSampleTypeSupported(SbMediaAudioSampleType audio_sample_type)
 ```
 
-### SbAudioSinkIsValid ###
+### SbAudioSinkIsValid
 
 Indicates whether the given audio sink handle is valid.
 
 `audio_sink`: The audio sink handle to check.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAudioSinkIsValid(SbAudioSink audio_sink)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/byte_swap.md b/cobalt/site/docs/reference/starboard/modules/13/byte_swap.md
index 580bc5d..4b2cab30 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/byte_swap.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/byte_swap.md
@@ -1,74 +1,74 @@
----
-layout: doc
-title: "Starboard Module Reference: byte_swap.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `byte_swap.h`
 
 Specifies functions for swapping byte order. These functions are used to deal
 with endianness when performing I/O.
 
-## Functions ##
+## Functions
 
-### SbByteSwapS16 ###
+### SbByteSwapS16
 
 Unconditionally swaps the byte order in signed 16-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int16_t SbByteSwapS16(int16_t value)
 ```
 
-### SbByteSwapS32 ###
+### SbByteSwapS32
 
 Unconditionally swaps the byte order in signed 32-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int32_t SbByteSwapS32(int32_t value)
 ```
 
-### SbByteSwapS64 ###
+### SbByteSwapS64
 
 Unconditionally swaps the byte order in signed 64-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbByteSwapS64(int64_t value)
 ```
 
-### SbByteSwapU16 ###
+### SbByteSwapU16
 
 Unconditionally swaps the byte order in unsigned 16-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint16_t SbByteSwapU16(uint16_t value)
 ```
 
-### SbByteSwapU32 ###
+### SbByteSwapU32
 
 Unconditionally swaps the byte order in unsigned 32-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint32_t SbByteSwapU32(uint32_t value)
 ```
 
-### SbByteSwapU64 ###
+### SbByteSwapU64
 
 Unconditionally swaps the byte order in unsigned 64-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint64_t SbByteSwapU64(uint64_t value)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/condition_variable.md b/cobalt/site/docs/reference/starboard/modules/13/condition_variable.md
index 836c4b8..a665a24 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/condition_variable.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/condition_variable.md
@@ -1,23 +1,23 @@
----
-layout: doc
-title: "Starboard Module Reference: condition_variable.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `condition_variable.h`
 
 Defines an interface for condition variables.
 
-## Macros ##
+## Macros
 
-### SB_CONDITION_VARIABLE_MAX_SIZE ###
+### SB_CONDITION_VARIABLE_MAX_SIZE
 
 Max size of the SbConditionVariable type.
 
-## Enums ##
+## Enums
 
-### SbConditionVariableResult ###
+### SbConditionVariableResult
 
 Enumeration of possible results from waiting on a condvar.
 
-#### Values ####
+#### Values
 
 *   `kSbConditionVariableSignaled`
 
@@ -30,22 +30,22 @@
     The wait failed, either because a parameter wasn't valid, or the condition
     variable has already been destroyed, or something similar.
 
-## Typedefs ##
+## Typedefs
 
-### SbConditionVariable ###
+### SbConditionVariable
 
 An opaque handle to a condition variable type with reserved memory buffer of
 size SB_CONDITION_VARIABLE_MAX_SIZE and aligned at void pointer type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef union SbConditionVariable  SbConditionVariable
 ```
 
-## Functions ##
+## Functions
 
-### SbConditionVariableBroadcast ###
+### SbConditionVariableBroadcast
 
 Broadcasts to all current waiters of `condition` to stop waiting. This function
 wakes all of the threads waiting on `condition` while SbConditionVariableSignal
@@ -53,26 +53,26 @@
 
 `condition`: The condition that should no longer be waited for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableBroadcast(SbConditionVariable *condition)
 ```
 
-### SbConditionVariableCreate ###
+### SbConditionVariableCreate
 
 Creates a new condition variable to work with `opt_mutex`, which may be null,
 placing the newly created condition variable in `out_condition`.
 
 The return value indicates whether the condition variable could be created.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableCreate(SbConditionVariable *out_condition, SbMutex *opt_mutex)
 ```
 
-### SbConditionVariableDestroy ###
+### SbConditionVariableDestroy
 
 Destroys the specified SbConditionVariable . The return value indicates whether
 the destruction was successful. The behavior is undefined if other threads are
@@ -81,23 +81,23 @@
 `condition`: The SbConditionVariable to be destroyed. This invalidates the
 condition variable.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableDestroy(SbConditionVariable *condition)
 ```
 
-### SbConditionVariableIsSignaled ###
+### SbConditionVariableIsSignaled
 
 Returns whether the given result is a success.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbConditionVariableIsSignaled(SbConditionVariableResult result)
 ```
 
-### SbConditionVariableSignal ###
+### SbConditionVariableSignal
 
 Signals the next waiter of `condition` to stop waiting. This function wakes a
 single thread waiting on `condition` while SbConditionVariableBroadcast wakes
@@ -105,24 +105,24 @@
 
 `condition`: The condition that the waiter should stop waiting for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableSignal(SbConditionVariable *condition)
 ```
 
-### SbConditionVariableWait ###
+### SbConditionVariableWait
 
 Waits for `condition`, releasing the held lock `mutex`, blocking indefinitely,
 and returning the result. Behavior is undefined if `mutex` is not held.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbConditionVariableResult SbConditionVariableWait(SbConditionVariable *condition, SbMutex *mutex)
 ```
 
-### SbConditionVariableWaitTimed ###
+### SbConditionVariableWaitTimed
 
 Waits for `condition`, releasing the held lock `mutex`, blocking up to
 `timeout_duration`, and returning the acquisition result. Behavior is undefined
@@ -133,7 +133,7 @@
 function returns as quickly as possible with a kSbConditionVariableTimedOut
 result.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbConditionVariableResult SbConditionVariableWaitTimed(SbConditionVariable *condition, SbMutex *mutex, SbTime timeout_duration)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/configuration.md b/cobalt/site/docs/reference/starboard/modules/13/configuration.md
index 630f1cf..d0ba3c7 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/configuration.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/configuration.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: configuration.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `configuration.h`
 
 Provides a description of the current platform in lurid detail so that common
 code never needs to actually know what the current operating system and
@@ -13,117 +13,117 @@
 narrowly-defined configuration features, but it retains porting control in
 Starboard.
 
-## Macros ##
+## Macros
 
-### SB_ALIGNAS(byte_alignment) ###
+### SB_ALIGNAS(byte_alignment)
 
 Specifies the alignment for a class, struct, union, enum, class/struct field, or
 stack variable.
 
-### SB_ALIGNOF(type) ###
+### SB_ALIGNOF(type)
 
 Returns the alignment required for any instance of the type indicated by `type`.
 
-### SB_ARRAY_SIZE(array) ###
+### SB_ARRAY_SIZE(array)
 
 A constant expression that evaluates to the size_t size of a statically-sized
 array.
 
-### SB_ARRAY_SIZE_INT(array) ###
+### SB_ARRAY_SIZE_INT(array)
 
 A constant expression that evaluates to the int size of a statically-sized
 array.
 
-### SB_CAN(SB_FEATURE) ###
+### SB_CAN(SB_FEATURE)
 
 Determines a compile-time capability of the system.
 
-### SB_COMPILE_ASSERT(expr, msg) ###
+### SB_COMPILE_ASSERT(expr, msg)
 
 Will cause a compiler error with `msg` if `expr` is false. `msg` must be a valid
 identifier, and must be a unique type in the scope of the declaration.
 
-### SB_DEPRECATED(FUNC) ###
+### SB_DEPRECATED(FUNC)
 
 SB_DEPRECATED(int Foo(int bar)); Annotates the function as deprecated, which
 will trigger a compiler warning when referenced.
 
-### SB_DEPRECATED_EXTERNAL(FUNC) ###
+### SB_DEPRECATED_EXTERNAL(FUNC)
 
 SB_DEPRECATED_EXTERNAL(...) annotates the function as deprecated for external
 clients, but not deprecated for starboard.
 
-### SB_EXPERIMENTAL_API_VERSION ###
+### SB_EXPERIMENTAL_API_VERSION
 
 The API version that is currently open for changes, and therefore is not stable
 or frozen. Production-oriented ports should avoid declaring that they implement
 the experimental Starboard API version.
 
-### SB_FUNCTION ###
+### SB_FUNCTION
 
 Whether we use **PRETTY_FUNCTION** PRETTY_FUNCTION or **FUNCTION** FUNCTION for
 logging.
 
-### SB_HAS(SB_FEATURE) ###
+### SB_HAS(SB_FEATURE)
 
 Determines at compile-time whether this platform has a standard feature or
 header available.
 
-### SB_HAS_64_BIT_ATOMICS ###
+### SB_HAS_64_BIT_ATOMICS
 
 Whether the current platform has 64-bit atomic operations.
 
-### SB_HAS_GLES2 ###
+### SB_HAS_GLES2
 
 Specifies whether this platform has a performant OpenGL ES 2 implementation,
 which allows client applications to use GL rendering paths. Derived from the gyp
 variable `gl_type` gl_type which indicates what kind of GL implementation is
 available.
 
-### SB_HAS_QUIRK(SB_FEATURE) ###
+### SB_HAS_QUIRK(SB_FEATURE)
 
 Determines at compile-time whether this platform has a quirk.
 
-### SB_INT64_C(x) ###
+### SB_INT64_C(x)
 
 Declare numeric literals of signed 64-bit type.
 
-### SB_IS(SB_FEATURE) ###
+### SB_IS(SB_FEATURE)
 
 Determines at compile-time an inherent aspect of this platform.
 
-### SB_LIKELY(x) ###
+### SB_LIKELY(x)
 
 Macro for hinting that an expression is likely to be true.
 
-### SB_MAXIMUM_API_VERSION ###
+### SB_MAXIMUM_API_VERSION
 
 The maximum API version allowed by this version of the Starboard headers,
 inclusive.
 
-### SB_MINIMUM_API_VERSION ###
+### SB_MINIMUM_API_VERSION
 
 The minimum API version allowed by this version of the Starboard headers,
 inclusive.
 
-### SB_NORETURN ###
+### SB_NORETURN
 
 Macro to annotate a function as noreturn, which signals to the compiler that the
 function cannot return.
 
-### SB_OVERRIDE ###
+### SB_OVERRIDE
 
 Declares a function as overriding a virtual function on compilers that support
 it.
 
-### SB_PREFERRED_RGBA_BYTE_ORDER_RGBA ###
+### SB_PREFERRED_RGBA_BYTE_ORDER_RGBA
 
 An enumeration of values for the kSbPreferredByteOrder configuration variable.
 Setting this up properly means avoiding slow color swizzles when passing pixel
 data from one library to another. Note that these definitions are in byte-order
 and so are endianness-independent.
 
-### SB_PRINTF_FORMAT(format_param, dots_param) ###
+### SB_PRINTF_FORMAT(format_param, dots_param)
 
 Tells the compiler a function is using a printf-style format string.
 `format_param` is the one-based index of the format string parameter;
@@ -132,7 +132,7 @@
 but matches what the system C headers do.) (Partially taken from
 base/compiler_specific.h)
 
-### SB_RESTRICT ###
+### SB_RESTRICT
 
 Include the platform-specific configuration. This macro is set by GN in
 starboard/build/config/BUILD.gn and passed in on the command line for all
@@ -140,29 +140,29 @@
 that the compiler can make certain optimizations because it knows the pointers
 are unique.
 
-### SB_SIZE_OF(DATATYPE) ###
+### SB_SIZE_OF(DATATYPE)
 
 Determines at compile-time the size of a data type, or 0 if the data type that
 was specified was invalid.
 
-### SB_STRINGIFY(x) ###
+### SB_STRINGIFY(x)
 
 Standard CPP trick to stringify an evaluated macro definition.
 
-### SB_UINT64_C(x) ###
+### SB_UINT64_C(x)
 
 Declare numeric literals of unsigned 64-bit type.
 
-### SB_UNLIKELY(x) ###
+### SB_UNLIKELY(x)
 
 Macro for hinting that an expression is likely to be false.
 
-### SB_UNREFERENCED_PARAMETER(x) ###
+### SB_UNREFERENCED_PARAMETER(x)
 
 Trivially references a parameter that is otherwise unreferenced, preventing a
 compiler warning on some platforms.
 
-### SB_WARN_UNUSED_RESULT ###
+### SB_WARN_UNUSED_RESULT
 
 Causes the annotated (at the end) function to generate a warning if the result
 is not accessed.
diff --git a/cobalt/site/docs/reference/starboard/modules/13/configuration_constants.md b/cobalt/site/docs/reference/starboard/modules/13/configuration_constants.md
index b380f62..012754b 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/configuration_constants.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/configuration_constants.md
@@ -1,113 +1,113 @@
----
-layout: doc
-title: "Starboard Module Reference: configuration_constants.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `configuration_constants.h`
 
 Declares all configuration variables we will need to use at runtime. These
 variables describe the current platform in detail to allow cobalt to make
 runtime decisions based on per platform configurations.
 
-## Variables ##
+## Variables
 
-### kSbDefaultMmapThreshold ###
+### kSbDefaultMmapThreshold
 
 Determines the threshold of allocation size that should be done with mmap (if
 available), rather than allocated within the core heap.
 
-### kSbFileAltSepChar ###
+### kSbFileAltSepChar
 
 The current platform's alternate file path component separator character. This
 is like SB_FILE_SEP_CHAR, except if your platform supports an alternate
 character, then you can place that here. For example, on windows machines, the
 primary separator character is probably '\', but the alternate is '/'.
 
-### kSbFileAltSepString ###
+### kSbFileAltSepString
 
 The string form of SB_FILE_ALT_SEP_CHAR.
 
-### kSbFileMaxName ###
+### kSbFileMaxName
 
 The current platform's maximum length of the name of a single directory entry,
 not including the absolute path.
 
-### kSbFileMaxOpen ###
+### kSbFileMaxOpen
 
 The current platform's maximum number of files that can be opened at the same
 time by one process.
 
-### kSbFileMaxPath ###
+### kSbFileMaxPath
 
 The current platform's maximum length of an absolute path.
 
-### kSbFileSepChar ###
+### kSbFileSepChar
 
 The current platform's file path component separator character. This is the
 character that appears after a directory in a file path. For example, the
 absolute canonical path of the file "/path/to/a/file.txt" uses '/' as a path
 component separator character.
 
-### kSbFileSepString ###
+### kSbFileSepString
 
 The string form of SB_FILE_SEP_CHAR.
 
-### kSbHasAc3Audio ###
+### kSbHasAc3Audio
 
 Allow ac3 and ec3 support
 
-### kSbHasMediaWebmVp9Support ###
+### kSbHasMediaWebmVp9Support
 
 Specifies whether this platform has webm/vp9 support. This should be set to non-
 zero on platforms with webm/vp9 support.
 
-### kSbHasThreadPrioritySupport ###
+### kSbHasThreadPrioritySupport
 
 Whether the current platform supports thread priorities.
 
-### kSbMallocAlignment ###
+### kSbMallocAlignment
 
 Determines the alignment that allocations should have on this platform.
 
-### kSbMaxThreadLocalKeys ###
+### kSbMaxThreadLocalKeys
 
 The maximum number of thread local storage keys supported by this platform. This
 comes from _POSIX_THREAD_KEYS_MAX. The value of PTHREAD_KEYS_MAX is higher, but
 unit tests show that the implementation doesn't support nearly as many keys.
 
-### kSbMaxThreadNameLength ###
+### kSbMaxThreadNameLength
 
 The maximum length of the name for a thread, including the NULL-terminator.
 
-### kSbMaxThreads ###
+### kSbMaxThreads
 
 Defines the maximum number of simultaneous threads for this platform. Some
 platforms require sharing thread handles with other kinds of system handles,
 like mutexes, so we want to keep this manageable.
 
-### kSbMediaMaxAudioBitrateInBitsPerSecond ###
+### kSbMediaMaxAudioBitrateInBitsPerSecond
 
 The maximum audio bitrate the platform can decode. The following value equals to
 5M bytes per seconds which is more than enough for compressed audio.
 
-### kSbMediaMaxVideoBitrateInBitsPerSecond ###
+### kSbMediaMaxVideoBitrateInBitsPerSecond
 
 The maximum video bitrate the platform can decode. The following value equals to
 8M bytes per seconds which is more than enough for compressed video.
 
-### kSbMediaVideoFrameAlignment ###
+### kSbMediaVideoFrameAlignment
 
 Specifies how video frame buffers must be aligned on this platform.
 
-### kSbMemoryLogPath ###
+### kSbMemoryLogPath
 
 Defines the path where memory debugging logs should be written to.
 
-### kSbMemoryPageSize ###
+### kSbMemoryPageSize
 
 The memory page size, which controls the size of chunks on memory that
 allocators deal with, and the alignment of those chunks. This doesn't have to be
 the hardware-defined physical page size, but it should be a multiple of it.
 
-### kSbNetworkReceiveBufferSize ###
+### kSbNetworkReceiveBufferSize
 
 Specifies the network receive buffer size in bytes, set via
 SbSocketSetReceiveBufferSize().
@@ -122,7 +122,7 @@
 If your platform does not have a good TCP auto-tuning mechanism, a setting of
 (128 * 1024) here is recommended.
 
-### kSbPathSepChar ###
+### kSbPathSepChar
 
 The current platform's search path component separator character. When
 specifying an ordered list of absolute paths of directories to search for a
@@ -130,16 +130,16 @@
 the search path of "/etc/search/first:/etc/search/second" uses ':' as a search
 path component separator character.
 
-### kSbPathSepString ###
+### kSbPathSepString
 
 The string form of SB_PATH_SEP_CHAR.
 
-### kSbPreferredRgbaByteOrder ###
+### kSbPreferredRgbaByteOrder
 
 Specifies the preferred byte order of color channels in a pixel. Refer to
 starboard/configuration.h for the possible values. EGL/GLES platforms should
 generally prefer a byte order of RGBA, regardless of endianness.
 
-### kSbUserMaxSignedIn ###
+### kSbUserMaxSignedIn
 
 The maximum number of users that can be signed in at the same time.
diff --git a/cobalt/site/docs/reference/starboard/modules/13/cpu_features.md b/cobalt/site/docs/reference/starboard/modules/13/cpu_features.md
index ee12e71..e2aa35f 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/cpu_features.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/cpu_features.md
@@ -1,13 +1,13 @@
----
-layout: doc
-title: "Starboard Module Reference: cpu_features.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
 
-## Structs ##
+# Starboard Module Reference: `cpu_features.h`
 
-### SbCPUFeatures ###
+## Structs
 
-#### Members ####
+### SbCPUFeatures
+
+#### Members
 
 *   `SbCPUFeaturesArchitecture architecture`
 
@@ -54,9 +54,9 @@
     defined as a macro.
 *   `SbCPUFeaturesX86 x86`
 
-### SbCPUFeaturesARM ###
+### SbCPUFeaturesARM
 
-#### Members ####
+#### Members
 
 *   `int16_t implementer`
 
@@ -98,7 +98,7 @@
     SDIV and UDIV hardware division in ARM mode.
 *   `bool has_aes`
 
-    ###### Arm 64 feature flags  ######
+    ###### Arm 64 feature flags
 
     AES instructions.
 *   `bool has_crc32`
@@ -114,17 +114,17 @@
 
     64-bit PMULL and PMULL2 instructions.
 
-### SbCPUFeaturesMIPS ###
+### SbCPUFeaturesMIPS
 
-#### Members ####
+#### Members
 
 *   `bool has_msa`
 
     MIPS SIMD Architecture (MSA).
 
-### SbCPUFeaturesX86 ###
+### SbCPUFeaturesX86
 
-#### Members ####
+#### Members
 
 *   `const char * vendor`
 
@@ -244,9 +244,9 @@
 
     SAHF in long mode.
 
-## Functions ##
+## Functions
 
-### SbCPUFeaturesGet ###
+### SbCPUFeaturesGet
 
 Retrieve the underlying CPU features and place it in `features`, which must not
 be NULL.
@@ -254,9 +254,8 @@
 If this function returns false, it means the CPU architecture is unknown and all
 fields in `features` are invalid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbCPUFeaturesGet(SbCPUFeatures *features)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/decode_target.md b/cobalt/site/docs/reference/starboard/modules/13/decode_target.md
index 23ed59d..d1ebd71 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/decode_target.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/decode_target.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: decode_target.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `decode_target.h`
 
 A target for decoding image and video data into. This corresponds roughly to an
 EGLImage, but that extension may not be fully supported on all GL platforms.
@@ -12,7 +12,7 @@
 decoding done directly into this memory, avoiding unnecessary memory copies, and
 also avoiding pushing data between CPU and GPU memory unnecessarily.
 
-## SbDecodeTargetFormat ##
+## SbDecodeTargetFormat
 
 SbDecodeTargets support several different formats that can be used to decode
 into and render from. Some formats may be easier to decode into, and others may
@@ -21,7 +21,7 @@
 Each decoder provides a way to check if a given SbDecodeTargetFormat is
 supported by that decoder.
 
-## SbDecodeTargetGraphicsContextProvider ##
+## SbDecodeTargetGraphicsContextProvider
 
 Some components may need to acquire SbDecodeTargets compatible with a certain
 rendering context, which may need to be created on a particular thread. The
@@ -33,10 +33,9 @@
 EGLContext held current. This may be useful if your SbDecodeTarget creation code
 needs to execute GLES commands like, for example, glGenTextures().
 
-The primary usage is likely to be the the SbPlayer implementation on some
-platforms.
+The primary usage is likely to be the SbPlayer implementation on some platforms.
 
-## SbDecodeTarget Example ##
+## SbDecodeTarget Example
 
 Let's say that we are an application and we would like to use the interface
 defined in starboard/image.h to decode an imaginary "image/foo" image type.
@@ -79,15 +78,15 @@
     info.planes[kSbDecodeTargetPlaneRGBA].texture;
 ```
 
-## Macros ##
+## Macros
 
-### kSbDecodeTargetInvalid ###
+### kSbDecodeTargetInvalid
 
 Well-defined value for an invalid decode target handle.
 
-## Enums ##
+## Enums
 
-### SbDecodeTargetFormat ###
+### SbDecodeTargetFormat
 
 The list of all possible decoder target formats. An SbDecodeTarget consists of
 one or more planes of data, each plane corresponding with a surface. For some
@@ -96,7 +95,7 @@
 NOTE: For enumeration entries with an alpha component, the alpha will always be
 premultiplied unless otherwise explicitly specified.
 
-#### Values ####
+#### Values
 
 *   `kSbDecodeTargetFormat1PlaneRGBA`
 
@@ -132,11 +131,11 @@
 
     An invalid decode target format.
 
-### SbDecodeTargetPlane ###
+### SbDecodeTargetPlane
 
 All the planes supported by SbDecodeTarget.
 
-#### Values ####
+#### Values
 
 *   `kSbDecodeTargetPlaneRGBA`
 
@@ -157,45 +156,45 @@
 
     The V plane for 3-plane YUV formats.
 
-## Typedefs ##
+## Typedefs
 
-### SbDecodeTarget ###
+### SbDecodeTarget
 
 A handle to a target for image data decoding.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbDecodeTargetPrivate* SbDecodeTarget
 ```
 
-### SbDecodeTargetGlesContextRunner ###
+### SbDecodeTargetGlesContextRunner
 
 Signature for a function provided by the application to the Starboard
 implementation that will let the Starboard implementation run arbitrary code on
 the application's renderer thread with the application's EGLContext held
 current.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDecodeTargetGlesContextRunner) (struct SbDecodeTargetGraphicsContextProvider *graphics_context_provider, SbDecodeTargetGlesContextRunnerTarget target_function, void *target_function_context)
 ```
 
-### SbDecodeTargetGlesContextRunnerTarget ###
+### SbDecodeTargetGlesContextRunnerTarget
 
 Signature for a Starboard implementation function that is to be run by a
 SbDecodeTargetGlesContextRunner callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDecodeTargetGlesContextRunnerTarget) (void *gles_context_runner_target_context)
 ```
 
-## Structs ##
+## Structs
 
-### SbDecodeTargetGraphicsContextProvider ###
+### SbDecodeTargetGraphicsContextProvider
 
 In general, the SbDecodeTargetGraphicsContextProvider structure provides
 information about the graphics context that will be used to render
@@ -205,7 +204,7 @@
 to all Starboard functions that might create SbDecodeTargets (e.g.
 SbImageDecode()).
 
-#### Members ####
+#### Members
 
 *   `void * egl_display`
 
@@ -228,12 +227,12 @@
     Context data that is to be passed in to `gles_context_runner` when it is
     invoked.
 
-### SbDecodeTargetInfo ###
+### SbDecodeTargetInfo
 
 Contains all information about a decode target, including all of its planes.
 This can be queried via calls to SbDecodeTargetGetInfo().
 
-#### Members ####
+#### Members
 
 *   `SbDecodeTargetFormat format`
 
@@ -262,11 +261,11 @@
     kSbDecodeTargetPlaneU, kSbDecodeTargetPlaneV} associated with this decode
     target.
 
-### SbDecodeTargetInfoContentRegion ###
+### SbDecodeTargetInfoContentRegion
 
 Defines a rectangular content region within a SbDecodeTargetInfoPlane structure.
 
-#### Members ####
+#### Members
 
 *   `float left`
 
@@ -278,11 +277,11 @@
 *   `float right`
 *   `float bottom`
 
-### SbDecodeTargetInfoPlane ###
+### SbDecodeTargetInfoPlane
 
 Defines an image plane within a SbDecodeTargetInfo object.
 
-#### Members ####
+#### Members
 
 *   `uint32_t texture`
 
@@ -312,53 +311,53 @@
     these parameters are number of pixels. The range for left/right is [0,
     width], and for top/bottom it is [0, height].
 
-## Functions ##
+## Functions
 
-### PrivateDecodeTargetReleaser ###
+### PrivateDecodeTargetReleaser
 
 This function is just an implementation detail of
 SbDecodeTargetReleaseInGlesContext() and should not be called directly.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void PrivateDecodeTargetReleaser(void *context)
 ```
 
-### SbDecodeTargetGetInfo ###
+### SbDecodeTargetGetInfo
 
 Writes all information about `decode_target` into `out_info`. The
 `decode_target` must not be kSbDecodeTargetInvalid. The `out_info` pointer must
 not be NULL. Returns false if the provided `out_info` structure is not zero
 initialized.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDecodeTargetGetInfo(SbDecodeTarget decode_target, SbDecodeTargetInfo *out_info)
 ```
 
-### SbDecodeTargetIsFormatValid ###
+### SbDecodeTargetIsFormatValid
 
 Returns whether a given format is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDecodeTargetIsFormatValid(SbDecodeTargetFormat format)
 ```
 
-### SbDecodeTargetIsValid ###
+### SbDecodeTargetIsValid
 
 Returns whether the given file handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDecodeTargetIsValid(SbDecodeTarget handle)
 ```
 
-### SbDecodeTargetRelease ###
+### SbDecodeTargetRelease
 
 Returns ownership of `decode_target` to the Starboard implementation. This
 function will likely result in the destruction of the SbDecodeTarget and all its
@@ -366,31 +365,31 @@
 reference count. In the case where SB_HAS(GLES2), this function must be called
 on a thread with the context
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDecodeTargetRelease(SbDecodeTarget decode_target)
 ```
 
-### SbDecodeTargetReleaseInGlesContext ###
+### SbDecodeTargetReleaseInGlesContext
 
 Helper function that is possibly useful to Starboard implementations that will
 release a decode target on the thread with the GLES context current.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void SbDecodeTargetReleaseInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTarget decode_target)
 ```
 
-### SbDecodeTargetRunInGlesContext ###
+### SbDecodeTargetRunInGlesContext
 
 Inline convenience function to run an arbitrary
 SbDecodeTargetGlesContextRunnerTarget function through a
 SbDecodeTargetGraphicsContextProvider . This is intended to be called by
 Starboard implementations, if it is necessary.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void SbDecodeTargetRunInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTargetGlesContextRunnerTarget target, void *target_context)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/directory.md b/cobalt/site/docs/reference/starboard/modules/13/directory.md
index d46c9a1..1c0f904 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/directory.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/directory.md
@@ -1,56 +1,56 @@
----
-layout: doc
-title: "Starboard Module Reference: directory.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `directory.h`
 
 Provides directory listing functions.
 
-## Macros ##
+## Macros
 
-### kSbDirectoryInvalid ###
+### kSbDirectoryInvalid
 
 Well-defined value for an invalid directory stream handle.
 
-## Typedefs ##
+## Typedefs
 
-### SbDirectory ###
+### SbDirectory
 
 A handle to an open directory stream.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbDirectoryPrivate* SbDirectory
 ```
 
-## Functions ##
+## Functions
 
-### SbDirectoryCanOpen ###
+### SbDirectoryCanOpen
 
 Indicates whether SbDirectoryOpen is allowed for the given `path`.
 
 `path`: The path to be checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryCanOpen(const char *path)
 ```
 
-### SbDirectoryClose ###
+### SbDirectoryClose
 
 Closes an open directory stream handle. The return value indicates whether the
 directory was closed successfully.
 
 `directory`: The directory stream handle to close.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryClose(SbDirectory directory)
 ```
 
-### SbDirectoryCreate ###
+### SbDirectoryCreate
 
 Creates the directory `path`, assuming the parent directory already exists. This
 function returns `true` if the directory now exists (even if it existed before)
@@ -58,13 +58,13 @@
 
 `path`: The path to be created.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryCreate(const char *path)
 ```
 
-### SbDirectoryGetNext ###
+### SbDirectoryGetNext
 
 Populates `out_entry` with the next entry in the specified directory stream, and
 moves the stream forward by one entry.
@@ -83,23 +83,23 @@
 `out_entry_size`: The size of the space allocated for `out_entry`. This should
 be at least equal to kSbFileMaxName.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryGetNext(SbDirectory directory, char *out_entry, size_t out_entry_size)
 ```
 
-### SbDirectoryIsValid ###
+### SbDirectoryIsValid
 
 Returns whether the given directory stream handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDirectoryIsValid(SbDirectory directory)
 ```
 
-### SbDirectoryOpen ###
+### SbDirectoryOpen
 
 Opens the given existing directory for listing. This function returns
 kSbDirectoryInvalidHandle if it is not successful.
@@ -110,7 +110,7 @@
 `out_error`: An output parameter that, in case of an error, is set to the reason
 that the directory could not be opened.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbDirectory SbDirectoryOpen(const char *path, SbFileError *out_error)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/drm.md b/cobalt/site/docs/reference/starboard/modules/13/drm.md
index fbb92f9..f42e43b 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/drm.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/drm.md
@@ -1,37 +1,37 @@
----
-layout: doc
-title: "Starboard Module Reference: drm.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `drm.h`
 
 Provides definitions that allow for DRM support, which are common between Player
 and Decoder interfaces.
 
-## Macros ##
+## Macros
 
-### kSbDrmSystemInvalid ###
+### kSbDrmSystemInvalid
 
 An invalid SbDrmSystem.
 
-### kSbDrmTicketInvalid ###
+### kSbDrmTicketInvalid
 
 A ticket for callback invocations initiated by the DRM system.
 
-## Enums ##
+## Enums
 
-### SbDrmEncryptionScheme ###
+### SbDrmEncryptionScheme
 
 Encryption scheme of the input sample, as defined in ISO/IEC 23001 part 7.
 
-#### Values ####
+#### Values
 
 *   `kSbDrmEncryptionSchemeAesCtr`
 *   `kSbDrmEncryptionSchemeAesCbc`
 
-### SbDrmKeyStatus ###
+### SbDrmKeyStatus
 
 Status of a particular media key. [https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus](https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus)
 
-#### Values ####
+#### Values
 
 *   `kSbDrmKeyStatusUsable`
 *   `kSbDrmKeyStatusExpired`
@@ -41,24 +41,24 @@
 *   `kSbDrmKeyStatusPending`
 *   `kSbDrmKeyStatusError`
 
-### SbDrmSessionRequestType ###
+### SbDrmSessionRequestType
 
 The type of the session request. [https://www.w3.org/TR/encrypted-media/#idl-def-mediakeymessagetype](https://www.w3.org/TR/encrypted-media/#idl-def-mediakeymessagetype)
 
-#### Values ####
+#### Values
 
 *   `kSbDrmSessionRequestTypeLicenseRequest`
 *   `kSbDrmSessionRequestTypeLicenseRenewal`
 *   `kSbDrmSessionRequestTypeLicenseRelease`
 *   `kSbDrmSessionRequestTypeIndividualizationRequest`
 
-### SbDrmStatus ###
+### SbDrmStatus
 
 The status of session related operations. Used by
 `SbDrmSessionUpdateRequestFunc`, `SbDrmSessionUpdatedFunc`, and
 `SbDrmServerCertificateUpdatedFunc` to indicate the status of the operation. [https://w3c.github.io/encrypted-media/#error-names](https://w3c.github.io/encrypted-media/#error-names)
 
-#### Values ####
+#### Values
 
 *   `kSbDrmStatusSuccess`
 *   `kSbDrmStatusTypeError`
@@ -70,42 +70,42 @@
     The following error can be used when the error status cannot be mapped to
     one of the above errors.
 
-## Typedefs ##
+## Typedefs
 
-### SbDrmServerCertificateUpdatedFunc ###
+### SbDrmServerCertificateUpdatedFunc
 
 A callback to notify the caller of SbDrmUpdateServerCertificate() whether the
 update has been successfully updated or not.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmServerCertificateUpdatedFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, const char *error_message)
 ```
 
-### SbDrmSessionClosedFunc ###
+### SbDrmSessionClosedFunc
 
 A callback for signalling that a session has been closed by the SbDrmSystem
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionClosedFunc) (SbDrmSystem drm_system, void *context, const void *session_id, int session_id_size)
 ```
 
-### SbDrmSessionKeyStatusesChangedFunc ###
+### SbDrmSessionKeyStatusesChangedFunc
 
 A callback for notifications that the status of one or more keys in a session
 has been changed. All keys of the session and their new status will be passed
 along. Any keys not in the list is considered as deleted.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionKeyStatusesChangedFunc) (SbDrmSystem drm_system, void *context, const void *session_id, int session_id_size, int number_of_keys, const SbDrmKeyId *key_ids, const SbDrmKeyStatus *key_statuses)
 ```
 
-### SbDrmSessionUpdateRequestFunc ###
+### SbDrmSessionUpdateRequestFunc
 
 A callback that will receive generated session update request when requested
 from a SbDrmSystem. `drm_system` will be the DRM system that
@@ -128,13 +128,13 @@
 the correct Promise corresponding to the associated
 SbDrmGenerateSessionUpdateRequest().
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionUpdateRequestFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, SbDrmSessionRequestType type, const char *error_message, const void *session_id, int session_id_size, const void *content, int content_size, const char *url)
 ```
 
-### SbDrmSessionUpdatedFunc ###
+### SbDrmSessionUpdatedFunc
 
 A callback for notifications that a session has been added, and subsequent
 encrypted samples are actively ready to be decoded. `drm_system` will be the DRM
@@ -150,37 +150,37 @@
 `status` is `kSbDrmStatusSuccess` or if no error message can be provided.
 `succeeded` is whether the session was successfully updated or not.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionUpdatedFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, const char *error_message, const void *session_id, int session_id_size)
 ```
 
-### SbDrmSystem ###
+### SbDrmSystem
 
 A handle to a DRM system which can be used with either an SbDecoder or an
 SbPlayer.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbDrmSystemPrivate* SbDrmSystem
 ```
 
-## Structs ##
+## Structs
 
-### SbDrmEncryptionPattern ###
+### SbDrmEncryptionPattern
 
 Encryption pattern of the input sample, as defined in ISO/IEC 23001 part 7.
 
-#### Members ####
+#### Members
 
 *   `uint32_t crypt_byte_block`
 *   `uint32_t skip_byte_block`
 
-### SbDrmKeyId ###
+### SbDrmKeyId
 
-#### Members ####
+#### Members
 
 *   `uint8_t identifier`
 
@@ -188,11 +188,11 @@
     PlayReady, this is the license GUID in packed little-endian binary form.
 *   `int identifier_size`
 
-### SbDrmSampleInfo ###
+### SbDrmSampleInfo
 
 All the optional information needed per sample for encrypted samples.
 
-#### Members ####
+#### Members
 
 *   `SbDrmEncryptionScheme encryption_scheme`
 
@@ -217,13 +217,13 @@
     The clear/encrypted mapping of each subsample in this sample. This must be
     an array of `subsample_count` mappings.
 
-### SbDrmSubSampleMapping ###
+### SbDrmSubSampleMapping
 
 A mapping of clear and encrypted bytes for a single subsample. All subsamples
 within a sample must be encrypted with the same encryption parameters. The clear
 bytes always appear first in the sample.
 
-#### Members ####
+#### Members
 
 *   `int32_t clear_byte_count`
 
@@ -232,21 +232,21 @@
 
     How many bytes of the corresponding subsample are encrypted.
 
-## Functions ##
+## Functions
 
-### SbDrmCloseSession ###
+### SbDrmCloseSession
 
 Clear any internal states/resources related to the specified `session_id`.
 
 `drm_system` must not be `kSbDrmSystemInvalid`. `session_id` must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmCloseSession(SbDrmSystem drm_system, const void *session_id, int session_id_size)
 ```
 
-### SbDrmDestroySystem ###
+### SbDrmDestroySystem
 
 Destroys `drm_system`, which implicitly removes all keys installed in it and
 invalidates all outstanding session update requests. A DRM system cannot be
@@ -258,13 +258,13 @@
 
 `drm_system`: The DRM system to be destroyed. Must not be `kSbDrmSystemInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmDestroySystem(SbDrmSystem drm_system)
 ```
 
-### SbDrmGenerateSessionUpdateRequest ###
+### SbDrmGenerateSessionUpdateRequest
 
 Asynchronously generates a session update request payload for
 `initialization_data`, of `initialization_data_size`, in case sensitive `type`,
@@ -296,13 +296,13 @@
 payload is created. Must not be NULL. `initialization_data_size`: The size of
 the session update request payload.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmGenerateSessionUpdateRequest(SbDrmSystem drm_system, int ticket, const char *type, const void *initialization_data, int initialization_data_size)
 ```
 
-### SbDrmGetMetrics ###
+### SbDrmGetMetrics
 
 Get the metrics of the underlying drm system.
 
@@ -326,13 +326,13 @@
 
 `drm_system` must not be `kSbDrmSystemInvalid`. `size` must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 const void* SbDrmGetMetrics(SbDrmSystem drm_system, int *size)
 ```
 
-### SbDrmIsServerCertificateUpdatable ###
+### SbDrmIsServerCertificateUpdatable
 
 Returns true if server certificate of `drm_system` can be updated via
 SbDrmUpdateServerCertificate(). The return value should remain the same during
@@ -341,33 +341,33 @@
 `drm_system`: The DRM system to check if its server certificate is updatable.
 Must not be `kSbDrmSystemInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDrmIsServerCertificateUpdatable(SbDrmSystem drm_system)
 ```
 
-### SbDrmSystemIsValid ###
+### SbDrmSystemIsValid
 
 Indicates whether `drm_system` is a valid SbDrmSystem.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDrmSystemIsValid(SbDrmSystem drm)
 ```
 
-### SbDrmTicketIsValid ###
+### SbDrmTicketIsValid
 
 Indicates whether `ticket` is a valid ticket.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDrmTicketIsValid(int ticket)
 ```
 
-### SbDrmUpdateServerCertificate ###
+### SbDrmUpdateServerCertificate
 
 Update the server certificate of `drm_system`. The function can be called
 multiple times. It is possible that a call to it happens before the callback of
@@ -384,13 +384,13 @@
 certificate data. Must not be NULL. `certificate_size`: Size of the server
 certificate data.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmUpdateServerCertificate(SbDrmSystem drm_system, int ticket, const void *certificate, int certificate_size)
 ```
 
-### SbDrmUpdateSession ###
+### SbDrmUpdateSession
 
 Update session with `key`, in `drm_system`'s key system, from the license server
 response. Calls `session_updated_callback` with `context` and whether the update
@@ -410,7 +410,7 @@
 thread before this function returns or from another thread. The `session_id`
 must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmUpdateSession(SbDrmSystem drm_system, int ticket, const void *key, int key_size, const void *session_id, int session_id_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/egl.md b/cobalt/site/docs/reference/starboard/modules/13/egl.md
index b1e120b..87deff2 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/egl.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/egl.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: egl.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `egl.h`
 
 The EGL API provides an interface with accompanying type declarations and
 defines that together provide a single consistent method of EGL usage across
@@ -11,67 +11,67 @@
 versions on different systems, and to remove the requirement for any other code
 to directly pull in and use these system libraries.
 
-## EGL Version ##
+## EGL Version
 
 This API has the ability to support EGL 1.5, however it is not required to
 support anything beyond EGL 1.4. The user is responsible for ensuring that the
 functions from EGL 1.5 they are calling from the interface are valid.
 
-## Macros ##
+## Macros
 
-### SB_EGL_ALPHA_FORMAT ###
+### SB_EGL_ALPHA_FORMAT
 
 EGL_VERSION_1_2
 
-### SB_EGL_ALPHA_SIZE ###
+### SB_EGL_ALPHA_SIZE
 
 EGL_VERSION_1_0
 
-### SB_EGL_BACK_BUFFER ###
+### SB_EGL_BACK_BUFFER
 
 EGL_VERSION_1_1
 
-### SB_EGL_CONFORMANT ###
+### SB_EGL_CONFORMANT
 
 EGL_VERSION_1_3
 
-### SB_EGL_CONTEXT_MAJOR_VERSION ###
+### SB_EGL_CONTEXT_MAJOR_VERSION
 
 EGL_VERSION_1_5
 
-### SB_EGL_DEFAULT_DISPLAY ###
+### SB_EGL_DEFAULT_DISPLAY
 
 EGL_VERSION_1_4
 
-## Typedefs ##
+## Typedefs
 
-### SbEglCastsToProperFunctionPointerType ###
+### SbEglCastsToProperFunctionPointerType
 
 The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/EGL/api/EGL/egl.h](https://www.khronos.org/registry/EGL/api/EGL/egl.h)
 .
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbEglCastsToProperFunctionPointerType) (void)
 ```
 
-### SbEglInt32 ###
+### SbEglInt32
 
 The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h](https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h)
 .
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int32_t SbEglInt32
 ```
 
-## Structs ##
+## Structs
 
-### SbEglInterface ###
+### SbEglInterface
 
-#### Members ####
+#### Members
 
 *   `SbEglBoolean(*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32
     *attrib_list, SbEglConfig *configs, SbEglInt32 config_size, SbEglInt32
diff --git a/cobalt/site/docs/reference/starboard/modules/13/event.md b/cobalt/site/docs/reference/starboard/modules/13/event.md
index 01a9d24..7887d8d 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/event.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/event.md
@@ -1,11 +1,11 @@
----
-layout: doc
-title: "Starboard Module Reference: event.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `event.h`
 
 Defines the event system that wraps the Starboard main loop and entry point.
 
-## The Starboard Application Lifecycle ##
+## The Starboard Application Lifecycle
 
 ```
                * ----------
@@ -78,15 +78,15 @@
 Note that the application is always expected to transition through `BLURRED`,
 `CONCEALED` to `FROZEN` before receiving `Stop` or being killed.
 
-## Enums ##
+## Enums
 
-### SbEventType ###
+### SbEventType
 
 An enumeration of all possible event types dispatched directly by the system.
 Each event is accompanied by a void* data argument, and each event must define
 the type of the value pointed to by that data argument, if any.
 
-#### Values ####
+#### Values
 
 *   `kSbEventTypePreload`
 
@@ -273,55 +273,55 @@
     change in the timezone setting). This should trigger the application to re-
     query the relevant APIs to update the date and time.
 
-## Typedefs ##
+## Typedefs
 
-### SbEventCallback ###
+### SbEventCallback
 
 A function that can be called back from the main Starboard event pump.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbEventCallback) (void *context)
 ```
 
-### SbEventDataDestructor ###
+### SbEventDataDestructor
 
 A function that will cleanly destroy an event data instance of a specific type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbEventDataDestructor) (void *data)
 ```
 
-### SbEventId ###
+### SbEventId
 
 An ID that can be used to refer to a scheduled event.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef uint32_t SbEventId
 ```
 
-## Structs ##
+## Structs
 
-### SbEvent ###
+### SbEvent
 
 Structure representing a Starboard event and its data.
 
-#### Members ####
+#### Members
 
 *   `SbEventType type`
 *   `SbTimeMonotonic timestamp`
 *   `void * data`
 
-### SbEventStartData ###
+### SbEventStartData
 
 Event data for kSbEventTypeStart events.
 
-#### Members ####
+#### Members
 
 *   `char ** argument_values`
 
@@ -333,31 +333,31 @@
 
     The startup link, if any.
 
-### SbEventWindowSizeChangedData ###
+### SbEventWindowSizeChangedData
 
 Event data for kSbEventTypeWindowSizeChanged events.
 
-#### Members ####
+#### Members
 
 *   `SbWindow window`
 *   `SbWindowSize size`
 
-## Functions ##
+## Functions
 
-### SbEventCancel ###
+### SbEventCancel
 
 Cancels the specified `event_id`. Note that this function is a no-op if the
 event already fired. This function can be safely called from any thread, but the
 only way to guarantee that the event does not run anyway is to call it from the
 main Starboard event loop thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbEventCancel(SbEventId event_id)
 ```
 
-### SbEventHandle ###
+### SbEventHandle
 
 The entry point that Starboard applications MUST implement. Any memory pointed
 at by `event` or the `data` field inside `event` is owned by the system, and
@@ -370,23 +370,23 @@
 application should generally do as little work as possible on this thread, and
 just dispatch it over to another thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SB_IMPORT void SbEventHandle(const SbEvent *event)
 ```
 
-### SbEventIsIdValid ###
+### SbEventIsIdValid
 
 Returns whether the given event handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbEventIsIdValid(SbEventId handle)
 ```
 
-### SbEventSchedule ###
+### SbEventSchedule
 
 Schedules an event `callback` into the main Starboard event loop. This function
 may be called from any thread, but `callback` is always called from the main
@@ -397,7 +397,7 @@
 of microseconds to wait before calling the `callback` function. Set `delay` to
 `0` to call the callback as soon as possible.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbEventId SbEventSchedule(SbEventCallback callback, void *context, SbTime delay)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/export.md b/cobalt/site/docs/reference/starboard/modules/13/export.md
index ff79777..a398d4a 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/export.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/export.md
@@ -1,24 +1,24 @@
----
-layout: doc
-title: "Starboard Module Reference: export.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `export.h`
 
 Provides macros for properly exporting or importing symbols from shared
 libraries.
 
-## Macros ##
+## Macros
 
-### SB_EXPORT ###
+### SB_EXPORT
 
 Specification for a symbol that should be exported when building the DLL and
 imported when building code that uses the DLL.
 
-### SB_EXPORT_PRIVATE ###
+### SB_EXPORT_PRIVATE
 
 Specification for a symbol that should be exported or imported for testing
 purposes only.
 
-### SB_IMPORT ###
+### SB_IMPORT
 
 Specification for a symbol that is expected to be defined externally to this
 module.
diff --git a/cobalt/site/docs/reference/starboard/modules/13/file.md b/cobalt/site/docs/reference/starboard/modules/13/file.md
index e22edeb..02c7863 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/file.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/file.md
@@ -1,25 +1,25 @@
----
-layout: doc
-title: "Starboard Module Reference: file.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `file.h`
 
 Defines file system input/output functions.
 
-## Macros ##
+## Macros
 
-### kSbFileInvalid ###
+### kSbFileInvalid
 
 Well-defined value for an invalid file handle.
 
-## Enums ##
+## Enums
 
-### SbFileError ###
+### SbFileError
 
 kSbFileErrorAccessDenied is returned when a call fails because of a filesystem
 restriction. kSbFileErrorSecurity is returned when a security policy doesn't
 allow the operation to be executed.
 
-#### Values ####
+#### Values
 
 *   `kSbFileOk`
 *   `kSbFileErrorFailed`
@@ -40,7 +40,7 @@
 *   `kSbFileErrorIO`
 *   `kSbFileErrorMax`
 
-### SbFileFlags ###
+### SbFileFlags
 
 Flags that define how a file is used in the application. These flags should be
 or'd together when passed to SbFileOpen to open or create a file.
@@ -66,7 +66,7 @@
 
 The `kSbFileAsync` flag is optional.
 
-#### Values ####
+#### Values
 
 *   `kSbFileOpenOnly`
 *   `kSbFileCreateOnly`
@@ -85,35 +85,35 @@
 *   `kSbFileWrite`
 *   `kSbFileAsync`
 
-### SbFileWhence ###
+### SbFileWhence
 
 This explicit mapping matches both FILE_ on Windows and SEEK_ on Linux.
 
-#### Values ####
+#### Values
 
 *   `kSbFileFromBegin`
 *   `kSbFileFromCurrent`
 *   `kSbFileFromEnd`
 
-## Typedefs ##
+## Typedefs
 
-### SbFile ###
+### SbFile
 
 A handle to an open file.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbFilePrivate* SbFile
 ```
 
-## Structs ##
+## Structs
 
-### SbFileInfo ###
+### SbFileInfo
 
 Used to hold information about a file.
 
-#### Members ####
+#### Members
 
 *   `int64_t size`
 
@@ -134,9 +134,9 @@
 
     The creation time of a file.
 
-## Functions ##
+## Functions
 
-### SbFileAtomicReplace ###
+### SbFileAtomicReplace
 
 Replaces the content of the file at `path` with `data`. Returns whether the
 contents of the file were replaced. The replacement of the content is an atomic
@@ -146,39 +146,39 @@
 to replace the file contents with. `data_size`: The amount of `data`, in bytes,
 to be written to the file.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileAtomicReplace(const char *path, const char *data, int64_t data_size)
 ```
 
-### SbFileCanOpen ###
+### SbFileCanOpen
 
 Indicates whether SbFileOpen() with the given `flags` is allowed for `path`.
 
 `path`: The absolute path to be checked. `flags`: The flags that are being
 evaluated for the given `path`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileCanOpen(const char *path, int flags)
 ```
 
-### SbFileClose ###
+### SbFileClose
 
 Closes `file`. The return value indicates whether the file was closed
 successfully.
 
 `file`: The absolute path of the file to be closed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileClose(SbFile file)
 ```
 
-### SbFileDelete ###
+### SbFileDelete
 
 Deletes the regular file, symlink, or empty directory at `path`. This function
 is used primarily to clean up after unit tests. On some platforms, this function
@@ -186,38 +186,38 @@
 
 `path`: The absolute path of the file, symlink, or directory to be deleted.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileDelete(const char *path)
 ```
 
-### SbFileExists ###
+### SbFileExists
 
 Indicates whether a file or directory exists at `path`.
 
 `path`: The absolute path of the file or directory being checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileExists(const char *path)
 ```
 
-### SbFileFlush ###
+### SbFileFlush
 
 Flushes the write buffer to `file`. Data written via SbFileWrite is not
 necessarily committed until the SbFile is flushed or closed.
 
 `file`: The SbFile to which the write buffer is flushed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileFlush(SbFile file)
 ```
 
-### SbFileGetInfo ###
+### SbFileGetInfo
 
 Retrieves information about `file`. The return value indicates whether the file
 information was retrieved successfully.
@@ -226,13 +226,13 @@
 into which the retrieved data is placed. This variable is not touched if the
 operation is not successful.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileGetInfo(SbFile file, SbFileInfo *out_info)
 ```
 
-### SbFileGetPathInfo ###
+### SbFileGetPathInfo
 
 Retrieves information about the file at `path`. The return value indicates
 whether the file information was retrieved successfully.
@@ -241,36 +241,36 @@
 `out_info`: The variable into which the retrieved data is placed. This variable
 is not touched if the operation is not successful.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileGetPathInfo(const char *path, SbFileInfo *out_info)
 ```
 
-### SbFileIsValid ###
+### SbFileIsValid
 
 Returns whether the given file handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbFileIsValid(SbFile file)
 ```
 
-### SbFileModeStringToFlags ###
+### SbFileModeStringToFlags
 
 Converts an ISO `fopen()` mode string into flags that can be equivalently passed
 into SbFileOpen().
 
 `mode`: The mode string to be converted into flags.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbFileModeStringToFlags(const char *mode)
 ```
 
-### SbFileOpen ###
+### SbFileOpen
 
 Opens the file at `path`, which must be absolute, creating it if specified by
 `flags`. The read/write position is at the beginning of the file.
@@ -287,13 +287,13 @@
 sets this value to `false`. `out_error`: If `path` cannot be created, this is
 set to `kSbFileInvalid`. Otherwise, it is `NULL`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbFile SbFileOpen(const char *path, int flags, bool *out_created, SbFileError *out_error)
 ```
 
-### SbFileRead ###
+### SbFileRead
 
 Reads `size` bytes (or until EOF is reached) from `file` into `data`, starting
 at the file's current position.
@@ -306,13 +306,13 @@
 `file`: The SbFile from which to read data. `data`: The variable to which data
 is read. `size`: The amount of data (in bytes) to read.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbFileRead(SbFile file, char *data, int size)
 ```
 
-### SbFileReadAll ###
+### SbFileReadAll
 
 Reads `size` bytes (or until EOF is reached) from `file` into `data`, starting
 at the file's current position.
@@ -326,13 +326,13 @@
 `file`: The SbFile from which to read data. `data`: The variable to which data
 is read. `size`: The amount of data (in bytes) to read.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbFileReadAll(SbFile file, char *data, int size)
 ```
 
-### SbFileSeek ###
+### SbFileSeek
 
 Changes the current read/write position in `file`. The return value identifies
 the resultant current read/write position in the file (relative to the start) or
@@ -344,13 +344,13 @@
 value. `offset`: The amount that the read/write position is changed, relative to
 `whence`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbFileSeek(SbFile file, SbFileWhence whence, int64_t offset)
 ```
 
-### SbFileTruncate ###
+### SbFileTruncate
 
 Truncates the given `file` to the given `length`. The return value indicates
 whether the file was truncated successfully.
@@ -360,13 +360,13 @@
 then the file is extended with zeros. If `length` is negative, then the function
 is a no-op and returns `false`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileTruncate(SbFile file, int64_t length)
 ```
 
-### SbFileWrite ###
+### SbFileWrite
 
 Writes the given buffer into `file` at the file's current position, overwriting
 any data that was previously there.
@@ -380,13 +380,13 @@
 `file`: The SbFile to which data will be written. `data`: The data to be
 written. `size`: The amount of data (in bytes) to write.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbFileWrite(SbFile file, const char *data, int size)
 ```
 
-### SbFileWriteAll ###
+### SbFileWriteAll
 
 Writes the given buffer into `file`, starting at the beginning of the file, and
 overwriting any data that was previously there. Unlike SbFileWrite, this
@@ -397,7 +397,7 @@
 `file`: The file to which data will be written. `data`: The data to be written.
 `size`: The amount of data (in bytes) to write.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbFileWriteAll(SbFile file, const char *data, int size)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/gles.md b/cobalt/site/docs/reference/starboard/modules/13/gles.md
index 7a9108a..049838f 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/gles.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/gles.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: gles.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `gles.h`
 
 The GLES API provides an interface with accompanying type declarations and
 defines that together provide a single consistent method of GLES usage across
@@ -11,37 +11,37 @@
 and versions on different systems, and to remove the requirement for any other
 code to directly pull in and use these system libraries.
 
-## GLES Version ##
+## GLES Version
 
 This API has the ability to support GLES 3.0, however platforms are not required
 to support anything beyond GLES 2.0. The caller is responsible for ensuring that
 the functions from GLES 3.0 they are calling from the interface are valid.
 
-## Macros ##
+## Macros
 
-### SB_GL_DEPTH_BUFFER_BIT ###
+### SB_GL_DEPTH_BUFFER_BIT
 
 Previously defined in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
 
-### SB_GL_READ_BUFFER ###
+### SB_GL_READ_BUFFER
 
 Previously defined in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
 .
 
-## Typedefs ##
+## Typedefs
 
-### SbGlBoolean ###
+### SbGlBoolean
 
 The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
 .
 
-#### Definition ####
+#### Definition
 
 ```
 typedef uint8_t SbGlBoolean
 ```
 
-### SbGlIntPtr ###
+### SbGlIntPtr
 
 Some compilers will transform the intptr_t to an int transparently behind the
 scenes, which is not equivalent to a long int, or long long int, as far as the
@@ -49,17 +49,17 @@
 those exact types used by OpenGL ES 2.0 ( [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h)
 ).
 
-#### Definition ####
+#### Definition
 
 ```
 typedef long int SbGlIntPtr
 ```
 
-## Structs ##
+## Structs
 
-### SbGlesInterface ###
+### SbGlesInterface
 
-#### Members ####
+#### Members
 
 *   `void(*glActiveTexture)(SbGlEnum texture)`
 
diff --git a/cobalt/site/docs/reference/starboard/modules/13/image.md b/cobalt/site/docs/reference/starboard/modules/13/image.md
index 1427d39..945938a 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/image.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/image.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: image.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `image.h`
 
 API for hardware accelerated image decoding. This module allows for the client
 to feed in raw, encoded data to be decoded directly into an SbDecodeTarget. It
@@ -11,7 +11,7 @@
 All functions in this module are safe to call from any thread at any point in
 time.
 
-## SbImageIsDecodeSupported and SbImageDecode Example ##
+## SbImageIsDecodeSupported and SbImageDecode Example
 
 ```
 SbDecodeTargetProvider* provider = GetProviderFromSomewhere();
@@ -28,9 +28,9 @@
                                              mime_type, format);
 ```
 
-## Functions ##
+## Functions
 
-### SbImageDecode ###
+### SbImageDecode
 
 Attempt to decode encoded `mime_type` image data `data` of size `data_size` into
 an SbDecodeTarget of SbDecodeFormatType `format`, possibly using
@@ -56,13 +56,13 @@
     kSbDecodeTargetInvalid will be returned, with any intermediate allocations
     being cleaned up in the implementation.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbDecodeTarget SbImageDecode(SbDecodeTargetGraphicsContextProvider *context_provider, void *data, int data_size, const char *mime_type, SbDecodeTargetFormat format)
 ```
 
-### SbImageIsDecodeSupported ###
+### SbImageIsDecodeSupported
 
 Whether the current platform supports hardware accelerated decoding an image of
 mime type `mime_type` into SbDecodeTargetFormat `format`. The `mime_type` must
@@ -70,7 +70,7 @@
 program, which means that the results of this function may be cached
 indefinitely.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbImageIsDecodeSupported(const char *mime_type, SbDecodeTargetFormat format)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/input.md b/cobalt/site/docs/reference/starboard/modules/13/input.md
index e8df816..d2dd2db 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/input.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/input.md
@@ -1,18 +1,18 @@
----
-layout: doc
-title: "Starboard Module Reference: input.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `input.h`
 
 Defines input events and associated data types.
 
-## Enums ##
+## Enums
 
-### SbInputDeviceType ###
+### SbInputDeviceType
 
 Identifies possible input subsystem types. The types of events that each device
 type produces correspond to `SbInputEventType` values.
 
-#### Values ####
+#### Values
 
 *   `kSbInputDeviceTypeGesture`
 
@@ -57,11 +57,11 @@
 
     Produces `Input` events.
 
-### SbInputEventType ###
+### SbInputEventType
 
 The action that an input event represents.
 
-#### Values ####
+#### Values
 
 *   `kSbInputEventTypeMove`
 
@@ -86,13 +86,13 @@
 
     [https://w3c.github.io/uievents/#event-type-input](https://w3c.github.io/uievents/#event-type-input)
 
-## Structs ##
+## Structs
 
-### SbInputData ###
+### SbInputData
 
 Event data for `kSbEventTypeInput` events.
 
-#### Members ####
+#### Members
 
 *   `SbWindow window`
 
@@ -160,11 +160,11 @@
 
     Set to true if the input event is part of a composition event.
 
-### SbInputVector ###
+### SbInputVector
 
 A 2-dimensional vector used to represent points and motion vectors.
 
-#### Members ####
+#### Members
 
 *   `float x`
 *   `float y`
diff --git a/cobalt/site/docs/reference/starboard/modules/13/key.md b/cobalt/site/docs/reference/starboard/modules/13/key.md
index 16be3c1..853f820 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/key.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/key.md
@@ -1,19 +1,19 @@
----
-layout: doc
-title: "Starboard Module Reference: key.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `key.h`
 
 Defines the canonical set of Starboard key codes.
 
-## Enums ##
+## Enums
 
-### SbKey ###
+### SbKey
 
 A standard set of key codes, ordered by value, that represent each possible
 input key across all kinds of devices. Starboard uses the semi-standard Windows
 virtual key codes documented at: [https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx](https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx)
 
-#### Values ####
+#### Values
 
 *   `kSbKeyUnknown`
 *   `kSbKeyCancel`
@@ -274,11 +274,11 @@
 *   `kSbKeyGamepadRightStickLeft`
 *   `kSbKeyGamepadRightStickRight`
 
-### SbKeyModifiers ###
+### SbKeyModifiers
 
 Bit-mask of key modifiers.
 
-#### Values ####
+#### Values
 
 *   `kSbKeyModifiersNone`
 *   `kSbKeyModifiersAlt`
diff --git a/cobalt/site/docs/reference/starboard/modules/13/log.md b/cobalt/site/docs/reference/starboard/modules/13/log.md
index 42de513..6cf3a49 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/log.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/log.md
@@ -1,18 +1,18 @@
----
-layout: doc
-title: "Starboard Module Reference: log.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `log.h`
 
 Defines core debug logging functions.
 
-## Enums ##
+## Enums
 
-### SbLogPriority ###
+### SbLogPriority
 
 The priority at which a message should be logged. The platform may be configured
 to filter logs by priority, or render them differently.
 
-#### Values ####
+#### Values
 
 *   `kSbLogPriorityUnknown`
 *   `kSbLogPriorityInfo`
@@ -20,9 +20,9 @@
 *   `kSbLogPriorityError`
 *   `kSbLogPriorityFatal`
 
-## Functions ##
+## Functions
 
-### SbLog ###
+### SbLog
 
 Writes `message` to the platform's debug output log. This method is thread-safe,
 and responsible for ensuring that the output from multiple threads is not mixed.
@@ -35,55 +35,55 @@
 termination. That said, platforms can adjust the message to be more suitable for
 their output method by wrapping the text, stripping unprintable characters, etc.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLog(SbLogPriority priority, const char *message)
 ```
 
-### SbLogFlush ###
+### SbLogFlush
 
 Flushes the log buffer on some platforms. This method is safe to call from
 multiple threads.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogFlush()
 ```
 
-### SbLogFormat ###
+### SbLogFormat
 
 A log output method that additionally performs a string format on the data being
 logged.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogFormat(const char *format, va_list args) SB_PRINTF_FORMAT(1
 ```
 
-### SbLogFormatF ###
+### SbLogFormatF
 
 Inline wrapper of SbLogFormat that converts from ellipsis to va_args.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void static void static void SbLogFormatF(const char *format,...) SB_PRINTF_FORMAT(1
 ```
 
-### SbLogIsTty ###
+### SbLogIsTty
 
 Indicates whether the log output goes to a TTY or is being redirected.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbLogIsTty()
 ```
 
-### SbLogRaw ###
+### SbLogRaw
 
 A bare-bones log output method that is async-signal-safe, i.e. safe to call from
 an asynchronous signal handler (e.g. a `SIGSEGV` handler). It should not do any
@@ -91,13 +91,13 @@
 
 `message`: The message to be logged. Must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogRaw(const char *message)
 ```
 
-### SbLogRawDumpStack ###
+### SbLogRawDumpStack
 
 Dumps the stack of the current thread to the log in an async-signal-safe manner,
 i.e. safe to call from an asynchronous signal handler (e.g. a `SIGSEGV`
@@ -108,28 +108,28 @@
 helper functions that might end up on top of every stack dump so that the stack
 dump is just the relevant function stack where the problem occurred.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogRawDumpStack(int frames_to_skip)
 ```
 
-### SbLogRawFormat ###
+### SbLogRawFormat
 
 A formatted log output method that is async-signal-safe, i.e. safe to call from
 an asynchronous signal handler (e.g. a `SIGSEGV` handler).
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogRawFormat(const char *format, va_list args) SB_PRINTF_FORMAT(1
 ```
 
-### SbLogRawFormatF ###
+### SbLogRawFormatF
 
 Inline wrapper of SbLogFormat to convert from ellipsis to va_args.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void static void static void SbLogRawFormatF(const char *format,...) SB_PRINTF_FORMAT(1
diff --git a/cobalt/site/docs/reference/starboard/modules/13/media.md b/cobalt/site/docs/reference/starboard/modules/13/media.md
index 968db5b..c138c00 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/media.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/media.md
@@ -1,28 +1,28 @@
----
-layout: doc
-title: "Starboard Module Reference: media.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `media.h`
 
 Provides media definitions that are common between the Decoder and Player
 interfaces.
 
-## Macros ##
+## Macros
 
-### kSbMediaBitsPerPixelInvalid ###
+### kSbMediaBitsPerPixelInvalid
 
 Value used when a video's bits per pixel is not known.
 
-### kSbMediaVideoResolutionDimensionInvalid ###
+### kSbMediaVideoResolutionDimensionInvalid
 
 Value used when a video's resolution is not known.
 
-## Enums ##
+## Enums
 
-### SbMediaAudioCodec ###
+### SbMediaAudioCodec
 
 Types of audio elementary streams that can be supported.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioCodecNone`
 *   `kSbMediaAudioCodecAac`
@@ -31,11 +31,11 @@
 *   `kSbMediaAudioCodecOpus`
 *   `kSbMediaAudioCodecVorbis`
 
-### SbMediaAudioCodingType ###
+### SbMediaAudioCodingType
 
 Possible audio coding types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioCodingTypeNone`
 *   `kSbMediaAudioCodingTypeAac`
@@ -49,11 +49,11 @@
 *   `kSbMediaAudioCodingTypeMpeg3`
 *   `kSbMediaAudioCodingTypePcm`
 
-### SbMediaAudioConnector ###
+### SbMediaAudioConnector
 
 Possible audio connector types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioConnectorNone`
 *   `kSbMediaAudioConnectorAnalog`
@@ -63,11 +63,11 @@
 *   `kSbMediaAudioConnectorSpdif`
 *   `kSbMediaAudioConnectorUsb`
 
-### SbMediaAudioFrameStorageType ###
+### SbMediaAudioFrameStorageType
 
 Possible audio frame storage types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioFrameStorageTypeInterleaved`
 
@@ -83,22 +83,22 @@
     with timestamps 0, 1, 2, etc., the samples are stored in two buffers "L0 L1
     L2 ..." and "R0 R1 R2 ...".
 
-### SbMediaAudioSampleType ###
+### SbMediaAudioSampleType
 
 Possible audio sample types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioSampleTypeInt16Deprecated`
 *   `kSbMediaAudioSampleTypeFloat32`
 
-### SbMediaRangeId ###
+### SbMediaRangeId
 
 This corresponds to the WebM Range enum which is part of WebM color data (see [http://www.webmproject.org/docs/container/#Range](http://www.webmproject.org/docs/container/#Range)
 ). H.264 only uses a bool, which corresponds to the LIMITED/FULL values. Chrome-
 specific values start at 1000.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaRangeIdUnspecified`
 
@@ -114,13 +114,13 @@
     Range is defined by TransferId/MatrixId.
 *   `kSbMediaRangeIdLast`
 
-### SbMediaSupportType ###
+### SbMediaSupportType
 
 Indicates how confident the device is that it can play media resources of the
 given type. The values are a direct map of the canPlayType() method specified at
 the following link: [https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype](https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype)
 
-#### Values ####
+#### Values
 
 *   `kSbMediaSupportTypeNotSupported`
 
@@ -132,11 +132,11 @@
 
     The media type seems to be playable.
 
-### SbMediaType ###
+### SbMediaType
 
 Types of media component streams.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaTypeAudio`
 
@@ -145,11 +145,11 @@
 
     Value used for video streams.
 
-### SbMediaVideoCodec ###
+### SbMediaVideoCodec
 
 Types of video elementary streams that could be supported.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaVideoCodecNone`
 *   `kSbMediaVideoCodecH264`
@@ -161,14 +161,14 @@
 *   `kSbMediaVideoCodecVp8`
 *   `kSbMediaVideoCodecVp9`
 
-## Structs ##
+## Structs
 
-### SbMediaAudioConfiguration ###
+### SbMediaAudioConfiguration
 
 A structure describing the audio configuration parameters of a single audio
 output.
 
-#### Members ####
+#### Members
 
 *   `int index`
 
@@ -190,7 +190,7 @@
     `0` if this device cannot provide this information, in which case the caller
     can probably assume stereo output.
 
-### SbMediaAudioSampleInfo ###
+### SbMediaAudioSampleInfo
 
 An audio sample info, which is a description of a given audio sample. This acts
 as a set of instructions to the audio decoder.
@@ -200,7 +200,7 @@
 Audio-specific configuration field. The `WAVEFORMATEX` structure is specified at
 [http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx](http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx)x) .
 
-#### Members ####
+#### Members
 
 *   `SbMediaAudioCodec codec`
 
@@ -224,7 +224,7 @@
     The number of bytes per second expected with this format.
 *   `uint16_t block_alignment`
 
-    Byte block alignment, e.g, 4.
+    Byte block alignment, e.g., 4.
 *   `uint16_t bits_per_sample`
 
     The bit depth for the stream this represents, e.g. `8` or `16`.
@@ -235,14 +235,14 @@
 
     The AudioSpecificConfig, as specified in ISO/IEC-14496-3, section 1.6.2.1: [http://read.pudn.com/downloads98/doc/comm/401153/14496/ISO_IEC_14496-3%20Part%203%20Audio/C036083E_SUB1.PDF](http://read.pudn.com/downloads98/doc/comm/401153/14496/ISO_IEC_14496-3%20Part%203%20Audio/C036083E_SUB1.PDF)
 
-### SbMediaColorMetadata ###
+### SbMediaColorMetadata
 
 HDR (High Dynamic Range) Metadata common for HDR10 and WebM/VP9-based HDR
 formats, together with the ColorSpace. HDR reproduces a greater dynamic range of
 luminosity than is possible with standard digital imaging. See the Consumer
 Electronics Association press release: [https://www.cta.tech/News/Press-Releases/2015/August/CEA-Defines-%E2%80%98HDR-Compatible%E2%80%99-Displays.aspx](https://www.cta.tech/News/Press-Releases/2015/August/CEA-Defines-%E2%80%98HDR-Compatible%E2%80%99-Displays.aspx)
 
-#### Members ####
+#### Members
 
 *   `unsigned int bits_per_channel`
 
@@ -323,7 +323,7 @@
     a row-major ordered 3 x 4 submatrix of the 4 x 4 transform matrix. The 4th
     row is completed as (0, 0, 0, 1).
 
-### SbMediaMasteringMetadata ###
+### SbMediaMasteringMetadata
 
 SMPTE 2086 mastering data [http://ieeexplore.ieee.org/document/7291707/](http://ieeexplore.ieee.org/document/7291707/)
 This standard specifies the metadata items to specify the color volume (the
@@ -332,7 +332,7 @@
 independent of any specific digital representation. Also see the WebM container
 guidelines: [https://www.webmproject.org/docs/container/](https://www.webmproject.org/docs/container/)
 
-#### Members ####
+#### Members
 
 *   `float primary_r_chromaticity_x`
 
@@ -367,11 +367,11 @@
     Minimum luminance. Shall be represented in candelas per square meter
     (cd/m^2). In range [0, 9999.99].
 
-### SbMediaVideoSampleInfo ###
+### SbMediaVideoSampleInfo
 
 The set of information required by the decoder or player for each video sample.
 
-#### Members ####
+#### Members
 
 *   `SbMediaVideoCodec codec`
 
@@ -417,9 +417,9 @@
     . This will only be specified on frames where the HDR metadata and color /
     color space might have changed (e.g. keyframes).
 
-## Functions ##
+## Functions
 
-### SbMediaCanPlayMimeAndKeySystem ###
+### SbMediaCanPlayMimeAndKeySystem
 
 Returns information about whether the playback of the specific media described
 by `mime` and encrypted using `key_system` can be played.
@@ -463,13 +463,13 @@
 implementation supports key system with attributes on one key system, it has to
 support key system with attributes on all key systems supported.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMediaSupportType SbMediaCanPlayMimeAndKeySystem(const char *mime, const char *key_system)
 ```
 
-### SbMediaGetAudioBufferBudget ###
+### SbMediaGetAudioBufferBudget
 
 Specifies the maximum amount of memory used by audio buffers of media source
 before triggering a garbage collection. A large value will cause more memory
@@ -477,13 +477,13 @@
 download audio data. Note that the app may experience significant difficulty if
 this value is too low.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetAudioBufferBudget()
 ```
 
-### SbMediaGetAudioConfiguration ###
+### SbMediaGetAudioConfiguration
 
 Retrieves the current physical audio configuration of audio output
 `output_index` on this device and places it in `out_configuration`, which must
@@ -495,38 +495,38 @@
 `out_configuration`: The variable that holds the audio configuration
 information.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMediaGetAudioConfiguration(int output_index, SbMediaAudioConfiguration *out_configuration)
 ```
 
-### SbMediaGetAudioOutputCount ###
+### SbMediaGetAudioOutputCount
 
 Returns the number of audio outputs currently available on this device. Even if
 the number of outputs or their audio configurations can't be determined, it is
 expected that the platform will at least return a single output that supports at
 least stereo.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetAudioOutputCount()
 ```
 
-### SbMediaGetBufferAlignment ###
+### SbMediaGetBufferAlignment
 
 The media buffer will be allocated using the returned alignment. Set this to a
 larger value may increase the memory consumption of media buffers.`type`: the
 media type of the stream (audio or video).
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetBufferAlignment(SbMediaType type)
 ```
 
-### SbMediaGetBufferAllocationUnit ###
+### SbMediaGetBufferAllocationUnit
 
 When the media stack needs more memory to store media buffers, it will allocate
 extra memory in units returned by SbMediaGetBufferAllocationUnit. This can
@@ -534,13 +534,13 @@
 When SbMediaGetInitialBufferCapacity and this function both return 0, the media
 stack will allocate individual buffers directly using SbMemory functions.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetBufferAllocationUnit()
 ```
 
-### SbMediaGetBufferGarbageCollectionDurationThreshold ###
+### SbMediaGetBufferGarbageCollectionDurationThreshold
 
 Specifies the duration threshold of media source garbage collection. When the
 accumulated duration in a source buffer exceeds this value, the media source
@@ -551,54 +551,54 @@
 return 170 seconds for most of the platforms. But it can be further reduced on
 systems with extremely low memory.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTime SbMediaGetBufferGarbageCollectionDurationThreshold()
 ```
 
-### SbMediaGetBufferPadding ###
+### SbMediaGetBufferPadding
 
 Extra bytes allocated at the end of a media buffer to ensure that the buffer can
 be use optimally by specific instructions like SIMD. Set to 0 to remove any
 padding.`type`: the media type of the stream (audio or video).
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetBufferPadding(SbMediaType type)
 ```
 
-### SbMediaGetBufferStorageType ###
+### SbMediaGetBufferStorageType
 
 Returns SbMediaBufferStorageType of type `SbMediaStorageTypeMemory` or
 `SbMediaStorageTypeFile`. For memory storage, the media buffers will be stored
 in main memory allocated by SbMemory functions. For file storage, the media
 buffers will be stored in a temporary file in the system cache folder acquired
 by calling SbSystemGetPath() with "kSbSystemPathCacheDirectory". Note that when
-its value is "file" the media stack will still allocate memory to cache the the
+its value is "file" the media stack will still allocate memory to cache the
 buffers in use.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMediaBufferStorageType SbMediaGetBufferStorageType()
 ```
 
-### SbMediaGetInitialBufferCapacity ###
+### SbMediaGetInitialBufferCapacity
 
 The amount of memory that will be used to store media buffers allocated during
 system startup. To allocate a large chunk at startup helps with reducing
 fragmentation and can avoid failures to allocate incrementally. This can return
 0.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetInitialBufferCapacity()
 ```
 
-### SbMediaGetMaxBufferCapacity ###
+### SbMediaGetMaxBufferCapacity
 
 The maximum amount of memory that will be used to store media buffers. This must
 be larger than sum of the video budget and audio budget. This is a soft limit
@@ -613,13 +613,13 @@
 resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
 than non- HDR video.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetMaxBufferCapacity(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
 ```
 
-### SbMediaGetProgressiveBufferBudget ###
+### SbMediaGetProgressiveBufferBudget
 
 The memory used when playing mp4 videos that is not in DASH format. The
 resolution of such videos shouldn't go beyond 1080p. Its value should be less
@@ -631,13 +631,13 @@
 resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
 than non- HDR video.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetProgressiveBufferBudget(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
 ```
 
-### SbMediaGetVideoBufferBudget ###
+### SbMediaGetVideoBufferBudget
 
 Specifies the maximum amount of memory used by video buffers of media source
 before triggering a garbage collection. A large value will cause more memory
@@ -650,13 +650,13 @@
 resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
 than non- HDR video.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetVideoBufferBudget(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
 ```
 
-### SbMediaIsBufferPoolAllocateOnDemand ###
+### SbMediaIsBufferPoolAllocateOnDemand
 
 When either SbMediaGetInitialBufferCapacity or SbMediaGetBufferAllocationUnit
 isn't zero, media buffers will be allocated using a memory pool. Set the
@@ -667,24 +667,24 @@
 release any media buffer memory back to the system even if there is no media
 buffers allocated.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMediaIsBufferPoolAllocateOnDemand()
 ```
 
-### SbMediaIsBufferUsingMemoryPool ###
+### SbMediaIsBufferUsingMemoryPool
 
 If SbMediaGetBufferUsingMemoryPool returns true, it indicates that media buffer
 pools should be allocated on demand, as opposed to using SbMemory* functions.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMediaIsBufferUsingMemoryPool()
 ```
 
-### SbMediaSetAudioWriteDuration ###
+### SbMediaSetAudioWriteDuration
 
 Communicate to the platform how far past `current_playback_position` the app
 will write audio samples. The app will write all samples between
@@ -696,7 +696,7 @@
 as transient or indefinite hanging). The platform may assume `duration` >= 0.5
 seconds.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMediaSetAudioWriteDuration(SbTime duration)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/memory.md b/cobalt/site/docs/reference/starboard/modules/13/memory.md
index e09dbc3..3905f6f 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/memory.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/memory.md
@@ -1,17 +1,17 @@
----
-layout: doc
-title: "Starboard Module Reference: memory.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `memory.h`
 
 Defines functions for memory allocation, alignment, copying, and comparing.
 
-## Porters ##
+## Porters
 
 All of the "Unchecked" and "Free" functions must be implemented, but they should
 not be called directly. The Starboard platform wraps them with extra accounting
 under certain circumstances.
 
-## Porters and Application Developers ##
+## Porters and Application Developers
 
 Nobody should call the "Checked", "Unchecked" or "Free" functions directly
 because that evades Starboard's memory tracking. In both port implementations
@@ -26,14 +26,14 @@
 
 *   The "free" functions are SbMemoryFree() and SbMemoryFreeAligned().
 
-## Enums ##
+## Enums
 
-### SbMemoryMapFlags ###
+### SbMemoryMapFlags
 
 The bitwise OR of these flags should be passed to SbMemoryMap to indicate how
 the mapped memory can be used.
 
-#### Values ####
+#### Values
 
 *   `kSbMemoryMapProtectReserved`
 
@@ -44,9 +44,9 @@
 *   `kSbMemoryMapProtectExec`
 *   `kSbMemoryMapProtectReadWrite`
 
-## Functions ##
+## Functions
 
-### SbMemoryAllocate ###
+### SbMemoryAllocate
 
 Allocates and returns a chunk of memory of at least `size` bytes. This function
 should be called from the client codebase. It is intended to be a drop-in
@@ -58,13 +58,13 @@
 return `NULL` or it may return a unique pointer value that can be passed to
 SbMemoryDeallocate.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocate(size_t size)
 ```
 
-### SbMemoryAllocateAligned ###
+### SbMemoryAllocateAligned
 
 Allocates and returns a chunk of memory of at least `size` bytes, aligned to
 `alignment`. This function should be called from the client codebase. It is
@@ -78,87 +78,87 @@
 `size` is `0`, the function may return `NULL` or it may return a unique aligned
 pointer value that can be passed to SbMemoryDeallocateAligned.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateAligned(size_t alignment, size_t size)
 ```
 
-### SbMemoryAllocateAlignedChecked ###
+### SbMemoryAllocateAlignedChecked
 
 Same as SbMemoryAllocateAlignedUnchecked, but will abort() in the case of an
 allocation failure.
 
 DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateAlignedChecked(size_t alignment, size_t size)
 ```
 
-### SbMemoryAllocateAlignedUnchecked ###
+### SbMemoryAllocateAlignedUnchecked
 
 This is the implementation of SbMemoryAllocateAligned that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateAlignedUnchecked(size_t alignment, size_t size)
 ```
 
-### SbMemoryAllocateChecked ###
+### SbMemoryAllocateChecked
 
 Same as SbMemoryAllocateUnchecked, but will abort() in the case of an allocation
 failure.
 
 DO NOT CALL. Call SbMemoryAllocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateChecked(size_t size)
 ```
 
-### SbMemoryAllocateNoReport ###
+### SbMemoryAllocateNoReport
 
 Same as SbMemoryAllocate() but will not report memory to the tracker. Avoid
 using this unless absolutely necessary.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateNoReport(size_t size)
 ```
 
-### SbMemoryAllocateUnchecked ###
+### SbMemoryAllocateUnchecked
 
 This is the implementation of SbMemoryAllocate that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryAllocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateUnchecked(size_t size)
 ```
 
-### SbMemoryCalloc ###
+### SbMemoryCalloc
 
 A wrapper that implements a drop-in replacement for `calloc`, which is used in
 some packages.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void* SbMemoryCalloc(size_t count, size_t size)
 ```
 
-### SbMemoryDeallocate ###
+### SbMemoryDeallocate
 
 Frees a previously allocated chunk of memory. If `memory` is NULL, then the
 operation is a no-op. This function should be called from the client codebase.
@@ -166,87 +166,87 @@
 
 `memory`: The chunk of memory to be freed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryDeallocate(void *memory)
 ```
 
-### SbMemoryDeallocateAligned ###
+### SbMemoryDeallocateAligned
 
 `memory`: The chunk of memory to be freed. If `memory` is NULL, then the
 function is a no-op.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryDeallocateAligned(void *memory)
 ```
 
-### SbMemoryDeallocateNoReport ###
+### SbMemoryDeallocateNoReport
 
 Same as SbMemoryDeallocate() but will not report memory deallocation to the
 tracker. This function must be matched with SbMemoryAllocateNoReport().
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryDeallocateNoReport(void *memory)
 ```
 
-### SbMemoryFlush ###
+### SbMemoryFlush
 
 Flushes any data in the given virtual address range that is cached locally in
 the current processor core to physical memory, ensuring that data and
 instruction caches are cleared. This is required to be called on executable
 memory that has been written to and might be executed in the future.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryFlush(void *virtual_address, int64_t size_bytes)
 ```
 
-### SbMemoryFree ###
+### SbMemoryFree
 
 This is the implementation of SbMemoryDeallocate that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryDeallocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryFree(void *memory)
 ```
 
-### SbMemoryFreeAligned ###
+### SbMemoryFreeAligned
 
 This is the implementation of SbMemoryFreeAligned that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryDeallocateAligned(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryFreeAligned(void *memory)
 ```
 
-### SbMemoryGetStackBounds ###
+### SbMemoryGetStackBounds
 
 Gets the stack bounds for the current thread.
 
 `out_high`: The highest addressable byte + 1 for the current thread. `out_low`:
 The lowest addressable byte for the current thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryGetStackBounds(void **out_high, void **out_low)
 ```
 
-### SbMemoryMap ###
+### SbMemoryMap
 
 Allocates `size_bytes` worth of physical memory pages and maps them into an
 available virtual region. This function returns `SB_MEMORY_MAP_FAILED` on
@@ -261,24 +261,24 @@
 should not count it against any memory budget. `name`: A value that appears in
 the debugger on some platforms. The value can be up to 32 bytes.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryMap(int64_t size_bytes, int flags, const char *name)
 ```
 
-### SbMemoryProtect ###
+### SbMemoryProtect
 
 Change the protection of `size_bytes` of memory regions, starting from
 `virtual_address`, to `flags`, returning `true` on success.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMemoryProtect(void *virtual_address, int64_t size_bytes, int flags)
 ```
 
-### SbMemoryReallocate ###
+### SbMemoryReallocate
 
 Attempts to resize `memory` to be at least `size` bytes, without touching the
 contents of memory.
@@ -298,39 +298,39 @@
 `memory` will be resized. If `size` is `0`, the function may return `NULL` or it
 may return a unique pointer value that can be passed to SbMemoryDeallocate.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryReallocate(void *memory, size_t size)
 ```
 
-### SbMemoryReallocateChecked ###
+### SbMemoryReallocateChecked
 
 Same as SbMemoryReallocateUnchecked, but will abort() in the case of an
 allocation failure.
 
 DO NOT CALL. Call SbMemoryReallocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryReallocateChecked(void *memory, size_t size)
 ```
 
-### SbMemoryReallocateUnchecked ###
+### SbMemoryReallocateUnchecked
 
 This is the implementation of SbMemoryReallocate that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryReallocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryReallocateUnchecked(void *memory, size_t size)
 ```
 
-### SbMemoryUnmap ###
+### SbMemoryUnmap
 
 Unmap `size_bytes` of physical pages starting from `virtual_address`, returning
 `true` on success. After this function completes, [virtual_address,
@@ -340,7 +340,7 @@
 `(void*)0xA000`, and another call to `SbMemoryMap(0x1000)` returns
 `(void*)0xB000`, `SbMemoryUnmap(0xA000, 0x2000)` should free both regions.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMemoryUnmap(void *virtual_address, int64_t size_bytes)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/memory_reporter.md b/cobalt/site/docs/reference/starboard/modules/13/memory_reporter.md
index 4b4a539..433d004 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/memory_reporter.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/memory_reporter.md
@@ -1,57 +1,57 @@
----
-layout: doc
-title: "Starboard Module Reference: memory_reporter.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `memory_reporter.h`
 
 Provides an interface for memory reporting.
 
-## Typedefs ##
+## Typedefs
 
-### SbMemoryReporterOnAlloc ###
+### SbMemoryReporterOnAlloc
 
 A function to report a memory allocation from SbMemoryAllocate(). Note that
 operator new calls SbMemoryAllocate which will delegate to this callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnAlloc) (void *context, const void *memory, size_t size)
 ```
 
-### SbMemoryReporterOnDealloc ###
+### SbMemoryReporterOnDealloc
 
 A function to report a memory deallocation from SbMemoryDeallcoate(). Note that
 operator delete calls SbMemoryDeallocate which will delegate to this callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnDealloc) (void *context, const void *memory)
 ```
 
-### SbMemoryReporterOnMapMemory ###
+### SbMemoryReporterOnMapMemory
 
 A function to report a memory mapping from SbMemoryMap().
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnMapMemory) (void *context, const void *memory, size_t size)
 ```
 
-### SbMemoryReporterOnUnMapMemory ###
+### SbMemoryReporterOnUnMapMemory
 
 A function to report a memory unmapping from SbMemoryUnmap().
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnUnMapMemory) (void *context, const void *memory, size_t size)
 ```
 
-## Structs ##
+## Structs
 
-### SbMemoryReporter ###
+### SbMemoryReporter
 
 SbMemoryReporter allows memory reporting via user-supplied functions. The void*
 context is passed to every call back. It's strongly recommended that C-Style
@@ -59,7 +59,7 @@
 compiler. For example, SbMemoryReporter mem_reporter = { MallocCallback, ....
 context };
 
-#### Members ####
+#### Members
 
 *   `SbMemoryReporterOnAlloc on_alloc_cb`
 
@@ -77,9 +77,9 @@
 
     Optional, is passed to callbacks as first argument.
 
-## Functions ##
+## Functions
 
-### SbMemorySetReporter ###
+### SbMemorySetReporter
 
 Sets the MemoryReporter. Any previous memory reporter is unset. No lifetime
 management is done internally on input pointer.
@@ -96,7 +96,7 @@
 SbMemoryReporter* mem_reporter = new ...; SbMemorySetReporter(&mem_reporter);
 ... SbMemorySetReporter(NULL); delete mem_reporter; // May crash.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMemorySetReporter(struct SbMemoryReporter *tracker)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/microphone.md b/cobalt/site/docs/reference/starboard/modules/13/microphone.md
index 1379f86..497cbe9 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/microphone.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/microphone.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: microphone.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `microphone.h`
 
 Defines functions for microphone creation, control, audio data fetching, and
 destruction. This module supports multiple calls to `SbMicrophoneOpen` and
@@ -31,23 +31,23 @@
 
 1.  Destroy the microphone with `SbMicrophoneDestroy`.
 
-## Macros ##
+## Macros
 
-### kSbMicrophoneIdInvalid ###
+### kSbMicrophoneIdInvalid
 
 Well-defined value for an invalid microphone ID handle.
 
-### kSbMicrophoneInvalid ###
+### kSbMicrophoneInvalid
 
 Well-defined value for an invalid microphone handle.
 
-## Enums ##
+## Enums
 
-### SbMicrophoneType ###
+### SbMicrophoneType
 
 All possible microphone types.
 
-#### Values ####
+#### Values
 
 *   `kSbMicrophoneCamera`
 
@@ -66,37 +66,37 @@
     Unknown microphone type. The microphone could be different than the other
     enum descriptions or could fall under one of those descriptions.
 
-## Typedefs ##
+## Typedefs
 
-### SbMicrophone ###
+### SbMicrophone
 
 An opaque handle to an implementation-private structure that represents a
 microphone.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbMicrophonePrivate* SbMicrophone
 ```
 
-### SbMicrophoneId ###
+### SbMicrophoneId
 
 An opaque handle to an implementation-private structure that represents a
 microphone ID.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbMicrophoneIdPrivate* SbMicrophoneId
 ```
 
-## Structs ##
+## Structs
 
-### SbMicrophoneInfo ###
+### SbMicrophoneInfo
 
 Microphone information.
 
-#### Members ####
+#### Members
 
 *   `SbMicrophoneId id`
 
@@ -116,9 +116,9 @@
     of the microphone type. For example, "Headset Microphone". The string must
     be null terminated.
 
-## Functions ##
+## Functions
 
-### SbMicrophoneClose ###
+### SbMicrophoneClose
 
 Closes the microphone port, stops recording audio on `microphone`, and clears
 the unread buffer if it is not empty. If the microphone has already been
@@ -127,13 +127,13 @@
 
 `microphone`: The microphone to close.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMicrophoneClose(SbMicrophone microphone)
 ```
 
-### SbMicrophoneCreate ###
+### SbMicrophoneCreate
 
 Creates a microphone with the specified ID, audio sample rate, and cached audio
 buffer size. Starboard only requires support for creating one microphone at a
@@ -153,25 +153,25 @@
 this buffer in smaller chunks than this size. This parameter must be set to a
 value greater than zero and the ideal size is `2^n`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMicrophone SbMicrophoneCreate(SbMicrophoneId id, int sample_rate_in_hz, int buffer_size_bytes)
 ```
 
-### SbMicrophoneDestroy ###
+### SbMicrophoneDestroy
 
 Destroys a microphone. If the microphone is in started state, it is first
 stopped and then destroyed. Any data that has been recorded and not read is
 thrown away.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMicrophoneDestroy(SbMicrophone microphone)
 ```
 
-### SbMicrophoneGetAvailable ###
+### SbMicrophoneGetAvailable
 
 Retrieves all currently available microphone information and stores it in
 `out_info_array`. The return value is the number of the available microphones.
@@ -184,43 +184,43 @@
 placed into this output parameter. `info_array_size`: The size of
 `out_info_array`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMicrophoneGetAvailable(SbMicrophoneInfo *out_info_array, int info_array_size)
 ```
 
-### SbMicrophoneIdIsValid ###
+### SbMicrophoneIdIsValid
 
 Indicates whether the given microphone ID is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbMicrophoneIdIsValid(SbMicrophoneId id)
 ```
 
-### SbMicrophoneIsSampleRateSupported ###
+### SbMicrophoneIsSampleRateSupported
 
 Indicates whether the microphone supports the sample rate.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMicrophoneIsSampleRateSupported(SbMicrophoneId id, int sample_rate_in_hz)
 ```
 
-### SbMicrophoneIsValid ###
+### SbMicrophoneIsValid
 
 Indicates whether the given microphone is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbMicrophoneIsValid(SbMicrophone microphone)
 ```
 
-### SbMicrophoneOpen ###
+### SbMicrophoneOpen
 
 Opens the microphone port and starts recording audio on `microphone`.
 
@@ -230,13 +230,13 @@
 open. `microphone`: The microphone that will be opened and will start recording
 audio.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMicrophoneOpen(SbMicrophone microphone)
 ```
 
-### SbMicrophoneRead ###
+### SbMicrophoneRead
 
 Retrieves the recorded audio data from the microphone and writes that data to
 `out_audio_data`.
@@ -255,7 +255,7 @@
 smaller than `min_read_size` of `SbMicrophoneInfo`, the extra audio data that
 has already been read from the device is discarded.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMicrophoneRead(SbMicrophone microphone, void *out_audio_data, int audio_data_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/mutex.md b/cobalt/site/docs/reference/starboard/modules/13/mutex.md
index 58f1907..9c18999 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/mutex.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/mutex.md
@@ -1,24 +1,24 @@
----
-layout: doc
-title: "Starboard Module Reference: mutex.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `mutex.h`
 
 Defines a mutually exclusive lock that can be used to coordinate with other
 threads.
 
-## Macros ##
+## Macros
 
-### SB_MUTEX_MAX_SIZE ###
+### SB_MUTEX_MAX_SIZE
 
 Max size of the SbMutex type.
 
-## Enums ##
+## Enums
 
-### SbMutexResult ###
+### SbMutexResult
 
 Enumeration of possible results from acquiring a mutex.
 
-#### Values ####
+#### Values
 
 *   `kSbMutexAcquired`
 
@@ -30,22 +30,22 @@
 
     The mutex has already been destroyed.
 
-## Typedefs ##
+## Typedefs
 
-### SbMutex ###
+### SbMutex
 
 An opaque handle to a mutex type with reserved memory buffer of size
 SB_MUTEX_MAX_SIZE and aligned at void pointer type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef union SbMutex  SbMutex
 ```
 
-## Functions ##
+## Functions
 
-### SbMutexAcquire ###
+### SbMutexAcquire
 
 Acquires `mutex`, blocking indefinitely. The return value identifies the
 acquisition result. SbMutexes are not reentrant, so a recursive acquisition
@@ -53,13 +53,13 @@
 
 `mutex`: The mutex to be acquired.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMutexResult SbMutexAcquire(SbMutex *mutex)
 ```
 
-### SbMutexAcquireTry ###
+### SbMutexAcquireTry
 
 Acquires `mutex`, without blocking. The return value identifies the acquisition
 result. SbMutexes are not reentrant, so a recursive acquisition has undefined
@@ -67,52 +67,52 @@
 
 `mutex`: The mutex to be acquired.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMutexResult SbMutexAcquireTry(SbMutex *mutex)
 ```
 
-### SbMutexCreate ###
+### SbMutexCreate
 
 Creates a new mutex. The return value indicates whether the function was able to
 create a new mutex.
 
 `out_mutex`: The handle to the newly created mutex.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMutexCreate(SbMutex *out_mutex)
 ```
 
-### SbMutexDestroy ###
+### SbMutexDestroy
 
 Destroys a mutex. The return value indicates whether the destruction was
 successful. Destroying a locked mutex results in undefined behavior.
 
 `mutex`: The mutex to be invalidated.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMutexDestroy(SbMutex *mutex)
 ```
 
-### SbMutexIsSuccess ###
+### SbMutexIsSuccess
 
 Indicates whether the given result is a success. A value of `true` indicates
 that the mutex was acquired.
 
 `result`: The result being checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbMutexIsSuccess(SbMutexResult result)
 ```
 
-### SbMutexRelease ###
+### SbMutexRelease
 
 Releases `mutex` held by the current thread. The return value indicates whether
 the release was successful. Releases should always be successful if `mutex` is
@@ -120,7 +120,7 @@
 
 `mutex`: The mutex to be released.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMutexRelease(SbMutex *mutex)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/once.md b/cobalt/site/docs/reference/starboard/modules/13/once.md
index ce3c4d6..3088cd9 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/once.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/once.md
@@ -1,43 +1,43 @@
----
-layout: doc
-title: "Starboard Module Reference: once.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `once.h`
 
 Onces represent initializations that should only ever happen once per process,
 in a thread-safe way.
 
-## Macros ##
+## Macros
 
-### SB_ONCE_MAX_SIZE ###
+### SB_ONCE_MAX_SIZE
 
 Max size of the SbOnceControl type.
 
-## Typedefs ##
+## Typedefs
 
-### SbOnceControl ###
+### SbOnceControl
 
 An opaque handle to a once control type with reserved memory buffer of size
 SB_ONCE_MAX_SIZE and aligned at void pointer type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef union SbOnceControl  SbOnceControl
 ```
 
-### SbOnceInitRoutine ###
+### SbOnceInitRoutine
 
 Function pointer type for methods that can be called via the SbOnce() system.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbOnceInitRoutine) (void)
 ```
 
-## Functions ##
+## Functions
 
-### SbOnce ###
+### SbOnce
 
 Thread-safely runs `init_routine` only once.
 
@@ -50,7 +50,7 @@
 *   If `once_control` or `init_routine` is invalid, the function returns
     `false`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbOnce(SbOnceControl *once_control, SbOnceInitRoutine init_routine)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/player.md b/cobalt/site/docs/reference/starboard/modules/13/player.md
index 3fd955d..0dab908 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/player.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/player.md
@@ -1,45 +1,45 @@
----
-layout: doc
-title: "Starboard Module Reference: player.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `player.h`
 
 Defines an interface for controlling playback of media elementary streams.
 
-## Macros ##
+## Macros
 
-### SB_PLAYER_INITIAL_TICKET ###
+### SB_PLAYER_INITIAL_TICKET
 
 The value of the initial ticket held by the player before the first seek. The
 player will use this ticket value to make the first call to SbPlayerStatusFunc
 with kSbPlayerStateInitialized.
 
-### SB_PLAYER_NO_DURATION ###
+### SB_PLAYER_NO_DURATION
 
 The value to pass into SbPlayerCreate's `duration_pts` argument for cases where
 the duration is unknown, such as for live streams.
 
-### kSbPlayerInvalid ###
+### kSbPlayerInvalid
 
 Well-defined value for an invalid player.
 
-## Enums ##
+## Enums
 
-### SbPlayerDecoderState ###
+### SbPlayerDecoderState
 
 An indicator of whether the decoder can accept more samples.
 
-#### Values ####
+#### Values
 
 *   `kSbPlayerDecoderStateNeedsData`
 
     The decoder is asking for one more sample.
 
-### SbPlayerSampleSideDataType ###
+### SbPlayerSampleSideDataType
 
 Identify the type of side data accompanied with `SbPlayerSampleInfo`, as side
 data may come from multiple sources.
 
-#### Values ####
+#### Values
 
 *   `kMatroskaBlockAdditional`
 
@@ -48,11 +48,11 @@
     . The first 8 bytes of the data contains the value of BlockAddID in big
     endian format, followed by the content of BlockAdditional.
 
-### SbPlayerState ###
+### SbPlayerState
 
 An indicator of the general playback state.
 
-#### Values ####
+#### Values
 
 *   `kSbPlayerStateInitialized`
 
@@ -76,31 +76,31 @@
 
     The player has been destroyed, and will send no more callbacks.
 
-## Typedefs ##
+## Typedefs
 
-### SbPlayer ###
+### SbPlayer
 
 An opaque handle to an implementation-private structure representing a player.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbPlayerPrivate* SbPlayer
 ```
 
-### SbPlayerDeallocateSampleFunc ###
+### SbPlayerDeallocateSampleFunc
 
 Callback to free the given sample buffer data. When more than one buffer are
 sent in SbPlayerWriteSample(), the implementation only has to call this callback
-with `sample_buffer` points to the the first buffer.
+with `sample_buffer` points to the first buffer.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerDeallocateSampleFunc) (SbPlayer player, void *context, const void *sample_buffer)
 ```
 
-### SbPlayerDecoderStatusFunc ###
+### SbPlayerDecoderStatusFunc
 
 Callback for decoder status updates, called in response to a call to
 SbPlayerSeek() or SbPlayerWriteSample(). This callback will never be called
@@ -114,45 +114,45 @@
 SbPlayerWriteEndOfStream(). The player implementation should update the decoder
 status again after such call to notify its user to continue writing more frames.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerDecoderStatusFunc) (SbPlayer player, void *context, SbMediaType type, SbPlayerDecoderState state, int ticket)
 ```
 
-### SbPlayerErrorFunc ###
+### SbPlayerErrorFunc
 
 Callback for player errors, that may set a `message`. `error`: indicates the
 error code. `message`: provides specific informative diagnostic message about
 the error condition encountered. It is ok for the message to be an empty string
 or NULL if no information is available.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerErrorFunc) (SbPlayer player, void *context, SbPlayerError error, const char *message)
 ```
 
-### SbPlayerStatusFunc ###
+### SbPlayerStatusFunc
 
 Callback for player status updates. These callbacks will happen on a different
 thread than the calling thread, and it is not valid to call SbPlayer functions
 from within this callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerStatusFunc) (SbPlayer player, void *context, SbPlayerState state, int ticket)
 ```
 
-## Structs ##
+## Structs
 
-### SbPlayerCreationParam ###
+### SbPlayerCreationParam
 
 The playback related parameters to pass into SbPlayerCreate() and
 SbPlayerGetPreferredOutputMode().
 
-#### Members ####
+#### Members
 
 *   `SbDrmSystem drm_system`
 
@@ -178,11 +178,11 @@
     should be made available for the application to pull via calls to
     SbPlayerGetCurrentFrame().
 
-### SbPlayerInfo2 ###
+### SbPlayerInfo2
 
 Information about the current media playback state.
 
-#### Members ####
+#### Members
 
 *   `SbTime current_media_timestamp`
 
@@ -229,11 +229,11 @@
     faster than normal speed. When it is less than one, the video is played in a
     slower than normal speed. Negative speeds are not supported.
 
-### SbPlayerSampleInfo ###
+### SbPlayerSampleInfo
 
 Information about the samples to be written into SbPlayerWriteSamples().
 
-#### Members ####
+#### Members
 
 *   `SbMediaType type`
 *   `const void * buffer`
@@ -266,12 +266,12 @@
     The DRM system related info for the media sample. This value is required for
     encrypted samples. Otherwise, it must be `NULL`.
 
-### SbPlayerSampleSideData ###
+### SbPlayerSampleSideData
 
 Side data accompanied with `SbPlayerSampleInfo`, it can be arbitrary binary data
 coming from multiple sources.
 
-#### Members ####
+#### Members
 
 *   `SbPlayerSampleSideDataType type`
 *   `const uint8_t * data`
@@ -282,9 +282,9 @@
 
     The size of the data pointed by `data`, in bytes.
 
-## Functions ##
+## Functions
 
-### SbPlayerDestroy ###
+### SbPlayerDestroy
 
 Destroys `player`, freeing all associated resources.
 
@@ -299,13 +299,13 @@
     SbPlayerDestroy has been called on that player. `player`: The player to be
     destroyed. Must not be `kSbPlayerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerDestroy(SbPlayer player)
 ```
 
-### SbPlayerGetCurrentFrame ###
+### SbPlayerGetCurrentFrame
 
 Given a player created with the kSbPlayerOutputModeDecodeToTexture output mode,
 it will return a SbDecodeTarget representing the current frame to be rasterized.
@@ -317,13 +317,13 @@
 
 `player` must not be `kSbPlayerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbDecodeTarget SbPlayerGetCurrentFrame(SbPlayer player)
 ```
 
-### SbPlayerGetMaximumNumberOfSamplesPerWrite ###
+### SbPlayerGetMaximumNumberOfSamplesPerWrite
 
 Writes a single sample of the given media type to `player`'s input stream. Its
 data may be passed in via more than one buffers. The lifetime of
@@ -337,13 +337,13 @@
 of sample for which the number is retrieved. See the `SbMediaType` enum in
 media.h.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbPlayerGetMaximumNumberOfSamplesPerWrite(SbPlayer player, SbMediaType sample_type)
 ```
 
-### SbPlayerGetPreferredOutputMode ###
+### SbPlayerGetPreferredOutputMode
 
 Returns the preferred output mode of the implementation when a video described
 by `creation_param` is played. It is assumed that it is okay to call
@@ -361,23 +361,23 @@
 and the implementation should try its best effort to return a valid output mode.
 `creation_param` must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbPlayerOutputMode SbPlayerGetPreferredOutputMode(const SbPlayerCreationParam *creation_param)
 ```
 
-### SbPlayerIsValid ###
+### SbPlayerIsValid
 
 Returns whether the given player handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbPlayerIsValid(SbPlayer player)
 ```
 
-### SbPlayerSetBounds ###
+### SbPlayerSetBounds
 
 Sets the player bounds to the given graphics plane coordinates. The changes do
 not take effect until the next graphics frame buffer swap. The default bounds
@@ -398,13 +398,13 @@
 `y`: The y-coordinate of the upper-left corner of the player. `width`: The width
 of the player, in pixels. `height`: The height of the player, in pixels.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerSetBounds(SbPlayer player, int z_index, int x, int y, int width, int height)
 ```
 
-### SbPlayerSetPlaybackRate ###
+### SbPlayerSetPlaybackRate
 
 Set the playback rate of the `player`. `rate` is default to 1.0 which indicates
 the playback is at its original speed. A `rate` greater than one will make the
@@ -419,13 +419,13 @@
 
 `player` must not be `kSbPlayerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbPlayerSetPlaybackRate(SbPlayer player, double playback_rate)
 ```
 
-### SbPlayerSetVolume ###
+### SbPlayerSetVolume
 
 Sets the player's volume.
 
@@ -434,13 +434,13 @@
 `0.0` and `1.0`, inclusive. A value of `0.0` means that the audio should be
 muted, and a value of `1.0` means that it should be played at full volume.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerSetVolume(SbPlayer player, double volume)
 ```
 
-### SbPlayerWriteEndOfStream ###
+### SbPlayerWriteEndOfStream
 
 Writes a marker to `player`'s input stream of `stream_type` indicating that
 there are no more samples for that media type for the remainder of this media
@@ -450,13 +450,13 @@
 `player`: The player to which the marker is written. `stream_type`: The type of
 stream for which the marker is written.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerWriteEndOfStream(SbPlayer player, SbMediaType stream_type)
 ```
 
-### SbPlayerWriteSample2 ###
+### SbPlayerWriteSample2
 
 `sample_type`: The type of sample being written. See the `SbMediaType` enum in
 media.h. `sample_infos`: A pointer to an array of SbPlayerSampleInfo with
@@ -468,7 +468,7 @@
 `sample_infos`. It has to be at least one, and less than the return value of
 SbPlayerGetMaximumNumberOfSamplesPerWrite().
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerWriteSample2(SbPlayer player, SbMediaType sample_type, const SbPlayerSampleInfo *sample_infos, int number_of_sample_infos)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/socket.md b/cobalt/site/docs/reference/starboard/modules/13/socket.md
index 9e0f81b..744c04e 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/socket.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/socket.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: socket.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `socket.h`
 
 Defines Starboard socket I/O functions. Starboard supports IPv4 and IPv6, TCP
 and UDP, server and client sockets. Some platforms may not support IPv6, some
@@ -18,19 +18,19 @@
 TODO: For platforms that do not support sockets at all, they must support at
 least a high-level HTTP client API (to be defined later).
 
-## Macros ##
+## Macros
 
-### kSbSocketInvalid ###
+### kSbSocketInvalid
 
 Well-defined value for an invalid socket handle.
 
-## Enums ##
+## Enums
 
-### SbSocketAddressType ###
+### SbSocketAddressType
 
 All possible address types.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketAddressTypeIpv4`
 
@@ -39,13 +39,13 @@
 
     An IPv6 address, which uses 16 entries of the address buffer.
 
-### SbSocketError ###
+### SbSocketError
 
 Enumeration of all Starboard socket operation results. Despite the enum name,
 note that the value actually describes the outcome of an operation, which is not
 always an error.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketOk`
 
@@ -63,11 +63,11 @@
 
     The operation failed for some other reason not specified above.
 
-### SbSocketProtocol ###
+### SbSocketProtocol
 
 All possible IP socket types.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketProtocolTcp`
 
@@ -77,11 +77,11 @@
     The UDP/IP protocol, an unreliable, connectionless, discrete packet
     (datagram) protocol.
 
-### SbSocketResolveFilter ###
+### SbSocketResolveFilter
 
 Bits that can be set when calling SbSocketResolve to filter the results.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketResolveFilterNone`
 
@@ -93,25 +93,25 @@
 
     Include Ipv6 addresses.
 
-## Typedefs ##
+## Typedefs
 
-### SbSocket ###
+### SbSocket
 
 A handle to a socket.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbSocketPrivate* SbSocket
 ```
 
-## Structs ##
+## Structs
 
-### SbSocketAddress ###
+### SbSocketAddress
 
 A representation of any possible supported address type.
 
-#### Members ####
+#### Members
 
 *   `uint8_t address`
 
@@ -126,11 +126,11 @@
     The port component of this socket address. If not specified, it will be
     zero, which is officially undefined.
 
-### SbSocketResolution ###
+### SbSocketResolution
 
 The result of a host name resolution.
 
-#### Members ####
+#### Members
 
 *   `SbSocketAddress* addresses`
 
@@ -139,9 +139,9 @@
 
     The length of the `addresses` array.
 
-## Functions ##
+## Functions
 
-### SbSocketAccept ###
+### SbSocketAccept
 
 Accepts a pending connection on `socket` and returns a new SbSocket representing
 that connection. This function sets the error on `socket` and returns
@@ -149,13 +149,13 @@
 
 `socket`: The SbSocket that is accepting a pending connection.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocket SbSocketAccept(SbSocket socket)
 ```
 
-### SbSocketBind ###
+### SbSocketBind
 
 Binds `socket` to a specific local interface and port specified by
 `local_address`. This function sets and returns the socket error if it is unable
@@ -170,24 +170,24 @@
 *   Setting the IP address to `0.0.0.0` means that the socket should be bound to
     all interfaces.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketBind(SbSocket socket, const SbSocketAddress *local_address)
 ```
 
-### SbSocketClearLastError ###
+### SbSocketClearLastError
 
 Clears the last error set on `socket`. The return value indicates whether the
 socket error was cleared.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketClearLastError(SbSocket socket)
 ```
 
-### SbSocketConnect ###
+### SbSocketConnect
 
 Opens a connection of `socket`'s type to the host and port specified by
 `address`. This function sets and returns the socket error if it is unable to
@@ -197,13 +197,13 @@
 `socket`: The type of connection that should be opened. `address`: The host and
 port to which the socket should connect.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketConnect(SbSocket socket, const SbSocketAddress *address)
 ```
 
-### SbSocketCreate ###
+### SbSocketCreate
 
 Creates a new non-blocking socket for protocol `protocol` using address family
 `address_type`.
@@ -216,13 +216,13 @@
 `address_type`: The type of IP address to use for the socket. `protocol`: The
 protocol to use for the socket.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocket SbSocketCreate(SbSocketAddressType address_type, SbSocketProtocol protocol)
 ```
 
-### SbSocketDestroy ###
+### SbSocketDestroy
 
 Destroys the `socket` by flushing it, closing any connection that may be active
 on it, and reclaiming any resources associated with it, including any
@@ -234,25 +234,25 @@
 
 `socket`: The SbSocket to be destroyed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketDestroy(SbSocket socket)
 ```
 
-### SbSocketFreeResolution ###
+### SbSocketFreeResolution
 
 Frees a resolution allocated by SbSocketResolve.
 
 `resolution`: The resolution to be freed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSocketFreeResolution(SbSocketResolution *resolution)
 ```
 
-### SbSocketGetInterfaceAddress ###
+### SbSocketGetInterfaceAddress
 
 Gets the source address and the netmask that would be used to connect to the
 destination. The netmask parameter is optional, and only populated if a non-NULL
@@ -288,26 +288,26 @@
 value is passed in, this function places the netmask associated with the source
 address in this output variable.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketGetInterfaceAddress(const SbSocketAddress *const destination, SbSocketAddress *out_source_address, SbSocketAddress *out_netmask)
 ```
 
-### SbSocketGetLastError ###
+### SbSocketGetLastError
 
 Returns the last error set on `socket`. If `socket` is not valid, this function
 returns `kSbSocketErrorFailed`.
 
 `socket`: The SbSocket that the last error is returned for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketGetLastError(SbSocket socket)
 ```
 
-### SbSocketGetLocalAddress ###
+### SbSocketGetLocalAddress
 
 Gets the address that this socket is bound to locally, if the socket is
 connected. The return value indicates whether the address was retrieved
@@ -316,59 +316,59 @@
 `socket`: The SbSocket for which the local address is retrieved. `out_address`:
 The SbSocket's local address.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketGetLocalAddress(SbSocket socket, SbSocketAddress *out_address)
 ```
 
-### SbSocketIsConnected ###
+### SbSocketIsConnected
 
 Indicates whether `socket` is connected to anything. Invalid sockets are not
 connected.
 
 `socket`: The SbSocket to be checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketIsConnected(SbSocket socket)
 ```
 
-### SbSocketIsConnectedAndIdle ###
+### SbSocketIsConnectedAndIdle
 
 Returns whether `socket` is connected to anything, and, if so, whether it is
 receiving any data.
 
 `socket`: The SbSocket to be checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketIsConnectedAndIdle(SbSocket socket)
 ```
 
-### SbSocketIsIpv6Supported ###
+### SbSocketIsIpv6Supported
 
 Returns whether IPV6 is supported on the current platform.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketIsIpv6Supported()
 ```
 
-### SbSocketIsValid ###
+### SbSocketIsValid
 
 Returns whether the given socket handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbSocketIsValid(SbSocket socket)
 ```
 
-### SbSocketJoinMulticastGroup ###
+### SbSocketJoinMulticastGroup
 
 Joins `socket` to an IP multicast group identified by `address`. The equivalent
 of IP_ADD_MEMBERSHIP. The return value indicates whether the socket was joined
@@ -377,13 +377,13 @@
 `socket`: The SbSocket to be joined to the IP multicast group. `address`: The
 location of the IP multicast group.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketJoinMulticastGroup(SbSocket socket, const SbSocketAddress *address)
 ```
 
-### SbSocketListen ###
+### SbSocketListen
 
 Causes `socket` to listen on the local address that `socket` was previously
 bound to by SbSocketBind. This function sets and returns the socket error if it
@@ -392,13 +392,13 @@
 
 `socket`: The SbSocket on which the function operates.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketListen(SbSocket socket)
 ```
 
-### SbSocketReceiveFrom ###
+### SbSocketReceiveFrom
 
 Reads up to `data_size` bytes from `socket` into `out_data` and places the
 source address of the packet in `out_source` if out_source is not NULL. Returns
@@ -420,13 +420,13 @@
 the socket. Must not be NULL. `data_size`: The number of bytes to read.
 `out_source`: The source address of the packet.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSocketReceiveFrom(SbSocket socket, char *out_data, int data_size, SbSocketAddress *out_source)
 ```
 
-### SbSocketResolve ###
+### SbSocketResolve
 
 Synchronously resolves `hostname` into the returned SbSocketResolution , which
 must be freed with SbSocketFreeResolution. The function returns `NULL` if it is
@@ -438,13 +438,13 @@
 However, if one IP address family filter is specified, only that address family
 is included. The function ignores unrecognized filter bits.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketResolution* SbSocketResolve(const char *hostname, int filters)
 ```
 
-### SbSocketSendTo ###
+### SbSocketSendTo
 
 Writes up to `data_size` bytes of `data` to `destination` via `socket`. Returns
 the number of bytes written, or a negative number if there is an error, in which
@@ -466,13 +466,13 @@
 connected persistently, so setting `destination` when sending to a TCP socket
 will cause an error.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSocketSendTo(SbSocket socket, const char *data, int data_size, const SbSocketAddress *destination)
 ```
 
-### SbSocketSetBroadcast ###
+### SbSocketSetBroadcast
 
 Sets the `SO_BROADCAST`, or equivalent, option to `value` on `socket`. The
 return value indicates whether the option was actually set.
@@ -483,13 +483,13 @@
 `socket`: The SbSocket for which the option is set. `value`: The new value for
 the option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetBroadcast(SbSocket socket, bool value)
 ```
 
-### SbSocketSetReceiveBufferSize ###
+### SbSocketSetReceiveBufferSize
 
 Sets the `SO_RCVBUF`, or equivalent, option to `size` on `socket`. The return
 value indicates whether the option was actually set.
@@ -497,13 +497,13 @@
 `socket`: The SbSocket for which the option is set. `size`: The value for the
 option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetReceiveBufferSize(SbSocket socket, int32_t size)
 ```
 
-### SbSocketSetReuseAddress ###
+### SbSocketSetReuseAddress
 
 Sets the `SO_REUSEADDR`, or equivalent, option to `value` on `socket`. The
 return value indicates whether the option was actually set.
@@ -514,13 +514,13 @@
 `socket`: The SbSocket for which the option is set. `value`: The new value for
 the option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetReuseAddress(SbSocket socket, bool value)
 ```
 
-### SbSocketSetSendBufferSize ###
+### SbSocketSetSendBufferSize
 
 Sets the `SO_SNDBUF`, or equivalent, option to `size` on `socket`. The return
 value indicates whether the option was actually set.
@@ -528,13 +528,13 @@
 `socket`: The SbSocket for which the option is set. `size`: The value for the
 option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetSendBufferSize(SbSocket socket, int32_t size)
 ```
 
-### SbSocketSetTcpKeepAlive ###
+### SbSocketSetTcpKeepAlive
 
 Sets the `SO_KEEPALIVE`, or equivalent, option to `value` on `socket`. The
 return value indicates whether the option was actually set.
@@ -545,13 +545,13 @@
 The time between keep-alive packets. This value is only relevant if `value` is
 `true`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetTcpKeepAlive(SbSocket socket, bool value, SbTime period)
 ```
 
-### SbSocketSetTcpNoDelay ###
+### SbSocketSetTcpNoDelay
 
 Sets the `TCP_NODELAY`, or equivalent, option to `value` on `socket`. The return
 value indicates whether the option was actually set.
@@ -564,13 +564,13 @@
 `socket`: The SbSocket for which the option is set. `value`: Indicates whether
 the Nagle algorithm should be disabled (`value`=`true`).
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetTcpNoDelay(SbSocket socket, bool value)
 ```
 
-### SbSocketSetTcpWindowScaling ###
+### SbSocketSetTcpWindowScaling
 
 Sets the `SO_WINSCALE`, or equivalent, option to `value` on `socket`. The return
 value indicates whether the option was actually set.
@@ -578,7 +578,7 @@
 `socket`: The SbSocket for which the option is set. `value`: The value for the
 option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetTcpWindowScaling(SbSocket socket, bool value)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/socket_waiter.md b/cobalt/site/docs/reference/starboard/modules/13/socket_waiter.md
index 738fafb..146938c 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/socket_waiter.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/socket_waiter.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: socket_waiter.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `socket_waiter.h`
 
 Allows a thread to wait on many sockets at once. The standard usage pattern
 would be for a single I/O thread to:
@@ -26,19 +26,19 @@
 queuing the work item, or the SbSocketWaiter is not otherwise guaranteed to wake
 up.
 
-## Macros ##
+## Macros
 
-### kSbSocketWaiterInvalid ###
+### kSbSocketWaiterInvalid
 
 Well-defined value for an invalid socket watcher handle.
 
-## Enums ##
+## Enums
 
-### SbSocketWaiterInterest ###
+### SbSocketWaiterInterest
 
 All the interests that a socket may register for on a waiter.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketWaiterInterestNone`
 
@@ -50,11 +50,11 @@
 
     An interest in or readiness to write to a socket without blocking.
 
-### SbSocketWaiterResult ###
+### SbSocketWaiterResult
 
 Possible reasons why a call to SbSocketWaiterWaitTimed returned.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketWaiterResultInvalid`
 
@@ -66,31 +66,31 @@
 
     The wait stopped because a call to SbSocketWaiterWakeUp was consumed.
 
-## Typedefs ##
+## Typedefs
 
-### SbSocketWaiter ###
+### SbSocketWaiter
 
 A handle to a socket waiter.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbSocketWaiterPrivate* SbSocketWaiter
 ```
 
-### SbSocketWaiterCallback ###
+### SbSocketWaiterCallback
 
 Function pointer for socket waiter callbacks.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbSocketWaiterCallback) (SbSocketWaiter waiter, SbSocket socket, void *context, int ready_interests)
 ```
 
-## Functions ##
+## Functions
 
-### SbSocketWaiterAdd ###
+### SbSocketWaiterAdd
 
 Adds a new socket to be waited on by the `waiter` with a bitfield of
 `interests`. This function should only be called on the thread that waits on
@@ -120,25 +120,25 @@
     `callback`, even if not all registered `interests` became ready, which
     allows for adding it again in the `callback`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketWaiterAdd(SbSocketWaiter waiter, SbSocket socket, void *context, SbSocketWaiterCallback callback, int interests, bool persistent)
 ```
 
-### SbSocketWaiterCreate ###
+### SbSocketWaiterCreate
 
 The results of two threads waiting on the same waiter is undefined and will not
 work. Except for the SbSocketWaiterWakeUp() function, SbSocketWaiters are not
 thread-safe and don't expect to be modified concurrently.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketWaiter SbSocketWaiterCreate()
 ```
 
-### SbSocketWaiterDestroy ###
+### SbSocketWaiterDestroy
 
 Destroys `waiter` and removes all sockets still registered by way of
 SbSocketWaiterAdd. This function may be called on any thread as long as there is
@@ -146,23 +146,23 @@
 
 `waiter`: The SbSocketWaiter to be destroyed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketWaiterDestroy(SbSocketWaiter waiter)
 ```
 
-### SbSocketWaiterIsValid ###
+### SbSocketWaiterIsValid
 
 Returns whether the given socket handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbSocketWaiterIsValid(SbSocketWaiter watcher)
 ```
 
-### SbSocketWaiterRemove ###
+### SbSocketWaiterRemove
 
 Removes a socket, previously added with SbSocketWaiterAdd(), from a waiter. This
 function should only be called on the thread that waits on this waiter.
@@ -174,26 +174,26 @@
 `waiter`: The waiter from which the socket is removed. `socket`: The socket to
 remove from the waiter.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketWaiterRemove(SbSocketWaiter waiter, SbSocket socket)
 ```
 
-### SbSocketWaiterWait ###
+### SbSocketWaiterWait
 
 Waits on all registered sockets, calling the registered callbacks if and when
 the corresponding sockets become ready for an interested operation. This version
 exits only after SbSocketWaiterWakeUp() is called. This function should only be
 called on the thread that waits on this waiter.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSocketWaiterWait(SbSocketWaiter waiter)
 ```
 
-### SbSocketWaiterWaitTimed ###
+### SbSocketWaiterWaitTimed
 
 Behaves similarly to SbSocketWaiterWait(), but this function also causes
 `waiter` to exit on its own after at least `duration` has passed if
@@ -207,13 +207,13 @@
 function may wait longer than `duration`, such as if the timeout expires while a
 callback is being fired.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketWaiterResult SbSocketWaiterWaitTimed(SbSocketWaiter waiter, SbTime duration)
 ```
 
-### SbSocketWaiterWakeUp ###
+### SbSocketWaiterWakeUp
 
 Wakes up `waiter` once. This is the only thread-safe waiter function. It can can
 be called from a SbSocketWaiterCallback to wake up its own waiter, and it can
@@ -230,7 +230,7 @@
 
 `waiter`: The socket waiter to be woken up.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSocketWaiterWakeUp(SbSocketWaiter waiter)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/speech_synthesis.md b/cobalt/site/docs/reference/starboard/modules/13/speech_synthesis.md
index e46a2ca..ea4ad46 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/speech_synthesis.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/speech_synthesis.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: speech_synthesis.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `speech_synthesis.h`
 
 A basic text-to-speech API intended to be used for audio accessibility.
 
@@ -11,29 +11,29 @@
 Note that these functions do not have to be thread-safe. They must only be
 called from a single application thread.
 
-## Functions ##
+## Functions
 
-### SbSpeechSynthesisCancel ###
+### SbSpeechSynthesisCancel
 
 Cancels all speaking and queued speech synthesis audio. Must return immediately.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSpeechSynthesisCancel()
 ```
 
-### SbSpeechSynthesisIsSupported ###
+### SbSpeechSynthesisIsSupported
 
 Returns whether the platform supports speech synthesis
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSpeechSynthesisIsSupported()
 ```
 
-### SbSpeechSynthesisSpeak ###
+### SbSpeechSynthesisSpeak
 
 Enqueues `text`, a UTF-8 string, to be spoken. Returns immediately.
 
@@ -44,7 +44,7 @@
 the current speaking should continue and this new text should be queued to play
 when the previous utterances are complete.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSpeechSynthesisSpeak(const char *text)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/storage.md b/cobalt/site/docs/reference/starboard/modules/13/storage.md
index c98207b..b486ac8 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/storage.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/storage.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: storage.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `storage.h`
 
 Defines a user-based Storage API. This is a simple, all-at-once BLOB storage and
 retrieval API that is intended for robust long-term, per-user storage. Some
@@ -15,27 +15,27 @@
 These APIs are NOT expected to be thread-safe, so either call them from a single
 thread, or perform proper synchronization around all calls.
 
-## Macros ##
+## Macros
 
-### kSbStorageInvalidRecord ###
+### kSbStorageInvalidRecord
 
 Well-defined value for an invalid storage record handle.
 
-## Typedefs ##
+## Typedefs
 
-### SbStorageRecord ###
+### SbStorageRecord
 
 A handle to an open storage record.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbStorageRecordPrivate* SbStorageRecord
 ```
 
-## Functions ##
+## Functions
 
-### SbStorageCloseRecord ###
+### SbStorageCloseRecord
 
 Closes `record`, synchronously ensuring that all written data is flushed. This
 function performs blocking I/O on the calling thread.
@@ -47,13 +47,13 @@
 `record`: The storage record to close. `record` is invalid after this point, and
 subsequent calls referring to `record` will fail.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbStorageCloseRecord(SbStorageRecord record)
 ```
 
-### SbStorageDeleteRecord ###
+### SbStorageDeleteRecord
 
 Deletes the `SbStorageRecord` for `user` named `name`. The return value
 indicates whether the record existed and was successfully deleted. If the record
@@ -68,36 +68,36 @@
 `user`: The user for whom the record will be deleted. `name`: The filesystem-
 safe name of the record to open.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbStorageDeleteRecord(SbUser user, const char *name)
 ```
 
-### SbStorageGetRecordSize ###
+### SbStorageGetRecordSize
 
 Returns the size of `record`, or `-1` if there is an error. This function
 performs blocking I/O on the calling thread.
 
 `record`: The record to retrieve the size of.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbStorageGetRecordSize(SbStorageRecord record)
 ```
 
-### SbStorageIsValidRecord ###
+### SbStorageIsValidRecord
 
 Returns whether the given storage record handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbStorageIsValidRecord(SbStorageRecord record)
 ```
 
-### SbStorageOpenRecord ###
+### SbStorageOpenRecord
 
 Opens and returns the SbStorageRecord for `user` named `name`, blocking I/O on
 the calling thread until the open is completed. If `user` is not a valid
@@ -111,13 +111,13 @@
 `user`: The user for which the storage record will be opened. `name`: The
 filesystem-safe name of the record to open.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbStorageRecord SbStorageOpenRecord(SbUser user, const char *name)
 ```
 
-### SbStorageReadRecord ###
+### SbStorageReadRecord
 
 Reads up to `data_size` bytes from `record`, starting at the beginning of the
 record. The function returns the actual number of bytes read, which must be <=
@@ -128,13 +128,13 @@
 `record`: The record to be read. `out_data`: The data read from the record.
 `data_size`: The amount of data, in bytes, to read.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbStorageReadRecord(SbStorageRecord record, char *out_data, int64_t data_size)
 ```
 
-### SbStorageWriteRecord ###
+### SbStorageWriteRecord
 
 Replaces the data in `record` with `data_size` bytes from `data`. This function
 always deletes any previous data in that record. The return value indicates
@@ -151,7 +151,7 @@
 `record`: The record to be written to. `data`: The data to write to the record.
 `data_size`: The amount of `data`, in bytes, to write to the record.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbStorageWriteRecord(SbStorageRecord record, const char *data, int64_t data_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/string.md b/cobalt/site/docs/reference/starboard/modules/13/string.md
index 95790d4..5e97968 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/string.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/string.md
@@ -1,13 +1,13 @@
----
-layout: doc
-title: "Starboard Module Reference: string.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `string.h`
 
 Defines functions for interacting with c-style strings.
 
-## Functions ##
+## Functions
 
-### SbStringCompareNoCase ###
+### SbStringCompareNoCase
 
 Compares two strings, ignoring differences in case. The return value is:
 
@@ -21,13 +21,13 @@
 
 `string1`: The first string to compare. `string2`: The second string to compare.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringCompareNoCase(const char *string1, const char *string2)
 ```
 
-### SbStringCompareNoCaseN ###
+### SbStringCompareNoCaseN
 
 Compares the first `count` characters of two strings, ignoring differences in
 case. The return value is:
@@ -43,13 +43,13 @@
 `string1`: The first string to compare. `string2`: The second string to compare.
 `count`: The number of characters to compare.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringCompareNoCaseN(const char *string1, const char *string2, size_t count)
 ```
 
-### SbStringDuplicate ###
+### SbStringDuplicate
 
 Copies `source` into a buffer that is allocated by this function and that can be
 freed with SbMemoryDeallocate. This function is meant to be a drop-in
@@ -57,13 +57,13 @@
 
 `source`: The string to be copied.
 
-#### Declaration ####
+#### Declaration
 
 ```
 char* SbStringDuplicate(const char *source)
 ```
 
-### SbStringFormat ###
+### SbStringFormat
 
 Produces a string formatted with `format` and `arguments`, placing as much of
 the result that will fit into `out_buffer`. The return value specifies the
@@ -76,13 +76,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `arguments`: Variable arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringFormat(char *out_buffer, size_t buffer_size, const char *format, va_list arguments) SB_PRINTF_FORMAT(3
 ```
 
-### SbStringFormatF ###
+### SbStringFormatF
 
 An inline wrapper of SbStringFormat that converts from ellipsis to va_args. This
 function is meant to be a drop-in replacement for `snprintf`.
@@ -91,13 +91,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `...`: Arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int static int static int SbStringFormatF(char *out_buffer, size_t buffer_size, const char *format,...) SB_PRINTF_FORMAT(3
 ```
 
-### SbStringFormatUnsafeF ###
+### SbStringFormatUnsafeF
 
 An inline wrapper of SbStringFormat that is meant to be a drop-in replacement
 for the unsafe but commonly used `sprintf`.
@@ -106,13 +106,13 @@
 string that specifies how the data should be formatted. `...`: Arguments used in
 the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int static int SbStringFormatUnsafeF(char *out_buffer, const char *format,...) SB_PRINTF_FORMAT(2
 ```
 
-### SbStringFormatWide ###
+### SbStringFormatWide
 
 This function is identical to SbStringFormat, but is for wide characters. It is
 meant to be a drop-in replacement for `vswprintf`.
@@ -121,13 +121,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `arguments`: Variable arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringFormatWide(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format, va_list arguments)
 ```
 
-### SbStringFormatWideF ###
+### SbStringFormatWideF
 
 An inline wrapper of SbStringFormatWide that converts from ellipsis to
 `va_args`.
@@ -136,13 +136,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `...`: Arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbStringFormatWideF(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format,...)
 ```
 
-### SbStringScan ###
+### SbStringScan
 
 Scans `buffer` for `pattern`, placing the extracted values in `arguments`. The
 return value specifies the number of successfully matched items, which may be
@@ -154,20 +154,20 @@
 for in `buffer`. `arguments`: Values matching `pattern` that were extracted from
 `buffer`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringScan(const char *buffer, const char *pattern, va_list arguments)
 ```
 
-### SbStringScanF ###
+### SbStringScanF
 
 An inline wrapper of SbStringScan that converts from ellipsis to `va_args`. This
 function is meant to be a drop-in replacement for `sscanf`. `buffer`: The string
 to scan for the pattern. `pattern`: The string to search for in `buffer`. `...`:
 Values matching `pattern` that were extracted from `buffer`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbStringScanF(const char *buffer, const char *pattern,...)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/system.md b/cobalt/site/docs/reference/starboard/modules/13/system.md
index b02dc01..d3052d1 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/system.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/system.md
@@ -1,21 +1,21 @@
----
-layout: doc
-title: "Starboard Module Reference: system.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `system.h`
 
 Defines a broad set of APIs that allow the client application to query build and
 runtime properties of the enclosing system.
 
-## Enums ##
+## Enums
 
-### SbSystemCapabilityId ###
+### SbSystemCapabilityId
 
 Runtime capabilities are boolean properties of a platform that can't be
 determined at compile-time. They may vary from device to device, but they will
 not change over the course of a single execution. They often specify particular
 behavior of other APIs within the bounds of their operating range.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemCapabilityReversedEnterAndBack`
 
@@ -26,11 +26,11 @@
     only if) a system has this capability will SbSystemGetTotalGPUMemory() and
     SbSystemGetUsedGPUMemory() be valid to call.
 
-### SbSystemConnectionType ###
+### SbSystemConnectionType
 
 Enumeration of network connection types.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemConnectionTypeWired`
 
@@ -42,11 +42,11 @@
 
     The system connection type is unknown.
 
-### SbSystemDeviceType ###
+### SbSystemDeviceType
 
 Enumeration of device types.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemDeviceTypeBlueRayDiskPlayer`
 
@@ -76,11 +76,11 @@
 
     Unknown device.
 
-### SbSystemPathId ###
+### SbSystemPathId
 
 Enumeration of special paths that the platform can define.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPathContentDirectory`
 
@@ -119,22 +119,22 @@
     for storing the updates. See
     starboard/doc/evergreen/cobalt_evergreen_overview.md
 
-### SbSystemPlatformErrorResponse ###
+### SbSystemPlatformErrorResponse
 
 Possible responses for `SbSystemPlatformErrorCallback`.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPlatformErrorResponsePositive`
 *   `kSbSystemPlatformErrorResponseNegative`
 *   `kSbSystemPlatformErrorResponseCancel`
 
-### SbSystemPlatformErrorType ###
+### SbSystemPlatformErrorType
 
 Enumeration of possible values for the `type` parameter passed to the
 `SbSystemRaisePlatformError` function.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPlatformErrorTypeConnectionError`
 
@@ -143,12 +143,12 @@
     `kSbSystemPlatformErrorResponsePositive` then the request should be retried,
     otherwise the app should be stopped.
 
-### SbSystemPropertyId ###
+### SbSystemPropertyId
 
 System properties that can be queried for. Many of these are used in User-Agent
 string generation.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPropertyCertificationScope`
 
@@ -196,9 +196,9 @@
 
     A field that, if available, is appended to the user agent
 
-## Typedefs ##
+## Typedefs
 
-### SbSystemComparator ###
+### SbSystemComparator
 
 Pointer to a function to compare two items. The return value uses standard
 `*cmp` semantics:
@@ -211,23 +211,23 @@
 
 `a`: The first value to compare. `b`: The second value to compare.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int(* SbSystemComparator) (const void *a, const void *b)
 ```
 
-### SbSystemError ###
+### SbSystemError
 
 A type that can represent a system error code across all Starboard platforms.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int SbSystemError
 ```
 
-### SbSystemPlatformErrorCallback ###
+### SbSystemPlatformErrorCallback
 
 Type of callback function that may be called in response to an error
 notification from `SbSystemRaisePlatformError`. `response` is a code to indicate
@@ -235,56 +235,56 @@
 the error. `user_data` is the opaque pointer that was passed to the call to
 `SbSystemRaisePlatformError`.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbSystemPlatformErrorCallback) (SbSystemPlatformErrorResponse response, void *user_data)
 ```
 
-## Functions ##
+## Functions
 
-### SbSystemBreakIntoDebugger ###
+### SbSystemBreakIntoDebugger
 
 Breaks the current program into the debugger, if a debugger is attached. If a
 debugger is not attached, this function aborts the program.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SB_NORETURN void SbSystemBreakIntoDebugger()
 ```
 
-### SbSystemClearLastError ###
+### SbSystemClearLastError
 
 Clears the last error set by a Starboard call in the current thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemClearLastError()
 ```
 
-### SbSystemGetConnectionType ###
+### SbSystemGetConnectionType
 
 Returns the device's current network connection type.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSystemConnectionType SbSystemGetConnectionType()
 ```
 
-### SbSystemGetDeviceType ###
+### SbSystemGetDeviceType
 
 Returns the type of the device.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSystemDeviceType SbSystemGetDeviceType()
 ```
 
-### SbSystemGetErrorString ###
+### SbSystemGetErrorString
 
 Generates a human-readable string for an error. The return value specifies the
 total desired length of the string.
@@ -293,13 +293,13 @@
 The generated string. This value may be null, and it is always terminated with a
 null byte. `string_length`: The maximum length of the error string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSystemGetErrorString(SbSystemError error, char *out_string, int string_length)
 ```
 
-### SbSystemGetExtension ###
+### SbSystemGetExtension
 
 Returns pointer to a constant global struct implementing the extension named
 `name`, if it is implemented. Otherwise return NULL. The `name` string must not
@@ -321,25 +321,25 @@
 ignored. As the version of extensions are incremented, fields may be added to
 the end of the struct, but never removed (only deprecated).
 
-#### Declaration ####
+#### Declaration
 
 ```
 const void* SbSystemGetExtension(const char *name)
 ```
 
-### SbSystemGetLastError ###
+### SbSystemGetLastError
 
 Gets the last platform-specific error code produced by any Starboard call in the
 current thread for diagnostic purposes. Semantic reactions to Starboard function
 call results should be modeled explicitly.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSystemError SbSystemGetLastError()
 ```
 
-### SbSystemGetLocaleId ###
+### SbSystemGetLocaleId
 
 Gets the system's current POSIX-style Locale ID. The locale represents the
 location, language, and cultural conventions that the system wants to use, which
@@ -356,25 +356,25 @@
 
 For more information than you probably want about POSIX locales, see: [http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html)
 
-#### Declaration ####
+#### Declaration
 
 ```
 const char* SbSystemGetLocaleId()
 ```
 
-### SbSystemGetNumberOfProcessors ###
+### SbSystemGetNumberOfProcessors
 
 Returns the number of processor cores available to this application. If the
 process is sandboxed to a subset of the physical cores, the function returns
 that sandboxed limit.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSystemGetNumberOfProcessors()
 ```
 
-### SbSystemGetProperty ###
+### SbSystemGetProperty
 
 Retrieves the platform-defined system property specified by `property_id` and
 places its value as a zero-terminated string into the user-allocated `out_value`
@@ -395,13 +395,13 @@
 defined system property specified by `property_id`. `value_length`: The length
 of the system property.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemGetProperty(SbSystemPropertyId property_id, char *out_value, int value_length)
 ```
 
-### SbSystemGetRandomData ###
+### SbSystemGetRandomData
 
 A cryptographically secure random number generator that produces an arbitrary,
 non-negative number of `buffer_size` random, non-negative bytes. The generated
@@ -410,24 +410,24 @@
 `out_buffer`: A pointer for the generated random number. This value must not be
 null. `buffer_size`: The size of the random number, in bytes.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemGetRandomData(void *out_buffer, int buffer_size)
 ```
 
-### SbSystemGetRandomUInt64 ###
+### SbSystemGetRandomUInt64
 
 A cryptographically secure random number generator that gets 64 random bits and
 returns them as an `uint64_t`. This function does not require manual seeding.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint64_t SbSystemGetRandomUInt64()
 ```
 
-### SbSystemGetStack ###
+### SbSystemGetStack
 
 Places up to `stack_size` instruction pointer addresses of the current execution
 stack into `out_stack`. The return value specifies the number of entries added.
@@ -444,62 +444,62 @@
 `stack_size`: The maximum number of instruction pointer addresses to be placed
 into `out_stack` from the current execution stack.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSystemGetStack(void **out_stack, int stack_size)
 ```
 
-### SbSystemGetTotalCPUMemory ###
+### SbSystemGetTotalCPUMemory
 
 Returns the total CPU memory (in bytes) potentially available to this
 application. If the process is sandboxed to a maximum allowable limit, the
 function returns the lesser of the physical and sandbox limits.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetTotalCPUMemory()
 ```
 
-### SbSystemGetTotalGPUMemory ###
+### SbSystemGetTotalGPUMemory
 
 Returns the total GPU memory (in bytes) available for use by this application.
 This function may only be called the return value for calls to
 SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats) is `true`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetTotalGPUMemory()
 ```
 
-### SbSystemGetUsedCPUMemory ###
+### SbSystemGetUsedCPUMemory
 
 Returns the total physical CPU memory (in bytes) used by this application. This
 value should always be less than (or, in particularly exciting situations, equal
 to) SbSystemGetTotalCPUMemory().
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetUsedCPUMemory()
 ```
 
-### SbSystemGetUsedGPUMemory ###
+### SbSystemGetUsedGPUMemory
 
 Returns the current amount of GPU memory (in bytes) that is currently being used
 by this application. This function may only be called if the return value for
 calls to SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats) is
 `true`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetUsedGPUMemory()
 ```
 
-### SbSystemHasCapability ###
+### SbSystemHasCapability
 
 Returns whether the platform has the runtime capability specified by
 `capability_id`. Returns false for any unknown capabilities. This implementation
@@ -507,48 +507,48 @@
 
 `capability_id`: The runtime capability to check.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemHasCapability(SbSystemCapabilityId capability_id)
 ```
 
-### SbSystemHideSplashScreen ###
+### SbSystemHideSplashScreen
 
 Hides the system splash screen on systems that support a splash screen that is
 displayed while the application is loading. This function may be called from any
 thread and must be idempotent.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemHideSplashScreen()
 ```
 
-### SbSystemIsDebuggerAttached ###
+### SbSystemIsDebuggerAttached
 
 Attempts to determine whether the current program is running inside or attached
 to a debugger. The function returns `false` if neither of those cases is true.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemIsDebuggerAttached()
 ```
 
-### SbSystemNetworkIsDisconnected ###
+### SbSystemNetworkIsDisconnected
 
 Returns if the device is disconnected from network. "Disconnected" is chosen
 over connected because disconnection can be determined with more certainty than
 connection usually.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemNetworkIsDisconnected()
 ```
 
-### SbSystemRaisePlatformError ###
+### SbSystemRaisePlatformError
 
 Cobalt calls this function to notify the platform that an error has occurred in
 the application that the platform may need to handle. The platform is expected
@@ -570,13 +570,13 @@
 pointer that the platform should pass as an argument to the callback function,
 if it is called.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemRaisePlatformError(SbSystemPlatformErrorType type, SbSystemPlatformErrorCallback callback, void *user_data)
 ```
 
-### SbSystemRequestBlur ###
+### SbSystemRequestBlur
 
 Requests that the application move into the Blurred state at the next convenient
 point. This should roughly correspond to "unfocused application" in a
@@ -586,13 +586,13 @@
 the application. Before the `kSbEventTypeBlur` event is dispatched, some work
 may continue to be done, and unrelated system events may be dispatched.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestBlur()
 ```
 
-### SbSystemRequestConceal ###
+### SbSystemRequestConceal
 
 Requests that the application move into the Concealed state at the next
 convenient point. This should roughly correspond to "minimization" in a
@@ -607,13 +607,13 @@
 running background tasks. The expectation is that an external system event will
 bring the application out of the Concealed state.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestConceal()
 ```
 
-### SbSystemRequestFocus ###
+### SbSystemRequestFocus
 
 Requests that the application move into the Started state at the next convenient
 point. This should roughly correspond to a "focused application" in a
@@ -624,13 +624,13 @@
 the application. Before `kSbEventTypeFocus` is dispatched, some work may
 continue to be done, and unrelated system events may be dispatched.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestFocus()
 ```
 
-### SbSystemRequestFreeze ###
+### SbSystemRequestFreeze
 
 Requests that the application move into the Frozen state at the next convenient
 point.
@@ -643,13 +643,13 @@
 The expectation is that an external system event will bring the application out
 of the Frozen state.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestFreeze()
 ```
 
-### SbSystemRequestReveal ###
+### SbSystemRequestReveal
 
 Requests that the application move into the Blurred state at the next convenient
 point. This should roughly correspond to a "focused application" in a
@@ -660,13 +660,13 @@
 the application. Before the `kSbEventTypeReveal` event is dispatched, some work
 may continue to be done, and unrelated system events may be dispatched.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestReveal()
 ```
 
-### SbSystemRequestStop ###
+### SbSystemRequestStop
 
 Requests that the application be terminated gracefully at the next convenient
 point. In the meantime, some work may continue to be done, and unrelated system
@@ -677,13 +677,13 @@
 `error_level`: An integer that serves as the return value for the process that
 is eventually terminated as a result of a call to this function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestStop(int error_level)
 ```
 
-### SbSystemSignWithCertificationSecretKey ###
+### SbSystemSignWithCertificationSecretKey
 
 Computes a HMAC-SHA256 digest of `message` into `digest` using the application's
 certification secret. The `message` and the `digest` pointers must not be NULL.
@@ -693,13 +693,13 @@
 an error, or if it is not implemented. In this case the contents of `digest`
 will be undefined.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemSignWithCertificationSecretKey(const uint8_t *message, size_t message_size_in_bytes, uint8_t *digest, size_t digest_size_in_bytes)
 ```
 
-### SbSystemSupportsResume ###
+### SbSystemSupportsResume
 
 Returns false if the platform doesn't need resume after suspend support. In such
 case Cobalt will free up the resource it retains for resume after suspend. Note
@@ -707,13 +707,13 @@
 kSbEventTypeResume to the event handler. The return value of this function
 cannot change over the life time of the application.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemSupportsResume()
 ```
 
-### SbSystemSymbolize ###
+### SbSystemSymbolize
 
 Looks up `address` as an instruction pointer and places up to (`buffer_size -
 1`) characters of the symbol associated with it in `out_buffer`, which must not
@@ -725,7 +725,7 @@
 This function is used in crash signal handlers and, therefore, it must be async-
 signal-safe on platforms that support signals.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemSymbolize(const void *address, char *out_buffer, int buffer_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/thread.md b/cobalt/site/docs/reference/starboard/modules/13/thread.md
index 8440477..81a8697 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/thread.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/thread.md
@@ -1,35 +1,35 @@
----
-layout: doc
-title: "Starboard Module Reference: thread.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `thread.h`
 
 Defines functionality related to thread creation and cleanup.
 
-## Macros ##
+## Macros
 
-### kSbThreadContextInvalid ###
+### kSbThreadContextInvalid
 
 Well-defined value for an invalid thread context.
 
-### kSbThreadInvalidId ###
+### kSbThreadInvalidId
 
 Well-defined constant value to mean "no thread ID."
 
-### kSbThreadLocalKeyInvalid ###
+### kSbThreadLocalKeyInvalid
 
 Well-defined constant value to mean "no thread local key."
 
-### kSbThreadNoAffinity ###
+### kSbThreadNoAffinity
 
 Well-defined constant value to mean "no affinity."
 
-### kSbThreadSamplerInvalid ###
+### kSbThreadSamplerInvalid
 
 Well-defined value for an invalid thread sampler.
 
-## Enums ##
+## Enums
 
-### SbThreadPriority ###
+### SbThreadPriority
 
 A spectrum of thread priorities. Platforms map them appropriately to their own
 priority system. Note that scheduling is platform-specific, and what these
@@ -39,7 +39,7 @@
 a given platform. The only guarantee is that each lower priority should be
 treated less-than-or-equal-to a higher priority.
 
-#### Values ####
+#### Values
 
 *   `kSbThreadPriorityLowest`
 
@@ -79,116 +79,116 @@
     inherit the priority of the spawning thread, or it may mean a specific
     default priority, or it may mean something else, depending on the platform.
 
-## Typedefs ##
+## Typedefs
 
-### SbThread ###
+### SbThread
 
 An opaque handle to a thread type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void* SbThread
 ```
 
-### SbThreadAffinity ###
+### SbThreadAffinity
 
 Type for thread core affinity. This generally will be a single cpu (or core or
 hyperthread) identifier. Some platforms may not support affinity, and some may
 have specific rules about how it must be used.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int32_t SbThreadAffinity
 ```
 
-### SbThreadContext ###
+### SbThreadContext
 
 A handle to the context of a frozen thread.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbThreadContextPrivate* SbThreadContext
 ```
 
-### SbThreadEntryPoint ###
+### SbThreadEntryPoint
 
 Function pointer type for SbThreadCreate. `context` is a pointer-sized bit of
 data passed in from the calling thread.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void*(* SbThreadEntryPoint) (void *context)
 ```
 
-### SbThreadId ###
+### SbThreadId
 
 An ID type that is unique per thread.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int32_t SbThreadId
 ```
 
-### SbThreadLocalDestructor ###
+### SbThreadLocalDestructor
 
 Function pointer type for Thread-Local destructors.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbThreadLocalDestructor) (void *value)
 ```
 
-### SbThreadLocalKey ###
+### SbThreadLocalKey
 
 A handle to a thread-local key.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbThreadLocalKeyPrivate* SbThreadLocalKey
 ```
 
-### SbThreadSampler ###
+### SbThreadSampler
 
 A handle to a thread sampler.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbThreadSamplerPrivate* SbThreadSampler
 ```
 
-## Functions ##
+## Functions
 
-### SbThreadContextGetPointer ###
+### SbThreadContextGetPointer
 
 Gets the specified pointer-type `property` from the specified `context`. Returns
 `true` if successful and `out_value` has been modified, otherwise returns
 `false` and `out_value` is not modified.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadContextGetPointer(SbThreadContext context, SbThreadContextProperty property, void **out_value)
 ```
 
-### SbThreadContextIsValid ###
+### SbThreadContextIsValid
 
 Returns whether the given thread context is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadContextIsValid(SbThreadContext context)
 ```
 
-### SbThreadCreate ###
+### SbThreadCreate
 
 Creates a new thread, which starts immediately.
 
@@ -214,13 +214,13 @@
 executed on the newly created thread. `context`: This value will be passed to
 the `entry_point` function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThread SbThreadCreate(int64_t stack_size, SbThreadPriority priority, SbThreadAffinity affinity, bool joinable, const char *name, SbThreadEntryPoint entry_point, void *context)
 ```
 
-### SbThreadCreateLocalKey ###
+### SbThreadCreateLocalKey
 
 Creates and returns a new, unique key for thread local data. If the function
 does not succeed, the function returns `kSbThreadLocalKeyInvalid`.
@@ -233,13 +233,13 @@
 `destructor`: A pointer to a function. The value may be NULL if no clean up is
 needed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadLocalKey SbThreadCreateLocalKey(SbThreadLocalDestructor destructor)
 ```
 
-### SbThreadDestroyLocalKey ###
+### SbThreadDestroyLocalKey
 
 Destroys thread local data for the specified key. The function is a no-op if the
 key is invalid (kSbThreadLocalKeyInvalid`) or has already been destroyed. This
@@ -247,13 +247,13 @@
 
 `key`: The key for which to destroy thread local data.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadDestroyLocalKey(SbThreadLocalKey key)
 ```
 
-### SbThreadDetach ###
+### SbThreadDetach
 
 Detaches `thread`, which prevents it from being joined. This is sort of like a
 non-blocking join. This function is a no-op if the thread is already detached or
@@ -261,33 +261,33 @@
 
 `thread`: The thread to be detached.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadDetach(SbThread thread)
 ```
 
-### SbThreadGetCurrent ###
+### SbThreadGetCurrent
 
 Returns the handle of the currently executing thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThread SbThreadGetCurrent()
 ```
 
-### SbThreadGetId ###
+### SbThreadGetId
 
 Returns the Thread ID of the currently executing thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadId SbThreadGetId()
 ```
 
-### SbThreadGetLocalValue ###
+### SbThreadGetLocalValue
 
 Returns the pointer-sized value for `key` in the currently executing thread's
 local storage. Returns `NULL` if key is `kSbThreadLocalKeyInvalid` or if the key
@@ -295,97 +295,97 @@
 
 `key`: The key for which to return the value.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbThreadGetLocalValue(SbThreadLocalKey key)
 ```
 
-### SbThreadGetName ###
+### SbThreadGetName
 
 Returns the debug name of the currently executing thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadGetName(char *buffer, int buffer_size)
 ```
 
-### SbThreadIsCurrent ###
+### SbThreadIsCurrent
 
 Returns whether `thread` is the current thread.
 
 `thread`: The thread to check.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsCurrent(SbThread thread)
 ```
 
-### SbThreadIsEqual ###
+### SbThreadIsEqual
 
 Indicates whether `thread1` and `thread2` refer to the same thread.
 
 `thread1`: The first thread to compare. `thread2`: The second thread to compare.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadIsEqual(SbThread thread1, SbThread thread2)
 ```
 
-### SbThreadIsValid ###
+### SbThreadIsValid
 
 Returns whether the given thread handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValid(SbThread thread)
 ```
 
-### SbThreadIsValidAffinity ###
+### SbThreadIsValidAffinity
 
 Returns whether the given thread affinity is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidAffinity(SbThreadAffinity affinity)
 ```
 
-### SbThreadIsValidId ###
+### SbThreadIsValidId
 
 Returns whether the given thread ID is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidId(SbThreadId id)
 ```
 
-### SbThreadIsValidLocalKey ###
+### SbThreadIsValidLocalKey
 
 Returns whether the given thread local variable key is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidLocalKey(SbThreadLocalKey key)
 ```
 
-### SbThreadIsValidPriority ###
+### SbThreadIsValidPriority
 
 Returns whether the given thread priority is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidPriority(SbThreadPriority priority)
 ```
 
-### SbThreadJoin ###
+### SbThreadJoin
 
 Joins the thread on which this function is called with joinable `thread`. This
 function blocks the caller until the designated thread exits, and then cleans up
@@ -403,36 +403,36 @@
 then the SbThreadJoin function populates it with the return value of the
 thread's `main` function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadJoin(SbThread thread, void **out_return)
 ```
 
-### SbThreadSamplerCreate ###
+### SbThreadSamplerCreate
 
 Creates a new thread sampler for the specified `thread`.
 
 If successful, this function returns the newly created handle. If unsuccessful,
 this function returns `kSbThreadSamplerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadSampler SbThreadSamplerCreate(SbThread thread)
 ```
 
-### SbThreadSamplerDestroy ###
+### SbThreadSamplerDestroy
 
 Destroys the `sampler` and frees whatever resources it was using.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadSamplerDestroy(SbThreadSampler sampler)
 ```
 
-### SbThreadSamplerFreeze ###
+### SbThreadSamplerFreeze
 
 Suspends execution of the thread that `sampler` was created for.
 
@@ -440,47 +440,47 @@
 from which properties may be read while the thread remains frozen. If
 unsuccessful, this function returns `kSbThreadContextInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadContext SbThreadSamplerFreeze(SbThreadSampler sampler)
 ```
 
-### SbThreadSamplerIsSupported ###
+### SbThreadSamplerIsSupported
 
 Whether the current platform supports thread sampling. The result of this
 function must not change over the course of the program, which means that the
 results of this function may be cached indefinitely. If this returns false,
 `SbThreadSamplerCreate` will return an invalid sampler.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadSamplerIsSupported()
 ```
 
-### SbThreadSamplerIsValid ###
+### SbThreadSamplerIsValid
 
 Returns whether the given thread sampler is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadSamplerIsValid(SbThreadSampler sampler)
 ```
 
-### SbThreadSamplerThaw ###
+### SbThreadSamplerThaw
 
 Resumes execution of the thread that `sampler` was created for. This invalidates
 the context returned from `SbThreadSamplerFreeze`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadSamplerThaw(SbThreadSampler sampler)
 ```
 
-### SbThreadSetLocalValue ###
+### SbThreadSetLocalValue
 
 Sets the pointer-sized value for `key` in the currently executing thread's local
 storage. The return value indicates whether `key` is valid and has not already
@@ -489,26 +489,26 @@
 `key`: The key for which to set the key value. `value`: The new pointer-sized
 key value.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadSetLocalValue(SbThreadLocalKey key, void *value)
 ```
 
-### SbThreadSetName ###
+### SbThreadSetName
 
 Sets the debug name of the currently executing thread by copying the specified
 name string.
 
 `name`: The name to assign to the thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadSetName(const char *name)
 ```
 
-### SbThreadSleep ###
+### SbThreadSleep
 
 Sleeps the currently executing thread.
 
@@ -516,17 +516,17 @@
 executing thread should sleep. The function is a no-op if this value is negative
 or `0`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadSleep(SbTime duration)
 ```
 
-### SbThreadYield ###
+### SbThreadYield
 
 Yields the currently executing thread, so another thread has a chance to run.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadYield()
diff --git a/cobalt/site/docs/reference/starboard/modules/13/time.md b/cobalt/site/docs/reference/starboard/modules/13/time.md
index 17ea6ad..e5c8cd2 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/time.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/time.md
@@ -1,59 +1,59 @@
----
-layout: doc
-title: "Starboard Module Reference: time.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `time.h`
 
 Provides access to system time and timers.
 
-## Macros ##
+## Macros
 
-### kSbTimeDay ###
+### kSbTimeDay
 
 One day in SbTime units (microseconds).
 
-### kSbTimeHour ###
+### kSbTimeHour
 
 One hour in SbTime units (microseconds).
 
-### kSbTimeMax ###
+### kSbTimeMax
 
 The maximum value of an SbTime.
 
-### kSbTimeMillisecond ###
+### kSbTimeMillisecond
 
 One millisecond in SbTime units (microseconds).
 
-### kSbTimeMinute ###
+### kSbTimeMinute
 
 One minute in SbTime units (microseconds).
 
-### kSbTimeNanosecondsPerMicrosecond ###
+### kSbTimeNanosecondsPerMicrosecond
 
 How many nanoseconds in one SbTime unit (microseconds).
 
-### kSbTimeSecond ###
+### kSbTimeSecond
 
 One second in SbTime units (microseconds).
 
-### kSbTimeToPosixDelta ###
+### kSbTimeToPosixDelta
 
 A term that can be added to an SbTime to convert it into the number of
 microseconds since the POSIX epoch.
 
-## Typedefs ##
+## Typedefs
 
-### SbTime ###
+### SbTime
 
 The number of microseconds since the epoch of January 1, 1601 UTC, or the number
 of microseconds between two times. Always microseconds, ALWAYS UTC.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int64_t SbTime
 ```
 
-### SbTimeMonotonic ###
+### SbTimeMonotonic
 
 A number of microseconds from some point. The main property of this time is that
 it increases monotonically. It should also be as high-resolution a timer as we
@@ -61,38 +61,38 @@
 without worrying about a system clock adjustment. It's not good for getting the
 wall clock time.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int64_t SbTimeMonotonic
 ```
 
-## Functions ##
+## Functions
 
-### SbTimeFromPosix ###
+### SbTimeFromPosix
 
 Converts microseconds from the POSIX epoch into an `SbTime`.
 
 `time`: A time that measures the number of microseconds since January 1, 1970,
 00:00:00, UTC.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbTime SbTimeFromPosix(int64_t time)
 ```
 
-### SbTimeGetMonotonicNow ###
+### SbTimeGetMonotonicNow
 
 Gets a monotonically increasing time representing right now.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTimeMonotonic SbTimeGetMonotonicNow()
 ```
 
-### SbTimeGetMonotonicThreadNow ###
+### SbTimeGetMonotonicThreadNow
 
 Gets a monotonically increasing time representing how long the current thread
 has been in the executing state (i.e. not pre-empted nor waiting on an event).
@@ -100,44 +100,44 @@
 execution time between two timestamps. If this is not available then
 SbTimeGetMonotonicNow() should be used.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTimeMonotonic SbTimeGetMonotonicThreadNow()
 ```
 
-### SbTimeGetNow ###
+### SbTimeGetNow
 
 Gets the current system time as an `SbTime`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTime SbTimeGetNow()
 ```
 
-### SbTimeIsTimeThreadNowSupported ###
+### SbTimeIsTimeThreadNowSupported
 
 Returns whether the current platform supports time thread now
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbTimeIsTimeThreadNowSupported()
 ```
 
-### SbTimeNarrow ###
+### SbTimeNarrow
 
 Safely narrows a number from a more precise unit to a less precise one. This
 function rounds negative values toward negative infinity.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int64_t SbTimeNarrow(int64_t time, int64_t divisor)
 ```
 
-### SbTimeToPosix ###
+### SbTimeToPosix
 
 Converts `SbTime` into microseconds from the POSIX epoch.
 
@@ -145,7 +145,7 @@
 January 1, 1601, UTC, or that measures the number of microseconds between two
 times.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int64_t SbTimeToPosix(SbTime time)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/time_zone.md b/cobalt/site/docs/reference/starboard/modules/13/time_zone.md
index 5768bc3..baad375 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/time_zone.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/time_zone.md
@@ -1,48 +1,47 @@
----
-layout: doc
-title: "Starboard Module Reference: time_zone.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `time_zone.h`
 
 Provides access to the system time zone information.
 
-## Typedefs ##
+## Typedefs
 
-### SbTimeZone ###
+### SbTimeZone
 
 The number of minutes west of the Greenwich Prime Meridian, NOT including
 Daylight Savings Time adjustments.
 
-For example: PST/PDT is 480 minutes (28800 seconds, 8 hours).
+For example: America/Los_Angeles is 480 minutes (28800 seconds, 8 hours).
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int SbTimeZone
 ```
 
-## Functions ##
+## Functions
 
-### SbTimeZoneGetCurrent ###
+### SbTimeZoneGetCurrent
 
 Gets the system's current SbTimeZone in minutes.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTimeZone SbTimeZoneGetCurrent()
 ```
 
-### SbTimeZoneGetName ###
+### SbTimeZoneGetName
 
-Gets a string representation of the current timezone. Note that the string
-representation can either be standard or daylight saving time. The output can be
-of the form: 1) A three-letter abbreviation such as "PST" or "PDT" (preferred).
-2) A time zone identifier such as "America/Los_Angeles" 3) An un-abbreviated
-name such as "Pacific Standard Time".
+Gets a string representation of the current timezone. The format should be in
+the IANA format [https://data.iana.org/time-zones/theory.html#naming](https://data.iana.org/time-zones/theory.html#naming)) .
+Names normally have the form AREA/LOCATION, where AREA is a continent or ocean,
+and LOCATION is a specific location within the area. Typical names are
+'Africa/Cairo', 'America/New_York', and 'Pacific/Honolulu'.
 
-#### Declaration ####
+#### Declaration
 
 ```
 const char* SbTimeZoneGetName()
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/types.md b/cobalt/site/docs/reference/starboard/modules/13/types.md
index 90867a6..e1f372c 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/types.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/types.md
@@ -1,15 +1,15 @@
----
-layout: doc
-title: "Starboard Module Reference: types.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `types.h`
 
 Provides a suite of standard types that should be universally available on all
 platforms, specifically focused on explicitly-sized integer types and booleans.
 This module also includes some related ubiquitous definitions like limits of the
 explicitly-sized integer types, and standard pointer and int32 sentinel values.
 
-## Macros ##
+## Macros
 
-### kSbInvalidInt ###
+### kSbInvalidInt
 
 A value that represents an int that is probably invalid.
diff --git a/cobalt/site/docs/reference/starboard/modules/13/ui_navigation.md b/cobalt/site/docs/reference/starboard/modules/13/ui_navigation.md
index a0ecfb1..cb41767 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/ui_navigation.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/ui_navigation.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: ui_navigation.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `ui_navigation.h`
 
 API to allow applications to take advantage of the platform's native UI engine.
 This is mainly to drive the animation of visual elements and to signal which of
@@ -19,20 +19,20 @@
 user interaction. If the navigation item is a container, then the content offset
 will also be queried to determine the placement of its content items.
 
-## Macros ##
+## Macros
 
-### kSbUiNavItemInvalid ###
+### kSbUiNavItemInvalid
 
 Well-defined value for an invalid navigation item.
 
-## Enums ##
+## Enums
 
-### SbUiNavItemType ###
+### SbUiNavItemType
 
 Navigation items may be one of the following types. This must be specified upon
 item creation and may not change during the item's lifespan.
 
-#### Values ####
+#### Values
 
 *   `kSbUiNavItemTypeFocus`
 
@@ -42,29 +42,29 @@
     This is a container of navigation items which can also be containers
     themselves or focusable items. Containers themselves cannot be focused.
 
-## Typedefs ##
+## Typedefs
 
-### SbUiNavItem ###
+### SbUiNavItem
 
 An opaque handle to an implementation-private structure representing a
 navigation item.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbUiNavItemPrivate* SbUiNavItem
 ```
 
-## Structs ##
+## Structs
 
-### SbUiNavCallbacks ###
+### SbUiNavCallbacks
 
 This structure specifies all the callbacks which the platform UI engine should
 invoke for various interaction events on navigation items. These callbacks may
 be invoked from any thread at any frequency. The `callback_context` is the value
 that was passed on creation of the relevant SbUiNavItem.
 
-#### Members ####
+#### Members
 
 *   `void(*onblur)(SbUiNavItem item, void *callback_context)`
 
@@ -77,12 +77,12 @@
     Invoke when an item's content offset is changed. This is only used with
     container items.
 
-### SbUiNavInterface ###
+### SbUiNavInterface
 
 This structure declares the interface to the UI navigation implementation. All
 function pointers must be specified if the platform supports UI navigation.
 
-#### Members ####
+#### Members
 
 *   `SbUiNavItem(*create_item)(SbUiNavItemType type, const SbUiNavCallbacks
     *callbacks, void *callback_context)`
@@ -237,7 +237,7 @@
     Call `update_function` with `context` to perform a series of UI navigation
     changes atomically before returning.
 
-### SbUiNavItemDir ###
+### SbUiNavItemDir
 
 Navigation items of type kSbUiNavItemTypeContainer have directionality. If
 directionality is not specified for a container, it should default to left-to-
@@ -270,12 +270,12 @@
   Bottom-to-top is similar to right-to-left, but for the Y position.
 ```
 
-#### Members ####
+#### Members
 
 *   `bool is_left_to_right`
 *   `bool is_top_to_bottom`
 
-### SbUiNavMatrix2x3 ###
+### SbUiNavMatrix2x3
 
 This represents a 2x3 transform matrix in row-major order.
 
@@ -284,38 +284,38 @@
 ///   | c d ty |
 ```
 
-#### Members ####
+#### Members
 
 *   `float m`
 
-### SbUiNavMatrix4 ###
+### SbUiNavMatrix4
 
 This represents a 4x4 transform matrix in row-major order.
 
-#### Members ####
+#### Members
 
 *   `float m`
 
-## Functions ##
+## Functions
 
-### SbUiNavGetInterface ###
+### SbUiNavGetInterface
 
 Retrieve the platform's UI navigation implementation. If the platform does not
 provide one, then return false without modifying `out_interface`. Otherwise,
 initialize all members of `out_interface` and return true. The `out_interface`
 pointer must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbUiNavGetInterface(SbUiNavInterface *out_interface)
 ```
 
-### SbUiNavItemIsValid ###
+### SbUiNavItemIsValid
 
 Returns whether the given navigation item handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbUiNavItemIsValid(SbUiNavItem item)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/user.md b/cobalt/site/docs/reference/starboard/modules/13/user.md
index a30cc95..9442ced 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/user.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/user.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: user.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `user.h`
 
 Defines a user management API. This module defines functions only for managing
 signed-in users. Platforms that do not have users must still implement this API,
@@ -10,19 +10,19 @@
 These APIs are NOT expected to be thread-safe, so either call them from a single
 thread, or perform proper synchronization around all calls.
 
-## Macros ##
+## Macros
 
-### kSbUserInvalid ###
+### kSbUserInvalid
 
 Well-defined value for an invalid user.
 
-## Enums ##
+## Enums
 
-### SbUserPropertyId ###
+### SbUserPropertyId
 
 A set of string properties that can be queried on a user.
 
-#### Values ####
+#### Values
 
 *   `kSbUserPropertyAvatarUrl`
 
@@ -38,21 +38,21 @@
 
     A unique user ID of a user.
 
-## Typedefs ##
+## Typedefs
 
-### SbUser ###
+### SbUser
 
 A handle to a user.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbUserPrivate* SbUser
 ```
 
-## Functions ##
+## Functions
 
-### SbUserGetCurrent ###
+### SbUserGetCurrent
 
 Gets the current primary user, if one exists. This is the user that is
 determined, in a platform-specific way, to be the primary user controlling the
@@ -63,13 +63,13 @@
 It is expected that there will be a unique SbUser per signed-in user, and that
 the referenced objects will persist for the lifetime of the app.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbUser SbUserGetCurrent()
 ```
 
-### SbUserGetProperty ###
+### SbUserGetProperty
 
 Retrieves the value of `property_id` for `user` and places it in `out_value`.
 The function returns:
@@ -83,13 +83,13 @@
 The property for which the data is requested. `out_value`: The retrieved
 property value. `value_size`: The size of the retrieved property value.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbUserGetProperty(SbUser user, SbUserPropertyId property_id, char *out_value, int value_size)
 ```
 
-### SbUserGetPropertySize ###
+### SbUserGetPropertySize
 
 Returns the size of the value of `property_id` for `user`, INCLUDING the
 terminating null character. The function returns `0` if `user` is invalid or if
@@ -98,13 +98,13 @@
 `user`: The user for which property size data is being retrieved. `property_id`:
 The property for which the data is requested.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbUserGetPropertySize(SbUser user, SbUserPropertyId property_id)
 ```
 
-### SbUserGetSignedIn ###
+### SbUserGetSignedIn
 
 Gets a list of up to `users_size` signed-in users and places the results in
 `out_users`. The return value identifies the actual number of signed-in users,
@@ -116,17 +116,17 @@
 `out_users`: Handles for the retrieved users. `users_size`: The maximum number
 of signed-in users to retrieve.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbUserGetSignedIn(SbUser *out_users, int users_size)
 ```
 
-### SbUserIsValid ###
+### SbUserIsValid
 
 Returns whether the given user handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbUserIsValid(SbUser user)
diff --git a/cobalt/site/docs/reference/starboard/modules/13/window.md b/cobalt/site/docs/reference/starboard/modules/13/window.md
index 53cda4a..af49c22 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/window.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/window.md
@@ -1,40 +1,40 @@
----
-layout: doc
-title: "Starboard Module Reference: window.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `window.h`
 
 Provides functionality to handle Window creation and management.
 
-## Macros ##
+## Macros
 
-### kSbEventOnScreenKeyboardInvalidTicket ###
+### kSbEventOnScreenKeyboardInvalidTicket
 
 System-triggered OnScreenKeyboard events have ticket value
 kSbEventOnScreenKeyboardInvalidTicket.
 
-### kSbWindowInvalid ###
+### kSbWindowInvalid
 
 Well-defined value for an invalid window handle.
 
-## Typedefs ##
+## Typedefs
 
-### SbWindow ###
+### SbWindow
 
 A handle to a window.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbWindowPrivate* SbWindow
 ```
 
-## Structs ##
+## Structs
 
-### SbWindowOptions ###
+### SbWindowOptions
 
 Options that can be requested at window creation time.
 
-#### Members ####
+#### Members
 
 *   `SbWindowSize size`
 
@@ -48,25 +48,25 @@
 
     The name of the window to create.
 
-### SbWindowRect ###
+### SbWindowRect
 
 Defines a rectangle via a point `(x, y)` and a size `(width, height)`. This
 structure is used as output for SbWindowGetOnScreenKeyboardBoundingRect.
 
-#### Members ####
+#### Members
 
 *   `float x`
 *   `float y`
 *   `float width`
 *   `float height`
 
-### SbWindowSize ###
+### SbWindowSize
 
 The size of a window in graphics rendering coordinates. The width and height of
 a window should correspond to the size of the graphics surface used for drawing
 that would be created to back that window.
 
-#### Members ####
+#### Members
 
 *   `int width`
 
@@ -93,9 +93,9 @@
     A value of 0.0f means the ratio could not be determined, it should be
     assumed to be the same as the graphics resolution (i.e. 1.0f).
 
-## Functions ##
+## Functions
 
-### SbWindowBlurOnScreenKeyboard ###
+### SbWindowBlurOnScreenKeyboard
 
 Blur the on screen keyboard. Fire kSbEventTypeOnScreenKeyboardBlurred.
 kSbEventTypeOnScreenKeyboardBlurred has data `ticket`. Calling
@@ -103,13 +103,13 @@
 permitted. Calling SbWindowBlurOnScreenKeyboard while the on screen keyboard is
 not showing does nothing and does not fire any event.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowBlurOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowCreate ###
+### SbWindowCreate
 
 Creates and returns a new system window with the given `options`, which may be
 `NULL`. The function returns `kSbWindowInvalid` if it cannot create the
@@ -131,25 +131,25 @@
 
 `options`: Options that specify parameters for the window being created.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbWindow SbWindowCreate(const SbWindowOptions *options)
 ```
 
-### SbWindowDestroy ###
+### SbWindowDestroy
 
 Destroys `window`, reclaiming associated resources.
 
 `window`: The `SbWindow` to destroy.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowDestroy(SbWindow window)
 ```
 
-### SbWindowFocusOnScreenKeyboard ###
+### SbWindowFocusOnScreenKeyboard
 
 Focus the on screen keyboard. Fire kSbEventTypeOnScreenKeyboardFocused.
 kSbEventTypeOnScreenKeyboardFocused has data `ticket`. Calling
@@ -157,38 +157,38 @@
 permitted. Calling SbWindowFocusOnScreenKeyboard while the on screen keyboard is
 not showing does nothing and does not fire any event.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowFocusOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowGetDiagonalSizeInInches ###
+### SbWindowGetDiagonalSizeInInches
 
 Gets the size of the diagonal between two opposing screen corners.
 
 A return value of 0 means that starboard does not know what the screen diagonal
 is.
 
-#### Declaration ####
+#### Declaration
 
 ```
 float SbWindowGetDiagonalSizeInInches(SbWindow window)
 ```
 
-### SbWindowGetOnScreenKeyboardBoundingRect ###
+### SbWindowGetOnScreenKeyboardBoundingRect
 
 Get the rectangle of the on screen keyboard in screen pixel coordinates. Return
 `true` if successful. Return `false` if the on screen keyboard is not showing.
 If the function returns `false`, then `rect` will not have been modified.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowGetOnScreenKeyboardBoundingRect(SbWindow window, SbWindowRect *bounding_rect)
 ```
 
-### SbWindowGetPlatformHandle ###
+### SbWindowGetPlatformHandle
 
 Gets the platform-specific handle for `window`, which can be passed as an
 EGLNativeWindowType to initialize EGL/GLES. This return value is entirely
@@ -196,13 +196,13 @@
 
 `window`: The SbWindow to retrieve the platform handle for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbWindowGetPlatformHandle(SbWindow window)
 ```
 
-### SbWindowGetSize ###
+### SbWindowGetSize
 
 Retrieves the dimensions of `window` and sets `size` accordingly. This function
 returns `true` if it completes successfully. If the function returns `false`,
@@ -210,81 +210,81 @@
 
 `window`: The SbWindow to retrieve the size of. `size`: The retrieved size.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowGetSize(SbWindow window, SbWindowSize *size)
 ```
 
-### SbWindowHideOnScreenKeyboard ###
+### SbWindowHideOnScreenKeyboard
 
 Hide the on screen keyboard. Fire kSbEventTypeWindowSizeChange and
 kSbEventTypeOnScreenKeyboardHidden if necessary.
 kSbEventTypeOnScreenKeyboardHidden has data `ticket`. Calling
 SbWindowHideOnScreenKeyboard() when the keyboard is already hidden is permitted.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowHideOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowIsOnScreenKeyboardShown ###
+### SbWindowIsOnScreenKeyboardShown
 
 Determine if the on screen keyboard is shown.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowIsOnScreenKeyboardShown(SbWindow window)
 ```
 
-### SbWindowIsValid ###
+### SbWindowIsValid
 
 Returns whether the given window handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbWindowIsValid(SbWindow window)
 ```
 
-### SbWindowOnScreenKeyboardIsSupported ###
+### SbWindowOnScreenKeyboardIsSupported
 
 Return whether the current platform supports an on screen keyboard
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowOnScreenKeyboardIsSupported()
 ```
 
-### SbWindowOnScreenKeyboardSuggestionsSupported ###
+### SbWindowOnScreenKeyboardSuggestionsSupported
 
 Determine if the on screen keyboard has suggestions implemented. If this returns
 false, then calling SbWindowUpdateOnScreenKeyboardSuggestions() will be
 undefined.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowOnScreenKeyboardSuggestionsSupported(SbWindow window)
 ```
 
-### SbWindowSetDefaultOptions ###
+### SbWindowSetDefaultOptions
 
 Sets the default options for system windows.
 
 `options`: The option values to use as default values. This object must not be
 `NULL`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowSetDefaultOptions(SbWindowOptions *options)
 ```
 
-### SbWindowSetOnScreenKeyboardKeepFocus ###
+### SbWindowSetOnScreenKeyboardKeepFocus
 
 Notify the system that `keepFocus` has been set for the OnScreenKeyboard.
 `keepFocus` true indicates that the user may not navigate focus off of the
@@ -293,13 +293,13 @@
 OnScreenKeyboard via input. `keepFocus` is initialized to false in the
 OnScreenKeyboard constructor.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowSetOnScreenKeyboardKeepFocus(SbWindow window, bool keep_focus)
 ```
 
-### SbWindowShowOnScreenKeyboard ###
+### SbWindowShowOnScreenKeyboard
 
 Show the on screen keyboard and populate the input with text `input_text`. Fire
 kSbEventTypeWindowSizeChange and kSbEventTypeOnScreenKeyboardShown if necessary.
@@ -309,13 +309,13 @@
 and the input will be replaced with `input_text`. Showing the on screen keyboard
 does not give it focus.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowShowOnScreenKeyboard(SbWindow window, const char *input_text, int ticket)
 ```
 
-### SbWindowUpdateOnScreenKeyboardSuggestions ###
+### SbWindowUpdateOnScreenKeyboardSuggestions
 
 Update the on screen keyboard custom suggestions. Fire
 kSbEventTypeOnScreenKeyboardSuggestionsUpdated.
@@ -323,7 +323,7 @@
 suggestions should remain up-to-date when the keyboard is shown after being
 hidden.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowUpdateOnScreenKeyboardSuggestions(SbWindow window, const char *suggestions[], int num_suggestions, int ticket)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/accessibility.md b/cobalt/site/docs/reference/starboard/modules/14/accessibility.md
index 1a5adcb..5c66ba4 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/accessibility.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/accessibility.md
@@ -1,17 +1,17 @@
----
-layout: doc
-title: "Starboard Module Reference: accessibility.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `accessibility.h`
 
 Provides access to the system options and settings related to accessibility.
 
-## Enums ##
+## Enums
 
-### SbAccessibilityCaptionCharacterEdgeStyle ###
+### SbAccessibilityCaptionCharacterEdgeStyle
 
 Enum for possible closed captioning character edge styles.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionCharacterEdgeStyleNone`
 *   `kSbAccessibilityCaptionCharacterEdgeStyleRaised`
@@ -19,11 +19,11 @@
 *   `kSbAccessibilityCaptionCharacterEdgeStyleUniform`
 *   `kSbAccessibilityCaptionCharacterEdgeStyleDropShadow`
 
-### SbAccessibilityCaptionColor ###
+### SbAccessibilityCaptionColor
 
 Enum for possible closed captioning colors.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionColorBlue`
 *   `kSbAccessibilityCaptionColorBlack`
@@ -34,11 +34,11 @@
 *   `kSbAccessibilityCaptionColorWhite`
 *   `kSbAccessibilityCaptionColorYellow`
 
-### SbAccessibilityCaptionFontFamily ###
+### SbAccessibilityCaptionFontFamily
 
 Enum for possible closed captioning font families
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionFontFamilyCasual`
 *   `kSbAccessibilityCaptionFontFamilyCursive`
@@ -48,11 +48,11 @@
 *   `kSbAccessibilityCaptionFontFamilyProportionalSerif`
 *   `kSbAccessibilityCaptionFontFamilySmallCapitals`
 
-### SbAccessibilityCaptionFontSizePercentage ###
+### SbAccessibilityCaptionFontSizePercentage
 
 Enum for possible closed captioning font size percentages.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionFontSizePercentage25`
 *   `kSbAccessibilityCaptionFontSizePercentage50`
@@ -67,11 +67,11 @@
 *   `kSbAccessibilityCaptionFontSizePercentage275`
 *   `kSbAccessibilityCaptionFontSizePercentage300`
 
-### SbAccessibilityCaptionOpacityPercentage ###
+### SbAccessibilityCaptionOpacityPercentage
 
 Enum for possible closed captioning opacity percentages.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionOpacityPercentage0`
 *   `kSbAccessibilityCaptionOpacityPercentage25`
@@ -79,11 +79,11 @@
 *   `kSbAccessibilityCaptionOpacityPercentage75`
 *   `kSbAccessibilityCaptionOpacityPercentage100`
 
-### SbAccessibilityCaptionState ###
+### SbAccessibilityCaptionState
 
 Enum for possible states of closed captioning properties.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionStateUnsupported`
 
@@ -115,14 +115,14 @@
     SbAccessibilityCaptionSettings.supportsOverride contains false, then no
     fields of SbAccessibilityCaptionSettings will ever contain this value.
 
-## Structs ##
+## Structs
 
-### SbAccessibilityCaptionSettings ###
+### SbAccessibilityCaptionSettings
 
 A group of settings related to system-level closed captioning settings, for
 platforms that expose closed captioning settings.
 
-#### Members ####
+#### Members
 
 *   `SbAccessibilityCaptionColor background_color`
 *   `SbAccessibilityCaptionState background_color_state`
@@ -166,9 +166,9 @@
     false, the values of `SbAccessibilityCaptionState` should be interpreted
     differently.
 
-### SbAccessibilityDisplaySettings ###
+### SbAccessibilityDisplaySettings
 
-#### Members ####
+#### Members
 
 *   `bool has_high_contrast_text_setting`
 
@@ -177,12 +177,12 @@
 
     Whether the high contrast text setting is enabled or not.
 
-### SbAccessibilityTextToSpeechSettings ###
+### SbAccessibilityTextToSpeechSettings
 
 A group of settings related to text-to-speech functionality, for platforms that
 expose system settings for text-to-speech.
 
-#### Members ####
+#### Members
 
 *   `bool has_text_to_speech_setting`
 
@@ -192,9 +192,9 @@
     Whether the text-to-speech setting is enabled or not. This setting is only
     valid if `has_text_to_speech_setting` is set to true.
 
-## Functions ##
+## Functions
 
-### SbAccessibilityGetCaptionSettings ###
+### SbAccessibilityGetCaptionSettings
 
 Get the platform's settings for system-level closed captions. This function
 returns false if `caption_settings` is NULL or if it is not zero-initialized.
@@ -202,13 +202,13 @@
 `caption_settings`: A pointer to a zero-initialized
 SbAccessibilityTextToSpeechSettings struct.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilityGetCaptionSettings(SbAccessibilityCaptionSettings *caption_settings)
 ```
 
-### SbAccessibilityGetDisplaySettings ###
+### SbAccessibilityGetDisplaySettings
 
 Get the platform settings related to high contrast text. This function returns
 false if `out_settings` is NULL or if it is not zero-initialized.
@@ -216,13 +216,13 @@
 `out_settings`: A pointer to a zero-initialized SbAccessibilityDisplaySettings*
 struct.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilityGetDisplaySettings(SbAccessibilityDisplaySettings *out_settings)
 ```
 
-### SbAccessibilityGetTextToSpeechSettings ###
+### SbAccessibilityGetTextToSpeechSettings
 
 Get the platform settings related to the text-to-speech accessibility feature.
 This function returns false if `out_settings` is NULL or if it is not zero-
@@ -231,13 +231,13 @@
 `out_settings`: A pointer to a zero-initialized
 SbAccessibilityTextToSpeechSettings struct.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilityGetTextToSpeechSettings(SbAccessibilityTextToSpeechSettings *out_settings)
 ```
 
-### SbAccessibilitySetCaptionsEnabled ###
+### SbAccessibilitySetCaptionsEnabled
 
 Modifies whether closed captions are enabled at a system level. This function
 returns false if this feature is not supported by the platform, or if changing
@@ -246,7 +246,7 @@
 `enabled`: A boolean indicating whether captions should be turned on (true) or
 off (false).
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilitySetCaptionsEnabled(bool enabled)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/atomic.md b/cobalt/site/docs/reference/starboard/modules/14/atomic.md
index 9741f3c..0ed31cb 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/atomic.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/atomic.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: atomic.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `atomic.h`
 
 Defines a set of atomic integer operations that can be used as lightweight
 synchronization or as building blocks for heavier synchronization primitives.
@@ -9,32 +9,32 @@
 supported architectures, so their direct use is not recommended except when
 rigorously deemed absolutely necessary for performance reasons.
 
-## Typedefs ##
+## Typedefs
 
-### SbAtomic64 ###
+### SbAtomic64
 
 64-bit atomic operations (only available on 64-bit processors).
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int64_t SbAtomic64
 ```
 
-### SbAtomicPtr ###
+### SbAtomicPtr
 
 Pointer-sized atomic operations. Forwards to either 32-bit or 64-bit functions
 as appropriate.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbAtomic32 SbAtomicPtr
 ```
 
-## Functions ##
+## Functions
 
-### SbAtomicAcquire_CompareAndSwap ###
+### SbAtomicAcquire_CompareAndSwap
 
 These following lower-level operations are typically useful only to people
 implementing higher-level synchronization operations like spinlocks, mutexes,
@@ -45,23 +45,23 @@
 operation. "Barrier" operations have both "Acquire" and "Release" semantics. A
 SbAtomicMemoryBarrier() has "Barrier" semantics, but does no memory access.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicAcquire_CompareAndSwap(volatile SbAtomic32 *ptr, SbAtomic32 old_value, SbAtomic32 new_value)
 ```
 
-### SbAtomicBarrier_Increment ###
+### SbAtomicBarrier_Increment
 
 Same as SbAtomicNoBarrier_Increment, but with a memory barrier.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicBarrier_Increment(volatile SbAtomic32 *ptr, SbAtomic32 increment)
 ```
 
-### SbAtomicNoBarrier_CompareAndSwap ###
+### SbAtomicNoBarrier_CompareAndSwap
 
 Atomically execute: result = *ptr; if (*ptr == old_value) *ptr = new_value;
 return result;
@@ -71,39 +71,39 @@
 
 This routine implies no memory barriers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicNoBarrier_CompareAndSwap(volatile SbAtomic32 *ptr, SbAtomic32 old_value, SbAtomic32 new_value)
 ```
 
-### SbAtomicNoBarrier_Exchange ###
+### SbAtomicNoBarrier_Exchange
 
 Atomically store new_value into *ptr, returning the previous value held in *ptr.
 This routine implies no memory barriers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicNoBarrier_Exchange(volatile SbAtomic32 *ptr, SbAtomic32 new_value)
 ```
 
-### SbAtomicNoBarrier_Increment ###
+### SbAtomicNoBarrier_Increment
 
 Atomically increment *ptr by "increment". Returns the new value of *ptr with the
 increment applied. This routine implies no memory barriers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicNoBarrier_Increment(volatile SbAtomic32 *ptr, SbAtomic32 increment)
 ```
 
-### SbAtomicRelease_CompareAndSwap8 ###
+### SbAtomicRelease_CompareAndSwap8
 
 Overloaded functions for Atomic8.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic8 SbAtomicRelease_CompareAndSwap8(volatile SbAtomic8 *ptr, SbAtomic8 old_value, SbAtomic8 new_value)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/audio_sink.md b/cobalt/site/docs/reference/starboard/modules/14/audio_sink.md
index b0e652f..9277c70 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/audio_sink.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/audio_sink.md
@@ -1,53 +1,53 @@
----
-layout: doc
-title: "Starboard Module Reference: audio_sink.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `audio_sink.h`
 
 Provides an interface to output raw audio data.
 
-## Macros ##
+## Macros
 
-### kSbAudioSinkInvalid ###
+### kSbAudioSinkInvalid
 
 Well-defined value for an invalid audio sink.
 
-## Typedefs ##
+## Typedefs
 
-### SbAudioSink ###
+### SbAudioSink
 
 An opaque handle to an implementation-private structure representing an audio
 sink.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbAudioSinkPrivate* SbAudioSink
 ```
 
-### SbAudioSinkConsumeFramesFunc ###
+### SbAudioSinkConsumeFramesFunc
 
 Callback used to report frames consumed. The consumed frames will be removed
 from the source frame buffer to free space for new audio frames.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbAudioSinkConsumeFramesFunc) (int frames_consumed, void *context)
 ```
 
-### SbAudioSinkFrameBuffers ###
+### SbAudioSinkFrameBuffers
 
 An array of frame buffers. For interleaved audio streams, there will be only one
 element in the array. For planar audio streams, the number of elements in the
 array equal to the number of channels.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void** SbAudioSinkFrameBuffers
 ```
 
-### SbAudioSinkUpdateSourceStatusFunc ###
+### SbAudioSinkUpdateSourceStatusFunc
 
 Callback being called periodically to retrieve the status of the audio source.
 The first two output parameters indicating the filling level of the audio frame
@@ -64,15 +64,15 @@
 NULL. Note that this function only reports the status of the source, it doesn't
 remove audio data from the source frame buffer.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbAudioSinkUpdateSourceStatusFunc) (int *frames_in_buffer, int *offset_in_frames, bool *is_playing, bool *is_eos_reached, void *context)
 ```
 
-## Functions ##
+## Functions
 
-### SbAudioSinkCreate ###
+### SbAudioSinkCreate
 
 Creates an audio sink for the specified `channels` and `sampling_frequency_hz`,
 acquires all resources needed to operate the audio sink, and returns an opaque
@@ -113,13 +113,13 @@
     value that is passed back to all callbacks and is generally used to point at
     a class or struct that contains state associated with the audio sink.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbAudioSink SbAudioSinkCreate(int channels, int sampling_frequency_hz, SbMediaAudioSampleType audio_sample_type, SbMediaAudioFrameStorageType audio_frame_storage_type, SbAudioSinkFrameBuffers frame_buffers, int frames_per_channel, SbAudioSinkUpdateSourceStatusFunc update_source_status_func, SbAudioSinkConsumeFramesFunc consume_frames_func, void *context)
 ```
 
-### SbAudioSinkDestroy ###
+### SbAudioSinkDestroy
 
 Destroys `audio_sink`, freeing all associated resources. Before returning, the
 function waits until all callbacks that are in progress have finished. After the
@@ -132,24 +132,24 @@
 
 `audio_sink`: The audio sink to destroy.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbAudioSinkDestroy(SbAudioSink audio_sink)
 ```
 
-### SbAudioSinkGetMaxChannels ###
+### SbAudioSinkGetMaxChannels
 
 Returns the maximum number of channels supported on the platform. For example,
 the number would be `2` if the platform only supports stereo.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbAudioSinkGetMaxChannels()
 ```
 
-### SbAudioSinkGetMinBufferSizeInFrames ###
+### SbAudioSinkGetMinBufferSizeInFrames
 
 Returns the minimum frames required by audio sink to play without underflows.
 Returns -1, if `channels`, `sample_type` or `sampling_frequency_hz` is not
@@ -162,52 +162,52 @@
 audio data being streamed. For example, 22,000 Hz means 22,000 sample elements
 represents one second of audio data.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbAudioSinkGetMinBufferSizeInFrames(int channels, SbMediaAudioSampleType sample_type, int sampling_frequency_hz)
 ```
 
-### SbAudioSinkGetNearestSupportedSampleFrequency ###
+### SbAudioSinkGetNearestSupportedSampleFrequency
 
 Returns the supported sample rate closest to `sampling_frequency_hz`. On
 platforms that don't support all sample rates, it is the caller's responsibility
 to resample the audio frames into the supported sample rate returned by this
 function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbAudioSinkGetNearestSupportedSampleFrequency(int sampling_frequency_hz)
 ```
 
-### SbAudioSinkIsAudioFrameStorageTypeSupported ###
+### SbAudioSinkIsAudioFrameStorageTypeSupported
 
 Indicates whether `audio_frame_storage_type` is supported on this platform.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAudioSinkIsAudioFrameStorageTypeSupported(SbMediaAudioFrameStorageType audio_frame_storage_type)
 ```
 
-### SbAudioSinkIsAudioSampleTypeSupported ###
+### SbAudioSinkIsAudioSampleTypeSupported
 
 Indicates whether `audio_sample_type` is supported on this platform.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAudioSinkIsAudioSampleTypeSupported(SbMediaAudioSampleType audio_sample_type)
 ```
 
-### SbAudioSinkIsValid ###
+### SbAudioSinkIsValid
 
 Indicates whether the given audio sink handle is valid.
 
 `audio_sink`: The audio sink handle to check.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAudioSinkIsValid(SbAudioSink audio_sink)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/byte_swap.md b/cobalt/site/docs/reference/starboard/modules/14/byte_swap.md
index c83927d..72dc932 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/byte_swap.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/byte_swap.md
@@ -1,74 +1,74 @@
----
-layout: doc
-title: "Starboard Module Reference: byte_swap.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `byte_swap.h`
 
 Specifies functions for swapping byte order. These functions are used to deal
 with endianness when performing I/O.
 
-## Functions ##
+## Functions
 
-### SbByteSwapS16 ###
+### SbByteSwapS16
 
 Unconditionally swaps the byte order in signed 16-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int16_t SbByteSwapS16(int16_t value)
 ```
 
-### SbByteSwapS32 ###
+### SbByteSwapS32
 
 Unconditionally swaps the byte order in signed 32-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int32_t SbByteSwapS32(int32_t value)
 ```
 
-### SbByteSwapS64 ###
+### SbByteSwapS64
 
 Unconditionally swaps the byte order in signed 64-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbByteSwapS64(int64_t value)
 ```
 
-### SbByteSwapU16 ###
+### SbByteSwapU16
 
 Unconditionally swaps the byte order in unsigned 16-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint16_t SbByteSwapU16(uint16_t value)
 ```
 
-### SbByteSwapU32 ###
+### SbByteSwapU32
 
 Unconditionally swaps the byte order in unsigned 32-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint32_t SbByteSwapU32(uint32_t value)
 ```
 
-### SbByteSwapU64 ###
+### SbByteSwapU64
 
 Unconditionally swaps the byte order in unsigned 64-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint64_t SbByteSwapU64(uint64_t value)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/condition_variable.md b/cobalt/site/docs/reference/starboard/modules/14/condition_variable.md
index e58e106..2d8f30b 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/condition_variable.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/condition_variable.md
@@ -1,23 +1,23 @@
----
-layout: doc
-title: "Starboard Module Reference: condition_variable.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `condition_variable.h`
 
 Defines an interface for condition variables.
 
-## Macros ##
+## Macros
 
-### SB_CONDITION_VARIABLE_MAX_SIZE ###
+### SB_CONDITION_VARIABLE_MAX_SIZE
 
 Max size of the SbConditionVariable type.
 
-## Enums ##
+## Enums
 
-### SbConditionVariableResult ###
+### SbConditionVariableResult
 
 Enumeration of possible results from waiting on a condvar.
 
-#### Values ####
+#### Values
 
 *   `kSbConditionVariableSignaled`
 
@@ -30,22 +30,22 @@
     The wait failed, either because a parameter wasn't valid, or the condition
     variable has already been destroyed, or something similar.
 
-## Typedefs ##
+## Typedefs
 
-### SbConditionVariable ###
+### SbConditionVariable
 
 An opaque handle to a condition variable type with reserved memory buffer of
 size SB_CONDITION_VARIABLE_MAX_SIZE and aligned at void pointer type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef union SbConditionVariable  SbConditionVariable
 ```
 
-## Functions ##
+## Functions
 
-### SbConditionVariableBroadcast ###
+### SbConditionVariableBroadcast
 
 Broadcasts to all current waiters of `condition` to stop waiting. This function
 wakes all of the threads waiting on `condition` while SbConditionVariableSignal
@@ -53,26 +53,26 @@
 
 `condition`: The condition that should no longer be waited for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableBroadcast(SbConditionVariable *condition)
 ```
 
-### SbConditionVariableCreate ###
+### SbConditionVariableCreate
 
 Creates a new condition variable to work with `opt_mutex`, which may be null,
 placing the newly created condition variable in `out_condition`.
 
 The return value indicates whether the condition variable could be created.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableCreate(SbConditionVariable *out_condition, SbMutex *opt_mutex)
 ```
 
-### SbConditionVariableDestroy ###
+### SbConditionVariableDestroy
 
 Destroys the specified SbConditionVariable . The return value indicates whether
 the destruction was successful. The behavior is undefined if other threads are
@@ -81,23 +81,23 @@
 `condition`: The SbConditionVariable to be destroyed. This invalidates the
 condition variable.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableDestroy(SbConditionVariable *condition)
 ```
 
-### SbConditionVariableIsSignaled ###
+### SbConditionVariableIsSignaled
 
 Returns whether the given result is a success.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbConditionVariableIsSignaled(SbConditionVariableResult result)
 ```
 
-### SbConditionVariableSignal ###
+### SbConditionVariableSignal
 
 Signals the next waiter of `condition` to stop waiting. This function wakes a
 single thread waiting on `condition` while SbConditionVariableBroadcast wakes
@@ -105,24 +105,24 @@
 
 `condition`: The condition that the waiter should stop waiting for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableSignal(SbConditionVariable *condition)
 ```
 
-### SbConditionVariableWait ###
+### SbConditionVariableWait
 
 Waits for `condition`, releasing the held lock `mutex`, blocking indefinitely,
 and returning the result. Behavior is undefined if `mutex` is not held.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbConditionVariableResult SbConditionVariableWait(SbConditionVariable *condition, SbMutex *mutex)
 ```
 
-### SbConditionVariableWaitTimed ###
+### SbConditionVariableWaitTimed
 
 Waits for `condition`, releasing the held lock `mutex`, blocking up to
 `timeout_duration`, and returning the acquisition result. Behavior is undefined
@@ -133,7 +133,7 @@
 function returns as quickly as possible with a kSbConditionVariableTimedOut
 result.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbConditionVariableResult SbConditionVariableWaitTimed(SbConditionVariable *condition, SbMutex *mutex, SbTime timeout_duration)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/configuration.md b/cobalt/site/docs/reference/starboard/modules/14/configuration.md
index 630f1cf..d0ba3c7 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/configuration.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/configuration.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: configuration.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `configuration.h`
 
 Provides a description of the current platform in lurid detail so that common
 code never needs to actually know what the current operating system and
@@ -13,117 +13,117 @@
 narrowly-defined configuration features, but it retains porting control in
 Starboard.
 
-## Macros ##
+## Macros
 
-### SB_ALIGNAS(byte_alignment) ###
+### SB_ALIGNAS(byte_alignment)
 
 Specifies the alignment for a class, struct, union, enum, class/struct field, or
 stack variable.
 
-### SB_ALIGNOF(type) ###
+### SB_ALIGNOF(type)
 
 Returns the alignment required for any instance of the type indicated by `type`.
 
-### SB_ARRAY_SIZE(array) ###
+### SB_ARRAY_SIZE(array)
 
 A constant expression that evaluates to the size_t size of a statically-sized
 array.
 
-### SB_ARRAY_SIZE_INT(array) ###
+### SB_ARRAY_SIZE_INT(array)
 
 A constant expression that evaluates to the int size of a statically-sized
 array.
 
-### SB_CAN(SB_FEATURE) ###
+### SB_CAN(SB_FEATURE)
 
 Determines a compile-time capability of the system.
 
-### SB_COMPILE_ASSERT(expr, msg) ###
+### SB_COMPILE_ASSERT(expr, msg)
 
 Will cause a compiler error with `msg` if `expr` is false. `msg` must be a valid
 identifier, and must be a unique type in the scope of the declaration.
 
-### SB_DEPRECATED(FUNC) ###
+### SB_DEPRECATED(FUNC)
 
 SB_DEPRECATED(int Foo(int bar)); Annotates the function as deprecated, which
 will trigger a compiler warning when referenced.
 
-### SB_DEPRECATED_EXTERNAL(FUNC) ###
+### SB_DEPRECATED_EXTERNAL(FUNC)
 
 SB_DEPRECATED_EXTERNAL(...) annotates the function as deprecated for external
 clients, but not deprecated for starboard.
 
-### SB_EXPERIMENTAL_API_VERSION ###
+### SB_EXPERIMENTAL_API_VERSION
 
 The API version that is currently open for changes, and therefore is not stable
 or frozen. Production-oriented ports should avoid declaring that they implement
 the experimental Starboard API version.
 
-### SB_FUNCTION ###
+### SB_FUNCTION
 
 Whether we use **PRETTY_FUNCTION** PRETTY_FUNCTION or **FUNCTION** FUNCTION for
 logging.
 
-### SB_HAS(SB_FEATURE) ###
+### SB_HAS(SB_FEATURE)
 
 Determines at compile-time whether this platform has a standard feature or
 header available.
 
-### SB_HAS_64_BIT_ATOMICS ###
+### SB_HAS_64_BIT_ATOMICS
 
 Whether the current platform has 64-bit atomic operations.
 
-### SB_HAS_GLES2 ###
+### SB_HAS_GLES2
 
 Specifies whether this platform has a performant OpenGL ES 2 implementation,
 which allows client applications to use GL rendering paths. Derived from the gyp
 variable `gl_type` gl_type which indicates what kind of GL implementation is
 available.
 
-### SB_HAS_QUIRK(SB_FEATURE) ###
+### SB_HAS_QUIRK(SB_FEATURE)
 
 Determines at compile-time whether this platform has a quirk.
 
-### SB_INT64_C(x) ###
+### SB_INT64_C(x)
 
 Declare numeric literals of signed 64-bit type.
 
-### SB_IS(SB_FEATURE) ###
+### SB_IS(SB_FEATURE)
 
 Determines at compile-time an inherent aspect of this platform.
 
-### SB_LIKELY(x) ###
+### SB_LIKELY(x)
 
 Macro for hinting that an expression is likely to be true.
 
-### SB_MAXIMUM_API_VERSION ###
+### SB_MAXIMUM_API_VERSION
 
 The maximum API version allowed by this version of the Starboard headers,
 inclusive.
 
-### SB_MINIMUM_API_VERSION ###
+### SB_MINIMUM_API_VERSION
 
 The minimum API version allowed by this version of the Starboard headers,
 inclusive.
 
-### SB_NORETURN ###
+### SB_NORETURN
 
 Macro to annotate a function as noreturn, which signals to the compiler that the
 function cannot return.
 
-### SB_OVERRIDE ###
+### SB_OVERRIDE
 
 Declares a function as overriding a virtual function on compilers that support
 it.
 
-### SB_PREFERRED_RGBA_BYTE_ORDER_RGBA ###
+### SB_PREFERRED_RGBA_BYTE_ORDER_RGBA
 
 An enumeration of values for the kSbPreferredByteOrder configuration variable.
 Setting this up properly means avoiding slow color swizzles when passing pixel
 data from one library to another. Note that these definitions are in byte-order
 and so are endianness-independent.
 
-### SB_PRINTF_FORMAT(format_param, dots_param) ###
+### SB_PRINTF_FORMAT(format_param, dots_param)
 
 Tells the compiler a function is using a printf-style format string.
 `format_param` is the one-based index of the format string parameter;
@@ -132,7 +132,7 @@
 but matches what the system C headers do.) (Partially taken from
 base/compiler_specific.h)
 
-### SB_RESTRICT ###
+### SB_RESTRICT
 
 Include the platform-specific configuration. This macro is set by GN in
 starboard/build/config/BUILD.gn and passed in on the command line for all
@@ -140,29 +140,29 @@
 that the compiler can make certain optimizations because it knows the pointers
 are unique.
 
-### SB_SIZE_OF(DATATYPE) ###
+### SB_SIZE_OF(DATATYPE)
 
 Determines at compile-time the size of a data type, or 0 if the data type that
 was specified was invalid.
 
-### SB_STRINGIFY(x) ###
+### SB_STRINGIFY(x)
 
 Standard CPP trick to stringify an evaluated macro definition.
 
-### SB_UINT64_C(x) ###
+### SB_UINT64_C(x)
 
 Declare numeric literals of unsigned 64-bit type.
 
-### SB_UNLIKELY(x) ###
+### SB_UNLIKELY(x)
 
 Macro for hinting that an expression is likely to be false.
 
-### SB_UNREFERENCED_PARAMETER(x) ###
+### SB_UNREFERENCED_PARAMETER(x)
 
 Trivially references a parameter that is otherwise unreferenced, preventing a
 compiler warning on some platforms.
 
-### SB_WARN_UNUSED_RESULT ###
+### SB_WARN_UNUSED_RESULT
 
 Causes the annotated (at the end) function to generate a warning if the result
 is not accessed.
diff --git a/cobalt/site/docs/reference/starboard/modules/14/configuration_constants.md b/cobalt/site/docs/reference/starboard/modules/14/configuration_constants.md
index 51212e9..0f61ebf 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/configuration_constants.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/configuration_constants.md
@@ -1,117 +1,117 @@
----
-layout: doc
-title: "Starboard Module Reference: configuration_constants.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `configuration_constants.h`
 
 Declares all configuration variables we will need to use at runtime. These
 variables describe the current platform in detail to allow cobalt to make
 runtime decisions based on per platform configurations.
 
-## Variables ##
+## Variables
 
-### kSbDefaultMmapThreshold ###
+### kSbDefaultMmapThreshold
 
 Determines the threshold of allocation size that should be done with mmap (if
 available), rather than allocated within the core heap.
 
-### kSbFileAltSepChar ###
+### kSbFileAltSepChar
 
 The current platform's alternate file path component separator character. This
 is like SB_FILE_SEP_CHAR, except if your platform supports an alternate
 character, then you can place that here. For example, on windows machines, the
 primary separator character is probably '\', but the alternate is '/'.
 
-### kSbFileAltSepString ###
+### kSbFileAltSepString
 
 The string form of SB_FILE_ALT_SEP_CHAR.
 
-### kSbFileMaxName ###
+### kSbFileMaxName
 
 The current platform's maximum length of the name of a single directory entry,
 not including the absolute path.
 
-### kSbFileMaxOpen ###
+### kSbFileMaxOpen
 
 The current platform's maximum number of files that can be opened at the same
 time by one process.
 
-### kSbFileMaxPath ###
+### kSbFileMaxPath
 
 The current platform's maximum length of an absolute path.
 
-### kSbFileSepChar ###
+### kSbFileSepChar
 
 The current platform's file path component separator character. This is the
 character that appears after a directory in a file path. For example, the
 absolute canonical path of the file "/path/to/a/file.txt" uses '/' as a path
 component separator character.
 
-### kSbFileSepString ###
+### kSbFileSepString
 
 The string form of SB_FILE_SEP_CHAR.
 
-### kSbHasAc3Audio ###
+### kSbHasAc3Audio
 
 Allow ac3 and ec3 support
 
-### kSbHasMediaWebmVp9Support ###
+### kSbHasMediaWebmVp9Support
 
 Specifies whether this platform has webm/vp9 support. This should be set to non-
 zero on platforms with webm/vp9 support.
 
-### kSbHasThreadPrioritySupport ###
+### kSbHasThreadPrioritySupport
 
 Whether the current platform supports thread priorities.
 
-### kSbMallocAlignment ###
+### kSbMallocAlignment
 
 Determines the alignment that allocations should have on this platform.
 
-### kSbMaxSystemPathCacheDirectorySize ###
+### kSbMaxSystemPathCacheDirectorySize
 
 The maximum size the cache directory is allowed to use in bytes.
 
-### kSbMaxThreadLocalKeys ###
+### kSbMaxThreadLocalKeys
 
 The maximum number of thread local storage keys supported by this platform. This
 comes from _POSIX_THREAD_KEYS_MAX. The value of PTHREAD_KEYS_MAX is higher, but
 unit tests show that the implementation doesn't support nearly as many keys.
 
-### kSbMaxThreadNameLength ###
+### kSbMaxThreadNameLength
 
 The maximum length of the name for a thread, including the NULL-terminator.
 
-### kSbMaxThreads ###
+### kSbMaxThreads
 
 Defines the maximum number of simultaneous threads for this platform. Some
 platforms require sharing thread handles with other kinds of system handles,
 like mutexes, so we want to keep this manageable.
 
-### kSbMediaMaxAudioBitrateInBitsPerSecond ###
+### kSbMediaMaxAudioBitrateInBitsPerSecond
 
 The maximum audio bitrate the platform can decode. The following value equals to
 5M bytes per seconds which is more than enough for compressed audio.
 
-### kSbMediaMaxVideoBitrateInBitsPerSecond ###
+### kSbMediaMaxVideoBitrateInBitsPerSecond
 
 The maximum video bitrate the platform can decode. The following value equals to
 8M bytes per seconds which is more than enough for compressed video.
 
-### kSbMediaVideoFrameAlignment ###
+### kSbMediaVideoFrameAlignment
 
 Specifies how video frame buffers must be aligned on this platform.
 
-### kSbMemoryLogPath ###
+### kSbMemoryLogPath
 
 Defines the path where memory debugging logs should be written to.
 
-### kSbMemoryPageSize ###
+### kSbMemoryPageSize
 
 The memory page size, which controls the size of chunks on memory that
 allocators deal with, and the alignment of those chunks. This doesn't have to be
 the hardware-defined physical page size, but it should be a multiple of it.
 
-### kSbNetworkReceiveBufferSize ###
+### kSbNetworkReceiveBufferSize
 
 Specifies the network receive buffer size in bytes, set via
 SbSocketSetReceiveBufferSize().
@@ -126,7 +126,7 @@
 If your platform does not have a good TCP auto-tuning mechanism, a setting of
 (128 * 1024) here is recommended.
 
-### kSbPathSepChar ###
+### kSbPathSepChar
 
 The current platform's search path component separator character. When
 specifying an ordered list of absolute paths of directories to search for a
@@ -134,16 +134,16 @@
 the search path of "/etc/search/first:/etc/search/second" uses ':' as a search
 path component separator character.
 
-### kSbPathSepString ###
+### kSbPathSepString
 
 The string form of SB_PATH_SEP_CHAR.
 
-### kSbPreferredRgbaByteOrder ###
+### kSbPreferredRgbaByteOrder
 
 Specifies the preferred byte order of color channels in a pixel. Refer to
 starboard/configuration.h for the possible values. EGL/GLES platforms should
 generally prefer a byte order of RGBA, regardless of endianness.
 
-### kSbUserMaxSignedIn ###
+### kSbUserMaxSignedIn
 
 The maximum number of users that can be signed in at the same time.
diff --git a/cobalt/site/docs/reference/starboard/modules/14/cpu_features.md b/cobalt/site/docs/reference/starboard/modules/14/cpu_features.md
index 7a4bcc0..e2aa35f 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/cpu_features.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/cpu_features.md
@@ -1,13 +1,13 @@
----
-layout: doc
-title: "Starboard Module Reference: cpu_features.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
 
-## Structs ##
+# Starboard Module Reference: `cpu_features.h`
 
-### SbCPUFeatures ###
+## Structs
 
-#### Members ####
+### SbCPUFeatures
+
+#### Members
 
 *   `SbCPUFeaturesArchitecture architecture`
 
@@ -54,9 +54,9 @@
     defined as a macro.
 *   `SbCPUFeaturesX86 x86`
 
-### SbCPUFeaturesARM ###
+### SbCPUFeaturesARM
 
-#### Members ####
+#### Members
 
 *   `int16_t implementer`
 
@@ -98,7 +98,7 @@
     SDIV and UDIV hardware division in ARM mode.
 *   `bool has_aes`
 
-    ###### Arm 64 feature flags  ######
+    ###### Arm 64 feature flags
 
     AES instructions.
 *   `bool has_crc32`
@@ -114,17 +114,17 @@
 
     64-bit PMULL and PMULL2 instructions.
 
-### SbCPUFeaturesMIPS ###
+### SbCPUFeaturesMIPS
 
-#### Members ####
+#### Members
 
 *   `bool has_msa`
 
     MIPS SIMD Architecture (MSA).
 
-### SbCPUFeaturesX86 ###
+### SbCPUFeaturesX86
 
-#### Members ####
+#### Members
 
 *   `const char * vendor`
 
@@ -244,9 +244,9 @@
 
     SAHF in long mode.
 
-## Functions ##
+## Functions
 
-### SbCPUFeaturesGet ###
+### SbCPUFeaturesGet
 
 Retrieve the underlying CPU features and place it in `features`, which must not
 be NULL.
@@ -254,7 +254,7 @@
 If this function returns false, it means the CPU architecture is unknown and all
 fields in `features` are invalid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbCPUFeaturesGet(SbCPUFeatures *features)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/decode_target.md b/cobalt/site/docs/reference/starboard/modules/14/decode_target.md
index a237ad9..56c7afa 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/decode_target.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/decode_target.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: decode_target.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `decode_target.h`
 
 A target for decoding image and video data into. This corresponds roughly to an
 EGLImage, but that extension may not be fully supported on all GL platforms.
@@ -12,7 +12,7 @@
 decoding done directly into this memory, avoiding unnecessary memory copies, and
 also avoiding pushing data between CPU and GPU memory unnecessarily.
 
-## SbDecodeTargetFormat ##
+## SbDecodeTargetFormat
 
 SbDecodeTargets support several different formats that can be used to decode
 into and render from. Some formats may be easier to decode into, and others may
@@ -21,7 +21,7 @@
 Each decoder provides a way to check if a given SbDecodeTargetFormat is
 supported by that decoder.
 
-## SbDecodeTargetGraphicsContextProvider ##
+## SbDecodeTargetGraphicsContextProvider
 
 Some components may need to acquire SbDecodeTargets compatible with a certain
 rendering context, which may need to be created on a particular thread. The
@@ -33,10 +33,9 @@
 EGLContext held current. This may be useful if your SbDecodeTarget creation code
 needs to execute GLES commands like, for example, glGenTextures().
 
-The primary usage is likely to be the the SbPlayer implementation on some
-platforms.
+The primary usage is likely to be the SbPlayer implementation on some platforms.
 
-## SbDecodeTarget Example ##
+## SbDecodeTarget Example
 
 Let's say that we are an application and we would like to use the interface
 defined in starboard/image.h to decode an imaginary "image/foo" image type.
@@ -79,15 +78,15 @@
     info.planes[kSbDecodeTargetPlaneRGBA].texture;
 ```
 
-## Macros ##
+## Macros
 
-### kSbDecodeTargetInvalid ###
+### kSbDecodeTargetInvalid
 
 Well-defined value for an invalid decode target handle.
 
-## Enums ##
+## Enums
 
-### SbDecodeTargetFormat ###
+### SbDecodeTargetFormat
 
 The list of all possible decoder target formats. An SbDecodeTarget consists of
 one or more planes of data, each plane corresponding with a surface. For some
@@ -96,7 +95,7 @@
 NOTE: For enumeration entries with an alpha component, the alpha will always be
 premultiplied unless otherwise explicitly specified.
 
-#### Values ####
+#### Values
 
 *   `kSbDecodeTargetFormat1PlaneRGBA`
 
@@ -137,11 +136,11 @@
 
     An invalid decode target format.
 
-### SbDecodeTargetPlane ###
+### SbDecodeTargetPlane
 
 All the planes supported by SbDecodeTarget.
 
-#### Values ####
+#### Values
 
 *   `kSbDecodeTargetPlaneRGBA`
 
@@ -162,45 +161,45 @@
 
     The V plane for 3-plane YUV formats.
 
-## Typedefs ##
+## Typedefs
 
-### SbDecodeTarget ###
+### SbDecodeTarget
 
 A handle to a target for image data decoding.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbDecodeTargetPrivate* SbDecodeTarget
 ```
 
-### SbDecodeTargetGlesContextRunner ###
+### SbDecodeTargetGlesContextRunner
 
 Signature for a function provided by the application to the Starboard
 implementation that will let the Starboard implementation run arbitrary code on
 the application's renderer thread with the application's EGLContext held
 current.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDecodeTargetGlesContextRunner) (struct SbDecodeTargetGraphicsContextProvider *graphics_context_provider, SbDecodeTargetGlesContextRunnerTarget target_function, void *target_function_context)
 ```
 
-### SbDecodeTargetGlesContextRunnerTarget ###
+### SbDecodeTargetGlesContextRunnerTarget
 
 Signature for a Starboard implementation function that is to be run by a
 SbDecodeTargetGlesContextRunner callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDecodeTargetGlesContextRunnerTarget) (void *gles_context_runner_target_context)
 ```
 
-## Structs ##
+## Structs
 
-### SbDecodeTargetGraphicsContextProvider ###
+### SbDecodeTargetGraphicsContextProvider
 
 In general, the SbDecodeTargetGraphicsContextProvider structure provides
 information about the graphics context that will be used to render
@@ -210,7 +209,7 @@
 to all Starboard functions that might create SbDecodeTargets (e.g.
 SbImageDecode()).
 
-#### Members ####
+#### Members
 
 *   `void * egl_display`
 
@@ -233,12 +232,12 @@
     Context data that is to be passed in to `gles_context_runner` when it is
     invoked.
 
-### SbDecodeTargetInfo ###
+### SbDecodeTargetInfo
 
 Contains all information about a decode target, including all of its planes.
 This can be queried via calls to SbDecodeTargetGetInfo().
 
-#### Members ####
+#### Members
 
 *   `SbDecodeTargetFormat format`
 
@@ -267,11 +266,11 @@
     kSbDecodeTargetPlaneU, kSbDecodeTargetPlaneV} associated with this decode
     target.
 
-### SbDecodeTargetInfoContentRegion ###
+### SbDecodeTargetInfoContentRegion
 
 Defines a rectangular content region within a SbDecodeTargetInfoPlane structure.
 
-#### Members ####
+#### Members
 
 *   `float left`
 
@@ -283,11 +282,11 @@
 *   `float right`
 *   `float bottom`
 
-### SbDecodeTargetInfoPlane ###
+### SbDecodeTargetInfoPlane
 
 Defines an image plane within a SbDecodeTargetInfo object.
 
-#### Members ####
+#### Members
 
 *   `uint32_t texture`
 
@@ -317,53 +316,53 @@
     these parameters are number of pixels. The range for left/right is [0,
     width], and for top/bottom it is [0, height].
 
-## Functions ##
+## Functions
 
-### PrivateDecodeTargetReleaser ###
+### PrivateDecodeTargetReleaser
 
 This function is just an implementation detail of
 SbDecodeTargetReleaseInGlesContext() and should not be called directly.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void PrivateDecodeTargetReleaser(void *context)
 ```
 
-### SbDecodeTargetGetInfo ###
+### SbDecodeTargetGetInfo
 
 Writes all information about `decode_target` into `out_info`. The
 `decode_target` must not be kSbDecodeTargetInvalid. The `out_info` pointer must
 not be NULL. Returns false if the provided `out_info` structure is not zero
 initialized.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDecodeTargetGetInfo(SbDecodeTarget decode_target, SbDecodeTargetInfo *out_info)
 ```
 
-### SbDecodeTargetIsFormatValid ###
+### SbDecodeTargetIsFormatValid
 
 Returns whether a given format is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDecodeTargetIsFormatValid(SbDecodeTargetFormat format)
 ```
 
-### SbDecodeTargetIsValid ###
+### SbDecodeTargetIsValid
 
 Returns whether the given file handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDecodeTargetIsValid(SbDecodeTarget handle)
 ```
 
-### SbDecodeTargetRelease ###
+### SbDecodeTargetRelease
 
 Returns ownership of `decode_target` to the Starboard implementation. This
 function will likely result in the destruction of the SbDecodeTarget and all its
@@ -371,31 +370,31 @@
 reference count. In the case where SB_HAS(GLES2), this function must be called
 on a thread with the context
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDecodeTargetRelease(SbDecodeTarget decode_target)
 ```
 
-### SbDecodeTargetReleaseInGlesContext ###
+### SbDecodeTargetReleaseInGlesContext
 
 Helper function that is possibly useful to Starboard implementations that will
 release a decode target on the thread with the GLES context current.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void SbDecodeTargetReleaseInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTarget decode_target)
 ```
 
-### SbDecodeTargetRunInGlesContext ###
+### SbDecodeTargetRunInGlesContext
 
 Inline convenience function to run an arbitrary
 SbDecodeTargetGlesContextRunnerTarget function through a
 SbDecodeTargetGraphicsContextProvider . This is intended to be called by
 Starboard implementations, if it is necessary.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void SbDecodeTargetRunInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTargetGlesContextRunnerTarget target, void *target_context)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/directory.md b/cobalt/site/docs/reference/starboard/modules/14/directory.md
index dcdf48a..6f845f6 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/directory.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/directory.md
@@ -1,56 +1,56 @@
----
-layout: doc
-title: "Starboard Module Reference: directory.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `directory.h`
 
 Provides directory listing functions.
 
-## Macros ##
+## Macros
 
-### kSbDirectoryInvalid ###
+### kSbDirectoryInvalid
 
 Well-defined value for an invalid directory stream handle.
 
-## Typedefs ##
+## Typedefs
 
-### SbDirectory ###
+### SbDirectory
 
 A handle to an open directory stream.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbDirectoryPrivate* SbDirectory
 ```
 
-## Functions ##
+## Functions
 
-### SbDirectoryCanOpen ###
+### SbDirectoryCanOpen
 
 Indicates whether SbDirectoryOpen is allowed for the given `path`.
 
 `path`: The path to be checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryCanOpen(const char *path)
 ```
 
-### SbDirectoryClose ###
+### SbDirectoryClose
 
 Closes an open directory stream handle. The return value indicates whether the
 directory was closed successfully.
 
 `directory`: The directory stream handle to close.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryClose(SbDirectory directory)
 ```
 
-### SbDirectoryCreate ###
+### SbDirectoryCreate
 
 Creates the directory `path`, assuming the parent directory already exists. This
 function returns `true` if the directory now exists (even if it existed before)
@@ -58,13 +58,13 @@
 
 `path`: The path to be created.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryCreate(const char *path)
 ```
 
-### SbDirectoryGetNext ###
+### SbDirectoryGetNext
 
 Populates `out_entry` with the next entry in the specified directory stream, and
 moves the stream forward by one entry.
@@ -83,23 +83,23 @@
 `out_entry_size`: The size of the space allocated for `out_entry`. This should
 be at least equal to kSbFileMaxName.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryGetNext(SbDirectory directory, char *out_entry, size_t out_entry_size)
 ```
 
-### SbDirectoryIsValid ###
+### SbDirectoryIsValid
 
 Returns whether the given directory stream handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDirectoryIsValid(SbDirectory directory)
 ```
 
-### SbDirectoryOpen ###
+### SbDirectoryOpen
 
 Opens the given existing directory for listing. This function returns
 kSbDirectoryInvalidHandle if it is not successful.
@@ -110,7 +110,7 @@
 `out_error`: An output parameter that, in case of an error, is set to the reason
 that the directory could not be opened.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbDirectory SbDirectoryOpen(const char *path, SbFileError *out_error)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/drm.md b/cobalt/site/docs/reference/starboard/modules/14/drm.md
index fbb92f9..f42e43b 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/drm.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/drm.md
@@ -1,37 +1,37 @@
----
-layout: doc
-title: "Starboard Module Reference: drm.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `drm.h`
 
 Provides definitions that allow for DRM support, which are common between Player
 and Decoder interfaces.
 
-## Macros ##
+## Macros
 
-### kSbDrmSystemInvalid ###
+### kSbDrmSystemInvalid
 
 An invalid SbDrmSystem.
 
-### kSbDrmTicketInvalid ###
+### kSbDrmTicketInvalid
 
 A ticket for callback invocations initiated by the DRM system.
 
-## Enums ##
+## Enums
 
-### SbDrmEncryptionScheme ###
+### SbDrmEncryptionScheme
 
 Encryption scheme of the input sample, as defined in ISO/IEC 23001 part 7.
 
-#### Values ####
+#### Values
 
 *   `kSbDrmEncryptionSchemeAesCtr`
 *   `kSbDrmEncryptionSchemeAesCbc`
 
-### SbDrmKeyStatus ###
+### SbDrmKeyStatus
 
 Status of a particular media key. [https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus](https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus)
 
-#### Values ####
+#### Values
 
 *   `kSbDrmKeyStatusUsable`
 *   `kSbDrmKeyStatusExpired`
@@ -41,24 +41,24 @@
 *   `kSbDrmKeyStatusPending`
 *   `kSbDrmKeyStatusError`
 
-### SbDrmSessionRequestType ###
+### SbDrmSessionRequestType
 
 The type of the session request. [https://www.w3.org/TR/encrypted-media/#idl-def-mediakeymessagetype](https://www.w3.org/TR/encrypted-media/#idl-def-mediakeymessagetype)
 
-#### Values ####
+#### Values
 
 *   `kSbDrmSessionRequestTypeLicenseRequest`
 *   `kSbDrmSessionRequestTypeLicenseRenewal`
 *   `kSbDrmSessionRequestTypeLicenseRelease`
 *   `kSbDrmSessionRequestTypeIndividualizationRequest`
 
-### SbDrmStatus ###
+### SbDrmStatus
 
 The status of session related operations. Used by
 `SbDrmSessionUpdateRequestFunc`, `SbDrmSessionUpdatedFunc`, and
 `SbDrmServerCertificateUpdatedFunc` to indicate the status of the operation. [https://w3c.github.io/encrypted-media/#error-names](https://w3c.github.io/encrypted-media/#error-names)
 
-#### Values ####
+#### Values
 
 *   `kSbDrmStatusSuccess`
 *   `kSbDrmStatusTypeError`
@@ -70,42 +70,42 @@
     The following error can be used when the error status cannot be mapped to
     one of the above errors.
 
-## Typedefs ##
+## Typedefs
 
-### SbDrmServerCertificateUpdatedFunc ###
+### SbDrmServerCertificateUpdatedFunc
 
 A callback to notify the caller of SbDrmUpdateServerCertificate() whether the
 update has been successfully updated or not.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmServerCertificateUpdatedFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, const char *error_message)
 ```
 
-### SbDrmSessionClosedFunc ###
+### SbDrmSessionClosedFunc
 
 A callback for signalling that a session has been closed by the SbDrmSystem
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionClosedFunc) (SbDrmSystem drm_system, void *context, const void *session_id, int session_id_size)
 ```
 
-### SbDrmSessionKeyStatusesChangedFunc ###
+### SbDrmSessionKeyStatusesChangedFunc
 
 A callback for notifications that the status of one or more keys in a session
 has been changed. All keys of the session and their new status will be passed
 along. Any keys not in the list is considered as deleted.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionKeyStatusesChangedFunc) (SbDrmSystem drm_system, void *context, const void *session_id, int session_id_size, int number_of_keys, const SbDrmKeyId *key_ids, const SbDrmKeyStatus *key_statuses)
 ```
 
-### SbDrmSessionUpdateRequestFunc ###
+### SbDrmSessionUpdateRequestFunc
 
 A callback that will receive generated session update request when requested
 from a SbDrmSystem. `drm_system` will be the DRM system that
@@ -128,13 +128,13 @@
 the correct Promise corresponding to the associated
 SbDrmGenerateSessionUpdateRequest().
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionUpdateRequestFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, SbDrmSessionRequestType type, const char *error_message, const void *session_id, int session_id_size, const void *content, int content_size, const char *url)
 ```
 
-### SbDrmSessionUpdatedFunc ###
+### SbDrmSessionUpdatedFunc
 
 A callback for notifications that a session has been added, and subsequent
 encrypted samples are actively ready to be decoded. `drm_system` will be the DRM
@@ -150,37 +150,37 @@
 `status` is `kSbDrmStatusSuccess` or if no error message can be provided.
 `succeeded` is whether the session was successfully updated or not.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionUpdatedFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, const char *error_message, const void *session_id, int session_id_size)
 ```
 
-### SbDrmSystem ###
+### SbDrmSystem
 
 A handle to a DRM system which can be used with either an SbDecoder or an
 SbPlayer.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbDrmSystemPrivate* SbDrmSystem
 ```
 
-## Structs ##
+## Structs
 
-### SbDrmEncryptionPattern ###
+### SbDrmEncryptionPattern
 
 Encryption pattern of the input sample, as defined in ISO/IEC 23001 part 7.
 
-#### Members ####
+#### Members
 
 *   `uint32_t crypt_byte_block`
 *   `uint32_t skip_byte_block`
 
-### SbDrmKeyId ###
+### SbDrmKeyId
 
-#### Members ####
+#### Members
 
 *   `uint8_t identifier`
 
@@ -188,11 +188,11 @@
     PlayReady, this is the license GUID in packed little-endian binary form.
 *   `int identifier_size`
 
-### SbDrmSampleInfo ###
+### SbDrmSampleInfo
 
 All the optional information needed per sample for encrypted samples.
 
-#### Members ####
+#### Members
 
 *   `SbDrmEncryptionScheme encryption_scheme`
 
@@ -217,13 +217,13 @@
     The clear/encrypted mapping of each subsample in this sample. This must be
     an array of `subsample_count` mappings.
 
-### SbDrmSubSampleMapping ###
+### SbDrmSubSampleMapping
 
 A mapping of clear and encrypted bytes for a single subsample. All subsamples
 within a sample must be encrypted with the same encryption parameters. The clear
 bytes always appear first in the sample.
 
-#### Members ####
+#### Members
 
 *   `int32_t clear_byte_count`
 
@@ -232,21 +232,21 @@
 
     How many bytes of the corresponding subsample are encrypted.
 
-## Functions ##
+## Functions
 
-### SbDrmCloseSession ###
+### SbDrmCloseSession
 
 Clear any internal states/resources related to the specified `session_id`.
 
 `drm_system` must not be `kSbDrmSystemInvalid`. `session_id` must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmCloseSession(SbDrmSystem drm_system, const void *session_id, int session_id_size)
 ```
 
-### SbDrmDestroySystem ###
+### SbDrmDestroySystem
 
 Destroys `drm_system`, which implicitly removes all keys installed in it and
 invalidates all outstanding session update requests. A DRM system cannot be
@@ -258,13 +258,13 @@
 
 `drm_system`: The DRM system to be destroyed. Must not be `kSbDrmSystemInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmDestroySystem(SbDrmSystem drm_system)
 ```
 
-### SbDrmGenerateSessionUpdateRequest ###
+### SbDrmGenerateSessionUpdateRequest
 
 Asynchronously generates a session update request payload for
 `initialization_data`, of `initialization_data_size`, in case sensitive `type`,
@@ -296,13 +296,13 @@
 payload is created. Must not be NULL. `initialization_data_size`: The size of
 the session update request payload.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmGenerateSessionUpdateRequest(SbDrmSystem drm_system, int ticket, const char *type, const void *initialization_data, int initialization_data_size)
 ```
 
-### SbDrmGetMetrics ###
+### SbDrmGetMetrics
 
 Get the metrics of the underlying drm system.
 
@@ -326,13 +326,13 @@
 
 `drm_system` must not be `kSbDrmSystemInvalid`. `size` must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 const void* SbDrmGetMetrics(SbDrmSystem drm_system, int *size)
 ```
 
-### SbDrmIsServerCertificateUpdatable ###
+### SbDrmIsServerCertificateUpdatable
 
 Returns true if server certificate of `drm_system` can be updated via
 SbDrmUpdateServerCertificate(). The return value should remain the same during
@@ -341,33 +341,33 @@
 `drm_system`: The DRM system to check if its server certificate is updatable.
 Must not be `kSbDrmSystemInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDrmIsServerCertificateUpdatable(SbDrmSystem drm_system)
 ```
 
-### SbDrmSystemIsValid ###
+### SbDrmSystemIsValid
 
 Indicates whether `drm_system` is a valid SbDrmSystem.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDrmSystemIsValid(SbDrmSystem drm)
 ```
 
-### SbDrmTicketIsValid ###
+### SbDrmTicketIsValid
 
 Indicates whether `ticket` is a valid ticket.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDrmTicketIsValid(int ticket)
 ```
 
-### SbDrmUpdateServerCertificate ###
+### SbDrmUpdateServerCertificate
 
 Update the server certificate of `drm_system`. The function can be called
 multiple times. It is possible that a call to it happens before the callback of
@@ -384,13 +384,13 @@
 certificate data. Must not be NULL. `certificate_size`: Size of the server
 certificate data.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmUpdateServerCertificate(SbDrmSystem drm_system, int ticket, const void *certificate, int certificate_size)
 ```
 
-### SbDrmUpdateSession ###
+### SbDrmUpdateSession
 
 Update session with `key`, in `drm_system`'s key system, from the license server
 response. Calls `session_updated_callback` with `context` and whether the update
@@ -410,7 +410,7 @@
 thread before this function returns or from another thread. The `session_id`
 must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmUpdateSession(SbDrmSystem drm_system, int ticket, const void *key, int key_size, const void *session_id, int session_id_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/egl.md b/cobalt/site/docs/reference/starboard/modules/14/egl.md
index c8c2120..4afff1a 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/egl.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/egl.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: egl.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `egl.h`
 
 The EGL API provides an interface with accompanying type declarations and
 defines that together provide a single consistent method of EGL usage across
@@ -11,67 +11,67 @@
 versions on different systems, and to remove the requirement for any other code
 to directly pull in and use these system libraries.
 
-## EGL Version ##
+## EGL Version
 
 This API has the ability to support EGL 1.5, however it is not required to
 support anything beyond EGL 1.4. The user is responsible for ensuring that the
 functions from EGL 1.5 they are calling from the interface are valid.
 
-## Macros ##
+## Macros
 
-### SB_EGL_ALPHA_FORMAT ###
+### SB_EGL_ALPHA_FORMAT
 
 EGL_VERSION_1_2
 
-### SB_EGL_ALPHA_SIZE ###
+### SB_EGL_ALPHA_SIZE
 
 EGL_VERSION_1_0
 
-### SB_EGL_BACK_BUFFER ###
+### SB_EGL_BACK_BUFFER
 
 EGL_VERSION_1_1
 
-### SB_EGL_CONFORMANT ###
+### SB_EGL_CONFORMANT
 
 EGL_VERSION_1_3
 
-### SB_EGL_CONTEXT_MAJOR_VERSION ###
+### SB_EGL_CONTEXT_MAJOR_VERSION
 
 EGL_VERSION_1_5
 
-### SB_EGL_DEFAULT_DISPLAY ###
+### SB_EGL_DEFAULT_DISPLAY
 
 EGL_VERSION_1_4
 
-## Typedefs ##
+## Typedefs
 
-### SbEglCastsToProperFunctionPointerType ###
+### SbEglCastsToProperFunctionPointerType
 
 The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/EGL/api/EGL/egl.h](https://www.khronos.org/registry/EGL/api/EGL/egl.h)
 .
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbEglCastsToProperFunctionPointerType) (void)
 ```
 
-### SbEglInt32 ###
+### SbEglInt32
 
 The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h](https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h)
 .
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int32_t SbEglInt32
 ```
 
-## Structs ##
+## Structs
 
-### SbEglInterface ###
+### SbEglInterface
 
-#### Members ####
+#### Members
 
 *   `SbEglBoolean(*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32
     *attrib_list, SbEglConfig *configs, SbEglInt32 config_size, SbEglInt32
diff --git a/cobalt/site/docs/reference/starboard/modules/14/event.md b/cobalt/site/docs/reference/starboard/modules/14/event.md
index 01a9d24..7887d8d 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/event.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/event.md
@@ -1,11 +1,11 @@
----
-layout: doc
-title: "Starboard Module Reference: event.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `event.h`
 
 Defines the event system that wraps the Starboard main loop and entry point.
 
-## The Starboard Application Lifecycle ##
+## The Starboard Application Lifecycle
 
 ```
                * ----------
@@ -78,15 +78,15 @@
 Note that the application is always expected to transition through `BLURRED`,
 `CONCEALED` to `FROZEN` before receiving `Stop` or being killed.
 
-## Enums ##
+## Enums
 
-### SbEventType ###
+### SbEventType
 
 An enumeration of all possible event types dispatched directly by the system.
 Each event is accompanied by a void* data argument, and each event must define
 the type of the value pointed to by that data argument, if any.
 
-#### Values ####
+#### Values
 
 *   `kSbEventTypePreload`
 
@@ -273,55 +273,55 @@
     change in the timezone setting). This should trigger the application to re-
     query the relevant APIs to update the date and time.
 
-## Typedefs ##
+## Typedefs
 
-### SbEventCallback ###
+### SbEventCallback
 
 A function that can be called back from the main Starboard event pump.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbEventCallback) (void *context)
 ```
 
-### SbEventDataDestructor ###
+### SbEventDataDestructor
 
 A function that will cleanly destroy an event data instance of a specific type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbEventDataDestructor) (void *data)
 ```
 
-### SbEventId ###
+### SbEventId
 
 An ID that can be used to refer to a scheduled event.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef uint32_t SbEventId
 ```
 
-## Structs ##
+## Structs
 
-### SbEvent ###
+### SbEvent
 
 Structure representing a Starboard event and its data.
 
-#### Members ####
+#### Members
 
 *   `SbEventType type`
 *   `SbTimeMonotonic timestamp`
 *   `void * data`
 
-### SbEventStartData ###
+### SbEventStartData
 
 Event data for kSbEventTypeStart events.
 
-#### Members ####
+#### Members
 
 *   `char ** argument_values`
 
@@ -333,31 +333,31 @@
 
     The startup link, if any.
 
-### SbEventWindowSizeChangedData ###
+### SbEventWindowSizeChangedData
 
 Event data for kSbEventTypeWindowSizeChanged events.
 
-#### Members ####
+#### Members
 
 *   `SbWindow window`
 *   `SbWindowSize size`
 
-## Functions ##
+## Functions
 
-### SbEventCancel ###
+### SbEventCancel
 
 Cancels the specified `event_id`. Note that this function is a no-op if the
 event already fired. This function can be safely called from any thread, but the
 only way to guarantee that the event does not run anyway is to call it from the
 main Starboard event loop thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbEventCancel(SbEventId event_id)
 ```
 
-### SbEventHandle ###
+### SbEventHandle
 
 The entry point that Starboard applications MUST implement. Any memory pointed
 at by `event` or the `data` field inside `event` is owned by the system, and
@@ -370,23 +370,23 @@
 application should generally do as little work as possible on this thread, and
 just dispatch it over to another thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SB_IMPORT void SbEventHandle(const SbEvent *event)
 ```
 
-### SbEventIsIdValid ###
+### SbEventIsIdValid
 
 Returns whether the given event handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbEventIsIdValid(SbEventId handle)
 ```
 
-### SbEventSchedule ###
+### SbEventSchedule
 
 Schedules an event `callback` into the main Starboard event loop. This function
 may be called from any thread, but `callback` is always called from the main
@@ -397,7 +397,7 @@
 of microseconds to wait before calling the `callback` function. Set `delay` to
 `0` to call the callback as soon as possible.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbEventId SbEventSchedule(SbEventCallback callback, void *context, SbTime delay)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/export.md b/cobalt/site/docs/reference/starboard/modules/14/export.md
index ff79777..a398d4a 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/export.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/export.md
@@ -1,24 +1,24 @@
----
-layout: doc
-title: "Starboard Module Reference: export.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `export.h`
 
 Provides macros for properly exporting or importing symbols from shared
 libraries.
 
-## Macros ##
+## Macros
 
-### SB_EXPORT ###
+### SB_EXPORT
 
 Specification for a symbol that should be exported when building the DLL and
 imported when building code that uses the DLL.
 
-### SB_EXPORT_PRIVATE ###
+### SB_EXPORT_PRIVATE
 
 Specification for a symbol that should be exported or imported for testing
 purposes only.
 
-### SB_IMPORT ###
+### SB_IMPORT
 
 Specification for a symbol that is expected to be defined externally to this
 module.
diff --git a/cobalt/site/docs/reference/starboard/modules/14/file.md b/cobalt/site/docs/reference/starboard/modules/14/file.md
index 56eb415..103af47 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/file.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/file.md
@@ -1,25 +1,25 @@
----
-layout: doc
-title: "Starboard Module Reference: file.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `file.h`
 
 Defines file system input/output functions.
 
-## Macros ##
+## Macros
 
-### kSbFileInvalid ###
+### kSbFileInvalid
 
 Well-defined value for an invalid file handle.
 
-## Enums ##
+## Enums
 
-### SbFileError ###
+### SbFileError
 
 kSbFileErrorAccessDenied is returned when a call fails because of a filesystem
 restriction. kSbFileErrorSecurity is returned when a security policy doesn't
 allow the operation to be executed.
 
-#### Values ####
+#### Values
 
 *   `kSbFileOk`
 *   `kSbFileErrorFailed`
@@ -40,7 +40,7 @@
 *   `kSbFileErrorIO`
 *   `kSbFileErrorMax`
 
-### SbFileFlags ###
+### SbFileFlags
 
 Flags that define how a file is used in the application. These flags should be
 or'd together when passed to SbFileOpen to open or create a file.
@@ -66,7 +66,7 @@
 
 The `kSbFileAsync` flag is optional.
 
-#### Values ####
+#### Values
 
 *   `kSbFileOpenOnly`
 *   `kSbFileCreateOnly`
@@ -85,35 +85,35 @@
 *   `kSbFileWrite`
 *   `kSbFileAsync`
 
-### SbFileWhence ###
+### SbFileWhence
 
 This explicit mapping matches both FILE_ on Windows and SEEK_ on Linux.
 
-#### Values ####
+#### Values
 
 *   `kSbFileFromBegin`
 *   `kSbFileFromCurrent`
 *   `kSbFileFromEnd`
 
-## Typedefs ##
+## Typedefs
 
-### SbFile ###
+### SbFile
 
 A handle to an open file.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbFilePrivate* SbFile
 ```
 
-## Structs ##
+## Structs
 
-### SbFileInfo ###
+### SbFileInfo
 
 Used to hold information about a file.
 
-#### Members ####
+#### Members
 
 *   `int64_t size`
 
@@ -134,9 +134,9 @@
 
     The creation time of a file.
 
-## Functions ##
+## Functions
 
-### SbFileAtomicReplace ###
+### SbFileAtomicReplace
 
 Replaces the content of the file at `path` with `data`. Returns whether the
 contents of the file were replaced. The replacement of the content is an atomic
@@ -146,39 +146,39 @@
 to replace the file contents with. `data_size`: The amount of `data`, in bytes,
 to be written to the file.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileAtomicReplace(const char *path, const char *data, int64_t data_size)
 ```
 
-### SbFileCanOpen ###
+### SbFileCanOpen
 
 Indicates whether SbFileOpen() with the given `flags` is allowed for `path`.
 
 `path`: The absolute path to be checked. `flags`: The flags that are being
 evaluated for the given `path`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileCanOpen(const char *path, int flags)
 ```
 
-### SbFileClose ###
+### SbFileClose
 
 Closes `file`. The return value indicates whether the file was closed
 successfully.
 
 `file`: The absolute path of the file to be closed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileClose(SbFile file)
 ```
 
-### SbFileDelete ###
+### SbFileDelete
 
 Deletes the regular file, symlink, or empty directory at `path`. This function
 is used primarily to clean up after unit tests. On some platforms, this function
@@ -186,38 +186,38 @@
 
 `path`: The absolute path of the file, symlink, or directory to be deleted.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileDelete(const char *path)
 ```
 
-### SbFileExists ###
+### SbFileExists
 
 Indicates whether a file or directory exists at `path`.
 
 `path`: The absolute path of the file or directory being checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileExists(const char *path)
 ```
 
-### SbFileFlush ###
+### SbFileFlush
 
 Flushes the write buffer to `file`. Data written via SbFileWrite is not
 necessarily committed until the SbFile is flushed or closed.
 
 `file`: The SbFile to which the write buffer is flushed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileFlush(SbFile file)
 ```
 
-### SbFileGetInfo ###
+### SbFileGetInfo
 
 Retrieves information about `file`. The return value indicates whether the file
 information was retrieved successfully.
@@ -226,13 +226,13 @@
 into which the retrieved data is placed. This variable is not touched if the
 operation is not successful.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileGetInfo(SbFile file, SbFileInfo *out_info)
 ```
 
-### SbFileGetPathInfo ###
+### SbFileGetPathInfo
 
 Retrieves information about the file at `path`. The return value indicates
 whether the file information was retrieved successfully.
@@ -241,36 +241,36 @@
 `out_info`: The variable into which the retrieved data is placed. This variable
 is not touched if the operation is not successful.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileGetPathInfo(const char *path, SbFileInfo *out_info)
 ```
 
-### SbFileIsValid ###
+### SbFileIsValid
 
 Returns whether the given file handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbFileIsValid(SbFile file)
 ```
 
-### SbFileModeStringToFlags ###
+### SbFileModeStringToFlags
 
 Converts an ISO `fopen()` mode string into flags that can be equivalently passed
 into SbFileOpen().
 
 `mode`: The mode string to be converted into flags.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbFileModeStringToFlags(const char *mode)
 ```
 
-### SbFileOpen ###
+### SbFileOpen
 
 Opens the file at `path`, which must be absolute, creating it if specified by
 `flags`. The read/write position is at the beginning of the file.
@@ -287,13 +287,13 @@
 sets this value to `false`. `out_error`: If `path` cannot be created, this is
 set to `kSbFileInvalid`. Otherwise, it is `NULL`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbFile SbFileOpen(const char *path, int flags, bool *out_created, SbFileError *out_error)
 ```
 
-### SbFileRead ###
+### SbFileRead
 
 Reads `size` bytes (or until EOF is reached) from `file` into `data`, starting
 at the file's current position.
@@ -306,13 +306,13 @@
 `file`: The SbFile from which to read data. `data`: The variable to which data
 is read. `size`: The amount of data (in bytes) to read.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbFileRead(SbFile file, char *data, int size)
 ```
 
-### SbFileReadAll ###
+### SbFileReadAll
 
 Reads `size` bytes (or until EOF is reached) from `file` into `data`, starting
 at the file's current position.
@@ -326,13 +326,13 @@
 `file`: The SbFile from which to read data. `data`: The variable to which data
 is read. `size`: The amount of data (in bytes) to read.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbFileReadAll(SbFile file, char *data, int size)
 ```
 
-### SbFileSeek ###
+### SbFileSeek
 
 Changes the current read/write position in `file`. The return value identifies
 the resultant current read/write position in the file (relative to the start) or
@@ -344,13 +344,13 @@
 value. `offset`: The amount that the read/write position is changed, relative to
 `whence`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbFileSeek(SbFile file, SbFileWhence whence, int64_t offset)
 ```
 
-### SbFileTruncate ###
+### SbFileTruncate
 
 Truncates the given `file` to the given `length`. The return value indicates
 whether the file was truncated successfully.
@@ -360,13 +360,13 @@
 then the file is extended with zeros. If `length` is negative, then the function
 is a no-op and returns `false`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileTruncate(SbFile file, int64_t length)
 ```
 
-### SbFileWrite ###
+### SbFileWrite
 
 Writes the given buffer into `file` at the file's current position, overwriting
 any data that was previously there.
@@ -380,13 +380,13 @@
 `file`: The SbFile to which data will be written. `data`: The data to be
 written. `size`: The amount of data (in bytes) to write.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbFileWrite(SbFile file, const char *data, int size)
 ```
 
-### SbFileWriteAll ###
+### SbFileWriteAll
 
 Writes the given buffer into `file`, starting at the beginning of the file, and
 overwriting any data that was previously there. Unlike SbFileWrite, this
@@ -397,7 +397,7 @@
 `file`: The file to which data will be written. `data`: The data to be written.
 `size`: The amount of data (in bytes) to write.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbFileWriteAll(SbFile file, const char *data, int size)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/gles.md b/cobalt/site/docs/reference/starboard/modules/14/gles.md
index 163d8d7..77bc07e 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/gles.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/gles.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: gles.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `gles.h`
 
 The GLES API provides an interface with accompanying type declarations and
 defines that together provide a single consistent method of GLES usage across
@@ -11,37 +11,37 @@
 and versions on different systems, and to remove the requirement for any other
 code to directly pull in and use these system libraries.
 
-## GLES Version ##
+## GLES Version
 
 This API has the ability to support GLES 3.0, however platforms are not required
 to support anything beyond GLES 2.0. The caller is responsible for ensuring that
 the functions from GLES 3.0 they are calling from the interface are valid.
 
-## Macros ##
+## Macros
 
-### SB_GL_DEPTH_BUFFER_BIT ###
+### SB_GL_DEPTH_BUFFER_BIT
 
 Previously defined in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
 
-### SB_GL_READ_BUFFER ###
+### SB_GL_READ_BUFFER
 
 Previously defined in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
 .
 
-## Typedefs ##
+## Typedefs
 
-### SbGlBoolean ###
+### SbGlBoolean
 
 The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
 .
 
-#### Definition ####
+#### Definition
 
 ```
 typedef uint8_t SbGlBoolean
 ```
 
-### SbGlIntPtr ###
+### SbGlIntPtr
 
 Some compilers will transform the intptr_t to an int transparently behind the
 scenes, which is not equivalent to a long int, or long long int, as far as the
@@ -49,17 +49,17 @@
 those exact types used by OpenGL ES 2.0 ( [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h)
 ).
 
-#### Definition ####
+#### Definition
 
 ```
 typedef long int SbGlIntPtr
 ```
 
-## Structs ##
+## Structs
 
-### SbGlesInterface ###
+### SbGlesInterface
 
-#### Members ####
+#### Members
 
 *   `void(*glActiveTexture)(SbGlEnum texture)`
 
diff --git a/cobalt/site/docs/reference/starboard/modules/14/image.md b/cobalt/site/docs/reference/starboard/modules/14/image.md
index 1427d39..945938a 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/image.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/image.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: image.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `image.h`
 
 API for hardware accelerated image decoding. This module allows for the client
 to feed in raw, encoded data to be decoded directly into an SbDecodeTarget. It
@@ -11,7 +11,7 @@
 All functions in this module are safe to call from any thread at any point in
 time.
 
-## SbImageIsDecodeSupported and SbImageDecode Example ##
+## SbImageIsDecodeSupported and SbImageDecode Example
 
 ```
 SbDecodeTargetProvider* provider = GetProviderFromSomewhere();
@@ -28,9 +28,9 @@
                                              mime_type, format);
 ```
 
-## Functions ##
+## Functions
 
-### SbImageDecode ###
+### SbImageDecode
 
 Attempt to decode encoded `mime_type` image data `data` of size `data_size` into
 an SbDecodeTarget of SbDecodeFormatType `format`, possibly using
@@ -56,13 +56,13 @@
     kSbDecodeTargetInvalid will be returned, with any intermediate allocations
     being cleaned up in the implementation.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbDecodeTarget SbImageDecode(SbDecodeTargetGraphicsContextProvider *context_provider, void *data, int data_size, const char *mime_type, SbDecodeTargetFormat format)
 ```
 
-### SbImageIsDecodeSupported ###
+### SbImageIsDecodeSupported
 
 Whether the current platform supports hardware accelerated decoding an image of
 mime type `mime_type` into SbDecodeTargetFormat `format`. The `mime_type` must
@@ -70,7 +70,7 @@
 program, which means that the results of this function may be cached
 indefinitely.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbImageIsDecodeSupported(const char *mime_type, SbDecodeTargetFormat format)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/input.md b/cobalt/site/docs/reference/starboard/modules/14/input.md
index ec86793..a858c73 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/input.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/input.md
@@ -1,18 +1,18 @@
----
-layout: doc
-title: "Starboard Module Reference: input.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `input.h`
 
 Defines input events and associated data types.
 
-## Enums ##
+## Enums
 
-### SbInputDeviceType ###
+### SbInputDeviceType
 
 Identifies possible input subsystem types. The types of events that each device
 type produces correspond to `SbInputEventType` values.
 
-#### Values ####
+#### Values
 
 *   `kSbInputDeviceTypeGesture`
 
@@ -57,11 +57,11 @@
 
     Produces `Input` events.
 
-### SbInputEventType ###
+### SbInputEventType
 
 The action that an input event represents.
 
-#### Values ####
+#### Values
 
 *   `kSbInputEventTypeMove`
 
@@ -86,13 +86,13 @@
 
     [https://w3c.github.io/uievents/#event-type-input](https://w3c.github.io/uievents/#event-type-input)
 
-## Structs ##
+## Structs
 
-### SbInputData ###
+### SbInputData
 
 Event data for `kSbEventTypeInput` events.
 
-#### Members ####
+#### Members
 
 *   `SbWindow window`
 
@@ -160,11 +160,11 @@
 
     Set to true if the input event is part of a composition event.
 
-### SbInputVector ###
+### SbInputVector
 
 A 2-dimensional vector used to represent points and motion vectors.
 
-#### Members ####
+#### Members
 
 *   `float x`
 *   `float y`
diff --git a/cobalt/site/docs/reference/starboard/modules/14/key.md b/cobalt/site/docs/reference/starboard/modules/14/key.md
index bf8583c..dd7712f 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/key.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/key.md
@@ -1,19 +1,19 @@
----
-layout: doc
-title: "Starboard Module Reference: key.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `key.h`
 
 Defines the canonical set of Starboard key codes.
 
-## Enums ##
+## Enums
 
-### SbKey ###
+### SbKey
 
 A standard set of key codes, ordered by value, that represent each possible
 input key across all kinds of devices. Starboard uses the semi-standard Windows
 virtual key codes documented at: [https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx](https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx)
 
-#### Values ####
+#### Values
 
 *   `kSbKeyUnknown`
 *   `kSbKeyCancel`
@@ -274,11 +274,11 @@
 *   `kSbKeyGamepadRightStickLeft`
 *   `kSbKeyGamepadRightStickRight`
 
-### SbKeyModifiers ###
+### SbKeyModifiers
 
 Bit-mask of key modifiers.
 
-#### Values ####
+#### Values
 
 *   `kSbKeyModifiersNone`
 *   `kSbKeyModifiersAlt`
diff --git a/cobalt/site/docs/reference/starboard/modules/14/log.md b/cobalt/site/docs/reference/starboard/modules/14/log.md
index 42de513..6cf3a49 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/log.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/log.md
@@ -1,18 +1,18 @@
----
-layout: doc
-title: "Starboard Module Reference: log.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `log.h`
 
 Defines core debug logging functions.
 
-## Enums ##
+## Enums
 
-### SbLogPriority ###
+### SbLogPriority
 
 The priority at which a message should be logged. The platform may be configured
 to filter logs by priority, or render them differently.
 
-#### Values ####
+#### Values
 
 *   `kSbLogPriorityUnknown`
 *   `kSbLogPriorityInfo`
@@ -20,9 +20,9 @@
 *   `kSbLogPriorityError`
 *   `kSbLogPriorityFatal`
 
-## Functions ##
+## Functions
 
-### SbLog ###
+### SbLog
 
 Writes `message` to the platform's debug output log. This method is thread-safe,
 and responsible for ensuring that the output from multiple threads is not mixed.
@@ -35,55 +35,55 @@
 termination. That said, platforms can adjust the message to be more suitable for
 their output method by wrapping the text, stripping unprintable characters, etc.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLog(SbLogPriority priority, const char *message)
 ```
 
-### SbLogFlush ###
+### SbLogFlush
 
 Flushes the log buffer on some platforms. This method is safe to call from
 multiple threads.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogFlush()
 ```
 
-### SbLogFormat ###
+### SbLogFormat
 
 A log output method that additionally performs a string format on the data being
 logged.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogFormat(const char *format, va_list args) SB_PRINTF_FORMAT(1
 ```
 
-### SbLogFormatF ###
+### SbLogFormatF
 
 Inline wrapper of SbLogFormat that converts from ellipsis to va_args.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void static void static void SbLogFormatF(const char *format,...) SB_PRINTF_FORMAT(1
 ```
 
-### SbLogIsTty ###
+### SbLogIsTty
 
 Indicates whether the log output goes to a TTY or is being redirected.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbLogIsTty()
 ```
 
-### SbLogRaw ###
+### SbLogRaw
 
 A bare-bones log output method that is async-signal-safe, i.e. safe to call from
 an asynchronous signal handler (e.g. a `SIGSEGV` handler). It should not do any
@@ -91,13 +91,13 @@
 
 `message`: The message to be logged. Must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogRaw(const char *message)
 ```
 
-### SbLogRawDumpStack ###
+### SbLogRawDumpStack
 
 Dumps the stack of the current thread to the log in an async-signal-safe manner,
 i.e. safe to call from an asynchronous signal handler (e.g. a `SIGSEGV`
@@ -108,28 +108,28 @@
 helper functions that might end up on top of every stack dump so that the stack
 dump is just the relevant function stack where the problem occurred.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogRawDumpStack(int frames_to_skip)
 ```
 
-### SbLogRawFormat ###
+### SbLogRawFormat
 
 A formatted log output method that is async-signal-safe, i.e. safe to call from
 an asynchronous signal handler (e.g. a `SIGSEGV` handler).
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogRawFormat(const char *format, va_list args) SB_PRINTF_FORMAT(1
 ```
 
-### SbLogRawFormatF ###
+### SbLogRawFormatF
 
 Inline wrapper of SbLogFormat to convert from ellipsis to va_args.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void static void static void SbLogRawFormatF(const char *format,...) SB_PRINTF_FORMAT(1
diff --git a/cobalt/site/docs/reference/starboard/modules/14/media.md b/cobalt/site/docs/reference/starboard/modules/14/media.md
index f7ccacd..c0ada4a 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/media.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/media.md
@@ -1,28 +1,28 @@
----
-layout: doc
-title: "Starboard Module Reference: media.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `media.h`
 
 Provides media definitions that are common between the Decoder and Player
 interfaces.
 
-## Macros ##
+## Macros
 
-### kSbMediaBitsPerPixelInvalid ###
+### kSbMediaBitsPerPixelInvalid
 
 Value used when a video's bits per pixel is not known.
 
-### kSbMediaVideoResolutionDimensionInvalid ###
+### kSbMediaVideoResolutionDimensionInvalid
 
 Value used when a video's resolution is not known.
 
-## Enums ##
+## Enums
 
-### SbMediaAudioCodec ###
+### SbMediaAudioCodec
 
 Types of audio elementary streams that can be supported.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioCodecNone`
 *   `kSbMediaAudioCodecAac`
@@ -34,11 +34,11 @@
 *   `kSbMediaAudioCodecFlac`
 *   `kSbMediaAudioCodecPcm`
 
-### SbMediaAudioCodingType ###
+### SbMediaAudioCodingType
 
 Possible audio coding types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioCodingTypeNone`
 *   `kSbMediaAudioCodingTypeAac`
@@ -52,11 +52,11 @@
 *   `kSbMediaAudioCodingTypeMpeg3`
 *   `kSbMediaAudioCodingTypePcm`
 
-### SbMediaAudioConnector ###
+### SbMediaAudioConnector
 
 Possible audio connector types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioConnectorNone`
 *   `kSbMediaAudioConnectorAnalog`
@@ -66,11 +66,11 @@
 *   `kSbMediaAudioConnectorSpdif`
 *   `kSbMediaAudioConnectorUsb`
 
-### SbMediaAudioFrameStorageType ###
+### SbMediaAudioFrameStorageType
 
 Possible audio frame storage types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioFrameStorageTypeInterleaved`
 
@@ -86,22 +86,22 @@
     with timestamps 0, 1, 2, etc., the samples are stored in two buffers "L0 L1
     L2 ..." and "R0 R1 R2 ...".
 
-### SbMediaAudioSampleType ###
+### SbMediaAudioSampleType
 
 Possible audio sample types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioSampleTypeInt16Deprecated`
 *   `kSbMediaAudioSampleTypeFloat32`
 
-### SbMediaRangeId ###
+### SbMediaRangeId
 
 This corresponds to the WebM Range enum which is part of WebM color data (see [http://www.webmproject.org/docs/container/#Range](http://www.webmproject.org/docs/container/#Range)
 ). H.264 only uses a bool, which corresponds to the LIMITED/FULL values. Chrome-
 specific values start at 1000.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaRangeIdUnspecified`
 
@@ -117,13 +117,13 @@
     Range is defined by TransferId/MatrixId.
 *   `kSbMediaRangeIdLast`
 
-### SbMediaSupportType ###
+### SbMediaSupportType
 
 Indicates how confident the device is that it can play media resources of the
 given type. The values are a direct map of the canPlayType() method specified at
 the following link: [https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype](https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype)
 
-#### Values ####
+#### Values
 
 *   `kSbMediaSupportTypeNotSupported`
 
@@ -135,11 +135,11 @@
 
     The media type seems to be playable.
 
-### SbMediaType ###
+### SbMediaType
 
 Types of media component streams.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaTypeAudio`
 
@@ -148,11 +148,11 @@
 
     Value used for video streams.
 
-### SbMediaVideoCodec ###
+### SbMediaVideoCodec
 
 Types of video elementary streams that could be supported.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaVideoCodecNone`
 *   `kSbMediaVideoCodecH264`
@@ -164,14 +164,14 @@
 *   `kSbMediaVideoCodecVp8`
 *   `kSbMediaVideoCodecVp9`
 
-## Structs ##
+## Structs
 
-### SbMediaAudioConfiguration ###
+### SbMediaAudioConfiguration
 
 A structure describing the audio configuration parameters of a single audio
 output.
 
-#### Members ####
+#### Members
 
 *   `int index`
 
@@ -193,7 +193,7 @@
     `0` if this device cannot provide this information, in which case the caller
     can probably assume stereo output.
 
-### SbMediaAudioSampleInfo ###
+### SbMediaAudioSampleInfo
 
 An audio sample info, which is a description of a given audio sample. This acts
 as a set of instructions to the audio decoder.
@@ -203,7 +203,7 @@
 Audio-specific configuration field. The `WAVEFORMATEX` structure is specified at
 [http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx](http://msdn.microsoft.com/en-us/library/dd390970(v=vs.85).aspx)x) .
 
-#### Members ####
+#### Members
 
 *   `SbMediaAudioCodec codec`
 
@@ -227,7 +227,7 @@
     The number of bytes per second expected with this format.
 *   `uint16_t block_alignment`
 
-    Byte block alignment, e.g, 4.
+    Byte block alignment, e.g., 4.
 *   `uint16_t bits_per_sample`
 
     The bit depth for the stream this represents, e.g. `8` or `16`.
@@ -238,14 +238,14 @@
 
     The AudioSpecificConfig, as specified in ISO/IEC-14496-3, section 1.6.2.1: [http://read.pudn.com/downloads98/doc/comm/401153/14496/ISO_IEC_14496-3%20Part%203%20Audio/C036083E_SUB1.PDF](http://read.pudn.com/downloads98/doc/comm/401153/14496/ISO_IEC_14496-3%20Part%203%20Audio/C036083E_SUB1.PDF)
 
-### SbMediaColorMetadata ###
+### SbMediaColorMetadata
 
 HDR (High Dynamic Range) Metadata common for HDR10 and WebM/VP9-based HDR
 formats, together with the ColorSpace. HDR reproduces a greater dynamic range of
 luminosity than is possible with standard digital imaging. See the Consumer
 Electronics Association press release: [https://www.cta.tech/News/Press-Releases/2015/August/CEA-Defines-%E2%80%98HDR-Compatible%E2%80%99-Displays.aspx](https://www.cta.tech/News/Press-Releases/2015/August/CEA-Defines-%E2%80%98HDR-Compatible%E2%80%99-Displays.aspx)
 
-#### Members ####
+#### Members
 
 *   `unsigned int bits_per_channel`
 
@@ -326,7 +326,7 @@
     a row-major ordered 3 x 4 submatrix of the 4 x 4 transform matrix. The 4th
     row is completed as (0, 0, 0, 1).
 
-### SbMediaMasteringMetadata ###
+### SbMediaMasteringMetadata
 
 SMPTE 2086 mastering data [http://ieeexplore.ieee.org/document/7291707/](http://ieeexplore.ieee.org/document/7291707/)
 This standard specifies the metadata items to specify the color volume (the
@@ -335,7 +335,7 @@
 independent of any specific digital representation. Also see the WebM container
 guidelines: [https://www.webmproject.org/docs/container/](https://www.webmproject.org/docs/container/)
 
-#### Members ####
+#### Members
 
 *   `float primary_r_chromaticity_x`
 
@@ -370,11 +370,11 @@
     Minimum luminance. Shall be represented in candelas per square meter
     (cd/m^2). In range [0, 9999.99].
 
-### SbMediaVideoSampleInfo ###
+### SbMediaVideoSampleInfo
 
 The set of information required by the decoder or player for each video sample.
 
-#### Members ####
+#### Members
 
 *   `SbMediaVideoCodec codec`
 
@@ -420,9 +420,9 @@
     . This will only be specified on frames where the HDR metadata and color /
     color space might have changed (e.g. keyframes).
 
-## Functions ##
+## Functions
 
-### SbMediaCanPlayMimeAndKeySystem ###
+### SbMediaCanPlayMimeAndKeySystem
 
 Returns information about whether the playback of the specific media described
 by `mime` and encrypted using `key_system` can be played.
@@ -466,13 +466,13 @@
 implementation supports key system with attributes on one key system, it has to
 support key system with attributes on all key systems supported.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMediaSupportType SbMediaCanPlayMimeAndKeySystem(const char *mime, const char *key_system)
 ```
 
-### SbMediaGetAudioBufferBudget ###
+### SbMediaGetAudioBufferBudget
 
 Specifies the maximum amount of memory used by audio buffers of media source
 before triggering a garbage collection. A large value will cause more memory
@@ -480,13 +480,13 @@
 download audio data. Note that the app may experience significant difficulty if
 this value is too low.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetAudioBufferBudget()
 ```
 
-### SbMediaGetAudioConfiguration ###
+### SbMediaGetAudioConfiguration
 
 Retrieves the current physical audio configuration of audio output
 `output_index` on this device and places it in `out_configuration`, which must
@@ -498,37 +498,37 @@
 `out_configuration`: The variable that holds the audio configuration
 information.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMediaGetAudioConfiguration(int output_index, SbMediaAudioConfiguration *out_configuration)
 ```
 
-### SbMediaGetAudioOutputCount ###
+### SbMediaGetAudioOutputCount
 
 Returns the number of audio outputs currently available on this device. Even if
 the number of outputs or their audio configurations can't be determined, it is
 expected that the platform will at least return a single output that supports at
 least stereo.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetAudioOutputCount()
 ```
 
-### SbMediaGetBufferAlignment ###
+### SbMediaGetBufferAlignment
 
 The media buffer will be allocated using the returned alignment. Set this to a
 larger value may increase the memory consumption of media buffers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetBufferAlignment()
 ```
 
-### SbMediaGetBufferAllocationUnit ###
+### SbMediaGetBufferAllocationUnit
 
 When the media stack needs more memory to store media buffers, it will allocate
 extra memory in units returned by SbMediaGetBufferAllocationUnit. This can
@@ -536,13 +536,13 @@
 When SbMediaGetInitialBufferCapacity and this function both return 0, the media
 stack will allocate individual buffers directly using SbMemory functions.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetBufferAllocationUnit()
 ```
 
-### SbMediaGetBufferGarbageCollectionDurationThreshold ###
+### SbMediaGetBufferGarbageCollectionDurationThreshold
 
 Specifies the duration threshold of media source garbage collection. When the
 accumulated duration in a source buffer exceeds this value, the media source
@@ -553,54 +553,54 @@
 return 170 seconds for most of the platforms. But it can be further reduced on
 systems with extremely low memory.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTime SbMediaGetBufferGarbageCollectionDurationThreshold()
 ```
 
-### SbMediaGetBufferPadding ###
+### SbMediaGetBufferPadding
 
 Extra bytes allocated at the end of a media buffer to ensure that the buffer can
 be use optimally by specific instructions like SIMD. Set to 0 to remove any
 padding.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetBufferPadding()
 ```
 
-### SbMediaGetBufferStorageType ###
+### SbMediaGetBufferStorageType
 
 Returns SbMediaBufferStorageType of type `SbMediaStorageTypeMemory` or
 `SbMediaStorageTypeFile`. For memory storage, the media buffers will be stored
 in main memory allocated by SbMemory functions. For file storage, the media
 buffers will be stored in a temporary file in the system cache folder acquired
 by calling SbSystemGetPath() with "kSbSystemPathCacheDirectory". Note that when
-its value is "file" the media stack will still allocate memory to cache the the
+its value is "file" the media stack will still allocate memory to cache the
 buffers in use.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMediaBufferStorageType SbMediaGetBufferStorageType()
 ```
 
-### SbMediaGetInitialBufferCapacity ###
+### SbMediaGetInitialBufferCapacity
 
 The amount of memory that will be used to store media buffers allocated during
 system startup. To allocate a large chunk at startup helps with reducing
 fragmentation and can avoid failures to allocate incrementally. This can return
 0.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetInitialBufferCapacity()
 ```
 
-### SbMediaGetMaxBufferCapacity ###
+### SbMediaGetMaxBufferCapacity
 
 The maximum amount of memory that will be used to store media buffers. This must
 be larger than sum of the video budget and audio budget. This is a soft limit
@@ -615,13 +615,13 @@
 resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
 than non- HDR video.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetMaxBufferCapacity(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
 ```
 
-### SbMediaGetProgressiveBufferBudget ###
+### SbMediaGetProgressiveBufferBudget
 
 The memory used when playing mp4 videos that is not in DASH format. The
 resolution of such videos shouldn't go beyond 1080p. Its value should be less
@@ -633,13 +633,13 @@
 resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
 than non- HDR video.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetProgressiveBufferBudget(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
 ```
 
-### SbMediaGetVideoBufferBudget ###
+### SbMediaGetVideoBufferBudget
 
 Specifies the maximum amount of memory used by video buffers of media source
 before triggering a garbage collection. A large value will cause more memory
@@ -652,13 +652,13 @@
 resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
 than non- HDR video.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetVideoBufferBudget(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
 ```
 
-### SbMediaIsBufferPoolAllocateOnDemand ###
+### SbMediaIsBufferPoolAllocateOnDemand
 
 When either SbMediaGetInitialBufferCapacity or SbMediaGetBufferAllocationUnit
 isn't zero, media buffers will be allocated using a memory pool. Set the
@@ -669,24 +669,24 @@
 release any media buffer memory back to the system even if there is no media
 buffers allocated.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMediaIsBufferPoolAllocateOnDemand()
 ```
 
-### SbMediaIsBufferUsingMemoryPool ###
+### SbMediaIsBufferUsingMemoryPool
 
 If SbMediaGetBufferUsingMemoryPool returns true, it indicates that media buffer
 pools should be allocated on demand, as opposed to using SbMemory* functions.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMediaIsBufferUsingMemoryPool()
 ```
 
-### SbMediaSetAudioWriteDuration ###
+### SbMediaSetAudioWriteDuration
 
 Communicate to the platform how far past `current_playback_position` the app
 will write audio samples. The app will write all samples between
@@ -698,7 +698,7 @@
 as transient or indefinite hanging). The platform may assume `duration` >= 0.5
 seconds.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMediaSetAudioWriteDuration(SbTime duration)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/memory.md b/cobalt/site/docs/reference/starboard/modules/14/memory.md
index a094a66..22b8016 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/memory.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/memory.md
@@ -1,17 +1,17 @@
----
-layout: doc
-title: "Starboard Module Reference: memory.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `memory.h`
 
 Defines functions for memory allocation, alignment, copying, and comparing.
 
-## Porters ##
+## Porters
 
 All of the "Unchecked" and "Free" functions must be implemented, but they should
 not be called directly. The Starboard platform wraps them with extra accounting
 under certain circumstances.
 
-## Porters and Application Developers ##
+## Porters and Application Developers
 
 Nobody should call the "Checked", "Unchecked" or "Free" functions directly
 because that evades Starboard's memory tracking. In both port implementations
@@ -26,14 +26,14 @@
 
 *   The "free" functions are SbMemoryFree() and SbMemoryFreeAligned().
 
-## Enums ##
+## Enums
 
-### SbMemoryMapFlags ###
+### SbMemoryMapFlags
 
 The bitwise OR of these flags should be passed to SbMemoryMap to indicate how
 the mapped memory can be used.
 
-#### Values ####
+#### Values
 
 *   `kSbMemoryMapProtectReserved`
 
@@ -44,9 +44,9 @@
 *   `kSbMemoryMapProtectExec`
 *   `kSbMemoryMapProtectReadWrite`
 
-## Functions ##
+## Functions
 
-### SbMemoryAllocate ###
+### SbMemoryAllocate
 
 Allocates and returns a chunk of memory of at least `size` bytes. This function
 should be called from the client codebase. It is intended to be a drop-in
@@ -58,13 +58,13 @@
 return `NULL` or it may return a unique pointer value that can be passed to
 SbMemoryDeallocate.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocate(size_t size)
 ```
 
-### SbMemoryAllocateAligned ###
+### SbMemoryAllocateAligned
 
 Allocates and returns a chunk of memory of at least `size` bytes, aligned to
 `alignment`. This function should be called from the client codebase. It is
@@ -78,87 +78,87 @@
 `size` is `0`, the function may return `NULL` or it may return a unique aligned
 pointer value that can be passed to SbMemoryDeallocateAligned.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateAligned(size_t alignment, size_t size)
 ```
 
-### SbMemoryAllocateAlignedChecked ###
+### SbMemoryAllocateAlignedChecked
 
 Same as SbMemoryAllocateAlignedUnchecked, but will abort() in the case of an
 allocation failure.
 
 DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateAlignedChecked(size_t alignment, size_t size)
 ```
 
-### SbMemoryAllocateAlignedUnchecked ###
+### SbMemoryAllocateAlignedUnchecked
 
 This is the implementation of SbMemoryAllocateAligned that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateAlignedUnchecked(size_t alignment, size_t size)
 ```
 
-### SbMemoryAllocateChecked ###
+### SbMemoryAllocateChecked
 
 Same as SbMemoryAllocateUnchecked, but will abort() in the case of an allocation
 failure.
 
 DO NOT CALL. Call SbMemoryAllocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateChecked(size_t size)
 ```
 
-### SbMemoryAllocateNoReport ###
+### SbMemoryAllocateNoReport
 
 Same as SbMemoryAllocate() but will not report memory to the tracker. Avoid
 using this unless absolutely necessary.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateNoReport(size_t size)
 ```
 
-### SbMemoryAllocateUnchecked ###
+### SbMemoryAllocateUnchecked
 
 This is the implementation of SbMemoryAllocate that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryAllocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateUnchecked(size_t size)
 ```
 
-### SbMemoryCalloc ###
+### SbMemoryCalloc
 
 A wrapper that implements a drop-in replacement for `calloc`, which is used in
 some packages.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void* SbMemoryCalloc(size_t count, size_t size)
 ```
 
-### SbMemoryDeallocate ###
+### SbMemoryDeallocate
 
 Frees a previously allocated chunk of memory. If `memory` is NULL, then the
 operation is a no-op. This function should be called from the client codebase.
@@ -166,87 +166,87 @@
 
 `memory`: The chunk of memory to be freed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryDeallocate(void *memory)
 ```
 
-### SbMemoryDeallocateAligned ###
+### SbMemoryDeallocateAligned
 
 `memory`: The chunk of memory to be freed. If `memory` is NULL, then the
 function is a no-op.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryDeallocateAligned(void *memory)
 ```
 
-### SbMemoryDeallocateNoReport ###
+### SbMemoryDeallocateNoReport
 
 Same as SbMemoryDeallocate() but will not report memory deallocation to the
 tracker. This function must be matched with SbMemoryAllocateNoReport().
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryDeallocateNoReport(void *memory)
 ```
 
-### SbMemoryFlush ###
+### SbMemoryFlush
 
 Flushes any data in the given virtual address range that is cached locally in
 the current processor core to physical memory, ensuring that data and
 instruction caches are cleared. This is required to be called on executable
 memory that has been written to and might be executed in the future.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryFlush(void *virtual_address, int64_t size_bytes)
 ```
 
-### SbMemoryFree ###
+### SbMemoryFree
 
 This is the implementation of SbMemoryDeallocate that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryDeallocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryFree(void *memory)
 ```
 
-### SbMemoryFreeAligned ###
+### SbMemoryFreeAligned
 
 This is the implementation of SbMemoryFreeAligned that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryDeallocateAligned(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryFreeAligned(void *memory)
 ```
 
-### SbMemoryGetStackBounds ###
+### SbMemoryGetStackBounds
 
 Gets the stack bounds for the current thread.
 
 `out_high`: The highest addressable byte + 1 for the current thread. `out_low`:
 The lowest addressable byte for the current thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryGetStackBounds(void **out_high, void **out_low)
 ```
 
-### SbMemoryMap ###
+### SbMemoryMap
 
 Allocates `size_bytes` worth of physical memory pages and maps them into an
 available virtual region. This function returns `SB_MEMORY_MAP_FAILED` on
@@ -261,24 +261,24 @@
 should not count it against any memory budget. `name`: A value that appears in
 the debugger on some platforms. The value can be up to 32 bytes.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryMap(int64_t size_bytes, int flags, const char *name)
 ```
 
-### SbMemoryProtect ###
+### SbMemoryProtect
 
 Change the protection of `size_bytes` of memory regions, starting from
 `virtual_address`, to `flags`, returning `true` on success.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMemoryProtect(void *virtual_address, int64_t size_bytes, int flags)
 ```
 
-### SbMemoryReallocate ###
+### SbMemoryReallocate
 
 Attempts to resize `memory` to be at least `size` bytes, without touching the
 contents of memory.
@@ -298,39 +298,39 @@
 `memory` will be resized. If `size` is `0`, the function may return `NULL` or it
 may return a unique pointer value that can be passed to SbMemoryDeallocate.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryReallocate(void *memory, size_t size)
 ```
 
-### SbMemoryReallocateChecked ###
+### SbMemoryReallocateChecked
 
 Same as SbMemoryReallocateUnchecked, but will abort() in the case of an
 allocation failure.
 
 DO NOT CALL. Call SbMemoryReallocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryReallocateChecked(void *memory, size_t size)
 ```
 
-### SbMemoryReallocateUnchecked ###
+### SbMemoryReallocateUnchecked
 
 This is the implementation of SbMemoryReallocate that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryReallocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryReallocateUnchecked(void *memory, size_t size)
 ```
 
-### SbMemoryUnmap ###
+### SbMemoryUnmap
 
 Unmap `size_bytes` of physical pages starting from `virtual_address`, returning
 `true` on success. After this function completes, [virtual_address,
@@ -340,7 +340,7 @@
 `(void*)0xA000`, and another call to `SbMemoryMap(0x1000)` returns
 `(void*)0xB000`, `SbMemoryUnmap(0xA000, 0x2000)` should free both regions.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMemoryUnmap(void *virtual_address, int64_t size_bytes)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/memory_reporter.md b/cobalt/site/docs/reference/starboard/modules/14/memory_reporter.md
index d67ef1a..d1273c6 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/memory_reporter.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/memory_reporter.md
@@ -1,57 +1,57 @@
----
-layout: doc
-title: "Starboard Module Reference: memory_reporter.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `memory_reporter.h`
 
 Provides an interface for memory reporting.
 
-## Typedefs ##
+## Typedefs
 
-### SbMemoryReporterOnAlloc ###
+### SbMemoryReporterOnAlloc
 
 A function to report a memory allocation from SbMemoryAllocate(). Note that
 operator new calls SbMemoryAllocate which will delegate to this callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnAlloc) (void *context, const void *memory, size_t size)
 ```
 
-### SbMemoryReporterOnDealloc ###
+### SbMemoryReporterOnDealloc
 
 A function to report a memory deallocation from SbMemoryDeallcoate(). Note that
 operator delete calls SbMemoryDeallocate which will delegate to this callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnDealloc) (void *context, const void *memory)
 ```
 
-### SbMemoryReporterOnMapMemory ###
+### SbMemoryReporterOnMapMemory
 
 A function to report a memory mapping from SbMemoryMap().
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnMapMemory) (void *context, const void *memory, size_t size)
 ```
 
-### SbMemoryReporterOnUnMapMemory ###
+### SbMemoryReporterOnUnMapMemory
 
 A function to report a memory unmapping from SbMemoryUnmap().
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnUnMapMemory) (void *context, const void *memory, size_t size)
 ```
 
-## Structs ##
+## Structs
 
-### SbMemoryReporter ###
+### SbMemoryReporter
 
 SbMemoryReporter allows memory reporting via user-supplied functions. The void*
 context is passed to every call back. It's strongly recommended that C-Style
@@ -59,7 +59,7 @@
 compiler. For example, SbMemoryReporter mem_reporter = { MallocCallback, ....
 context };
 
-#### Members ####
+#### Members
 
 *   `SbMemoryReporterOnAlloc on_alloc_cb`
 
@@ -77,9 +77,9 @@
 
     Optional, is passed to callbacks as first argument.
 
-## Functions ##
+## Functions
 
-### SbMemorySetReporter ###
+### SbMemorySetReporter
 
 Sets the MemoryReporter. Any previous memory reporter is unset. No lifetime
 management is done internally on input pointer.
@@ -96,7 +96,7 @@
 SbMemoryReporter* mem_reporter = new ...; SbMemorySetReporter(&mem_reporter);
 ... SbMemorySetReporter(NULL); delete mem_reporter; // May crash.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMemorySetReporter(struct SbMemoryReporter *tracker)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/microphone.md b/cobalt/site/docs/reference/starboard/modules/14/microphone.md
index d760e1e..bcf9e43 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/microphone.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/microphone.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: microphone.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `microphone.h`
 
 Defines functions for microphone creation, control, audio data fetching, and
 destruction. This module supports multiple calls to `SbMicrophoneOpen` and
@@ -31,23 +31,23 @@
 
 1.  Destroy the microphone with `SbMicrophoneDestroy`.
 
-## Macros ##
+## Macros
 
-### kSbMicrophoneIdInvalid ###
+### kSbMicrophoneIdInvalid
 
 Well-defined value for an invalid microphone ID handle.
 
-### kSbMicrophoneInvalid ###
+### kSbMicrophoneInvalid
 
 Well-defined value for an invalid microphone handle.
 
-## Enums ##
+## Enums
 
-### SbMicrophoneType ###
+### SbMicrophoneType
 
 All possible microphone types.
 
-#### Values ####
+#### Values
 
 *   `kSbMicrophoneCamera`
 
@@ -66,37 +66,37 @@
     Unknown microphone type. The microphone could be different than the other
     enum descriptions or could fall under one of those descriptions.
 
-## Typedefs ##
+## Typedefs
 
-### SbMicrophone ###
+### SbMicrophone
 
 An opaque handle to an implementation-private structure that represents a
 microphone.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbMicrophonePrivate* SbMicrophone
 ```
 
-### SbMicrophoneId ###
+### SbMicrophoneId
 
 An opaque handle to an implementation-private structure that represents a
 microphone ID.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbMicrophoneIdPrivate* SbMicrophoneId
 ```
 
-## Structs ##
+## Structs
 
-### SbMicrophoneInfo ###
+### SbMicrophoneInfo
 
 Microphone information.
 
-#### Members ####
+#### Members
 
 *   `SbMicrophoneId id`
 
@@ -116,9 +116,9 @@
     of the microphone type. For example, "Headset Microphone". The string must
     be null terminated.
 
-## Functions ##
+## Functions
 
-### SbMicrophoneClose ###
+### SbMicrophoneClose
 
 Closes the microphone port, stops recording audio on `microphone`, and clears
 the unread buffer if it is not empty. If the microphone has already been
@@ -127,13 +127,13 @@
 
 `microphone`: The microphone to close.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMicrophoneClose(SbMicrophone microphone)
 ```
 
-### SbMicrophoneCreate ###
+### SbMicrophoneCreate
 
 Creates a microphone with the specified ID, audio sample rate, and cached audio
 buffer size. Starboard only requires support for creating one microphone at a
@@ -153,25 +153,25 @@
 this buffer in smaller chunks than this size. This parameter must be set to a
 value greater than zero and the ideal size is `2^n`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMicrophone SbMicrophoneCreate(SbMicrophoneId id, int sample_rate_in_hz, int buffer_size_bytes)
 ```
 
-### SbMicrophoneDestroy ###
+### SbMicrophoneDestroy
 
 Destroys a microphone. If the microphone is in started state, it is first
 stopped and then destroyed. Any data that has been recorded and not read is
 thrown away.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMicrophoneDestroy(SbMicrophone microphone)
 ```
 
-### SbMicrophoneGetAvailable ###
+### SbMicrophoneGetAvailable
 
 Retrieves all currently available microphone information and stores it in
 `out_info_array`. The return value is the number of the available microphones.
@@ -184,43 +184,43 @@
 placed into this output parameter. `info_array_size`: The size of
 `out_info_array`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMicrophoneGetAvailable(SbMicrophoneInfo *out_info_array, int info_array_size)
 ```
 
-### SbMicrophoneIdIsValid ###
+### SbMicrophoneIdIsValid
 
 Indicates whether the given microphone ID is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbMicrophoneIdIsValid(SbMicrophoneId id)
 ```
 
-### SbMicrophoneIsSampleRateSupported ###
+### SbMicrophoneIsSampleRateSupported
 
 Indicates whether the microphone supports the sample rate.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMicrophoneIsSampleRateSupported(SbMicrophoneId id, int sample_rate_in_hz)
 ```
 
-### SbMicrophoneIsValid ###
+### SbMicrophoneIsValid
 
 Indicates whether the given microphone is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbMicrophoneIsValid(SbMicrophone microphone)
 ```
 
-### SbMicrophoneOpen ###
+### SbMicrophoneOpen
 
 Opens the microphone port and starts recording audio on `microphone`.
 
@@ -230,13 +230,13 @@
 open. `microphone`: The microphone that will be opened and will start recording
 audio.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMicrophoneOpen(SbMicrophone microphone)
 ```
 
-### SbMicrophoneRead ###
+### SbMicrophoneRead
 
 Retrieves the recorded audio data from the microphone and writes that data to
 `out_audio_data`.
@@ -255,7 +255,7 @@
 smaller than `min_read_size` of `SbMicrophoneInfo`, the extra audio data that
 has already been read from the device is discarded.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMicrophoneRead(SbMicrophone microphone, void *out_audio_data, int audio_data_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/mutex.md b/cobalt/site/docs/reference/starboard/modules/14/mutex.md
index 05dd810..82ff850 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/mutex.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/mutex.md
@@ -1,24 +1,24 @@
----
-layout: doc
-title: "Starboard Module Reference: mutex.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `mutex.h`
 
 Defines a mutually exclusive lock that can be used to coordinate with other
 threads.
 
-## Macros ##
+## Macros
 
-### SB_MUTEX_MAX_SIZE ###
+### SB_MUTEX_MAX_SIZE
 
 Max size of the SbMutex type.
 
-## Enums ##
+## Enums
 
-### SbMutexResult ###
+### SbMutexResult
 
 Enumeration of possible results from acquiring a mutex.
 
-#### Values ####
+#### Values
 
 *   `kSbMutexAcquired`
 
@@ -30,22 +30,22 @@
 
     The mutex has already been destroyed.
 
-## Typedefs ##
+## Typedefs
 
-### SbMutex ###
+### SbMutex
 
 An opaque handle to a mutex type with reserved memory buffer of size
 SB_MUTEX_MAX_SIZE and aligned at void pointer type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef union SbMutex  SbMutex
 ```
 
-## Functions ##
+## Functions
 
-### SbMutexAcquire ###
+### SbMutexAcquire
 
 Acquires `mutex`, blocking indefinitely. The return value identifies the
 acquisition result. SbMutexes are not reentrant, so a recursive acquisition
@@ -53,13 +53,13 @@
 
 `mutex`: The mutex to be acquired.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMutexResult SbMutexAcquire(SbMutex *mutex)
 ```
 
-### SbMutexAcquireTry ###
+### SbMutexAcquireTry
 
 Acquires `mutex`, without blocking. The return value identifies the acquisition
 result. SbMutexes are not reentrant, so a recursive acquisition has undefined
@@ -67,52 +67,52 @@
 
 `mutex`: The mutex to be acquired.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMutexResult SbMutexAcquireTry(SbMutex *mutex)
 ```
 
-### SbMutexCreate ###
+### SbMutexCreate
 
 Creates a new mutex. The return value indicates whether the function was able to
 create a new mutex.
 
 `out_mutex`: The handle to the newly created mutex.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMutexCreate(SbMutex *out_mutex)
 ```
 
-### SbMutexDestroy ###
+### SbMutexDestroy
 
 Destroys a mutex. The return value indicates whether the destruction was
 successful. Destroying a locked mutex results in undefined behavior.
 
 `mutex`: The mutex to be invalidated.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMutexDestroy(SbMutex *mutex)
 ```
 
-### SbMutexIsSuccess ###
+### SbMutexIsSuccess
 
 Indicates whether the given result is a success. A value of `true` indicates
 that the mutex was acquired.
 
 `result`: The result being checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbMutexIsSuccess(SbMutexResult result)
 ```
 
-### SbMutexRelease ###
+### SbMutexRelease
 
 Releases `mutex` held by the current thread. The return value indicates whether
 the release was successful. Releases should always be successful if `mutex` is
@@ -120,7 +120,7 @@
 
 `mutex`: The mutex to be released.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMutexRelease(SbMutex *mutex)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/once.md b/cobalt/site/docs/reference/starboard/modules/14/once.md
index 2ad1959..d773024 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/once.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/once.md
@@ -1,43 +1,43 @@
----
-layout: doc
-title: "Starboard Module Reference: once.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `once.h`
 
 Onces represent initializations that should only ever happen once per process,
 in a thread-safe way.
 
-## Macros ##
+## Macros
 
-### SB_ONCE_MAX_SIZE ###
+### SB_ONCE_MAX_SIZE
 
 Max size of the SbOnceControl type.
 
-## Typedefs ##
+## Typedefs
 
-### SbOnceControl ###
+### SbOnceControl
 
 An opaque handle to a once control type with reserved memory buffer of size
 SB_ONCE_MAX_SIZE and aligned at void pointer type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef union SbOnceControl  SbOnceControl
 ```
 
-### SbOnceInitRoutine ###
+### SbOnceInitRoutine
 
 Function pointer type for methods that can be called via the SbOnce() system.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbOnceInitRoutine) (void)
 ```
 
-## Functions ##
+## Functions
 
-### SbOnce ###
+### SbOnce
 
 Thread-safely runs `init_routine` only once.
 
@@ -50,7 +50,7 @@
 *   If `once_control` or `init_routine` is invalid, the function returns
     `false`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbOnce(SbOnceControl *once_control, SbOnceInitRoutine init_routine)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/player.md b/cobalt/site/docs/reference/starboard/modules/14/player.md
index 3fd955d..0dab908 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/player.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/player.md
@@ -1,45 +1,45 @@
----
-layout: doc
-title: "Starboard Module Reference: player.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `player.h`
 
 Defines an interface for controlling playback of media elementary streams.
 
-## Macros ##
+## Macros
 
-### SB_PLAYER_INITIAL_TICKET ###
+### SB_PLAYER_INITIAL_TICKET
 
 The value of the initial ticket held by the player before the first seek. The
 player will use this ticket value to make the first call to SbPlayerStatusFunc
 with kSbPlayerStateInitialized.
 
-### SB_PLAYER_NO_DURATION ###
+### SB_PLAYER_NO_DURATION
 
 The value to pass into SbPlayerCreate's `duration_pts` argument for cases where
 the duration is unknown, such as for live streams.
 
-### kSbPlayerInvalid ###
+### kSbPlayerInvalid
 
 Well-defined value for an invalid player.
 
-## Enums ##
+## Enums
 
-### SbPlayerDecoderState ###
+### SbPlayerDecoderState
 
 An indicator of whether the decoder can accept more samples.
 
-#### Values ####
+#### Values
 
 *   `kSbPlayerDecoderStateNeedsData`
 
     The decoder is asking for one more sample.
 
-### SbPlayerSampleSideDataType ###
+### SbPlayerSampleSideDataType
 
 Identify the type of side data accompanied with `SbPlayerSampleInfo`, as side
 data may come from multiple sources.
 
-#### Values ####
+#### Values
 
 *   `kMatroskaBlockAdditional`
 
@@ -48,11 +48,11 @@
     . The first 8 bytes of the data contains the value of BlockAddID in big
     endian format, followed by the content of BlockAdditional.
 
-### SbPlayerState ###
+### SbPlayerState
 
 An indicator of the general playback state.
 
-#### Values ####
+#### Values
 
 *   `kSbPlayerStateInitialized`
 
@@ -76,31 +76,31 @@
 
     The player has been destroyed, and will send no more callbacks.
 
-## Typedefs ##
+## Typedefs
 
-### SbPlayer ###
+### SbPlayer
 
 An opaque handle to an implementation-private structure representing a player.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbPlayerPrivate* SbPlayer
 ```
 
-### SbPlayerDeallocateSampleFunc ###
+### SbPlayerDeallocateSampleFunc
 
 Callback to free the given sample buffer data. When more than one buffer are
 sent in SbPlayerWriteSample(), the implementation only has to call this callback
-with `sample_buffer` points to the the first buffer.
+with `sample_buffer` points to the first buffer.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerDeallocateSampleFunc) (SbPlayer player, void *context, const void *sample_buffer)
 ```
 
-### SbPlayerDecoderStatusFunc ###
+### SbPlayerDecoderStatusFunc
 
 Callback for decoder status updates, called in response to a call to
 SbPlayerSeek() or SbPlayerWriteSample(). This callback will never be called
@@ -114,45 +114,45 @@
 SbPlayerWriteEndOfStream(). The player implementation should update the decoder
 status again after such call to notify its user to continue writing more frames.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerDecoderStatusFunc) (SbPlayer player, void *context, SbMediaType type, SbPlayerDecoderState state, int ticket)
 ```
 
-### SbPlayerErrorFunc ###
+### SbPlayerErrorFunc
 
 Callback for player errors, that may set a `message`. `error`: indicates the
 error code. `message`: provides specific informative diagnostic message about
 the error condition encountered. It is ok for the message to be an empty string
 or NULL if no information is available.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerErrorFunc) (SbPlayer player, void *context, SbPlayerError error, const char *message)
 ```
 
-### SbPlayerStatusFunc ###
+### SbPlayerStatusFunc
 
 Callback for player status updates. These callbacks will happen on a different
 thread than the calling thread, and it is not valid to call SbPlayer functions
 from within this callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerStatusFunc) (SbPlayer player, void *context, SbPlayerState state, int ticket)
 ```
 
-## Structs ##
+## Structs
 
-### SbPlayerCreationParam ###
+### SbPlayerCreationParam
 
 The playback related parameters to pass into SbPlayerCreate() and
 SbPlayerGetPreferredOutputMode().
 
-#### Members ####
+#### Members
 
 *   `SbDrmSystem drm_system`
 
@@ -178,11 +178,11 @@
     should be made available for the application to pull via calls to
     SbPlayerGetCurrentFrame().
 
-### SbPlayerInfo2 ###
+### SbPlayerInfo2
 
 Information about the current media playback state.
 
-#### Members ####
+#### Members
 
 *   `SbTime current_media_timestamp`
 
@@ -229,11 +229,11 @@
     faster than normal speed. When it is less than one, the video is played in a
     slower than normal speed. Negative speeds are not supported.
 
-### SbPlayerSampleInfo ###
+### SbPlayerSampleInfo
 
 Information about the samples to be written into SbPlayerWriteSamples().
 
-#### Members ####
+#### Members
 
 *   `SbMediaType type`
 *   `const void * buffer`
@@ -266,12 +266,12 @@
     The DRM system related info for the media sample. This value is required for
     encrypted samples. Otherwise, it must be `NULL`.
 
-### SbPlayerSampleSideData ###
+### SbPlayerSampleSideData
 
 Side data accompanied with `SbPlayerSampleInfo`, it can be arbitrary binary data
 coming from multiple sources.
 
-#### Members ####
+#### Members
 
 *   `SbPlayerSampleSideDataType type`
 *   `const uint8_t * data`
@@ -282,9 +282,9 @@
 
     The size of the data pointed by `data`, in bytes.
 
-## Functions ##
+## Functions
 
-### SbPlayerDestroy ###
+### SbPlayerDestroy
 
 Destroys `player`, freeing all associated resources.
 
@@ -299,13 +299,13 @@
     SbPlayerDestroy has been called on that player. `player`: The player to be
     destroyed. Must not be `kSbPlayerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerDestroy(SbPlayer player)
 ```
 
-### SbPlayerGetCurrentFrame ###
+### SbPlayerGetCurrentFrame
 
 Given a player created with the kSbPlayerOutputModeDecodeToTexture output mode,
 it will return a SbDecodeTarget representing the current frame to be rasterized.
@@ -317,13 +317,13 @@
 
 `player` must not be `kSbPlayerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbDecodeTarget SbPlayerGetCurrentFrame(SbPlayer player)
 ```
 
-### SbPlayerGetMaximumNumberOfSamplesPerWrite ###
+### SbPlayerGetMaximumNumberOfSamplesPerWrite
 
 Writes a single sample of the given media type to `player`'s input stream. Its
 data may be passed in via more than one buffers. The lifetime of
@@ -337,13 +337,13 @@
 of sample for which the number is retrieved. See the `SbMediaType` enum in
 media.h.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbPlayerGetMaximumNumberOfSamplesPerWrite(SbPlayer player, SbMediaType sample_type)
 ```
 
-### SbPlayerGetPreferredOutputMode ###
+### SbPlayerGetPreferredOutputMode
 
 Returns the preferred output mode of the implementation when a video described
 by `creation_param` is played. It is assumed that it is okay to call
@@ -361,23 +361,23 @@
 and the implementation should try its best effort to return a valid output mode.
 `creation_param` must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbPlayerOutputMode SbPlayerGetPreferredOutputMode(const SbPlayerCreationParam *creation_param)
 ```
 
-### SbPlayerIsValid ###
+### SbPlayerIsValid
 
 Returns whether the given player handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbPlayerIsValid(SbPlayer player)
 ```
 
-### SbPlayerSetBounds ###
+### SbPlayerSetBounds
 
 Sets the player bounds to the given graphics plane coordinates. The changes do
 not take effect until the next graphics frame buffer swap. The default bounds
@@ -398,13 +398,13 @@
 `y`: The y-coordinate of the upper-left corner of the player. `width`: The width
 of the player, in pixels. `height`: The height of the player, in pixels.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerSetBounds(SbPlayer player, int z_index, int x, int y, int width, int height)
 ```
 
-### SbPlayerSetPlaybackRate ###
+### SbPlayerSetPlaybackRate
 
 Set the playback rate of the `player`. `rate` is default to 1.0 which indicates
 the playback is at its original speed. A `rate` greater than one will make the
@@ -419,13 +419,13 @@
 
 `player` must not be `kSbPlayerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbPlayerSetPlaybackRate(SbPlayer player, double playback_rate)
 ```
 
-### SbPlayerSetVolume ###
+### SbPlayerSetVolume
 
 Sets the player's volume.
 
@@ -434,13 +434,13 @@
 `0.0` and `1.0`, inclusive. A value of `0.0` means that the audio should be
 muted, and a value of `1.0` means that it should be played at full volume.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerSetVolume(SbPlayer player, double volume)
 ```
 
-### SbPlayerWriteEndOfStream ###
+### SbPlayerWriteEndOfStream
 
 Writes a marker to `player`'s input stream of `stream_type` indicating that
 there are no more samples for that media type for the remainder of this media
@@ -450,13 +450,13 @@
 `player`: The player to which the marker is written. `stream_type`: The type of
 stream for which the marker is written.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerWriteEndOfStream(SbPlayer player, SbMediaType stream_type)
 ```
 
-### SbPlayerWriteSample2 ###
+### SbPlayerWriteSample2
 
 `sample_type`: The type of sample being written. See the `SbMediaType` enum in
 media.h. `sample_infos`: A pointer to an array of SbPlayerSampleInfo with
@@ -468,7 +468,7 @@
 `sample_infos`. It has to be at least one, and less than the return value of
 SbPlayerGetMaximumNumberOfSamplesPerWrite().
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerWriteSample2(SbPlayer player, SbMediaType sample_type, const SbPlayerSampleInfo *sample_infos, int number_of_sample_infos)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/socket.md b/cobalt/site/docs/reference/starboard/modules/14/socket.md
index 9e0f81b..744c04e 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/socket.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/socket.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: socket.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `socket.h`
 
 Defines Starboard socket I/O functions. Starboard supports IPv4 and IPv6, TCP
 and UDP, server and client sockets. Some platforms may not support IPv6, some
@@ -18,19 +18,19 @@
 TODO: For platforms that do not support sockets at all, they must support at
 least a high-level HTTP client API (to be defined later).
 
-## Macros ##
+## Macros
 
-### kSbSocketInvalid ###
+### kSbSocketInvalid
 
 Well-defined value for an invalid socket handle.
 
-## Enums ##
+## Enums
 
-### SbSocketAddressType ###
+### SbSocketAddressType
 
 All possible address types.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketAddressTypeIpv4`
 
@@ -39,13 +39,13 @@
 
     An IPv6 address, which uses 16 entries of the address buffer.
 
-### SbSocketError ###
+### SbSocketError
 
 Enumeration of all Starboard socket operation results. Despite the enum name,
 note that the value actually describes the outcome of an operation, which is not
 always an error.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketOk`
 
@@ -63,11 +63,11 @@
 
     The operation failed for some other reason not specified above.
 
-### SbSocketProtocol ###
+### SbSocketProtocol
 
 All possible IP socket types.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketProtocolTcp`
 
@@ -77,11 +77,11 @@
     The UDP/IP protocol, an unreliable, connectionless, discrete packet
     (datagram) protocol.
 
-### SbSocketResolveFilter ###
+### SbSocketResolveFilter
 
 Bits that can be set when calling SbSocketResolve to filter the results.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketResolveFilterNone`
 
@@ -93,25 +93,25 @@
 
     Include Ipv6 addresses.
 
-## Typedefs ##
+## Typedefs
 
-### SbSocket ###
+### SbSocket
 
 A handle to a socket.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbSocketPrivate* SbSocket
 ```
 
-## Structs ##
+## Structs
 
-### SbSocketAddress ###
+### SbSocketAddress
 
 A representation of any possible supported address type.
 
-#### Members ####
+#### Members
 
 *   `uint8_t address`
 
@@ -126,11 +126,11 @@
     The port component of this socket address. If not specified, it will be
     zero, which is officially undefined.
 
-### SbSocketResolution ###
+### SbSocketResolution
 
 The result of a host name resolution.
 
-#### Members ####
+#### Members
 
 *   `SbSocketAddress* addresses`
 
@@ -139,9 +139,9 @@
 
     The length of the `addresses` array.
 
-## Functions ##
+## Functions
 
-### SbSocketAccept ###
+### SbSocketAccept
 
 Accepts a pending connection on `socket` and returns a new SbSocket representing
 that connection. This function sets the error on `socket` and returns
@@ -149,13 +149,13 @@
 
 `socket`: The SbSocket that is accepting a pending connection.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocket SbSocketAccept(SbSocket socket)
 ```
 
-### SbSocketBind ###
+### SbSocketBind
 
 Binds `socket` to a specific local interface and port specified by
 `local_address`. This function sets and returns the socket error if it is unable
@@ -170,24 +170,24 @@
 *   Setting the IP address to `0.0.0.0` means that the socket should be bound to
     all interfaces.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketBind(SbSocket socket, const SbSocketAddress *local_address)
 ```
 
-### SbSocketClearLastError ###
+### SbSocketClearLastError
 
 Clears the last error set on `socket`. The return value indicates whether the
 socket error was cleared.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketClearLastError(SbSocket socket)
 ```
 
-### SbSocketConnect ###
+### SbSocketConnect
 
 Opens a connection of `socket`'s type to the host and port specified by
 `address`. This function sets and returns the socket error if it is unable to
@@ -197,13 +197,13 @@
 `socket`: The type of connection that should be opened. `address`: The host and
 port to which the socket should connect.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketConnect(SbSocket socket, const SbSocketAddress *address)
 ```
 
-### SbSocketCreate ###
+### SbSocketCreate
 
 Creates a new non-blocking socket for protocol `protocol` using address family
 `address_type`.
@@ -216,13 +216,13 @@
 `address_type`: The type of IP address to use for the socket. `protocol`: The
 protocol to use for the socket.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocket SbSocketCreate(SbSocketAddressType address_type, SbSocketProtocol protocol)
 ```
 
-### SbSocketDestroy ###
+### SbSocketDestroy
 
 Destroys the `socket` by flushing it, closing any connection that may be active
 on it, and reclaiming any resources associated with it, including any
@@ -234,25 +234,25 @@
 
 `socket`: The SbSocket to be destroyed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketDestroy(SbSocket socket)
 ```
 
-### SbSocketFreeResolution ###
+### SbSocketFreeResolution
 
 Frees a resolution allocated by SbSocketResolve.
 
 `resolution`: The resolution to be freed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSocketFreeResolution(SbSocketResolution *resolution)
 ```
 
-### SbSocketGetInterfaceAddress ###
+### SbSocketGetInterfaceAddress
 
 Gets the source address and the netmask that would be used to connect to the
 destination. The netmask parameter is optional, and only populated if a non-NULL
@@ -288,26 +288,26 @@
 value is passed in, this function places the netmask associated with the source
 address in this output variable.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketGetInterfaceAddress(const SbSocketAddress *const destination, SbSocketAddress *out_source_address, SbSocketAddress *out_netmask)
 ```
 
-### SbSocketGetLastError ###
+### SbSocketGetLastError
 
 Returns the last error set on `socket`. If `socket` is not valid, this function
 returns `kSbSocketErrorFailed`.
 
 `socket`: The SbSocket that the last error is returned for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketGetLastError(SbSocket socket)
 ```
 
-### SbSocketGetLocalAddress ###
+### SbSocketGetLocalAddress
 
 Gets the address that this socket is bound to locally, if the socket is
 connected. The return value indicates whether the address was retrieved
@@ -316,59 +316,59 @@
 `socket`: The SbSocket for which the local address is retrieved. `out_address`:
 The SbSocket's local address.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketGetLocalAddress(SbSocket socket, SbSocketAddress *out_address)
 ```
 
-### SbSocketIsConnected ###
+### SbSocketIsConnected
 
 Indicates whether `socket` is connected to anything. Invalid sockets are not
 connected.
 
 `socket`: The SbSocket to be checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketIsConnected(SbSocket socket)
 ```
 
-### SbSocketIsConnectedAndIdle ###
+### SbSocketIsConnectedAndIdle
 
 Returns whether `socket` is connected to anything, and, if so, whether it is
 receiving any data.
 
 `socket`: The SbSocket to be checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketIsConnectedAndIdle(SbSocket socket)
 ```
 
-### SbSocketIsIpv6Supported ###
+### SbSocketIsIpv6Supported
 
 Returns whether IPV6 is supported on the current platform.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketIsIpv6Supported()
 ```
 
-### SbSocketIsValid ###
+### SbSocketIsValid
 
 Returns whether the given socket handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbSocketIsValid(SbSocket socket)
 ```
 
-### SbSocketJoinMulticastGroup ###
+### SbSocketJoinMulticastGroup
 
 Joins `socket` to an IP multicast group identified by `address`. The equivalent
 of IP_ADD_MEMBERSHIP. The return value indicates whether the socket was joined
@@ -377,13 +377,13 @@
 `socket`: The SbSocket to be joined to the IP multicast group. `address`: The
 location of the IP multicast group.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketJoinMulticastGroup(SbSocket socket, const SbSocketAddress *address)
 ```
 
-### SbSocketListen ###
+### SbSocketListen
 
 Causes `socket` to listen on the local address that `socket` was previously
 bound to by SbSocketBind. This function sets and returns the socket error if it
@@ -392,13 +392,13 @@
 
 `socket`: The SbSocket on which the function operates.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketListen(SbSocket socket)
 ```
 
-### SbSocketReceiveFrom ###
+### SbSocketReceiveFrom
 
 Reads up to `data_size` bytes from `socket` into `out_data` and places the
 source address of the packet in `out_source` if out_source is not NULL. Returns
@@ -420,13 +420,13 @@
 the socket. Must not be NULL. `data_size`: The number of bytes to read.
 `out_source`: The source address of the packet.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSocketReceiveFrom(SbSocket socket, char *out_data, int data_size, SbSocketAddress *out_source)
 ```
 
-### SbSocketResolve ###
+### SbSocketResolve
 
 Synchronously resolves `hostname` into the returned SbSocketResolution , which
 must be freed with SbSocketFreeResolution. The function returns `NULL` if it is
@@ -438,13 +438,13 @@
 However, if one IP address family filter is specified, only that address family
 is included. The function ignores unrecognized filter bits.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketResolution* SbSocketResolve(const char *hostname, int filters)
 ```
 
-### SbSocketSendTo ###
+### SbSocketSendTo
 
 Writes up to `data_size` bytes of `data` to `destination` via `socket`. Returns
 the number of bytes written, or a negative number if there is an error, in which
@@ -466,13 +466,13 @@
 connected persistently, so setting `destination` when sending to a TCP socket
 will cause an error.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSocketSendTo(SbSocket socket, const char *data, int data_size, const SbSocketAddress *destination)
 ```
 
-### SbSocketSetBroadcast ###
+### SbSocketSetBroadcast
 
 Sets the `SO_BROADCAST`, or equivalent, option to `value` on `socket`. The
 return value indicates whether the option was actually set.
@@ -483,13 +483,13 @@
 `socket`: The SbSocket for which the option is set. `value`: The new value for
 the option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetBroadcast(SbSocket socket, bool value)
 ```
 
-### SbSocketSetReceiveBufferSize ###
+### SbSocketSetReceiveBufferSize
 
 Sets the `SO_RCVBUF`, or equivalent, option to `size` on `socket`. The return
 value indicates whether the option was actually set.
@@ -497,13 +497,13 @@
 `socket`: The SbSocket for which the option is set. `size`: The value for the
 option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetReceiveBufferSize(SbSocket socket, int32_t size)
 ```
 
-### SbSocketSetReuseAddress ###
+### SbSocketSetReuseAddress
 
 Sets the `SO_REUSEADDR`, or equivalent, option to `value` on `socket`. The
 return value indicates whether the option was actually set.
@@ -514,13 +514,13 @@
 `socket`: The SbSocket for which the option is set. `value`: The new value for
 the option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetReuseAddress(SbSocket socket, bool value)
 ```
 
-### SbSocketSetSendBufferSize ###
+### SbSocketSetSendBufferSize
 
 Sets the `SO_SNDBUF`, or equivalent, option to `size` on `socket`. The return
 value indicates whether the option was actually set.
@@ -528,13 +528,13 @@
 `socket`: The SbSocket for which the option is set. `size`: The value for the
 option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetSendBufferSize(SbSocket socket, int32_t size)
 ```
 
-### SbSocketSetTcpKeepAlive ###
+### SbSocketSetTcpKeepAlive
 
 Sets the `SO_KEEPALIVE`, or equivalent, option to `value` on `socket`. The
 return value indicates whether the option was actually set.
@@ -545,13 +545,13 @@
 The time between keep-alive packets. This value is only relevant if `value` is
 `true`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetTcpKeepAlive(SbSocket socket, bool value, SbTime period)
 ```
 
-### SbSocketSetTcpNoDelay ###
+### SbSocketSetTcpNoDelay
 
 Sets the `TCP_NODELAY`, or equivalent, option to `value` on `socket`. The return
 value indicates whether the option was actually set.
@@ -564,13 +564,13 @@
 `socket`: The SbSocket for which the option is set. `value`: Indicates whether
 the Nagle algorithm should be disabled (`value`=`true`).
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetTcpNoDelay(SbSocket socket, bool value)
 ```
 
-### SbSocketSetTcpWindowScaling ###
+### SbSocketSetTcpWindowScaling
 
 Sets the `SO_WINSCALE`, or equivalent, option to `value` on `socket`. The return
 value indicates whether the option was actually set.
@@ -578,7 +578,7 @@
 `socket`: The SbSocket for which the option is set. `value`: The value for the
 option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetTcpWindowScaling(SbSocket socket, bool value)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/socket_waiter.md b/cobalt/site/docs/reference/starboard/modules/14/socket_waiter.md
index 855dcf8..f1c6bd8 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/socket_waiter.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/socket_waiter.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: socket_waiter.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `socket_waiter.h`
 
 Allows a thread to wait on many sockets at once. The standard usage pattern
 would be for a single I/O thread to:
@@ -26,19 +26,19 @@
 queuing the work item, or the SbSocketWaiter is not otherwise guaranteed to wake
 up.
 
-## Macros ##
+## Macros
 
-### kSbSocketWaiterInvalid ###
+### kSbSocketWaiterInvalid
 
 Well-defined value for an invalid socket watcher handle.
 
-## Enums ##
+## Enums
 
-### SbSocketWaiterInterest ###
+### SbSocketWaiterInterest
 
 All the interests that a socket may register for on a waiter.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketWaiterInterestNone`
 
@@ -50,11 +50,11 @@
 
     An interest in or readiness to write to a socket without blocking.
 
-### SbSocketWaiterResult ###
+### SbSocketWaiterResult
 
 Possible reasons why a call to SbSocketWaiterWaitTimed returned.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketWaiterResultInvalid`
 
@@ -66,31 +66,31 @@
 
     The wait stopped because a call to SbSocketWaiterWakeUp was consumed.
 
-## Typedefs ##
+## Typedefs
 
-### SbSocketWaiter ###
+### SbSocketWaiter
 
 A handle to a socket waiter.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbSocketWaiterPrivate* SbSocketWaiter
 ```
 
-### SbSocketWaiterCallback ###
+### SbSocketWaiterCallback
 
 Function pointer for socket waiter callbacks.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbSocketWaiterCallback) (SbSocketWaiter waiter, SbSocket socket, void *context, int ready_interests)
 ```
 
-## Functions ##
+## Functions
 
-### SbSocketWaiterAdd ###
+### SbSocketWaiterAdd
 
 Adds a new socket to be waited on by the `waiter` with a bitfield of
 `interests`. This function should only be called on the thread that waits on
@@ -120,25 +120,25 @@
     `callback`, even if not all registered `interests` became ready, which
     allows for adding it again in the `callback`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketWaiterAdd(SbSocketWaiter waiter, SbSocket socket, void *context, SbSocketWaiterCallback callback, int interests, bool persistent)
 ```
 
-### SbSocketWaiterCreate ###
+### SbSocketWaiterCreate
 
 The results of two threads waiting on the same waiter is undefined and will not
 work. Except for the SbSocketWaiterWakeUp() function, SbSocketWaiters are not
 thread-safe and don't expect to be modified concurrently.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketWaiter SbSocketWaiterCreate()
 ```
 
-### SbSocketWaiterDestroy ###
+### SbSocketWaiterDestroy
 
 Destroys `waiter` and removes all sockets still registered by way of
 SbSocketWaiterAdd. This function may be called on any thread as long as there is
@@ -146,23 +146,23 @@
 
 `waiter`: The SbSocketWaiter to be destroyed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketWaiterDestroy(SbSocketWaiter waiter)
 ```
 
-### SbSocketWaiterIsValid ###
+### SbSocketWaiterIsValid
 
 Returns whether the given socket handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbSocketWaiterIsValid(SbSocketWaiter watcher)
 ```
 
-### SbSocketWaiterRemove ###
+### SbSocketWaiterRemove
 
 Removes a socket, previously added with SbSocketWaiterAdd(), from a waiter. This
 function should only be called on the thread that waits on this waiter.
@@ -174,26 +174,26 @@
 `waiter`: The waiter from which the socket is removed. `socket`: The socket to
 remove from the waiter.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketWaiterRemove(SbSocketWaiter waiter, SbSocket socket)
 ```
 
-### SbSocketWaiterWait ###
+### SbSocketWaiterWait
 
 Waits on all registered sockets, calling the registered callbacks if and when
 the corresponding sockets become ready for an interested operation. This version
 exits only after SbSocketWaiterWakeUp() is called. This function should only be
 called on the thread that waits on this waiter.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSocketWaiterWait(SbSocketWaiter waiter)
 ```
 
-### SbSocketWaiterWaitTimed ###
+### SbSocketWaiterWaitTimed
 
 Behaves similarly to SbSocketWaiterWait(), but this function also causes
 `waiter` to exit on its own after at least `duration` has passed if
@@ -207,13 +207,13 @@
 function may wait longer than `duration`, such as if the timeout expires while a
 callback is being fired.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketWaiterResult SbSocketWaiterWaitTimed(SbSocketWaiter waiter, SbTime duration)
 ```
 
-### SbSocketWaiterWakeUp ###
+### SbSocketWaiterWakeUp
 
 Wakes up `waiter` once. This is the only thread-safe waiter function. It can can
 be called from a SbSocketWaiterCallback to wake up its own waiter, and it can
@@ -230,7 +230,7 @@
 
 `waiter`: The socket waiter to be woken up.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSocketWaiterWakeUp(SbSocketWaiter waiter)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/speech_synthesis.md b/cobalt/site/docs/reference/starboard/modules/14/speech_synthesis.md
index 1622318..0bd6e65 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/speech_synthesis.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/speech_synthesis.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: speech_synthesis.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `speech_synthesis.h`
 
 A basic text-to-speech API intended to be used for audio accessibility.
 
@@ -11,29 +11,29 @@
 Note that these functions do not have to be thread-safe. They must only be
 called from a single application thread.
 
-## Functions ##
+## Functions
 
-### SbSpeechSynthesisCancel ###
+### SbSpeechSynthesisCancel
 
 Cancels all speaking and queued speech synthesis audio. Must return immediately.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSpeechSynthesisCancel()
 ```
 
-### SbSpeechSynthesisIsSupported ###
+### SbSpeechSynthesisIsSupported
 
 Returns whether the platform supports speech synthesis
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSpeechSynthesisIsSupported()
 ```
 
-### SbSpeechSynthesisSpeak ###
+### SbSpeechSynthesisSpeak
 
 Enqueues `text`, a UTF-8 string, to be spoken. Returns immediately.
 
@@ -44,7 +44,7 @@
 the current speaking should continue and this new text should be queued to play
 when the previous utterances are complete.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSpeechSynthesisSpeak(const char *text)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/storage.md b/cobalt/site/docs/reference/starboard/modules/14/storage.md
index db7e950..5c2b962 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/storage.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/storage.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: storage.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `storage.h`
 
 Defines a user-based Storage API. This is a simple, all-at-once BLOB storage and
 retrieval API that is intended for robust long-term, per-user storage. Some
@@ -15,27 +15,27 @@
 These APIs are NOT expected to be thread-safe, so either call them from a single
 thread, or perform proper synchronization around all calls.
 
-## Macros ##
+## Macros
 
-### kSbStorageInvalidRecord ###
+### kSbStorageInvalidRecord
 
 Well-defined value for an invalid storage record handle.
 
-## Typedefs ##
+## Typedefs
 
-### SbStorageRecord ###
+### SbStorageRecord
 
 A handle to an open storage record.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbStorageRecordPrivate* SbStorageRecord
 ```
 
-## Functions ##
+## Functions
 
-### SbStorageCloseRecord ###
+### SbStorageCloseRecord
 
 Closes `record`, synchronously ensuring that all written data is flushed. This
 function performs blocking I/O on the calling thread.
@@ -47,13 +47,13 @@
 `record`: The storage record to close. `record` is invalid after this point, and
 subsequent calls referring to `record` will fail.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbStorageCloseRecord(SbStorageRecord record)
 ```
 
-### SbStorageDeleteRecord ###
+### SbStorageDeleteRecord
 
 Deletes the `SbStorageRecord` for `user` named `name`. The return value
 indicates whether the record existed and was successfully deleted. If the record
@@ -68,36 +68,36 @@
 `user`: The user for whom the record will be deleted. `name`: The filesystem-
 safe name of the record to open.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbStorageDeleteRecord(SbUser user, const char *name)
 ```
 
-### SbStorageGetRecordSize ###
+### SbStorageGetRecordSize
 
 Returns the size of `record`, or `-1` if there is an error. This function
 performs blocking I/O on the calling thread.
 
 `record`: The record to retrieve the size of.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbStorageGetRecordSize(SbStorageRecord record)
 ```
 
-### SbStorageIsValidRecord ###
+### SbStorageIsValidRecord
 
 Returns whether the given storage record handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbStorageIsValidRecord(SbStorageRecord record)
 ```
 
-### SbStorageOpenRecord ###
+### SbStorageOpenRecord
 
 Opens and returns the SbStorageRecord for `user` named `name`, blocking I/O on
 the calling thread until the open is completed. If `user` is not a valid
@@ -111,13 +111,13 @@
 `user`: The user for which the storage record will be opened. `name`: The
 filesystem-safe name of the record to open.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbStorageRecord SbStorageOpenRecord(SbUser user, const char *name)
 ```
 
-### SbStorageReadRecord ###
+### SbStorageReadRecord
 
 Reads up to `data_size` bytes from `record`, starting at the beginning of the
 record. The function returns the actual number of bytes read, which must be <=
@@ -128,13 +128,13 @@
 `record`: The record to be read. `out_data`: The data read from the record.
 `data_size`: The amount of data, in bytes, to read.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbStorageReadRecord(SbStorageRecord record, char *out_data, int64_t data_size)
 ```
 
-### SbStorageWriteRecord ###
+### SbStorageWriteRecord
 
 Replaces the data in `record` with `data_size` bytes from `data`. This function
 always deletes any previous data in that record. The return value indicates
@@ -151,7 +151,7 @@
 `record`: The record to be written to. `data`: The data to write to the record.
 `data_size`: The amount of `data`, in bytes, to write to the record.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbStorageWriteRecord(SbStorageRecord record, const char *data, int64_t data_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/string.md b/cobalt/site/docs/reference/starboard/modules/14/string.md
index 685f5e8..3fed809 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/string.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/string.md
@@ -1,13 +1,13 @@
----
-layout: doc
-title: "Starboard Module Reference: string.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `string.h`
 
 Defines functions for interacting with c-style strings.
 
-## Functions ##
+## Functions
 
-### SbStringCompareNoCase ###
+### SbStringCompareNoCase
 
 Compares two strings, ignoring differences in case. The return value is:
 
@@ -21,13 +21,13 @@
 
 `string1`: The first string to compare. `string2`: The second string to compare.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringCompareNoCase(const char *string1, const char *string2)
 ```
 
-### SbStringCompareNoCaseN ###
+### SbStringCompareNoCaseN
 
 Compares the first `count` characters of two strings, ignoring differences in
 case. The return value is:
@@ -43,13 +43,13 @@
 `string1`: The first string to compare. `string2`: The second string to compare.
 `count`: The number of characters to compare.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringCompareNoCaseN(const char *string1, const char *string2, size_t count)
 ```
 
-### SbStringDuplicate ###
+### SbStringDuplicate
 
 Copies `source` into a buffer that is allocated by this function and that can be
 freed with SbMemoryDeallocate. This function is meant to be a drop-in
@@ -57,13 +57,13 @@
 
 `source`: The string to be copied.
 
-#### Declaration ####
+#### Declaration
 
 ```
 char* SbStringDuplicate(const char *source)
 ```
 
-### SbStringFormat ###
+### SbStringFormat
 
 Produces a string formatted with `format` and `arguments`, placing as much of
 the result that will fit into `out_buffer`. The return value specifies the
@@ -76,13 +76,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `arguments`: Variable arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringFormat(char *out_buffer, size_t buffer_size, const char *format, va_list arguments) SB_PRINTF_FORMAT(3
 ```
 
-### SbStringFormatF ###
+### SbStringFormatF
 
 An inline wrapper of SbStringFormat that converts from ellipsis to va_args. This
 function is meant to be a drop-in replacement for `snprintf`.
@@ -91,13 +91,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `...`: Arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int static int static int SbStringFormatF(char *out_buffer, size_t buffer_size, const char *format,...) SB_PRINTF_FORMAT(3
 ```
 
-### SbStringFormatUnsafeF ###
+### SbStringFormatUnsafeF
 
 An inline wrapper of SbStringFormat that is meant to be a drop-in replacement
 for the unsafe but commonly used `sprintf`.
@@ -106,13 +106,13 @@
 string that specifies how the data should be formatted. `...`: Arguments used in
 the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int static int SbStringFormatUnsafeF(char *out_buffer, const char *format,...) SB_PRINTF_FORMAT(2
 ```
 
-### SbStringFormatWide ###
+### SbStringFormatWide
 
 This function is identical to SbStringFormat, but is for wide characters. It is
 meant to be a drop-in replacement for `vswprintf`.
@@ -121,13 +121,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `arguments`: Variable arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringFormatWide(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format, va_list arguments)
 ```
 
-### SbStringFormatWideF ###
+### SbStringFormatWideF
 
 An inline wrapper of SbStringFormatWide that converts from ellipsis to
 `va_args`.
@@ -136,13 +136,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `...`: Arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbStringFormatWideF(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format,...)
 ```
 
-### SbStringScan ###
+### SbStringScan
 
 Scans `buffer` for `pattern`, placing the extracted values in `arguments`. The
 return value specifies the number of successfully matched items, which may be
@@ -154,20 +154,20 @@
 for in `buffer`. `arguments`: Values matching `pattern` that were extracted from
 `buffer`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringScan(const char *buffer, const char *pattern, va_list arguments)
 ```
 
-### SbStringScanF ###
+### SbStringScanF
 
 An inline wrapper of SbStringScan that converts from ellipsis to `va_args`. This
 function is meant to be a drop-in replacement for `sscanf`. `buffer`: The string
 to scan for the pattern. `pattern`: The string to search for in `buffer`. `...`:
 Values matching `pattern` that were extracted from `buffer`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbStringScanF(const char *buffer, const char *pattern,...)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/system.md b/cobalt/site/docs/reference/starboard/modules/14/system.md
index 5e4e076..59e7018 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/system.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/system.md
@@ -1,21 +1,21 @@
----
-layout: doc
-title: "Starboard Module Reference: system.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `system.h`
 
 Defines a broad set of APIs that allow the client application to query build and
 runtime properties of the enclosing system.
 
-## Enums ##
+## Enums
 
-### SbSystemCapabilityId ###
+### SbSystemCapabilityId
 
 Runtime capabilities are boolean properties of a platform that can't be
 determined at compile-time. They may vary from device to device, but they will
 not change over the course of a single execution. They often specify particular
 behavior of other APIs within the bounds of their operating range.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemCapabilityReversedEnterAndBack`
 
@@ -26,11 +26,11 @@
     only if) a system has this capability will SbSystemGetTotalGPUMemory() and
     SbSystemGetUsedGPUMemory() be valid to call.
 
-### SbSystemDeviceType ###
+### SbSystemDeviceType
 
 Enumeration of device types.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemDeviceTypeBlueRayDiskPlayer`
 
@@ -63,11 +63,11 @@
 
     Unknown device.
 
-### SbSystemPathId ###
+### SbSystemPathId
 
 Enumeration of special paths that the platform can define.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPathContentDirectory`
 
@@ -103,22 +103,22 @@
     for storing the updates. See
     starboard/doc/evergreen/cobalt_evergreen_overview.md
 
-### SbSystemPlatformErrorResponse ###
+### SbSystemPlatformErrorResponse
 
 Possible responses for `SbSystemPlatformErrorCallback`.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPlatformErrorResponsePositive`
 *   `kSbSystemPlatformErrorResponseNegative`
 *   `kSbSystemPlatformErrorResponseCancel`
 
-### SbSystemPlatformErrorType ###
+### SbSystemPlatformErrorType
 
 Enumeration of possible values for the `type` parameter passed to the
 `SbSystemRaisePlatformError` function.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPlatformErrorTypeConnectionError`
 
@@ -127,12 +127,12 @@
     `kSbSystemPlatformErrorResponsePositive` then the request should be retried,
     otherwise the app should be stopped.
 
-### SbSystemPropertyId ###
+### SbSystemPropertyId
 
 System properties that can be queried for. Many of these are used in User-Agent
 string generation.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPropertyCertificationScope`
 
@@ -189,9 +189,9 @@
     Limit advertising tracking, treated as boolean. Set to nonzero to indicate a
     true value. Corresponds to 'lmt' field.
 
-## Typedefs ##
+## Typedefs
 
-### SbSystemComparator ###
+### SbSystemComparator
 
 Pointer to a function to compare two items. The return value uses standard
 `*cmp` semantics:
@@ -204,23 +204,23 @@
 
 `a`: The first value to compare. `b`: The second value to compare.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int(* SbSystemComparator) (const void *a, const void *b)
 ```
 
-### SbSystemError ###
+### SbSystemError
 
 A type that can represent a system error code across all Starboard platforms.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int SbSystemError
 ```
 
-### SbSystemPlatformErrorCallback ###
+### SbSystemPlatformErrorCallback
 
 Type of callback function that may be called in response to an error
 notification from `SbSystemRaisePlatformError`. `response` is a code to indicate
@@ -228,46 +228,46 @@
 the error. `user_data` is the opaque pointer that was passed to the call to
 `SbSystemRaisePlatformError`.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbSystemPlatformErrorCallback) (SbSystemPlatformErrorResponse response, void *user_data)
 ```
 
-## Functions ##
+## Functions
 
-### SbSystemBreakIntoDebugger ###
+### SbSystemBreakIntoDebugger
 
 Breaks the current program into the debugger, if a debugger is attached. If a
 debugger is not attached, this function aborts the program.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SB_NORETURN void SbSystemBreakIntoDebugger()
 ```
 
-### SbSystemClearLastError ###
+### SbSystemClearLastError
 
 Clears the last error set by a Starboard call in the current thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemClearLastError()
 ```
 
-### SbSystemGetDeviceType ###
+### SbSystemGetDeviceType
 
 Returns the type of the device.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSystemDeviceType SbSystemGetDeviceType()
 ```
 
-### SbSystemGetErrorString ###
+### SbSystemGetErrorString
 
 Generates a human-readable string for an error. The return value specifies the
 total desired length of the string.
@@ -276,13 +276,13 @@
 The generated string. This value may be null, and it is always terminated with a
 null byte. `string_length`: The maximum length of the error string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSystemGetErrorString(SbSystemError error, char *out_string, int string_length)
 ```
 
-### SbSystemGetExtension ###
+### SbSystemGetExtension
 
 Returns pointer to a constant global struct implementing the extension named
 `name`, if it is implemented. Otherwise return NULL. The `name` string must not
@@ -304,25 +304,25 @@
 ignored. As the version of extensions are incremented, fields may be added to
 the end of the struct, but never removed (only deprecated).
 
-#### Declaration ####
+#### Declaration
 
 ```
 const void* SbSystemGetExtension(const char *name)
 ```
 
-### SbSystemGetLastError ###
+### SbSystemGetLastError
 
 Gets the last platform-specific error code produced by any Starboard call in the
 current thread for diagnostic purposes. Semantic reactions to Starboard function
 call results should be modeled explicitly.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSystemError SbSystemGetLastError()
 ```
 
-### SbSystemGetLocaleId ###
+### SbSystemGetLocaleId
 
 Gets the system's current POSIX-style Locale ID. The locale represents the
 location, language, and cultural conventions that the system wants to use, which
@@ -339,25 +339,25 @@
 
 For more information than you probably want about POSIX locales, see: [http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html)
 
-#### Declaration ####
+#### Declaration
 
 ```
 const char* SbSystemGetLocaleId()
 ```
 
-### SbSystemGetNumberOfProcessors ###
+### SbSystemGetNumberOfProcessors
 
 Returns the number of processor cores available to this application. If the
 process is sandboxed to a subset of the physical cores, the function returns
 that sandboxed limit.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSystemGetNumberOfProcessors()
 ```
 
-### SbSystemGetProperty ###
+### SbSystemGetProperty
 
 Retrieves the platform-defined system property specified by `property_id` and
 places its value as a zero-terminated string into the user-allocated `out_value`
@@ -378,13 +378,13 @@
 defined system property specified by `property_id`. `value_length`: The length
 of the system property.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemGetProperty(SbSystemPropertyId property_id, char *out_value, int value_length)
 ```
 
-### SbSystemGetRandomData ###
+### SbSystemGetRandomData
 
 A cryptographically secure random number generator that produces an arbitrary,
 non-negative number of `buffer_size` random, non-negative bytes. The generated
@@ -393,24 +393,24 @@
 `out_buffer`: A pointer for the generated random number. This value must not be
 null. `buffer_size`: The size of the random number, in bytes.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemGetRandomData(void *out_buffer, int buffer_size)
 ```
 
-### SbSystemGetRandomUInt64 ###
+### SbSystemGetRandomUInt64
 
 A cryptographically secure random number generator that gets 64 random bits and
 returns them as an `uint64_t`. This function does not require manual seeding.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint64_t SbSystemGetRandomUInt64()
 ```
 
-### SbSystemGetStack ###
+### SbSystemGetStack
 
 Places up to `stack_size` instruction pointer addresses of the current execution
 stack into `out_stack`. The return value specifies the number of entries added.
@@ -427,62 +427,62 @@
 `stack_size`: The maximum number of instruction pointer addresses to be placed
 into `out_stack` from the current execution stack.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSystemGetStack(void **out_stack, int stack_size)
 ```
 
-### SbSystemGetTotalCPUMemory ###
+### SbSystemGetTotalCPUMemory
 
 Returns the total CPU memory (in bytes) potentially available to this
 application. If the process is sandboxed to a maximum allowable limit, the
 function returns the lesser of the physical and sandbox limits.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetTotalCPUMemory()
 ```
 
-### SbSystemGetTotalGPUMemory ###
+### SbSystemGetTotalGPUMemory
 
 Returns the total GPU memory (in bytes) available for use by this application.
 This function may only be called the return value for calls to
 SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats) is `true`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetTotalGPUMemory()
 ```
 
-### SbSystemGetUsedCPUMemory ###
+### SbSystemGetUsedCPUMemory
 
 Returns the total physical CPU memory (in bytes) used by this application. This
 value should always be less than (or, in particularly exciting situations, equal
 to) SbSystemGetTotalCPUMemory().
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetUsedCPUMemory()
 ```
 
-### SbSystemGetUsedGPUMemory ###
+### SbSystemGetUsedGPUMemory
 
 Returns the current amount of GPU memory (in bytes) that is currently being used
 by this application. This function may only be called if the return value for
 calls to SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats) is
 `true`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetUsedGPUMemory()
 ```
 
-### SbSystemHasCapability ###
+### SbSystemHasCapability
 
 Returns whether the platform has the runtime capability specified by
 `capability_id`. Returns false for any unknown capabilities. This implementation
@@ -490,48 +490,48 @@
 
 `capability_id`: The runtime capability to check.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemHasCapability(SbSystemCapabilityId capability_id)
 ```
 
-### SbSystemHideSplashScreen ###
+### SbSystemHideSplashScreen
 
 Hides the system splash screen on systems that support a splash screen that is
 displayed while the application is loading. This function may be called from any
 thread and must be idempotent.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemHideSplashScreen()
 ```
 
-### SbSystemIsDebuggerAttached ###
+### SbSystemIsDebuggerAttached
 
 Attempts to determine whether the current program is running inside or attached
 to a debugger. The function returns `false` if neither of those cases is true.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemIsDebuggerAttached()
 ```
 
-### SbSystemNetworkIsDisconnected ###
+### SbSystemNetworkIsDisconnected
 
 Returns if the device is disconnected from network. "Disconnected" is chosen
 over connected because disconnection can be determined with more certainty than
 connection usually.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemNetworkIsDisconnected()
 ```
 
-### SbSystemRaisePlatformError ###
+### SbSystemRaisePlatformError
 
 Cobalt calls this function to notify the platform that an error has occurred in
 the application that the platform may need to handle. The platform is expected
@@ -553,13 +553,13 @@
 pointer that the platform should pass as an argument to the callback function,
 if it is called.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemRaisePlatformError(SbSystemPlatformErrorType type, SbSystemPlatformErrorCallback callback, void *user_data)
 ```
 
-### SbSystemRequestBlur ###
+### SbSystemRequestBlur
 
 Requests that the application move into the Blurred state at the next convenient
 point. This should roughly correspond to "unfocused application" in a
@@ -569,13 +569,13 @@
 the application. Before the `kSbEventTypeBlur` event is dispatched, some work
 may continue to be done, and unrelated system events may be dispatched.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestBlur()
 ```
 
-### SbSystemRequestConceal ###
+### SbSystemRequestConceal
 
 Requests that the application move into the Concealed state at the next
 convenient point. This should roughly correspond to "minimization" in a
@@ -590,13 +590,13 @@
 running background tasks. The expectation is that an external system event will
 bring the application out of the Concealed state.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestConceal()
 ```
 
-### SbSystemRequestFocus ###
+### SbSystemRequestFocus
 
 Requests that the application move into the Started state at the next convenient
 point. This should roughly correspond to a "focused application" in a
@@ -607,13 +607,13 @@
 the application. Before `kSbEventTypeFocus` is dispatched, some work may
 continue to be done, and unrelated system events may be dispatched.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestFocus()
 ```
 
-### SbSystemRequestFreeze ###
+### SbSystemRequestFreeze
 
 Requests that the application move into the Frozen state at the next convenient
 point.
@@ -626,13 +626,13 @@
 The expectation is that an external system event will bring the application out
 of the Frozen state.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestFreeze()
 ```
 
-### SbSystemRequestReveal ###
+### SbSystemRequestReveal
 
 Requests that the application move into the Blurred state at the next convenient
 point. This should roughly correspond to a "focused application" in a
@@ -643,13 +643,13 @@
 the application. Before the `kSbEventTypeReveal` event is dispatched, some work
 may continue to be done, and unrelated system events may be dispatched.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestReveal()
 ```
 
-### SbSystemRequestStop ###
+### SbSystemRequestStop
 
 Requests that the application be terminated gracefully at the next convenient
 point. In the meantime, some work may continue to be done, and unrelated system
@@ -660,13 +660,13 @@
 `error_level`: An integer that serves as the return value for the process that
 is eventually terminated as a result of a call to this function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestStop(int error_level)
 ```
 
-### SbSystemSignWithCertificationSecretKey ###
+### SbSystemSignWithCertificationSecretKey
 
 Computes a HMAC-SHA256 digest of `message` into `digest` using the application's
 certification secret. The `message` and the `digest` pointers must not be NULL.
@@ -676,13 +676,13 @@
 an error, or if it is not implemented. In this case the contents of `digest`
 will be undefined.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemSignWithCertificationSecretKey(const uint8_t *message, size_t message_size_in_bytes, uint8_t *digest, size_t digest_size_in_bytes)
 ```
 
-### SbSystemSupportsResume ###
+### SbSystemSupportsResume
 
 Returns false if the platform doesn't need resume after suspend support. In such
 case Cobalt will free up the resource it retains for resume after suspend. Note
@@ -690,13 +690,13 @@
 kSbEventTypeResume to the event handler. The return value of this function
 cannot change over the life time of the application.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemSupportsResume()
 ```
 
-### SbSystemSymbolize ###
+### SbSystemSymbolize
 
 Looks up `address` as an instruction pointer and places up to (`buffer_size -
 1`) characters of the symbol associated with it in `out_buffer`, which must not
@@ -708,7 +708,7 @@
 This function is used in crash signal handlers and, therefore, it must be async-
 signal-safe on platforms that support signals.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemSymbolize(const void *address, char *out_buffer, int buffer_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/thread.md b/cobalt/site/docs/reference/starboard/modules/14/thread.md
index 1191e9a..56c7898 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/thread.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/thread.md
@@ -1,35 +1,35 @@
----
-layout: doc
-title: "Starboard Module Reference: thread.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `thread.h`
 
 Defines functionality related to thread creation and cleanup.
 
-## Macros ##
+## Macros
 
-### kSbThreadContextInvalid ###
+### kSbThreadContextInvalid
 
 Well-defined value for an invalid thread context.
 
-### kSbThreadInvalidId ###
+### kSbThreadInvalidId
 
 Well-defined constant value to mean "no thread ID."
 
-### kSbThreadLocalKeyInvalid ###
+### kSbThreadLocalKeyInvalid
 
 Well-defined constant value to mean "no thread local key."
 
-### kSbThreadNoAffinity ###
+### kSbThreadNoAffinity
 
 Well-defined constant value to mean "no affinity."
 
-### kSbThreadSamplerInvalid ###
+### kSbThreadSamplerInvalid
 
 Well-defined value for an invalid thread sampler.
 
-## Enums ##
+## Enums
 
-### SbThreadPriority ###
+### SbThreadPriority
 
 A spectrum of thread priorities. Platforms map them appropriately to their own
 priority system. Note that scheduling is platform-specific, and what these
@@ -39,7 +39,7 @@
 a given platform. The only guarantee is that each lower priority should be
 treated less-than-or-equal-to a higher priority.
 
-#### Values ####
+#### Values
 
 *   `kSbThreadPriorityLowest`
 
@@ -79,116 +79,116 @@
     inherit the priority of the spawning thread, or it may mean a specific
     default priority, or it may mean something else, depending on the platform.
 
-## Typedefs ##
+## Typedefs
 
-### SbThread ###
+### SbThread
 
 An opaque handle to a thread type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void* SbThread
 ```
 
-### SbThreadAffinity ###
+### SbThreadAffinity
 
 Type for thread core affinity. This generally will be a single cpu (or core or
 hyperthread) identifier. Some platforms may not support affinity, and some may
 have specific rules about how it must be used.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int32_t SbThreadAffinity
 ```
 
-### SbThreadContext ###
+### SbThreadContext
 
 A handle to the context of a frozen thread.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbThreadContextPrivate* SbThreadContext
 ```
 
-### SbThreadEntryPoint ###
+### SbThreadEntryPoint
 
 Function pointer type for SbThreadCreate. `context` is a pointer-sized bit of
 data passed in from the calling thread.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void*(* SbThreadEntryPoint) (void *context)
 ```
 
-### SbThreadId ###
+### SbThreadId
 
 An ID type that is unique per thread.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int32_t SbThreadId
 ```
 
-### SbThreadLocalDestructor ###
+### SbThreadLocalDestructor
 
 Function pointer type for Thread-Local destructors.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbThreadLocalDestructor) (void *value)
 ```
 
-### SbThreadLocalKey ###
+### SbThreadLocalKey
 
 A handle to a thread-local key.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbThreadLocalKeyPrivate* SbThreadLocalKey
 ```
 
-### SbThreadSampler ###
+### SbThreadSampler
 
 A handle to a thread sampler.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbThreadSamplerPrivate* SbThreadSampler
 ```
 
-## Functions ##
+## Functions
 
-### SbThreadContextGetPointer ###
+### SbThreadContextGetPointer
 
 Gets the specified pointer-type `property` from the specified `context`. Returns
 `true` if successful and `out_value` has been modified, otherwise returns
 `false` and `out_value` is not modified.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadContextGetPointer(SbThreadContext context, SbThreadContextProperty property, void **out_value)
 ```
 
-### SbThreadContextIsValid ###
+### SbThreadContextIsValid
 
 Returns whether the given thread context is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadContextIsValid(SbThreadContext context)
 ```
 
-### SbThreadCreate ###
+### SbThreadCreate
 
 Creates a new thread, which starts immediately.
 
@@ -214,13 +214,13 @@
 executed on the newly created thread. `context`: This value will be passed to
 the `entry_point` function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThread SbThreadCreate(int64_t stack_size, SbThreadPriority priority, SbThreadAffinity affinity, bool joinable, const char *name, SbThreadEntryPoint entry_point, void *context)
 ```
 
-### SbThreadCreateLocalKey ###
+### SbThreadCreateLocalKey
 
 Creates and returns a new, unique key for thread local data. If the function
 does not succeed, the function returns `kSbThreadLocalKeyInvalid`.
@@ -233,13 +233,13 @@
 `destructor`: A pointer to a function. The value may be NULL if no clean up is
 needed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadLocalKey SbThreadCreateLocalKey(SbThreadLocalDestructor destructor)
 ```
 
-### SbThreadDestroyLocalKey ###
+### SbThreadDestroyLocalKey
 
 Destroys thread local data for the specified key. The function is a no-op if the
 key is invalid (kSbThreadLocalKeyInvalid`) or has already been destroyed. This
@@ -247,13 +247,13 @@
 
 `key`: The key for which to destroy thread local data.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadDestroyLocalKey(SbThreadLocalKey key)
 ```
 
-### SbThreadDetach ###
+### SbThreadDetach
 
 Detaches `thread`, which prevents it from being joined. This is sort of like a
 non-blocking join. This function is a no-op if the thread is already detached or
@@ -261,33 +261,33 @@
 
 `thread`: The thread to be detached.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadDetach(SbThread thread)
 ```
 
-### SbThreadGetCurrent ###
+### SbThreadGetCurrent
 
 Returns the handle of the currently executing thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThread SbThreadGetCurrent()
 ```
 
-### SbThreadGetId ###
+### SbThreadGetId
 
 Returns the Thread ID of the currently executing thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadId SbThreadGetId()
 ```
 
-### SbThreadGetLocalValue ###
+### SbThreadGetLocalValue
 
 Returns the pointer-sized value for `key` in the currently executing thread's
 local storage. Returns `NULL` if key is `kSbThreadLocalKeyInvalid` or if the key
@@ -295,97 +295,97 @@
 
 `key`: The key for which to return the value.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbThreadGetLocalValue(SbThreadLocalKey key)
 ```
 
-### SbThreadGetName ###
+### SbThreadGetName
 
 Returns the debug name of the currently executing thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadGetName(char *buffer, int buffer_size)
 ```
 
-### SbThreadIsCurrent ###
+### SbThreadIsCurrent
 
 Returns whether `thread` is the current thread.
 
 `thread`: The thread to check.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsCurrent(SbThread thread)
 ```
 
-### SbThreadIsEqual ###
+### SbThreadIsEqual
 
 Indicates whether `thread1` and `thread2` refer to the same thread.
 
 `thread1`: The first thread to compare. `thread2`: The second thread to compare.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadIsEqual(SbThread thread1, SbThread thread2)
 ```
 
-### SbThreadIsValid ###
+### SbThreadIsValid
 
 Returns whether the given thread handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValid(SbThread thread)
 ```
 
-### SbThreadIsValidAffinity ###
+### SbThreadIsValidAffinity
 
 Returns whether the given thread affinity is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidAffinity(SbThreadAffinity affinity)
 ```
 
-### SbThreadIsValidId ###
+### SbThreadIsValidId
 
 Returns whether the given thread ID is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidId(SbThreadId id)
 ```
 
-### SbThreadIsValidLocalKey ###
+### SbThreadIsValidLocalKey
 
 Returns whether the given thread local variable key is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidLocalKey(SbThreadLocalKey key)
 ```
 
-### SbThreadIsValidPriority ###
+### SbThreadIsValidPriority
 
 Returns whether the given thread priority is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidPriority(SbThreadPriority priority)
 ```
 
-### SbThreadJoin ###
+### SbThreadJoin
 
 Joins the thread on which this function is called with joinable `thread`. This
 function blocks the caller until the designated thread exits, and then cleans up
@@ -403,36 +403,36 @@
 then the SbThreadJoin function populates it with the return value of the
 thread's `main` function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadJoin(SbThread thread, void **out_return)
 ```
 
-### SbThreadSamplerCreate ###
+### SbThreadSamplerCreate
 
 Creates a new thread sampler for the specified `thread`.
 
 If successful, this function returns the newly created handle. If unsuccessful,
 this function returns `kSbThreadSamplerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadSampler SbThreadSamplerCreate(SbThread thread)
 ```
 
-### SbThreadSamplerDestroy ###
+### SbThreadSamplerDestroy
 
 Destroys the `sampler` and frees whatever resources it was using.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadSamplerDestroy(SbThreadSampler sampler)
 ```
 
-### SbThreadSamplerFreeze ###
+### SbThreadSamplerFreeze
 
 Suspends execution of the thread that `sampler` was created for.
 
@@ -440,47 +440,47 @@
 from which properties may be read while the thread remains frozen. If
 unsuccessful, this function returns `kSbThreadContextInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadContext SbThreadSamplerFreeze(SbThreadSampler sampler)
 ```
 
-### SbThreadSamplerIsSupported ###
+### SbThreadSamplerIsSupported
 
 Whether the current platform supports thread sampling. The result of this
 function must not change over the course of the program, which means that the
 results of this function may be cached indefinitely. If this returns false,
 `SbThreadSamplerCreate` will return an invalid sampler.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadSamplerIsSupported()
 ```
 
-### SbThreadSamplerIsValid ###
+### SbThreadSamplerIsValid
 
 Returns whether the given thread sampler is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadSamplerIsValid(SbThreadSampler sampler)
 ```
 
-### SbThreadSamplerThaw ###
+### SbThreadSamplerThaw
 
 Resumes execution of the thread that `sampler` was created for. This invalidates
 the context returned from `SbThreadSamplerFreeze`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadSamplerThaw(SbThreadSampler sampler)
 ```
 
-### SbThreadSetLocalValue ###
+### SbThreadSetLocalValue
 
 Sets the pointer-sized value for `key` in the currently executing thread's local
 storage. The return value indicates whether `key` is valid and has not already
@@ -489,26 +489,26 @@
 `key`: The key for which to set the key value. `value`: The new pointer-sized
 key value.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadSetLocalValue(SbThreadLocalKey key, void *value)
 ```
 
-### SbThreadSetName ###
+### SbThreadSetName
 
 Sets the debug name of the currently executing thread by copying the specified
 name string.
 
 `name`: The name to assign to the thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadSetName(const char *name)
 ```
 
-### SbThreadSleep ###
+### SbThreadSleep
 
 Sleeps the currently executing thread.
 
@@ -516,17 +516,17 @@
 executing thread should sleep. The function is a no-op if this value is negative
 or `0`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadSleep(SbTime duration)
 ```
 
-### SbThreadYield ###
+### SbThreadYield
 
 Yields the currently executing thread, so another thread has a chance to run.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadYield()
diff --git a/cobalt/site/docs/reference/starboard/modules/14/time.md b/cobalt/site/docs/reference/starboard/modules/14/time.md
index 19a7e4f..a6228cc 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/time.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/time.md
@@ -1,59 +1,59 @@
----
-layout: doc
-title: "Starboard Module Reference: time.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `time.h`
 
 Provides access to system time and timers.
 
-## Macros ##
+## Macros
 
-### kSbTimeDay ###
+### kSbTimeDay
 
 One day in SbTime units (microseconds).
 
-### kSbTimeHour ###
+### kSbTimeHour
 
 One hour in SbTime units (microseconds).
 
-### kSbTimeMax ###
+### kSbTimeMax
 
 The maximum value of an SbTime.
 
-### kSbTimeMillisecond ###
+### kSbTimeMillisecond
 
 One millisecond in SbTime units (microseconds).
 
-### kSbTimeMinute ###
+### kSbTimeMinute
 
 One minute in SbTime units (microseconds).
 
-### kSbTimeNanosecondsPerMicrosecond ###
+### kSbTimeNanosecondsPerMicrosecond
 
 How many nanoseconds in one SbTime unit (microseconds).
 
-### kSbTimeSecond ###
+### kSbTimeSecond
 
 One second in SbTime units (microseconds).
 
-### kSbTimeToPosixDelta ###
+### kSbTimeToPosixDelta
 
 A term that can be added to an SbTime to convert it into the number of
 microseconds since the POSIX epoch.
 
-## Typedefs ##
+## Typedefs
 
-### SbTime ###
+### SbTime
 
 The number of microseconds since the epoch of January 1, 1601 UTC, or the number
 of microseconds between two times. Always microseconds, ALWAYS UTC.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int64_t SbTime
 ```
 
-### SbTimeMonotonic ###
+### SbTimeMonotonic
 
 A number of microseconds from some point. The main property of this time is that
 it increases monotonically. It should also be as high-resolution a timer as we
@@ -61,38 +61,38 @@
 without worrying about a system clock adjustment. It's not good for getting the
 wall clock time.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int64_t SbTimeMonotonic
 ```
 
-## Functions ##
+## Functions
 
-### SbTimeFromPosix ###
+### SbTimeFromPosix
 
 Converts microseconds from the POSIX epoch into an `SbTime`.
 
 `time`: A time that measures the number of microseconds since January 1, 1970,
 00:00:00, UTC.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbTime SbTimeFromPosix(int64_t time)
 ```
 
-### SbTimeGetMonotonicNow ###
+### SbTimeGetMonotonicNow
 
 Gets a monotonically increasing time representing right now.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTimeMonotonic SbTimeGetMonotonicNow()
 ```
 
-### SbTimeGetMonotonicThreadNow ###
+### SbTimeGetMonotonicThreadNow
 
 Gets a monotonically increasing time representing how long the current thread
 has been in the executing state (i.e. not pre-empted nor waiting on an event).
@@ -100,44 +100,44 @@
 execution time between two timestamps. If this is not available then
 SbTimeGetMonotonicNow() should be used.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTimeMonotonic SbTimeGetMonotonicThreadNow()
 ```
 
-### SbTimeGetNow ###
+### SbTimeGetNow
 
 Gets the current system time as an `SbTime`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTime SbTimeGetNow()
 ```
 
-### SbTimeIsTimeThreadNowSupported ###
+### SbTimeIsTimeThreadNowSupported
 
 Returns whether the current platform supports time thread now
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbTimeIsTimeThreadNowSupported()
 ```
 
-### SbTimeNarrow ###
+### SbTimeNarrow
 
 Safely narrows a number from a more precise unit to a less precise one. This
 function rounds negative values toward negative infinity.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int64_t SbTimeNarrow(int64_t time, int64_t divisor)
 ```
 
-### SbTimeToPosix ###
+### SbTimeToPosix
 
 Converts `SbTime` into microseconds from the POSIX epoch.
 
@@ -145,7 +145,7 @@
 January 1, 1601, UTC, or that measures the number of microseconds between two
 times.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int64_t SbTimeToPosix(SbTime time)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/time_zone.md b/cobalt/site/docs/reference/starboard/modules/14/time_zone.md
index f9e3fcb..baad375 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/time_zone.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/time_zone.md
@@ -1,46 +1,46 @@
----
-layout: doc
-title: "Starboard Module Reference: time_zone.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `time_zone.h`
 
 Provides access to the system time zone information.
 
-## Typedefs ##
+## Typedefs
 
-### SbTimeZone ###
+### SbTimeZone
 
 The number of minutes west of the Greenwich Prime Meridian, NOT including
 Daylight Savings Time adjustments.
 
-For example: PST/PDT is 480 minutes (28800 seconds, 8 hours).
+For example: America/Los_Angeles is 480 minutes (28800 seconds, 8 hours).
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int SbTimeZone
 ```
 
-## Functions ##
+## Functions
 
-### SbTimeZoneGetCurrent ###
+### SbTimeZoneGetCurrent
 
 Gets the system's current SbTimeZone in minutes.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTimeZone SbTimeZoneGetCurrent()
 ```
 
-### SbTimeZoneGetName ###
+### SbTimeZoneGetName
 
-Gets a string representation of the current timezone. Note that the string
-representation can either be standard or daylight saving time. The output can be
-of the form: 1) A three-letter abbreviation such as "PST" or "PDT" (preferred).
-2) A time zone identifier such as "America/Los_Angeles" 3) An un-abbreviated
-name such as "Pacific Standard Time".
+Gets a string representation of the current timezone. The format should be in
+the IANA format [https://data.iana.org/time-zones/theory.html#naming](https://data.iana.org/time-zones/theory.html#naming)) .
+Names normally have the form AREA/LOCATION, where AREA is a continent or ocean,
+and LOCATION is a specific location within the area. Typical names are
+'Africa/Cairo', 'America/New_York', and 'Pacific/Honolulu'.
 
-#### Declaration ####
+#### Declaration
 
 ```
 const char* SbTimeZoneGetName()
diff --git a/cobalt/site/docs/reference/starboard/modules/14/types.md b/cobalt/site/docs/reference/starboard/modules/14/types.md
index 90867a6..e1f372c 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/types.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/types.md
@@ -1,15 +1,15 @@
----
-layout: doc
-title: "Starboard Module Reference: types.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `types.h`
 
 Provides a suite of standard types that should be universally available on all
 platforms, specifically focused on explicitly-sized integer types and booleans.
 This module also includes some related ubiquitous definitions like limits of the
 explicitly-sized integer types, and standard pointer and int32 sentinel values.
 
-## Macros ##
+## Macros
 
-### kSbInvalidInt ###
+### kSbInvalidInt
 
 A value that represents an int that is probably invalid.
diff --git a/cobalt/site/docs/reference/starboard/modules/14/ui_navigation.md b/cobalt/site/docs/reference/starboard/modules/14/ui_navigation.md
index a0ecfb1..cb41767 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/ui_navigation.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/ui_navigation.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: ui_navigation.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `ui_navigation.h`
 
 API to allow applications to take advantage of the platform's native UI engine.
 This is mainly to drive the animation of visual elements and to signal which of
@@ -19,20 +19,20 @@
 user interaction. If the navigation item is a container, then the content offset
 will also be queried to determine the placement of its content items.
 
-## Macros ##
+## Macros
 
-### kSbUiNavItemInvalid ###
+### kSbUiNavItemInvalid
 
 Well-defined value for an invalid navigation item.
 
-## Enums ##
+## Enums
 
-### SbUiNavItemType ###
+### SbUiNavItemType
 
 Navigation items may be one of the following types. This must be specified upon
 item creation and may not change during the item's lifespan.
 
-#### Values ####
+#### Values
 
 *   `kSbUiNavItemTypeFocus`
 
@@ -42,29 +42,29 @@
     This is a container of navigation items which can also be containers
     themselves or focusable items. Containers themselves cannot be focused.
 
-## Typedefs ##
+## Typedefs
 
-### SbUiNavItem ###
+### SbUiNavItem
 
 An opaque handle to an implementation-private structure representing a
 navigation item.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbUiNavItemPrivate* SbUiNavItem
 ```
 
-## Structs ##
+## Structs
 
-### SbUiNavCallbacks ###
+### SbUiNavCallbacks
 
 This structure specifies all the callbacks which the platform UI engine should
 invoke for various interaction events on navigation items. These callbacks may
 be invoked from any thread at any frequency. The `callback_context` is the value
 that was passed on creation of the relevant SbUiNavItem.
 
-#### Members ####
+#### Members
 
 *   `void(*onblur)(SbUiNavItem item, void *callback_context)`
 
@@ -77,12 +77,12 @@
     Invoke when an item's content offset is changed. This is only used with
     container items.
 
-### SbUiNavInterface ###
+### SbUiNavInterface
 
 This structure declares the interface to the UI navigation implementation. All
 function pointers must be specified if the platform supports UI navigation.
 
-#### Members ####
+#### Members
 
 *   `SbUiNavItem(*create_item)(SbUiNavItemType type, const SbUiNavCallbacks
     *callbacks, void *callback_context)`
@@ -237,7 +237,7 @@
     Call `update_function` with `context` to perform a series of UI navigation
     changes atomically before returning.
 
-### SbUiNavItemDir ###
+### SbUiNavItemDir
 
 Navigation items of type kSbUiNavItemTypeContainer have directionality. If
 directionality is not specified for a container, it should default to left-to-
@@ -270,12 +270,12 @@
   Bottom-to-top is similar to right-to-left, but for the Y position.
 ```
 
-#### Members ####
+#### Members
 
 *   `bool is_left_to_right`
 *   `bool is_top_to_bottom`
 
-### SbUiNavMatrix2x3 ###
+### SbUiNavMatrix2x3
 
 This represents a 2x3 transform matrix in row-major order.
 
@@ -284,38 +284,38 @@
 ///   | c d ty |
 ```
 
-#### Members ####
+#### Members
 
 *   `float m`
 
-### SbUiNavMatrix4 ###
+### SbUiNavMatrix4
 
 This represents a 4x4 transform matrix in row-major order.
 
-#### Members ####
+#### Members
 
 *   `float m`
 
-## Functions ##
+## Functions
 
-### SbUiNavGetInterface ###
+### SbUiNavGetInterface
 
 Retrieve the platform's UI navigation implementation. If the platform does not
 provide one, then return false without modifying `out_interface`. Otherwise,
 initialize all members of `out_interface` and return true. The `out_interface`
 pointer must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbUiNavGetInterface(SbUiNavInterface *out_interface)
 ```
 
-### SbUiNavItemIsValid ###
+### SbUiNavItemIsValid
 
 Returns whether the given navigation item handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbUiNavItemIsValid(SbUiNavItem item)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/user.md b/cobalt/site/docs/reference/starboard/modules/14/user.md
index 406e695..309b939 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/user.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/user.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: user.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `user.h`
 
 Defines a user management API. This module defines functions only for managing
 signed-in users. Platforms that do not have users must still implement this API,
@@ -10,19 +10,19 @@
 These APIs are NOT expected to be thread-safe, so either call them from a single
 thread, or perform proper synchronization around all calls.
 
-## Macros ##
+## Macros
 
-### kSbUserInvalid ###
+### kSbUserInvalid
 
 Well-defined value for an invalid user.
 
-## Enums ##
+## Enums
 
-### SbUserPropertyId ###
+### SbUserPropertyId
 
 A set of string properties that can be queried on a user.
 
-#### Values ####
+#### Values
 
 *   `kSbUserPropertyAvatarUrl`
 
@@ -38,21 +38,21 @@
 
     A unique user ID of a user.
 
-## Typedefs ##
+## Typedefs
 
-### SbUser ###
+### SbUser
 
 A handle to a user.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbUserPrivate* SbUser
 ```
 
-## Functions ##
+## Functions
 
-### SbUserGetCurrent ###
+### SbUserGetCurrent
 
 Gets the current primary user, if one exists. This is the user that is
 determined, in a platform-specific way, to be the primary user controlling the
@@ -63,13 +63,13 @@
 It is expected that there will be a unique SbUser per signed-in user, and that
 the referenced objects will persist for the lifetime of the app.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbUser SbUserGetCurrent()
 ```
 
-### SbUserGetProperty ###
+### SbUserGetProperty
 
 Retrieves the value of `property_id` for `user` and places it in `out_value`.
 The function returns:
@@ -83,13 +83,13 @@
 The property for which the data is requested. `out_value`: The retrieved
 property value. `value_size`: The size of the retrieved property value.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbUserGetProperty(SbUser user, SbUserPropertyId property_id, char *out_value, int value_size)
 ```
 
-### SbUserGetPropertySize ###
+### SbUserGetPropertySize
 
 Returns the size of the value of `property_id` for `user`, INCLUDING the
 terminating null character. The function returns `0` if `user` is invalid or if
@@ -98,13 +98,13 @@
 `user`: The user for which property size data is being retrieved. `property_id`:
 The property for which the data is requested.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbUserGetPropertySize(SbUser user, SbUserPropertyId property_id)
 ```
 
-### SbUserGetSignedIn ###
+### SbUserGetSignedIn
 
 Gets a list of up to `users_size` signed-in users and places the results in
 `out_users`. The return value identifies the actual number of signed-in users,
@@ -116,17 +116,17 @@
 `out_users`: Handles for the retrieved users. `users_size`: The maximum number
 of signed-in users to retrieve.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbUserGetSignedIn(SbUser *out_users, int users_size)
 ```
 
-### SbUserIsValid ###
+### SbUserIsValid
 
 Returns whether the given user handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbUserIsValid(SbUser user)
diff --git a/cobalt/site/docs/reference/starboard/modules/14/window.md b/cobalt/site/docs/reference/starboard/modules/14/window.md
index 915e254..acea84d 100644
--- a/cobalt/site/docs/reference/starboard/modules/14/window.md
+++ b/cobalt/site/docs/reference/starboard/modules/14/window.md
@@ -1,40 +1,40 @@
----
-layout: doc
-title: "Starboard Module Reference: window.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `window.h`
 
 Provides functionality to handle Window creation and management.
 
-## Macros ##
+## Macros
 
-### kSbEventOnScreenKeyboardInvalidTicket ###
+### kSbEventOnScreenKeyboardInvalidTicket
 
 System-triggered OnScreenKeyboard events have ticket value
 kSbEventOnScreenKeyboardInvalidTicket.
 
-### kSbWindowInvalid ###
+### kSbWindowInvalid
 
 Well-defined value for an invalid window handle.
 
-## Typedefs ##
+## Typedefs
 
-### SbWindow ###
+### SbWindow
 
 A handle to a window.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbWindowPrivate* SbWindow
 ```
 
-## Structs ##
+## Structs
 
-### SbWindowOptions ###
+### SbWindowOptions
 
 Options that can be requested at window creation time.
 
-#### Members ####
+#### Members
 
 *   `SbWindowSize size`
 
@@ -48,25 +48,25 @@
 
     The name of the window to create.
 
-### SbWindowRect ###
+### SbWindowRect
 
 Defines a rectangle via a point `(x, y)` and a size `(width, height)`. This
 structure is used as output for SbWindowGetOnScreenKeyboardBoundingRect.
 
-#### Members ####
+#### Members
 
 *   `float x`
 *   `float y`
 *   `float width`
 *   `float height`
 
-### SbWindowSize ###
+### SbWindowSize
 
 The size of a window in graphics rendering coordinates. The width and height of
 a window should correspond to the size of the graphics surface used for drawing
 that would be created to back that window.
 
-#### Members ####
+#### Members
 
 *   `int width`
 
@@ -93,9 +93,9 @@
     A value of 0.0f means the ratio could not be determined, it should be
     assumed to be the same as the graphics resolution (i.e. 1.0f).
 
-## Functions ##
+## Functions
 
-### SbWindowBlurOnScreenKeyboard ###
+### SbWindowBlurOnScreenKeyboard
 
 Blur the on screen keyboard. Fire kSbEventTypeOnScreenKeyboardBlurred.
 kSbEventTypeOnScreenKeyboardBlurred has data `ticket`. Calling
@@ -103,13 +103,13 @@
 permitted. Calling SbWindowBlurOnScreenKeyboard while the on screen keyboard is
 not showing does nothing and does not fire any event.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowBlurOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowCreate ###
+### SbWindowCreate
 
 Creates and returns a new system window with the given `options`, which may be
 `NULL`. The function returns `kSbWindowInvalid` if it cannot create the
@@ -131,25 +131,25 @@
 
 `options`: Options that specify parameters for the window being created.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbWindow SbWindowCreate(const SbWindowOptions *options)
 ```
 
-### SbWindowDestroy ###
+### SbWindowDestroy
 
 Destroys `window`, reclaiming associated resources.
 
 `window`: The `SbWindow` to destroy.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowDestroy(SbWindow window)
 ```
 
-### SbWindowFocusOnScreenKeyboard ###
+### SbWindowFocusOnScreenKeyboard
 
 Focus the on screen keyboard. Fire kSbEventTypeOnScreenKeyboardFocused.
 kSbEventTypeOnScreenKeyboardFocused has data `ticket`. Calling
@@ -157,38 +157,38 @@
 permitted. Calling SbWindowFocusOnScreenKeyboard while the on screen keyboard is
 not showing does nothing and does not fire any event.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowFocusOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowGetDiagonalSizeInInches ###
+### SbWindowGetDiagonalSizeInInches
 
 Gets the size of the diagonal between two opposing screen corners.
 
 A return value of 0 means that starboard does not know what the screen diagonal
 is.
 
-#### Declaration ####
+#### Declaration
 
 ```
 float SbWindowGetDiagonalSizeInInches(SbWindow window)
 ```
 
-### SbWindowGetOnScreenKeyboardBoundingRect ###
+### SbWindowGetOnScreenKeyboardBoundingRect
 
 Get the rectangle of the on screen keyboard in screen pixel coordinates. Return
 `true` if successful. Return `false` if the on screen keyboard is not showing.
 If the function returns `false`, then `rect` will not have been modified.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowGetOnScreenKeyboardBoundingRect(SbWindow window, SbWindowRect *bounding_rect)
 ```
 
-### SbWindowGetPlatformHandle ###
+### SbWindowGetPlatformHandle
 
 Gets the platform-specific handle for `window`, which can be passed as an
 EGLNativeWindowType to initialize EGL/GLES. This return value is entirely
@@ -196,13 +196,13 @@
 
 `window`: The SbWindow to retrieve the platform handle for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbWindowGetPlatformHandle(SbWindow window)
 ```
 
-### SbWindowGetSize ###
+### SbWindowGetSize
 
 Retrieves the dimensions of `window` and sets `size` accordingly. This function
 returns `true` if it completes successfully. If the function returns `false`,
@@ -210,81 +210,81 @@
 
 `window`: The SbWindow to retrieve the size of. `size`: The retrieved size.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowGetSize(SbWindow window, SbWindowSize *size)
 ```
 
-### SbWindowHideOnScreenKeyboard ###
+### SbWindowHideOnScreenKeyboard
 
 Hide the on screen keyboard. Fire kSbEventTypeWindowSizeChange and
 kSbEventTypeOnScreenKeyboardHidden if necessary.
 kSbEventTypeOnScreenKeyboardHidden has data `ticket`. Calling
 SbWindowHideOnScreenKeyboard() when the keyboard is already hidden is permitted.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowHideOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowIsOnScreenKeyboardShown ###
+### SbWindowIsOnScreenKeyboardShown
 
 Determine if the on screen keyboard is shown.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowIsOnScreenKeyboardShown(SbWindow window)
 ```
 
-### SbWindowIsValid ###
+### SbWindowIsValid
 
 Returns whether the given window handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbWindowIsValid(SbWindow window)
 ```
 
-### SbWindowOnScreenKeyboardIsSupported ###
+### SbWindowOnScreenKeyboardIsSupported
 
 Return whether the current platform supports an on screen keyboard
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowOnScreenKeyboardIsSupported()
 ```
 
-### SbWindowOnScreenKeyboardSuggestionsSupported ###
+### SbWindowOnScreenKeyboardSuggestionsSupported
 
 Determine if the on screen keyboard has suggestions implemented. If this returns
 false, then calling SbWindowUpdateOnScreenKeyboardSuggestions() will be
 undefined.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowOnScreenKeyboardSuggestionsSupported(SbWindow window)
 ```
 
-### SbWindowSetDefaultOptions ###
+### SbWindowSetDefaultOptions
 
 Sets the default options for system windows.
 
 `options`: The option values to use as default values. This object must not be
 `NULL`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowSetDefaultOptions(SbWindowOptions *options)
 ```
 
-### SbWindowSetOnScreenKeyboardKeepFocus ###
+### SbWindowSetOnScreenKeyboardKeepFocus
 
 Notify the system that `keepFocus` has been set for the OnScreenKeyboard.
 `keepFocus` true indicates that the user may not navigate focus off of the
@@ -293,13 +293,13 @@
 OnScreenKeyboard via input. `keepFocus` is initialized to false in the
 OnScreenKeyboard constructor.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowSetOnScreenKeyboardKeepFocus(SbWindow window, bool keep_focus)
 ```
 
-### SbWindowShowOnScreenKeyboard ###
+### SbWindowShowOnScreenKeyboard
 
 Show the on screen keyboard and populate the input with text `input_text`. Fire
 kSbEventTypeWindowSizeChange and kSbEventTypeOnScreenKeyboardShown if necessary.
@@ -309,13 +309,13 @@
 and the input will be replaced with `input_text`. Showing the on screen keyboard
 does not give it focus.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowShowOnScreenKeyboard(SbWindow window, const char *input_text, int ticket)
 ```
 
-### SbWindowUpdateOnScreenKeyboardSuggestions ###
+### SbWindowUpdateOnScreenKeyboardSuggestions
 
 Update the on screen keyboard custom suggestions. Fire
 kSbEventTypeOnScreenKeyboardSuggestionsUpdated.
@@ -323,7 +323,7 @@
 suggestions should remain up-to-date when the keyboard is shown after being
 hidden.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowUpdateOnScreenKeyboardSuggestions(SbWindow window, const char *suggestions[], int num_suggestions, int ticket)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/accessibility.md b/cobalt/site/docs/reference/starboard/modules/15/accessibility.md
index 1a5adcb..5c66ba4 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/accessibility.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/accessibility.md
@@ -1,17 +1,17 @@
----
-layout: doc
-title: "Starboard Module Reference: accessibility.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `accessibility.h`
 
 Provides access to the system options and settings related to accessibility.
 
-## Enums ##
+## Enums
 
-### SbAccessibilityCaptionCharacterEdgeStyle ###
+### SbAccessibilityCaptionCharacterEdgeStyle
 
 Enum for possible closed captioning character edge styles.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionCharacterEdgeStyleNone`
 *   `kSbAccessibilityCaptionCharacterEdgeStyleRaised`
@@ -19,11 +19,11 @@
 *   `kSbAccessibilityCaptionCharacterEdgeStyleUniform`
 *   `kSbAccessibilityCaptionCharacterEdgeStyleDropShadow`
 
-### SbAccessibilityCaptionColor ###
+### SbAccessibilityCaptionColor
 
 Enum for possible closed captioning colors.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionColorBlue`
 *   `kSbAccessibilityCaptionColorBlack`
@@ -34,11 +34,11 @@
 *   `kSbAccessibilityCaptionColorWhite`
 *   `kSbAccessibilityCaptionColorYellow`
 
-### SbAccessibilityCaptionFontFamily ###
+### SbAccessibilityCaptionFontFamily
 
 Enum for possible closed captioning font families
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionFontFamilyCasual`
 *   `kSbAccessibilityCaptionFontFamilyCursive`
@@ -48,11 +48,11 @@
 *   `kSbAccessibilityCaptionFontFamilyProportionalSerif`
 *   `kSbAccessibilityCaptionFontFamilySmallCapitals`
 
-### SbAccessibilityCaptionFontSizePercentage ###
+### SbAccessibilityCaptionFontSizePercentage
 
 Enum for possible closed captioning font size percentages.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionFontSizePercentage25`
 *   `kSbAccessibilityCaptionFontSizePercentage50`
@@ -67,11 +67,11 @@
 *   `kSbAccessibilityCaptionFontSizePercentage275`
 *   `kSbAccessibilityCaptionFontSizePercentage300`
 
-### SbAccessibilityCaptionOpacityPercentage ###
+### SbAccessibilityCaptionOpacityPercentage
 
 Enum for possible closed captioning opacity percentages.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionOpacityPercentage0`
 *   `kSbAccessibilityCaptionOpacityPercentage25`
@@ -79,11 +79,11 @@
 *   `kSbAccessibilityCaptionOpacityPercentage75`
 *   `kSbAccessibilityCaptionOpacityPercentage100`
 
-### SbAccessibilityCaptionState ###
+### SbAccessibilityCaptionState
 
 Enum for possible states of closed captioning properties.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionStateUnsupported`
 
@@ -115,14 +115,14 @@
     SbAccessibilityCaptionSettings.supportsOverride contains false, then no
     fields of SbAccessibilityCaptionSettings will ever contain this value.
 
-## Structs ##
+## Structs
 
-### SbAccessibilityCaptionSettings ###
+### SbAccessibilityCaptionSettings
 
 A group of settings related to system-level closed captioning settings, for
 platforms that expose closed captioning settings.
 
-#### Members ####
+#### Members
 
 *   `SbAccessibilityCaptionColor background_color`
 *   `SbAccessibilityCaptionState background_color_state`
@@ -166,9 +166,9 @@
     false, the values of `SbAccessibilityCaptionState` should be interpreted
     differently.
 
-### SbAccessibilityDisplaySettings ###
+### SbAccessibilityDisplaySettings
 
-#### Members ####
+#### Members
 
 *   `bool has_high_contrast_text_setting`
 
@@ -177,12 +177,12 @@
 
     Whether the high contrast text setting is enabled or not.
 
-### SbAccessibilityTextToSpeechSettings ###
+### SbAccessibilityTextToSpeechSettings
 
 A group of settings related to text-to-speech functionality, for platforms that
 expose system settings for text-to-speech.
 
-#### Members ####
+#### Members
 
 *   `bool has_text_to_speech_setting`
 
@@ -192,9 +192,9 @@
     Whether the text-to-speech setting is enabled or not. This setting is only
     valid if `has_text_to_speech_setting` is set to true.
 
-## Functions ##
+## Functions
 
-### SbAccessibilityGetCaptionSettings ###
+### SbAccessibilityGetCaptionSettings
 
 Get the platform's settings for system-level closed captions. This function
 returns false if `caption_settings` is NULL or if it is not zero-initialized.
@@ -202,13 +202,13 @@
 `caption_settings`: A pointer to a zero-initialized
 SbAccessibilityTextToSpeechSettings struct.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilityGetCaptionSettings(SbAccessibilityCaptionSettings *caption_settings)
 ```
 
-### SbAccessibilityGetDisplaySettings ###
+### SbAccessibilityGetDisplaySettings
 
 Get the platform settings related to high contrast text. This function returns
 false if `out_settings` is NULL or if it is not zero-initialized.
@@ -216,13 +216,13 @@
 `out_settings`: A pointer to a zero-initialized SbAccessibilityDisplaySettings*
 struct.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilityGetDisplaySettings(SbAccessibilityDisplaySettings *out_settings)
 ```
 
-### SbAccessibilityGetTextToSpeechSettings ###
+### SbAccessibilityGetTextToSpeechSettings
 
 Get the platform settings related to the text-to-speech accessibility feature.
 This function returns false if `out_settings` is NULL or if it is not zero-
@@ -231,13 +231,13 @@
 `out_settings`: A pointer to a zero-initialized
 SbAccessibilityTextToSpeechSettings struct.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilityGetTextToSpeechSettings(SbAccessibilityTextToSpeechSettings *out_settings)
 ```
 
-### SbAccessibilitySetCaptionsEnabled ###
+### SbAccessibilitySetCaptionsEnabled
 
 Modifies whether closed captions are enabled at a system level. This function
 returns false if this feature is not supported by the platform, or if changing
@@ -246,7 +246,7 @@
 `enabled`: A boolean indicating whether captions should be turned on (true) or
 off (false).
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilitySetCaptionsEnabled(bool enabled)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/atomic.md b/cobalt/site/docs/reference/starboard/modules/15/atomic.md
index 9741f3c..0ed31cb 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/atomic.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/atomic.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: atomic.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `atomic.h`
 
 Defines a set of atomic integer operations that can be used as lightweight
 synchronization or as building blocks for heavier synchronization primitives.
@@ -9,32 +9,32 @@
 supported architectures, so their direct use is not recommended except when
 rigorously deemed absolutely necessary for performance reasons.
 
-## Typedefs ##
+## Typedefs
 
-### SbAtomic64 ###
+### SbAtomic64
 
 64-bit atomic operations (only available on 64-bit processors).
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int64_t SbAtomic64
 ```
 
-### SbAtomicPtr ###
+### SbAtomicPtr
 
 Pointer-sized atomic operations. Forwards to either 32-bit or 64-bit functions
 as appropriate.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbAtomic32 SbAtomicPtr
 ```
 
-## Functions ##
+## Functions
 
-### SbAtomicAcquire_CompareAndSwap ###
+### SbAtomicAcquire_CompareAndSwap
 
 These following lower-level operations are typically useful only to people
 implementing higher-level synchronization operations like spinlocks, mutexes,
@@ -45,23 +45,23 @@
 operation. "Barrier" operations have both "Acquire" and "Release" semantics. A
 SbAtomicMemoryBarrier() has "Barrier" semantics, but does no memory access.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicAcquire_CompareAndSwap(volatile SbAtomic32 *ptr, SbAtomic32 old_value, SbAtomic32 new_value)
 ```
 
-### SbAtomicBarrier_Increment ###
+### SbAtomicBarrier_Increment
 
 Same as SbAtomicNoBarrier_Increment, but with a memory barrier.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicBarrier_Increment(volatile SbAtomic32 *ptr, SbAtomic32 increment)
 ```
 
-### SbAtomicNoBarrier_CompareAndSwap ###
+### SbAtomicNoBarrier_CompareAndSwap
 
 Atomically execute: result = *ptr; if (*ptr == old_value) *ptr = new_value;
 return result;
@@ -71,39 +71,39 @@
 
 This routine implies no memory barriers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicNoBarrier_CompareAndSwap(volatile SbAtomic32 *ptr, SbAtomic32 old_value, SbAtomic32 new_value)
 ```
 
-### SbAtomicNoBarrier_Exchange ###
+### SbAtomicNoBarrier_Exchange
 
 Atomically store new_value into *ptr, returning the previous value held in *ptr.
 This routine implies no memory barriers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicNoBarrier_Exchange(volatile SbAtomic32 *ptr, SbAtomic32 new_value)
 ```
 
-### SbAtomicNoBarrier_Increment ###
+### SbAtomicNoBarrier_Increment
 
 Atomically increment *ptr by "increment". Returns the new value of *ptr with the
 increment applied. This routine implies no memory barriers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicNoBarrier_Increment(volatile SbAtomic32 *ptr, SbAtomic32 increment)
 ```
 
-### SbAtomicRelease_CompareAndSwap8 ###
+### SbAtomicRelease_CompareAndSwap8
 
 Overloaded functions for Atomic8.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic8 SbAtomicRelease_CompareAndSwap8(volatile SbAtomic8 *ptr, SbAtomic8 old_value, SbAtomic8 new_value)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/audio_sink.md b/cobalt/site/docs/reference/starboard/modules/15/audio_sink.md
index b0e652f..9277c70 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/audio_sink.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/audio_sink.md
@@ -1,53 +1,53 @@
----
-layout: doc
-title: "Starboard Module Reference: audio_sink.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `audio_sink.h`
 
 Provides an interface to output raw audio data.
 
-## Macros ##
+## Macros
 
-### kSbAudioSinkInvalid ###
+### kSbAudioSinkInvalid
 
 Well-defined value for an invalid audio sink.
 
-## Typedefs ##
+## Typedefs
 
-### SbAudioSink ###
+### SbAudioSink
 
 An opaque handle to an implementation-private structure representing an audio
 sink.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbAudioSinkPrivate* SbAudioSink
 ```
 
-### SbAudioSinkConsumeFramesFunc ###
+### SbAudioSinkConsumeFramesFunc
 
 Callback used to report frames consumed. The consumed frames will be removed
 from the source frame buffer to free space for new audio frames.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbAudioSinkConsumeFramesFunc) (int frames_consumed, void *context)
 ```
 
-### SbAudioSinkFrameBuffers ###
+### SbAudioSinkFrameBuffers
 
 An array of frame buffers. For interleaved audio streams, there will be only one
 element in the array. For planar audio streams, the number of elements in the
 array equal to the number of channels.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void** SbAudioSinkFrameBuffers
 ```
 
-### SbAudioSinkUpdateSourceStatusFunc ###
+### SbAudioSinkUpdateSourceStatusFunc
 
 Callback being called periodically to retrieve the status of the audio source.
 The first two output parameters indicating the filling level of the audio frame
@@ -64,15 +64,15 @@
 NULL. Note that this function only reports the status of the source, it doesn't
 remove audio data from the source frame buffer.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbAudioSinkUpdateSourceStatusFunc) (int *frames_in_buffer, int *offset_in_frames, bool *is_playing, bool *is_eos_reached, void *context)
 ```
 
-## Functions ##
+## Functions
 
-### SbAudioSinkCreate ###
+### SbAudioSinkCreate
 
 Creates an audio sink for the specified `channels` and `sampling_frequency_hz`,
 acquires all resources needed to operate the audio sink, and returns an opaque
@@ -113,13 +113,13 @@
     value that is passed back to all callbacks and is generally used to point at
     a class or struct that contains state associated with the audio sink.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbAudioSink SbAudioSinkCreate(int channels, int sampling_frequency_hz, SbMediaAudioSampleType audio_sample_type, SbMediaAudioFrameStorageType audio_frame_storage_type, SbAudioSinkFrameBuffers frame_buffers, int frames_per_channel, SbAudioSinkUpdateSourceStatusFunc update_source_status_func, SbAudioSinkConsumeFramesFunc consume_frames_func, void *context)
 ```
 
-### SbAudioSinkDestroy ###
+### SbAudioSinkDestroy
 
 Destroys `audio_sink`, freeing all associated resources. Before returning, the
 function waits until all callbacks that are in progress have finished. After the
@@ -132,24 +132,24 @@
 
 `audio_sink`: The audio sink to destroy.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbAudioSinkDestroy(SbAudioSink audio_sink)
 ```
 
-### SbAudioSinkGetMaxChannels ###
+### SbAudioSinkGetMaxChannels
 
 Returns the maximum number of channels supported on the platform. For example,
 the number would be `2` if the platform only supports stereo.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbAudioSinkGetMaxChannels()
 ```
 
-### SbAudioSinkGetMinBufferSizeInFrames ###
+### SbAudioSinkGetMinBufferSizeInFrames
 
 Returns the minimum frames required by audio sink to play without underflows.
 Returns -1, if `channels`, `sample_type` or `sampling_frequency_hz` is not
@@ -162,52 +162,52 @@
 audio data being streamed. For example, 22,000 Hz means 22,000 sample elements
 represents one second of audio data.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbAudioSinkGetMinBufferSizeInFrames(int channels, SbMediaAudioSampleType sample_type, int sampling_frequency_hz)
 ```
 
-### SbAudioSinkGetNearestSupportedSampleFrequency ###
+### SbAudioSinkGetNearestSupportedSampleFrequency
 
 Returns the supported sample rate closest to `sampling_frequency_hz`. On
 platforms that don't support all sample rates, it is the caller's responsibility
 to resample the audio frames into the supported sample rate returned by this
 function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbAudioSinkGetNearestSupportedSampleFrequency(int sampling_frequency_hz)
 ```
 
-### SbAudioSinkIsAudioFrameStorageTypeSupported ###
+### SbAudioSinkIsAudioFrameStorageTypeSupported
 
 Indicates whether `audio_frame_storage_type` is supported on this platform.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAudioSinkIsAudioFrameStorageTypeSupported(SbMediaAudioFrameStorageType audio_frame_storage_type)
 ```
 
-### SbAudioSinkIsAudioSampleTypeSupported ###
+### SbAudioSinkIsAudioSampleTypeSupported
 
 Indicates whether `audio_sample_type` is supported on this platform.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAudioSinkIsAudioSampleTypeSupported(SbMediaAudioSampleType audio_sample_type)
 ```
 
-### SbAudioSinkIsValid ###
+### SbAudioSinkIsValid
 
 Indicates whether the given audio sink handle is valid.
 
 `audio_sink`: The audio sink handle to check.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAudioSinkIsValid(SbAudioSink audio_sink)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/byte_swap.md b/cobalt/site/docs/reference/starboard/modules/15/byte_swap.md
index c83927d..72dc932 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/byte_swap.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/byte_swap.md
@@ -1,74 +1,74 @@
----
-layout: doc
-title: "Starboard Module Reference: byte_swap.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `byte_swap.h`
 
 Specifies functions for swapping byte order. These functions are used to deal
 with endianness when performing I/O.
 
-## Functions ##
+## Functions
 
-### SbByteSwapS16 ###
+### SbByteSwapS16
 
 Unconditionally swaps the byte order in signed 16-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int16_t SbByteSwapS16(int16_t value)
 ```
 
-### SbByteSwapS32 ###
+### SbByteSwapS32
 
 Unconditionally swaps the byte order in signed 32-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int32_t SbByteSwapS32(int32_t value)
 ```
 
-### SbByteSwapS64 ###
+### SbByteSwapS64
 
 Unconditionally swaps the byte order in signed 64-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbByteSwapS64(int64_t value)
 ```
 
-### SbByteSwapU16 ###
+### SbByteSwapU16
 
 Unconditionally swaps the byte order in unsigned 16-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint16_t SbByteSwapU16(uint16_t value)
 ```
 
-### SbByteSwapU32 ###
+### SbByteSwapU32
 
 Unconditionally swaps the byte order in unsigned 32-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint32_t SbByteSwapU32(uint32_t value)
 ```
 
-### SbByteSwapU64 ###
+### SbByteSwapU64
 
 Unconditionally swaps the byte order in unsigned 64-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint64_t SbByteSwapU64(uint64_t value)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/condition_variable.md b/cobalt/site/docs/reference/starboard/modules/15/condition_variable.md
index e58e106..2d8f30b 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/condition_variable.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/condition_variable.md
@@ -1,23 +1,23 @@
----
-layout: doc
-title: "Starboard Module Reference: condition_variable.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `condition_variable.h`
 
 Defines an interface for condition variables.
 
-## Macros ##
+## Macros
 
-### SB_CONDITION_VARIABLE_MAX_SIZE ###
+### SB_CONDITION_VARIABLE_MAX_SIZE
 
 Max size of the SbConditionVariable type.
 
-## Enums ##
+## Enums
 
-### SbConditionVariableResult ###
+### SbConditionVariableResult
 
 Enumeration of possible results from waiting on a condvar.
 
-#### Values ####
+#### Values
 
 *   `kSbConditionVariableSignaled`
 
@@ -30,22 +30,22 @@
     The wait failed, either because a parameter wasn't valid, or the condition
     variable has already been destroyed, or something similar.
 
-## Typedefs ##
+## Typedefs
 
-### SbConditionVariable ###
+### SbConditionVariable
 
 An opaque handle to a condition variable type with reserved memory buffer of
 size SB_CONDITION_VARIABLE_MAX_SIZE and aligned at void pointer type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef union SbConditionVariable  SbConditionVariable
 ```
 
-## Functions ##
+## Functions
 
-### SbConditionVariableBroadcast ###
+### SbConditionVariableBroadcast
 
 Broadcasts to all current waiters of `condition` to stop waiting. This function
 wakes all of the threads waiting on `condition` while SbConditionVariableSignal
@@ -53,26 +53,26 @@
 
 `condition`: The condition that should no longer be waited for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableBroadcast(SbConditionVariable *condition)
 ```
 
-### SbConditionVariableCreate ###
+### SbConditionVariableCreate
 
 Creates a new condition variable to work with `opt_mutex`, which may be null,
 placing the newly created condition variable in `out_condition`.
 
 The return value indicates whether the condition variable could be created.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableCreate(SbConditionVariable *out_condition, SbMutex *opt_mutex)
 ```
 
-### SbConditionVariableDestroy ###
+### SbConditionVariableDestroy
 
 Destroys the specified SbConditionVariable . The return value indicates whether
 the destruction was successful. The behavior is undefined if other threads are
@@ -81,23 +81,23 @@
 `condition`: The SbConditionVariable to be destroyed. This invalidates the
 condition variable.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableDestroy(SbConditionVariable *condition)
 ```
 
-### SbConditionVariableIsSignaled ###
+### SbConditionVariableIsSignaled
 
 Returns whether the given result is a success.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbConditionVariableIsSignaled(SbConditionVariableResult result)
 ```
 
-### SbConditionVariableSignal ###
+### SbConditionVariableSignal
 
 Signals the next waiter of `condition` to stop waiting. This function wakes a
 single thread waiting on `condition` while SbConditionVariableBroadcast wakes
@@ -105,24 +105,24 @@
 
 `condition`: The condition that the waiter should stop waiting for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableSignal(SbConditionVariable *condition)
 ```
 
-### SbConditionVariableWait ###
+### SbConditionVariableWait
 
 Waits for `condition`, releasing the held lock `mutex`, blocking indefinitely,
 and returning the result. Behavior is undefined if `mutex` is not held.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbConditionVariableResult SbConditionVariableWait(SbConditionVariable *condition, SbMutex *mutex)
 ```
 
-### SbConditionVariableWaitTimed ###
+### SbConditionVariableWaitTimed
 
 Waits for `condition`, releasing the held lock `mutex`, blocking up to
 `timeout_duration`, and returning the acquisition result. Behavior is undefined
@@ -133,7 +133,7 @@
 function returns as quickly as possible with a kSbConditionVariableTimedOut
 result.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbConditionVariableResult SbConditionVariableWaitTimed(SbConditionVariable *condition, SbMutex *mutex, SbTime timeout_duration)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/configuration.md b/cobalt/site/docs/reference/starboard/modules/15/configuration.md
index 630f1cf..d0ba3c7 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/configuration.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/configuration.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: configuration.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `configuration.h`
 
 Provides a description of the current platform in lurid detail so that common
 code never needs to actually know what the current operating system and
@@ -13,117 +13,117 @@
 narrowly-defined configuration features, but it retains porting control in
 Starboard.
 
-## Macros ##
+## Macros
 
-### SB_ALIGNAS(byte_alignment) ###
+### SB_ALIGNAS(byte_alignment)
 
 Specifies the alignment for a class, struct, union, enum, class/struct field, or
 stack variable.
 
-### SB_ALIGNOF(type) ###
+### SB_ALIGNOF(type)
 
 Returns the alignment required for any instance of the type indicated by `type`.
 
-### SB_ARRAY_SIZE(array) ###
+### SB_ARRAY_SIZE(array)
 
 A constant expression that evaluates to the size_t size of a statically-sized
 array.
 
-### SB_ARRAY_SIZE_INT(array) ###
+### SB_ARRAY_SIZE_INT(array)
 
 A constant expression that evaluates to the int size of a statically-sized
 array.
 
-### SB_CAN(SB_FEATURE) ###
+### SB_CAN(SB_FEATURE)
 
 Determines a compile-time capability of the system.
 
-### SB_COMPILE_ASSERT(expr, msg) ###
+### SB_COMPILE_ASSERT(expr, msg)
 
 Will cause a compiler error with `msg` if `expr` is false. `msg` must be a valid
 identifier, and must be a unique type in the scope of the declaration.
 
-### SB_DEPRECATED(FUNC) ###
+### SB_DEPRECATED(FUNC)
 
 SB_DEPRECATED(int Foo(int bar)); Annotates the function as deprecated, which
 will trigger a compiler warning when referenced.
 
-### SB_DEPRECATED_EXTERNAL(FUNC) ###
+### SB_DEPRECATED_EXTERNAL(FUNC)
 
 SB_DEPRECATED_EXTERNAL(...) annotates the function as deprecated for external
 clients, but not deprecated for starboard.
 
-### SB_EXPERIMENTAL_API_VERSION ###
+### SB_EXPERIMENTAL_API_VERSION
 
 The API version that is currently open for changes, and therefore is not stable
 or frozen. Production-oriented ports should avoid declaring that they implement
 the experimental Starboard API version.
 
-### SB_FUNCTION ###
+### SB_FUNCTION
 
 Whether we use **PRETTY_FUNCTION** PRETTY_FUNCTION or **FUNCTION** FUNCTION for
 logging.
 
-### SB_HAS(SB_FEATURE) ###
+### SB_HAS(SB_FEATURE)
 
 Determines at compile-time whether this platform has a standard feature or
 header available.
 
-### SB_HAS_64_BIT_ATOMICS ###
+### SB_HAS_64_BIT_ATOMICS
 
 Whether the current platform has 64-bit atomic operations.
 
-### SB_HAS_GLES2 ###
+### SB_HAS_GLES2
 
 Specifies whether this platform has a performant OpenGL ES 2 implementation,
 which allows client applications to use GL rendering paths. Derived from the gyp
 variable `gl_type` gl_type which indicates what kind of GL implementation is
 available.
 
-### SB_HAS_QUIRK(SB_FEATURE) ###
+### SB_HAS_QUIRK(SB_FEATURE)
 
 Determines at compile-time whether this platform has a quirk.
 
-### SB_INT64_C(x) ###
+### SB_INT64_C(x)
 
 Declare numeric literals of signed 64-bit type.
 
-### SB_IS(SB_FEATURE) ###
+### SB_IS(SB_FEATURE)
 
 Determines at compile-time an inherent aspect of this platform.
 
-### SB_LIKELY(x) ###
+### SB_LIKELY(x)
 
 Macro for hinting that an expression is likely to be true.
 
-### SB_MAXIMUM_API_VERSION ###
+### SB_MAXIMUM_API_VERSION
 
 The maximum API version allowed by this version of the Starboard headers,
 inclusive.
 
-### SB_MINIMUM_API_VERSION ###
+### SB_MINIMUM_API_VERSION
 
 The minimum API version allowed by this version of the Starboard headers,
 inclusive.
 
-### SB_NORETURN ###
+### SB_NORETURN
 
 Macro to annotate a function as noreturn, which signals to the compiler that the
 function cannot return.
 
-### SB_OVERRIDE ###
+### SB_OVERRIDE
 
 Declares a function as overriding a virtual function on compilers that support
 it.
 
-### SB_PREFERRED_RGBA_BYTE_ORDER_RGBA ###
+### SB_PREFERRED_RGBA_BYTE_ORDER_RGBA
 
 An enumeration of values for the kSbPreferredByteOrder configuration variable.
 Setting this up properly means avoiding slow color swizzles when passing pixel
 data from one library to another. Note that these definitions are in byte-order
 and so are endianness-independent.
 
-### SB_PRINTF_FORMAT(format_param, dots_param) ###
+### SB_PRINTF_FORMAT(format_param, dots_param)
 
 Tells the compiler a function is using a printf-style format string.
 `format_param` is the one-based index of the format string parameter;
@@ -132,7 +132,7 @@
 but matches what the system C headers do.) (Partially taken from
 base/compiler_specific.h)
 
-### SB_RESTRICT ###
+### SB_RESTRICT
 
 Include the platform-specific configuration. This macro is set by GN in
 starboard/build/config/BUILD.gn and passed in on the command line for all
@@ -140,29 +140,29 @@
 that the compiler can make certain optimizations because it knows the pointers
 are unique.
 
-### SB_SIZE_OF(DATATYPE) ###
+### SB_SIZE_OF(DATATYPE)
 
 Determines at compile-time the size of a data type, or 0 if the data type that
 was specified was invalid.
 
-### SB_STRINGIFY(x) ###
+### SB_STRINGIFY(x)
 
 Standard CPP trick to stringify an evaluated macro definition.
 
-### SB_UINT64_C(x) ###
+### SB_UINT64_C(x)
 
 Declare numeric literals of unsigned 64-bit type.
 
-### SB_UNLIKELY(x) ###
+### SB_UNLIKELY(x)
 
 Macro for hinting that an expression is likely to be false.
 
-### SB_UNREFERENCED_PARAMETER(x) ###
+### SB_UNREFERENCED_PARAMETER(x)
 
 Trivially references a parameter that is otherwise unreferenced, preventing a
 compiler warning on some platforms.
 
-### SB_WARN_UNUSED_RESULT ###
+### SB_WARN_UNUSED_RESULT
 
 Causes the annotated (at the end) function to generate a warning if the result
 is not accessed.
diff --git a/cobalt/site/docs/reference/starboard/modules/15/configuration_constants.md b/cobalt/site/docs/reference/starboard/modules/15/configuration_constants.md
index 99d92f8..18af4bc 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/configuration_constants.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/configuration_constants.md
@@ -1,113 +1,113 @@
----
-layout: doc
-title: "Starboard Module Reference: configuration_constants.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `configuration_constants.h`
 
 Declares all configuration variables we will need to use at runtime. These
 variables describe the current platform in detail to allow cobalt to make
 runtime decisions based on per platform configurations.
 
-## Variables ##
+## Variables
 
-### kSbDefaultMmapThreshold ###
+### kSbDefaultMmapThreshold
 
 Determines the threshold of allocation size that should be done with mmap (if
 available), rather than allocated within the core heap.
 
-### kSbFileAltSepChar ###
+### kSbFileAltSepChar
 
 The current platform's alternate file path component separator character. This
 is like SB_FILE_SEP_CHAR, except if your platform supports an alternate
 character, then you can place that here. For example, on windows machines, the
 primary separator character is probably '\', but the alternate is '/'.
 
-### kSbFileAltSepString ###
+### kSbFileAltSepString
 
 The string form of SB_FILE_ALT_SEP_CHAR.
 
-### kSbFileMaxName ###
+### kSbFileMaxName
 
 The current platform's maximum length of the name of a single directory entry,
 not including the absolute path.
 
-### kSbFileMaxOpen ###
+### kSbFileMaxOpen
 
 The current platform's maximum number of files that can be opened at the same
 time by one process.
 
-### kSbFileMaxPath ###
+### kSbFileMaxPath
 
 The current platform's maximum length of an absolute path.
 
-### kSbFileSepChar ###
+### kSbFileSepChar
 
 The current platform's file path component separator character. This is the
 character that appears after a directory in a file path. For example, the
 absolute canonical path of the file "/path/to/a/file.txt" uses '/' as a path
 component separator character.
 
-### kSbFileSepString ###
+### kSbFileSepString
 
 The string form of SB_FILE_SEP_CHAR.
 
-### kSbHasMediaWebmVp9Support ###
+### kSbHasMediaWebmVp9Support
 
 Specifies whether this platform has webm/vp9 support. This should be set to non-
 zero on platforms with webm/vp9 support.
 
-### kSbHasThreadPrioritySupport ###
+### kSbHasThreadPrioritySupport
 
 Whether the current platform supports thread priorities.
 
-### kSbMallocAlignment ###
+### kSbMallocAlignment
 
 Determines the alignment that allocations should have on this platform.
 
-### kSbMaxSystemPathCacheDirectorySize ###
+### kSbMaxSystemPathCacheDirectorySize
 
 The maximum size the cache directory is allowed to use in bytes.
 
-### kSbMaxThreadLocalKeys ###
+### kSbMaxThreadLocalKeys
 
 The maximum number of thread local storage keys supported by this platform. This
 comes from _POSIX_THREAD_KEYS_MAX. The value of PTHREAD_KEYS_MAX is higher, but
 unit tests show that the implementation doesn't support nearly as many keys.
 
-### kSbMaxThreadNameLength ###
+### kSbMaxThreadNameLength
 
 The maximum length of the name for a thread, including the NULL-terminator.
 
-### kSbMaxThreads ###
+### kSbMaxThreads
 
 Defines the maximum number of simultaneous threads for this platform. Some
 platforms require sharing thread handles with other kinds of system handles,
 like mutexes, so we want to keep this manageable.
 
-### kSbMediaMaxAudioBitrateInBitsPerSecond ###
+### kSbMediaMaxAudioBitrateInBitsPerSecond
 
 The maximum audio bitrate the platform can decode. The following value equals to
 5M bytes per seconds which is more than enough for compressed audio.
 
-### kSbMediaMaxVideoBitrateInBitsPerSecond ###
+### kSbMediaMaxVideoBitrateInBitsPerSecond
 
 The maximum video bitrate the platform can decode. The following value equals to
 8M bytes per seconds which is more than enough for compressed video.
 
-### kSbMediaVideoFrameAlignment ###
+### kSbMediaVideoFrameAlignment
 
 Specifies how video frame buffers must be aligned on this platform.
 
-### kSbMemoryLogPath ###
+### kSbMemoryLogPath
 
 Defines the path where memory debugging logs should be written to.
 
-### kSbMemoryPageSize ###
+### kSbMemoryPageSize
 
 The memory page size, which controls the size of chunks on memory that
 allocators deal with, and the alignment of those chunks. This doesn't have to be
 the hardware-defined physical page size, but it should be a multiple of it.
 
-### kSbNetworkReceiveBufferSize ###
+### kSbNetworkReceiveBufferSize
 
 Specifies the network receive buffer size in bytes, set via
 SbSocketSetReceiveBufferSize().
@@ -122,7 +122,7 @@
 If your platform does not have a good TCP auto-tuning mechanism, a setting of
 (128 * 1024) here is recommended.
 
-### kSbPathSepChar ###
+### kSbPathSepChar
 
 The current platform's search path component separator character. When
 specifying an ordered list of absolute paths of directories to search for a
@@ -130,16 +130,16 @@
 the search path of "/etc/search/first:/etc/search/second" uses ':' as a search
 path component separator character.
 
-### kSbPathSepString ###
+### kSbPathSepString
 
 The string form of SB_PATH_SEP_CHAR.
 
-### kSbPreferredRgbaByteOrder ###
+### kSbPreferredRgbaByteOrder
 
 Specifies the preferred byte order of color channels in a pixel. Refer to
 starboard/configuration.h for the possible values. EGL/GLES platforms should
 generally prefer a byte order of RGBA, regardless of endianness.
 
-### kSbUserMaxSignedIn ###
+### kSbUserMaxSignedIn
 
 The maximum number of users that can be signed in at the same time.
diff --git a/cobalt/site/docs/reference/starboard/modules/15/cpu_features.md b/cobalt/site/docs/reference/starboard/modules/15/cpu_features.md
index 7a4bcc0..e2aa35f 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/cpu_features.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/cpu_features.md
@@ -1,13 +1,13 @@
----
-layout: doc
-title: "Starboard Module Reference: cpu_features.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
 
-## Structs ##
+# Starboard Module Reference: `cpu_features.h`
 
-### SbCPUFeatures ###
+## Structs
 
-#### Members ####
+### SbCPUFeatures
+
+#### Members
 
 *   `SbCPUFeaturesArchitecture architecture`
 
@@ -54,9 +54,9 @@
     defined as a macro.
 *   `SbCPUFeaturesX86 x86`
 
-### SbCPUFeaturesARM ###
+### SbCPUFeaturesARM
 
-#### Members ####
+#### Members
 
 *   `int16_t implementer`
 
@@ -98,7 +98,7 @@
     SDIV and UDIV hardware division in ARM mode.
 *   `bool has_aes`
 
-    ###### Arm 64 feature flags  ######
+    ###### Arm 64 feature flags
 
     AES instructions.
 *   `bool has_crc32`
@@ -114,17 +114,17 @@
 
     64-bit PMULL and PMULL2 instructions.
 
-### SbCPUFeaturesMIPS ###
+### SbCPUFeaturesMIPS
 
-#### Members ####
+#### Members
 
 *   `bool has_msa`
 
     MIPS SIMD Architecture (MSA).
 
-### SbCPUFeaturesX86 ###
+### SbCPUFeaturesX86
 
-#### Members ####
+#### Members
 
 *   `const char * vendor`
 
@@ -244,9 +244,9 @@
 
     SAHF in long mode.
 
-## Functions ##
+## Functions
 
-### SbCPUFeaturesGet ###
+### SbCPUFeaturesGet
 
 Retrieve the underlying CPU features and place it in `features`, which must not
 be NULL.
@@ -254,7 +254,7 @@
 If this function returns false, it means the CPU architecture is unknown and all
 fields in `features` are invalid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbCPUFeaturesGet(SbCPUFeatures *features)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/decode_target.md b/cobalt/site/docs/reference/starboard/modules/15/decode_target.md
index a237ad9..56c7afa 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/decode_target.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/decode_target.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: decode_target.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `decode_target.h`
 
 A target for decoding image and video data into. This corresponds roughly to an
 EGLImage, but that extension may not be fully supported on all GL platforms.
@@ -12,7 +12,7 @@
 decoding done directly into this memory, avoiding unnecessary memory copies, and
 also avoiding pushing data between CPU and GPU memory unnecessarily.
 
-## SbDecodeTargetFormat ##
+## SbDecodeTargetFormat
 
 SbDecodeTargets support several different formats that can be used to decode
 into and render from. Some formats may be easier to decode into, and others may
@@ -21,7 +21,7 @@
 Each decoder provides a way to check if a given SbDecodeTargetFormat is
 supported by that decoder.
 
-## SbDecodeTargetGraphicsContextProvider ##
+## SbDecodeTargetGraphicsContextProvider
 
 Some components may need to acquire SbDecodeTargets compatible with a certain
 rendering context, which may need to be created on a particular thread. The
@@ -33,10 +33,9 @@
 EGLContext held current. This may be useful if your SbDecodeTarget creation code
 needs to execute GLES commands like, for example, glGenTextures().
 
-The primary usage is likely to be the the SbPlayer implementation on some
-platforms.
+The primary usage is likely to be the SbPlayer implementation on some platforms.
 
-## SbDecodeTarget Example ##
+## SbDecodeTarget Example
 
 Let's say that we are an application and we would like to use the interface
 defined in starboard/image.h to decode an imaginary "image/foo" image type.
@@ -79,15 +78,15 @@
     info.planes[kSbDecodeTargetPlaneRGBA].texture;
 ```
 
-## Macros ##
+## Macros
 
-### kSbDecodeTargetInvalid ###
+### kSbDecodeTargetInvalid
 
 Well-defined value for an invalid decode target handle.
 
-## Enums ##
+## Enums
 
-### SbDecodeTargetFormat ###
+### SbDecodeTargetFormat
 
 The list of all possible decoder target formats. An SbDecodeTarget consists of
 one or more planes of data, each plane corresponding with a surface. For some
@@ -96,7 +95,7 @@
 NOTE: For enumeration entries with an alpha component, the alpha will always be
 premultiplied unless otherwise explicitly specified.
 
-#### Values ####
+#### Values
 
 *   `kSbDecodeTargetFormat1PlaneRGBA`
 
@@ -137,11 +136,11 @@
 
     An invalid decode target format.
 
-### SbDecodeTargetPlane ###
+### SbDecodeTargetPlane
 
 All the planes supported by SbDecodeTarget.
 
-#### Values ####
+#### Values
 
 *   `kSbDecodeTargetPlaneRGBA`
 
@@ -162,45 +161,45 @@
 
     The V plane for 3-plane YUV formats.
 
-## Typedefs ##
+## Typedefs
 
-### SbDecodeTarget ###
+### SbDecodeTarget
 
 A handle to a target for image data decoding.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbDecodeTargetPrivate* SbDecodeTarget
 ```
 
-### SbDecodeTargetGlesContextRunner ###
+### SbDecodeTargetGlesContextRunner
 
 Signature for a function provided by the application to the Starboard
 implementation that will let the Starboard implementation run arbitrary code on
 the application's renderer thread with the application's EGLContext held
 current.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDecodeTargetGlesContextRunner) (struct SbDecodeTargetGraphicsContextProvider *graphics_context_provider, SbDecodeTargetGlesContextRunnerTarget target_function, void *target_function_context)
 ```
 
-### SbDecodeTargetGlesContextRunnerTarget ###
+### SbDecodeTargetGlesContextRunnerTarget
 
 Signature for a Starboard implementation function that is to be run by a
 SbDecodeTargetGlesContextRunner callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDecodeTargetGlesContextRunnerTarget) (void *gles_context_runner_target_context)
 ```
 
-## Structs ##
+## Structs
 
-### SbDecodeTargetGraphicsContextProvider ###
+### SbDecodeTargetGraphicsContextProvider
 
 In general, the SbDecodeTargetGraphicsContextProvider structure provides
 information about the graphics context that will be used to render
@@ -210,7 +209,7 @@
 to all Starboard functions that might create SbDecodeTargets (e.g.
 SbImageDecode()).
 
-#### Members ####
+#### Members
 
 *   `void * egl_display`
 
@@ -233,12 +232,12 @@
     Context data that is to be passed in to `gles_context_runner` when it is
     invoked.
 
-### SbDecodeTargetInfo ###
+### SbDecodeTargetInfo
 
 Contains all information about a decode target, including all of its planes.
 This can be queried via calls to SbDecodeTargetGetInfo().
 
-#### Members ####
+#### Members
 
 *   `SbDecodeTargetFormat format`
 
@@ -267,11 +266,11 @@
     kSbDecodeTargetPlaneU, kSbDecodeTargetPlaneV} associated with this decode
     target.
 
-### SbDecodeTargetInfoContentRegion ###
+### SbDecodeTargetInfoContentRegion
 
 Defines a rectangular content region within a SbDecodeTargetInfoPlane structure.
 
-#### Members ####
+#### Members
 
 *   `float left`
 
@@ -283,11 +282,11 @@
 *   `float right`
 *   `float bottom`
 
-### SbDecodeTargetInfoPlane ###
+### SbDecodeTargetInfoPlane
 
 Defines an image plane within a SbDecodeTargetInfo object.
 
-#### Members ####
+#### Members
 
 *   `uint32_t texture`
 
@@ -317,53 +316,53 @@
     these parameters are number of pixels. The range for left/right is [0,
     width], and for top/bottom it is [0, height].
 
-## Functions ##
+## Functions
 
-### PrivateDecodeTargetReleaser ###
+### PrivateDecodeTargetReleaser
 
 This function is just an implementation detail of
 SbDecodeTargetReleaseInGlesContext() and should not be called directly.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void PrivateDecodeTargetReleaser(void *context)
 ```
 
-### SbDecodeTargetGetInfo ###
+### SbDecodeTargetGetInfo
 
 Writes all information about `decode_target` into `out_info`. The
 `decode_target` must not be kSbDecodeTargetInvalid. The `out_info` pointer must
 not be NULL. Returns false if the provided `out_info` structure is not zero
 initialized.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDecodeTargetGetInfo(SbDecodeTarget decode_target, SbDecodeTargetInfo *out_info)
 ```
 
-### SbDecodeTargetIsFormatValid ###
+### SbDecodeTargetIsFormatValid
 
 Returns whether a given format is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDecodeTargetIsFormatValid(SbDecodeTargetFormat format)
 ```
 
-### SbDecodeTargetIsValid ###
+### SbDecodeTargetIsValid
 
 Returns whether the given file handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDecodeTargetIsValid(SbDecodeTarget handle)
 ```
 
-### SbDecodeTargetRelease ###
+### SbDecodeTargetRelease
 
 Returns ownership of `decode_target` to the Starboard implementation. This
 function will likely result in the destruction of the SbDecodeTarget and all its
@@ -371,31 +370,31 @@
 reference count. In the case where SB_HAS(GLES2), this function must be called
 on a thread with the context
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDecodeTargetRelease(SbDecodeTarget decode_target)
 ```
 
-### SbDecodeTargetReleaseInGlesContext ###
+### SbDecodeTargetReleaseInGlesContext
 
 Helper function that is possibly useful to Starboard implementations that will
 release a decode target on the thread with the GLES context current.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void SbDecodeTargetReleaseInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTarget decode_target)
 ```
 
-### SbDecodeTargetRunInGlesContext ###
+### SbDecodeTargetRunInGlesContext
 
 Inline convenience function to run an arbitrary
 SbDecodeTargetGlesContextRunnerTarget function through a
 SbDecodeTargetGraphicsContextProvider . This is intended to be called by
 Starboard implementations, if it is necessary.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void SbDecodeTargetRunInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTargetGlesContextRunnerTarget target, void *target_context)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/directory.md b/cobalt/site/docs/reference/starboard/modules/15/directory.md
index dcdf48a..6f845f6 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/directory.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/directory.md
@@ -1,56 +1,56 @@
----
-layout: doc
-title: "Starboard Module Reference: directory.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `directory.h`
 
 Provides directory listing functions.
 
-## Macros ##
+## Macros
 
-### kSbDirectoryInvalid ###
+### kSbDirectoryInvalid
 
 Well-defined value for an invalid directory stream handle.
 
-## Typedefs ##
+## Typedefs
 
-### SbDirectory ###
+### SbDirectory
 
 A handle to an open directory stream.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbDirectoryPrivate* SbDirectory
 ```
 
-## Functions ##
+## Functions
 
-### SbDirectoryCanOpen ###
+### SbDirectoryCanOpen
 
 Indicates whether SbDirectoryOpen is allowed for the given `path`.
 
 `path`: The path to be checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryCanOpen(const char *path)
 ```
 
-### SbDirectoryClose ###
+### SbDirectoryClose
 
 Closes an open directory stream handle. The return value indicates whether the
 directory was closed successfully.
 
 `directory`: The directory stream handle to close.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryClose(SbDirectory directory)
 ```
 
-### SbDirectoryCreate ###
+### SbDirectoryCreate
 
 Creates the directory `path`, assuming the parent directory already exists. This
 function returns `true` if the directory now exists (even if it existed before)
@@ -58,13 +58,13 @@
 
 `path`: The path to be created.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryCreate(const char *path)
 ```
 
-### SbDirectoryGetNext ###
+### SbDirectoryGetNext
 
 Populates `out_entry` with the next entry in the specified directory stream, and
 moves the stream forward by one entry.
@@ -83,23 +83,23 @@
 `out_entry_size`: The size of the space allocated for `out_entry`. This should
 be at least equal to kSbFileMaxName.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryGetNext(SbDirectory directory, char *out_entry, size_t out_entry_size)
 ```
 
-### SbDirectoryIsValid ###
+### SbDirectoryIsValid
 
 Returns whether the given directory stream handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDirectoryIsValid(SbDirectory directory)
 ```
 
-### SbDirectoryOpen ###
+### SbDirectoryOpen
 
 Opens the given existing directory for listing. This function returns
 kSbDirectoryInvalidHandle if it is not successful.
@@ -110,7 +110,7 @@
 `out_error`: An output parameter that, in case of an error, is set to the reason
 that the directory could not be opened.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbDirectory SbDirectoryOpen(const char *path, SbFileError *out_error)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/drm.md b/cobalt/site/docs/reference/starboard/modules/15/drm.md
index fbb92f9..f42e43b 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/drm.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/drm.md
@@ -1,37 +1,37 @@
----
-layout: doc
-title: "Starboard Module Reference: drm.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `drm.h`
 
 Provides definitions that allow for DRM support, which are common between Player
 and Decoder interfaces.
 
-## Macros ##
+## Macros
 
-### kSbDrmSystemInvalid ###
+### kSbDrmSystemInvalid
 
 An invalid SbDrmSystem.
 
-### kSbDrmTicketInvalid ###
+### kSbDrmTicketInvalid
 
 A ticket for callback invocations initiated by the DRM system.
 
-## Enums ##
+## Enums
 
-### SbDrmEncryptionScheme ###
+### SbDrmEncryptionScheme
 
 Encryption scheme of the input sample, as defined in ISO/IEC 23001 part 7.
 
-#### Values ####
+#### Values
 
 *   `kSbDrmEncryptionSchemeAesCtr`
 *   `kSbDrmEncryptionSchemeAesCbc`
 
-### SbDrmKeyStatus ###
+### SbDrmKeyStatus
 
 Status of a particular media key. [https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus](https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus)
 
-#### Values ####
+#### Values
 
 *   `kSbDrmKeyStatusUsable`
 *   `kSbDrmKeyStatusExpired`
@@ -41,24 +41,24 @@
 *   `kSbDrmKeyStatusPending`
 *   `kSbDrmKeyStatusError`
 
-### SbDrmSessionRequestType ###
+### SbDrmSessionRequestType
 
 The type of the session request. [https://www.w3.org/TR/encrypted-media/#idl-def-mediakeymessagetype](https://www.w3.org/TR/encrypted-media/#idl-def-mediakeymessagetype)
 
-#### Values ####
+#### Values
 
 *   `kSbDrmSessionRequestTypeLicenseRequest`
 *   `kSbDrmSessionRequestTypeLicenseRenewal`
 *   `kSbDrmSessionRequestTypeLicenseRelease`
 *   `kSbDrmSessionRequestTypeIndividualizationRequest`
 
-### SbDrmStatus ###
+### SbDrmStatus
 
 The status of session related operations. Used by
 `SbDrmSessionUpdateRequestFunc`, `SbDrmSessionUpdatedFunc`, and
 `SbDrmServerCertificateUpdatedFunc` to indicate the status of the operation. [https://w3c.github.io/encrypted-media/#error-names](https://w3c.github.io/encrypted-media/#error-names)
 
-#### Values ####
+#### Values
 
 *   `kSbDrmStatusSuccess`
 *   `kSbDrmStatusTypeError`
@@ -70,42 +70,42 @@
     The following error can be used when the error status cannot be mapped to
     one of the above errors.
 
-## Typedefs ##
+## Typedefs
 
-### SbDrmServerCertificateUpdatedFunc ###
+### SbDrmServerCertificateUpdatedFunc
 
 A callback to notify the caller of SbDrmUpdateServerCertificate() whether the
 update has been successfully updated or not.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmServerCertificateUpdatedFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, const char *error_message)
 ```
 
-### SbDrmSessionClosedFunc ###
+### SbDrmSessionClosedFunc
 
 A callback for signalling that a session has been closed by the SbDrmSystem
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionClosedFunc) (SbDrmSystem drm_system, void *context, const void *session_id, int session_id_size)
 ```
 
-### SbDrmSessionKeyStatusesChangedFunc ###
+### SbDrmSessionKeyStatusesChangedFunc
 
 A callback for notifications that the status of one or more keys in a session
 has been changed. All keys of the session and their new status will be passed
 along. Any keys not in the list is considered as deleted.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionKeyStatusesChangedFunc) (SbDrmSystem drm_system, void *context, const void *session_id, int session_id_size, int number_of_keys, const SbDrmKeyId *key_ids, const SbDrmKeyStatus *key_statuses)
 ```
 
-### SbDrmSessionUpdateRequestFunc ###
+### SbDrmSessionUpdateRequestFunc
 
 A callback that will receive generated session update request when requested
 from a SbDrmSystem. `drm_system` will be the DRM system that
@@ -128,13 +128,13 @@
 the correct Promise corresponding to the associated
 SbDrmGenerateSessionUpdateRequest().
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionUpdateRequestFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, SbDrmSessionRequestType type, const char *error_message, const void *session_id, int session_id_size, const void *content, int content_size, const char *url)
 ```
 
-### SbDrmSessionUpdatedFunc ###
+### SbDrmSessionUpdatedFunc
 
 A callback for notifications that a session has been added, and subsequent
 encrypted samples are actively ready to be decoded. `drm_system` will be the DRM
@@ -150,37 +150,37 @@
 `status` is `kSbDrmStatusSuccess` or if no error message can be provided.
 `succeeded` is whether the session was successfully updated or not.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionUpdatedFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, const char *error_message, const void *session_id, int session_id_size)
 ```
 
-### SbDrmSystem ###
+### SbDrmSystem
 
 A handle to a DRM system which can be used with either an SbDecoder or an
 SbPlayer.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbDrmSystemPrivate* SbDrmSystem
 ```
 
-## Structs ##
+## Structs
 
-### SbDrmEncryptionPattern ###
+### SbDrmEncryptionPattern
 
 Encryption pattern of the input sample, as defined in ISO/IEC 23001 part 7.
 
-#### Members ####
+#### Members
 
 *   `uint32_t crypt_byte_block`
 *   `uint32_t skip_byte_block`
 
-### SbDrmKeyId ###
+### SbDrmKeyId
 
-#### Members ####
+#### Members
 
 *   `uint8_t identifier`
 
@@ -188,11 +188,11 @@
     PlayReady, this is the license GUID in packed little-endian binary form.
 *   `int identifier_size`
 
-### SbDrmSampleInfo ###
+### SbDrmSampleInfo
 
 All the optional information needed per sample for encrypted samples.
 
-#### Members ####
+#### Members
 
 *   `SbDrmEncryptionScheme encryption_scheme`
 
@@ -217,13 +217,13 @@
     The clear/encrypted mapping of each subsample in this sample. This must be
     an array of `subsample_count` mappings.
 
-### SbDrmSubSampleMapping ###
+### SbDrmSubSampleMapping
 
 A mapping of clear and encrypted bytes for a single subsample. All subsamples
 within a sample must be encrypted with the same encryption parameters. The clear
 bytes always appear first in the sample.
 
-#### Members ####
+#### Members
 
 *   `int32_t clear_byte_count`
 
@@ -232,21 +232,21 @@
 
     How many bytes of the corresponding subsample are encrypted.
 
-## Functions ##
+## Functions
 
-### SbDrmCloseSession ###
+### SbDrmCloseSession
 
 Clear any internal states/resources related to the specified `session_id`.
 
 `drm_system` must not be `kSbDrmSystemInvalid`. `session_id` must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmCloseSession(SbDrmSystem drm_system, const void *session_id, int session_id_size)
 ```
 
-### SbDrmDestroySystem ###
+### SbDrmDestroySystem
 
 Destroys `drm_system`, which implicitly removes all keys installed in it and
 invalidates all outstanding session update requests. A DRM system cannot be
@@ -258,13 +258,13 @@
 
 `drm_system`: The DRM system to be destroyed. Must not be `kSbDrmSystemInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmDestroySystem(SbDrmSystem drm_system)
 ```
 
-### SbDrmGenerateSessionUpdateRequest ###
+### SbDrmGenerateSessionUpdateRequest
 
 Asynchronously generates a session update request payload for
 `initialization_data`, of `initialization_data_size`, in case sensitive `type`,
@@ -296,13 +296,13 @@
 payload is created. Must not be NULL. `initialization_data_size`: The size of
 the session update request payload.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmGenerateSessionUpdateRequest(SbDrmSystem drm_system, int ticket, const char *type, const void *initialization_data, int initialization_data_size)
 ```
 
-### SbDrmGetMetrics ###
+### SbDrmGetMetrics
 
 Get the metrics of the underlying drm system.
 
@@ -326,13 +326,13 @@
 
 `drm_system` must not be `kSbDrmSystemInvalid`. `size` must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 const void* SbDrmGetMetrics(SbDrmSystem drm_system, int *size)
 ```
 
-### SbDrmIsServerCertificateUpdatable ###
+### SbDrmIsServerCertificateUpdatable
 
 Returns true if server certificate of `drm_system` can be updated via
 SbDrmUpdateServerCertificate(). The return value should remain the same during
@@ -341,33 +341,33 @@
 `drm_system`: The DRM system to check if its server certificate is updatable.
 Must not be `kSbDrmSystemInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDrmIsServerCertificateUpdatable(SbDrmSystem drm_system)
 ```
 
-### SbDrmSystemIsValid ###
+### SbDrmSystemIsValid
 
 Indicates whether `drm_system` is a valid SbDrmSystem.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDrmSystemIsValid(SbDrmSystem drm)
 ```
 
-### SbDrmTicketIsValid ###
+### SbDrmTicketIsValid
 
 Indicates whether `ticket` is a valid ticket.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDrmTicketIsValid(int ticket)
 ```
 
-### SbDrmUpdateServerCertificate ###
+### SbDrmUpdateServerCertificate
 
 Update the server certificate of `drm_system`. The function can be called
 multiple times. It is possible that a call to it happens before the callback of
@@ -384,13 +384,13 @@
 certificate data. Must not be NULL. `certificate_size`: Size of the server
 certificate data.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmUpdateServerCertificate(SbDrmSystem drm_system, int ticket, const void *certificate, int certificate_size)
 ```
 
-### SbDrmUpdateSession ###
+### SbDrmUpdateSession
 
 Update session with `key`, in `drm_system`'s key system, from the license server
 response. Calls `session_updated_callback` with `context` and whether the update
@@ -410,7 +410,7 @@
 thread before this function returns or from another thread. The `session_id`
 must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmUpdateSession(SbDrmSystem drm_system, int ticket, const void *key, int key_size, const void *session_id, int session_id_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/egl.md b/cobalt/site/docs/reference/starboard/modules/15/egl.md
index c8c2120..4afff1a 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/egl.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/egl.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: egl.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `egl.h`
 
 The EGL API provides an interface with accompanying type declarations and
 defines that together provide a single consistent method of EGL usage across
@@ -11,67 +11,67 @@
 versions on different systems, and to remove the requirement for any other code
 to directly pull in and use these system libraries.
 
-## EGL Version ##
+## EGL Version
 
 This API has the ability to support EGL 1.5, however it is not required to
 support anything beyond EGL 1.4. The user is responsible for ensuring that the
 functions from EGL 1.5 they are calling from the interface are valid.
 
-## Macros ##
+## Macros
 
-### SB_EGL_ALPHA_FORMAT ###
+### SB_EGL_ALPHA_FORMAT
 
 EGL_VERSION_1_2
 
-### SB_EGL_ALPHA_SIZE ###
+### SB_EGL_ALPHA_SIZE
 
 EGL_VERSION_1_0
 
-### SB_EGL_BACK_BUFFER ###
+### SB_EGL_BACK_BUFFER
 
 EGL_VERSION_1_1
 
-### SB_EGL_CONFORMANT ###
+### SB_EGL_CONFORMANT
 
 EGL_VERSION_1_3
 
-### SB_EGL_CONTEXT_MAJOR_VERSION ###
+### SB_EGL_CONTEXT_MAJOR_VERSION
 
 EGL_VERSION_1_5
 
-### SB_EGL_DEFAULT_DISPLAY ###
+### SB_EGL_DEFAULT_DISPLAY
 
 EGL_VERSION_1_4
 
-## Typedefs ##
+## Typedefs
 
-### SbEglCastsToProperFunctionPointerType ###
+### SbEglCastsToProperFunctionPointerType
 
 The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/EGL/api/EGL/egl.h](https://www.khronos.org/registry/EGL/api/EGL/egl.h)
 .
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbEglCastsToProperFunctionPointerType) (void)
 ```
 
-### SbEglInt32 ###
+### SbEglInt32
 
 The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h](https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h)
 .
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int32_t SbEglInt32
 ```
 
-## Structs ##
+## Structs
 
-### SbEglInterface ###
+### SbEglInterface
 
-#### Members ####
+#### Members
 
 *   `SbEglBoolean(*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32
     *attrib_list, SbEglConfig *configs, SbEglInt32 config_size, SbEglInt32
diff --git a/cobalt/site/docs/reference/starboard/modules/15/event.md b/cobalt/site/docs/reference/starboard/modules/15/event.md
index 58cb1f4..d8bab06 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/event.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/event.md
@@ -1,11 +1,11 @@
----
-layout: doc
-title: "Starboard Module Reference: event.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `event.h`
 
 Defines the event system that wraps the Starboard main loop and entry point.
 
-## The Starboard Application Lifecycle ##
+## The Starboard Application Lifecycle
 
 ```
                * ----------
@@ -78,15 +78,15 @@
 Note that the application is always expected to transition through `BLURRED`,
 `CONCEALED` to `FROZEN` before receiving `Stop` or being killed.
 
-## Enums ##
+## Enums
 
-### SbEventType ###
+### SbEventType
 
 An enumeration of all possible event types dispatched directly by the system.
 Each event is accompanied by a void* data argument, and each event must define
 the type of the value pointed to by that data argument, if any.
 
-#### Values ####
+#### Values
 
 *   `kSbEventTypePreload`
 
@@ -273,55 +273,55 @@
     change in the timezone setting). This should trigger the application to re-
     query the relevant APIs to update the date and time.
 
-## Typedefs ##
+## Typedefs
 
-### SbEventCallback ###
+### SbEventCallback
 
 A function that can be called back from the main Starboard event pump.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbEventCallback) (void *context)
 ```
 
-### SbEventDataDestructor ###
+### SbEventDataDestructor
 
 A function that will cleanly destroy an event data instance of a specific type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbEventDataDestructor) (void *data)
 ```
 
-### SbEventId ###
+### SbEventId
 
 An ID that can be used to refer to a scheduled event.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef uint32_t SbEventId
 ```
 
-## Structs ##
+## Structs
 
-### SbEvent ###
+### SbEvent
 
 Structure representing a Starboard event and its data.
 
-#### Members ####
+#### Members
 
 *   `SbEventType type`
 *   `SbTimeMonotonic timestamp`
 *   `void * data`
 
-### SbEventStartData ###
+### SbEventStartData
 
 Event data for kSbEventTypeStart events.
 
-#### Members ####
+#### Members
 
 *   `char ** argument_values`
 
@@ -333,31 +333,31 @@
 
     The startup link, if any.
 
-### SbEventWindowSizeChangedData ###
+### SbEventWindowSizeChangedData
 
 Event data for kSbEventTypeWindowSizeChanged events.
 
-#### Members ####
+#### Members
 
 *   `SbWindow window`
 *   `SbWindowSize size`
 
-## Functions ##
+## Functions
 
-### SbEventCancel ###
+### SbEventCancel
 
 Cancels the specified `event_id`. Note that this function is a no-op if the
 event already fired. This function can be safely called from any thread, but the
 only way to guarantee that the event does not run anyway is to call it from the
 main Starboard event loop thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbEventCancel(SbEventId event_id)
 ```
 
-### SbEventHandle ###
+### SbEventHandle
 
 The entry point that Starboard applications MUST implement. Any memory pointed
 at by `event` or the `data` field inside `event` is owned by the system, and
@@ -370,23 +370,23 @@
 application should generally do as little work as possible on this thread, and
 just dispatch it over to another thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SB_EXPORT_PLATFORM void SbEventHandle(const SbEvent *event)
 ```
 
-### SbEventIsIdValid ###
+### SbEventIsIdValid
 
 Returns whether the given event handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbEventIsIdValid(SbEventId handle)
 ```
 
-### SbEventSchedule ###
+### SbEventSchedule
 
 Schedules an event `callback` into the main Starboard event loop. This function
 may be called from any thread, but `callback` is always called from the main
@@ -397,18 +397,18 @@
 of microseconds to wait before calling the `callback` function. Set `delay` to
 `0` to call the callback as soon as possible.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbEventId SbEventSchedule(SbEventCallback callback, void *context, SbTime delay)
 ```
 
-### SbRunStarboardMain ###
+### SbRunStarboardMain
 
 Serves as the entry point in the Starboard library for running the Starboard
 event loop with the application event handler.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbRunStarboardMain(int argc, char **argv, SbEventHandleCallback callback)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/export.md b/cobalt/site/docs/reference/starboard/modules/15/export.md
index ff79777..a398d4a 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/export.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/export.md
@@ -1,24 +1,24 @@
----
-layout: doc
-title: "Starboard Module Reference: export.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `export.h`
 
 Provides macros for properly exporting or importing symbols from shared
 libraries.
 
-## Macros ##
+## Macros
 
-### SB_EXPORT ###
+### SB_EXPORT
 
 Specification for a symbol that should be exported when building the DLL and
 imported when building code that uses the DLL.
 
-### SB_EXPORT_PRIVATE ###
+### SB_EXPORT_PRIVATE
 
 Specification for a symbol that should be exported or imported for testing
 purposes only.
 
-### SB_IMPORT ###
+### SB_IMPORT
 
 Specification for a symbol that is expected to be defined externally to this
 module.
diff --git a/cobalt/site/docs/reference/starboard/modules/15/file.md b/cobalt/site/docs/reference/starboard/modules/15/file.md
index 56eb415..103af47 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/file.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/file.md
@@ -1,25 +1,25 @@
----
-layout: doc
-title: "Starboard Module Reference: file.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `file.h`
 
 Defines file system input/output functions.
 
-## Macros ##
+## Macros
 
-### kSbFileInvalid ###
+### kSbFileInvalid
 
 Well-defined value for an invalid file handle.
 
-## Enums ##
+## Enums
 
-### SbFileError ###
+### SbFileError
 
 kSbFileErrorAccessDenied is returned when a call fails because of a filesystem
 restriction. kSbFileErrorSecurity is returned when a security policy doesn't
 allow the operation to be executed.
 
-#### Values ####
+#### Values
 
 *   `kSbFileOk`
 *   `kSbFileErrorFailed`
@@ -40,7 +40,7 @@
 *   `kSbFileErrorIO`
 *   `kSbFileErrorMax`
 
-### SbFileFlags ###
+### SbFileFlags
 
 Flags that define how a file is used in the application. These flags should be
 or'd together when passed to SbFileOpen to open or create a file.
@@ -66,7 +66,7 @@
 
 The `kSbFileAsync` flag is optional.
 
-#### Values ####
+#### Values
 
 *   `kSbFileOpenOnly`
 *   `kSbFileCreateOnly`
@@ -85,35 +85,35 @@
 *   `kSbFileWrite`
 *   `kSbFileAsync`
 
-### SbFileWhence ###
+### SbFileWhence
 
 This explicit mapping matches both FILE_ on Windows and SEEK_ on Linux.
 
-#### Values ####
+#### Values
 
 *   `kSbFileFromBegin`
 *   `kSbFileFromCurrent`
 *   `kSbFileFromEnd`
 
-## Typedefs ##
+## Typedefs
 
-### SbFile ###
+### SbFile
 
 A handle to an open file.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbFilePrivate* SbFile
 ```
 
-## Structs ##
+## Structs
 
-### SbFileInfo ###
+### SbFileInfo
 
 Used to hold information about a file.
 
-#### Members ####
+#### Members
 
 *   `int64_t size`
 
@@ -134,9 +134,9 @@
 
     The creation time of a file.
 
-## Functions ##
+## Functions
 
-### SbFileAtomicReplace ###
+### SbFileAtomicReplace
 
 Replaces the content of the file at `path` with `data`. Returns whether the
 contents of the file were replaced. The replacement of the content is an atomic
@@ -146,39 +146,39 @@
 to replace the file contents with. `data_size`: The amount of `data`, in bytes,
 to be written to the file.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileAtomicReplace(const char *path, const char *data, int64_t data_size)
 ```
 
-### SbFileCanOpen ###
+### SbFileCanOpen
 
 Indicates whether SbFileOpen() with the given `flags` is allowed for `path`.
 
 `path`: The absolute path to be checked. `flags`: The flags that are being
 evaluated for the given `path`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileCanOpen(const char *path, int flags)
 ```
 
-### SbFileClose ###
+### SbFileClose
 
 Closes `file`. The return value indicates whether the file was closed
 successfully.
 
 `file`: The absolute path of the file to be closed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileClose(SbFile file)
 ```
 
-### SbFileDelete ###
+### SbFileDelete
 
 Deletes the regular file, symlink, or empty directory at `path`. This function
 is used primarily to clean up after unit tests. On some platforms, this function
@@ -186,38 +186,38 @@
 
 `path`: The absolute path of the file, symlink, or directory to be deleted.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileDelete(const char *path)
 ```
 
-### SbFileExists ###
+### SbFileExists
 
 Indicates whether a file or directory exists at `path`.
 
 `path`: The absolute path of the file or directory being checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileExists(const char *path)
 ```
 
-### SbFileFlush ###
+### SbFileFlush
 
 Flushes the write buffer to `file`. Data written via SbFileWrite is not
 necessarily committed until the SbFile is flushed or closed.
 
 `file`: The SbFile to which the write buffer is flushed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileFlush(SbFile file)
 ```
 
-### SbFileGetInfo ###
+### SbFileGetInfo
 
 Retrieves information about `file`. The return value indicates whether the file
 information was retrieved successfully.
@@ -226,13 +226,13 @@
 into which the retrieved data is placed. This variable is not touched if the
 operation is not successful.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileGetInfo(SbFile file, SbFileInfo *out_info)
 ```
 
-### SbFileGetPathInfo ###
+### SbFileGetPathInfo
 
 Retrieves information about the file at `path`. The return value indicates
 whether the file information was retrieved successfully.
@@ -241,36 +241,36 @@
 `out_info`: The variable into which the retrieved data is placed. This variable
 is not touched if the operation is not successful.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileGetPathInfo(const char *path, SbFileInfo *out_info)
 ```
 
-### SbFileIsValid ###
+### SbFileIsValid
 
 Returns whether the given file handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbFileIsValid(SbFile file)
 ```
 
-### SbFileModeStringToFlags ###
+### SbFileModeStringToFlags
 
 Converts an ISO `fopen()` mode string into flags that can be equivalently passed
 into SbFileOpen().
 
 `mode`: The mode string to be converted into flags.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbFileModeStringToFlags(const char *mode)
 ```
 
-### SbFileOpen ###
+### SbFileOpen
 
 Opens the file at `path`, which must be absolute, creating it if specified by
 `flags`. The read/write position is at the beginning of the file.
@@ -287,13 +287,13 @@
 sets this value to `false`. `out_error`: If `path` cannot be created, this is
 set to `kSbFileInvalid`. Otherwise, it is `NULL`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbFile SbFileOpen(const char *path, int flags, bool *out_created, SbFileError *out_error)
 ```
 
-### SbFileRead ###
+### SbFileRead
 
 Reads `size` bytes (or until EOF is reached) from `file` into `data`, starting
 at the file's current position.
@@ -306,13 +306,13 @@
 `file`: The SbFile from which to read data. `data`: The variable to which data
 is read. `size`: The amount of data (in bytes) to read.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbFileRead(SbFile file, char *data, int size)
 ```
 
-### SbFileReadAll ###
+### SbFileReadAll
 
 Reads `size` bytes (or until EOF is reached) from `file` into `data`, starting
 at the file's current position.
@@ -326,13 +326,13 @@
 `file`: The SbFile from which to read data. `data`: The variable to which data
 is read. `size`: The amount of data (in bytes) to read.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbFileReadAll(SbFile file, char *data, int size)
 ```
 
-### SbFileSeek ###
+### SbFileSeek
 
 Changes the current read/write position in `file`. The return value identifies
 the resultant current read/write position in the file (relative to the start) or
@@ -344,13 +344,13 @@
 value. `offset`: The amount that the read/write position is changed, relative to
 `whence`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbFileSeek(SbFile file, SbFileWhence whence, int64_t offset)
 ```
 
-### SbFileTruncate ###
+### SbFileTruncate
 
 Truncates the given `file` to the given `length`. The return value indicates
 whether the file was truncated successfully.
@@ -360,13 +360,13 @@
 then the file is extended with zeros. If `length` is negative, then the function
 is a no-op and returns `false`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileTruncate(SbFile file, int64_t length)
 ```
 
-### SbFileWrite ###
+### SbFileWrite
 
 Writes the given buffer into `file` at the file's current position, overwriting
 any data that was previously there.
@@ -380,13 +380,13 @@
 `file`: The SbFile to which data will be written. `data`: The data to be
 written. `size`: The amount of data (in bytes) to write.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbFileWrite(SbFile file, const char *data, int size)
 ```
 
-### SbFileWriteAll ###
+### SbFileWriteAll
 
 Writes the given buffer into `file`, starting at the beginning of the file, and
 overwriting any data that was previously there. Unlike SbFileWrite, this
@@ -397,7 +397,7 @@
 `file`: The file to which data will be written. `data`: The data to be written.
 `size`: The amount of data (in bytes) to write.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbFileWriteAll(SbFile file, const char *data, int size)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/gles.md b/cobalt/site/docs/reference/starboard/modules/15/gles.md
index 163d8d7..77bc07e 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/gles.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/gles.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: gles.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `gles.h`
 
 The GLES API provides an interface with accompanying type declarations and
 defines that together provide a single consistent method of GLES usage across
@@ -11,37 +11,37 @@
 and versions on different systems, and to remove the requirement for any other
 code to directly pull in and use these system libraries.
 
-## GLES Version ##
+## GLES Version
 
 This API has the ability to support GLES 3.0, however platforms are not required
 to support anything beyond GLES 2.0. The caller is responsible for ensuring that
 the functions from GLES 3.0 they are calling from the interface are valid.
 
-## Macros ##
+## Macros
 
-### SB_GL_DEPTH_BUFFER_BIT ###
+### SB_GL_DEPTH_BUFFER_BIT
 
 Previously defined in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
 
-### SB_GL_READ_BUFFER ###
+### SB_GL_READ_BUFFER
 
 Previously defined in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
 .
 
-## Typedefs ##
+## Typedefs
 
-### SbGlBoolean ###
+### SbGlBoolean
 
 The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
 .
 
-#### Definition ####
+#### Definition
 
 ```
 typedef uint8_t SbGlBoolean
 ```
 
-### SbGlIntPtr ###
+### SbGlIntPtr
 
 Some compilers will transform the intptr_t to an int transparently behind the
 scenes, which is not equivalent to a long int, or long long int, as far as the
@@ -49,17 +49,17 @@
 those exact types used by OpenGL ES 2.0 ( [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h)
 ).
 
-#### Definition ####
+#### Definition
 
 ```
 typedef long int SbGlIntPtr
 ```
 
-## Structs ##
+## Structs
 
-### SbGlesInterface ###
+### SbGlesInterface
 
-#### Members ####
+#### Members
 
 *   `void(*glActiveTexture)(SbGlEnum texture)`
 
diff --git a/cobalt/site/docs/reference/starboard/modules/15/image.md b/cobalt/site/docs/reference/starboard/modules/15/image.md
index 1427d39..945938a 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/image.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/image.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: image.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `image.h`
 
 API for hardware accelerated image decoding. This module allows for the client
 to feed in raw, encoded data to be decoded directly into an SbDecodeTarget. It
@@ -11,7 +11,7 @@
 All functions in this module are safe to call from any thread at any point in
 time.
 
-## SbImageIsDecodeSupported and SbImageDecode Example ##
+## SbImageIsDecodeSupported and SbImageDecode Example
 
 ```
 SbDecodeTargetProvider* provider = GetProviderFromSomewhere();
@@ -28,9 +28,9 @@
                                              mime_type, format);
 ```
 
-## Functions ##
+## Functions
 
-### SbImageDecode ###
+### SbImageDecode
 
 Attempt to decode encoded `mime_type` image data `data` of size `data_size` into
 an SbDecodeTarget of SbDecodeFormatType `format`, possibly using
@@ -56,13 +56,13 @@
     kSbDecodeTargetInvalid will be returned, with any intermediate allocations
     being cleaned up in the implementation.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbDecodeTarget SbImageDecode(SbDecodeTargetGraphicsContextProvider *context_provider, void *data, int data_size, const char *mime_type, SbDecodeTargetFormat format)
 ```
 
-### SbImageIsDecodeSupported ###
+### SbImageIsDecodeSupported
 
 Whether the current platform supports hardware accelerated decoding an image of
 mime type `mime_type` into SbDecodeTargetFormat `format`. The `mime_type` must
@@ -70,7 +70,7 @@
 program, which means that the results of this function may be cached
 indefinitely.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbImageIsDecodeSupported(const char *mime_type, SbDecodeTargetFormat format)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/input.md b/cobalt/site/docs/reference/starboard/modules/15/input.md
index ec86793..a858c73 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/input.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/input.md
@@ -1,18 +1,18 @@
----
-layout: doc
-title: "Starboard Module Reference: input.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `input.h`
 
 Defines input events and associated data types.
 
-## Enums ##
+## Enums
 
-### SbInputDeviceType ###
+### SbInputDeviceType
 
 Identifies possible input subsystem types. The types of events that each device
 type produces correspond to `SbInputEventType` values.
 
-#### Values ####
+#### Values
 
 *   `kSbInputDeviceTypeGesture`
 
@@ -57,11 +57,11 @@
 
     Produces `Input` events.
 
-### SbInputEventType ###
+### SbInputEventType
 
 The action that an input event represents.
 
-#### Values ####
+#### Values
 
 *   `kSbInputEventTypeMove`
 
@@ -86,13 +86,13 @@
 
     [https://w3c.github.io/uievents/#event-type-input](https://w3c.github.io/uievents/#event-type-input)
 
-## Structs ##
+## Structs
 
-### SbInputData ###
+### SbInputData
 
 Event data for `kSbEventTypeInput` events.
 
-#### Members ####
+#### Members
 
 *   `SbWindow window`
 
@@ -160,11 +160,11 @@
 
     Set to true if the input event is part of a composition event.
 
-### SbInputVector ###
+### SbInputVector
 
 A 2-dimensional vector used to represent points and motion vectors.
 
-#### Members ####
+#### Members
 
 *   `float x`
 *   `float y`
diff --git a/cobalt/site/docs/reference/starboard/modules/15/key.md b/cobalt/site/docs/reference/starboard/modules/15/key.md
index 2835b20..ed87e53 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/key.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/key.md
@@ -1,19 +1,19 @@
----
-layout: doc
-title: "Starboard Module Reference: key.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `key.h`
 
 Defines the canonical set of Starboard key codes.
 
-## Enums ##
+## Enums
 
-### SbKey ###
+### SbKey
 
 A standard set of key codes, ordered by value, that represent each possible
 input key across all kinds of devices. Starboard uses the semi-standard Windows
 virtual key codes documented at: [https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx](https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx)
 
-#### Values ####
+#### Values
 
 *   `kSbKeyUnknown`
 *   `kSbKeyCancel`
@@ -275,11 +275,11 @@
 *   `kSbKeyGamepadRightStickLeft`
 *   `kSbKeyGamepadRightStickRight`
 
-### SbKeyModifiers ###
+### SbKeyModifiers
 
 Bit-mask of key modifiers.
 
-#### Values ####
+#### Values
 
 *   `kSbKeyModifiersNone`
 *   `kSbKeyModifiersAlt`
diff --git a/cobalt/site/docs/reference/starboard/modules/15/log.md b/cobalt/site/docs/reference/starboard/modules/15/log.md
index 42de513..6cf3a49 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/log.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/log.md
@@ -1,18 +1,18 @@
----
-layout: doc
-title: "Starboard Module Reference: log.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `log.h`
 
 Defines core debug logging functions.
 
-## Enums ##
+## Enums
 
-### SbLogPriority ###
+### SbLogPriority
 
 The priority at which a message should be logged. The platform may be configured
 to filter logs by priority, or render them differently.
 
-#### Values ####
+#### Values
 
 *   `kSbLogPriorityUnknown`
 *   `kSbLogPriorityInfo`
@@ -20,9 +20,9 @@
 *   `kSbLogPriorityError`
 *   `kSbLogPriorityFatal`
 
-## Functions ##
+## Functions
 
-### SbLog ###
+### SbLog
 
 Writes `message` to the platform's debug output log. This method is thread-safe,
 and responsible for ensuring that the output from multiple threads is not mixed.
@@ -35,55 +35,55 @@
 termination. That said, platforms can adjust the message to be more suitable for
 their output method by wrapping the text, stripping unprintable characters, etc.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLog(SbLogPriority priority, const char *message)
 ```
 
-### SbLogFlush ###
+### SbLogFlush
 
 Flushes the log buffer on some platforms. This method is safe to call from
 multiple threads.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogFlush()
 ```
 
-### SbLogFormat ###
+### SbLogFormat
 
 A log output method that additionally performs a string format on the data being
 logged.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogFormat(const char *format, va_list args) SB_PRINTF_FORMAT(1
 ```
 
-### SbLogFormatF ###
+### SbLogFormatF
 
 Inline wrapper of SbLogFormat that converts from ellipsis to va_args.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void static void static void SbLogFormatF(const char *format,...) SB_PRINTF_FORMAT(1
 ```
 
-### SbLogIsTty ###
+### SbLogIsTty
 
 Indicates whether the log output goes to a TTY or is being redirected.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbLogIsTty()
 ```
 
-### SbLogRaw ###
+### SbLogRaw
 
 A bare-bones log output method that is async-signal-safe, i.e. safe to call from
 an asynchronous signal handler (e.g. a `SIGSEGV` handler). It should not do any
@@ -91,13 +91,13 @@
 
 `message`: The message to be logged. Must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogRaw(const char *message)
 ```
 
-### SbLogRawDumpStack ###
+### SbLogRawDumpStack
 
 Dumps the stack of the current thread to the log in an async-signal-safe manner,
 i.e. safe to call from an asynchronous signal handler (e.g. a `SIGSEGV`
@@ -108,28 +108,28 @@
 helper functions that might end up on top of every stack dump so that the stack
 dump is just the relevant function stack where the problem occurred.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogRawDumpStack(int frames_to_skip)
 ```
 
-### SbLogRawFormat ###
+### SbLogRawFormat
 
 A formatted log output method that is async-signal-safe, i.e. safe to call from
 an asynchronous signal handler (e.g. a `SIGSEGV` handler).
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogRawFormat(const char *format, va_list args) SB_PRINTF_FORMAT(1
 ```
 
-### SbLogRawFormatF ###
+### SbLogRawFormatF
 
 Inline wrapper of SbLogFormat to convert from ellipsis to va_args.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void static void static void SbLogRawFormatF(const char *format,...) SB_PRINTF_FORMAT(1
diff --git a/cobalt/site/docs/reference/starboard/modules/15/media.md b/cobalt/site/docs/reference/starboard/modules/15/media.md
index 132166c..42871c2 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/media.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/media.md
@@ -1,28 +1,28 @@
----
-layout: doc
-title: "Starboard Module Reference: media.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `media.h`
 
 Provides media definitions that are common between the Decoder and Player
 interfaces.
 
-## Macros ##
+## Macros
 
-### kSbMediaBitsPerPixelInvalid ###
+### kSbMediaBitsPerPixelInvalid
 
 Value used when a video's bits per pixel is not known.
 
-### kSbMediaVideoResolutionDimensionInvalid ###
+### kSbMediaVideoResolutionDimensionInvalid
 
 Value used when a video's resolution is not known.
 
-## Enums ##
+## Enums
 
-### SbMediaAudioCodec ###
+### SbMediaAudioCodec
 
 Types of audio elementary streams that can be supported.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioCodecNone`
 *   `kSbMediaAudioCodecAac`
@@ -35,11 +35,11 @@
 *   `kSbMediaAudioCodecPcm`
 *   `kSbMediaAudioCodecIamf`
 
-### SbMediaAudioCodingType ###
+### SbMediaAudioCodingType
 
 Possible audio coding types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioCodingTypeNone`
 *   `kSbMediaAudioCodingTypeAac`
@@ -53,11 +53,11 @@
 *   `kSbMediaAudioCodingTypeMpeg3`
 *   `kSbMediaAudioCodingTypePcm`
 
-### SbMediaAudioConnector ###
+### SbMediaAudioConnector
 
 Possible audio connector types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioConnectorUnknown`
 *   `kSbMediaAudioConnectorAnalog`
@@ -76,11 +76,11 @@
 *   `kSbMediaAudioConnectorSpdif`
 *   `kSbMediaAudioConnectorUsb`
 
-### SbMediaAudioFrameStorageType ###
+### SbMediaAudioFrameStorageType
 
 Possible audio frame storage types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioFrameStorageTypeInterleaved`
 
@@ -96,22 +96,22 @@
     with timestamps 0, 1, 2, etc., the samples are stored in two buffers "L0 L1
     L2 ..." and "R0 R1 R2 ...".
 
-### SbMediaAudioSampleType ###
+### SbMediaAudioSampleType
 
 Possible audio sample types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioSampleTypeInt16Deprecated`
 *   `kSbMediaAudioSampleTypeFloat32`
 
-### SbMediaRangeId ###
+### SbMediaRangeId
 
 This corresponds to the WebM Range enum which is part of WebM color data (see [http://www.webmproject.org/docs/container/#Range](http://www.webmproject.org/docs/container/#Range)
 ). H.264 only uses a bool, which corresponds to the LIMITED/FULL values. Chrome-
 specific values start at 1000.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaRangeIdUnspecified`
 
@@ -127,13 +127,13 @@
     Range is defined by TransferId/MatrixId.
 *   `kSbMediaRangeIdLast`
 
-### SbMediaSupportType ###
+### SbMediaSupportType
 
 Indicates how confident the device is that it can play media resources of the
 given type. The values are a direct map of the canPlayType() method specified at
 the following link: [https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype](https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype)
 
-#### Values ####
+#### Values
 
 *   `kSbMediaSupportTypeNotSupported`
 
@@ -145,11 +145,11 @@
 
     The media type seems to be playable.
 
-### SbMediaType ###
+### SbMediaType
 
 Types of media component streams.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaTypeAudio`
 
@@ -158,11 +158,11 @@
 
     Value used for video streams.
 
-### SbMediaVideoCodec ###
+### SbMediaVideoCodec
 
 Types of video elementary streams that could be supported.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaVideoCodecNone`
 *   `kSbMediaVideoCodecH264`
@@ -174,14 +174,14 @@
 *   `kSbMediaVideoCodecVp8`
 *   `kSbMediaVideoCodecVp9`
 
-## Structs ##
+## Structs
 
-### SbMediaAudioConfiguration ###
+### SbMediaAudioConfiguration
 
 A structure describing the audio configuration parameters of a single audio
 output.
 
-#### Members ####
+#### Members
 
 *   `SbMediaAudioConnector connector`
 
@@ -200,11 +200,11 @@
     `0` if this device cannot provide this information, in which case the caller
     can probably assume stereo output.
 
-### SbMediaAudioSampleInfo ###
+### SbMediaAudioSampleInfo
 
 The set of information required by the decoder or player for each audio sample.
 
-#### Members ####
+#### Members
 
 *   `SbMediaAudioStreamInfo stream_info`
 
@@ -212,11 +212,11 @@
 *   `SbTime discarded_duration_from_front`
 *   `SbTime discarded_duration_from_back`
 
-### SbMediaAudioStreamInfo ###
+### SbMediaAudioStreamInfo
 
 The set of information required by the decoder or player for each audio stream.
 
-#### Members ####
+#### Members
 
 *   `SbMediaAudioCodec codec`
 
@@ -242,14 +242,14 @@
 
     The AudioSpecificConfig, as specified in ISO/IEC-14496-3, section 1.6.2.1: [http://read.pudn.com/downloads98/doc/comm/401153/14496/ISO_IEC_14496-3%20Part%203%20Audio/C036083E_SUB1.PDF](http://read.pudn.com/downloads98/doc/comm/401153/14496/ISO_IEC_14496-3%20Part%203%20Audio/C036083E_SUB1.PDF)
 
-### SbMediaColorMetadata ###
+### SbMediaColorMetadata
 
 HDR (High Dynamic Range) Metadata common for HDR10 and WebM/VP9-based HDR
 formats, together with the ColorSpace. HDR reproduces a greater dynamic range of
 luminosity than is possible with standard digital imaging. See the Consumer
 Electronics Association press release: [https://www.cta.tech/News/Press-Releases/2015/August/CEA-Defines-%E2%80%98HDR-Compatible%E2%80%99-Displays.aspx](https://www.cta.tech/News/Press-Releases/2015/August/CEA-Defines-%E2%80%98HDR-Compatible%E2%80%99-Displays.aspx)
 
-#### Members ####
+#### Members
 
 *   `unsigned int bits_per_channel`
 
@@ -330,7 +330,7 @@
     a row-major ordered 3 x 4 submatrix of the 4 x 4 transform matrix. The 4th
     row is completed as (0, 0, 0, 1).
 
-### SbMediaMasteringMetadata ###
+### SbMediaMasteringMetadata
 
 SMPTE 2086 mastering data [http://ieeexplore.ieee.org/document/7291707/](http://ieeexplore.ieee.org/document/7291707/)
 This standard specifies the metadata items to specify the color volume (the
@@ -339,7 +339,7 @@
 independent of any specific digital representation. Also see the WebM container
 guidelines: [https://www.webmproject.org/docs/container/](https://www.webmproject.org/docs/container/)
 
-#### Members ####
+#### Members
 
 *   `float primary_r_chromaticity_x`
 
@@ -374,11 +374,11 @@
     Minimum luminance. Shall be represented in candelas per square meter
     (cd/m^2). In range [0, 9999.99].
 
-### SbMediaVideoSampleInfo ###
+### SbMediaVideoSampleInfo
 
 The set of information required by the decoder or player for each video sample.
 
-#### Members ####
+#### Members
 
 *   `SbMediaVideoStreamInfo stream_info`
 
@@ -388,11 +388,11 @@
     Indicates whether the associated sample is a key frame (I-frame). Avc video
     key frames must always start with SPS and PPS NAL units.
 
-### SbMediaVideoStreamInfo ###
+### SbMediaVideoStreamInfo
 
 The set of information required by the decoder or player for each video stream.
 
-#### Members ####
+#### Members
 
 *   `SbMediaVideoCodec codec`
 
@@ -434,9 +434,9 @@
     . This will only be specified on frames where the HDR metadata and color /
     color space might have changed (e.g. keyframes).
 
-## Functions ##
+## Functions
 
-### SbMediaCanPlayMimeAndKeySystem ###
+### SbMediaCanPlayMimeAndKeySystem
 
 Returns information about whether the playback of the specific media described
 by `mime` and encrypted using `key_system` can be played.
@@ -480,13 +480,13 @@
 implementation supports key system with attributes on one key system, it has to
 support key system with attributes on all key systems supported.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMediaSupportType SbMediaCanPlayMimeAndKeySystem(const char *mime, const char *key_system)
 ```
 
-### SbMediaGetAudioBufferBudget ###
+### SbMediaGetAudioBufferBudget
 
 Specifies the maximum amount of memory used by audio buffers of media source
 before triggering a garbage collection. A large value will cause more memory
@@ -494,13 +494,13 @@
 download audio data. Note that the app may experience significant difficulty if
 this value is too low.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetAudioBufferBudget()
 ```
 
-### SbMediaGetAudioConfiguration ###
+### SbMediaGetAudioConfiguration
 
 Retrieves the current physical audio configuration of audio output
 `output_index` on this device and places it in `out_configuration`, which must
@@ -512,37 +512,37 @@
 `out_configuration`: The variable that holds the audio configuration
 information.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMediaGetAudioConfiguration(int output_index, SbMediaAudioConfiguration *out_configuration)
 ```
 
-### SbMediaGetAudioOutputCount ###
+### SbMediaGetAudioOutputCount
 
 Returns the number of audio outputs currently available on this device. Even if
 the number of outputs or their audio configurations can't be determined, it is
 expected that the platform will at least return a single output that supports at
 least stereo.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetAudioOutputCount()
 ```
 
-### SbMediaGetBufferAlignment ###
+### SbMediaGetBufferAlignment
 
 The media buffer will be allocated using the returned alignment. Set this to a
 larger value may increase the memory consumption of media buffers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetBufferAlignment()
 ```
 
-### SbMediaGetBufferAllocationUnit ###
+### SbMediaGetBufferAllocationUnit
 
 When the media stack needs more memory to store media buffers, it will allocate
 extra memory in units returned by SbMediaGetBufferAllocationUnit. This can
@@ -550,13 +550,13 @@
 When SbMediaGetInitialBufferCapacity and this function both return 0, the media
 stack will allocate individual buffers directly using SbMemory functions.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetBufferAllocationUnit()
 ```
 
-### SbMediaGetBufferGarbageCollectionDurationThreshold ###
+### SbMediaGetBufferGarbageCollectionDurationThreshold
 
 Specifies the duration threshold of media source garbage collection. When the
 accumulated duration in a source buffer exceeds this value, the media source
@@ -567,54 +567,54 @@
 return 170 seconds for most of the platforms. But it can be further reduced on
 systems with extremely low memory.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTime SbMediaGetBufferGarbageCollectionDurationThreshold()
 ```
 
-### SbMediaGetBufferPadding ###
+### SbMediaGetBufferPadding
 
 Extra bytes allocated at the end of a media buffer to ensure that the buffer can
 be use optimally by specific instructions like SIMD. Set to 0 to remove any
 padding.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetBufferPadding()
 ```
 
-### SbMediaGetBufferStorageType ###
+### SbMediaGetBufferStorageType
 
 Returns SbMediaBufferStorageType of type `SbMediaStorageTypeMemory` or
 `SbMediaStorageTypeFile`. For memory storage, the media buffers will be stored
 in main memory allocated by SbMemory functions. For file storage, the media
 buffers will be stored in a temporary file in the system cache folder acquired
 by calling SbSystemGetPath() with "kSbSystemPathCacheDirectory". Note that when
-its value is "file" the media stack will still allocate memory to cache the the
+its value is "file" the media stack will still allocate memory to cache the
 buffers in use.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMediaBufferStorageType SbMediaGetBufferStorageType()
 ```
 
-### SbMediaGetInitialBufferCapacity ###
+### SbMediaGetInitialBufferCapacity
 
 The amount of memory that will be used to store media buffers allocated during
 system startup. To allocate a large chunk at startup helps with reducing
 fragmentation and can avoid failures to allocate incrementally. This can return
 0.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetInitialBufferCapacity()
 ```
 
-### SbMediaGetMaxBufferCapacity ###
+### SbMediaGetMaxBufferCapacity
 
 The maximum amount of memory that will be used to store media buffers. This must
 be larger than sum of the video budget and audio budget. This is a soft limit
@@ -629,13 +629,13 @@
 resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
 than non- HDR video.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetMaxBufferCapacity(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
 ```
 
-### SbMediaGetProgressiveBufferBudget ###
+### SbMediaGetProgressiveBufferBudget
 
 The memory used when playing mp4 videos that is not in DASH format. The
 resolution of such videos shouldn't go beyond 1080p. Its value should be less
@@ -647,13 +647,13 @@
 resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
 than non- HDR video.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetProgressiveBufferBudget(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
 ```
 
-### SbMediaGetVideoBufferBudget ###
+### SbMediaGetVideoBufferBudget
 
 Specifies the maximum amount of memory used by video buffers of media source
 before triggering a garbage collection. A large value will cause more memory
@@ -666,13 +666,13 @@
 resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
 than non- HDR video.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetVideoBufferBudget(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
 ```
 
-### SbMediaIsBufferPoolAllocateOnDemand ###
+### SbMediaIsBufferPoolAllocateOnDemand
 
 When either SbMediaGetInitialBufferCapacity or SbMediaGetBufferAllocationUnit
 isn't zero, media buffers will be allocated using a memory pool. Set the
@@ -683,18 +683,18 @@
 release any media buffer memory back to the system even if there is no media
 buffers allocated.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMediaIsBufferPoolAllocateOnDemand()
 ```
 
-### SbMediaIsBufferUsingMemoryPool ###
+### SbMediaIsBufferUsingMemoryPool
 
 If SbMediaGetBufferUsingMemoryPool returns true, it indicates that media buffer
 pools should be allocated on demand, as opposed to using SbMemory* functions.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMediaIsBufferUsingMemoryPool()
diff --git a/cobalt/site/docs/reference/starboard/modules/15/memory.md b/cobalt/site/docs/reference/starboard/modules/15/memory.md
index 2fbf7dc..6dfa844 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/memory.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/memory.md
@@ -1,17 +1,17 @@
----
-layout: doc
-title: "Starboard Module Reference: memory.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `memory.h`
 
 Defines functions for memory allocation, alignment, copying, and comparing.
 
-## Porters ##
+## Porters
 
 All of the "Unchecked" and "Free" functions must be implemented, but they should
 not be called directly. The Starboard platform wraps them with extra accounting
 under certain circumstances.
 
-## Porters and Application Developers ##
+## Porters and Application Developers
 
 Nobody should call the "Checked", "Unchecked" or "Free" functions directly
 because that evades Starboard's memory tracking. In both port implementations
@@ -26,14 +26,14 @@
 
 *   The "free" functions are SbMemoryFree() and SbMemoryFreeAligned().
 
-## Enums ##
+## Enums
 
-### SbMemoryMapFlags ###
+### SbMemoryMapFlags
 
 The bitwise OR of these flags should be passed to SbMemoryMap to indicate how
 the mapped memory can be used.
 
-#### Values ####
+#### Values
 
 *   `kSbMemoryMapProtectReserved`
 
@@ -44,9 +44,9 @@
 *   `kSbMemoryMapProtectExec`
 *   `kSbMemoryMapProtectReadWrite`
 
-## Functions ##
+## Functions
 
-### SbMemoryAllocate ###
+### SbMemoryAllocate
 
 Allocates and returns a chunk of memory of at least `size` bytes. This function
 should be called from the client codebase. It is intended to be a drop-in
@@ -58,13 +58,13 @@
 return `NULL` or it may return a unique pointer value that can be passed to
 SbMemoryDeallocate.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocate(size_t size)
 ```
 
-### SbMemoryAllocateAligned ###
+### SbMemoryAllocateAligned
 
 Allocates and returns a chunk of memory of at least `size` bytes, aligned to
 `alignment`. This function should be called from the client codebase. It is
@@ -78,87 +78,87 @@
 `size` is `0`, the function may return `NULL` or it may return a unique aligned
 pointer value that can be passed to SbMemoryDeallocateAligned.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateAligned(size_t alignment, size_t size)
 ```
 
-### SbMemoryAllocateAlignedChecked ###
+### SbMemoryAllocateAlignedChecked
 
 Same as SbMemoryAllocateAlignedUnchecked, but will abort() in the case of an
 allocation failure.
 
 DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateAlignedChecked(size_t alignment, size_t size)
 ```
 
-### SbMemoryAllocateAlignedUnchecked ###
+### SbMemoryAllocateAlignedUnchecked
 
 This is the implementation of SbMemoryAllocateAligned that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateAlignedUnchecked(size_t alignment, size_t size)
 ```
 
-### SbMemoryAllocateChecked ###
+### SbMemoryAllocateChecked
 
 Same as SbMemoryAllocateUnchecked, but will abort() in the case of an allocation
 failure.
 
 DO NOT CALL. Call SbMemoryAllocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateChecked(size_t size)
 ```
 
-### SbMemoryAllocateNoReport ###
+### SbMemoryAllocateNoReport
 
 Same as SbMemoryAllocate() but will not report memory to the tracker. Avoid
 using this unless absolutely necessary.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateNoReport(size_t size)
 ```
 
-### SbMemoryAllocateUnchecked ###
+### SbMemoryAllocateUnchecked
 
 This is the implementation of SbMemoryAllocate that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryAllocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateUnchecked(size_t size)
 ```
 
-### SbMemoryCalloc ###
+### SbMemoryCalloc
 
 A wrapper that implements a drop-in replacement for `calloc`, which is used in
 some packages.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void* SbMemoryCalloc(size_t count, size_t size)
 ```
 
-### SbMemoryDeallocate ###
+### SbMemoryDeallocate
 
 Frees a previously allocated chunk of memory. If `memory` is NULL, then the
 operation is a no-op. This function should be called from the client codebase.
@@ -166,74 +166,74 @@
 
 `memory`: The chunk of memory to be freed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryDeallocate(void *memory)
 ```
 
-### SbMemoryDeallocateAligned ###
+### SbMemoryDeallocateAligned
 
 `memory`: The chunk of memory to be freed. If `memory` is NULL, then the
 function is a no-op.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryDeallocateAligned(void *memory)
 ```
 
-### SbMemoryDeallocateNoReport ###
+### SbMemoryDeallocateNoReport
 
 Same as SbMemoryDeallocate() but will not report memory deallocation to the
 tracker. This function must be matched with SbMemoryAllocateNoReport().
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryDeallocateNoReport(void *memory)
 ```
 
-### SbMemoryFlush ###
+### SbMemoryFlush
 
 Flushes any data in the given virtual address range that is cached locally in
 the current processor core to physical memory, ensuring that data and
 instruction caches are cleared. This is required to be called on executable
 memory that has been written to and might be executed in the future.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryFlush(void *virtual_address, int64_t size_bytes)
 ```
 
-### SbMemoryFree ###
+### SbMemoryFree
 
 This is the implementation of SbMemoryDeallocate that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryDeallocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryFree(void *memory)
 ```
 
-### SbMemoryFreeAligned ###
+### SbMemoryFreeAligned
 
 This is the implementation of SbMemoryFreeAligned that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryDeallocateAligned(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryFreeAligned(void *memory)
 ```
 
-### SbMemoryMap ###
+### SbMemoryMap
 
 Allocates `size_bytes` worth of physical memory pages and maps them into an
 available virtual region. This function returns `SB_MEMORY_MAP_FAILED` on
@@ -248,24 +248,24 @@
 should not count it against any memory budget. `name`: A value that appears in
 the debugger on some platforms. The value can be up to 32 bytes.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryMap(int64_t size_bytes, int flags, const char *name)
 ```
 
-### SbMemoryProtect ###
+### SbMemoryProtect
 
 Change the protection of `size_bytes` of memory regions, starting from
 `virtual_address`, to `flags`, returning `true` on success.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMemoryProtect(void *virtual_address, int64_t size_bytes, int flags)
 ```
 
-### SbMemoryReallocate ###
+### SbMemoryReallocate
 
 Attempts to resize `memory` to be at least `size` bytes, without touching the
 contents of memory.
@@ -285,39 +285,39 @@
 `memory` will be resized. If `size` is `0`, the function may return `NULL` or it
 may return a unique pointer value that can be passed to SbMemoryDeallocate.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryReallocate(void *memory, size_t size)
 ```
 
-### SbMemoryReallocateChecked ###
+### SbMemoryReallocateChecked
 
 Same as SbMemoryReallocateUnchecked, but will abort() in the case of an
 allocation failure.
 
 DO NOT CALL. Call SbMemoryReallocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryReallocateChecked(void *memory, size_t size)
 ```
 
-### SbMemoryReallocateUnchecked ###
+### SbMemoryReallocateUnchecked
 
 This is the implementation of SbMemoryReallocate that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryReallocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryReallocateUnchecked(void *memory, size_t size)
 ```
 
-### SbMemoryUnmap ###
+### SbMemoryUnmap
 
 Unmap `size_bytes` of physical pages starting from `virtual_address`, returning
 `true` on success. After this function completes, [virtual_address,
@@ -327,7 +327,7 @@
 `(void*)0xA000`, and another call to `SbMemoryMap(0x1000)` returns
 `(void*)0xB000`, `SbMemoryUnmap(0xA000, 0x2000)` should free both regions.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMemoryUnmap(void *virtual_address, int64_t size_bytes)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/memory_reporter.md b/cobalt/site/docs/reference/starboard/modules/15/memory_reporter.md
index d67ef1a..d1273c6 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/memory_reporter.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/memory_reporter.md
@@ -1,57 +1,57 @@
----
-layout: doc
-title: "Starboard Module Reference: memory_reporter.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `memory_reporter.h`
 
 Provides an interface for memory reporting.
 
-## Typedefs ##
+## Typedefs
 
-### SbMemoryReporterOnAlloc ###
+### SbMemoryReporterOnAlloc
 
 A function to report a memory allocation from SbMemoryAllocate(). Note that
 operator new calls SbMemoryAllocate which will delegate to this callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnAlloc) (void *context, const void *memory, size_t size)
 ```
 
-### SbMemoryReporterOnDealloc ###
+### SbMemoryReporterOnDealloc
 
 A function to report a memory deallocation from SbMemoryDeallcoate(). Note that
 operator delete calls SbMemoryDeallocate which will delegate to this callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnDealloc) (void *context, const void *memory)
 ```
 
-### SbMemoryReporterOnMapMemory ###
+### SbMemoryReporterOnMapMemory
 
 A function to report a memory mapping from SbMemoryMap().
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnMapMemory) (void *context, const void *memory, size_t size)
 ```
 
-### SbMemoryReporterOnUnMapMemory ###
+### SbMemoryReporterOnUnMapMemory
 
 A function to report a memory unmapping from SbMemoryUnmap().
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnUnMapMemory) (void *context, const void *memory, size_t size)
 ```
 
-## Structs ##
+## Structs
 
-### SbMemoryReporter ###
+### SbMemoryReporter
 
 SbMemoryReporter allows memory reporting via user-supplied functions. The void*
 context is passed to every call back. It's strongly recommended that C-Style
@@ -59,7 +59,7 @@
 compiler. For example, SbMemoryReporter mem_reporter = { MallocCallback, ....
 context };
 
-#### Members ####
+#### Members
 
 *   `SbMemoryReporterOnAlloc on_alloc_cb`
 
@@ -77,9 +77,9 @@
 
     Optional, is passed to callbacks as first argument.
 
-## Functions ##
+## Functions
 
-### SbMemorySetReporter ###
+### SbMemorySetReporter
 
 Sets the MemoryReporter. Any previous memory reporter is unset. No lifetime
 management is done internally on input pointer.
@@ -96,7 +96,7 @@
 SbMemoryReporter* mem_reporter = new ...; SbMemorySetReporter(&mem_reporter);
 ... SbMemorySetReporter(NULL); delete mem_reporter; // May crash.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMemorySetReporter(struct SbMemoryReporter *tracker)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/microphone.md b/cobalt/site/docs/reference/starboard/modules/15/microphone.md
index d760e1e..bcf9e43 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/microphone.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/microphone.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: microphone.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `microphone.h`
 
 Defines functions for microphone creation, control, audio data fetching, and
 destruction. This module supports multiple calls to `SbMicrophoneOpen` and
@@ -31,23 +31,23 @@
 
 1.  Destroy the microphone with `SbMicrophoneDestroy`.
 
-## Macros ##
+## Macros
 
-### kSbMicrophoneIdInvalid ###
+### kSbMicrophoneIdInvalid
 
 Well-defined value for an invalid microphone ID handle.
 
-### kSbMicrophoneInvalid ###
+### kSbMicrophoneInvalid
 
 Well-defined value for an invalid microphone handle.
 
-## Enums ##
+## Enums
 
-### SbMicrophoneType ###
+### SbMicrophoneType
 
 All possible microphone types.
 
-#### Values ####
+#### Values
 
 *   `kSbMicrophoneCamera`
 
@@ -66,37 +66,37 @@
     Unknown microphone type. The microphone could be different than the other
     enum descriptions or could fall under one of those descriptions.
 
-## Typedefs ##
+## Typedefs
 
-### SbMicrophone ###
+### SbMicrophone
 
 An opaque handle to an implementation-private structure that represents a
 microphone.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbMicrophonePrivate* SbMicrophone
 ```
 
-### SbMicrophoneId ###
+### SbMicrophoneId
 
 An opaque handle to an implementation-private structure that represents a
 microphone ID.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbMicrophoneIdPrivate* SbMicrophoneId
 ```
 
-## Structs ##
+## Structs
 
-### SbMicrophoneInfo ###
+### SbMicrophoneInfo
 
 Microphone information.
 
-#### Members ####
+#### Members
 
 *   `SbMicrophoneId id`
 
@@ -116,9 +116,9 @@
     of the microphone type. For example, "Headset Microphone". The string must
     be null terminated.
 
-## Functions ##
+## Functions
 
-### SbMicrophoneClose ###
+### SbMicrophoneClose
 
 Closes the microphone port, stops recording audio on `microphone`, and clears
 the unread buffer if it is not empty. If the microphone has already been
@@ -127,13 +127,13 @@
 
 `microphone`: The microphone to close.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMicrophoneClose(SbMicrophone microphone)
 ```
 
-### SbMicrophoneCreate ###
+### SbMicrophoneCreate
 
 Creates a microphone with the specified ID, audio sample rate, and cached audio
 buffer size. Starboard only requires support for creating one microphone at a
@@ -153,25 +153,25 @@
 this buffer in smaller chunks than this size. This parameter must be set to a
 value greater than zero and the ideal size is `2^n`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMicrophone SbMicrophoneCreate(SbMicrophoneId id, int sample_rate_in_hz, int buffer_size_bytes)
 ```
 
-### SbMicrophoneDestroy ###
+### SbMicrophoneDestroy
 
 Destroys a microphone. If the microphone is in started state, it is first
 stopped and then destroyed. Any data that has been recorded and not read is
 thrown away.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMicrophoneDestroy(SbMicrophone microphone)
 ```
 
-### SbMicrophoneGetAvailable ###
+### SbMicrophoneGetAvailable
 
 Retrieves all currently available microphone information and stores it in
 `out_info_array`. The return value is the number of the available microphones.
@@ -184,43 +184,43 @@
 placed into this output parameter. `info_array_size`: The size of
 `out_info_array`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMicrophoneGetAvailable(SbMicrophoneInfo *out_info_array, int info_array_size)
 ```
 
-### SbMicrophoneIdIsValid ###
+### SbMicrophoneIdIsValid
 
 Indicates whether the given microphone ID is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbMicrophoneIdIsValid(SbMicrophoneId id)
 ```
 
-### SbMicrophoneIsSampleRateSupported ###
+### SbMicrophoneIsSampleRateSupported
 
 Indicates whether the microphone supports the sample rate.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMicrophoneIsSampleRateSupported(SbMicrophoneId id, int sample_rate_in_hz)
 ```
 
-### SbMicrophoneIsValid ###
+### SbMicrophoneIsValid
 
 Indicates whether the given microphone is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbMicrophoneIsValid(SbMicrophone microphone)
 ```
 
-### SbMicrophoneOpen ###
+### SbMicrophoneOpen
 
 Opens the microphone port and starts recording audio on `microphone`.
 
@@ -230,13 +230,13 @@
 open. `microphone`: The microphone that will be opened and will start recording
 audio.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMicrophoneOpen(SbMicrophone microphone)
 ```
 
-### SbMicrophoneRead ###
+### SbMicrophoneRead
 
 Retrieves the recorded audio data from the microphone and writes that data to
 `out_audio_data`.
@@ -255,7 +255,7 @@
 smaller than `min_read_size` of `SbMicrophoneInfo`, the extra audio data that
 has already been read from the device is discarded.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMicrophoneRead(SbMicrophone microphone, void *out_audio_data, int audio_data_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/mutex.md b/cobalt/site/docs/reference/starboard/modules/15/mutex.md
index 05dd810..82ff850 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/mutex.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/mutex.md
@@ -1,24 +1,24 @@
----
-layout: doc
-title: "Starboard Module Reference: mutex.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `mutex.h`
 
 Defines a mutually exclusive lock that can be used to coordinate with other
 threads.
 
-## Macros ##
+## Macros
 
-### SB_MUTEX_MAX_SIZE ###
+### SB_MUTEX_MAX_SIZE
 
 Max size of the SbMutex type.
 
-## Enums ##
+## Enums
 
-### SbMutexResult ###
+### SbMutexResult
 
 Enumeration of possible results from acquiring a mutex.
 
-#### Values ####
+#### Values
 
 *   `kSbMutexAcquired`
 
@@ -30,22 +30,22 @@
 
     The mutex has already been destroyed.
 
-## Typedefs ##
+## Typedefs
 
-### SbMutex ###
+### SbMutex
 
 An opaque handle to a mutex type with reserved memory buffer of size
 SB_MUTEX_MAX_SIZE and aligned at void pointer type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef union SbMutex  SbMutex
 ```
 
-## Functions ##
+## Functions
 
-### SbMutexAcquire ###
+### SbMutexAcquire
 
 Acquires `mutex`, blocking indefinitely. The return value identifies the
 acquisition result. SbMutexes are not reentrant, so a recursive acquisition
@@ -53,13 +53,13 @@
 
 `mutex`: The mutex to be acquired.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMutexResult SbMutexAcquire(SbMutex *mutex)
 ```
 
-### SbMutexAcquireTry ###
+### SbMutexAcquireTry
 
 Acquires `mutex`, without blocking. The return value identifies the acquisition
 result. SbMutexes are not reentrant, so a recursive acquisition has undefined
@@ -67,52 +67,52 @@
 
 `mutex`: The mutex to be acquired.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMutexResult SbMutexAcquireTry(SbMutex *mutex)
 ```
 
-### SbMutexCreate ###
+### SbMutexCreate
 
 Creates a new mutex. The return value indicates whether the function was able to
 create a new mutex.
 
 `out_mutex`: The handle to the newly created mutex.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMutexCreate(SbMutex *out_mutex)
 ```
 
-### SbMutexDestroy ###
+### SbMutexDestroy
 
 Destroys a mutex. The return value indicates whether the destruction was
 successful. Destroying a locked mutex results in undefined behavior.
 
 `mutex`: The mutex to be invalidated.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMutexDestroy(SbMutex *mutex)
 ```
 
-### SbMutexIsSuccess ###
+### SbMutexIsSuccess
 
 Indicates whether the given result is a success. A value of `true` indicates
 that the mutex was acquired.
 
 `result`: The result being checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbMutexIsSuccess(SbMutexResult result)
 ```
 
-### SbMutexRelease ###
+### SbMutexRelease
 
 Releases `mutex` held by the current thread. The return value indicates whether
 the release was successful. Releases should always be successful if `mutex` is
@@ -120,7 +120,7 @@
 
 `mutex`: The mutex to be released.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMutexRelease(SbMutex *mutex)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/once.md b/cobalt/site/docs/reference/starboard/modules/15/once.md
index 2ad1959..d773024 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/once.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/once.md
@@ -1,43 +1,43 @@
----
-layout: doc
-title: "Starboard Module Reference: once.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `once.h`
 
 Onces represent initializations that should only ever happen once per process,
 in a thread-safe way.
 
-## Macros ##
+## Macros
 
-### SB_ONCE_MAX_SIZE ###
+### SB_ONCE_MAX_SIZE
 
 Max size of the SbOnceControl type.
 
-## Typedefs ##
+## Typedefs
 
-### SbOnceControl ###
+### SbOnceControl
 
 An opaque handle to a once control type with reserved memory buffer of size
 SB_ONCE_MAX_SIZE and aligned at void pointer type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef union SbOnceControl  SbOnceControl
 ```
 
-### SbOnceInitRoutine ###
+### SbOnceInitRoutine
 
 Function pointer type for methods that can be called via the SbOnce() system.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbOnceInitRoutine) (void)
 ```
 
-## Functions ##
+## Functions
 
-### SbOnce ###
+### SbOnce
 
 Thread-safely runs `init_routine` only once.
 
@@ -50,7 +50,7 @@
 *   If `once_control` or `init_routine` is invalid, the function returns
     `false`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbOnce(SbOnceControl *once_control, SbOnceInitRoutine init_routine)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/player.md b/cobalt/site/docs/reference/starboard/modules/15/player.md
index 8039f6b..0382642 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/player.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/player.md
@@ -1,53 +1,53 @@
----
-layout: doc
-title: "Starboard Module Reference: player.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `player.h`
 
 Defines an interface for controlling playback of media elementary streams.
 
-## Macros ##
+## Macros
 
-### SB_PLAYER_INITIAL_TICKET ###
+### SB_PLAYER_INITIAL_TICKET
 
 The value of the initial ticket held by the player before the first seek. The
 player will use this ticket value to make the first call to SbPlayerStatusFunc
 with kSbPlayerStateInitialized.
 
-### SB_PLAYER_NO_DURATION ###
+### SB_PLAYER_NO_DURATION
 
 The value to pass into SbPlayerCreate's `duration_pts` argument for cases where
 the duration is unknown, such as for live streams.
 
-### kSbPlayerInvalid ###
+### kSbPlayerInvalid
 
 Well-defined value for an invalid player.
 
-### kSbPlayerWriteDurationLocal ###
+### kSbPlayerWriteDurationLocal
 
 The audio write duration when all the audio connectors are local.
 
-### kSbPlayerWriteDurationRemote ###
+### kSbPlayerWriteDurationRemote
 
 The audio write duration when at least one of the audio connectors are remote.
 
-## Enums ##
+## Enums
 
-### SbPlayerDecoderState ###
+### SbPlayerDecoderState
 
 An indicator of whether the decoder can accept more samples.
 
-#### Values ####
+#### Values
 
 *   `kSbPlayerDecoderStateNeedsData`
 
     The decoder is asking for one more sample.
 
-### SbPlayerSampleSideDataType ###
+### SbPlayerSampleSideDataType
 
 Identify the type of side data accompanied with `SbPlayerSampleInfo`, as side
 data may come from multiple sources.
 
-#### Values ####
+#### Values
 
 *   `kMatroskaBlockAdditional`
 
@@ -56,11 +56,11 @@
     . The first 8 bytes of the data contains the value of BlockAddID in big
     endian format, followed by the content of BlockAdditional.
 
-### SbPlayerState ###
+### SbPlayerState
 
 An indicator of the general playback state.
 
-#### Values ####
+#### Values
 
 *   `kSbPlayerStateInitialized`
 
@@ -84,31 +84,31 @@
 
     The player has been destroyed, and will send no more callbacks.
 
-## Typedefs ##
+## Typedefs
 
-### SbPlayer ###
+### SbPlayer
 
 An opaque handle to an implementation-private structure representing a player.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbPlayerPrivate* SbPlayer
 ```
 
-### SbPlayerDeallocateSampleFunc ###
+### SbPlayerDeallocateSampleFunc
 
 Callback to free the given sample buffer data. When more than one buffer are
 sent in SbPlayerWriteSample(), the implementation only has to call this callback
-with `sample_buffer` points to the the first buffer.
+with `sample_buffer` points to the first buffer.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerDeallocateSampleFunc) (SbPlayer player, void *context, const void *sample_buffer)
 ```
 
-### SbPlayerDecoderStatusFunc ###
+### SbPlayerDecoderStatusFunc
 
 Callback for decoder status updates, called in response to a call to
 SbPlayerSeek() or SbPlayerWriteSample(). This callback will never be called
@@ -122,45 +122,45 @@
 SbPlayerWriteEndOfStream(). The player implementation should update the decoder
 status again after such call to notify its user to continue writing more frames.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerDecoderStatusFunc) (SbPlayer player, void *context, SbMediaType type, SbPlayerDecoderState state, int ticket)
 ```
 
-### SbPlayerErrorFunc ###
+### SbPlayerErrorFunc
 
 Callback for player errors, that may set a `message`. `error`: indicates the
 error code. `message`: provides specific informative diagnostic message about
 the error condition encountered. It is ok for the message to be an empty string
 or NULL if no information is available.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerErrorFunc) (SbPlayer player, void *context, SbPlayerError error, const char *message)
 ```
 
-### SbPlayerStatusFunc ###
+### SbPlayerStatusFunc
 
 Callback for player status updates. These callbacks will happen on a different
 thread than the calling thread, and it is not valid to call SbPlayer functions
 from within this callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerStatusFunc) (SbPlayer player, void *context, SbPlayerState state, int ticket)
 ```
 
-## Structs ##
+## Structs
 
-### SbPlayerCreationParam ###
+### SbPlayerCreationParam
 
 The playback related parameters to pass into SbPlayerCreate() and
 SbPlayerGetPreferredOutputMode().
 
-#### Members ####
+#### Members
 
 *   `SbDrmSystem drm_system`
 
@@ -186,11 +186,11 @@
     should be made available for the application to pull via calls to
     SbPlayerGetCurrentFrame().
 
-### SbPlayerInfo ###
+### SbPlayerInfo
 
 Information about the current media playback state.
 
-#### Members ####
+#### Members
 
 *   `SbTime current_media_timestamp`
 
@@ -237,11 +237,11 @@
     faster than normal speed. When it is less than one, the video is played in a
     slower than normal speed. Negative speeds are not supported.
 
-### SbPlayerSampleInfo ###
+### SbPlayerSampleInfo
 
 Information about the samples to be written into SbPlayerWriteSamples().
 
-#### Members ####
+#### Members
 
 *   `SbMediaType type`
 *   `const void * buffer`
@@ -274,12 +274,12 @@
     The DRM system related info for the media sample. This value is required for
     encrypted samples. Otherwise, it must be `NULL`.
 
-### SbPlayerSampleSideData ###
+### SbPlayerSampleSideData
 
 Side data accompanied with `SbPlayerSampleInfo`, it can be arbitrary binary data
 coming from multiple sources.
 
-#### Members ####
+#### Members
 
 *   `SbPlayerSampleSideDataType type`
 *   `const uint8_t * data`
@@ -290,9 +290,9 @@
 
     The size of the data pointed by `data`, in bytes.
 
-## Functions ##
+## Functions
 
-### SbPlayerDestroy ###
+### SbPlayerDestroy
 
 Destroys `player`, freeing all associated resources.
 
@@ -307,13 +307,13 @@
     SbPlayerDestroy has been called on that player. `player`: The player to be
     destroyed. Must not be `kSbPlayerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerDestroy(SbPlayer player)
 ```
 
-### SbPlayerGetAudioConfiguration ###
+### SbPlayerGetAudioConfiguration
 
 Returns the audio configurations used by `player`.
 
@@ -371,13 +371,13 @@
 the audio output, refer to `SbMediaAudioConfiguration` for more details. Must
 not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbPlayerGetAudioConfiguration(SbPlayer player, int index, SbMediaAudioConfiguration *out_audio_configuration)
 ```
 
-### SbPlayerGetCurrentFrame ###
+### SbPlayerGetCurrentFrame
 
 Given a player created with the kSbPlayerOutputModeDecodeToTexture output mode,
 it will return a SbDecodeTarget representing the current frame to be rasterized.
@@ -389,13 +389,13 @@
 
 `player` must not be `kSbPlayerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbDecodeTarget SbPlayerGetCurrentFrame(SbPlayer player)
 ```
 
-### SbPlayerGetMaximumNumberOfSamplesPerWrite ###
+### SbPlayerGetMaximumNumberOfSamplesPerWrite
 
 Writes a single sample of the given media type to `player`'s input stream. Its
 data may be passed in via more than one buffers. The lifetime of
@@ -409,13 +409,13 @@
 of sample for which the number is retrieved. See the `SbMediaType` enum in
 media.h.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbPlayerGetMaximumNumberOfSamplesPerWrite(SbPlayer player, SbMediaType sample_type)
 ```
 
-### SbPlayerGetPreferredOutputMode ###
+### SbPlayerGetPreferredOutputMode
 
 Returns the preferred output mode of the implementation when a video described
 by `creation_param` is played. It is assumed that it is okay to call
@@ -433,23 +433,23 @@
 and the implementation should try its best effort to return a valid output mode.
 `creation_param` must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbPlayerOutputMode SbPlayerGetPreferredOutputMode(const SbPlayerCreationParam *creation_param)
 ```
 
-### SbPlayerIsValid ###
+### SbPlayerIsValid
 
 Returns whether the given player handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbPlayerIsValid(SbPlayer player)
 ```
 
-### SbPlayerSetBounds ###
+### SbPlayerSetBounds
 
 Sets the player bounds to the given graphics plane coordinates. The changes do
 not take effect until the next graphics frame buffer swap. The default bounds
@@ -470,13 +470,13 @@
 `y`: The y-coordinate of the upper-left corner of the player. `width`: The width
 of the player, in pixels. `height`: The height of the player, in pixels.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerSetBounds(SbPlayer player, int z_index, int x, int y, int width, int height)
 ```
 
-### SbPlayerSetPlaybackRate ###
+### SbPlayerSetPlaybackRate
 
 Set the playback rate of the `player`. `rate` is default to 1.0 which indicates
 the playback is at its original speed. A `rate` greater than one will make the
@@ -491,13 +491,13 @@
 
 `player` must not be `kSbPlayerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbPlayerSetPlaybackRate(SbPlayer player, double playback_rate)
 ```
 
-### SbPlayerSetVolume ###
+### SbPlayerSetVolume
 
 Sets the player's volume.
 
@@ -506,13 +506,13 @@
 `0.0` and `1.0`, inclusive. A value of `0.0` means that the audio should be
 muted, and a value of `1.0` means that it should be played at full volume.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerSetVolume(SbPlayer player, double volume)
 ```
 
-### SbPlayerWriteEndOfStream ###
+### SbPlayerWriteEndOfStream
 
 Writes a marker to `player`'s input stream of `stream_type` indicating that
 there are no more samples for that media type for the remainder of this media
@@ -522,13 +522,13 @@
 `player`: The player to which the marker is written. `stream_type`: The type of
 stream for which the marker is written.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerWriteEndOfStream(SbPlayer player, SbMediaType stream_type)
 ```
 
-### SbPlayerWriteSamples ###
+### SbPlayerWriteSamples
 
 `sample_type`: The type of sample being written. See the `SbMediaType` enum in
 media.h. `sample_infos`: A pointer to an array of SbPlayerSampleInfo with
@@ -540,7 +540,7 @@
 `sample_infos`. It has to be at least one, and less than the return value of
 SbPlayerGetMaximumNumberOfSamplesPerWrite().
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerWriteSamples(SbPlayer player, SbMediaType sample_type, const SbPlayerSampleInfo *sample_infos, int number_of_sample_infos)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/socket.md b/cobalt/site/docs/reference/starboard/modules/15/socket.md
index 9e0f81b..744c04e 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/socket.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/socket.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: socket.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `socket.h`
 
 Defines Starboard socket I/O functions. Starboard supports IPv4 and IPv6, TCP
 and UDP, server and client sockets. Some platforms may not support IPv6, some
@@ -18,19 +18,19 @@
 TODO: For platforms that do not support sockets at all, they must support at
 least a high-level HTTP client API (to be defined later).
 
-## Macros ##
+## Macros
 
-### kSbSocketInvalid ###
+### kSbSocketInvalid
 
 Well-defined value for an invalid socket handle.
 
-## Enums ##
+## Enums
 
-### SbSocketAddressType ###
+### SbSocketAddressType
 
 All possible address types.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketAddressTypeIpv4`
 
@@ -39,13 +39,13 @@
 
     An IPv6 address, which uses 16 entries of the address buffer.
 
-### SbSocketError ###
+### SbSocketError
 
 Enumeration of all Starboard socket operation results. Despite the enum name,
 note that the value actually describes the outcome of an operation, which is not
 always an error.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketOk`
 
@@ -63,11 +63,11 @@
 
     The operation failed for some other reason not specified above.
 
-### SbSocketProtocol ###
+### SbSocketProtocol
 
 All possible IP socket types.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketProtocolTcp`
 
@@ -77,11 +77,11 @@
     The UDP/IP protocol, an unreliable, connectionless, discrete packet
     (datagram) protocol.
 
-### SbSocketResolveFilter ###
+### SbSocketResolveFilter
 
 Bits that can be set when calling SbSocketResolve to filter the results.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketResolveFilterNone`
 
@@ -93,25 +93,25 @@
 
     Include Ipv6 addresses.
 
-## Typedefs ##
+## Typedefs
 
-### SbSocket ###
+### SbSocket
 
 A handle to a socket.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbSocketPrivate* SbSocket
 ```
 
-## Structs ##
+## Structs
 
-### SbSocketAddress ###
+### SbSocketAddress
 
 A representation of any possible supported address type.
 
-#### Members ####
+#### Members
 
 *   `uint8_t address`
 
@@ -126,11 +126,11 @@
     The port component of this socket address. If not specified, it will be
     zero, which is officially undefined.
 
-### SbSocketResolution ###
+### SbSocketResolution
 
 The result of a host name resolution.
 
-#### Members ####
+#### Members
 
 *   `SbSocketAddress* addresses`
 
@@ -139,9 +139,9 @@
 
     The length of the `addresses` array.
 
-## Functions ##
+## Functions
 
-### SbSocketAccept ###
+### SbSocketAccept
 
 Accepts a pending connection on `socket` and returns a new SbSocket representing
 that connection. This function sets the error on `socket` and returns
@@ -149,13 +149,13 @@
 
 `socket`: The SbSocket that is accepting a pending connection.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocket SbSocketAccept(SbSocket socket)
 ```
 
-### SbSocketBind ###
+### SbSocketBind
 
 Binds `socket` to a specific local interface and port specified by
 `local_address`. This function sets and returns the socket error if it is unable
@@ -170,24 +170,24 @@
 *   Setting the IP address to `0.0.0.0` means that the socket should be bound to
     all interfaces.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketBind(SbSocket socket, const SbSocketAddress *local_address)
 ```
 
-### SbSocketClearLastError ###
+### SbSocketClearLastError
 
 Clears the last error set on `socket`. The return value indicates whether the
 socket error was cleared.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketClearLastError(SbSocket socket)
 ```
 
-### SbSocketConnect ###
+### SbSocketConnect
 
 Opens a connection of `socket`'s type to the host and port specified by
 `address`. This function sets and returns the socket error if it is unable to
@@ -197,13 +197,13 @@
 `socket`: The type of connection that should be opened. `address`: The host and
 port to which the socket should connect.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketConnect(SbSocket socket, const SbSocketAddress *address)
 ```
 
-### SbSocketCreate ###
+### SbSocketCreate
 
 Creates a new non-blocking socket for protocol `protocol` using address family
 `address_type`.
@@ -216,13 +216,13 @@
 `address_type`: The type of IP address to use for the socket. `protocol`: The
 protocol to use for the socket.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocket SbSocketCreate(SbSocketAddressType address_type, SbSocketProtocol protocol)
 ```
 
-### SbSocketDestroy ###
+### SbSocketDestroy
 
 Destroys the `socket` by flushing it, closing any connection that may be active
 on it, and reclaiming any resources associated with it, including any
@@ -234,25 +234,25 @@
 
 `socket`: The SbSocket to be destroyed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketDestroy(SbSocket socket)
 ```
 
-### SbSocketFreeResolution ###
+### SbSocketFreeResolution
 
 Frees a resolution allocated by SbSocketResolve.
 
 `resolution`: The resolution to be freed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSocketFreeResolution(SbSocketResolution *resolution)
 ```
 
-### SbSocketGetInterfaceAddress ###
+### SbSocketGetInterfaceAddress
 
 Gets the source address and the netmask that would be used to connect to the
 destination. The netmask parameter is optional, and only populated if a non-NULL
@@ -288,26 +288,26 @@
 value is passed in, this function places the netmask associated with the source
 address in this output variable.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketGetInterfaceAddress(const SbSocketAddress *const destination, SbSocketAddress *out_source_address, SbSocketAddress *out_netmask)
 ```
 
-### SbSocketGetLastError ###
+### SbSocketGetLastError
 
 Returns the last error set on `socket`. If `socket` is not valid, this function
 returns `kSbSocketErrorFailed`.
 
 `socket`: The SbSocket that the last error is returned for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketGetLastError(SbSocket socket)
 ```
 
-### SbSocketGetLocalAddress ###
+### SbSocketGetLocalAddress
 
 Gets the address that this socket is bound to locally, if the socket is
 connected. The return value indicates whether the address was retrieved
@@ -316,59 +316,59 @@
 `socket`: The SbSocket for which the local address is retrieved. `out_address`:
 The SbSocket's local address.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketGetLocalAddress(SbSocket socket, SbSocketAddress *out_address)
 ```
 
-### SbSocketIsConnected ###
+### SbSocketIsConnected
 
 Indicates whether `socket` is connected to anything. Invalid sockets are not
 connected.
 
 `socket`: The SbSocket to be checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketIsConnected(SbSocket socket)
 ```
 
-### SbSocketIsConnectedAndIdle ###
+### SbSocketIsConnectedAndIdle
 
 Returns whether `socket` is connected to anything, and, if so, whether it is
 receiving any data.
 
 `socket`: The SbSocket to be checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketIsConnectedAndIdle(SbSocket socket)
 ```
 
-### SbSocketIsIpv6Supported ###
+### SbSocketIsIpv6Supported
 
 Returns whether IPV6 is supported on the current platform.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketIsIpv6Supported()
 ```
 
-### SbSocketIsValid ###
+### SbSocketIsValid
 
 Returns whether the given socket handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbSocketIsValid(SbSocket socket)
 ```
 
-### SbSocketJoinMulticastGroup ###
+### SbSocketJoinMulticastGroup
 
 Joins `socket` to an IP multicast group identified by `address`. The equivalent
 of IP_ADD_MEMBERSHIP. The return value indicates whether the socket was joined
@@ -377,13 +377,13 @@
 `socket`: The SbSocket to be joined to the IP multicast group. `address`: The
 location of the IP multicast group.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketJoinMulticastGroup(SbSocket socket, const SbSocketAddress *address)
 ```
 
-### SbSocketListen ###
+### SbSocketListen
 
 Causes `socket` to listen on the local address that `socket` was previously
 bound to by SbSocketBind. This function sets and returns the socket error if it
@@ -392,13 +392,13 @@
 
 `socket`: The SbSocket on which the function operates.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketListen(SbSocket socket)
 ```
 
-### SbSocketReceiveFrom ###
+### SbSocketReceiveFrom
 
 Reads up to `data_size` bytes from `socket` into `out_data` and places the
 source address of the packet in `out_source` if out_source is not NULL. Returns
@@ -420,13 +420,13 @@
 the socket. Must not be NULL. `data_size`: The number of bytes to read.
 `out_source`: The source address of the packet.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSocketReceiveFrom(SbSocket socket, char *out_data, int data_size, SbSocketAddress *out_source)
 ```
 
-### SbSocketResolve ###
+### SbSocketResolve
 
 Synchronously resolves `hostname` into the returned SbSocketResolution , which
 must be freed with SbSocketFreeResolution. The function returns `NULL` if it is
@@ -438,13 +438,13 @@
 However, if one IP address family filter is specified, only that address family
 is included. The function ignores unrecognized filter bits.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketResolution* SbSocketResolve(const char *hostname, int filters)
 ```
 
-### SbSocketSendTo ###
+### SbSocketSendTo
 
 Writes up to `data_size` bytes of `data` to `destination` via `socket`. Returns
 the number of bytes written, or a negative number if there is an error, in which
@@ -466,13 +466,13 @@
 connected persistently, so setting `destination` when sending to a TCP socket
 will cause an error.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSocketSendTo(SbSocket socket, const char *data, int data_size, const SbSocketAddress *destination)
 ```
 
-### SbSocketSetBroadcast ###
+### SbSocketSetBroadcast
 
 Sets the `SO_BROADCAST`, or equivalent, option to `value` on `socket`. The
 return value indicates whether the option was actually set.
@@ -483,13 +483,13 @@
 `socket`: The SbSocket for which the option is set. `value`: The new value for
 the option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetBroadcast(SbSocket socket, bool value)
 ```
 
-### SbSocketSetReceiveBufferSize ###
+### SbSocketSetReceiveBufferSize
 
 Sets the `SO_RCVBUF`, or equivalent, option to `size` on `socket`. The return
 value indicates whether the option was actually set.
@@ -497,13 +497,13 @@
 `socket`: The SbSocket for which the option is set. `size`: The value for the
 option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetReceiveBufferSize(SbSocket socket, int32_t size)
 ```
 
-### SbSocketSetReuseAddress ###
+### SbSocketSetReuseAddress
 
 Sets the `SO_REUSEADDR`, or equivalent, option to `value` on `socket`. The
 return value indicates whether the option was actually set.
@@ -514,13 +514,13 @@
 `socket`: The SbSocket for which the option is set. `value`: The new value for
 the option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetReuseAddress(SbSocket socket, bool value)
 ```
 
-### SbSocketSetSendBufferSize ###
+### SbSocketSetSendBufferSize
 
 Sets the `SO_SNDBUF`, or equivalent, option to `size` on `socket`. The return
 value indicates whether the option was actually set.
@@ -528,13 +528,13 @@
 `socket`: The SbSocket for which the option is set. `size`: The value for the
 option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetSendBufferSize(SbSocket socket, int32_t size)
 ```
 
-### SbSocketSetTcpKeepAlive ###
+### SbSocketSetTcpKeepAlive
 
 Sets the `SO_KEEPALIVE`, or equivalent, option to `value` on `socket`. The
 return value indicates whether the option was actually set.
@@ -545,13 +545,13 @@
 The time between keep-alive packets. This value is only relevant if `value` is
 `true`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetTcpKeepAlive(SbSocket socket, bool value, SbTime period)
 ```
 
-### SbSocketSetTcpNoDelay ###
+### SbSocketSetTcpNoDelay
 
 Sets the `TCP_NODELAY`, or equivalent, option to `value` on `socket`. The return
 value indicates whether the option was actually set.
@@ -564,13 +564,13 @@
 `socket`: The SbSocket for which the option is set. `value`: Indicates whether
 the Nagle algorithm should be disabled (`value`=`true`).
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetTcpNoDelay(SbSocket socket, bool value)
 ```
 
-### SbSocketSetTcpWindowScaling ###
+### SbSocketSetTcpWindowScaling
 
 Sets the `SO_WINSCALE`, or equivalent, option to `value` on `socket`. The return
 value indicates whether the option was actually set.
@@ -578,7 +578,7 @@
 `socket`: The SbSocket for which the option is set. `value`: The value for the
 option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetTcpWindowScaling(SbSocket socket, bool value)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/socket_waiter.md b/cobalt/site/docs/reference/starboard/modules/15/socket_waiter.md
index 855dcf8..f1c6bd8 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/socket_waiter.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/socket_waiter.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: socket_waiter.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `socket_waiter.h`
 
 Allows a thread to wait on many sockets at once. The standard usage pattern
 would be for a single I/O thread to:
@@ -26,19 +26,19 @@
 queuing the work item, or the SbSocketWaiter is not otherwise guaranteed to wake
 up.
 
-## Macros ##
+## Macros
 
-### kSbSocketWaiterInvalid ###
+### kSbSocketWaiterInvalid
 
 Well-defined value for an invalid socket watcher handle.
 
-## Enums ##
+## Enums
 
-### SbSocketWaiterInterest ###
+### SbSocketWaiterInterest
 
 All the interests that a socket may register for on a waiter.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketWaiterInterestNone`
 
@@ -50,11 +50,11 @@
 
     An interest in or readiness to write to a socket without blocking.
 
-### SbSocketWaiterResult ###
+### SbSocketWaiterResult
 
 Possible reasons why a call to SbSocketWaiterWaitTimed returned.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketWaiterResultInvalid`
 
@@ -66,31 +66,31 @@
 
     The wait stopped because a call to SbSocketWaiterWakeUp was consumed.
 
-## Typedefs ##
+## Typedefs
 
-### SbSocketWaiter ###
+### SbSocketWaiter
 
 A handle to a socket waiter.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbSocketWaiterPrivate* SbSocketWaiter
 ```
 
-### SbSocketWaiterCallback ###
+### SbSocketWaiterCallback
 
 Function pointer for socket waiter callbacks.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbSocketWaiterCallback) (SbSocketWaiter waiter, SbSocket socket, void *context, int ready_interests)
 ```
 
-## Functions ##
+## Functions
 
-### SbSocketWaiterAdd ###
+### SbSocketWaiterAdd
 
 Adds a new socket to be waited on by the `waiter` with a bitfield of
 `interests`. This function should only be called on the thread that waits on
@@ -120,25 +120,25 @@
     `callback`, even if not all registered `interests` became ready, which
     allows for adding it again in the `callback`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketWaiterAdd(SbSocketWaiter waiter, SbSocket socket, void *context, SbSocketWaiterCallback callback, int interests, bool persistent)
 ```
 
-### SbSocketWaiterCreate ###
+### SbSocketWaiterCreate
 
 The results of two threads waiting on the same waiter is undefined and will not
 work. Except for the SbSocketWaiterWakeUp() function, SbSocketWaiters are not
 thread-safe and don't expect to be modified concurrently.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketWaiter SbSocketWaiterCreate()
 ```
 
-### SbSocketWaiterDestroy ###
+### SbSocketWaiterDestroy
 
 Destroys `waiter` and removes all sockets still registered by way of
 SbSocketWaiterAdd. This function may be called on any thread as long as there is
@@ -146,23 +146,23 @@
 
 `waiter`: The SbSocketWaiter to be destroyed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketWaiterDestroy(SbSocketWaiter waiter)
 ```
 
-### SbSocketWaiterIsValid ###
+### SbSocketWaiterIsValid
 
 Returns whether the given socket handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbSocketWaiterIsValid(SbSocketWaiter watcher)
 ```
 
-### SbSocketWaiterRemove ###
+### SbSocketWaiterRemove
 
 Removes a socket, previously added with SbSocketWaiterAdd(), from a waiter. This
 function should only be called on the thread that waits on this waiter.
@@ -174,26 +174,26 @@
 `waiter`: The waiter from which the socket is removed. `socket`: The socket to
 remove from the waiter.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketWaiterRemove(SbSocketWaiter waiter, SbSocket socket)
 ```
 
-### SbSocketWaiterWait ###
+### SbSocketWaiterWait
 
 Waits on all registered sockets, calling the registered callbacks if and when
 the corresponding sockets become ready for an interested operation. This version
 exits only after SbSocketWaiterWakeUp() is called. This function should only be
 called on the thread that waits on this waiter.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSocketWaiterWait(SbSocketWaiter waiter)
 ```
 
-### SbSocketWaiterWaitTimed ###
+### SbSocketWaiterWaitTimed
 
 Behaves similarly to SbSocketWaiterWait(), but this function also causes
 `waiter` to exit on its own after at least `duration` has passed if
@@ -207,13 +207,13 @@
 function may wait longer than `duration`, such as if the timeout expires while a
 callback is being fired.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketWaiterResult SbSocketWaiterWaitTimed(SbSocketWaiter waiter, SbTime duration)
 ```
 
-### SbSocketWaiterWakeUp ###
+### SbSocketWaiterWakeUp
 
 Wakes up `waiter` once. This is the only thread-safe waiter function. It can can
 be called from a SbSocketWaiterCallback to wake up its own waiter, and it can
@@ -230,7 +230,7 @@
 
 `waiter`: The socket waiter to be woken up.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSocketWaiterWakeUp(SbSocketWaiter waiter)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/speech_synthesis.md b/cobalt/site/docs/reference/starboard/modules/15/speech_synthesis.md
index 1622318..0bd6e65 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/speech_synthesis.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/speech_synthesis.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: speech_synthesis.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `speech_synthesis.h`
 
 A basic text-to-speech API intended to be used for audio accessibility.
 
@@ -11,29 +11,29 @@
 Note that these functions do not have to be thread-safe. They must only be
 called from a single application thread.
 
-## Functions ##
+## Functions
 
-### SbSpeechSynthesisCancel ###
+### SbSpeechSynthesisCancel
 
 Cancels all speaking and queued speech synthesis audio. Must return immediately.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSpeechSynthesisCancel()
 ```
 
-### SbSpeechSynthesisIsSupported ###
+### SbSpeechSynthesisIsSupported
 
 Returns whether the platform supports speech synthesis
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSpeechSynthesisIsSupported()
 ```
 
-### SbSpeechSynthesisSpeak ###
+### SbSpeechSynthesisSpeak
 
 Enqueues `text`, a UTF-8 string, to be spoken. Returns immediately.
 
@@ -44,7 +44,7 @@
 the current speaking should continue and this new text should be queued to play
 when the previous utterances are complete.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSpeechSynthesisSpeak(const char *text)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/storage.md b/cobalt/site/docs/reference/starboard/modules/15/storage.md
index db7e950..5c2b962 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/storage.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/storage.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: storage.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `storage.h`
 
 Defines a user-based Storage API. This is a simple, all-at-once BLOB storage and
 retrieval API that is intended for robust long-term, per-user storage. Some
@@ -15,27 +15,27 @@
 These APIs are NOT expected to be thread-safe, so either call them from a single
 thread, or perform proper synchronization around all calls.
 
-## Macros ##
+## Macros
 
-### kSbStorageInvalidRecord ###
+### kSbStorageInvalidRecord
 
 Well-defined value for an invalid storage record handle.
 
-## Typedefs ##
+## Typedefs
 
-### SbStorageRecord ###
+### SbStorageRecord
 
 A handle to an open storage record.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbStorageRecordPrivate* SbStorageRecord
 ```
 
-## Functions ##
+## Functions
 
-### SbStorageCloseRecord ###
+### SbStorageCloseRecord
 
 Closes `record`, synchronously ensuring that all written data is flushed. This
 function performs blocking I/O on the calling thread.
@@ -47,13 +47,13 @@
 `record`: The storage record to close. `record` is invalid after this point, and
 subsequent calls referring to `record` will fail.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbStorageCloseRecord(SbStorageRecord record)
 ```
 
-### SbStorageDeleteRecord ###
+### SbStorageDeleteRecord
 
 Deletes the `SbStorageRecord` for `user` named `name`. The return value
 indicates whether the record existed and was successfully deleted. If the record
@@ -68,36 +68,36 @@
 `user`: The user for whom the record will be deleted. `name`: The filesystem-
 safe name of the record to open.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbStorageDeleteRecord(SbUser user, const char *name)
 ```
 
-### SbStorageGetRecordSize ###
+### SbStorageGetRecordSize
 
 Returns the size of `record`, or `-1` if there is an error. This function
 performs blocking I/O on the calling thread.
 
 `record`: The record to retrieve the size of.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbStorageGetRecordSize(SbStorageRecord record)
 ```
 
-### SbStorageIsValidRecord ###
+### SbStorageIsValidRecord
 
 Returns whether the given storage record handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbStorageIsValidRecord(SbStorageRecord record)
 ```
 
-### SbStorageOpenRecord ###
+### SbStorageOpenRecord
 
 Opens and returns the SbStorageRecord for `user` named `name`, blocking I/O on
 the calling thread until the open is completed. If `user` is not a valid
@@ -111,13 +111,13 @@
 `user`: The user for which the storage record will be opened. `name`: The
 filesystem-safe name of the record to open.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbStorageRecord SbStorageOpenRecord(SbUser user, const char *name)
 ```
 
-### SbStorageReadRecord ###
+### SbStorageReadRecord
 
 Reads up to `data_size` bytes from `record`, starting at the beginning of the
 record. The function returns the actual number of bytes read, which must be <=
@@ -128,13 +128,13 @@
 `record`: The record to be read. `out_data`: The data read from the record.
 `data_size`: The amount of data, in bytes, to read.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbStorageReadRecord(SbStorageRecord record, char *out_data, int64_t data_size)
 ```
 
-### SbStorageWriteRecord ###
+### SbStorageWriteRecord
 
 Replaces the data in `record` with `data_size` bytes from `data`. This function
 always deletes any previous data in that record. The return value indicates
@@ -151,7 +151,7 @@
 `record`: The record to be written to. `data`: The data to write to the record.
 `data_size`: The amount of `data`, in bytes, to write to the record.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbStorageWriteRecord(SbStorageRecord record, const char *data, int64_t data_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/string.md b/cobalt/site/docs/reference/starboard/modules/15/string.md
index 685f5e8..3fed809 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/string.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/string.md
@@ -1,13 +1,13 @@
----
-layout: doc
-title: "Starboard Module Reference: string.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `string.h`
 
 Defines functions for interacting with c-style strings.
 
-## Functions ##
+## Functions
 
-### SbStringCompareNoCase ###
+### SbStringCompareNoCase
 
 Compares two strings, ignoring differences in case. The return value is:
 
@@ -21,13 +21,13 @@
 
 `string1`: The first string to compare. `string2`: The second string to compare.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringCompareNoCase(const char *string1, const char *string2)
 ```
 
-### SbStringCompareNoCaseN ###
+### SbStringCompareNoCaseN
 
 Compares the first `count` characters of two strings, ignoring differences in
 case. The return value is:
@@ -43,13 +43,13 @@
 `string1`: The first string to compare. `string2`: The second string to compare.
 `count`: The number of characters to compare.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringCompareNoCaseN(const char *string1, const char *string2, size_t count)
 ```
 
-### SbStringDuplicate ###
+### SbStringDuplicate
 
 Copies `source` into a buffer that is allocated by this function and that can be
 freed with SbMemoryDeallocate. This function is meant to be a drop-in
@@ -57,13 +57,13 @@
 
 `source`: The string to be copied.
 
-#### Declaration ####
+#### Declaration
 
 ```
 char* SbStringDuplicate(const char *source)
 ```
 
-### SbStringFormat ###
+### SbStringFormat
 
 Produces a string formatted with `format` and `arguments`, placing as much of
 the result that will fit into `out_buffer`. The return value specifies the
@@ -76,13 +76,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `arguments`: Variable arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringFormat(char *out_buffer, size_t buffer_size, const char *format, va_list arguments) SB_PRINTF_FORMAT(3
 ```
 
-### SbStringFormatF ###
+### SbStringFormatF
 
 An inline wrapper of SbStringFormat that converts from ellipsis to va_args. This
 function is meant to be a drop-in replacement for `snprintf`.
@@ -91,13 +91,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `...`: Arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int static int static int SbStringFormatF(char *out_buffer, size_t buffer_size, const char *format,...) SB_PRINTF_FORMAT(3
 ```
 
-### SbStringFormatUnsafeF ###
+### SbStringFormatUnsafeF
 
 An inline wrapper of SbStringFormat that is meant to be a drop-in replacement
 for the unsafe but commonly used `sprintf`.
@@ -106,13 +106,13 @@
 string that specifies how the data should be formatted. `...`: Arguments used in
 the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int static int SbStringFormatUnsafeF(char *out_buffer, const char *format,...) SB_PRINTF_FORMAT(2
 ```
 
-### SbStringFormatWide ###
+### SbStringFormatWide
 
 This function is identical to SbStringFormat, but is for wide characters. It is
 meant to be a drop-in replacement for `vswprintf`.
@@ -121,13 +121,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `arguments`: Variable arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringFormatWide(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format, va_list arguments)
 ```
 
-### SbStringFormatWideF ###
+### SbStringFormatWideF
 
 An inline wrapper of SbStringFormatWide that converts from ellipsis to
 `va_args`.
@@ -136,13 +136,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `...`: Arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbStringFormatWideF(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format,...)
 ```
 
-### SbStringScan ###
+### SbStringScan
 
 Scans `buffer` for `pattern`, placing the extracted values in `arguments`. The
 return value specifies the number of successfully matched items, which may be
@@ -154,20 +154,20 @@
 for in `buffer`. `arguments`: Values matching `pattern` that were extracted from
 `buffer`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringScan(const char *buffer, const char *pattern, va_list arguments)
 ```
 
-### SbStringScanF ###
+### SbStringScanF
 
 An inline wrapper of SbStringScan that converts from ellipsis to `va_args`. This
 function is meant to be a drop-in replacement for `sscanf`. `buffer`: The string
 to scan for the pattern. `pattern`: The string to search for in `buffer`. `...`:
 Values matching `pattern` that were extracted from `buffer`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbStringScanF(const char *buffer, const char *pattern,...)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/system.md b/cobalt/site/docs/reference/starboard/modules/15/system.md
index 32fd303..86437a3 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/system.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/system.md
@@ -1,21 +1,21 @@
----
-layout: doc
-title: "Starboard Module Reference: system.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `system.h`
 
 Defines a broad set of APIs that allow the client application to query build and
 runtime properties of the enclosing system.
 
-## Enums ##
+## Enums
 
-### SbSystemCapabilityId ###
+### SbSystemCapabilityId
 
 Runtime capabilities are boolean properties of a platform that can't be
 determined at compile-time. They may vary from device to device, but they will
 not change over the course of a single execution. They often specify particular
 behavior of other APIs within the bounds of their operating range.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemCapabilityReversedEnterAndBack`
 
@@ -26,11 +26,11 @@
     only if) a system has this capability will SbSystemGetTotalGPUMemory() and
     SbSystemGetUsedGPUMemory() be valid to call.
 
-### SbSystemPathId ###
+### SbSystemPathId
 
 Enumeration of special paths that the platform can define.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPathContentDirectory`
 
@@ -66,22 +66,22 @@
     for storing the updates. See
     starboard/doc/evergreen/cobalt_evergreen_overview.md
 
-### SbSystemPlatformErrorResponse ###
+### SbSystemPlatformErrorResponse
 
 Possible responses for `SbSystemPlatformErrorCallback`.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPlatformErrorResponsePositive`
 *   `kSbSystemPlatformErrorResponseNegative`
 *   `kSbSystemPlatformErrorResponseCancel`
 
-### SbSystemPlatformErrorType ###
+### SbSystemPlatformErrorType
 
 Enumeration of possible values for the `type` parameter passed to the
 `SbSystemRaisePlatformError` function.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPlatformErrorTypeConnectionError`
 
@@ -90,12 +90,12 @@
     `kSbSystemPlatformErrorResponsePositive` then the request should be retried,
     otherwise the app should be stopped.
 
-### SbSystemPropertyId ###
+### SbSystemPropertyId
 
 System properties that can be queried for. Many of these are used in User-Agent
 string generation.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPropertyCertificationScope`
 
@@ -156,9 +156,9 @@
     Type of the device, e.g. such as "TV", "STB", "OTT" Please see Youtube
     Technical requirements for a full list of allowed values
 
-## Typedefs ##
+## Typedefs
 
-### SbSystemComparator ###
+### SbSystemComparator
 
 Pointer to a function to compare two items. The return value uses standard
 `*cmp` semantics:
@@ -171,23 +171,23 @@
 
 `a`: The first value to compare. `b`: The second value to compare.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int(* SbSystemComparator) (const void *a, const void *b)
 ```
 
-### SbSystemError ###
+### SbSystemError
 
 A type that can represent a system error code across all Starboard platforms.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int SbSystemError
 ```
 
-### SbSystemPlatformErrorCallback ###
+### SbSystemPlatformErrorCallback
 
 Type of callback function that may be called in response to an error
 notification from `SbSystemRaisePlatformError`. `response` is a code to indicate
@@ -195,36 +195,36 @@
 the error. `user_data` is the opaque pointer that was passed to the call to
 `SbSystemRaisePlatformError`.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbSystemPlatformErrorCallback) (SbSystemPlatformErrorResponse response, void *user_data)
 ```
 
-## Functions ##
+## Functions
 
-### SbSystemBreakIntoDebugger ###
+### SbSystemBreakIntoDebugger
 
 Breaks the current program into the debugger, if a debugger is attached. If a
 debugger is not attached, this function aborts the program.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SB_NORETURN void SbSystemBreakIntoDebugger()
 ```
 
-### SbSystemClearLastError ###
+### SbSystemClearLastError
 
 Clears the last error set by a Starboard call in the current thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemClearLastError()
 ```
 
-### SbSystemGetErrorString ###
+### SbSystemGetErrorString
 
 Generates a human-readable string for an error. The return value specifies the
 total desired length of the string.
@@ -233,13 +233,13 @@
 The generated string. This value may be null, and it is always terminated with a
 null byte. `string_length`: The maximum length of the error string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSystemGetErrorString(SbSystemError error, char *out_string, int string_length)
 ```
 
-### SbSystemGetExtension ###
+### SbSystemGetExtension
 
 Returns pointer to a constant global struct implementing the extension named
 `name`, if it is implemented. Otherwise return NULL. The `name` string must not
@@ -261,25 +261,25 @@
 ignored. As the version of extensions are incremented, fields may be added to
 the end of the struct, but never removed (only deprecated).
 
-#### Declaration ####
+#### Declaration
 
 ```
 const void* SbSystemGetExtension(const char *name)
 ```
 
-### SbSystemGetLastError ###
+### SbSystemGetLastError
 
 Gets the last platform-specific error code produced by any Starboard call in the
 current thread for diagnostic purposes. Semantic reactions to Starboard function
 call results should be modeled explicitly.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSystemError SbSystemGetLastError()
 ```
 
-### SbSystemGetLocaleId ###
+### SbSystemGetLocaleId
 
 Gets the system's current POSIX-style Locale ID. The locale represents the
 location, language, and cultural conventions that the system wants to use, which
@@ -296,25 +296,25 @@
 
 For more information than you probably want about POSIX locales, see: [http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html)
 
-#### Declaration ####
+#### Declaration
 
 ```
 const char* SbSystemGetLocaleId()
 ```
 
-### SbSystemGetNumberOfProcessors ###
+### SbSystemGetNumberOfProcessors
 
 Returns the number of processor cores available to this application. If the
 process is sandboxed to a subset of the physical cores, the function returns
 that sandboxed limit.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSystemGetNumberOfProcessors()
 ```
 
-### SbSystemGetProperty ###
+### SbSystemGetProperty
 
 Retrieves the platform-defined system property specified by `property_id` and
 places its value as a zero-terminated string into the user-allocated `out_value`
@@ -335,13 +335,13 @@
 defined system property specified by `property_id`. `value_length`: The length
 of the system property.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemGetProperty(SbSystemPropertyId property_id, char *out_value, int value_length)
 ```
 
-### SbSystemGetRandomData ###
+### SbSystemGetRandomData
 
 A cryptographically secure random number generator that produces an arbitrary,
 non-negative number of `buffer_size` random, non-negative bytes. The generated
@@ -350,24 +350,24 @@
 `out_buffer`: A pointer for the generated random number. This value must not be
 null. `buffer_size`: The size of the random number, in bytes.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemGetRandomData(void *out_buffer, int buffer_size)
 ```
 
-### SbSystemGetRandomUInt64 ###
+### SbSystemGetRandomUInt64
 
 A cryptographically secure random number generator that gets 64 random bits and
 returns them as an `uint64_t`. This function does not require manual seeding.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint64_t SbSystemGetRandomUInt64()
 ```
 
-### SbSystemGetStack ###
+### SbSystemGetStack
 
 Places up to `stack_size` instruction pointer addresses of the current execution
 stack into `out_stack`. The return value specifies the number of entries added.
@@ -384,62 +384,62 @@
 `stack_size`: The maximum number of instruction pointer addresses to be placed
 into `out_stack` from the current execution stack.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSystemGetStack(void **out_stack, int stack_size)
 ```
 
-### SbSystemGetTotalCPUMemory ###
+### SbSystemGetTotalCPUMemory
 
 Returns the total CPU memory (in bytes) potentially available to this
 application. If the process is sandboxed to a maximum allowable limit, the
 function returns the lesser of the physical and sandbox limits.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetTotalCPUMemory()
 ```
 
-### SbSystemGetTotalGPUMemory ###
+### SbSystemGetTotalGPUMemory
 
 Returns the total GPU memory (in bytes) available for use by this application.
 This function may only be called the return value for calls to
 SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats) is `true`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetTotalGPUMemory()
 ```
 
-### SbSystemGetUsedCPUMemory ###
+### SbSystemGetUsedCPUMemory
 
 Returns the total physical CPU memory (in bytes) used by this application. This
 value should always be less than (or, in particularly exciting situations, equal
 to) SbSystemGetTotalCPUMemory().
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetUsedCPUMemory()
 ```
 
-### SbSystemGetUsedGPUMemory ###
+### SbSystemGetUsedGPUMemory
 
 Returns the current amount of GPU memory (in bytes) that is currently being used
 by this application. This function may only be called if the return value for
 calls to SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats) is
 `true`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetUsedGPUMemory()
 ```
 
-### SbSystemHasCapability ###
+### SbSystemHasCapability
 
 Returns whether the platform has the runtime capability specified by
 `capability_id`. Returns false for any unknown capabilities. This implementation
@@ -447,48 +447,48 @@
 
 `capability_id`: The runtime capability to check.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemHasCapability(SbSystemCapabilityId capability_id)
 ```
 
-### SbSystemHideSplashScreen ###
+### SbSystemHideSplashScreen
 
 Hides the system splash screen on systems that support a splash screen that is
 displayed while the application is loading. This function may be called from any
 thread and must be idempotent.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemHideSplashScreen()
 ```
 
-### SbSystemIsDebuggerAttached ###
+### SbSystemIsDebuggerAttached
 
 Attempts to determine whether the current program is running inside or attached
 to a debugger. The function returns `false` if neither of those cases is true.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemIsDebuggerAttached()
 ```
 
-### SbSystemNetworkIsDisconnected ###
+### SbSystemNetworkIsDisconnected
 
 Returns if the device is disconnected from network. "Disconnected" is chosen
 over connected because disconnection can be determined with more certainty than
 connection usually.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemNetworkIsDisconnected()
 ```
 
-### SbSystemRaisePlatformError ###
+### SbSystemRaisePlatformError
 
 Cobalt calls this function to notify the platform that an error has occurred in
 the application that the platform may need to handle. The platform is expected
@@ -510,13 +510,13 @@
 pointer that the platform should pass as an argument to the callback function,
 if it is called.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemRaisePlatformError(SbSystemPlatformErrorType type, SbSystemPlatformErrorCallback callback, void *user_data)
 ```
 
-### SbSystemRequestBlur ###
+### SbSystemRequestBlur
 
 Requests that the application move into the Blurred state at the next convenient
 point. This should roughly correspond to "unfocused application" in a
@@ -526,13 +526,13 @@
 the application. Before the `kSbEventTypeBlur` event is dispatched, some work
 may continue to be done, and unrelated system events may be dispatched.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestBlur()
 ```
 
-### SbSystemRequestConceal ###
+### SbSystemRequestConceal
 
 Requests that the application move into the Concealed state at the next
 convenient point. This should roughly correspond to "minimization" in a
@@ -547,13 +547,13 @@
 running background tasks. The expectation is that an external system event will
 bring the application out of the Concealed state.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestConceal()
 ```
 
-### SbSystemRequestFocus ###
+### SbSystemRequestFocus
 
 Requests that the application move into the Started state at the next convenient
 point. This should roughly correspond to a "focused application" in a
@@ -564,13 +564,13 @@
 the application. Before `kSbEventTypeFocus` is dispatched, some work may
 continue to be done, and unrelated system events may be dispatched.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestFocus()
 ```
 
-### SbSystemRequestFreeze ###
+### SbSystemRequestFreeze
 
 Requests that the application move into the Frozen state at the next convenient
 point.
@@ -583,13 +583,13 @@
 The expectation is that an external system event will bring the application out
 of the Frozen state.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestFreeze()
 ```
 
-### SbSystemRequestReveal ###
+### SbSystemRequestReveal
 
 Requests that the application move into the Blurred state at the next convenient
 point. This should roughly correspond to a "focused application" in a
@@ -600,13 +600,13 @@
 the application. Before the `kSbEventTypeReveal` event is dispatched, some work
 may continue to be done, and unrelated system events may be dispatched.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestReveal()
 ```
 
-### SbSystemRequestStop ###
+### SbSystemRequestStop
 
 Requests that the application be terminated gracefully at the next convenient
 point. In the meantime, some work may continue to be done, and unrelated system
@@ -617,13 +617,13 @@
 `error_level`: An integer that serves as the return value for the process that
 is eventually terminated as a result of a call to this function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestStop(int error_level)
 ```
 
-### SbSystemSignWithCertificationSecretKey ###
+### SbSystemSignWithCertificationSecretKey
 
 Computes a HMAC-SHA256 digest of `message` into `digest` using the application's
 certification secret. The `message` and the `digest` pointers must not be NULL.
@@ -633,13 +633,13 @@
 an error, or if it is not implemented. In this case the contents of `digest`
 will be undefined.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemSignWithCertificationSecretKey(const uint8_t *message, size_t message_size_in_bytes, uint8_t *digest, size_t digest_size_in_bytes)
 ```
 
-### SbSystemSupportsResume ###
+### SbSystemSupportsResume
 
 Returns false if the platform doesn't need resume after suspend support. In such
 case Cobalt will free up the resource it retains for resume after suspend. Note
@@ -647,13 +647,13 @@
 kSbEventTypeResume to the event handler. The return value of this function
 cannot change over the life time of the application.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemSupportsResume()
 ```
 
-### SbSystemSymbolize ###
+### SbSystemSymbolize
 
 Looks up `address` as an instruction pointer and places up to (`buffer_size -
 1`) characters of the symbol associated with it in `out_buffer`, which must not
@@ -665,7 +665,7 @@
 This function is used in crash signal handlers and, therefore, it must be async-
 signal-safe on platforms that support signals.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemSymbolize(const void *address, char *out_buffer, int buffer_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/thread.md b/cobalt/site/docs/reference/starboard/modules/15/thread.md
index 1191e9a..56c7898 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/thread.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/thread.md
@@ -1,35 +1,35 @@
----
-layout: doc
-title: "Starboard Module Reference: thread.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `thread.h`
 
 Defines functionality related to thread creation and cleanup.
 
-## Macros ##
+## Macros
 
-### kSbThreadContextInvalid ###
+### kSbThreadContextInvalid
 
 Well-defined value for an invalid thread context.
 
-### kSbThreadInvalidId ###
+### kSbThreadInvalidId
 
 Well-defined constant value to mean "no thread ID."
 
-### kSbThreadLocalKeyInvalid ###
+### kSbThreadLocalKeyInvalid
 
 Well-defined constant value to mean "no thread local key."
 
-### kSbThreadNoAffinity ###
+### kSbThreadNoAffinity
 
 Well-defined constant value to mean "no affinity."
 
-### kSbThreadSamplerInvalid ###
+### kSbThreadSamplerInvalid
 
 Well-defined value for an invalid thread sampler.
 
-## Enums ##
+## Enums
 
-### SbThreadPriority ###
+### SbThreadPriority
 
 A spectrum of thread priorities. Platforms map them appropriately to their own
 priority system. Note that scheduling is platform-specific, and what these
@@ -39,7 +39,7 @@
 a given platform. The only guarantee is that each lower priority should be
 treated less-than-or-equal-to a higher priority.
 
-#### Values ####
+#### Values
 
 *   `kSbThreadPriorityLowest`
 
@@ -79,116 +79,116 @@
     inherit the priority of the spawning thread, or it may mean a specific
     default priority, or it may mean something else, depending on the platform.
 
-## Typedefs ##
+## Typedefs
 
-### SbThread ###
+### SbThread
 
 An opaque handle to a thread type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void* SbThread
 ```
 
-### SbThreadAffinity ###
+### SbThreadAffinity
 
 Type for thread core affinity. This generally will be a single cpu (or core or
 hyperthread) identifier. Some platforms may not support affinity, and some may
 have specific rules about how it must be used.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int32_t SbThreadAffinity
 ```
 
-### SbThreadContext ###
+### SbThreadContext
 
 A handle to the context of a frozen thread.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbThreadContextPrivate* SbThreadContext
 ```
 
-### SbThreadEntryPoint ###
+### SbThreadEntryPoint
 
 Function pointer type for SbThreadCreate. `context` is a pointer-sized bit of
 data passed in from the calling thread.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void*(* SbThreadEntryPoint) (void *context)
 ```
 
-### SbThreadId ###
+### SbThreadId
 
 An ID type that is unique per thread.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int32_t SbThreadId
 ```
 
-### SbThreadLocalDestructor ###
+### SbThreadLocalDestructor
 
 Function pointer type for Thread-Local destructors.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbThreadLocalDestructor) (void *value)
 ```
 
-### SbThreadLocalKey ###
+### SbThreadLocalKey
 
 A handle to a thread-local key.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbThreadLocalKeyPrivate* SbThreadLocalKey
 ```
 
-### SbThreadSampler ###
+### SbThreadSampler
 
 A handle to a thread sampler.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbThreadSamplerPrivate* SbThreadSampler
 ```
 
-## Functions ##
+## Functions
 
-### SbThreadContextGetPointer ###
+### SbThreadContextGetPointer
 
 Gets the specified pointer-type `property` from the specified `context`. Returns
 `true` if successful and `out_value` has been modified, otherwise returns
 `false` and `out_value` is not modified.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadContextGetPointer(SbThreadContext context, SbThreadContextProperty property, void **out_value)
 ```
 
-### SbThreadContextIsValid ###
+### SbThreadContextIsValid
 
 Returns whether the given thread context is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadContextIsValid(SbThreadContext context)
 ```
 
-### SbThreadCreate ###
+### SbThreadCreate
 
 Creates a new thread, which starts immediately.
 
@@ -214,13 +214,13 @@
 executed on the newly created thread. `context`: This value will be passed to
 the `entry_point` function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThread SbThreadCreate(int64_t stack_size, SbThreadPriority priority, SbThreadAffinity affinity, bool joinable, const char *name, SbThreadEntryPoint entry_point, void *context)
 ```
 
-### SbThreadCreateLocalKey ###
+### SbThreadCreateLocalKey
 
 Creates and returns a new, unique key for thread local data. If the function
 does not succeed, the function returns `kSbThreadLocalKeyInvalid`.
@@ -233,13 +233,13 @@
 `destructor`: A pointer to a function. The value may be NULL if no clean up is
 needed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadLocalKey SbThreadCreateLocalKey(SbThreadLocalDestructor destructor)
 ```
 
-### SbThreadDestroyLocalKey ###
+### SbThreadDestroyLocalKey
 
 Destroys thread local data for the specified key. The function is a no-op if the
 key is invalid (kSbThreadLocalKeyInvalid`) or has already been destroyed. This
@@ -247,13 +247,13 @@
 
 `key`: The key for which to destroy thread local data.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadDestroyLocalKey(SbThreadLocalKey key)
 ```
 
-### SbThreadDetach ###
+### SbThreadDetach
 
 Detaches `thread`, which prevents it from being joined. This is sort of like a
 non-blocking join. This function is a no-op if the thread is already detached or
@@ -261,33 +261,33 @@
 
 `thread`: The thread to be detached.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadDetach(SbThread thread)
 ```
 
-### SbThreadGetCurrent ###
+### SbThreadGetCurrent
 
 Returns the handle of the currently executing thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThread SbThreadGetCurrent()
 ```
 
-### SbThreadGetId ###
+### SbThreadGetId
 
 Returns the Thread ID of the currently executing thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadId SbThreadGetId()
 ```
 
-### SbThreadGetLocalValue ###
+### SbThreadGetLocalValue
 
 Returns the pointer-sized value for `key` in the currently executing thread's
 local storage. Returns `NULL` if key is `kSbThreadLocalKeyInvalid` or if the key
@@ -295,97 +295,97 @@
 
 `key`: The key for which to return the value.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbThreadGetLocalValue(SbThreadLocalKey key)
 ```
 
-### SbThreadGetName ###
+### SbThreadGetName
 
 Returns the debug name of the currently executing thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadGetName(char *buffer, int buffer_size)
 ```
 
-### SbThreadIsCurrent ###
+### SbThreadIsCurrent
 
 Returns whether `thread` is the current thread.
 
 `thread`: The thread to check.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsCurrent(SbThread thread)
 ```
 
-### SbThreadIsEqual ###
+### SbThreadIsEqual
 
 Indicates whether `thread1` and `thread2` refer to the same thread.
 
 `thread1`: The first thread to compare. `thread2`: The second thread to compare.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadIsEqual(SbThread thread1, SbThread thread2)
 ```
 
-### SbThreadIsValid ###
+### SbThreadIsValid
 
 Returns whether the given thread handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValid(SbThread thread)
 ```
 
-### SbThreadIsValidAffinity ###
+### SbThreadIsValidAffinity
 
 Returns whether the given thread affinity is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidAffinity(SbThreadAffinity affinity)
 ```
 
-### SbThreadIsValidId ###
+### SbThreadIsValidId
 
 Returns whether the given thread ID is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidId(SbThreadId id)
 ```
 
-### SbThreadIsValidLocalKey ###
+### SbThreadIsValidLocalKey
 
 Returns whether the given thread local variable key is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidLocalKey(SbThreadLocalKey key)
 ```
 
-### SbThreadIsValidPriority ###
+### SbThreadIsValidPriority
 
 Returns whether the given thread priority is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidPriority(SbThreadPriority priority)
 ```
 
-### SbThreadJoin ###
+### SbThreadJoin
 
 Joins the thread on which this function is called with joinable `thread`. This
 function blocks the caller until the designated thread exits, and then cleans up
@@ -403,36 +403,36 @@
 then the SbThreadJoin function populates it with the return value of the
 thread's `main` function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadJoin(SbThread thread, void **out_return)
 ```
 
-### SbThreadSamplerCreate ###
+### SbThreadSamplerCreate
 
 Creates a new thread sampler for the specified `thread`.
 
 If successful, this function returns the newly created handle. If unsuccessful,
 this function returns `kSbThreadSamplerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadSampler SbThreadSamplerCreate(SbThread thread)
 ```
 
-### SbThreadSamplerDestroy ###
+### SbThreadSamplerDestroy
 
 Destroys the `sampler` and frees whatever resources it was using.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadSamplerDestroy(SbThreadSampler sampler)
 ```
 
-### SbThreadSamplerFreeze ###
+### SbThreadSamplerFreeze
 
 Suspends execution of the thread that `sampler` was created for.
 
@@ -440,47 +440,47 @@
 from which properties may be read while the thread remains frozen. If
 unsuccessful, this function returns `kSbThreadContextInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadContext SbThreadSamplerFreeze(SbThreadSampler sampler)
 ```
 
-### SbThreadSamplerIsSupported ###
+### SbThreadSamplerIsSupported
 
 Whether the current platform supports thread sampling. The result of this
 function must not change over the course of the program, which means that the
 results of this function may be cached indefinitely. If this returns false,
 `SbThreadSamplerCreate` will return an invalid sampler.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadSamplerIsSupported()
 ```
 
-### SbThreadSamplerIsValid ###
+### SbThreadSamplerIsValid
 
 Returns whether the given thread sampler is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadSamplerIsValid(SbThreadSampler sampler)
 ```
 
-### SbThreadSamplerThaw ###
+### SbThreadSamplerThaw
 
 Resumes execution of the thread that `sampler` was created for. This invalidates
 the context returned from `SbThreadSamplerFreeze`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadSamplerThaw(SbThreadSampler sampler)
 ```
 
-### SbThreadSetLocalValue ###
+### SbThreadSetLocalValue
 
 Sets the pointer-sized value for `key` in the currently executing thread's local
 storage. The return value indicates whether `key` is valid and has not already
@@ -489,26 +489,26 @@
 `key`: The key for which to set the key value. `value`: The new pointer-sized
 key value.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadSetLocalValue(SbThreadLocalKey key, void *value)
 ```
 
-### SbThreadSetName ###
+### SbThreadSetName
 
 Sets the debug name of the currently executing thread by copying the specified
 name string.
 
 `name`: The name to assign to the thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadSetName(const char *name)
 ```
 
-### SbThreadSleep ###
+### SbThreadSleep
 
 Sleeps the currently executing thread.
 
@@ -516,17 +516,17 @@
 executing thread should sleep. The function is a no-op if this value is negative
 or `0`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadSleep(SbTime duration)
 ```
 
-### SbThreadYield ###
+### SbThreadYield
 
 Yields the currently executing thread, so another thread has a chance to run.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadYield()
diff --git a/cobalt/site/docs/reference/starboard/modules/15/time.md b/cobalt/site/docs/reference/starboard/modules/15/time.md
index 19a7e4f..a6228cc 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/time.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/time.md
@@ -1,59 +1,59 @@
----
-layout: doc
-title: "Starboard Module Reference: time.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `time.h`
 
 Provides access to system time and timers.
 
-## Macros ##
+## Macros
 
-### kSbTimeDay ###
+### kSbTimeDay
 
 One day in SbTime units (microseconds).
 
-### kSbTimeHour ###
+### kSbTimeHour
 
 One hour in SbTime units (microseconds).
 
-### kSbTimeMax ###
+### kSbTimeMax
 
 The maximum value of an SbTime.
 
-### kSbTimeMillisecond ###
+### kSbTimeMillisecond
 
 One millisecond in SbTime units (microseconds).
 
-### kSbTimeMinute ###
+### kSbTimeMinute
 
 One minute in SbTime units (microseconds).
 
-### kSbTimeNanosecondsPerMicrosecond ###
+### kSbTimeNanosecondsPerMicrosecond
 
 How many nanoseconds in one SbTime unit (microseconds).
 
-### kSbTimeSecond ###
+### kSbTimeSecond
 
 One second in SbTime units (microseconds).
 
-### kSbTimeToPosixDelta ###
+### kSbTimeToPosixDelta
 
 A term that can be added to an SbTime to convert it into the number of
 microseconds since the POSIX epoch.
 
-## Typedefs ##
+## Typedefs
 
-### SbTime ###
+### SbTime
 
 The number of microseconds since the epoch of January 1, 1601 UTC, or the number
 of microseconds between two times. Always microseconds, ALWAYS UTC.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int64_t SbTime
 ```
 
-### SbTimeMonotonic ###
+### SbTimeMonotonic
 
 A number of microseconds from some point. The main property of this time is that
 it increases monotonically. It should also be as high-resolution a timer as we
@@ -61,38 +61,38 @@
 without worrying about a system clock adjustment. It's not good for getting the
 wall clock time.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int64_t SbTimeMonotonic
 ```
 
-## Functions ##
+## Functions
 
-### SbTimeFromPosix ###
+### SbTimeFromPosix
 
 Converts microseconds from the POSIX epoch into an `SbTime`.
 
 `time`: A time that measures the number of microseconds since January 1, 1970,
 00:00:00, UTC.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbTime SbTimeFromPosix(int64_t time)
 ```
 
-### SbTimeGetMonotonicNow ###
+### SbTimeGetMonotonicNow
 
 Gets a monotonically increasing time representing right now.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTimeMonotonic SbTimeGetMonotonicNow()
 ```
 
-### SbTimeGetMonotonicThreadNow ###
+### SbTimeGetMonotonicThreadNow
 
 Gets a monotonically increasing time representing how long the current thread
 has been in the executing state (i.e. not pre-empted nor waiting on an event).
@@ -100,44 +100,44 @@
 execution time between two timestamps. If this is not available then
 SbTimeGetMonotonicNow() should be used.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTimeMonotonic SbTimeGetMonotonicThreadNow()
 ```
 
-### SbTimeGetNow ###
+### SbTimeGetNow
 
 Gets the current system time as an `SbTime`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTime SbTimeGetNow()
 ```
 
-### SbTimeIsTimeThreadNowSupported ###
+### SbTimeIsTimeThreadNowSupported
 
 Returns whether the current platform supports time thread now
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbTimeIsTimeThreadNowSupported()
 ```
 
-### SbTimeNarrow ###
+### SbTimeNarrow
 
 Safely narrows a number from a more precise unit to a less precise one. This
 function rounds negative values toward negative infinity.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int64_t SbTimeNarrow(int64_t time, int64_t divisor)
 ```
 
-### SbTimeToPosix ###
+### SbTimeToPosix
 
 Converts `SbTime` into microseconds from the POSIX epoch.
 
@@ -145,7 +145,7 @@
 January 1, 1601, UTC, or that measures the number of microseconds between two
 times.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int64_t SbTimeToPosix(SbTime time)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/time_zone.md b/cobalt/site/docs/reference/starboard/modules/15/time_zone.md
index f9e3fcb..baad375 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/time_zone.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/time_zone.md
@@ -1,46 +1,46 @@
----
-layout: doc
-title: "Starboard Module Reference: time_zone.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `time_zone.h`
 
 Provides access to the system time zone information.
 
-## Typedefs ##
+## Typedefs
 
-### SbTimeZone ###
+### SbTimeZone
 
 The number of minutes west of the Greenwich Prime Meridian, NOT including
 Daylight Savings Time adjustments.
 
-For example: PST/PDT is 480 minutes (28800 seconds, 8 hours).
+For example: America/Los_Angeles is 480 minutes (28800 seconds, 8 hours).
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int SbTimeZone
 ```
 
-## Functions ##
+## Functions
 
-### SbTimeZoneGetCurrent ###
+### SbTimeZoneGetCurrent
 
 Gets the system's current SbTimeZone in minutes.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTimeZone SbTimeZoneGetCurrent()
 ```
 
-### SbTimeZoneGetName ###
+### SbTimeZoneGetName
 
-Gets a string representation of the current timezone. Note that the string
-representation can either be standard or daylight saving time. The output can be
-of the form: 1) A three-letter abbreviation such as "PST" or "PDT" (preferred).
-2) A time zone identifier such as "America/Los_Angeles" 3) An un-abbreviated
-name such as "Pacific Standard Time".
+Gets a string representation of the current timezone. The format should be in
+the IANA format [https://data.iana.org/time-zones/theory.html#naming](https://data.iana.org/time-zones/theory.html#naming)) .
+Names normally have the form AREA/LOCATION, where AREA is a continent or ocean,
+and LOCATION is a specific location within the area. Typical names are
+'Africa/Cairo', 'America/New_York', and 'Pacific/Honolulu'.
 
-#### Declaration ####
+#### Declaration
 
 ```
 const char* SbTimeZoneGetName()
diff --git a/cobalt/site/docs/reference/starboard/modules/15/types.md b/cobalt/site/docs/reference/starboard/modules/15/types.md
index 90867a6..e1f372c 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/types.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/types.md
@@ -1,15 +1,15 @@
----
-layout: doc
-title: "Starboard Module Reference: types.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `types.h`
 
 Provides a suite of standard types that should be universally available on all
 platforms, specifically focused on explicitly-sized integer types and booleans.
 This module also includes some related ubiquitous definitions like limits of the
 explicitly-sized integer types, and standard pointer and int32 sentinel values.
 
-## Macros ##
+## Macros
 
-### kSbInvalidInt ###
+### kSbInvalidInt
 
 A value that represents an int that is probably invalid.
diff --git a/cobalt/site/docs/reference/starboard/modules/15/ui_navigation.md b/cobalt/site/docs/reference/starboard/modules/15/ui_navigation.md
index a0ecfb1..cb41767 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/ui_navigation.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/ui_navigation.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: ui_navigation.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `ui_navigation.h`
 
 API to allow applications to take advantage of the platform's native UI engine.
 This is mainly to drive the animation of visual elements and to signal which of
@@ -19,20 +19,20 @@
 user interaction. If the navigation item is a container, then the content offset
 will also be queried to determine the placement of its content items.
 
-## Macros ##
+## Macros
 
-### kSbUiNavItemInvalid ###
+### kSbUiNavItemInvalid
 
 Well-defined value for an invalid navigation item.
 
-## Enums ##
+## Enums
 
-### SbUiNavItemType ###
+### SbUiNavItemType
 
 Navigation items may be one of the following types. This must be specified upon
 item creation and may not change during the item's lifespan.
 
-#### Values ####
+#### Values
 
 *   `kSbUiNavItemTypeFocus`
 
@@ -42,29 +42,29 @@
     This is a container of navigation items which can also be containers
     themselves or focusable items. Containers themselves cannot be focused.
 
-## Typedefs ##
+## Typedefs
 
-### SbUiNavItem ###
+### SbUiNavItem
 
 An opaque handle to an implementation-private structure representing a
 navigation item.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbUiNavItemPrivate* SbUiNavItem
 ```
 
-## Structs ##
+## Structs
 
-### SbUiNavCallbacks ###
+### SbUiNavCallbacks
 
 This structure specifies all the callbacks which the platform UI engine should
 invoke for various interaction events on navigation items. These callbacks may
 be invoked from any thread at any frequency. The `callback_context` is the value
 that was passed on creation of the relevant SbUiNavItem.
 
-#### Members ####
+#### Members
 
 *   `void(*onblur)(SbUiNavItem item, void *callback_context)`
 
@@ -77,12 +77,12 @@
     Invoke when an item's content offset is changed. This is only used with
     container items.
 
-### SbUiNavInterface ###
+### SbUiNavInterface
 
 This structure declares the interface to the UI navigation implementation. All
 function pointers must be specified if the platform supports UI navigation.
 
-#### Members ####
+#### Members
 
 *   `SbUiNavItem(*create_item)(SbUiNavItemType type, const SbUiNavCallbacks
     *callbacks, void *callback_context)`
@@ -237,7 +237,7 @@
     Call `update_function` with `context` to perform a series of UI navigation
     changes atomically before returning.
 
-### SbUiNavItemDir ###
+### SbUiNavItemDir
 
 Navigation items of type kSbUiNavItemTypeContainer have directionality. If
 directionality is not specified for a container, it should default to left-to-
@@ -270,12 +270,12 @@
   Bottom-to-top is similar to right-to-left, but for the Y position.
 ```
 
-#### Members ####
+#### Members
 
 *   `bool is_left_to_right`
 *   `bool is_top_to_bottom`
 
-### SbUiNavMatrix2x3 ###
+### SbUiNavMatrix2x3
 
 This represents a 2x3 transform matrix in row-major order.
 
@@ -284,38 +284,38 @@
 ///   | c d ty |
 ```
 
-#### Members ####
+#### Members
 
 *   `float m`
 
-### SbUiNavMatrix4 ###
+### SbUiNavMatrix4
 
 This represents a 4x4 transform matrix in row-major order.
 
-#### Members ####
+#### Members
 
 *   `float m`
 
-## Functions ##
+## Functions
 
-### SbUiNavGetInterface ###
+### SbUiNavGetInterface
 
 Retrieve the platform's UI navigation implementation. If the platform does not
 provide one, then return false without modifying `out_interface`. Otherwise,
 initialize all members of `out_interface` and return true. The `out_interface`
 pointer must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbUiNavGetInterface(SbUiNavInterface *out_interface)
 ```
 
-### SbUiNavItemIsValid ###
+### SbUiNavItemIsValid
 
 Returns whether the given navigation item handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbUiNavItemIsValid(SbUiNavItem item)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/user.md b/cobalt/site/docs/reference/starboard/modules/15/user.md
index 406e695..309b939 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/user.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/user.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: user.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `user.h`
 
 Defines a user management API. This module defines functions only for managing
 signed-in users. Platforms that do not have users must still implement this API,
@@ -10,19 +10,19 @@
 These APIs are NOT expected to be thread-safe, so either call them from a single
 thread, or perform proper synchronization around all calls.
 
-## Macros ##
+## Macros
 
-### kSbUserInvalid ###
+### kSbUserInvalid
 
 Well-defined value for an invalid user.
 
-## Enums ##
+## Enums
 
-### SbUserPropertyId ###
+### SbUserPropertyId
 
 A set of string properties that can be queried on a user.
 
-#### Values ####
+#### Values
 
 *   `kSbUserPropertyAvatarUrl`
 
@@ -38,21 +38,21 @@
 
     A unique user ID of a user.
 
-## Typedefs ##
+## Typedefs
 
-### SbUser ###
+### SbUser
 
 A handle to a user.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbUserPrivate* SbUser
 ```
 
-## Functions ##
+## Functions
 
-### SbUserGetCurrent ###
+### SbUserGetCurrent
 
 Gets the current primary user, if one exists. This is the user that is
 determined, in a platform-specific way, to be the primary user controlling the
@@ -63,13 +63,13 @@
 It is expected that there will be a unique SbUser per signed-in user, and that
 the referenced objects will persist for the lifetime of the app.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbUser SbUserGetCurrent()
 ```
 
-### SbUserGetProperty ###
+### SbUserGetProperty
 
 Retrieves the value of `property_id` for `user` and places it in `out_value`.
 The function returns:
@@ -83,13 +83,13 @@
 The property for which the data is requested. `out_value`: The retrieved
 property value. `value_size`: The size of the retrieved property value.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbUserGetProperty(SbUser user, SbUserPropertyId property_id, char *out_value, int value_size)
 ```
 
-### SbUserGetPropertySize ###
+### SbUserGetPropertySize
 
 Returns the size of the value of `property_id` for `user`, INCLUDING the
 terminating null character. The function returns `0` if `user` is invalid or if
@@ -98,13 +98,13 @@
 `user`: The user for which property size data is being retrieved. `property_id`:
 The property for which the data is requested.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbUserGetPropertySize(SbUser user, SbUserPropertyId property_id)
 ```
 
-### SbUserGetSignedIn ###
+### SbUserGetSignedIn
 
 Gets a list of up to `users_size` signed-in users and places the results in
 `out_users`. The return value identifies the actual number of signed-in users,
@@ -116,17 +116,17 @@
 `out_users`: Handles for the retrieved users. `users_size`: The maximum number
 of signed-in users to retrieve.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbUserGetSignedIn(SbUser *out_users, int users_size)
 ```
 
-### SbUserIsValid ###
+### SbUserIsValid
 
 Returns whether the given user handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbUserIsValid(SbUser user)
diff --git a/cobalt/site/docs/reference/starboard/modules/15/window.md b/cobalt/site/docs/reference/starboard/modules/15/window.md
index 915e254..acea84d 100644
--- a/cobalt/site/docs/reference/starboard/modules/15/window.md
+++ b/cobalt/site/docs/reference/starboard/modules/15/window.md
@@ -1,40 +1,40 @@
----
-layout: doc
-title: "Starboard Module Reference: window.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `window.h`
 
 Provides functionality to handle Window creation and management.
 
-## Macros ##
+## Macros
 
-### kSbEventOnScreenKeyboardInvalidTicket ###
+### kSbEventOnScreenKeyboardInvalidTicket
 
 System-triggered OnScreenKeyboard events have ticket value
 kSbEventOnScreenKeyboardInvalidTicket.
 
-### kSbWindowInvalid ###
+### kSbWindowInvalid
 
 Well-defined value for an invalid window handle.
 
-## Typedefs ##
+## Typedefs
 
-### SbWindow ###
+### SbWindow
 
 A handle to a window.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbWindowPrivate* SbWindow
 ```
 
-## Structs ##
+## Structs
 
-### SbWindowOptions ###
+### SbWindowOptions
 
 Options that can be requested at window creation time.
 
-#### Members ####
+#### Members
 
 *   `SbWindowSize size`
 
@@ -48,25 +48,25 @@
 
     The name of the window to create.
 
-### SbWindowRect ###
+### SbWindowRect
 
 Defines a rectangle via a point `(x, y)` and a size `(width, height)`. This
 structure is used as output for SbWindowGetOnScreenKeyboardBoundingRect.
 
-#### Members ####
+#### Members
 
 *   `float x`
 *   `float y`
 *   `float width`
 *   `float height`
 
-### SbWindowSize ###
+### SbWindowSize
 
 The size of a window in graphics rendering coordinates. The width and height of
 a window should correspond to the size of the graphics surface used for drawing
 that would be created to back that window.
 
-#### Members ####
+#### Members
 
 *   `int width`
 
@@ -93,9 +93,9 @@
     A value of 0.0f means the ratio could not be determined, it should be
     assumed to be the same as the graphics resolution (i.e. 1.0f).
 
-## Functions ##
+## Functions
 
-### SbWindowBlurOnScreenKeyboard ###
+### SbWindowBlurOnScreenKeyboard
 
 Blur the on screen keyboard. Fire kSbEventTypeOnScreenKeyboardBlurred.
 kSbEventTypeOnScreenKeyboardBlurred has data `ticket`. Calling
@@ -103,13 +103,13 @@
 permitted. Calling SbWindowBlurOnScreenKeyboard while the on screen keyboard is
 not showing does nothing and does not fire any event.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowBlurOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowCreate ###
+### SbWindowCreate
 
 Creates and returns a new system window with the given `options`, which may be
 `NULL`. The function returns `kSbWindowInvalid` if it cannot create the
@@ -131,25 +131,25 @@
 
 `options`: Options that specify parameters for the window being created.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbWindow SbWindowCreate(const SbWindowOptions *options)
 ```
 
-### SbWindowDestroy ###
+### SbWindowDestroy
 
 Destroys `window`, reclaiming associated resources.
 
 `window`: The `SbWindow` to destroy.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowDestroy(SbWindow window)
 ```
 
-### SbWindowFocusOnScreenKeyboard ###
+### SbWindowFocusOnScreenKeyboard
 
 Focus the on screen keyboard. Fire kSbEventTypeOnScreenKeyboardFocused.
 kSbEventTypeOnScreenKeyboardFocused has data `ticket`. Calling
@@ -157,38 +157,38 @@
 permitted. Calling SbWindowFocusOnScreenKeyboard while the on screen keyboard is
 not showing does nothing and does not fire any event.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowFocusOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowGetDiagonalSizeInInches ###
+### SbWindowGetDiagonalSizeInInches
 
 Gets the size of the diagonal between two opposing screen corners.
 
 A return value of 0 means that starboard does not know what the screen diagonal
 is.
 
-#### Declaration ####
+#### Declaration
 
 ```
 float SbWindowGetDiagonalSizeInInches(SbWindow window)
 ```
 
-### SbWindowGetOnScreenKeyboardBoundingRect ###
+### SbWindowGetOnScreenKeyboardBoundingRect
 
 Get the rectangle of the on screen keyboard in screen pixel coordinates. Return
 `true` if successful. Return `false` if the on screen keyboard is not showing.
 If the function returns `false`, then `rect` will not have been modified.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowGetOnScreenKeyboardBoundingRect(SbWindow window, SbWindowRect *bounding_rect)
 ```
 
-### SbWindowGetPlatformHandle ###
+### SbWindowGetPlatformHandle
 
 Gets the platform-specific handle for `window`, which can be passed as an
 EGLNativeWindowType to initialize EGL/GLES. This return value is entirely
@@ -196,13 +196,13 @@
 
 `window`: The SbWindow to retrieve the platform handle for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbWindowGetPlatformHandle(SbWindow window)
 ```
 
-### SbWindowGetSize ###
+### SbWindowGetSize
 
 Retrieves the dimensions of `window` and sets `size` accordingly. This function
 returns `true` if it completes successfully. If the function returns `false`,
@@ -210,81 +210,81 @@
 
 `window`: The SbWindow to retrieve the size of. `size`: The retrieved size.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowGetSize(SbWindow window, SbWindowSize *size)
 ```
 
-### SbWindowHideOnScreenKeyboard ###
+### SbWindowHideOnScreenKeyboard
 
 Hide the on screen keyboard. Fire kSbEventTypeWindowSizeChange and
 kSbEventTypeOnScreenKeyboardHidden if necessary.
 kSbEventTypeOnScreenKeyboardHidden has data `ticket`. Calling
 SbWindowHideOnScreenKeyboard() when the keyboard is already hidden is permitted.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowHideOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowIsOnScreenKeyboardShown ###
+### SbWindowIsOnScreenKeyboardShown
 
 Determine if the on screen keyboard is shown.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowIsOnScreenKeyboardShown(SbWindow window)
 ```
 
-### SbWindowIsValid ###
+### SbWindowIsValid
 
 Returns whether the given window handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbWindowIsValid(SbWindow window)
 ```
 
-### SbWindowOnScreenKeyboardIsSupported ###
+### SbWindowOnScreenKeyboardIsSupported
 
 Return whether the current platform supports an on screen keyboard
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowOnScreenKeyboardIsSupported()
 ```
 
-### SbWindowOnScreenKeyboardSuggestionsSupported ###
+### SbWindowOnScreenKeyboardSuggestionsSupported
 
 Determine if the on screen keyboard has suggestions implemented. If this returns
 false, then calling SbWindowUpdateOnScreenKeyboardSuggestions() will be
 undefined.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowOnScreenKeyboardSuggestionsSupported(SbWindow window)
 ```
 
-### SbWindowSetDefaultOptions ###
+### SbWindowSetDefaultOptions
 
 Sets the default options for system windows.
 
 `options`: The option values to use as default values. This object must not be
 `NULL`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowSetDefaultOptions(SbWindowOptions *options)
 ```
 
-### SbWindowSetOnScreenKeyboardKeepFocus ###
+### SbWindowSetOnScreenKeyboardKeepFocus
 
 Notify the system that `keepFocus` has been set for the OnScreenKeyboard.
 `keepFocus` true indicates that the user may not navigate focus off of the
@@ -293,13 +293,13 @@
 OnScreenKeyboard via input. `keepFocus` is initialized to false in the
 OnScreenKeyboard constructor.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowSetOnScreenKeyboardKeepFocus(SbWindow window, bool keep_focus)
 ```
 
-### SbWindowShowOnScreenKeyboard ###
+### SbWindowShowOnScreenKeyboard
 
 Show the on screen keyboard and populate the input with text `input_text`. Fire
 kSbEventTypeWindowSizeChange and kSbEventTypeOnScreenKeyboardShown if necessary.
@@ -309,13 +309,13 @@
 and the input will be replaced with `input_text`. Showing the on screen keyboard
 does not give it focus.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowShowOnScreenKeyboard(SbWindow window, const char *input_text, int ticket)
 ```
 
-### SbWindowUpdateOnScreenKeyboardSuggestions ###
+### SbWindowUpdateOnScreenKeyboardSuggestions
 
 Update the on screen keyboard custom suggestions. Fire
 kSbEventTypeOnScreenKeyboardSuggestionsUpdated.
@@ -323,7 +323,7 @@
 suggestions should remain up-to-date when the keyboard is shown after being
 hidden.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowUpdateOnScreenKeyboardSuggestions(SbWindow window, const char *suggestions[], int num_suggestions, int ticket)
diff --git a/cobalt/site/docs/reference/starboard/modules/accessibility.md b/cobalt/site/docs/reference/starboard/modules/accessibility.md
index a6c8460..8f2a652 100644
--- a/cobalt/site/docs/reference/starboard/modules/accessibility.md
+++ b/cobalt/site/docs/reference/starboard/modules/accessibility.md
@@ -1,17 +1,17 @@
----
-layout: doc
-title: "Starboard Module Reference: accessibility.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `accessibility.h`
 
 Provides access to the system options and settings related to accessibility.
 
-## Enums ##
+## Enums
 
-### SbAccessibilityCaptionCharacterEdgeStyle ###
+### SbAccessibilityCaptionCharacterEdgeStyle
 
 Enum for possible closed captioning character edge styles.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionCharacterEdgeStyleNone`
 *   `kSbAccessibilityCaptionCharacterEdgeStyleRaised`
@@ -19,11 +19,11 @@
 *   `kSbAccessibilityCaptionCharacterEdgeStyleUniform`
 *   `kSbAccessibilityCaptionCharacterEdgeStyleDropShadow`
 
-### SbAccessibilityCaptionColor ###
+### SbAccessibilityCaptionColor
 
 Enum for possible closed captioning colors.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionColorBlue`
 *   `kSbAccessibilityCaptionColorBlack`
@@ -34,11 +34,11 @@
 *   `kSbAccessibilityCaptionColorWhite`
 *   `kSbAccessibilityCaptionColorYellow`
 
-### SbAccessibilityCaptionFontFamily ###
+### SbAccessibilityCaptionFontFamily
 
 Enum for possible closed captioning font families
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionFontFamilyCasual`
 *   `kSbAccessibilityCaptionFontFamilyCursive`
@@ -48,11 +48,11 @@
 *   `kSbAccessibilityCaptionFontFamilyProportionalSerif`
 *   `kSbAccessibilityCaptionFontFamilySmallCapitals`
 
-### SbAccessibilityCaptionFontSizePercentage ###
+### SbAccessibilityCaptionFontSizePercentage
 
 Enum for possible closed captioning font size percentages.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionFontSizePercentage25`
 *   `kSbAccessibilityCaptionFontSizePercentage50`
@@ -67,11 +67,11 @@
 *   `kSbAccessibilityCaptionFontSizePercentage275`
 *   `kSbAccessibilityCaptionFontSizePercentage300`
 
-### SbAccessibilityCaptionOpacityPercentage ###
+### SbAccessibilityCaptionOpacityPercentage
 
 Enum for possible closed captioning opacity percentages.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionOpacityPercentage0`
 *   `kSbAccessibilityCaptionOpacityPercentage25`
@@ -79,11 +79,11 @@
 *   `kSbAccessibilityCaptionOpacityPercentage75`
 *   `kSbAccessibilityCaptionOpacityPercentage100`
 
-### SbAccessibilityCaptionState ###
+### SbAccessibilityCaptionState
 
 Enum for possible states of closed captioning properties.
 
-#### Values ####
+#### Values
 
 *   `kSbAccessibilityCaptionStateUnsupported`
 
@@ -115,14 +115,14 @@
     SbAccessibilityCaptionSettings.supportsOverride contains false, then no
     fields of SbAccessibilityCaptionSettings will ever contain this value.
 
-## Structs ##
+## Structs
 
-### SbAccessibilityCaptionSettings ###
+### SbAccessibilityCaptionSettings
 
 A group of settings related to system-level closed captioning settings, for
 platforms that expose closed captioning settings.
 
-#### Members ####
+#### Members
 
 *   `SbAccessibilityCaptionColor background_color`
 *   `SbAccessibilityCaptionState background_color_state`
@@ -166,9 +166,9 @@
     false, the values of `SbAccessibilityCaptionState` should be interpreted
     differently.
 
-### SbAccessibilityDisplaySettings ###
+### SbAccessibilityDisplaySettings
 
-#### Members ####
+#### Members
 
 *   `bool has_high_contrast_text_setting`
 
@@ -177,12 +177,12 @@
 
     Whether the high contrast text setting is enabled or not.
 
-### SbAccessibilityTextToSpeechSettings ###
+### SbAccessibilityTextToSpeechSettings
 
 A group of settings related to text-to-speech functionality, for platforms that
 expose system settings for text-to-speech.
 
-#### Members ####
+#### Members
 
 *   `bool has_text_to_speech_setting`
 
@@ -192,9 +192,9 @@
     Whether the text-to-speech setting is enabled or not. This setting is only
     valid if `has_text_to_speech_setting` is set to true.
 
-## Functions ##
+## Functions
 
-### SbAccessibilityGetCaptionSettings ###
+### SbAccessibilityGetCaptionSettings
 
 Get the platform's settings for system-level closed captions. This function
 returns false if `caption_settings` is NULL or if it is not zero-initialized.
@@ -202,13 +202,13 @@
 `caption_settings`: A pointer to a zero-initialized
 SbAccessibilityTextToSpeechSettings struct.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilityGetCaptionSettings(SbAccessibilityCaptionSettings *caption_settings)
 ```
 
-### SbAccessibilityGetDisplaySettings ###
+### SbAccessibilityGetDisplaySettings
 
 Get the platform settings related to high contrast text. This function returns
 false if `out_settings` is NULL or if it is not zero-initialized.
@@ -216,13 +216,13 @@
 `out_settings`: A pointer to a zero-initialized SbAccessibilityDisplaySettings*
 struct.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilityGetDisplaySettings(SbAccessibilityDisplaySettings *out_settings)
 ```
 
-### SbAccessibilityGetTextToSpeechSettings ###
+### SbAccessibilityGetTextToSpeechSettings
 
 Get the platform settings related to the text-to-speech accessibility feature.
 This function returns false if `out_settings` is NULL or if it is not zero-
@@ -231,13 +231,13 @@
 `out_settings`: A pointer to a zero-initialized
 SbAccessibilityTextToSpeechSettings struct.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilityGetTextToSpeechSettings(SbAccessibilityTextToSpeechSettings *out_settings)
 ```
 
-### SbAccessibilitySetCaptionsEnabled ###
+### SbAccessibilitySetCaptionsEnabled
 
 Modifies whether closed captions are enabled at a system level. This function
 returns false if this feature is not supported by the platform, or if changing
@@ -246,7 +246,7 @@
 `enabled`: A boolean indicating whether captions should be turned on (true) or
 off (false).
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAccessibilitySetCaptionsEnabled(bool enabled)
diff --git a/cobalt/site/docs/reference/starboard/modules/atomic.md b/cobalt/site/docs/reference/starboard/modules/atomic.md
index 5f79990..9653e53 100644
--- a/cobalt/site/docs/reference/starboard/modules/atomic.md
+++ b/cobalt/site/docs/reference/starboard/modules/atomic.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: atomic.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `atomic.h`
 
 Defines a set of atomic integer operations that can be used as lightweight
 synchronization or as building blocks for heavier synchronization primitives.
@@ -9,32 +9,32 @@
 supported architectures, so their direct use is not recommended except when
 rigorously deemed absolutely necessary for performance reasons.
 
-## Typedefs ##
+## Typedefs
 
-### SbAtomic64 ###
+### SbAtomic64
 
 64-bit atomic operations (only available on 64-bit processors).
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int64_t SbAtomic64
 ```
 
-### SbAtomicPtr ###
+### SbAtomicPtr
 
 Pointer-sized atomic operations. Forwards to either 32-bit or 64-bit functions
 as appropriate.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbAtomic32 SbAtomicPtr
 ```
 
-## Functions ##
+## Functions
 
-### SbAtomicAcquire_CompareAndSwap ###
+### SbAtomicAcquire_CompareAndSwap
 
 These following lower-level operations are typically useful only to people
 implementing higher-level synchronization operations like spinlocks, mutexes,
@@ -45,23 +45,23 @@
 operation. "Barrier" operations have both "Acquire" and "Release" semantics. A
 SbAtomicMemoryBarrier() has "Barrier" semantics, but does no memory access.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicAcquire_CompareAndSwap(volatile SbAtomic32 *ptr, SbAtomic32 old_value, SbAtomic32 new_value)
 ```
 
-### SbAtomicBarrier_Increment ###
+### SbAtomicBarrier_Increment
 
 Same as SbAtomicNoBarrier_Increment, but with a memory barrier.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicBarrier_Increment(volatile SbAtomic32 *ptr, SbAtomic32 increment)
 ```
 
-### SbAtomicNoBarrier_CompareAndSwap ###
+### SbAtomicNoBarrier_CompareAndSwap
 
 Atomically execute: result = *ptr; if (*ptr == old_value) *ptr = new_value;
 return result;
@@ -71,39 +71,39 @@
 
 This routine implies no memory barriers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicNoBarrier_CompareAndSwap(volatile SbAtomic32 *ptr, SbAtomic32 old_value, SbAtomic32 new_value)
 ```
 
-### SbAtomicNoBarrier_Exchange ###
+### SbAtomicNoBarrier_Exchange
 
 Atomically store new_value into *ptr, returning the previous value held in *ptr.
 This routine implies no memory barriers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicNoBarrier_Exchange(volatile SbAtomic32 *ptr, SbAtomic32 new_value)
 ```
 
-### SbAtomicNoBarrier_Increment ###
+### SbAtomicNoBarrier_Increment
 
 Atomically increment *ptr by "increment". Returns the new value of *ptr with the
 increment applied. This routine implies no memory barriers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic32 SbAtomicNoBarrier_Increment(volatile SbAtomic32 *ptr, SbAtomic32 increment)
 ```
 
-### SbAtomicRelease_CompareAndSwap8 ###
+### SbAtomicRelease_CompareAndSwap8
 
 Overloaded functions for Atomic8.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbAtomic8 SbAtomicRelease_CompareAndSwap8(volatile SbAtomic8 *ptr, SbAtomic8 old_value, SbAtomic8 new_value)
diff --git a/cobalt/site/docs/reference/starboard/modules/audio_sink.md b/cobalt/site/docs/reference/starboard/modules/audio_sink.md
index b0e652f..9277c70 100644
--- a/cobalt/site/docs/reference/starboard/modules/audio_sink.md
+++ b/cobalt/site/docs/reference/starboard/modules/audio_sink.md
@@ -1,53 +1,53 @@
----
-layout: doc
-title: "Starboard Module Reference: audio_sink.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `audio_sink.h`
 
 Provides an interface to output raw audio data.
 
-## Macros ##
+## Macros
 
-### kSbAudioSinkInvalid ###
+### kSbAudioSinkInvalid
 
 Well-defined value for an invalid audio sink.
 
-## Typedefs ##
+## Typedefs
 
-### SbAudioSink ###
+### SbAudioSink
 
 An opaque handle to an implementation-private structure representing an audio
 sink.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbAudioSinkPrivate* SbAudioSink
 ```
 
-### SbAudioSinkConsumeFramesFunc ###
+### SbAudioSinkConsumeFramesFunc
 
 Callback used to report frames consumed. The consumed frames will be removed
 from the source frame buffer to free space for new audio frames.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbAudioSinkConsumeFramesFunc) (int frames_consumed, void *context)
 ```
 
-### SbAudioSinkFrameBuffers ###
+### SbAudioSinkFrameBuffers
 
 An array of frame buffers. For interleaved audio streams, there will be only one
 element in the array. For planar audio streams, the number of elements in the
 array equal to the number of channels.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void** SbAudioSinkFrameBuffers
 ```
 
-### SbAudioSinkUpdateSourceStatusFunc ###
+### SbAudioSinkUpdateSourceStatusFunc
 
 Callback being called periodically to retrieve the status of the audio source.
 The first two output parameters indicating the filling level of the audio frame
@@ -64,15 +64,15 @@
 NULL. Note that this function only reports the status of the source, it doesn't
 remove audio data from the source frame buffer.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbAudioSinkUpdateSourceStatusFunc) (int *frames_in_buffer, int *offset_in_frames, bool *is_playing, bool *is_eos_reached, void *context)
 ```
 
-## Functions ##
+## Functions
 
-### SbAudioSinkCreate ###
+### SbAudioSinkCreate
 
 Creates an audio sink for the specified `channels` and `sampling_frequency_hz`,
 acquires all resources needed to operate the audio sink, and returns an opaque
@@ -113,13 +113,13 @@
     value that is passed back to all callbacks and is generally used to point at
     a class or struct that contains state associated with the audio sink.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbAudioSink SbAudioSinkCreate(int channels, int sampling_frequency_hz, SbMediaAudioSampleType audio_sample_type, SbMediaAudioFrameStorageType audio_frame_storage_type, SbAudioSinkFrameBuffers frame_buffers, int frames_per_channel, SbAudioSinkUpdateSourceStatusFunc update_source_status_func, SbAudioSinkConsumeFramesFunc consume_frames_func, void *context)
 ```
 
-### SbAudioSinkDestroy ###
+### SbAudioSinkDestroy
 
 Destroys `audio_sink`, freeing all associated resources. Before returning, the
 function waits until all callbacks that are in progress have finished. After the
@@ -132,24 +132,24 @@
 
 `audio_sink`: The audio sink to destroy.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbAudioSinkDestroy(SbAudioSink audio_sink)
 ```
 
-### SbAudioSinkGetMaxChannels ###
+### SbAudioSinkGetMaxChannels
 
 Returns the maximum number of channels supported on the platform. For example,
 the number would be `2` if the platform only supports stereo.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbAudioSinkGetMaxChannels()
 ```
 
-### SbAudioSinkGetMinBufferSizeInFrames ###
+### SbAudioSinkGetMinBufferSizeInFrames
 
 Returns the minimum frames required by audio sink to play without underflows.
 Returns -1, if `channels`, `sample_type` or `sampling_frequency_hz` is not
@@ -162,52 +162,52 @@
 audio data being streamed. For example, 22,000 Hz means 22,000 sample elements
 represents one second of audio data.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbAudioSinkGetMinBufferSizeInFrames(int channels, SbMediaAudioSampleType sample_type, int sampling_frequency_hz)
 ```
 
-### SbAudioSinkGetNearestSupportedSampleFrequency ###
+### SbAudioSinkGetNearestSupportedSampleFrequency
 
 Returns the supported sample rate closest to `sampling_frequency_hz`. On
 platforms that don't support all sample rates, it is the caller's responsibility
 to resample the audio frames into the supported sample rate returned by this
 function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbAudioSinkGetNearestSupportedSampleFrequency(int sampling_frequency_hz)
 ```
 
-### SbAudioSinkIsAudioFrameStorageTypeSupported ###
+### SbAudioSinkIsAudioFrameStorageTypeSupported
 
 Indicates whether `audio_frame_storage_type` is supported on this platform.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAudioSinkIsAudioFrameStorageTypeSupported(SbMediaAudioFrameStorageType audio_frame_storage_type)
 ```
 
-### SbAudioSinkIsAudioSampleTypeSupported ###
+### SbAudioSinkIsAudioSampleTypeSupported
 
 Indicates whether `audio_sample_type` is supported on this platform.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAudioSinkIsAudioSampleTypeSupported(SbMediaAudioSampleType audio_sample_type)
 ```
 
-### SbAudioSinkIsValid ###
+### SbAudioSinkIsValid
 
 Indicates whether the given audio sink handle is valid.
 
 `audio_sink`: The audio sink handle to check.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbAudioSinkIsValid(SbAudioSink audio_sink)
diff --git a/cobalt/site/docs/reference/starboard/modules/byte_swap.md b/cobalt/site/docs/reference/starboard/modules/byte_swap.md
index 580bc5d..4b2cab30 100644
--- a/cobalt/site/docs/reference/starboard/modules/byte_swap.md
+++ b/cobalt/site/docs/reference/starboard/modules/byte_swap.md
@@ -1,74 +1,74 @@
----
-layout: doc
-title: "Starboard Module Reference: byte_swap.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `byte_swap.h`
 
 Specifies functions for swapping byte order. These functions are used to deal
 with endianness when performing I/O.
 
-## Functions ##
+## Functions
 
-### SbByteSwapS16 ###
+### SbByteSwapS16
 
 Unconditionally swaps the byte order in signed 16-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int16_t SbByteSwapS16(int16_t value)
 ```
 
-### SbByteSwapS32 ###
+### SbByteSwapS32
 
 Unconditionally swaps the byte order in signed 32-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int32_t SbByteSwapS32(int32_t value)
 ```
 
-### SbByteSwapS64 ###
+### SbByteSwapS64
 
 Unconditionally swaps the byte order in signed 64-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbByteSwapS64(int64_t value)
 ```
 
-### SbByteSwapU16 ###
+### SbByteSwapU16
 
 Unconditionally swaps the byte order in unsigned 16-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint16_t SbByteSwapU16(uint16_t value)
 ```
 
-### SbByteSwapU32 ###
+### SbByteSwapU32
 
 Unconditionally swaps the byte order in unsigned 32-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint32_t SbByteSwapU32(uint32_t value)
 ```
 
-### SbByteSwapU64 ###
+### SbByteSwapU64
 
 Unconditionally swaps the byte order in unsigned 64-bit `value`. `value`: The
 value for which the byte order will be swapped.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint64_t SbByteSwapU64(uint64_t value)
diff --git a/cobalt/site/docs/reference/starboard/modules/condition_variable.md b/cobalt/site/docs/reference/starboard/modules/condition_variable.md
index 836c4b8..a665a24 100644
--- a/cobalt/site/docs/reference/starboard/modules/condition_variable.md
+++ b/cobalt/site/docs/reference/starboard/modules/condition_variable.md
@@ -1,23 +1,23 @@
----
-layout: doc
-title: "Starboard Module Reference: condition_variable.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `condition_variable.h`
 
 Defines an interface for condition variables.
 
-## Macros ##
+## Macros
 
-### SB_CONDITION_VARIABLE_MAX_SIZE ###
+### SB_CONDITION_VARIABLE_MAX_SIZE
 
 Max size of the SbConditionVariable type.
 
-## Enums ##
+## Enums
 
-### SbConditionVariableResult ###
+### SbConditionVariableResult
 
 Enumeration of possible results from waiting on a condvar.
 
-#### Values ####
+#### Values
 
 *   `kSbConditionVariableSignaled`
 
@@ -30,22 +30,22 @@
     The wait failed, either because a parameter wasn't valid, or the condition
     variable has already been destroyed, or something similar.
 
-## Typedefs ##
+## Typedefs
 
-### SbConditionVariable ###
+### SbConditionVariable
 
 An opaque handle to a condition variable type with reserved memory buffer of
 size SB_CONDITION_VARIABLE_MAX_SIZE and aligned at void pointer type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef union SbConditionVariable  SbConditionVariable
 ```
 
-## Functions ##
+## Functions
 
-### SbConditionVariableBroadcast ###
+### SbConditionVariableBroadcast
 
 Broadcasts to all current waiters of `condition` to stop waiting. This function
 wakes all of the threads waiting on `condition` while SbConditionVariableSignal
@@ -53,26 +53,26 @@
 
 `condition`: The condition that should no longer be waited for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableBroadcast(SbConditionVariable *condition)
 ```
 
-### SbConditionVariableCreate ###
+### SbConditionVariableCreate
 
 Creates a new condition variable to work with `opt_mutex`, which may be null,
 placing the newly created condition variable in `out_condition`.
 
 The return value indicates whether the condition variable could be created.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableCreate(SbConditionVariable *out_condition, SbMutex *opt_mutex)
 ```
 
-### SbConditionVariableDestroy ###
+### SbConditionVariableDestroy
 
 Destroys the specified SbConditionVariable . The return value indicates whether
 the destruction was successful. The behavior is undefined if other threads are
@@ -81,23 +81,23 @@
 `condition`: The SbConditionVariable to be destroyed. This invalidates the
 condition variable.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableDestroy(SbConditionVariable *condition)
 ```
 
-### SbConditionVariableIsSignaled ###
+### SbConditionVariableIsSignaled
 
 Returns whether the given result is a success.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbConditionVariableIsSignaled(SbConditionVariableResult result)
 ```
 
-### SbConditionVariableSignal ###
+### SbConditionVariableSignal
 
 Signals the next waiter of `condition` to stop waiting. This function wakes a
 single thread waiting on `condition` while SbConditionVariableBroadcast wakes
@@ -105,24 +105,24 @@
 
 `condition`: The condition that the waiter should stop waiting for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbConditionVariableSignal(SbConditionVariable *condition)
 ```
 
-### SbConditionVariableWait ###
+### SbConditionVariableWait
 
 Waits for `condition`, releasing the held lock `mutex`, blocking indefinitely,
 and returning the result. Behavior is undefined if `mutex` is not held.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbConditionVariableResult SbConditionVariableWait(SbConditionVariable *condition, SbMutex *mutex)
 ```
 
-### SbConditionVariableWaitTimed ###
+### SbConditionVariableWaitTimed
 
 Waits for `condition`, releasing the held lock `mutex`, blocking up to
 `timeout_duration`, and returning the acquisition result. Behavior is undefined
@@ -133,7 +133,7 @@
 function returns as quickly as possible with a kSbConditionVariableTimedOut
 result.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbConditionVariableResult SbConditionVariableWaitTimed(SbConditionVariable *condition, SbMutex *mutex, SbTime timeout_duration)
diff --git a/cobalt/site/docs/reference/starboard/modules/configuration.md b/cobalt/site/docs/reference/starboard/modules/configuration.md
index 630f1cf..d0ba3c7 100644
--- a/cobalt/site/docs/reference/starboard/modules/configuration.md
+++ b/cobalt/site/docs/reference/starboard/modules/configuration.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: configuration.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `configuration.h`
 
 Provides a description of the current platform in lurid detail so that common
 code never needs to actually know what the current operating system and
@@ -13,117 +13,117 @@
 narrowly-defined configuration features, but it retains porting control in
 Starboard.
 
-## Macros ##
+## Macros
 
-### SB_ALIGNAS(byte_alignment) ###
+### SB_ALIGNAS(byte_alignment)
 
 Specifies the alignment for a class, struct, union, enum, class/struct field, or
 stack variable.
 
-### SB_ALIGNOF(type) ###
+### SB_ALIGNOF(type)
 
 Returns the alignment required for any instance of the type indicated by `type`.
 
-### SB_ARRAY_SIZE(array) ###
+### SB_ARRAY_SIZE(array)
 
 A constant expression that evaluates to the size_t size of a statically-sized
 array.
 
-### SB_ARRAY_SIZE_INT(array) ###
+### SB_ARRAY_SIZE_INT(array)
 
 A constant expression that evaluates to the int size of a statically-sized
 array.
 
-### SB_CAN(SB_FEATURE) ###
+### SB_CAN(SB_FEATURE)
 
 Determines a compile-time capability of the system.
 
-### SB_COMPILE_ASSERT(expr, msg) ###
+### SB_COMPILE_ASSERT(expr, msg)
 
 Will cause a compiler error with `msg` if `expr` is false. `msg` must be a valid
 identifier, and must be a unique type in the scope of the declaration.
 
-### SB_DEPRECATED(FUNC) ###
+### SB_DEPRECATED(FUNC)
 
 SB_DEPRECATED(int Foo(int bar)); Annotates the function as deprecated, which
 will trigger a compiler warning when referenced.
 
-### SB_DEPRECATED_EXTERNAL(FUNC) ###
+### SB_DEPRECATED_EXTERNAL(FUNC)
 
 SB_DEPRECATED_EXTERNAL(...) annotates the function as deprecated for external
 clients, but not deprecated for starboard.
 
-### SB_EXPERIMENTAL_API_VERSION ###
+### SB_EXPERIMENTAL_API_VERSION
 
 The API version that is currently open for changes, and therefore is not stable
 or frozen. Production-oriented ports should avoid declaring that they implement
 the experimental Starboard API version.
 
-### SB_FUNCTION ###
+### SB_FUNCTION
 
 Whether we use **PRETTY_FUNCTION** PRETTY_FUNCTION or **FUNCTION** FUNCTION for
 logging.
 
-### SB_HAS(SB_FEATURE) ###
+### SB_HAS(SB_FEATURE)
 
 Determines at compile-time whether this platform has a standard feature or
 header available.
 
-### SB_HAS_64_BIT_ATOMICS ###
+### SB_HAS_64_BIT_ATOMICS
 
 Whether the current platform has 64-bit atomic operations.
 
-### SB_HAS_GLES2 ###
+### SB_HAS_GLES2
 
 Specifies whether this platform has a performant OpenGL ES 2 implementation,
 which allows client applications to use GL rendering paths. Derived from the gyp
 variable `gl_type` gl_type which indicates what kind of GL implementation is
 available.
 
-### SB_HAS_QUIRK(SB_FEATURE) ###
+### SB_HAS_QUIRK(SB_FEATURE)
 
 Determines at compile-time whether this platform has a quirk.
 
-### SB_INT64_C(x) ###
+### SB_INT64_C(x)
 
 Declare numeric literals of signed 64-bit type.
 
-### SB_IS(SB_FEATURE) ###
+### SB_IS(SB_FEATURE)
 
 Determines at compile-time an inherent aspect of this platform.
 
-### SB_LIKELY(x) ###
+### SB_LIKELY(x)
 
 Macro for hinting that an expression is likely to be true.
 
-### SB_MAXIMUM_API_VERSION ###
+### SB_MAXIMUM_API_VERSION
 
 The maximum API version allowed by this version of the Starboard headers,
 inclusive.
 
-### SB_MINIMUM_API_VERSION ###
+### SB_MINIMUM_API_VERSION
 
 The minimum API version allowed by this version of the Starboard headers,
 inclusive.
 
-### SB_NORETURN ###
+### SB_NORETURN
 
 Macro to annotate a function as noreturn, which signals to the compiler that the
 function cannot return.
 
-### SB_OVERRIDE ###
+### SB_OVERRIDE
 
 Declares a function as overriding a virtual function on compilers that support
 it.
 
-### SB_PREFERRED_RGBA_BYTE_ORDER_RGBA ###
+### SB_PREFERRED_RGBA_BYTE_ORDER_RGBA
 
 An enumeration of values for the kSbPreferredByteOrder configuration variable.
 Setting this up properly means avoiding slow color swizzles when passing pixel
 data from one library to another. Note that these definitions are in byte-order
 and so are endianness-independent.
 
-### SB_PRINTF_FORMAT(format_param, dots_param) ###
+### SB_PRINTF_FORMAT(format_param, dots_param)
 
 Tells the compiler a function is using a printf-style format string.
 `format_param` is the one-based index of the format string parameter;
@@ -132,7 +132,7 @@
 but matches what the system C headers do.) (Partially taken from
 base/compiler_specific.h)
 
-### SB_RESTRICT ###
+### SB_RESTRICT
 
 Include the platform-specific configuration. This macro is set by GN in
 starboard/build/config/BUILD.gn and passed in on the command line for all
@@ -140,29 +140,29 @@
 that the compiler can make certain optimizations because it knows the pointers
 are unique.
 
-### SB_SIZE_OF(DATATYPE) ###
+### SB_SIZE_OF(DATATYPE)
 
 Determines at compile-time the size of a data type, or 0 if the data type that
 was specified was invalid.
 
-### SB_STRINGIFY(x) ###
+### SB_STRINGIFY(x)
 
 Standard CPP trick to stringify an evaluated macro definition.
 
-### SB_UINT64_C(x) ###
+### SB_UINT64_C(x)
 
 Declare numeric literals of unsigned 64-bit type.
 
-### SB_UNLIKELY(x) ###
+### SB_UNLIKELY(x)
 
 Macro for hinting that an expression is likely to be false.
 
-### SB_UNREFERENCED_PARAMETER(x) ###
+### SB_UNREFERENCED_PARAMETER(x)
 
 Trivially references a parameter that is otherwise unreferenced, preventing a
 compiler warning on some platforms.
 
-### SB_WARN_UNUSED_RESULT ###
+### SB_WARN_UNUSED_RESULT
 
 Causes the annotated (at the end) function to generate a warning if the result
 is not accessed.
diff --git a/cobalt/site/docs/reference/starboard/modules/configuration_constants.md b/cobalt/site/docs/reference/starboard/modules/configuration_constants.md
index 99d92f8..18af4bc 100644
--- a/cobalt/site/docs/reference/starboard/modules/configuration_constants.md
+++ b/cobalt/site/docs/reference/starboard/modules/configuration_constants.md
@@ -1,113 +1,113 @@
----
-layout: doc
-title: "Starboard Module Reference: configuration_constants.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `configuration_constants.h`
 
 Declares all configuration variables we will need to use at runtime. These
 variables describe the current platform in detail to allow cobalt to make
 runtime decisions based on per platform configurations.
 
-## Variables ##
+## Variables
 
-### kSbDefaultMmapThreshold ###
+### kSbDefaultMmapThreshold
 
 Determines the threshold of allocation size that should be done with mmap (if
 available), rather than allocated within the core heap.
 
-### kSbFileAltSepChar ###
+### kSbFileAltSepChar
 
 The current platform's alternate file path component separator character. This
 is like SB_FILE_SEP_CHAR, except if your platform supports an alternate
 character, then you can place that here. For example, on windows machines, the
 primary separator character is probably '\', but the alternate is '/'.
 
-### kSbFileAltSepString ###
+### kSbFileAltSepString
 
 The string form of SB_FILE_ALT_SEP_CHAR.
 
-### kSbFileMaxName ###
+### kSbFileMaxName
 
 The current platform's maximum length of the name of a single directory entry,
 not including the absolute path.
 
-### kSbFileMaxOpen ###
+### kSbFileMaxOpen
 
 The current platform's maximum number of files that can be opened at the same
 time by one process.
 
-### kSbFileMaxPath ###
+### kSbFileMaxPath
 
 The current platform's maximum length of an absolute path.
 
-### kSbFileSepChar ###
+### kSbFileSepChar
 
 The current platform's file path component separator character. This is the
 character that appears after a directory in a file path. For example, the
 absolute canonical path of the file "/path/to/a/file.txt" uses '/' as a path
 component separator character.
 
-### kSbFileSepString ###
+### kSbFileSepString
 
 The string form of SB_FILE_SEP_CHAR.
 
-### kSbHasMediaWebmVp9Support ###
+### kSbHasMediaWebmVp9Support
 
 Specifies whether this platform has webm/vp9 support. This should be set to non-
 zero on platforms with webm/vp9 support.
 
-### kSbHasThreadPrioritySupport ###
+### kSbHasThreadPrioritySupport
 
 Whether the current platform supports thread priorities.
 
-### kSbMallocAlignment ###
+### kSbMallocAlignment
 
 Determines the alignment that allocations should have on this platform.
 
-### kSbMaxSystemPathCacheDirectorySize ###
+### kSbMaxSystemPathCacheDirectorySize
 
 The maximum size the cache directory is allowed to use in bytes.
 
-### kSbMaxThreadLocalKeys ###
+### kSbMaxThreadLocalKeys
 
 The maximum number of thread local storage keys supported by this platform. This
 comes from _POSIX_THREAD_KEYS_MAX. The value of PTHREAD_KEYS_MAX is higher, but
 unit tests show that the implementation doesn't support nearly as many keys.
 
-### kSbMaxThreadNameLength ###
+### kSbMaxThreadNameLength
 
 The maximum length of the name for a thread, including the NULL-terminator.
 
-### kSbMaxThreads ###
+### kSbMaxThreads
 
 Defines the maximum number of simultaneous threads for this platform. Some
 platforms require sharing thread handles with other kinds of system handles,
 like mutexes, so we want to keep this manageable.
 
-### kSbMediaMaxAudioBitrateInBitsPerSecond ###
+### kSbMediaMaxAudioBitrateInBitsPerSecond
 
 The maximum audio bitrate the platform can decode. The following value equals to
 5M bytes per seconds which is more than enough for compressed audio.
 
-### kSbMediaMaxVideoBitrateInBitsPerSecond ###
+### kSbMediaMaxVideoBitrateInBitsPerSecond
 
 The maximum video bitrate the platform can decode. The following value equals to
 8M bytes per seconds which is more than enough for compressed video.
 
-### kSbMediaVideoFrameAlignment ###
+### kSbMediaVideoFrameAlignment
 
 Specifies how video frame buffers must be aligned on this platform.
 
-### kSbMemoryLogPath ###
+### kSbMemoryLogPath
 
 Defines the path where memory debugging logs should be written to.
 
-### kSbMemoryPageSize ###
+### kSbMemoryPageSize
 
 The memory page size, which controls the size of chunks on memory that
 allocators deal with, and the alignment of those chunks. This doesn't have to be
 the hardware-defined physical page size, but it should be a multiple of it.
 
-### kSbNetworkReceiveBufferSize ###
+### kSbNetworkReceiveBufferSize
 
 Specifies the network receive buffer size in bytes, set via
 SbSocketSetReceiveBufferSize().
@@ -122,7 +122,7 @@
 If your platform does not have a good TCP auto-tuning mechanism, a setting of
 (128 * 1024) here is recommended.
 
-### kSbPathSepChar ###
+### kSbPathSepChar
 
 The current platform's search path component separator character. When
 specifying an ordered list of absolute paths of directories to search for a
@@ -130,16 +130,16 @@
 the search path of "/etc/search/first:/etc/search/second" uses ':' as a search
 path component separator character.
 
-### kSbPathSepString ###
+### kSbPathSepString
 
 The string form of SB_PATH_SEP_CHAR.
 
-### kSbPreferredRgbaByteOrder ###
+### kSbPreferredRgbaByteOrder
 
 Specifies the preferred byte order of color channels in a pixel. Refer to
 starboard/configuration.h for the possible values. EGL/GLES platforms should
 generally prefer a byte order of RGBA, regardless of endianness.
 
-### kSbUserMaxSignedIn ###
+### kSbUserMaxSignedIn
 
 The maximum number of users that can be signed in at the same time.
diff --git a/cobalt/site/docs/reference/starboard/modules/cpu_features.md b/cobalt/site/docs/reference/starboard/modules/cpu_features.md
index ee12e71..e2aa35f 100644
--- a/cobalt/site/docs/reference/starboard/modules/cpu_features.md
+++ b/cobalt/site/docs/reference/starboard/modules/cpu_features.md
@@ -1,13 +1,13 @@
----
-layout: doc
-title: "Starboard Module Reference: cpu_features.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
 
-## Structs ##
+# Starboard Module Reference: `cpu_features.h`
 
-### SbCPUFeatures ###
+## Structs
 
-#### Members ####
+### SbCPUFeatures
+
+#### Members
 
 *   `SbCPUFeaturesArchitecture architecture`
 
@@ -54,9 +54,9 @@
     defined as a macro.
 *   `SbCPUFeaturesX86 x86`
 
-### SbCPUFeaturesARM ###
+### SbCPUFeaturesARM
 
-#### Members ####
+#### Members
 
 *   `int16_t implementer`
 
@@ -98,7 +98,7 @@
     SDIV and UDIV hardware division in ARM mode.
 *   `bool has_aes`
 
-    ###### Arm 64 feature flags  ######
+    ###### Arm 64 feature flags
 
     AES instructions.
 *   `bool has_crc32`
@@ -114,17 +114,17 @@
 
     64-bit PMULL and PMULL2 instructions.
 
-### SbCPUFeaturesMIPS ###
+### SbCPUFeaturesMIPS
 
-#### Members ####
+#### Members
 
 *   `bool has_msa`
 
     MIPS SIMD Architecture (MSA).
 
-### SbCPUFeaturesX86 ###
+### SbCPUFeaturesX86
 
-#### Members ####
+#### Members
 
 *   `const char * vendor`
 
@@ -244,9 +244,9 @@
 
     SAHF in long mode.
 
-## Functions ##
+## Functions
 
-### SbCPUFeaturesGet ###
+### SbCPUFeaturesGet
 
 Retrieve the underlying CPU features and place it in `features`, which must not
 be NULL.
@@ -254,9 +254,8 @@
 If this function returns false, it means the CPU architecture is unknown and all
 fields in `features` are invalid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbCPUFeaturesGet(SbCPUFeatures *features)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/decode_target.md b/cobalt/site/docs/reference/starboard/modules/decode_target.md
index a237ad9..56c7afa 100644
--- a/cobalt/site/docs/reference/starboard/modules/decode_target.md
+++ b/cobalt/site/docs/reference/starboard/modules/decode_target.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: decode_target.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `decode_target.h`
 
 A target for decoding image and video data into. This corresponds roughly to an
 EGLImage, but that extension may not be fully supported on all GL platforms.
@@ -12,7 +12,7 @@
 decoding done directly into this memory, avoiding unnecessary memory copies, and
 also avoiding pushing data between CPU and GPU memory unnecessarily.
 
-## SbDecodeTargetFormat ##
+## SbDecodeTargetFormat
 
 SbDecodeTargets support several different formats that can be used to decode
 into and render from. Some formats may be easier to decode into, and others may
@@ -21,7 +21,7 @@
 Each decoder provides a way to check if a given SbDecodeTargetFormat is
 supported by that decoder.
 
-## SbDecodeTargetGraphicsContextProvider ##
+## SbDecodeTargetGraphicsContextProvider
 
 Some components may need to acquire SbDecodeTargets compatible with a certain
 rendering context, which may need to be created on a particular thread. The
@@ -33,10 +33,9 @@
 EGLContext held current. This may be useful if your SbDecodeTarget creation code
 needs to execute GLES commands like, for example, glGenTextures().
 
-The primary usage is likely to be the the SbPlayer implementation on some
-platforms.
+The primary usage is likely to be the SbPlayer implementation on some platforms.
 
-## SbDecodeTarget Example ##
+## SbDecodeTarget Example
 
 Let's say that we are an application and we would like to use the interface
 defined in starboard/image.h to decode an imaginary "image/foo" image type.
@@ -79,15 +78,15 @@
     info.planes[kSbDecodeTargetPlaneRGBA].texture;
 ```
 
-## Macros ##
+## Macros
 
-### kSbDecodeTargetInvalid ###
+### kSbDecodeTargetInvalid
 
 Well-defined value for an invalid decode target handle.
 
-## Enums ##
+## Enums
 
-### SbDecodeTargetFormat ###
+### SbDecodeTargetFormat
 
 The list of all possible decoder target formats. An SbDecodeTarget consists of
 one or more planes of data, each plane corresponding with a surface. For some
@@ -96,7 +95,7 @@
 NOTE: For enumeration entries with an alpha component, the alpha will always be
 premultiplied unless otherwise explicitly specified.
 
-#### Values ####
+#### Values
 
 *   `kSbDecodeTargetFormat1PlaneRGBA`
 
@@ -137,11 +136,11 @@
 
     An invalid decode target format.
 
-### SbDecodeTargetPlane ###
+### SbDecodeTargetPlane
 
 All the planes supported by SbDecodeTarget.
 
-#### Values ####
+#### Values
 
 *   `kSbDecodeTargetPlaneRGBA`
 
@@ -162,45 +161,45 @@
 
     The V plane for 3-plane YUV formats.
 
-## Typedefs ##
+## Typedefs
 
-### SbDecodeTarget ###
+### SbDecodeTarget
 
 A handle to a target for image data decoding.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbDecodeTargetPrivate* SbDecodeTarget
 ```
 
-### SbDecodeTargetGlesContextRunner ###
+### SbDecodeTargetGlesContextRunner
 
 Signature for a function provided by the application to the Starboard
 implementation that will let the Starboard implementation run arbitrary code on
 the application's renderer thread with the application's EGLContext held
 current.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDecodeTargetGlesContextRunner) (struct SbDecodeTargetGraphicsContextProvider *graphics_context_provider, SbDecodeTargetGlesContextRunnerTarget target_function, void *target_function_context)
 ```
 
-### SbDecodeTargetGlesContextRunnerTarget ###
+### SbDecodeTargetGlesContextRunnerTarget
 
 Signature for a Starboard implementation function that is to be run by a
 SbDecodeTargetGlesContextRunner callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDecodeTargetGlesContextRunnerTarget) (void *gles_context_runner_target_context)
 ```
 
-## Structs ##
+## Structs
 
-### SbDecodeTargetGraphicsContextProvider ###
+### SbDecodeTargetGraphicsContextProvider
 
 In general, the SbDecodeTargetGraphicsContextProvider structure provides
 information about the graphics context that will be used to render
@@ -210,7 +209,7 @@
 to all Starboard functions that might create SbDecodeTargets (e.g.
 SbImageDecode()).
 
-#### Members ####
+#### Members
 
 *   `void * egl_display`
 
@@ -233,12 +232,12 @@
     Context data that is to be passed in to `gles_context_runner` when it is
     invoked.
 
-### SbDecodeTargetInfo ###
+### SbDecodeTargetInfo
 
 Contains all information about a decode target, including all of its planes.
 This can be queried via calls to SbDecodeTargetGetInfo().
 
-#### Members ####
+#### Members
 
 *   `SbDecodeTargetFormat format`
 
@@ -267,11 +266,11 @@
     kSbDecodeTargetPlaneU, kSbDecodeTargetPlaneV} associated with this decode
     target.
 
-### SbDecodeTargetInfoContentRegion ###
+### SbDecodeTargetInfoContentRegion
 
 Defines a rectangular content region within a SbDecodeTargetInfoPlane structure.
 
-#### Members ####
+#### Members
 
 *   `float left`
 
@@ -283,11 +282,11 @@
 *   `float right`
 *   `float bottom`
 
-### SbDecodeTargetInfoPlane ###
+### SbDecodeTargetInfoPlane
 
 Defines an image plane within a SbDecodeTargetInfo object.
 
-#### Members ####
+#### Members
 
 *   `uint32_t texture`
 
@@ -317,53 +316,53 @@
     these parameters are number of pixels. The range for left/right is [0,
     width], and for top/bottom it is [0, height].
 
-## Functions ##
+## Functions
 
-### PrivateDecodeTargetReleaser ###
+### PrivateDecodeTargetReleaser
 
 This function is just an implementation detail of
 SbDecodeTargetReleaseInGlesContext() and should not be called directly.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void PrivateDecodeTargetReleaser(void *context)
 ```
 
-### SbDecodeTargetGetInfo ###
+### SbDecodeTargetGetInfo
 
 Writes all information about `decode_target` into `out_info`. The
 `decode_target` must not be kSbDecodeTargetInvalid. The `out_info` pointer must
 not be NULL. Returns false if the provided `out_info` structure is not zero
 initialized.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDecodeTargetGetInfo(SbDecodeTarget decode_target, SbDecodeTargetInfo *out_info)
 ```
 
-### SbDecodeTargetIsFormatValid ###
+### SbDecodeTargetIsFormatValid
 
 Returns whether a given format is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDecodeTargetIsFormatValid(SbDecodeTargetFormat format)
 ```
 
-### SbDecodeTargetIsValid ###
+### SbDecodeTargetIsValid
 
 Returns whether the given file handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDecodeTargetIsValid(SbDecodeTarget handle)
 ```
 
-### SbDecodeTargetRelease ###
+### SbDecodeTargetRelease
 
 Returns ownership of `decode_target` to the Starboard implementation. This
 function will likely result in the destruction of the SbDecodeTarget and all its
@@ -371,31 +370,31 @@
 reference count. In the case where SB_HAS(GLES2), this function must be called
 on a thread with the context
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDecodeTargetRelease(SbDecodeTarget decode_target)
 ```
 
-### SbDecodeTargetReleaseInGlesContext ###
+### SbDecodeTargetReleaseInGlesContext
 
 Helper function that is possibly useful to Starboard implementations that will
 release a decode target on the thread with the GLES context current.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void SbDecodeTargetReleaseInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTarget decode_target)
 ```
 
-### SbDecodeTargetRunInGlesContext ###
+### SbDecodeTargetRunInGlesContext
 
 Inline convenience function to run an arbitrary
 SbDecodeTargetGlesContextRunnerTarget function through a
 SbDecodeTargetGraphicsContextProvider . This is intended to be called by
 Starboard implementations, if it is necessary.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void SbDecodeTargetRunInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTargetGlesContextRunnerTarget target, void *target_context)
diff --git a/cobalt/site/docs/reference/starboard/modules/directory.md b/cobalt/site/docs/reference/starboard/modules/directory.md
index d46c9a1..1c0f904 100644
--- a/cobalt/site/docs/reference/starboard/modules/directory.md
+++ b/cobalt/site/docs/reference/starboard/modules/directory.md
@@ -1,56 +1,56 @@
----
-layout: doc
-title: "Starboard Module Reference: directory.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `directory.h`
 
 Provides directory listing functions.
 
-## Macros ##
+## Macros
 
-### kSbDirectoryInvalid ###
+### kSbDirectoryInvalid
 
 Well-defined value for an invalid directory stream handle.
 
-## Typedefs ##
+## Typedefs
 
-### SbDirectory ###
+### SbDirectory
 
 A handle to an open directory stream.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbDirectoryPrivate* SbDirectory
 ```
 
-## Functions ##
+## Functions
 
-### SbDirectoryCanOpen ###
+### SbDirectoryCanOpen
 
 Indicates whether SbDirectoryOpen is allowed for the given `path`.
 
 `path`: The path to be checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryCanOpen(const char *path)
 ```
 
-### SbDirectoryClose ###
+### SbDirectoryClose
 
 Closes an open directory stream handle. The return value indicates whether the
 directory was closed successfully.
 
 `directory`: The directory stream handle to close.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryClose(SbDirectory directory)
 ```
 
-### SbDirectoryCreate ###
+### SbDirectoryCreate
 
 Creates the directory `path`, assuming the parent directory already exists. This
 function returns `true` if the directory now exists (even if it existed before)
@@ -58,13 +58,13 @@
 
 `path`: The path to be created.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryCreate(const char *path)
 ```
 
-### SbDirectoryGetNext ###
+### SbDirectoryGetNext
 
 Populates `out_entry` with the next entry in the specified directory stream, and
 moves the stream forward by one entry.
@@ -83,23 +83,23 @@
 `out_entry_size`: The size of the space allocated for `out_entry`. This should
 be at least equal to kSbFileMaxName.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDirectoryGetNext(SbDirectory directory, char *out_entry, size_t out_entry_size)
 ```
 
-### SbDirectoryIsValid ###
+### SbDirectoryIsValid
 
 Returns whether the given directory stream handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDirectoryIsValid(SbDirectory directory)
 ```
 
-### SbDirectoryOpen ###
+### SbDirectoryOpen
 
 Opens the given existing directory for listing. This function returns
 kSbDirectoryInvalidHandle if it is not successful.
@@ -110,7 +110,7 @@
 `out_error`: An output parameter that, in case of an error, is set to the reason
 that the directory could not be opened.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbDirectory SbDirectoryOpen(const char *path, SbFileError *out_error)
diff --git a/cobalt/site/docs/reference/starboard/modules/drm.md b/cobalt/site/docs/reference/starboard/modules/drm.md
index fbb92f9..f42e43b 100644
--- a/cobalt/site/docs/reference/starboard/modules/drm.md
+++ b/cobalt/site/docs/reference/starboard/modules/drm.md
@@ -1,37 +1,37 @@
----
-layout: doc
-title: "Starboard Module Reference: drm.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `drm.h`
 
 Provides definitions that allow for DRM support, which are common between Player
 and Decoder interfaces.
 
-## Macros ##
+## Macros
 
-### kSbDrmSystemInvalid ###
+### kSbDrmSystemInvalid
 
 An invalid SbDrmSystem.
 
-### kSbDrmTicketInvalid ###
+### kSbDrmTicketInvalid
 
 A ticket for callback invocations initiated by the DRM system.
 
-## Enums ##
+## Enums
 
-### SbDrmEncryptionScheme ###
+### SbDrmEncryptionScheme
 
 Encryption scheme of the input sample, as defined in ISO/IEC 23001 part 7.
 
-#### Values ####
+#### Values
 
 *   `kSbDrmEncryptionSchemeAesCtr`
 *   `kSbDrmEncryptionSchemeAesCbc`
 
-### SbDrmKeyStatus ###
+### SbDrmKeyStatus
 
 Status of a particular media key. [https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus](https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus)
 
-#### Values ####
+#### Values
 
 *   `kSbDrmKeyStatusUsable`
 *   `kSbDrmKeyStatusExpired`
@@ -41,24 +41,24 @@
 *   `kSbDrmKeyStatusPending`
 *   `kSbDrmKeyStatusError`
 
-### SbDrmSessionRequestType ###
+### SbDrmSessionRequestType
 
 The type of the session request. [https://www.w3.org/TR/encrypted-media/#idl-def-mediakeymessagetype](https://www.w3.org/TR/encrypted-media/#idl-def-mediakeymessagetype)
 
-#### Values ####
+#### Values
 
 *   `kSbDrmSessionRequestTypeLicenseRequest`
 *   `kSbDrmSessionRequestTypeLicenseRenewal`
 *   `kSbDrmSessionRequestTypeLicenseRelease`
 *   `kSbDrmSessionRequestTypeIndividualizationRequest`
 
-### SbDrmStatus ###
+### SbDrmStatus
 
 The status of session related operations. Used by
 `SbDrmSessionUpdateRequestFunc`, `SbDrmSessionUpdatedFunc`, and
 `SbDrmServerCertificateUpdatedFunc` to indicate the status of the operation. [https://w3c.github.io/encrypted-media/#error-names](https://w3c.github.io/encrypted-media/#error-names)
 
-#### Values ####
+#### Values
 
 *   `kSbDrmStatusSuccess`
 *   `kSbDrmStatusTypeError`
@@ -70,42 +70,42 @@
     The following error can be used when the error status cannot be mapped to
     one of the above errors.
 
-## Typedefs ##
+## Typedefs
 
-### SbDrmServerCertificateUpdatedFunc ###
+### SbDrmServerCertificateUpdatedFunc
 
 A callback to notify the caller of SbDrmUpdateServerCertificate() whether the
 update has been successfully updated or not.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmServerCertificateUpdatedFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, const char *error_message)
 ```
 
-### SbDrmSessionClosedFunc ###
+### SbDrmSessionClosedFunc
 
 A callback for signalling that a session has been closed by the SbDrmSystem
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionClosedFunc) (SbDrmSystem drm_system, void *context, const void *session_id, int session_id_size)
 ```
 
-### SbDrmSessionKeyStatusesChangedFunc ###
+### SbDrmSessionKeyStatusesChangedFunc
 
 A callback for notifications that the status of one or more keys in a session
 has been changed. All keys of the session and their new status will be passed
 along. Any keys not in the list is considered as deleted.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionKeyStatusesChangedFunc) (SbDrmSystem drm_system, void *context, const void *session_id, int session_id_size, int number_of_keys, const SbDrmKeyId *key_ids, const SbDrmKeyStatus *key_statuses)
 ```
 
-### SbDrmSessionUpdateRequestFunc ###
+### SbDrmSessionUpdateRequestFunc
 
 A callback that will receive generated session update request when requested
 from a SbDrmSystem. `drm_system` will be the DRM system that
@@ -128,13 +128,13 @@
 the correct Promise corresponding to the associated
 SbDrmGenerateSessionUpdateRequest().
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionUpdateRequestFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, SbDrmSessionRequestType type, const char *error_message, const void *session_id, int session_id_size, const void *content, int content_size, const char *url)
 ```
 
-### SbDrmSessionUpdatedFunc ###
+### SbDrmSessionUpdatedFunc
 
 A callback for notifications that a session has been added, and subsequent
 encrypted samples are actively ready to be decoded. `drm_system` will be the DRM
@@ -150,37 +150,37 @@
 `status` is `kSbDrmStatusSuccess` or if no error message can be provided.
 `succeeded` is whether the session was successfully updated or not.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbDrmSessionUpdatedFunc) (SbDrmSystem drm_system, void *context, int ticket, SbDrmStatus status, const char *error_message, const void *session_id, int session_id_size)
 ```
 
-### SbDrmSystem ###
+### SbDrmSystem
 
 A handle to a DRM system which can be used with either an SbDecoder or an
 SbPlayer.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbDrmSystemPrivate* SbDrmSystem
 ```
 
-## Structs ##
+## Structs
 
-### SbDrmEncryptionPattern ###
+### SbDrmEncryptionPattern
 
 Encryption pattern of the input sample, as defined in ISO/IEC 23001 part 7.
 
-#### Members ####
+#### Members
 
 *   `uint32_t crypt_byte_block`
 *   `uint32_t skip_byte_block`
 
-### SbDrmKeyId ###
+### SbDrmKeyId
 
-#### Members ####
+#### Members
 
 *   `uint8_t identifier`
 
@@ -188,11 +188,11 @@
     PlayReady, this is the license GUID in packed little-endian binary form.
 *   `int identifier_size`
 
-### SbDrmSampleInfo ###
+### SbDrmSampleInfo
 
 All the optional information needed per sample for encrypted samples.
 
-#### Members ####
+#### Members
 
 *   `SbDrmEncryptionScheme encryption_scheme`
 
@@ -217,13 +217,13 @@
     The clear/encrypted mapping of each subsample in this sample. This must be
     an array of `subsample_count` mappings.
 
-### SbDrmSubSampleMapping ###
+### SbDrmSubSampleMapping
 
 A mapping of clear and encrypted bytes for a single subsample. All subsamples
 within a sample must be encrypted with the same encryption parameters. The clear
 bytes always appear first in the sample.
 
-#### Members ####
+#### Members
 
 *   `int32_t clear_byte_count`
 
@@ -232,21 +232,21 @@
 
     How many bytes of the corresponding subsample are encrypted.
 
-## Functions ##
+## Functions
 
-### SbDrmCloseSession ###
+### SbDrmCloseSession
 
 Clear any internal states/resources related to the specified `session_id`.
 
 `drm_system` must not be `kSbDrmSystemInvalid`. `session_id` must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmCloseSession(SbDrmSystem drm_system, const void *session_id, int session_id_size)
 ```
 
-### SbDrmDestroySystem ###
+### SbDrmDestroySystem
 
 Destroys `drm_system`, which implicitly removes all keys installed in it and
 invalidates all outstanding session update requests. A DRM system cannot be
@@ -258,13 +258,13 @@
 
 `drm_system`: The DRM system to be destroyed. Must not be `kSbDrmSystemInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmDestroySystem(SbDrmSystem drm_system)
 ```
 
-### SbDrmGenerateSessionUpdateRequest ###
+### SbDrmGenerateSessionUpdateRequest
 
 Asynchronously generates a session update request payload for
 `initialization_data`, of `initialization_data_size`, in case sensitive `type`,
@@ -296,13 +296,13 @@
 payload is created. Must not be NULL. `initialization_data_size`: The size of
 the session update request payload.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmGenerateSessionUpdateRequest(SbDrmSystem drm_system, int ticket, const char *type, const void *initialization_data, int initialization_data_size)
 ```
 
-### SbDrmGetMetrics ###
+### SbDrmGetMetrics
 
 Get the metrics of the underlying drm system.
 
@@ -326,13 +326,13 @@
 
 `drm_system` must not be `kSbDrmSystemInvalid`. `size` must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 const void* SbDrmGetMetrics(SbDrmSystem drm_system, int *size)
 ```
 
-### SbDrmIsServerCertificateUpdatable ###
+### SbDrmIsServerCertificateUpdatable
 
 Returns true if server certificate of `drm_system` can be updated via
 SbDrmUpdateServerCertificate(). The return value should remain the same during
@@ -341,33 +341,33 @@
 `drm_system`: The DRM system to check if its server certificate is updatable.
 Must not be `kSbDrmSystemInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbDrmIsServerCertificateUpdatable(SbDrmSystem drm_system)
 ```
 
-### SbDrmSystemIsValid ###
+### SbDrmSystemIsValid
 
 Indicates whether `drm_system` is a valid SbDrmSystem.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDrmSystemIsValid(SbDrmSystem drm)
 ```
 
-### SbDrmTicketIsValid ###
+### SbDrmTicketIsValid
 
 Indicates whether `ticket` is a valid ticket.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbDrmTicketIsValid(int ticket)
 ```
 
-### SbDrmUpdateServerCertificate ###
+### SbDrmUpdateServerCertificate
 
 Update the server certificate of `drm_system`. The function can be called
 multiple times. It is possible that a call to it happens before the callback of
@@ -384,13 +384,13 @@
 certificate data. Must not be NULL. `certificate_size`: Size of the server
 certificate data.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmUpdateServerCertificate(SbDrmSystem drm_system, int ticket, const void *certificate, int certificate_size)
 ```
 
-### SbDrmUpdateSession ###
+### SbDrmUpdateSession
 
 Update session with `key`, in `drm_system`'s key system, from the license server
 response. Calls `session_updated_callback` with `context` and whether the update
@@ -410,7 +410,7 @@
 thread before this function returns or from another thread. The `session_id`
 must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbDrmUpdateSession(SbDrmSystem drm_system, int ticket, const void *key, int key_size, const void *session_id, int session_id_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/egl.md b/cobalt/site/docs/reference/starboard/modules/egl.md
index b1e120b..87deff2 100644
--- a/cobalt/site/docs/reference/starboard/modules/egl.md
+++ b/cobalt/site/docs/reference/starboard/modules/egl.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: egl.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `egl.h`
 
 The EGL API provides an interface with accompanying type declarations and
 defines that together provide a single consistent method of EGL usage across
@@ -11,67 +11,67 @@
 versions on different systems, and to remove the requirement for any other code
 to directly pull in and use these system libraries.
 
-## EGL Version ##
+## EGL Version
 
 This API has the ability to support EGL 1.5, however it is not required to
 support anything beyond EGL 1.4. The user is responsible for ensuring that the
 functions from EGL 1.5 they are calling from the interface are valid.
 
-## Macros ##
+## Macros
 
-### SB_EGL_ALPHA_FORMAT ###
+### SB_EGL_ALPHA_FORMAT
 
 EGL_VERSION_1_2
 
-### SB_EGL_ALPHA_SIZE ###
+### SB_EGL_ALPHA_SIZE
 
 EGL_VERSION_1_0
 
-### SB_EGL_BACK_BUFFER ###
+### SB_EGL_BACK_BUFFER
 
 EGL_VERSION_1_1
 
-### SB_EGL_CONFORMANT ###
+### SB_EGL_CONFORMANT
 
 EGL_VERSION_1_3
 
-### SB_EGL_CONTEXT_MAJOR_VERSION ###
+### SB_EGL_CONTEXT_MAJOR_VERSION
 
 EGL_VERSION_1_5
 
-### SB_EGL_DEFAULT_DISPLAY ###
+### SB_EGL_DEFAULT_DISPLAY
 
 EGL_VERSION_1_4
 
-## Typedefs ##
+## Typedefs
 
-### SbEglCastsToProperFunctionPointerType ###
+### SbEglCastsToProperFunctionPointerType
 
 The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/EGL/api/EGL/egl.h](https://www.khronos.org/registry/EGL/api/EGL/egl.h)
 .
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbEglCastsToProperFunctionPointerType) (void)
 ```
 
-### SbEglInt32 ###
+### SbEglInt32
 
 The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h](https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h)
 .
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int32_t SbEglInt32
 ```
 
-## Structs ##
+## Structs
 
-### SbEglInterface ###
+### SbEglInterface
 
-#### Members ####
+#### Members
 
 *   `SbEglBoolean(*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32
     *attrib_list, SbEglConfig *configs, SbEglInt32 config_size, SbEglInt32
diff --git a/cobalt/site/docs/reference/starboard/modules/event.md b/cobalt/site/docs/reference/starboard/modules/event.md
index 58cb1f4..d8bab06 100644
--- a/cobalt/site/docs/reference/starboard/modules/event.md
+++ b/cobalt/site/docs/reference/starboard/modules/event.md
@@ -1,11 +1,11 @@
----
-layout: doc
-title: "Starboard Module Reference: event.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `event.h`
 
 Defines the event system that wraps the Starboard main loop and entry point.
 
-## The Starboard Application Lifecycle ##
+## The Starboard Application Lifecycle
 
 ```
                * ----------
@@ -78,15 +78,15 @@
 Note that the application is always expected to transition through `BLURRED`,
 `CONCEALED` to `FROZEN` before receiving `Stop` or being killed.
 
-## Enums ##
+## Enums
 
-### SbEventType ###
+### SbEventType
 
 An enumeration of all possible event types dispatched directly by the system.
 Each event is accompanied by a void* data argument, and each event must define
 the type of the value pointed to by that data argument, if any.
 
-#### Values ####
+#### Values
 
 *   `kSbEventTypePreload`
 
@@ -273,55 +273,55 @@
     change in the timezone setting). This should trigger the application to re-
     query the relevant APIs to update the date and time.
 
-## Typedefs ##
+## Typedefs
 
-### SbEventCallback ###
+### SbEventCallback
 
 A function that can be called back from the main Starboard event pump.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbEventCallback) (void *context)
 ```
 
-### SbEventDataDestructor ###
+### SbEventDataDestructor
 
 A function that will cleanly destroy an event data instance of a specific type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbEventDataDestructor) (void *data)
 ```
 
-### SbEventId ###
+### SbEventId
 
 An ID that can be used to refer to a scheduled event.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef uint32_t SbEventId
 ```
 
-## Structs ##
+## Structs
 
-### SbEvent ###
+### SbEvent
 
 Structure representing a Starboard event and its data.
 
-#### Members ####
+#### Members
 
 *   `SbEventType type`
 *   `SbTimeMonotonic timestamp`
 *   `void * data`
 
-### SbEventStartData ###
+### SbEventStartData
 
 Event data for kSbEventTypeStart events.
 
-#### Members ####
+#### Members
 
 *   `char ** argument_values`
 
@@ -333,31 +333,31 @@
 
     The startup link, if any.
 
-### SbEventWindowSizeChangedData ###
+### SbEventWindowSizeChangedData
 
 Event data for kSbEventTypeWindowSizeChanged events.
 
-#### Members ####
+#### Members
 
 *   `SbWindow window`
 *   `SbWindowSize size`
 
-## Functions ##
+## Functions
 
-### SbEventCancel ###
+### SbEventCancel
 
 Cancels the specified `event_id`. Note that this function is a no-op if the
 event already fired. This function can be safely called from any thread, but the
 only way to guarantee that the event does not run anyway is to call it from the
 main Starboard event loop thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbEventCancel(SbEventId event_id)
 ```
 
-### SbEventHandle ###
+### SbEventHandle
 
 The entry point that Starboard applications MUST implement. Any memory pointed
 at by `event` or the `data` field inside `event` is owned by the system, and
@@ -370,23 +370,23 @@
 application should generally do as little work as possible on this thread, and
 just dispatch it over to another thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SB_EXPORT_PLATFORM void SbEventHandle(const SbEvent *event)
 ```
 
-### SbEventIsIdValid ###
+### SbEventIsIdValid
 
 Returns whether the given event handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbEventIsIdValid(SbEventId handle)
 ```
 
-### SbEventSchedule ###
+### SbEventSchedule
 
 Schedules an event `callback` into the main Starboard event loop. This function
 may be called from any thread, but `callback` is always called from the main
@@ -397,18 +397,18 @@
 of microseconds to wait before calling the `callback` function. Set `delay` to
 `0` to call the callback as soon as possible.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbEventId SbEventSchedule(SbEventCallback callback, void *context, SbTime delay)
 ```
 
-### SbRunStarboardMain ###
+### SbRunStarboardMain
 
 Serves as the entry point in the Starboard library for running the Starboard
 event loop with the application event handler.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbRunStarboardMain(int argc, char **argv, SbEventHandleCallback callback)
diff --git a/cobalt/site/docs/reference/starboard/modules/export.md b/cobalt/site/docs/reference/starboard/modules/export.md
index ff79777..a398d4a 100644
--- a/cobalt/site/docs/reference/starboard/modules/export.md
+++ b/cobalt/site/docs/reference/starboard/modules/export.md
@@ -1,24 +1,24 @@
----
-layout: doc
-title: "Starboard Module Reference: export.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `export.h`
 
 Provides macros for properly exporting or importing symbols from shared
 libraries.
 
-## Macros ##
+## Macros
 
-### SB_EXPORT ###
+### SB_EXPORT
 
 Specification for a symbol that should be exported when building the DLL and
 imported when building code that uses the DLL.
 
-### SB_EXPORT_PRIVATE ###
+### SB_EXPORT_PRIVATE
 
 Specification for a symbol that should be exported or imported for testing
 purposes only.
 
-### SB_IMPORT ###
+### SB_IMPORT
 
 Specification for a symbol that is expected to be defined externally to this
 module.
diff --git a/cobalt/site/docs/reference/starboard/modules/file.md b/cobalt/site/docs/reference/starboard/modules/file.md
index e22edeb..02c7863 100644
--- a/cobalt/site/docs/reference/starboard/modules/file.md
+++ b/cobalt/site/docs/reference/starboard/modules/file.md
@@ -1,25 +1,25 @@
----
-layout: doc
-title: "Starboard Module Reference: file.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `file.h`
 
 Defines file system input/output functions.
 
-## Macros ##
+## Macros
 
-### kSbFileInvalid ###
+### kSbFileInvalid
 
 Well-defined value for an invalid file handle.
 
-## Enums ##
+## Enums
 
-### SbFileError ###
+### SbFileError
 
 kSbFileErrorAccessDenied is returned when a call fails because of a filesystem
 restriction. kSbFileErrorSecurity is returned when a security policy doesn't
 allow the operation to be executed.
 
-#### Values ####
+#### Values
 
 *   `kSbFileOk`
 *   `kSbFileErrorFailed`
@@ -40,7 +40,7 @@
 *   `kSbFileErrorIO`
 *   `kSbFileErrorMax`
 
-### SbFileFlags ###
+### SbFileFlags
 
 Flags that define how a file is used in the application. These flags should be
 or'd together when passed to SbFileOpen to open or create a file.
@@ -66,7 +66,7 @@
 
 The `kSbFileAsync` flag is optional.
 
-#### Values ####
+#### Values
 
 *   `kSbFileOpenOnly`
 *   `kSbFileCreateOnly`
@@ -85,35 +85,35 @@
 *   `kSbFileWrite`
 *   `kSbFileAsync`
 
-### SbFileWhence ###
+### SbFileWhence
 
 This explicit mapping matches both FILE_ on Windows and SEEK_ on Linux.
 
-#### Values ####
+#### Values
 
 *   `kSbFileFromBegin`
 *   `kSbFileFromCurrent`
 *   `kSbFileFromEnd`
 
-## Typedefs ##
+## Typedefs
 
-### SbFile ###
+### SbFile
 
 A handle to an open file.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbFilePrivate* SbFile
 ```
 
-## Structs ##
+## Structs
 
-### SbFileInfo ###
+### SbFileInfo
 
 Used to hold information about a file.
 
-#### Members ####
+#### Members
 
 *   `int64_t size`
 
@@ -134,9 +134,9 @@
 
     The creation time of a file.
 
-## Functions ##
+## Functions
 
-### SbFileAtomicReplace ###
+### SbFileAtomicReplace
 
 Replaces the content of the file at `path` with `data`. Returns whether the
 contents of the file were replaced. The replacement of the content is an atomic
@@ -146,39 +146,39 @@
 to replace the file contents with. `data_size`: The amount of `data`, in bytes,
 to be written to the file.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileAtomicReplace(const char *path, const char *data, int64_t data_size)
 ```
 
-### SbFileCanOpen ###
+### SbFileCanOpen
 
 Indicates whether SbFileOpen() with the given `flags` is allowed for `path`.
 
 `path`: The absolute path to be checked. `flags`: The flags that are being
 evaluated for the given `path`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileCanOpen(const char *path, int flags)
 ```
 
-### SbFileClose ###
+### SbFileClose
 
 Closes `file`. The return value indicates whether the file was closed
 successfully.
 
 `file`: The absolute path of the file to be closed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileClose(SbFile file)
 ```
 
-### SbFileDelete ###
+### SbFileDelete
 
 Deletes the regular file, symlink, or empty directory at `path`. This function
 is used primarily to clean up after unit tests. On some platforms, this function
@@ -186,38 +186,38 @@
 
 `path`: The absolute path of the file, symlink, or directory to be deleted.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileDelete(const char *path)
 ```
 
-### SbFileExists ###
+### SbFileExists
 
 Indicates whether a file or directory exists at `path`.
 
 `path`: The absolute path of the file or directory being checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileExists(const char *path)
 ```
 
-### SbFileFlush ###
+### SbFileFlush
 
 Flushes the write buffer to `file`. Data written via SbFileWrite is not
 necessarily committed until the SbFile is flushed or closed.
 
 `file`: The SbFile to which the write buffer is flushed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileFlush(SbFile file)
 ```
 
-### SbFileGetInfo ###
+### SbFileGetInfo
 
 Retrieves information about `file`. The return value indicates whether the file
 information was retrieved successfully.
@@ -226,13 +226,13 @@
 into which the retrieved data is placed. This variable is not touched if the
 operation is not successful.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileGetInfo(SbFile file, SbFileInfo *out_info)
 ```
 
-### SbFileGetPathInfo ###
+### SbFileGetPathInfo
 
 Retrieves information about the file at `path`. The return value indicates
 whether the file information was retrieved successfully.
@@ -241,36 +241,36 @@
 `out_info`: The variable into which the retrieved data is placed. This variable
 is not touched if the operation is not successful.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileGetPathInfo(const char *path, SbFileInfo *out_info)
 ```
 
-### SbFileIsValid ###
+### SbFileIsValid
 
 Returns whether the given file handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbFileIsValid(SbFile file)
 ```
 
-### SbFileModeStringToFlags ###
+### SbFileModeStringToFlags
 
 Converts an ISO `fopen()` mode string into flags that can be equivalently passed
 into SbFileOpen().
 
 `mode`: The mode string to be converted into flags.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbFileModeStringToFlags(const char *mode)
 ```
 
-### SbFileOpen ###
+### SbFileOpen
 
 Opens the file at `path`, which must be absolute, creating it if specified by
 `flags`. The read/write position is at the beginning of the file.
@@ -287,13 +287,13 @@
 sets this value to `false`. `out_error`: If `path` cannot be created, this is
 set to `kSbFileInvalid`. Otherwise, it is `NULL`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbFile SbFileOpen(const char *path, int flags, bool *out_created, SbFileError *out_error)
 ```
 
-### SbFileRead ###
+### SbFileRead
 
 Reads `size` bytes (or until EOF is reached) from `file` into `data`, starting
 at the file's current position.
@@ -306,13 +306,13 @@
 `file`: The SbFile from which to read data. `data`: The variable to which data
 is read. `size`: The amount of data (in bytes) to read.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbFileRead(SbFile file, char *data, int size)
 ```
 
-### SbFileReadAll ###
+### SbFileReadAll
 
 Reads `size` bytes (or until EOF is reached) from `file` into `data`, starting
 at the file's current position.
@@ -326,13 +326,13 @@
 `file`: The SbFile from which to read data. `data`: The variable to which data
 is read. `size`: The amount of data (in bytes) to read.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbFileReadAll(SbFile file, char *data, int size)
 ```
 
-### SbFileSeek ###
+### SbFileSeek
 
 Changes the current read/write position in `file`. The return value identifies
 the resultant current read/write position in the file (relative to the start) or
@@ -344,13 +344,13 @@
 value. `offset`: The amount that the read/write position is changed, relative to
 `whence`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbFileSeek(SbFile file, SbFileWhence whence, int64_t offset)
 ```
 
-### SbFileTruncate ###
+### SbFileTruncate
 
 Truncates the given `file` to the given `length`. The return value indicates
 whether the file was truncated successfully.
@@ -360,13 +360,13 @@
 then the file is extended with zeros. If `length` is negative, then the function
 is a no-op and returns `false`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbFileTruncate(SbFile file, int64_t length)
 ```
 
-### SbFileWrite ###
+### SbFileWrite
 
 Writes the given buffer into `file` at the file's current position, overwriting
 any data that was previously there.
@@ -380,13 +380,13 @@
 `file`: The SbFile to which data will be written. `data`: The data to be
 written. `size`: The amount of data (in bytes) to write.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbFileWrite(SbFile file, const char *data, int size)
 ```
 
-### SbFileWriteAll ###
+### SbFileWriteAll
 
 Writes the given buffer into `file`, starting at the beginning of the file, and
 overwriting any data that was previously there. Unlike SbFileWrite, this
@@ -397,7 +397,7 @@
 `file`: The file to which data will be written. `data`: The data to be written.
 `size`: The amount of data (in bytes) to write.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbFileWriteAll(SbFile file, const char *data, int size)
diff --git a/cobalt/site/docs/reference/starboard/modules/gles.md b/cobalt/site/docs/reference/starboard/modules/gles.md
index 7a9108a..049838f 100644
--- a/cobalt/site/docs/reference/starboard/modules/gles.md
+++ b/cobalt/site/docs/reference/starboard/modules/gles.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: gles.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `gles.h`
 
 The GLES API provides an interface with accompanying type declarations and
 defines that together provide a single consistent method of GLES usage across
@@ -11,37 +11,37 @@
 and versions on different systems, and to remove the requirement for any other
 code to directly pull in and use these system libraries.
 
-## GLES Version ##
+## GLES Version
 
 This API has the ability to support GLES 3.0, however platforms are not required
 to support anything beyond GLES 2.0. The caller is responsible for ensuring that
 the functions from GLES 3.0 they are calling from the interface are valid.
 
-## Macros ##
+## Macros
 
-### SB_GL_DEPTH_BUFFER_BIT ###
+### SB_GL_DEPTH_BUFFER_BIT
 
 Previously defined in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
 
-### SB_GL_READ_BUFFER ###
+### SB_GL_READ_BUFFER
 
 Previously defined in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
 .
 
-## Typedefs ##
+## Typedefs
 
-### SbGlBoolean ###
+### SbGlBoolean
 
 The following type definitions were adapted from the types declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
 .
 
-#### Definition ####
+#### Definition
 
 ```
 typedef uint8_t SbGlBoolean
 ```
 
-### SbGlIntPtr ###
+### SbGlIntPtr
 
 Some compilers will transform the intptr_t to an int transparently behind the
 scenes, which is not equivalent to a long int, or long long int, as far as the
@@ -49,17 +49,17 @@
 those exact types used by OpenGL ES 2.0 ( [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h)
 ).
 
-#### Definition ####
+#### Definition
 
 ```
 typedef long int SbGlIntPtr
 ```
 
-## Structs ##
+## Structs
 
-### SbGlesInterface ###
+### SbGlesInterface
 
-#### Members ####
+#### Members
 
 *   `void(*glActiveTexture)(SbGlEnum texture)`
 
diff --git a/cobalt/site/docs/reference/starboard/modules/image.md b/cobalt/site/docs/reference/starboard/modules/image.md
index 1427d39..945938a 100644
--- a/cobalt/site/docs/reference/starboard/modules/image.md
+++ b/cobalt/site/docs/reference/starboard/modules/image.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: image.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `image.h`
 
 API for hardware accelerated image decoding. This module allows for the client
 to feed in raw, encoded data to be decoded directly into an SbDecodeTarget. It
@@ -11,7 +11,7 @@
 All functions in this module are safe to call from any thread at any point in
 time.
 
-## SbImageIsDecodeSupported and SbImageDecode Example ##
+## SbImageIsDecodeSupported and SbImageDecode Example
 
 ```
 SbDecodeTargetProvider* provider = GetProviderFromSomewhere();
@@ -28,9 +28,9 @@
                                              mime_type, format);
 ```
 
-## Functions ##
+## Functions
 
-### SbImageDecode ###
+### SbImageDecode
 
 Attempt to decode encoded `mime_type` image data `data` of size `data_size` into
 an SbDecodeTarget of SbDecodeFormatType `format`, possibly using
@@ -56,13 +56,13 @@
     kSbDecodeTargetInvalid will be returned, with any intermediate allocations
     being cleaned up in the implementation.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbDecodeTarget SbImageDecode(SbDecodeTargetGraphicsContextProvider *context_provider, void *data, int data_size, const char *mime_type, SbDecodeTargetFormat format)
 ```
 
-### SbImageIsDecodeSupported ###
+### SbImageIsDecodeSupported
 
 Whether the current platform supports hardware accelerated decoding an image of
 mime type `mime_type` into SbDecodeTargetFormat `format`. The `mime_type` must
@@ -70,7 +70,7 @@
 program, which means that the results of this function may be cached
 indefinitely.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbImageIsDecodeSupported(const char *mime_type, SbDecodeTargetFormat format)
diff --git a/cobalt/site/docs/reference/starboard/modules/input.md b/cobalt/site/docs/reference/starboard/modules/input.md
index e8df816..d2dd2db 100644
--- a/cobalt/site/docs/reference/starboard/modules/input.md
+++ b/cobalt/site/docs/reference/starboard/modules/input.md
@@ -1,18 +1,18 @@
----
-layout: doc
-title: "Starboard Module Reference: input.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `input.h`
 
 Defines input events and associated data types.
 
-## Enums ##
+## Enums
 
-### SbInputDeviceType ###
+### SbInputDeviceType
 
 Identifies possible input subsystem types. The types of events that each device
 type produces correspond to `SbInputEventType` values.
 
-#### Values ####
+#### Values
 
 *   `kSbInputDeviceTypeGesture`
 
@@ -57,11 +57,11 @@
 
     Produces `Input` events.
 
-### SbInputEventType ###
+### SbInputEventType
 
 The action that an input event represents.
 
-#### Values ####
+#### Values
 
 *   `kSbInputEventTypeMove`
 
@@ -86,13 +86,13 @@
 
     [https://w3c.github.io/uievents/#event-type-input](https://w3c.github.io/uievents/#event-type-input)
 
-## Structs ##
+## Structs
 
-### SbInputData ###
+### SbInputData
 
 Event data for `kSbEventTypeInput` events.
 
-#### Members ####
+#### Members
 
 *   `SbWindow window`
 
@@ -160,11 +160,11 @@
 
     Set to true if the input event is part of a composition event.
 
-### SbInputVector ###
+### SbInputVector
 
 A 2-dimensional vector used to represent points and motion vectors.
 
-#### Members ####
+#### Members
 
 *   `float x`
 *   `float y`
diff --git a/cobalt/site/docs/reference/starboard/modules/key.md b/cobalt/site/docs/reference/starboard/modules/key.md
index 2835b20..ed87e53 100644
--- a/cobalt/site/docs/reference/starboard/modules/key.md
+++ b/cobalt/site/docs/reference/starboard/modules/key.md
@@ -1,19 +1,19 @@
----
-layout: doc
-title: "Starboard Module Reference: key.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `key.h`
 
 Defines the canonical set of Starboard key codes.
 
-## Enums ##
+## Enums
 
-### SbKey ###
+### SbKey
 
 A standard set of key codes, ordered by value, that represent each possible
 input key across all kinds of devices. Starboard uses the semi-standard Windows
 virtual key codes documented at: [https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx](https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx)
 
-#### Values ####
+#### Values
 
 *   `kSbKeyUnknown`
 *   `kSbKeyCancel`
@@ -275,11 +275,11 @@
 *   `kSbKeyGamepadRightStickLeft`
 *   `kSbKeyGamepadRightStickRight`
 
-### SbKeyModifiers ###
+### SbKeyModifiers
 
 Bit-mask of key modifiers.
 
-#### Values ####
+#### Values
 
 *   `kSbKeyModifiersNone`
 *   `kSbKeyModifiersAlt`
diff --git a/cobalt/site/docs/reference/starboard/modules/log.md b/cobalt/site/docs/reference/starboard/modules/log.md
index 42de513..6cf3a49 100644
--- a/cobalt/site/docs/reference/starboard/modules/log.md
+++ b/cobalt/site/docs/reference/starboard/modules/log.md
@@ -1,18 +1,18 @@
----
-layout: doc
-title: "Starboard Module Reference: log.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `log.h`
 
 Defines core debug logging functions.
 
-## Enums ##
+## Enums
 
-### SbLogPriority ###
+### SbLogPriority
 
 The priority at which a message should be logged. The platform may be configured
 to filter logs by priority, or render them differently.
 
-#### Values ####
+#### Values
 
 *   `kSbLogPriorityUnknown`
 *   `kSbLogPriorityInfo`
@@ -20,9 +20,9 @@
 *   `kSbLogPriorityError`
 *   `kSbLogPriorityFatal`
 
-## Functions ##
+## Functions
 
-### SbLog ###
+### SbLog
 
 Writes `message` to the platform's debug output log. This method is thread-safe,
 and responsible for ensuring that the output from multiple threads is not mixed.
@@ -35,55 +35,55 @@
 termination. That said, platforms can adjust the message to be more suitable for
 their output method by wrapping the text, stripping unprintable characters, etc.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLog(SbLogPriority priority, const char *message)
 ```
 
-### SbLogFlush ###
+### SbLogFlush
 
 Flushes the log buffer on some platforms. This method is safe to call from
 multiple threads.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogFlush()
 ```
 
-### SbLogFormat ###
+### SbLogFormat
 
 A log output method that additionally performs a string format on the data being
 logged.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogFormat(const char *format, va_list args) SB_PRINTF_FORMAT(1
 ```
 
-### SbLogFormatF ###
+### SbLogFormatF
 
 Inline wrapper of SbLogFormat that converts from ellipsis to va_args.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void static void static void SbLogFormatF(const char *format,...) SB_PRINTF_FORMAT(1
 ```
 
-### SbLogIsTty ###
+### SbLogIsTty
 
 Indicates whether the log output goes to a TTY or is being redirected.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbLogIsTty()
 ```
 
-### SbLogRaw ###
+### SbLogRaw
 
 A bare-bones log output method that is async-signal-safe, i.e. safe to call from
 an asynchronous signal handler (e.g. a `SIGSEGV` handler). It should not do any
@@ -91,13 +91,13 @@
 
 `message`: The message to be logged. Must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogRaw(const char *message)
 ```
 
-### SbLogRawDumpStack ###
+### SbLogRawDumpStack
 
 Dumps the stack of the current thread to the log in an async-signal-safe manner,
 i.e. safe to call from an asynchronous signal handler (e.g. a `SIGSEGV`
@@ -108,28 +108,28 @@
 helper functions that might end up on top of every stack dump so that the stack
 dump is just the relevant function stack where the problem occurred.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogRawDumpStack(int frames_to_skip)
 ```
 
-### SbLogRawFormat ###
+### SbLogRawFormat
 
 A formatted log output method that is async-signal-safe, i.e. safe to call from
 an asynchronous signal handler (e.g. a `SIGSEGV` handler).
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbLogRawFormat(const char *format, va_list args) SB_PRINTF_FORMAT(1
 ```
 
-### SbLogRawFormatF ###
+### SbLogRawFormatF
 
 Inline wrapper of SbLogFormat to convert from ellipsis to va_args.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void static void static void SbLogRawFormatF(const char *format,...) SB_PRINTF_FORMAT(1
diff --git a/cobalt/site/docs/reference/starboard/modules/media.md b/cobalt/site/docs/reference/starboard/modules/media.md
index 132166c..42871c2 100644
--- a/cobalt/site/docs/reference/starboard/modules/media.md
+++ b/cobalt/site/docs/reference/starboard/modules/media.md
@@ -1,28 +1,28 @@
----
-layout: doc
-title: "Starboard Module Reference: media.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `media.h`
 
 Provides media definitions that are common between the Decoder and Player
 interfaces.
 
-## Macros ##
+## Macros
 
-### kSbMediaBitsPerPixelInvalid ###
+### kSbMediaBitsPerPixelInvalid
 
 Value used when a video's bits per pixel is not known.
 
-### kSbMediaVideoResolutionDimensionInvalid ###
+### kSbMediaVideoResolutionDimensionInvalid
 
 Value used when a video's resolution is not known.
 
-## Enums ##
+## Enums
 
-### SbMediaAudioCodec ###
+### SbMediaAudioCodec
 
 Types of audio elementary streams that can be supported.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioCodecNone`
 *   `kSbMediaAudioCodecAac`
@@ -35,11 +35,11 @@
 *   `kSbMediaAudioCodecPcm`
 *   `kSbMediaAudioCodecIamf`
 
-### SbMediaAudioCodingType ###
+### SbMediaAudioCodingType
 
 Possible audio coding types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioCodingTypeNone`
 *   `kSbMediaAudioCodingTypeAac`
@@ -53,11 +53,11 @@
 *   `kSbMediaAudioCodingTypeMpeg3`
 *   `kSbMediaAudioCodingTypePcm`
 
-### SbMediaAudioConnector ###
+### SbMediaAudioConnector
 
 Possible audio connector types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioConnectorUnknown`
 *   `kSbMediaAudioConnectorAnalog`
@@ -76,11 +76,11 @@
 *   `kSbMediaAudioConnectorSpdif`
 *   `kSbMediaAudioConnectorUsb`
 
-### SbMediaAudioFrameStorageType ###
+### SbMediaAudioFrameStorageType
 
 Possible audio frame storage types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioFrameStorageTypeInterleaved`
 
@@ -96,22 +96,22 @@
     with timestamps 0, 1, 2, etc., the samples are stored in two buffers "L0 L1
     L2 ..." and "R0 R1 R2 ...".
 
-### SbMediaAudioSampleType ###
+### SbMediaAudioSampleType
 
 Possible audio sample types.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaAudioSampleTypeInt16Deprecated`
 *   `kSbMediaAudioSampleTypeFloat32`
 
-### SbMediaRangeId ###
+### SbMediaRangeId
 
 This corresponds to the WebM Range enum which is part of WebM color data (see [http://www.webmproject.org/docs/container/#Range](http://www.webmproject.org/docs/container/#Range)
 ). H.264 only uses a bool, which corresponds to the LIMITED/FULL values. Chrome-
 specific values start at 1000.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaRangeIdUnspecified`
 
@@ -127,13 +127,13 @@
     Range is defined by TransferId/MatrixId.
 *   `kSbMediaRangeIdLast`
 
-### SbMediaSupportType ###
+### SbMediaSupportType
 
 Indicates how confident the device is that it can play media resources of the
 given type. The values are a direct map of the canPlayType() method specified at
 the following link: [https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype](https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype)
 
-#### Values ####
+#### Values
 
 *   `kSbMediaSupportTypeNotSupported`
 
@@ -145,11 +145,11 @@
 
     The media type seems to be playable.
 
-### SbMediaType ###
+### SbMediaType
 
 Types of media component streams.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaTypeAudio`
 
@@ -158,11 +158,11 @@
 
     Value used for video streams.
 
-### SbMediaVideoCodec ###
+### SbMediaVideoCodec
 
 Types of video elementary streams that could be supported.
 
-#### Values ####
+#### Values
 
 *   `kSbMediaVideoCodecNone`
 *   `kSbMediaVideoCodecH264`
@@ -174,14 +174,14 @@
 *   `kSbMediaVideoCodecVp8`
 *   `kSbMediaVideoCodecVp9`
 
-## Structs ##
+## Structs
 
-### SbMediaAudioConfiguration ###
+### SbMediaAudioConfiguration
 
 A structure describing the audio configuration parameters of a single audio
 output.
 
-#### Members ####
+#### Members
 
 *   `SbMediaAudioConnector connector`
 
@@ -200,11 +200,11 @@
     `0` if this device cannot provide this information, in which case the caller
     can probably assume stereo output.
 
-### SbMediaAudioSampleInfo ###
+### SbMediaAudioSampleInfo
 
 The set of information required by the decoder or player for each audio sample.
 
-#### Members ####
+#### Members
 
 *   `SbMediaAudioStreamInfo stream_info`
 
@@ -212,11 +212,11 @@
 *   `SbTime discarded_duration_from_front`
 *   `SbTime discarded_duration_from_back`
 
-### SbMediaAudioStreamInfo ###
+### SbMediaAudioStreamInfo
 
 The set of information required by the decoder or player for each audio stream.
 
-#### Members ####
+#### Members
 
 *   `SbMediaAudioCodec codec`
 
@@ -242,14 +242,14 @@
 
     The AudioSpecificConfig, as specified in ISO/IEC-14496-3, section 1.6.2.1: [http://read.pudn.com/downloads98/doc/comm/401153/14496/ISO_IEC_14496-3%20Part%203%20Audio/C036083E_SUB1.PDF](http://read.pudn.com/downloads98/doc/comm/401153/14496/ISO_IEC_14496-3%20Part%203%20Audio/C036083E_SUB1.PDF)
 
-### SbMediaColorMetadata ###
+### SbMediaColorMetadata
 
 HDR (High Dynamic Range) Metadata common for HDR10 and WebM/VP9-based HDR
 formats, together with the ColorSpace. HDR reproduces a greater dynamic range of
 luminosity than is possible with standard digital imaging. See the Consumer
 Electronics Association press release: [https://www.cta.tech/News/Press-Releases/2015/August/CEA-Defines-%E2%80%98HDR-Compatible%E2%80%99-Displays.aspx](https://www.cta.tech/News/Press-Releases/2015/August/CEA-Defines-%E2%80%98HDR-Compatible%E2%80%99-Displays.aspx)
 
-#### Members ####
+#### Members
 
 *   `unsigned int bits_per_channel`
 
@@ -330,7 +330,7 @@
     a row-major ordered 3 x 4 submatrix of the 4 x 4 transform matrix. The 4th
     row is completed as (0, 0, 0, 1).
 
-### SbMediaMasteringMetadata ###
+### SbMediaMasteringMetadata
 
 SMPTE 2086 mastering data [http://ieeexplore.ieee.org/document/7291707/](http://ieeexplore.ieee.org/document/7291707/)
 This standard specifies the metadata items to specify the color volume (the
@@ -339,7 +339,7 @@
 independent of any specific digital representation. Also see the WebM container
 guidelines: [https://www.webmproject.org/docs/container/](https://www.webmproject.org/docs/container/)
 
-#### Members ####
+#### Members
 
 *   `float primary_r_chromaticity_x`
 
@@ -374,11 +374,11 @@
     Minimum luminance. Shall be represented in candelas per square meter
     (cd/m^2). In range [0, 9999.99].
 
-### SbMediaVideoSampleInfo ###
+### SbMediaVideoSampleInfo
 
 The set of information required by the decoder or player for each video sample.
 
-#### Members ####
+#### Members
 
 *   `SbMediaVideoStreamInfo stream_info`
 
@@ -388,11 +388,11 @@
     Indicates whether the associated sample is a key frame (I-frame). Avc video
     key frames must always start with SPS and PPS NAL units.
 
-### SbMediaVideoStreamInfo ###
+### SbMediaVideoStreamInfo
 
 The set of information required by the decoder or player for each video stream.
 
-#### Members ####
+#### Members
 
 *   `SbMediaVideoCodec codec`
 
@@ -434,9 +434,9 @@
     . This will only be specified on frames where the HDR metadata and color /
     color space might have changed (e.g. keyframes).
 
-## Functions ##
+## Functions
 
-### SbMediaCanPlayMimeAndKeySystem ###
+### SbMediaCanPlayMimeAndKeySystem
 
 Returns information about whether the playback of the specific media described
 by `mime` and encrypted using `key_system` can be played.
@@ -480,13 +480,13 @@
 implementation supports key system with attributes on one key system, it has to
 support key system with attributes on all key systems supported.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMediaSupportType SbMediaCanPlayMimeAndKeySystem(const char *mime, const char *key_system)
 ```
 
-### SbMediaGetAudioBufferBudget ###
+### SbMediaGetAudioBufferBudget
 
 Specifies the maximum amount of memory used by audio buffers of media source
 before triggering a garbage collection. A large value will cause more memory
@@ -494,13 +494,13 @@
 download audio data. Note that the app may experience significant difficulty if
 this value is too low.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetAudioBufferBudget()
 ```
 
-### SbMediaGetAudioConfiguration ###
+### SbMediaGetAudioConfiguration
 
 Retrieves the current physical audio configuration of audio output
 `output_index` on this device and places it in `out_configuration`, which must
@@ -512,37 +512,37 @@
 `out_configuration`: The variable that holds the audio configuration
 information.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMediaGetAudioConfiguration(int output_index, SbMediaAudioConfiguration *out_configuration)
 ```
 
-### SbMediaGetAudioOutputCount ###
+### SbMediaGetAudioOutputCount
 
 Returns the number of audio outputs currently available on this device. Even if
 the number of outputs or their audio configurations can't be determined, it is
 expected that the platform will at least return a single output that supports at
 least stereo.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetAudioOutputCount()
 ```
 
-### SbMediaGetBufferAlignment ###
+### SbMediaGetBufferAlignment
 
 The media buffer will be allocated using the returned alignment. Set this to a
 larger value may increase the memory consumption of media buffers.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetBufferAlignment()
 ```
 
-### SbMediaGetBufferAllocationUnit ###
+### SbMediaGetBufferAllocationUnit
 
 When the media stack needs more memory to store media buffers, it will allocate
 extra memory in units returned by SbMediaGetBufferAllocationUnit. This can
@@ -550,13 +550,13 @@
 When SbMediaGetInitialBufferCapacity and this function both return 0, the media
 stack will allocate individual buffers directly using SbMemory functions.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetBufferAllocationUnit()
 ```
 
-### SbMediaGetBufferGarbageCollectionDurationThreshold ###
+### SbMediaGetBufferGarbageCollectionDurationThreshold
 
 Specifies the duration threshold of media source garbage collection. When the
 accumulated duration in a source buffer exceeds this value, the media source
@@ -567,54 +567,54 @@
 return 170 seconds for most of the platforms. But it can be further reduced on
 systems with extremely low memory.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTime SbMediaGetBufferGarbageCollectionDurationThreshold()
 ```
 
-### SbMediaGetBufferPadding ###
+### SbMediaGetBufferPadding
 
 Extra bytes allocated at the end of a media buffer to ensure that the buffer can
 be use optimally by specific instructions like SIMD. Set to 0 to remove any
 padding.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetBufferPadding()
 ```
 
-### SbMediaGetBufferStorageType ###
+### SbMediaGetBufferStorageType
 
 Returns SbMediaBufferStorageType of type `SbMediaStorageTypeMemory` or
 `SbMediaStorageTypeFile`. For memory storage, the media buffers will be stored
 in main memory allocated by SbMemory functions. For file storage, the media
 buffers will be stored in a temporary file in the system cache folder acquired
 by calling SbSystemGetPath() with "kSbSystemPathCacheDirectory". Note that when
-its value is "file" the media stack will still allocate memory to cache the the
+its value is "file" the media stack will still allocate memory to cache the
 buffers in use.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMediaBufferStorageType SbMediaGetBufferStorageType()
 ```
 
-### SbMediaGetInitialBufferCapacity ###
+### SbMediaGetInitialBufferCapacity
 
 The amount of memory that will be used to store media buffers allocated during
 system startup. To allocate a large chunk at startup helps with reducing
 fragmentation and can avoid failures to allocate incrementally. This can return
 0.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetInitialBufferCapacity()
 ```
 
-### SbMediaGetMaxBufferCapacity ###
+### SbMediaGetMaxBufferCapacity
 
 The maximum amount of memory that will be used to store media buffers. This must
 be larger than sum of the video budget and audio budget. This is a soft limit
@@ -629,13 +629,13 @@
 resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
 than non- HDR video.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetMaxBufferCapacity(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
 ```
 
-### SbMediaGetProgressiveBufferBudget ###
+### SbMediaGetProgressiveBufferBudget
 
 The memory used when playing mp4 videos that is not in DASH format. The
 resolution of such videos shouldn't go beyond 1080p. Its value should be less
@@ -647,13 +647,13 @@
 resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
 than non- HDR video.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetProgressiveBufferBudget(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
 ```
 
-### SbMediaGetVideoBufferBudget ###
+### SbMediaGetVideoBufferBudget
 
 Specifies the maximum amount of memory used by video buffers of media source
 before triggering a garbage collection. A large value will cause more memory
@@ -666,13 +666,13 @@
 resolution. `bits_per_pixel`: the bits per pixel. This value is larger for HDR
 than non- HDR video.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMediaGetVideoBufferBudget(SbMediaVideoCodec codec, int resolution_width, int resolution_height, int bits_per_pixel)
 ```
 
-### SbMediaIsBufferPoolAllocateOnDemand ###
+### SbMediaIsBufferPoolAllocateOnDemand
 
 When either SbMediaGetInitialBufferCapacity or SbMediaGetBufferAllocationUnit
 isn't zero, media buffers will be allocated using a memory pool. Set the
@@ -683,18 +683,18 @@
 release any media buffer memory back to the system even if there is no media
 buffers allocated.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMediaIsBufferPoolAllocateOnDemand()
 ```
 
-### SbMediaIsBufferUsingMemoryPool ###
+### SbMediaIsBufferUsingMemoryPool
 
 If SbMediaGetBufferUsingMemoryPool returns true, it indicates that media buffer
 pools should be allocated on demand, as opposed to using SbMemory* functions.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMediaIsBufferUsingMemoryPool()
diff --git a/cobalt/site/docs/reference/starboard/modules/memory.md b/cobalt/site/docs/reference/starboard/modules/memory.md
index 2fbf7dc..6dfa844 100644
--- a/cobalt/site/docs/reference/starboard/modules/memory.md
+++ b/cobalt/site/docs/reference/starboard/modules/memory.md
@@ -1,17 +1,17 @@
----
-layout: doc
-title: "Starboard Module Reference: memory.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `memory.h`
 
 Defines functions for memory allocation, alignment, copying, and comparing.
 
-## Porters ##
+## Porters
 
 All of the "Unchecked" and "Free" functions must be implemented, but they should
 not be called directly. The Starboard platform wraps them with extra accounting
 under certain circumstances.
 
-## Porters and Application Developers ##
+## Porters and Application Developers
 
 Nobody should call the "Checked", "Unchecked" or "Free" functions directly
 because that evades Starboard's memory tracking. In both port implementations
@@ -26,14 +26,14 @@
 
 *   The "free" functions are SbMemoryFree() and SbMemoryFreeAligned().
 
-## Enums ##
+## Enums
 
-### SbMemoryMapFlags ###
+### SbMemoryMapFlags
 
 The bitwise OR of these flags should be passed to SbMemoryMap to indicate how
 the mapped memory can be used.
 
-#### Values ####
+#### Values
 
 *   `kSbMemoryMapProtectReserved`
 
@@ -44,9 +44,9 @@
 *   `kSbMemoryMapProtectExec`
 *   `kSbMemoryMapProtectReadWrite`
 
-## Functions ##
+## Functions
 
-### SbMemoryAllocate ###
+### SbMemoryAllocate
 
 Allocates and returns a chunk of memory of at least `size` bytes. This function
 should be called from the client codebase. It is intended to be a drop-in
@@ -58,13 +58,13 @@
 return `NULL` or it may return a unique pointer value that can be passed to
 SbMemoryDeallocate.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocate(size_t size)
 ```
 
-### SbMemoryAllocateAligned ###
+### SbMemoryAllocateAligned
 
 Allocates and returns a chunk of memory of at least `size` bytes, aligned to
 `alignment`. This function should be called from the client codebase. It is
@@ -78,87 +78,87 @@
 `size` is `0`, the function may return `NULL` or it may return a unique aligned
 pointer value that can be passed to SbMemoryDeallocateAligned.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateAligned(size_t alignment, size_t size)
 ```
 
-### SbMemoryAllocateAlignedChecked ###
+### SbMemoryAllocateAlignedChecked
 
 Same as SbMemoryAllocateAlignedUnchecked, but will abort() in the case of an
 allocation failure.
 
 DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateAlignedChecked(size_t alignment, size_t size)
 ```
 
-### SbMemoryAllocateAlignedUnchecked ###
+### SbMemoryAllocateAlignedUnchecked
 
 This is the implementation of SbMemoryAllocateAligned that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateAlignedUnchecked(size_t alignment, size_t size)
 ```
 
-### SbMemoryAllocateChecked ###
+### SbMemoryAllocateChecked
 
 Same as SbMemoryAllocateUnchecked, but will abort() in the case of an allocation
 failure.
 
 DO NOT CALL. Call SbMemoryAllocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateChecked(size_t size)
 ```
 
-### SbMemoryAllocateNoReport ###
+### SbMemoryAllocateNoReport
 
 Same as SbMemoryAllocate() but will not report memory to the tracker. Avoid
 using this unless absolutely necessary.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateNoReport(size_t size)
 ```
 
-### SbMemoryAllocateUnchecked ###
+### SbMemoryAllocateUnchecked
 
 This is the implementation of SbMemoryAllocate that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryAllocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryAllocateUnchecked(size_t size)
 ```
 
-### SbMemoryCalloc ###
+### SbMemoryCalloc
 
 A wrapper that implements a drop-in replacement for `calloc`, which is used in
 some packages.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static void* SbMemoryCalloc(size_t count, size_t size)
 ```
 
-### SbMemoryDeallocate ###
+### SbMemoryDeallocate
 
 Frees a previously allocated chunk of memory. If `memory` is NULL, then the
 operation is a no-op. This function should be called from the client codebase.
@@ -166,74 +166,74 @@
 
 `memory`: The chunk of memory to be freed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryDeallocate(void *memory)
 ```
 
-### SbMemoryDeallocateAligned ###
+### SbMemoryDeallocateAligned
 
 `memory`: The chunk of memory to be freed. If `memory` is NULL, then the
 function is a no-op.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryDeallocateAligned(void *memory)
 ```
 
-### SbMemoryDeallocateNoReport ###
+### SbMemoryDeallocateNoReport
 
 Same as SbMemoryDeallocate() but will not report memory deallocation to the
 tracker. This function must be matched with SbMemoryAllocateNoReport().
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryDeallocateNoReport(void *memory)
 ```
 
-### SbMemoryFlush ###
+### SbMemoryFlush
 
 Flushes any data in the given virtual address range that is cached locally in
 the current processor core to physical memory, ensuring that data and
 instruction caches are cleared. This is required to be called on executable
 memory that has been written to and might be executed in the future.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryFlush(void *virtual_address, int64_t size_bytes)
 ```
 
-### SbMemoryFree ###
+### SbMemoryFree
 
 This is the implementation of SbMemoryDeallocate that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryDeallocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryFree(void *memory)
 ```
 
-### SbMemoryFreeAligned ###
+### SbMemoryFreeAligned
 
 This is the implementation of SbMemoryFreeAligned that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryDeallocateAligned(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMemoryFreeAligned(void *memory)
 ```
 
-### SbMemoryMap ###
+### SbMemoryMap
 
 Allocates `size_bytes` worth of physical memory pages and maps them into an
 available virtual region. This function returns `SB_MEMORY_MAP_FAILED` on
@@ -248,24 +248,24 @@
 should not count it against any memory budget. `name`: A value that appears in
 the debugger on some platforms. The value can be up to 32 bytes.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryMap(int64_t size_bytes, int flags, const char *name)
 ```
 
-### SbMemoryProtect ###
+### SbMemoryProtect
 
 Change the protection of `size_bytes` of memory regions, starting from
 `virtual_address`, to `flags`, returning `true` on success.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMemoryProtect(void *virtual_address, int64_t size_bytes, int flags)
 ```
 
-### SbMemoryReallocate ###
+### SbMemoryReallocate
 
 Attempts to resize `memory` to be at least `size` bytes, without touching the
 contents of memory.
@@ -285,39 +285,39 @@
 `memory` will be resized. If `size` is `0`, the function may return `NULL` or it
 may return a unique pointer value that can be passed to SbMemoryDeallocate.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryReallocate(void *memory, size_t size)
 ```
 
-### SbMemoryReallocateChecked ###
+### SbMemoryReallocateChecked
 
 Same as SbMemoryReallocateUnchecked, but will abort() in the case of an
 allocation failure.
 
 DO NOT CALL. Call SbMemoryReallocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryReallocateChecked(void *memory, size_t size)
 ```
 
-### SbMemoryReallocateUnchecked ###
+### SbMemoryReallocateUnchecked
 
 This is the implementation of SbMemoryReallocate that must be provided by
 Starboard ports.
 
 DO NOT CALL. Call SbMemoryReallocate(...) instead.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbMemoryReallocateUnchecked(void *memory, size_t size)
 ```
 
-### SbMemoryUnmap ###
+### SbMemoryUnmap
 
 Unmap `size_bytes` of physical pages starting from `virtual_address`, returning
 `true` on success. After this function completes, [virtual_address,
@@ -327,7 +327,7 @@
 `(void*)0xA000`, and another call to `SbMemoryMap(0x1000)` returns
 `(void*)0xB000`, `SbMemoryUnmap(0xA000, 0x2000)` should free both regions.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMemoryUnmap(void *virtual_address, int64_t size_bytes)
diff --git a/cobalt/site/docs/reference/starboard/modules/memory_reporter.md b/cobalt/site/docs/reference/starboard/modules/memory_reporter.md
index 4b4a539..d1273c6 100644
--- a/cobalt/site/docs/reference/starboard/modules/memory_reporter.md
+++ b/cobalt/site/docs/reference/starboard/modules/memory_reporter.md
@@ -1,57 +1,57 @@
----
-layout: doc
-title: "Starboard Module Reference: memory_reporter.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `memory_reporter.h`
 
 Provides an interface for memory reporting.
 
-## Typedefs ##
+## Typedefs
 
-### SbMemoryReporterOnAlloc ###
+### SbMemoryReporterOnAlloc
 
 A function to report a memory allocation from SbMemoryAllocate(). Note that
 operator new calls SbMemoryAllocate which will delegate to this callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnAlloc) (void *context, const void *memory, size_t size)
 ```
 
-### SbMemoryReporterOnDealloc ###
+### SbMemoryReporterOnDealloc
 
 A function to report a memory deallocation from SbMemoryDeallcoate(). Note that
 operator delete calls SbMemoryDeallocate which will delegate to this callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnDealloc) (void *context, const void *memory)
 ```
 
-### SbMemoryReporterOnMapMemory ###
+### SbMemoryReporterOnMapMemory
 
 A function to report a memory mapping from SbMemoryMap().
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnMapMemory) (void *context, const void *memory, size_t size)
 ```
 
-### SbMemoryReporterOnUnMapMemory ###
+### SbMemoryReporterOnUnMapMemory
 
 A function to report a memory unmapping from SbMemoryUnmap().
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbMemoryReporterOnUnMapMemory) (void *context, const void *memory, size_t size)
 ```
 
-## Structs ##
+## Structs
 
-### SbMemoryReporter ###
+### SbMemoryReporter
 
 SbMemoryReporter allows memory reporting via user-supplied functions. The void*
 context is passed to every call back. It's strongly recommended that C-Style
@@ -59,7 +59,7 @@
 compiler. For example, SbMemoryReporter mem_reporter = { MallocCallback, ....
 context };
 
-#### Members ####
+#### Members
 
 *   `SbMemoryReporterOnAlloc on_alloc_cb`
 
@@ -77,9 +77,9 @@
 
     Optional, is passed to callbacks as first argument.
 
-## Functions ##
+## Functions
 
-### SbMemorySetReporter ###
+### SbMemorySetReporter
 
 Sets the MemoryReporter. Any previous memory reporter is unset. No lifetime
 management is done internally on input pointer.
@@ -96,9 +96,8 @@
 SbMemoryReporter* mem_reporter = new ...; SbMemorySetReporter(&mem_reporter);
 ... SbMemorySetReporter(NULL); delete mem_reporter; // May crash.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMemorySetReporter(struct SbMemoryReporter *tracker)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/microphone.md b/cobalt/site/docs/reference/starboard/modules/microphone.md
index 1379f86..497cbe9 100644
--- a/cobalt/site/docs/reference/starboard/modules/microphone.md
+++ b/cobalt/site/docs/reference/starboard/modules/microphone.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: microphone.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `microphone.h`
 
 Defines functions for microphone creation, control, audio data fetching, and
 destruction. This module supports multiple calls to `SbMicrophoneOpen` and
@@ -31,23 +31,23 @@
 
 1.  Destroy the microphone with `SbMicrophoneDestroy`.
 
-## Macros ##
+## Macros
 
-### kSbMicrophoneIdInvalid ###
+### kSbMicrophoneIdInvalid
 
 Well-defined value for an invalid microphone ID handle.
 
-### kSbMicrophoneInvalid ###
+### kSbMicrophoneInvalid
 
 Well-defined value for an invalid microphone handle.
 
-## Enums ##
+## Enums
 
-### SbMicrophoneType ###
+### SbMicrophoneType
 
 All possible microphone types.
 
-#### Values ####
+#### Values
 
 *   `kSbMicrophoneCamera`
 
@@ -66,37 +66,37 @@
     Unknown microphone type. The microphone could be different than the other
     enum descriptions or could fall under one of those descriptions.
 
-## Typedefs ##
+## Typedefs
 
-### SbMicrophone ###
+### SbMicrophone
 
 An opaque handle to an implementation-private structure that represents a
 microphone.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbMicrophonePrivate* SbMicrophone
 ```
 
-### SbMicrophoneId ###
+### SbMicrophoneId
 
 An opaque handle to an implementation-private structure that represents a
 microphone ID.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbMicrophoneIdPrivate* SbMicrophoneId
 ```
 
-## Structs ##
+## Structs
 
-### SbMicrophoneInfo ###
+### SbMicrophoneInfo
 
 Microphone information.
 
-#### Members ####
+#### Members
 
 *   `SbMicrophoneId id`
 
@@ -116,9 +116,9 @@
     of the microphone type. For example, "Headset Microphone". The string must
     be null terminated.
 
-## Functions ##
+## Functions
 
-### SbMicrophoneClose ###
+### SbMicrophoneClose
 
 Closes the microphone port, stops recording audio on `microphone`, and clears
 the unread buffer if it is not empty. If the microphone has already been
@@ -127,13 +127,13 @@
 
 `microphone`: The microphone to close.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMicrophoneClose(SbMicrophone microphone)
 ```
 
-### SbMicrophoneCreate ###
+### SbMicrophoneCreate
 
 Creates a microphone with the specified ID, audio sample rate, and cached audio
 buffer size. Starboard only requires support for creating one microphone at a
@@ -153,25 +153,25 @@
 this buffer in smaller chunks than this size. This parameter must be set to a
 value greater than zero and the ideal size is `2^n`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMicrophone SbMicrophoneCreate(SbMicrophoneId id, int sample_rate_in_hz, int buffer_size_bytes)
 ```
 
-### SbMicrophoneDestroy ###
+### SbMicrophoneDestroy
 
 Destroys a microphone. If the microphone is in started state, it is first
 stopped and then destroyed. Any data that has been recorded and not read is
 thrown away.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbMicrophoneDestroy(SbMicrophone microphone)
 ```
 
-### SbMicrophoneGetAvailable ###
+### SbMicrophoneGetAvailable
 
 Retrieves all currently available microphone information and stores it in
 `out_info_array`. The return value is the number of the available microphones.
@@ -184,43 +184,43 @@
 placed into this output parameter. `info_array_size`: The size of
 `out_info_array`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMicrophoneGetAvailable(SbMicrophoneInfo *out_info_array, int info_array_size)
 ```
 
-### SbMicrophoneIdIsValid ###
+### SbMicrophoneIdIsValid
 
 Indicates whether the given microphone ID is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbMicrophoneIdIsValid(SbMicrophoneId id)
 ```
 
-### SbMicrophoneIsSampleRateSupported ###
+### SbMicrophoneIsSampleRateSupported
 
 Indicates whether the microphone supports the sample rate.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMicrophoneIsSampleRateSupported(SbMicrophoneId id, int sample_rate_in_hz)
 ```
 
-### SbMicrophoneIsValid ###
+### SbMicrophoneIsValid
 
 Indicates whether the given microphone is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbMicrophoneIsValid(SbMicrophone microphone)
 ```
 
-### SbMicrophoneOpen ###
+### SbMicrophoneOpen
 
 Opens the microphone port and starts recording audio on `microphone`.
 
@@ -230,13 +230,13 @@
 open. `microphone`: The microphone that will be opened and will start recording
 audio.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMicrophoneOpen(SbMicrophone microphone)
 ```
 
-### SbMicrophoneRead ###
+### SbMicrophoneRead
 
 Retrieves the recorded audio data from the microphone and writes that data to
 `out_audio_data`.
@@ -255,7 +255,7 @@
 smaller than `min_read_size` of `SbMicrophoneInfo`, the extra audio data that
 has already been read from the device is discarded.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbMicrophoneRead(SbMicrophone microphone, void *out_audio_data, int audio_data_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/mutex.md b/cobalt/site/docs/reference/starboard/modules/mutex.md
index 58f1907..9c18999 100644
--- a/cobalt/site/docs/reference/starboard/modules/mutex.md
+++ b/cobalt/site/docs/reference/starboard/modules/mutex.md
@@ -1,24 +1,24 @@
----
-layout: doc
-title: "Starboard Module Reference: mutex.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `mutex.h`
 
 Defines a mutually exclusive lock that can be used to coordinate with other
 threads.
 
-## Macros ##
+## Macros
 
-### SB_MUTEX_MAX_SIZE ###
+### SB_MUTEX_MAX_SIZE
 
 Max size of the SbMutex type.
 
-## Enums ##
+## Enums
 
-### SbMutexResult ###
+### SbMutexResult
 
 Enumeration of possible results from acquiring a mutex.
 
-#### Values ####
+#### Values
 
 *   `kSbMutexAcquired`
 
@@ -30,22 +30,22 @@
 
     The mutex has already been destroyed.
 
-## Typedefs ##
+## Typedefs
 
-### SbMutex ###
+### SbMutex
 
 An opaque handle to a mutex type with reserved memory buffer of size
 SB_MUTEX_MAX_SIZE and aligned at void pointer type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef union SbMutex  SbMutex
 ```
 
-## Functions ##
+## Functions
 
-### SbMutexAcquire ###
+### SbMutexAcquire
 
 Acquires `mutex`, blocking indefinitely. The return value identifies the
 acquisition result. SbMutexes are not reentrant, so a recursive acquisition
@@ -53,13 +53,13 @@
 
 `mutex`: The mutex to be acquired.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMutexResult SbMutexAcquire(SbMutex *mutex)
 ```
 
-### SbMutexAcquireTry ###
+### SbMutexAcquireTry
 
 Acquires `mutex`, without blocking. The return value identifies the acquisition
 result. SbMutexes are not reentrant, so a recursive acquisition has undefined
@@ -67,52 +67,52 @@
 
 `mutex`: The mutex to be acquired.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbMutexResult SbMutexAcquireTry(SbMutex *mutex)
 ```
 
-### SbMutexCreate ###
+### SbMutexCreate
 
 Creates a new mutex. The return value indicates whether the function was able to
 create a new mutex.
 
 `out_mutex`: The handle to the newly created mutex.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMutexCreate(SbMutex *out_mutex)
 ```
 
-### SbMutexDestroy ###
+### SbMutexDestroy
 
 Destroys a mutex. The return value indicates whether the destruction was
 successful. Destroying a locked mutex results in undefined behavior.
 
 `mutex`: The mutex to be invalidated.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMutexDestroy(SbMutex *mutex)
 ```
 
-### SbMutexIsSuccess ###
+### SbMutexIsSuccess
 
 Indicates whether the given result is a success. A value of `true` indicates
 that the mutex was acquired.
 
 `result`: The result being checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbMutexIsSuccess(SbMutexResult result)
 ```
 
-### SbMutexRelease ###
+### SbMutexRelease
 
 Releases `mutex` held by the current thread. The return value indicates whether
 the release was successful. Releases should always be successful if `mutex` is
@@ -120,7 +120,7 @@
 
 `mutex`: The mutex to be released.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbMutexRelease(SbMutex *mutex)
diff --git a/cobalt/site/docs/reference/starboard/modules/once.md b/cobalt/site/docs/reference/starboard/modules/once.md
index ce3c4d6..3088cd9 100644
--- a/cobalt/site/docs/reference/starboard/modules/once.md
+++ b/cobalt/site/docs/reference/starboard/modules/once.md
@@ -1,43 +1,43 @@
----
-layout: doc
-title: "Starboard Module Reference: once.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `once.h`
 
 Onces represent initializations that should only ever happen once per process,
 in a thread-safe way.
 
-## Macros ##
+## Macros
 
-### SB_ONCE_MAX_SIZE ###
+### SB_ONCE_MAX_SIZE
 
 Max size of the SbOnceControl type.
 
-## Typedefs ##
+## Typedefs
 
-### SbOnceControl ###
+### SbOnceControl
 
 An opaque handle to a once control type with reserved memory buffer of size
 SB_ONCE_MAX_SIZE and aligned at void pointer type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef union SbOnceControl  SbOnceControl
 ```
 
-### SbOnceInitRoutine ###
+### SbOnceInitRoutine
 
 Function pointer type for methods that can be called via the SbOnce() system.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbOnceInitRoutine) (void)
 ```
 
-## Functions ##
+## Functions
 
-### SbOnce ###
+### SbOnce
 
 Thread-safely runs `init_routine` only once.
 
@@ -50,7 +50,7 @@
 *   If `once_control` or `init_routine` is invalid, the function returns
     `false`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbOnce(SbOnceControl *once_control, SbOnceInitRoutine init_routine)
diff --git a/cobalt/site/docs/reference/starboard/modules/player.md b/cobalt/site/docs/reference/starboard/modules/player.md
index 8039f6b..0382642 100644
--- a/cobalt/site/docs/reference/starboard/modules/player.md
+++ b/cobalt/site/docs/reference/starboard/modules/player.md
@@ -1,53 +1,53 @@
----
-layout: doc
-title: "Starboard Module Reference: player.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `player.h`
 
 Defines an interface for controlling playback of media elementary streams.
 
-## Macros ##
+## Macros
 
-### SB_PLAYER_INITIAL_TICKET ###
+### SB_PLAYER_INITIAL_TICKET
 
 The value of the initial ticket held by the player before the first seek. The
 player will use this ticket value to make the first call to SbPlayerStatusFunc
 with kSbPlayerStateInitialized.
 
-### SB_PLAYER_NO_DURATION ###
+### SB_PLAYER_NO_DURATION
 
 The value to pass into SbPlayerCreate's `duration_pts` argument for cases where
 the duration is unknown, such as for live streams.
 
-### kSbPlayerInvalid ###
+### kSbPlayerInvalid
 
 Well-defined value for an invalid player.
 
-### kSbPlayerWriteDurationLocal ###
+### kSbPlayerWriteDurationLocal
 
 The audio write duration when all the audio connectors are local.
 
-### kSbPlayerWriteDurationRemote ###
+### kSbPlayerWriteDurationRemote
 
 The audio write duration when at least one of the audio connectors are remote.
 
-## Enums ##
+## Enums
 
-### SbPlayerDecoderState ###
+### SbPlayerDecoderState
 
 An indicator of whether the decoder can accept more samples.
 
-#### Values ####
+#### Values
 
 *   `kSbPlayerDecoderStateNeedsData`
 
     The decoder is asking for one more sample.
 
-### SbPlayerSampleSideDataType ###
+### SbPlayerSampleSideDataType
 
 Identify the type of side data accompanied with `SbPlayerSampleInfo`, as side
 data may come from multiple sources.
 
-#### Values ####
+#### Values
 
 *   `kMatroskaBlockAdditional`
 
@@ -56,11 +56,11 @@
     . The first 8 bytes of the data contains the value of BlockAddID in big
     endian format, followed by the content of BlockAdditional.
 
-### SbPlayerState ###
+### SbPlayerState
 
 An indicator of the general playback state.
 
-#### Values ####
+#### Values
 
 *   `kSbPlayerStateInitialized`
 
@@ -84,31 +84,31 @@
 
     The player has been destroyed, and will send no more callbacks.
 
-## Typedefs ##
+## Typedefs
 
-### SbPlayer ###
+### SbPlayer
 
 An opaque handle to an implementation-private structure representing a player.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbPlayerPrivate* SbPlayer
 ```
 
-### SbPlayerDeallocateSampleFunc ###
+### SbPlayerDeallocateSampleFunc
 
 Callback to free the given sample buffer data. When more than one buffer are
 sent in SbPlayerWriteSample(), the implementation only has to call this callback
-with `sample_buffer` points to the the first buffer.
+with `sample_buffer` points to the first buffer.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerDeallocateSampleFunc) (SbPlayer player, void *context, const void *sample_buffer)
 ```
 
-### SbPlayerDecoderStatusFunc ###
+### SbPlayerDecoderStatusFunc
 
 Callback for decoder status updates, called in response to a call to
 SbPlayerSeek() or SbPlayerWriteSample(). This callback will never be called
@@ -122,45 +122,45 @@
 SbPlayerWriteEndOfStream(). The player implementation should update the decoder
 status again after such call to notify its user to continue writing more frames.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerDecoderStatusFunc) (SbPlayer player, void *context, SbMediaType type, SbPlayerDecoderState state, int ticket)
 ```
 
-### SbPlayerErrorFunc ###
+### SbPlayerErrorFunc
 
 Callback for player errors, that may set a `message`. `error`: indicates the
 error code. `message`: provides specific informative diagnostic message about
 the error condition encountered. It is ok for the message to be an empty string
 or NULL if no information is available.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerErrorFunc) (SbPlayer player, void *context, SbPlayerError error, const char *message)
 ```
 
-### SbPlayerStatusFunc ###
+### SbPlayerStatusFunc
 
 Callback for player status updates. These callbacks will happen on a different
 thread than the calling thread, and it is not valid to call SbPlayer functions
 from within this callback.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbPlayerStatusFunc) (SbPlayer player, void *context, SbPlayerState state, int ticket)
 ```
 
-## Structs ##
+## Structs
 
-### SbPlayerCreationParam ###
+### SbPlayerCreationParam
 
 The playback related parameters to pass into SbPlayerCreate() and
 SbPlayerGetPreferredOutputMode().
 
-#### Members ####
+#### Members
 
 *   `SbDrmSystem drm_system`
 
@@ -186,11 +186,11 @@
     should be made available for the application to pull via calls to
     SbPlayerGetCurrentFrame().
 
-### SbPlayerInfo ###
+### SbPlayerInfo
 
 Information about the current media playback state.
 
-#### Members ####
+#### Members
 
 *   `SbTime current_media_timestamp`
 
@@ -237,11 +237,11 @@
     faster than normal speed. When it is less than one, the video is played in a
     slower than normal speed. Negative speeds are not supported.
 
-### SbPlayerSampleInfo ###
+### SbPlayerSampleInfo
 
 Information about the samples to be written into SbPlayerWriteSamples().
 
-#### Members ####
+#### Members
 
 *   `SbMediaType type`
 *   `const void * buffer`
@@ -274,12 +274,12 @@
     The DRM system related info for the media sample. This value is required for
     encrypted samples. Otherwise, it must be `NULL`.
 
-### SbPlayerSampleSideData ###
+### SbPlayerSampleSideData
 
 Side data accompanied with `SbPlayerSampleInfo`, it can be arbitrary binary data
 coming from multiple sources.
 
-#### Members ####
+#### Members
 
 *   `SbPlayerSampleSideDataType type`
 *   `const uint8_t * data`
@@ -290,9 +290,9 @@
 
     The size of the data pointed by `data`, in bytes.
 
-## Functions ##
+## Functions
 
-### SbPlayerDestroy ###
+### SbPlayerDestroy
 
 Destroys `player`, freeing all associated resources.
 
@@ -307,13 +307,13 @@
     SbPlayerDestroy has been called on that player. `player`: The player to be
     destroyed. Must not be `kSbPlayerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerDestroy(SbPlayer player)
 ```
 
-### SbPlayerGetAudioConfiguration ###
+### SbPlayerGetAudioConfiguration
 
 Returns the audio configurations used by `player`.
 
@@ -371,13 +371,13 @@
 the audio output, refer to `SbMediaAudioConfiguration` for more details. Must
 not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbPlayerGetAudioConfiguration(SbPlayer player, int index, SbMediaAudioConfiguration *out_audio_configuration)
 ```
 
-### SbPlayerGetCurrentFrame ###
+### SbPlayerGetCurrentFrame
 
 Given a player created with the kSbPlayerOutputModeDecodeToTexture output mode,
 it will return a SbDecodeTarget representing the current frame to be rasterized.
@@ -389,13 +389,13 @@
 
 `player` must not be `kSbPlayerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbDecodeTarget SbPlayerGetCurrentFrame(SbPlayer player)
 ```
 
-### SbPlayerGetMaximumNumberOfSamplesPerWrite ###
+### SbPlayerGetMaximumNumberOfSamplesPerWrite
 
 Writes a single sample of the given media type to `player`'s input stream. Its
 data may be passed in via more than one buffers. The lifetime of
@@ -409,13 +409,13 @@
 of sample for which the number is retrieved. See the `SbMediaType` enum in
 media.h.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbPlayerGetMaximumNumberOfSamplesPerWrite(SbPlayer player, SbMediaType sample_type)
 ```
 
-### SbPlayerGetPreferredOutputMode ###
+### SbPlayerGetPreferredOutputMode
 
 Returns the preferred output mode of the implementation when a video described
 by `creation_param` is played. It is assumed that it is okay to call
@@ -433,23 +433,23 @@
 and the implementation should try its best effort to return a valid output mode.
 `creation_param` must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbPlayerOutputMode SbPlayerGetPreferredOutputMode(const SbPlayerCreationParam *creation_param)
 ```
 
-### SbPlayerIsValid ###
+### SbPlayerIsValid
 
 Returns whether the given player handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbPlayerIsValid(SbPlayer player)
 ```
 
-### SbPlayerSetBounds ###
+### SbPlayerSetBounds
 
 Sets the player bounds to the given graphics plane coordinates. The changes do
 not take effect until the next graphics frame buffer swap. The default bounds
@@ -470,13 +470,13 @@
 `y`: The y-coordinate of the upper-left corner of the player. `width`: The width
 of the player, in pixels. `height`: The height of the player, in pixels.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerSetBounds(SbPlayer player, int z_index, int x, int y, int width, int height)
 ```
 
-### SbPlayerSetPlaybackRate ###
+### SbPlayerSetPlaybackRate
 
 Set the playback rate of the `player`. `rate` is default to 1.0 which indicates
 the playback is at its original speed. A `rate` greater than one will make the
@@ -491,13 +491,13 @@
 
 `player` must not be `kSbPlayerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbPlayerSetPlaybackRate(SbPlayer player, double playback_rate)
 ```
 
-### SbPlayerSetVolume ###
+### SbPlayerSetVolume
 
 Sets the player's volume.
 
@@ -506,13 +506,13 @@
 `0.0` and `1.0`, inclusive. A value of `0.0` means that the audio should be
 muted, and a value of `1.0` means that it should be played at full volume.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerSetVolume(SbPlayer player, double volume)
 ```
 
-### SbPlayerWriteEndOfStream ###
+### SbPlayerWriteEndOfStream
 
 Writes a marker to `player`'s input stream of `stream_type` indicating that
 there are no more samples for that media type for the remainder of this media
@@ -522,13 +522,13 @@
 `player`: The player to which the marker is written. `stream_type`: The type of
 stream for which the marker is written.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerWriteEndOfStream(SbPlayer player, SbMediaType stream_type)
 ```
 
-### SbPlayerWriteSamples ###
+### SbPlayerWriteSamples
 
 `sample_type`: The type of sample being written. See the `SbMediaType` enum in
 media.h. `sample_infos`: A pointer to an array of SbPlayerSampleInfo with
@@ -540,7 +540,7 @@
 `sample_infos`. It has to be at least one, and less than the return value of
 SbPlayerGetMaximumNumberOfSamplesPerWrite().
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbPlayerWriteSamples(SbPlayer player, SbMediaType sample_type, const SbPlayerSampleInfo *sample_infos, int number_of_sample_infos)
diff --git a/cobalt/site/docs/reference/starboard/modules/socket.md b/cobalt/site/docs/reference/starboard/modules/socket.md
index 9e0f81b..744c04e 100644
--- a/cobalt/site/docs/reference/starboard/modules/socket.md
+++ b/cobalt/site/docs/reference/starboard/modules/socket.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: socket.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `socket.h`
 
 Defines Starboard socket I/O functions. Starboard supports IPv4 and IPv6, TCP
 and UDP, server and client sockets. Some platforms may not support IPv6, some
@@ -18,19 +18,19 @@
 TODO: For platforms that do not support sockets at all, they must support at
 least a high-level HTTP client API (to be defined later).
 
-## Macros ##
+## Macros
 
-### kSbSocketInvalid ###
+### kSbSocketInvalid
 
 Well-defined value for an invalid socket handle.
 
-## Enums ##
+## Enums
 
-### SbSocketAddressType ###
+### SbSocketAddressType
 
 All possible address types.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketAddressTypeIpv4`
 
@@ -39,13 +39,13 @@
 
     An IPv6 address, which uses 16 entries of the address buffer.
 
-### SbSocketError ###
+### SbSocketError
 
 Enumeration of all Starboard socket operation results. Despite the enum name,
 note that the value actually describes the outcome of an operation, which is not
 always an error.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketOk`
 
@@ -63,11 +63,11 @@
 
     The operation failed for some other reason not specified above.
 
-### SbSocketProtocol ###
+### SbSocketProtocol
 
 All possible IP socket types.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketProtocolTcp`
 
@@ -77,11 +77,11 @@
     The UDP/IP protocol, an unreliable, connectionless, discrete packet
     (datagram) protocol.
 
-### SbSocketResolveFilter ###
+### SbSocketResolveFilter
 
 Bits that can be set when calling SbSocketResolve to filter the results.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketResolveFilterNone`
 
@@ -93,25 +93,25 @@
 
     Include Ipv6 addresses.
 
-## Typedefs ##
+## Typedefs
 
-### SbSocket ###
+### SbSocket
 
 A handle to a socket.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbSocketPrivate* SbSocket
 ```
 
-## Structs ##
+## Structs
 
-### SbSocketAddress ###
+### SbSocketAddress
 
 A representation of any possible supported address type.
 
-#### Members ####
+#### Members
 
 *   `uint8_t address`
 
@@ -126,11 +126,11 @@
     The port component of this socket address. If not specified, it will be
     zero, which is officially undefined.
 
-### SbSocketResolution ###
+### SbSocketResolution
 
 The result of a host name resolution.
 
-#### Members ####
+#### Members
 
 *   `SbSocketAddress* addresses`
 
@@ -139,9 +139,9 @@
 
     The length of the `addresses` array.
 
-## Functions ##
+## Functions
 
-### SbSocketAccept ###
+### SbSocketAccept
 
 Accepts a pending connection on `socket` and returns a new SbSocket representing
 that connection. This function sets the error on `socket` and returns
@@ -149,13 +149,13 @@
 
 `socket`: The SbSocket that is accepting a pending connection.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocket SbSocketAccept(SbSocket socket)
 ```
 
-### SbSocketBind ###
+### SbSocketBind
 
 Binds `socket` to a specific local interface and port specified by
 `local_address`. This function sets and returns the socket error if it is unable
@@ -170,24 +170,24 @@
 *   Setting the IP address to `0.0.0.0` means that the socket should be bound to
     all interfaces.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketBind(SbSocket socket, const SbSocketAddress *local_address)
 ```
 
-### SbSocketClearLastError ###
+### SbSocketClearLastError
 
 Clears the last error set on `socket`. The return value indicates whether the
 socket error was cleared.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketClearLastError(SbSocket socket)
 ```
 
-### SbSocketConnect ###
+### SbSocketConnect
 
 Opens a connection of `socket`'s type to the host and port specified by
 `address`. This function sets and returns the socket error if it is unable to
@@ -197,13 +197,13 @@
 `socket`: The type of connection that should be opened. `address`: The host and
 port to which the socket should connect.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketConnect(SbSocket socket, const SbSocketAddress *address)
 ```
 
-### SbSocketCreate ###
+### SbSocketCreate
 
 Creates a new non-blocking socket for protocol `protocol` using address family
 `address_type`.
@@ -216,13 +216,13 @@
 `address_type`: The type of IP address to use for the socket. `protocol`: The
 protocol to use for the socket.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocket SbSocketCreate(SbSocketAddressType address_type, SbSocketProtocol protocol)
 ```
 
-### SbSocketDestroy ###
+### SbSocketDestroy
 
 Destroys the `socket` by flushing it, closing any connection that may be active
 on it, and reclaiming any resources associated with it, including any
@@ -234,25 +234,25 @@
 
 `socket`: The SbSocket to be destroyed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketDestroy(SbSocket socket)
 ```
 
-### SbSocketFreeResolution ###
+### SbSocketFreeResolution
 
 Frees a resolution allocated by SbSocketResolve.
 
 `resolution`: The resolution to be freed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSocketFreeResolution(SbSocketResolution *resolution)
 ```
 
-### SbSocketGetInterfaceAddress ###
+### SbSocketGetInterfaceAddress
 
 Gets the source address and the netmask that would be used to connect to the
 destination. The netmask parameter is optional, and only populated if a non-NULL
@@ -288,26 +288,26 @@
 value is passed in, this function places the netmask associated with the source
 address in this output variable.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketGetInterfaceAddress(const SbSocketAddress *const destination, SbSocketAddress *out_source_address, SbSocketAddress *out_netmask)
 ```
 
-### SbSocketGetLastError ###
+### SbSocketGetLastError
 
 Returns the last error set on `socket`. If `socket` is not valid, this function
 returns `kSbSocketErrorFailed`.
 
 `socket`: The SbSocket that the last error is returned for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketGetLastError(SbSocket socket)
 ```
 
-### SbSocketGetLocalAddress ###
+### SbSocketGetLocalAddress
 
 Gets the address that this socket is bound to locally, if the socket is
 connected. The return value indicates whether the address was retrieved
@@ -316,59 +316,59 @@
 `socket`: The SbSocket for which the local address is retrieved. `out_address`:
 The SbSocket's local address.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketGetLocalAddress(SbSocket socket, SbSocketAddress *out_address)
 ```
 
-### SbSocketIsConnected ###
+### SbSocketIsConnected
 
 Indicates whether `socket` is connected to anything. Invalid sockets are not
 connected.
 
 `socket`: The SbSocket to be checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketIsConnected(SbSocket socket)
 ```
 
-### SbSocketIsConnectedAndIdle ###
+### SbSocketIsConnectedAndIdle
 
 Returns whether `socket` is connected to anything, and, if so, whether it is
 receiving any data.
 
 `socket`: The SbSocket to be checked.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketIsConnectedAndIdle(SbSocket socket)
 ```
 
-### SbSocketIsIpv6Supported ###
+### SbSocketIsIpv6Supported
 
 Returns whether IPV6 is supported on the current platform.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketIsIpv6Supported()
 ```
 
-### SbSocketIsValid ###
+### SbSocketIsValid
 
 Returns whether the given socket handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbSocketIsValid(SbSocket socket)
 ```
 
-### SbSocketJoinMulticastGroup ###
+### SbSocketJoinMulticastGroup
 
 Joins `socket` to an IP multicast group identified by `address`. The equivalent
 of IP_ADD_MEMBERSHIP. The return value indicates whether the socket was joined
@@ -377,13 +377,13 @@
 `socket`: The SbSocket to be joined to the IP multicast group. `address`: The
 location of the IP multicast group.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketJoinMulticastGroup(SbSocket socket, const SbSocketAddress *address)
 ```
 
-### SbSocketListen ###
+### SbSocketListen
 
 Causes `socket` to listen on the local address that `socket` was previously
 bound to by SbSocketBind. This function sets and returns the socket error if it
@@ -392,13 +392,13 @@
 
 `socket`: The SbSocket on which the function operates.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketError SbSocketListen(SbSocket socket)
 ```
 
-### SbSocketReceiveFrom ###
+### SbSocketReceiveFrom
 
 Reads up to `data_size` bytes from `socket` into `out_data` and places the
 source address of the packet in `out_source` if out_source is not NULL. Returns
@@ -420,13 +420,13 @@
 the socket. Must not be NULL. `data_size`: The number of bytes to read.
 `out_source`: The source address of the packet.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSocketReceiveFrom(SbSocket socket, char *out_data, int data_size, SbSocketAddress *out_source)
 ```
 
-### SbSocketResolve ###
+### SbSocketResolve
 
 Synchronously resolves `hostname` into the returned SbSocketResolution , which
 must be freed with SbSocketFreeResolution. The function returns `NULL` if it is
@@ -438,13 +438,13 @@
 However, if one IP address family filter is specified, only that address family
 is included. The function ignores unrecognized filter bits.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketResolution* SbSocketResolve(const char *hostname, int filters)
 ```
 
-### SbSocketSendTo ###
+### SbSocketSendTo
 
 Writes up to `data_size` bytes of `data` to `destination` via `socket`. Returns
 the number of bytes written, or a negative number if there is an error, in which
@@ -466,13 +466,13 @@
 connected persistently, so setting `destination` when sending to a TCP socket
 will cause an error.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSocketSendTo(SbSocket socket, const char *data, int data_size, const SbSocketAddress *destination)
 ```
 
-### SbSocketSetBroadcast ###
+### SbSocketSetBroadcast
 
 Sets the `SO_BROADCAST`, or equivalent, option to `value` on `socket`. The
 return value indicates whether the option was actually set.
@@ -483,13 +483,13 @@
 `socket`: The SbSocket for which the option is set. `value`: The new value for
 the option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetBroadcast(SbSocket socket, bool value)
 ```
 
-### SbSocketSetReceiveBufferSize ###
+### SbSocketSetReceiveBufferSize
 
 Sets the `SO_RCVBUF`, or equivalent, option to `size` on `socket`. The return
 value indicates whether the option was actually set.
@@ -497,13 +497,13 @@
 `socket`: The SbSocket for which the option is set. `size`: The value for the
 option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetReceiveBufferSize(SbSocket socket, int32_t size)
 ```
 
-### SbSocketSetReuseAddress ###
+### SbSocketSetReuseAddress
 
 Sets the `SO_REUSEADDR`, or equivalent, option to `value` on `socket`. The
 return value indicates whether the option was actually set.
@@ -514,13 +514,13 @@
 `socket`: The SbSocket for which the option is set. `value`: The new value for
 the option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetReuseAddress(SbSocket socket, bool value)
 ```
 
-### SbSocketSetSendBufferSize ###
+### SbSocketSetSendBufferSize
 
 Sets the `SO_SNDBUF`, or equivalent, option to `size` on `socket`. The return
 value indicates whether the option was actually set.
@@ -528,13 +528,13 @@
 `socket`: The SbSocket for which the option is set. `size`: The value for the
 option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetSendBufferSize(SbSocket socket, int32_t size)
 ```
 
-### SbSocketSetTcpKeepAlive ###
+### SbSocketSetTcpKeepAlive
 
 Sets the `SO_KEEPALIVE`, or equivalent, option to `value` on `socket`. The
 return value indicates whether the option was actually set.
@@ -545,13 +545,13 @@
 The time between keep-alive packets. This value is only relevant if `value` is
 `true`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetTcpKeepAlive(SbSocket socket, bool value, SbTime period)
 ```
 
-### SbSocketSetTcpNoDelay ###
+### SbSocketSetTcpNoDelay
 
 Sets the `TCP_NODELAY`, or equivalent, option to `value` on `socket`. The return
 value indicates whether the option was actually set.
@@ -564,13 +564,13 @@
 `socket`: The SbSocket for which the option is set. `value`: Indicates whether
 the Nagle algorithm should be disabled (`value`=`true`).
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetTcpNoDelay(SbSocket socket, bool value)
 ```
 
-### SbSocketSetTcpWindowScaling ###
+### SbSocketSetTcpWindowScaling
 
 Sets the `SO_WINSCALE`, or equivalent, option to `value` on `socket`. The return
 value indicates whether the option was actually set.
@@ -578,7 +578,7 @@
 `socket`: The SbSocket for which the option is set. `value`: The value for the
 option.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketSetTcpWindowScaling(SbSocket socket, bool value)
diff --git a/cobalt/site/docs/reference/starboard/modules/socket_waiter.md b/cobalt/site/docs/reference/starboard/modules/socket_waiter.md
index 738fafb..146938c 100644
--- a/cobalt/site/docs/reference/starboard/modules/socket_waiter.md
+++ b/cobalt/site/docs/reference/starboard/modules/socket_waiter.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: socket_waiter.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `socket_waiter.h`
 
 Allows a thread to wait on many sockets at once. The standard usage pattern
 would be for a single I/O thread to:
@@ -26,19 +26,19 @@
 queuing the work item, or the SbSocketWaiter is not otherwise guaranteed to wake
 up.
 
-## Macros ##
+## Macros
 
-### kSbSocketWaiterInvalid ###
+### kSbSocketWaiterInvalid
 
 Well-defined value for an invalid socket watcher handle.
 
-## Enums ##
+## Enums
 
-### SbSocketWaiterInterest ###
+### SbSocketWaiterInterest
 
 All the interests that a socket may register for on a waiter.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketWaiterInterestNone`
 
@@ -50,11 +50,11 @@
 
     An interest in or readiness to write to a socket without blocking.
 
-### SbSocketWaiterResult ###
+### SbSocketWaiterResult
 
 Possible reasons why a call to SbSocketWaiterWaitTimed returned.
 
-#### Values ####
+#### Values
 
 *   `kSbSocketWaiterResultInvalid`
 
@@ -66,31 +66,31 @@
 
     The wait stopped because a call to SbSocketWaiterWakeUp was consumed.
 
-## Typedefs ##
+## Typedefs
 
-### SbSocketWaiter ###
+### SbSocketWaiter
 
 A handle to a socket waiter.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbSocketWaiterPrivate* SbSocketWaiter
 ```
 
-### SbSocketWaiterCallback ###
+### SbSocketWaiterCallback
 
 Function pointer for socket waiter callbacks.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbSocketWaiterCallback) (SbSocketWaiter waiter, SbSocket socket, void *context, int ready_interests)
 ```
 
-## Functions ##
+## Functions
 
-### SbSocketWaiterAdd ###
+### SbSocketWaiterAdd
 
 Adds a new socket to be waited on by the `waiter` with a bitfield of
 `interests`. This function should only be called on the thread that waits on
@@ -120,25 +120,25 @@
     `callback`, even if not all registered `interests` became ready, which
     allows for adding it again in the `callback`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketWaiterAdd(SbSocketWaiter waiter, SbSocket socket, void *context, SbSocketWaiterCallback callback, int interests, bool persistent)
 ```
 
-### SbSocketWaiterCreate ###
+### SbSocketWaiterCreate
 
 The results of two threads waiting on the same waiter is undefined and will not
 work. Except for the SbSocketWaiterWakeUp() function, SbSocketWaiters are not
 thread-safe and don't expect to be modified concurrently.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketWaiter SbSocketWaiterCreate()
 ```
 
-### SbSocketWaiterDestroy ###
+### SbSocketWaiterDestroy
 
 Destroys `waiter` and removes all sockets still registered by way of
 SbSocketWaiterAdd. This function may be called on any thread as long as there is
@@ -146,23 +146,23 @@
 
 `waiter`: The SbSocketWaiter to be destroyed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketWaiterDestroy(SbSocketWaiter waiter)
 ```
 
-### SbSocketWaiterIsValid ###
+### SbSocketWaiterIsValid
 
 Returns whether the given socket handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbSocketWaiterIsValid(SbSocketWaiter watcher)
 ```
 
-### SbSocketWaiterRemove ###
+### SbSocketWaiterRemove
 
 Removes a socket, previously added with SbSocketWaiterAdd(), from a waiter. This
 function should only be called on the thread that waits on this waiter.
@@ -174,26 +174,26 @@
 `waiter`: The waiter from which the socket is removed. `socket`: The socket to
 remove from the waiter.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSocketWaiterRemove(SbSocketWaiter waiter, SbSocket socket)
 ```
 
-### SbSocketWaiterWait ###
+### SbSocketWaiterWait
 
 Waits on all registered sockets, calling the registered callbacks if and when
 the corresponding sockets become ready for an interested operation. This version
 exits only after SbSocketWaiterWakeUp() is called. This function should only be
 called on the thread that waits on this waiter.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSocketWaiterWait(SbSocketWaiter waiter)
 ```
 
-### SbSocketWaiterWaitTimed ###
+### SbSocketWaiterWaitTimed
 
 Behaves similarly to SbSocketWaiterWait(), but this function also causes
 `waiter` to exit on its own after at least `duration` has passed if
@@ -207,13 +207,13 @@
 function may wait longer than `duration`, such as if the timeout expires while a
 callback is being fired.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSocketWaiterResult SbSocketWaiterWaitTimed(SbSocketWaiter waiter, SbTime duration)
 ```
 
-### SbSocketWaiterWakeUp ###
+### SbSocketWaiterWakeUp
 
 Wakes up `waiter` once. This is the only thread-safe waiter function. It can can
 be called from a SbSocketWaiterCallback to wake up its own waiter, and it can
@@ -230,7 +230,7 @@
 
 `waiter`: The socket waiter to be woken up.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSocketWaiterWakeUp(SbSocketWaiter waiter)
diff --git a/cobalt/site/docs/reference/starboard/modules/speech_synthesis.md b/cobalt/site/docs/reference/starboard/modules/speech_synthesis.md
index e46a2ca..ea4ad46 100644
--- a/cobalt/site/docs/reference/starboard/modules/speech_synthesis.md
+++ b/cobalt/site/docs/reference/starboard/modules/speech_synthesis.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: speech_synthesis.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `speech_synthesis.h`
 
 A basic text-to-speech API intended to be used for audio accessibility.
 
@@ -11,29 +11,29 @@
 Note that these functions do not have to be thread-safe. They must only be
 called from a single application thread.
 
-## Functions ##
+## Functions
 
-### SbSpeechSynthesisCancel ###
+### SbSpeechSynthesisCancel
 
 Cancels all speaking and queued speech synthesis audio. Must return immediately.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSpeechSynthesisCancel()
 ```
 
-### SbSpeechSynthesisIsSupported ###
+### SbSpeechSynthesisIsSupported
 
 Returns whether the platform supports speech synthesis
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSpeechSynthesisIsSupported()
 ```
 
-### SbSpeechSynthesisSpeak ###
+### SbSpeechSynthesisSpeak
 
 Enqueues `text`, a UTF-8 string, to be spoken. Returns immediately.
 
@@ -44,7 +44,7 @@
 the current speaking should continue and this new text should be queued to play
 when the previous utterances are complete.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSpeechSynthesisSpeak(const char *text)
diff --git a/cobalt/site/docs/reference/starboard/modules/storage.md b/cobalt/site/docs/reference/starboard/modules/storage.md
index c98207b..b486ac8 100644
--- a/cobalt/site/docs/reference/starboard/modules/storage.md
+++ b/cobalt/site/docs/reference/starboard/modules/storage.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: storage.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `storage.h`
 
 Defines a user-based Storage API. This is a simple, all-at-once BLOB storage and
 retrieval API that is intended for robust long-term, per-user storage. Some
@@ -15,27 +15,27 @@
 These APIs are NOT expected to be thread-safe, so either call them from a single
 thread, or perform proper synchronization around all calls.
 
-## Macros ##
+## Macros
 
-### kSbStorageInvalidRecord ###
+### kSbStorageInvalidRecord
 
 Well-defined value for an invalid storage record handle.
 
-## Typedefs ##
+## Typedefs
 
-### SbStorageRecord ###
+### SbStorageRecord
 
 A handle to an open storage record.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbStorageRecordPrivate* SbStorageRecord
 ```
 
-## Functions ##
+## Functions
 
-### SbStorageCloseRecord ###
+### SbStorageCloseRecord
 
 Closes `record`, synchronously ensuring that all written data is flushed. This
 function performs blocking I/O on the calling thread.
@@ -47,13 +47,13 @@
 `record`: The storage record to close. `record` is invalid after this point, and
 subsequent calls referring to `record` will fail.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbStorageCloseRecord(SbStorageRecord record)
 ```
 
-### SbStorageDeleteRecord ###
+### SbStorageDeleteRecord
 
 Deletes the `SbStorageRecord` for `user` named `name`. The return value
 indicates whether the record existed and was successfully deleted. If the record
@@ -68,36 +68,36 @@
 `user`: The user for whom the record will be deleted. `name`: The filesystem-
 safe name of the record to open.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbStorageDeleteRecord(SbUser user, const char *name)
 ```
 
-### SbStorageGetRecordSize ###
+### SbStorageGetRecordSize
 
 Returns the size of `record`, or `-1` if there is an error. This function
 performs blocking I/O on the calling thread.
 
 `record`: The record to retrieve the size of.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbStorageGetRecordSize(SbStorageRecord record)
 ```
 
-### SbStorageIsValidRecord ###
+### SbStorageIsValidRecord
 
 Returns whether the given storage record handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbStorageIsValidRecord(SbStorageRecord record)
 ```
 
-### SbStorageOpenRecord ###
+### SbStorageOpenRecord
 
 Opens and returns the SbStorageRecord for `user` named `name`, blocking I/O on
 the calling thread until the open is completed. If `user` is not a valid
@@ -111,13 +111,13 @@
 `user`: The user for which the storage record will be opened. `name`: The
 filesystem-safe name of the record to open.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbStorageRecord SbStorageOpenRecord(SbUser user, const char *name)
 ```
 
-### SbStorageReadRecord ###
+### SbStorageReadRecord
 
 Reads up to `data_size` bytes from `record`, starting at the beginning of the
 record. The function returns the actual number of bytes read, which must be <=
@@ -128,13 +128,13 @@
 `record`: The record to be read. `out_data`: The data read from the record.
 `data_size`: The amount of data, in bytes, to read.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbStorageReadRecord(SbStorageRecord record, char *out_data, int64_t data_size)
 ```
 
-### SbStorageWriteRecord ###
+### SbStorageWriteRecord
 
 Replaces the data in `record` with `data_size` bytes from `data`. This function
 always deletes any previous data in that record. The return value indicates
@@ -151,7 +151,7 @@
 `record`: The record to be written to. `data`: The data to write to the record.
 `data_size`: The amount of `data`, in bytes, to write to the record.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbStorageWriteRecord(SbStorageRecord record, const char *data, int64_t data_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/string.md b/cobalt/site/docs/reference/starboard/modules/string.md
index 95790d4..5e97968 100644
--- a/cobalt/site/docs/reference/starboard/modules/string.md
+++ b/cobalt/site/docs/reference/starboard/modules/string.md
@@ -1,13 +1,13 @@
----
-layout: doc
-title: "Starboard Module Reference: string.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `string.h`
 
 Defines functions for interacting with c-style strings.
 
-## Functions ##
+## Functions
 
-### SbStringCompareNoCase ###
+### SbStringCompareNoCase
 
 Compares two strings, ignoring differences in case. The return value is:
 
@@ -21,13 +21,13 @@
 
 `string1`: The first string to compare. `string2`: The second string to compare.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringCompareNoCase(const char *string1, const char *string2)
 ```
 
-### SbStringCompareNoCaseN ###
+### SbStringCompareNoCaseN
 
 Compares the first `count` characters of two strings, ignoring differences in
 case. The return value is:
@@ -43,13 +43,13 @@
 `string1`: The first string to compare. `string2`: The second string to compare.
 `count`: The number of characters to compare.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringCompareNoCaseN(const char *string1, const char *string2, size_t count)
 ```
 
-### SbStringDuplicate ###
+### SbStringDuplicate
 
 Copies `source` into a buffer that is allocated by this function and that can be
 freed with SbMemoryDeallocate. This function is meant to be a drop-in
@@ -57,13 +57,13 @@
 
 `source`: The string to be copied.
 
-#### Declaration ####
+#### Declaration
 
 ```
 char* SbStringDuplicate(const char *source)
 ```
 
-### SbStringFormat ###
+### SbStringFormat
 
 Produces a string formatted with `format` and `arguments`, placing as much of
 the result that will fit into `out_buffer`. The return value specifies the
@@ -76,13 +76,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `arguments`: Variable arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringFormat(char *out_buffer, size_t buffer_size, const char *format, va_list arguments) SB_PRINTF_FORMAT(3
 ```
 
-### SbStringFormatF ###
+### SbStringFormatF
 
 An inline wrapper of SbStringFormat that converts from ellipsis to va_args. This
 function is meant to be a drop-in replacement for `snprintf`.
@@ -91,13 +91,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `...`: Arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int static int static int SbStringFormatF(char *out_buffer, size_t buffer_size, const char *format,...) SB_PRINTF_FORMAT(3
 ```
 
-### SbStringFormatUnsafeF ###
+### SbStringFormatUnsafeF
 
 An inline wrapper of SbStringFormat that is meant to be a drop-in replacement
 for the unsafe but commonly used `sprintf`.
@@ -106,13 +106,13 @@
 string that specifies how the data should be formatted. `...`: Arguments used in
 the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int static int SbStringFormatUnsafeF(char *out_buffer, const char *format,...) SB_PRINTF_FORMAT(2
 ```
 
-### SbStringFormatWide ###
+### SbStringFormatWide
 
 This function is identical to SbStringFormat, but is for wide characters. It is
 meant to be a drop-in replacement for `vswprintf`.
@@ -121,13 +121,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `arguments`: Variable arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringFormatWide(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format, va_list arguments)
 ```
 
-### SbStringFormatWideF ###
+### SbStringFormatWideF
 
 An inline wrapper of SbStringFormatWide that converts from ellipsis to
 `va_args`.
@@ -136,13 +136,13 @@
 The size of `out_buffer`. `format`: A string that specifies how the data should
 be formatted. `...`: Arguments used in the string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbStringFormatWideF(wchar_t *out_buffer, size_t buffer_size, const wchar_t *format,...)
 ```
 
-### SbStringScan ###
+### SbStringScan
 
 Scans `buffer` for `pattern`, placing the extracted values in `arguments`. The
 return value specifies the number of successfully matched items, which may be
@@ -154,20 +154,20 @@
 for in `buffer`. `arguments`: Values matching `pattern` that were extracted from
 `buffer`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbStringScan(const char *buffer, const char *pattern, va_list arguments)
 ```
 
-### SbStringScanF ###
+### SbStringScanF
 
 An inline wrapper of SbStringScan that converts from ellipsis to `va_args`. This
 function is meant to be a drop-in replacement for `sscanf`. `buffer`: The string
 to scan for the pattern. `pattern`: The string to search for in `buffer`. `...`:
 Values matching `pattern` that were extracted from `buffer`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int SbStringScanF(const char *buffer, const char *pattern,...)
diff --git a/cobalt/site/docs/reference/starboard/modules/system.md b/cobalt/site/docs/reference/starboard/modules/system.md
index 32fd303..86437a3 100644
--- a/cobalt/site/docs/reference/starboard/modules/system.md
+++ b/cobalt/site/docs/reference/starboard/modules/system.md
@@ -1,21 +1,21 @@
----
-layout: doc
-title: "Starboard Module Reference: system.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `system.h`
 
 Defines a broad set of APIs that allow the client application to query build and
 runtime properties of the enclosing system.
 
-## Enums ##
+## Enums
 
-### SbSystemCapabilityId ###
+### SbSystemCapabilityId
 
 Runtime capabilities are boolean properties of a platform that can't be
 determined at compile-time. They may vary from device to device, but they will
 not change over the course of a single execution. They often specify particular
 behavior of other APIs within the bounds of their operating range.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemCapabilityReversedEnterAndBack`
 
@@ -26,11 +26,11 @@
     only if) a system has this capability will SbSystemGetTotalGPUMemory() and
     SbSystemGetUsedGPUMemory() be valid to call.
 
-### SbSystemPathId ###
+### SbSystemPathId
 
 Enumeration of special paths that the platform can define.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPathContentDirectory`
 
@@ -66,22 +66,22 @@
     for storing the updates. See
     starboard/doc/evergreen/cobalt_evergreen_overview.md
 
-### SbSystemPlatformErrorResponse ###
+### SbSystemPlatformErrorResponse
 
 Possible responses for `SbSystemPlatformErrorCallback`.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPlatformErrorResponsePositive`
 *   `kSbSystemPlatformErrorResponseNegative`
 *   `kSbSystemPlatformErrorResponseCancel`
 
-### SbSystemPlatformErrorType ###
+### SbSystemPlatformErrorType
 
 Enumeration of possible values for the `type` parameter passed to the
 `SbSystemRaisePlatformError` function.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPlatformErrorTypeConnectionError`
 
@@ -90,12 +90,12 @@
     `kSbSystemPlatformErrorResponsePositive` then the request should be retried,
     otherwise the app should be stopped.
 
-### SbSystemPropertyId ###
+### SbSystemPropertyId
 
 System properties that can be queried for. Many of these are used in User-Agent
 string generation.
 
-#### Values ####
+#### Values
 
 *   `kSbSystemPropertyCertificationScope`
 
@@ -156,9 +156,9 @@
     Type of the device, e.g. such as "TV", "STB", "OTT" Please see Youtube
     Technical requirements for a full list of allowed values
 
-## Typedefs ##
+## Typedefs
 
-### SbSystemComparator ###
+### SbSystemComparator
 
 Pointer to a function to compare two items. The return value uses standard
 `*cmp` semantics:
@@ -171,23 +171,23 @@
 
 `a`: The first value to compare. `b`: The second value to compare.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int(* SbSystemComparator) (const void *a, const void *b)
 ```
 
-### SbSystemError ###
+### SbSystemError
 
 A type that can represent a system error code across all Starboard platforms.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int SbSystemError
 ```
 
-### SbSystemPlatformErrorCallback ###
+### SbSystemPlatformErrorCallback
 
 Type of callback function that may be called in response to an error
 notification from `SbSystemRaisePlatformError`. `response` is a code to indicate
@@ -195,36 +195,36 @@
 the error. `user_data` is the opaque pointer that was passed to the call to
 `SbSystemRaisePlatformError`.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbSystemPlatformErrorCallback) (SbSystemPlatformErrorResponse response, void *user_data)
 ```
 
-## Functions ##
+## Functions
 
-### SbSystemBreakIntoDebugger ###
+### SbSystemBreakIntoDebugger
 
 Breaks the current program into the debugger, if a debugger is attached. If a
 debugger is not attached, this function aborts the program.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SB_NORETURN void SbSystemBreakIntoDebugger()
 ```
 
-### SbSystemClearLastError ###
+### SbSystemClearLastError
 
 Clears the last error set by a Starboard call in the current thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemClearLastError()
 ```
 
-### SbSystemGetErrorString ###
+### SbSystemGetErrorString
 
 Generates a human-readable string for an error. The return value specifies the
 total desired length of the string.
@@ -233,13 +233,13 @@
 The generated string. This value may be null, and it is always terminated with a
 null byte. `string_length`: The maximum length of the error string.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSystemGetErrorString(SbSystemError error, char *out_string, int string_length)
 ```
 
-### SbSystemGetExtension ###
+### SbSystemGetExtension
 
 Returns pointer to a constant global struct implementing the extension named
 `name`, if it is implemented. Otherwise return NULL. The `name` string must not
@@ -261,25 +261,25 @@
 ignored. As the version of extensions are incremented, fields may be added to
 the end of the struct, but never removed (only deprecated).
 
-#### Declaration ####
+#### Declaration
 
 ```
 const void* SbSystemGetExtension(const char *name)
 ```
 
-### SbSystemGetLastError ###
+### SbSystemGetLastError
 
 Gets the last platform-specific error code produced by any Starboard call in the
 current thread for diagnostic purposes. Semantic reactions to Starboard function
 call results should be modeled explicitly.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbSystemError SbSystemGetLastError()
 ```
 
-### SbSystemGetLocaleId ###
+### SbSystemGetLocaleId
 
 Gets the system's current POSIX-style Locale ID. The locale represents the
 location, language, and cultural conventions that the system wants to use, which
@@ -296,25 +296,25 @@
 
 For more information than you probably want about POSIX locales, see: [http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html)
 
-#### Declaration ####
+#### Declaration
 
 ```
 const char* SbSystemGetLocaleId()
 ```
 
-### SbSystemGetNumberOfProcessors ###
+### SbSystemGetNumberOfProcessors
 
 Returns the number of processor cores available to this application. If the
 process is sandboxed to a subset of the physical cores, the function returns
 that sandboxed limit.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSystemGetNumberOfProcessors()
 ```
 
-### SbSystemGetProperty ###
+### SbSystemGetProperty
 
 Retrieves the platform-defined system property specified by `property_id` and
 places its value as a zero-terminated string into the user-allocated `out_value`
@@ -335,13 +335,13 @@
 defined system property specified by `property_id`. `value_length`: The length
 of the system property.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemGetProperty(SbSystemPropertyId property_id, char *out_value, int value_length)
 ```
 
-### SbSystemGetRandomData ###
+### SbSystemGetRandomData
 
 A cryptographically secure random number generator that produces an arbitrary,
 non-negative number of `buffer_size` random, non-negative bytes. The generated
@@ -350,24 +350,24 @@
 `out_buffer`: A pointer for the generated random number. This value must not be
 null. `buffer_size`: The size of the random number, in bytes.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemGetRandomData(void *out_buffer, int buffer_size)
 ```
 
-### SbSystemGetRandomUInt64 ###
+### SbSystemGetRandomUInt64
 
 A cryptographically secure random number generator that gets 64 random bits and
 returns them as an `uint64_t`. This function does not require manual seeding.
 
-#### Declaration ####
+#### Declaration
 
 ```
 uint64_t SbSystemGetRandomUInt64()
 ```
 
-### SbSystemGetStack ###
+### SbSystemGetStack
 
 Places up to `stack_size` instruction pointer addresses of the current execution
 stack into `out_stack`. The return value specifies the number of entries added.
@@ -384,62 +384,62 @@
 `stack_size`: The maximum number of instruction pointer addresses to be placed
 into `out_stack` from the current execution stack.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbSystemGetStack(void **out_stack, int stack_size)
 ```
 
-### SbSystemGetTotalCPUMemory ###
+### SbSystemGetTotalCPUMemory
 
 Returns the total CPU memory (in bytes) potentially available to this
 application. If the process is sandboxed to a maximum allowable limit, the
 function returns the lesser of the physical and sandbox limits.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetTotalCPUMemory()
 ```
 
-### SbSystemGetTotalGPUMemory ###
+### SbSystemGetTotalGPUMemory
 
 Returns the total GPU memory (in bytes) available for use by this application.
 This function may only be called the return value for calls to
 SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats) is `true`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetTotalGPUMemory()
 ```
 
-### SbSystemGetUsedCPUMemory ###
+### SbSystemGetUsedCPUMemory
 
 Returns the total physical CPU memory (in bytes) used by this application. This
 value should always be less than (or, in particularly exciting situations, equal
 to) SbSystemGetTotalCPUMemory().
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetUsedCPUMemory()
 ```
 
-### SbSystemGetUsedGPUMemory ###
+### SbSystemGetUsedGPUMemory
 
 Returns the current amount of GPU memory (in bytes) that is currently being used
 by this application. This function may only be called if the return value for
 calls to SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats) is
 `true`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int64_t SbSystemGetUsedGPUMemory()
 ```
 
-### SbSystemHasCapability ###
+### SbSystemHasCapability
 
 Returns whether the platform has the runtime capability specified by
 `capability_id`. Returns false for any unknown capabilities. This implementation
@@ -447,48 +447,48 @@
 
 `capability_id`: The runtime capability to check.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemHasCapability(SbSystemCapabilityId capability_id)
 ```
 
-### SbSystemHideSplashScreen ###
+### SbSystemHideSplashScreen
 
 Hides the system splash screen on systems that support a splash screen that is
 displayed while the application is loading. This function may be called from any
 thread and must be idempotent.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemHideSplashScreen()
 ```
 
-### SbSystemIsDebuggerAttached ###
+### SbSystemIsDebuggerAttached
 
 Attempts to determine whether the current program is running inside or attached
 to a debugger. The function returns `false` if neither of those cases is true.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemIsDebuggerAttached()
 ```
 
-### SbSystemNetworkIsDisconnected ###
+### SbSystemNetworkIsDisconnected
 
 Returns if the device is disconnected from network. "Disconnected" is chosen
 over connected because disconnection can be determined with more certainty than
 connection usually.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemNetworkIsDisconnected()
 ```
 
-### SbSystemRaisePlatformError ###
+### SbSystemRaisePlatformError
 
 Cobalt calls this function to notify the platform that an error has occurred in
 the application that the platform may need to handle. The platform is expected
@@ -510,13 +510,13 @@
 pointer that the platform should pass as an argument to the callback function,
 if it is called.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemRaisePlatformError(SbSystemPlatformErrorType type, SbSystemPlatformErrorCallback callback, void *user_data)
 ```
 
-### SbSystemRequestBlur ###
+### SbSystemRequestBlur
 
 Requests that the application move into the Blurred state at the next convenient
 point. This should roughly correspond to "unfocused application" in a
@@ -526,13 +526,13 @@
 the application. Before the `kSbEventTypeBlur` event is dispatched, some work
 may continue to be done, and unrelated system events may be dispatched.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestBlur()
 ```
 
-### SbSystemRequestConceal ###
+### SbSystemRequestConceal
 
 Requests that the application move into the Concealed state at the next
 convenient point. This should roughly correspond to "minimization" in a
@@ -547,13 +547,13 @@
 running background tasks. The expectation is that an external system event will
 bring the application out of the Concealed state.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestConceal()
 ```
 
-### SbSystemRequestFocus ###
+### SbSystemRequestFocus
 
 Requests that the application move into the Started state at the next convenient
 point. This should roughly correspond to a "focused application" in a
@@ -564,13 +564,13 @@
 the application. Before `kSbEventTypeFocus` is dispatched, some work may
 continue to be done, and unrelated system events may be dispatched.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestFocus()
 ```
 
-### SbSystemRequestFreeze ###
+### SbSystemRequestFreeze
 
 Requests that the application move into the Frozen state at the next convenient
 point.
@@ -583,13 +583,13 @@
 The expectation is that an external system event will bring the application out
 of the Frozen state.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestFreeze()
 ```
 
-### SbSystemRequestReveal ###
+### SbSystemRequestReveal
 
 Requests that the application move into the Blurred state at the next convenient
 point. This should roughly correspond to a "focused application" in a
@@ -600,13 +600,13 @@
 the application. Before the `kSbEventTypeReveal` event is dispatched, some work
 may continue to be done, and unrelated system events may be dispatched.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestReveal()
 ```
 
-### SbSystemRequestStop ###
+### SbSystemRequestStop
 
 Requests that the application be terminated gracefully at the next convenient
 point. In the meantime, some work may continue to be done, and unrelated system
@@ -617,13 +617,13 @@
 `error_level`: An integer that serves as the return value for the process that
 is eventually terminated as a result of a call to this function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbSystemRequestStop(int error_level)
 ```
 
-### SbSystemSignWithCertificationSecretKey ###
+### SbSystemSignWithCertificationSecretKey
 
 Computes a HMAC-SHA256 digest of `message` into `digest` using the application's
 certification secret. The `message` and the `digest` pointers must not be NULL.
@@ -633,13 +633,13 @@
 an error, or if it is not implemented. In this case the contents of `digest`
 will be undefined.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemSignWithCertificationSecretKey(const uint8_t *message, size_t message_size_in_bytes, uint8_t *digest, size_t digest_size_in_bytes)
 ```
 
-### SbSystemSupportsResume ###
+### SbSystemSupportsResume
 
 Returns false if the platform doesn't need resume after suspend support. In such
 case Cobalt will free up the resource it retains for resume after suspend. Note
@@ -647,13 +647,13 @@
 kSbEventTypeResume to the event handler. The return value of this function
 cannot change over the life time of the application.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemSupportsResume()
 ```
 
-### SbSystemSymbolize ###
+### SbSystemSymbolize
 
 Looks up `address` as an instruction pointer and places up to (`buffer_size -
 1`) characters of the symbol associated with it in `out_buffer`, which must not
@@ -665,7 +665,7 @@
 This function is used in crash signal handlers and, therefore, it must be async-
 signal-safe on platforms that support signals.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbSystemSymbolize(const void *address, char *out_buffer, int buffer_size)
diff --git a/cobalt/site/docs/reference/starboard/modules/thread.md b/cobalt/site/docs/reference/starboard/modules/thread.md
index 8440477..81a8697 100644
--- a/cobalt/site/docs/reference/starboard/modules/thread.md
+++ b/cobalt/site/docs/reference/starboard/modules/thread.md
@@ -1,35 +1,35 @@
----
-layout: doc
-title: "Starboard Module Reference: thread.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `thread.h`
 
 Defines functionality related to thread creation and cleanup.
 
-## Macros ##
+## Macros
 
-### kSbThreadContextInvalid ###
+### kSbThreadContextInvalid
 
 Well-defined value for an invalid thread context.
 
-### kSbThreadInvalidId ###
+### kSbThreadInvalidId
 
 Well-defined constant value to mean "no thread ID."
 
-### kSbThreadLocalKeyInvalid ###
+### kSbThreadLocalKeyInvalid
 
 Well-defined constant value to mean "no thread local key."
 
-### kSbThreadNoAffinity ###
+### kSbThreadNoAffinity
 
 Well-defined constant value to mean "no affinity."
 
-### kSbThreadSamplerInvalid ###
+### kSbThreadSamplerInvalid
 
 Well-defined value for an invalid thread sampler.
 
-## Enums ##
+## Enums
 
-### SbThreadPriority ###
+### SbThreadPriority
 
 A spectrum of thread priorities. Platforms map them appropriately to their own
 priority system. Note that scheduling is platform-specific, and what these
@@ -39,7 +39,7 @@
 a given platform. The only guarantee is that each lower priority should be
 treated less-than-or-equal-to a higher priority.
 
-#### Values ####
+#### Values
 
 *   `kSbThreadPriorityLowest`
 
@@ -79,116 +79,116 @@
     inherit the priority of the spawning thread, or it may mean a specific
     default priority, or it may mean something else, depending on the platform.
 
-## Typedefs ##
+## Typedefs
 
-### SbThread ###
+### SbThread
 
 An opaque handle to a thread type.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void* SbThread
 ```
 
-### SbThreadAffinity ###
+### SbThreadAffinity
 
 Type for thread core affinity. This generally will be a single cpu (or core or
 hyperthread) identifier. Some platforms may not support affinity, and some may
 have specific rules about how it must be used.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int32_t SbThreadAffinity
 ```
 
-### SbThreadContext ###
+### SbThreadContext
 
 A handle to the context of a frozen thread.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbThreadContextPrivate* SbThreadContext
 ```
 
-### SbThreadEntryPoint ###
+### SbThreadEntryPoint
 
 Function pointer type for SbThreadCreate. `context` is a pointer-sized bit of
 data passed in from the calling thread.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void*(* SbThreadEntryPoint) (void *context)
 ```
 
-### SbThreadId ###
+### SbThreadId
 
 An ID type that is unique per thread.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int32_t SbThreadId
 ```
 
-### SbThreadLocalDestructor ###
+### SbThreadLocalDestructor
 
 Function pointer type for Thread-Local destructors.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef void(* SbThreadLocalDestructor) (void *value)
 ```
 
-### SbThreadLocalKey ###
+### SbThreadLocalKey
 
 A handle to a thread-local key.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbThreadLocalKeyPrivate* SbThreadLocalKey
 ```
 
-### SbThreadSampler ###
+### SbThreadSampler
 
 A handle to a thread sampler.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbThreadSamplerPrivate* SbThreadSampler
 ```
 
-## Functions ##
+## Functions
 
-### SbThreadContextGetPointer ###
+### SbThreadContextGetPointer
 
 Gets the specified pointer-type `property` from the specified `context`. Returns
 `true` if successful and `out_value` has been modified, otherwise returns
 `false` and `out_value` is not modified.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadContextGetPointer(SbThreadContext context, SbThreadContextProperty property, void **out_value)
 ```
 
-### SbThreadContextIsValid ###
+### SbThreadContextIsValid
 
 Returns whether the given thread context is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadContextIsValid(SbThreadContext context)
 ```
 
-### SbThreadCreate ###
+### SbThreadCreate
 
 Creates a new thread, which starts immediately.
 
@@ -214,13 +214,13 @@
 executed on the newly created thread. `context`: This value will be passed to
 the `entry_point` function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThread SbThreadCreate(int64_t stack_size, SbThreadPriority priority, SbThreadAffinity affinity, bool joinable, const char *name, SbThreadEntryPoint entry_point, void *context)
 ```
 
-### SbThreadCreateLocalKey ###
+### SbThreadCreateLocalKey
 
 Creates and returns a new, unique key for thread local data. If the function
 does not succeed, the function returns `kSbThreadLocalKeyInvalid`.
@@ -233,13 +233,13 @@
 `destructor`: A pointer to a function. The value may be NULL if no clean up is
 needed.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadLocalKey SbThreadCreateLocalKey(SbThreadLocalDestructor destructor)
 ```
 
-### SbThreadDestroyLocalKey ###
+### SbThreadDestroyLocalKey
 
 Destroys thread local data for the specified key. The function is a no-op if the
 key is invalid (kSbThreadLocalKeyInvalid`) or has already been destroyed. This
@@ -247,13 +247,13 @@
 
 `key`: The key for which to destroy thread local data.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadDestroyLocalKey(SbThreadLocalKey key)
 ```
 
-### SbThreadDetach ###
+### SbThreadDetach
 
 Detaches `thread`, which prevents it from being joined. This is sort of like a
 non-blocking join. This function is a no-op if the thread is already detached or
@@ -261,33 +261,33 @@
 
 `thread`: The thread to be detached.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadDetach(SbThread thread)
 ```
 
-### SbThreadGetCurrent ###
+### SbThreadGetCurrent
 
 Returns the handle of the currently executing thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThread SbThreadGetCurrent()
 ```
 
-### SbThreadGetId ###
+### SbThreadGetId
 
 Returns the Thread ID of the currently executing thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadId SbThreadGetId()
 ```
 
-### SbThreadGetLocalValue ###
+### SbThreadGetLocalValue
 
 Returns the pointer-sized value for `key` in the currently executing thread's
 local storage. Returns `NULL` if key is `kSbThreadLocalKeyInvalid` or if the key
@@ -295,97 +295,97 @@
 
 `key`: The key for which to return the value.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbThreadGetLocalValue(SbThreadLocalKey key)
 ```
 
-### SbThreadGetName ###
+### SbThreadGetName
 
 Returns the debug name of the currently executing thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadGetName(char *buffer, int buffer_size)
 ```
 
-### SbThreadIsCurrent ###
+### SbThreadIsCurrent
 
 Returns whether `thread` is the current thread.
 
 `thread`: The thread to check.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsCurrent(SbThread thread)
 ```
 
-### SbThreadIsEqual ###
+### SbThreadIsEqual
 
 Indicates whether `thread1` and `thread2` refer to the same thread.
 
 `thread1`: The first thread to compare. `thread2`: The second thread to compare.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadIsEqual(SbThread thread1, SbThread thread2)
 ```
 
-### SbThreadIsValid ###
+### SbThreadIsValid
 
 Returns whether the given thread handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValid(SbThread thread)
 ```
 
-### SbThreadIsValidAffinity ###
+### SbThreadIsValidAffinity
 
 Returns whether the given thread affinity is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidAffinity(SbThreadAffinity affinity)
 ```
 
-### SbThreadIsValidId ###
+### SbThreadIsValidId
 
 Returns whether the given thread ID is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidId(SbThreadId id)
 ```
 
-### SbThreadIsValidLocalKey ###
+### SbThreadIsValidLocalKey
 
 Returns whether the given thread local variable key is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidLocalKey(SbThreadLocalKey key)
 ```
 
-### SbThreadIsValidPriority ###
+### SbThreadIsValidPriority
 
 Returns whether the given thread priority is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadIsValidPriority(SbThreadPriority priority)
 ```
 
-### SbThreadJoin ###
+### SbThreadJoin
 
 Joins the thread on which this function is called with joinable `thread`. This
 function blocks the caller until the designated thread exits, and then cleans up
@@ -403,36 +403,36 @@
 then the SbThreadJoin function populates it with the return value of the
 thread's `main` function.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadJoin(SbThread thread, void **out_return)
 ```
 
-### SbThreadSamplerCreate ###
+### SbThreadSamplerCreate
 
 Creates a new thread sampler for the specified `thread`.
 
 If successful, this function returns the newly created handle. If unsuccessful,
 this function returns `kSbThreadSamplerInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadSampler SbThreadSamplerCreate(SbThread thread)
 ```
 
-### SbThreadSamplerDestroy ###
+### SbThreadSamplerDestroy
 
 Destroys the `sampler` and frees whatever resources it was using.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadSamplerDestroy(SbThreadSampler sampler)
 ```
 
-### SbThreadSamplerFreeze ###
+### SbThreadSamplerFreeze
 
 Suspends execution of the thread that `sampler` was created for.
 
@@ -440,47 +440,47 @@
 from which properties may be read while the thread remains frozen. If
 unsuccessful, this function returns `kSbThreadContextInvalid`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbThreadContext SbThreadSamplerFreeze(SbThreadSampler sampler)
 ```
 
-### SbThreadSamplerIsSupported ###
+### SbThreadSamplerIsSupported
 
 Whether the current platform supports thread sampling. The result of this
 function must not change over the course of the program, which means that the
 results of this function may be cached indefinitely. If this returns false,
 `SbThreadSamplerCreate` will return an invalid sampler.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadSamplerIsSupported()
 ```
 
-### SbThreadSamplerIsValid ###
+### SbThreadSamplerIsValid
 
 Returns whether the given thread sampler is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbThreadSamplerIsValid(SbThreadSampler sampler)
 ```
 
-### SbThreadSamplerThaw ###
+### SbThreadSamplerThaw
 
 Resumes execution of the thread that `sampler` was created for. This invalidates
 the context returned from `SbThreadSamplerFreeze`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadSamplerThaw(SbThreadSampler sampler)
 ```
 
-### SbThreadSetLocalValue ###
+### SbThreadSetLocalValue
 
 Sets the pointer-sized value for `key` in the currently executing thread's local
 storage. The return value indicates whether `key` is valid and has not already
@@ -489,26 +489,26 @@
 `key`: The key for which to set the key value. `value`: The new pointer-sized
 key value.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbThreadSetLocalValue(SbThreadLocalKey key, void *value)
 ```
 
-### SbThreadSetName ###
+### SbThreadSetName
 
 Sets the debug name of the currently executing thread by copying the specified
 name string.
 
 `name`: The name to assign to the thread.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadSetName(const char *name)
 ```
 
-### SbThreadSleep ###
+### SbThreadSleep
 
 Sleeps the currently executing thread.
 
@@ -516,17 +516,17 @@
 executing thread should sleep. The function is a no-op if this value is negative
 or `0`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadSleep(SbTime duration)
 ```
 
-### SbThreadYield ###
+### SbThreadYield
 
 Yields the currently executing thread, so another thread has a chance to run.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbThreadYield()
diff --git a/cobalt/site/docs/reference/starboard/modules/time.md b/cobalt/site/docs/reference/starboard/modules/time.md
index 17ea6ad..e5c8cd2 100644
--- a/cobalt/site/docs/reference/starboard/modules/time.md
+++ b/cobalt/site/docs/reference/starboard/modules/time.md
@@ -1,59 +1,59 @@
----
-layout: doc
-title: "Starboard Module Reference: time.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `time.h`
 
 Provides access to system time and timers.
 
-## Macros ##
+## Macros
 
-### kSbTimeDay ###
+### kSbTimeDay
 
 One day in SbTime units (microseconds).
 
-### kSbTimeHour ###
+### kSbTimeHour
 
 One hour in SbTime units (microseconds).
 
-### kSbTimeMax ###
+### kSbTimeMax
 
 The maximum value of an SbTime.
 
-### kSbTimeMillisecond ###
+### kSbTimeMillisecond
 
 One millisecond in SbTime units (microseconds).
 
-### kSbTimeMinute ###
+### kSbTimeMinute
 
 One minute in SbTime units (microseconds).
 
-### kSbTimeNanosecondsPerMicrosecond ###
+### kSbTimeNanosecondsPerMicrosecond
 
 How many nanoseconds in one SbTime unit (microseconds).
 
-### kSbTimeSecond ###
+### kSbTimeSecond
 
 One second in SbTime units (microseconds).
 
-### kSbTimeToPosixDelta ###
+### kSbTimeToPosixDelta
 
 A term that can be added to an SbTime to convert it into the number of
 microseconds since the POSIX epoch.
 
-## Typedefs ##
+## Typedefs
 
-### SbTime ###
+### SbTime
 
 The number of microseconds since the epoch of January 1, 1601 UTC, or the number
 of microseconds between two times. Always microseconds, ALWAYS UTC.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int64_t SbTime
 ```
 
-### SbTimeMonotonic ###
+### SbTimeMonotonic
 
 A number of microseconds from some point. The main property of this time is that
 it increases monotonically. It should also be as high-resolution a timer as we
@@ -61,38 +61,38 @@
 without worrying about a system clock adjustment. It's not good for getting the
 wall clock time.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int64_t SbTimeMonotonic
 ```
 
-## Functions ##
+## Functions
 
-### SbTimeFromPosix ###
+### SbTimeFromPosix
 
 Converts microseconds from the POSIX epoch into an `SbTime`.
 
 `time`: A time that measures the number of microseconds since January 1, 1970,
 00:00:00, UTC.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static SbTime SbTimeFromPosix(int64_t time)
 ```
 
-### SbTimeGetMonotonicNow ###
+### SbTimeGetMonotonicNow
 
 Gets a monotonically increasing time representing right now.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTimeMonotonic SbTimeGetMonotonicNow()
 ```
 
-### SbTimeGetMonotonicThreadNow ###
+### SbTimeGetMonotonicThreadNow
 
 Gets a monotonically increasing time representing how long the current thread
 has been in the executing state (i.e. not pre-empted nor waiting on an event).
@@ -100,44 +100,44 @@
 execution time between two timestamps. If this is not available then
 SbTimeGetMonotonicNow() should be used.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTimeMonotonic SbTimeGetMonotonicThreadNow()
 ```
 
-### SbTimeGetNow ###
+### SbTimeGetNow
 
 Gets the current system time as an `SbTime`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTime SbTimeGetNow()
 ```
 
-### SbTimeIsTimeThreadNowSupported ###
+### SbTimeIsTimeThreadNowSupported
 
 Returns whether the current platform supports time thread now
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbTimeIsTimeThreadNowSupported()
 ```
 
-### SbTimeNarrow ###
+### SbTimeNarrow
 
 Safely narrows a number from a more precise unit to a less precise one. This
 function rounds negative values toward negative infinity.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int64_t SbTimeNarrow(int64_t time, int64_t divisor)
 ```
 
-### SbTimeToPosix ###
+### SbTimeToPosix
 
 Converts `SbTime` into microseconds from the POSIX epoch.
 
@@ -145,7 +145,7 @@
 January 1, 1601, UTC, or that measures the number of microseconds between two
 times.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static int64_t SbTimeToPosix(SbTime time)
diff --git a/cobalt/site/docs/reference/starboard/modules/time_zone.md b/cobalt/site/docs/reference/starboard/modules/time_zone.md
index 5768bc3..baad375 100644
--- a/cobalt/site/docs/reference/starboard/modules/time_zone.md
+++ b/cobalt/site/docs/reference/starboard/modules/time_zone.md
@@ -1,48 +1,47 @@
----
-layout: doc
-title: "Starboard Module Reference: time_zone.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `time_zone.h`
 
 Provides access to the system time zone information.
 
-## Typedefs ##
+## Typedefs
 
-### SbTimeZone ###
+### SbTimeZone
 
 The number of minutes west of the Greenwich Prime Meridian, NOT including
 Daylight Savings Time adjustments.
 
-For example: PST/PDT is 480 minutes (28800 seconds, 8 hours).
+For example: America/Los_Angeles is 480 minutes (28800 seconds, 8 hours).
 
-#### Definition ####
+#### Definition
 
 ```
 typedef int SbTimeZone
 ```
 
-## Functions ##
+## Functions
 
-### SbTimeZoneGetCurrent ###
+### SbTimeZoneGetCurrent
 
 Gets the system's current SbTimeZone in minutes.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbTimeZone SbTimeZoneGetCurrent()
 ```
 
-### SbTimeZoneGetName ###
+### SbTimeZoneGetName
 
-Gets a string representation of the current timezone. Note that the string
-representation can either be standard or daylight saving time. The output can be
-of the form: 1) A three-letter abbreviation such as "PST" or "PDT" (preferred).
-2) A time zone identifier such as "America/Los_Angeles" 3) An un-abbreviated
-name such as "Pacific Standard Time".
+Gets a string representation of the current timezone. The format should be in
+the IANA format [https://data.iana.org/time-zones/theory.html#naming](https://data.iana.org/time-zones/theory.html#naming)) .
+Names normally have the form AREA/LOCATION, where AREA is a continent or ocean,
+and LOCATION is a specific location within the area. Typical names are
+'Africa/Cairo', 'America/New_York', and 'Pacific/Honolulu'.
 
-#### Declaration ####
+#### Declaration
 
 ```
 const char* SbTimeZoneGetName()
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/types.md b/cobalt/site/docs/reference/starboard/modules/types.md
index 90867a6..e1f372c 100644
--- a/cobalt/site/docs/reference/starboard/modules/types.md
+++ b/cobalt/site/docs/reference/starboard/modules/types.md
@@ -1,15 +1,15 @@
----
-layout: doc
-title: "Starboard Module Reference: types.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `types.h`
 
 Provides a suite of standard types that should be universally available on all
 platforms, specifically focused on explicitly-sized integer types and booleans.
 This module also includes some related ubiquitous definitions like limits of the
 explicitly-sized integer types, and standard pointer and int32 sentinel values.
 
-## Macros ##
+## Macros
 
-### kSbInvalidInt ###
+### kSbInvalidInt
 
 A value that represents an int that is probably invalid.
diff --git a/cobalt/site/docs/reference/starboard/modules/ui_navigation.md b/cobalt/site/docs/reference/starboard/modules/ui_navigation.md
index a0ecfb1..cb41767 100644
--- a/cobalt/site/docs/reference/starboard/modules/ui_navigation.md
+++ b/cobalt/site/docs/reference/starboard/modules/ui_navigation.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: ui_navigation.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `ui_navigation.h`
 
 API to allow applications to take advantage of the platform's native UI engine.
 This is mainly to drive the animation of visual elements and to signal which of
@@ -19,20 +19,20 @@
 user interaction. If the navigation item is a container, then the content offset
 will also be queried to determine the placement of its content items.
 
-## Macros ##
+## Macros
 
-### kSbUiNavItemInvalid ###
+### kSbUiNavItemInvalid
 
 Well-defined value for an invalid navigation item.
 
-## Enums ##
+## Enums
 
-### SbUiNavItemType ###
+### SbUiNavItemType
 
 Navigation items may be one of the following types. This must be specified upon
 item creation and may not change during the item's lifespan.
 
-#### Values ####
+#### Values
 
 *   `kSbUiNavItemTypeFocus`
 
@@ -42,29 +42,29 @@
     This is a container of navigation items which can also be containers
     themselves or focusable items. Containers themselves cannot be focused.
 
-## Typedefs ##
+## Typedefs
 
-### SbUiNavItem ###
+### SbUiNavItem
 
 An opaque handle to an implementation-private structure representing a
 navigation item.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef struct SbUiNavItemPrivate* SbUiNavItem
 ```
 
-## Structs ##
+## Structs
 
-### SbUiNavCallbacks ###
+### SbUiNavCallbacks
 
 This structure specifies all the callbacks which the platform UI engine should
 invoke for various interaction events on navigation items. These callbacks may
 be invoked from any thread at any frequency. The `callback_context` is the value
 that was passed on creation of the relevant SbUiNavItem.
 
-#### Members ####
+#### Members
 
 *   `void(*onblur)(SbUiNavItem item, void *callback_context)`
 
@@ -77,12 +77,12 @@
     Invoke when an item's content offset is changed. This is only used with
     container items.
 
-### SbUiNavInterface ###
+### SbUiNavInterface
 
 This structure declares the interface to the UI navigation implementation. All
 function pointers must be specified if the platform supports UI navigation.
 
-#### Members ####
+#### Members
 
 *   `SbUiNavItem(*create_item)(SbUiNavItemType type, const SbUiNavCallbacks
     *callbacks, void *callback_context)`
@@ -237,7 +237,7 @@
     Call `update_function` with `context` to perform a series of UI navigation
     changes atomically before returning.
 
-### SbUiNavItemDir ###
+### SbUiNavItemDir
 
 Navigation items of type kSbUiNavItemTypeContainer have directionality. If
 directionality is not specified for a container, it should default to left-to-
@@ -270,12 +270,12 @@
   Bottom-to-top is similar to right-to-left, but for the Y position.
 ```
 
-#### Members ####
+#### Members
 
 *   `bool is_left_to_right`
 *   `bool is_top_to_bottom`
 
-### SbUiNavMatrix2x3 ###
+### SbUiNavMatrix2x3
 
 This represents a 2x3 transform matrix in row-major order.
 
@@ -284,38 +284,38 @@
 ///   | c d ty |
 ```
 
-#### Members ####
+#### Members
 
 *   `float m`
 
-### SbUiNavMatrix4 ###
+### SbUiNavMatrix4
 
 This represents a 4x4 transform matrix in row-major order.
 
-#### Members ####
+#### Members
 
 *   `float m`
 
-## Functions ##
+## Functions
 
-### SbUiNavGetInterface ###
+### SbUiNavGetInterface
 
 Retrieve the platform's UI navigation implementation. If the platform does not
 provide one, then return false without modifying `out_interface`. Otherwise,
 initialize all members of `out_interface` and return true. The `out_interface`
 pointer must not be NULL.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbUiNavGetInterface(SbUiNavInterface *out_interface)
 ```
 
-### SbUiNavItemIsValid ###
+### SbUiNavItemIsValid
 
 Returns whether the given navigation item handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbUiNavItemIsValid(SbUiNavItem item)
diff --git a/cobalt/site/docs/reference/starboard/modules/user.md b/cobalt/site/docs/reference/starboard/modules/user.md
index a30cc95..9442ced 100644
--- a/cobalt/site/docs/reference/starboard/modules/user.md
+++ b/cobalt/site/docs/reference/starboard/modules/user.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Starboard Module Reference: user.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `user.h`
 
 Defines a user management API. This module defines functions only for managing
 signed-in users. Platforms that do not have users must still implement this API,
@@ -10,19 +10,19 @@
 These APIs are NOT expected to be thread-safe, so either call them from a single
 thread, or perform proper synchronization around all calls.
 
-## Macros ##
+## Macros
 
-### kSbUserInvalid ###
+### kSbUserInvalid
 
 Well-defined value for an invalid user.
 
-## Enums ##
+## Enums
 
-### SbUserPropertyId ###
+### SbUserPropertyId
 
 A set of string properties that can be queried on a user.
 
-#### Values ####
+#### Values
 
 *   `kSbUserPropertyAvatarUrl`
 
@@ -38,21 +38,21 @@
 
     A unique user ID of a user.
 
-## Typedefs ##
+## Typedefs
 
-### SbUser ###
+### SbUser
 
 A handle to a user.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbUserPrivate* SbUser
 ```
 
-## Functions ##
+## Functions
 
-### SbUserGetCurrent ###
+### SbUserGetCurrent
 
 Gets the current primary user, if one exists. This is the user that is
 determined, in a platform-specific way, to be the primary user controlling the
@@ -63,13 +63,13 @@
 It is expected that there will be a unique SbUser per signed-in user, and that
 the referenced objects will persist for the lifetime of the app.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbUser SbUserGetCurrent()
 ```
 
-### SbUserGetProperty ###
+### SbUserGetProperty
 
 Retrieves the value of `property_id` for `user` and places it in `out_value`.
 The function returns:
@@ -83,13 +83,13 @@
 The property for which the data is requested. `out_value`: The retrieved
 property value. `value_size`: The size of the retrieved property value.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbUserGetProperty(SbUser user, SbUserPropertyId property_id, char *out_value, int value_size)
 ```
 
-### SbUserGetPropertySize ###
+### SbUserGetPropertySize
 
 Returns the size of the value of `property_id` for `user`, INCLUDING the
 terminating null character. The function returns `0` if `user` is invalid or if
@@ -98,13 +98,13 @@
 `user`: The user for which property size data is being retrieved. `property_id`:
 The property for which the data is requested.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbUserGetPropertySize(SbUser user, SbUserPropertyId property_id)
 ```
 
-### SbUserGetSignedIn ###
+### SbUserGetSignedIn
 
 Gets a list of up to `users_size` signed-in users and places the results in
 `out_users`. The return value identifies the actual number of signed-in users,
@@ -116,17 +116,17 @@
 `out_users`: Handles for the retrieved users. `users_size`: The maximum number
 of signed-in users to retrieve.
 
-#### Declaration ####
+#### Declaration
 
 ```
 int SbUserGetSignedIn(SbUser *out_users, int users_size)
 ```
 
-### SbUserIsValid ###
+### SbUserIsValid
 
 Returns whether the given user handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbUserIsValid(SbUser user)
diff --git a/cobalt/site/docs/reference/starboard/modules/window.md b/cobalt/site/docs/reference/starboard/modules/window.md
index 53cda4a..af49c22 100644
--- a/cobalt/site/docs/reference/starboard/modules/window.md
+++ b/cobalt/site/docs/reference/starboard/modules/window.md
@@ -1,40 +1,40 @@
----
-layout: doc
-title: "Starboard Module Reference: window.h"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Starboard Module Reference: `window.h`
 
 Provides functionality to handle Window creation and management.
 
-## Macros ##
+## Macros
 
-### kSbEventOnScreenKeyboardInvalidTicket ###
+### kSbEventOnScreenKeyboardInvalidTicket
 
 System-triggered OnScreenKeyboard events have ticket value
 kSbEventOnScreenKeyboardInvalidTicket.
 
-### kSbWindowInvalid ###
+### kSbWindowInvalid
 
 Well-defined value for an invalid window handle.
 
-## Typedefs ##
+## Typedefs
 
-### SbWindow ###
+### SbWindow
 
 A handle to a window.
 
-#### Definition ####
+#### Definition
 
 ```
 typedef SbWindowPrivate* SbWindow
 ```
 
-## Structs ##
+## Structs
 
-### SbWindowOptions ###
+### SbWindowOptions
 
 Options that can be requested at window creation time.
 
-#### Members ####
+#### Members
 
 *   `SbWindowSize size`
 
@@ -48,25 +48,25 @@
 
     The name of the window to create.
 
-### SbWindowRect ###
+### SbWindowRect
 
 Defines a rectangle via a point `(x, y)` and a size `(width, height)`. This
 structure is used as output for SbWindowGetOnScreenKeyboardBoundingRect.
 
-#### Members ####
+#### Members
 
 *   `float x`
 *   `float y`
 *   `float width`
 *   `float height`
 
-### SbWindowSize ###
+### SbWindowSize
 
 The size of a window in graphics rendering coordinates. The width and height of
 a window should correspond to the size of the graphics surface used for drawing
 that would be created to back that window.
 
-#### Members ####
+#### Members
 
 *   `int width`
 
@@ -93,9 +93,9 @@
     A value of 0.0f means the ratio could not be determined, it should be
     assumed to be the same as the graphics resolution (i.e. 1.0f).
 
-## Functions ##
+## Functions
 
-### SbWindowBlurOnScreenKeyboard ###
+### SbWindowBlurOnScreenKeyboard
 
 Blur the on screen keyboard. Fire kSbEventTypeOnScreenKeyboardBlurred.
 kSbEventTypeOnScreenKeyboardBlurred has data `ticket`. Calling
@@ -103,13 +103,13 @@
 permitted. Calling SbWindowBlurOnScreenKeyboard while the on screen keyboard is
 not showing does nothing and does not fire any event.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowBlurOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowCreate ###
+### SbWindowCreate
 
 Creates and returns a new system window with the given `options`, which may be
 `NULL`. The function returns `kSbWindowInvalid` if it cannot create the
@@ -131,25 +131,25 @@
 
 `options`: Options that specify parameters for the window being created.
 
-#### Declaration ####
+#### Declaration
 
 ```
 SbWindow SbWindowCreate(const SbWindowOptions *options)
 ```
 
-### SbWindowDestroy ###
+### SbWindowDestroy
 
 Destroys `window`, reclaiming associated resources.
 
 `window`: The `SbWindow` to destroy.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowDestroy(SbWindow window)
 ```
 
-### SbWindowFocusOnScreenKeyboard ###
+### SbWindowFocusOnScreenKeyboard
 
 Focus the on screen keyboard. Fire kSbEventTypeOnScreenKeyboardFocused.
 kSbEventTypeOnScreenKeyboardFocused has data `ticket`. Calling
@@ -157,38 +157,38 @@
 permitted. Calling SbWindowFocusOnScreenKeyboard while the on screen keyboard is
 not showing does nothing and does not fire any event.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowFocusOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowGetDiagonalSizeInInches ###
+### SbWindowGetDiagonalSizeInInches
 
 Gets the size of the diagonal between two opposing screen corners.
 
 A return value of 0 means that starboard does not know what the screen diagonal
 is.
 
-#### Declaration ####
+#### Declaration
 
 ```
 float SbWindowGetDiagonalSizeInInches(SbWindow window)
 ```
 
-### SbWindowGetOnScreenKeyboardBoundingRect ###
+### SbWindowGetOnScreenKeyboardBoundingRect
 
 Get the rectangle of the on screen keyboard in screen pixel coordinates. Return
 `true` if successful. Return `false` if the on screen keyboard is not showing.
 If the function returns `false`, then `rect` will not have been modified.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowGetOnScreenKeyboardBoundingRect(SbWindow window, SbWindowRect *bounding_rect)
 ```
 
-### SbWindowGetPlatformHandle ###
+### SbWindowGetPlatformHandle
 
 Gets the platform-specific handle for `window`, which can be passed as an
 EGLNativeWindowType to initialize EGL/GLES. This return value is entirely
@@ -196,13 +196,13 @@
 
 `window`: The SbWindow to retrieve the platform handle for.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void* SbWindowGetPlatformHandle(SbWindow window)
 ```
 
-### SbWindowGetSize ###
+### SbWindowGetSize
 
 Retrieves the dimensions of `window` and sets `size` accordingly. This function
 returns `true` if it completes successfully. If the function returns `false`,
@@ -210,81 +210,81 @@
 
 `window`: The SbWindow to retrieve the size of. `size`: The retrieved size.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowGetSize(SbWindow window, SbWindowSize *size)
 ```
 
-### SbWindowHideOnScreenKeyboard ###
+### SbWindowHideOnScreenKeyboard
 
 Hide the on screen keyboard. Fire kSbEventTypeWindowSizeChange and
 kSbEventTypeOnScreenKeyboardHidden if necessary.
 kSbEventTypeOnScreenKeyboardHidden has data `ticket`. Calling
 SbWindowHideOnScreenKeyboard() when the keyboard is already hidden is permitted.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowHideOnScreenKeyboard(SbWindow window, int ticket)
 ```
 
-### SbWindowIsOnScreenKeyboardShown ###
+### SbWindowIsOnScreenKeyboardShown
 
 Determine if the on screen keyboard is shown.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowIsOnScreenKeyboardShown(SbWindow window)
 ```
 
-### SbWindowIsValid ###
+### SbWindowIsValid
 
 Returns whether the given window handle is valid.
 
-#### Declaration ####
+#### Declaration
 
 ```
 static bool SbWindowIsValid(SbWindow window)
 ```
 
-### SbWindowOnScreenKeyboardIsSupported ###
+### SbWindowOnScreenKeyboardIsSupported
 
 Return whether the current platform supports an on screen keyboard
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowOnScreenKeyboardIsSupported()
 ```
 
-### SbWindowOnScreenKeyboardSuggestionsSupported ###
+### SbWindowOnScreenKeyboardSuggestionsSupported
 
 Determine if the on screen keyboard has suggestions implemented. If this returns
 false, then calling SbWindowUpdateOnScreenKeyboardSuggestions() will be
 undefined.
 
-#### Declaration ####
+#### Declaration
 
 ```
 bool SbWindowOnScreenKeyboardSuggestionsSupported(SbWindow window)
 ```
 
-### SbWindowSetDefaultOptions ###
+### SbWindowSetDefaultOptions
 
 Sets the default options for system windows.
 
 `options`: The option values to use as default values. This object must not be
 `NULL`.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowSetDefaultOptions(SbWindowOptions *options)
 ```
 
-### SbWindowSetOnScreenKeyboardKeepFocus ###
+### SbWindowSetOnScreenKeyboardKeepFocus
 
 Notify the system that `keepFocus` has been set for the OnScreenKeyboard.
 `keepFocus` true indicates that the user may not navigate focus off of the
@@ -293,13 +293,13 @@
 OnScreenKeyboard via input. `keepFocus` is initialized to false in the
 OnScreenKeyboard constructor.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowSetOnScreenKeyboardKeepFocus(SbWindow window, bool keep_focus)
 ```
 
-### SbWindowShowOnScreenKeyboard ###
+### SbWindowShowOnScreenKeyboard
 
 Show the on screen keyboard and populate the input with text `input_text`. Fire
 kSbEventTypeWindowSizeChange and kSbEventTypeOnScreenKeyboardShown if necessary.
@@ -309,13 +309,13 @@
 and the input will be replaced with `input_text`. Showing the on screen keyboard
 does not give it focus.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowShowOnScreenKeyboard(SbWindow window, const char *input_text, int ticket)
 ```
 
-### SbWindowUpdateOnScreenKeyboardSuggestions ###
+### SbWindowUpdateOnScreenKeyboardSuggestions
 
 Update the on screen keyboard custom suggestions. Fire
 kSbEventTypeOnScreenKeyboardSuggestionsUpdated.
@@ -323,7 +323,7 @@
 suggestions should remain up-to-date when the keyboard is shown after being
 hidden.
 
-#### Declaration ####
+#### Declaration
 
 ```
 void SbWindowUpdateOnScreenKeyboardSuggestions(SbWindow window, const char *suggestions[], int num_suggestions, int ticket)
diff --git a/cobalt/site/docs/starboard/porting.md b/cobalt/site/docs/starboard/porting.md
index d26b327..84c4b3f 100644
--- a/cobalt/site/docs/starboard/porting.md
+++ b/cobalt/site/docs/starboard/porting.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Porting Cobalt to your Platform with Starboard"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Porting Cobalt to your Platform with Starboard
 
 This document provides step-by-step instructions for porting Cobalt to run
 on your platform. To do so, you'll use Starboard, which is Cobalt's porting
@@ -26,9 +26,8 @@
 ```
 
 If you prefer, you can instead complete the instructions for
-[setting up a Cobalt development environment on Linux](
-/cobalt/development/setup-linux.html). Checking out the Cobalt source
-code is one step in that process.
+[setting up a Cobalt development environment on Linux](../development/setup-linux.md).
+Checking out the Cobalt source code is one step in that process.
 
 ## Porting steps
 
diff --git a/cobalt/site/docs/starboard/testing.md b/cobalt/site/docs/starboard/testing.md
index 16eea52..c40f71d 100644
--- a/cobalt/site/docs/starboard/testing.md
+++ b/cobalt/site/docs/starboard/testing.md
@@ -1,7 +1,7 @@
----
-layout: doc
-title: "Testing"
----
+Project: /youtube/cobalt/_project.yaml
+Book: /youtube/cobalt/_book.yaml
+
+# Testing
 
 Starboard attempts to make the porting process as easy as possible. To that
 end, Starboard provides a compliance test suite, called NPLB
diff --git a/cobalt/site/scripts/cobalt_configuration_public.py b/cobalt/site/scripts/cobalt_configuration_public.py
new file mode 100644
index 0000000..d7cb813
--- /dev/null
+++ b/cobalt/site/scripts/cobalt_configuration_public.py
@@ -0,0 +1,162 @@
+# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Module to generate Starboard Configuration Reference."""
+import environment
+import os
+import re
+import sys
+
+
+def print_doc_header(doc, title):
+  doc.write('Project: /youtube/cobalt/_project.yaml\n')
+  doc.write('Book: /youtube/cobalt/_book.yaml\n\n')
+  doc.write(f'# {title}\n\n')
+
+
+def print_doc_section_header(doc, section, section_headers):
+  doc.write('## ' + section + '\n\n')
+  if section in section_headers:
+    doc.write(section_headers[section] + '\n\n')
+
+
+def print_section_property_table_header(doc):
+  doc.write('| Properties |\n')
+  doc.write('| :--- |\n')
+
+
+def print_property(doc, prop):
+  comment = prop['comment']
+  comment = comment.replace('__', '&#95;&#95;')
+  if prop['value']:
+    line_break = ''
+    value = prop['value'].replace('|', r'\|')
+    if len(value) > 30:
+      line_break = '<br>'
+    if comment[-8:] != '<br><br>':
+      comment += '<br><br>'
+    comment += ('The default value in the Stub implementation is ' +
+                line_break + '`' + prop['value'] + '`')
+  elif prop['undefined']:
+    if comment[-8:] != '<br><br>':
+      comment += '<br><br>'
+    comment += 'By default, this property is undefined.'
+  if comment[0:8] != '<br><br>':
+    doc.write('| **`' + prop['name'] + '`**<br><br>' + comment + ' |\n')
+  else:
+    doc.write('| **`' + prop['name'] + '`**' + comment + ' |\n')
+
+
+def create_reference_doc(site_path, properties, section_headers):
+  reference_doc_path = os.path.join(site_path, 'docs', 'reference', 'starboard',
+                                    'configuration-public.md')
+  environment.make_dirs(os.path.dirname(reference_doc_path))
+  with open(reference_doc_path, 'w', encoding='utf8') as doc:
+    print_doc_header(doc, 'Starboard Configuration Reference Guide')
+
+    for section in sorted(properties):
+      if len(properties[section]) > 0:
+        print_doc_section_header(doc, section, section_headers)
+
+        print_section_property_table_header(doc)
+
+        for p in range(0, len(properties[section])):
+          print_property(doc, properties[section][p])
+
+        doc.write('\n\n')
+
+
+def main(source_dir, output_dir=None):
+  config_dir = environment.get_stub_platform_dir(source_dir)
+  file_path = os.path.join(config_dir, 'configuration_public.h')
+  with open(file_path, 'r', encoding='utf8') as file_contents:
+    file_lines = file_contents.readlines()
+
+  # parse .proto files
+  comment = ''
+  in_line_item = ''
+  section = ''
+  properties = {}
+  section_headers = {}
+  last_thing_was_a_header = False
+  for original_line in file_lines:
+    line = original_line.strip()
+    if line[0:7] == '// --- ':
+      section = line[7:].split(' -')[0]
+      properties[section] = []
+      last_thing_was_a_header = True
+    elif section and (line[0:8] == '#define ' or line[0:7] == '#undef '):
+
+      if in_line_item:
+        if comment:
+          comment += '</li></' + in_line_item + '>'
+        in_line_item = ''
+      last_thing_was_a_header = False
+      prop_array = line.split(' ')
+      prop = {'comment': '', 'name': '', 'value': '', 'undefined': False}
+      if line[0:7] == '#undef ':
+        prop['undefined'] = True
+      if len(prop_array) > 1:
+        prop['name'] = prop_array[1]
+      if len(prop_array) > 2:
+        prop['value'] = ' '.join(prop_array[2:])
+      if comment:
+        prop['comment'] = comment.strip()
+      if '(' in prop['name'] and ')' not in prop['name']:
+        new_string = ' '.join(prop_array[1:])
+        new_prop_array = new_string.split(')')
+        prop['name'] = new_prop_array[0] + ')'
+        new_value = ')'.join(new_prop_array[1:])
+        prop['value'] = new_value.strip()
+      properties[section].append(prop)
+      comment = ''
+    elif section and line[0:2] == '//':
+      ol_item_regex = re.compile(r'^\d\. ')
+      comment_text = line[2:].strip()
+      is_ol_item = re.search(ol_item_regex, comment_text)
+      if (is_ol_item or comment_text.strip()[0:2] == '- ' or
+          comment_text.strip()[0:2] == '* '):
+        # Replace '* ' at beginning of comment with '<li>'
+        # Strip whitespace before '*' and after '*" up to start of text
+        if not in_line_item:
+          if is_ol_item:
+            comment_text = '<ol><li>' + comment_text.strip()[2:].strip()
+            in_line_item = 'ol'
+          else:
+            comment_text = '<ul><li>' + comment_text.strip()[1:].strip()
+            in_line_item = 'ul'
+        else:
+          if is_ol_item:
+            comment_text = '</li><li>' + comment_text.strip()[2:].strip()
+          else:
+            comment_text = '</li><li>' + comment_text.strip()[1:].strip()
+      comment += ' ' + comment_text
+    elif comment and line == '':
+      if last_thing_was_a_header:
+        section_headers[section] = comment
+      last_thing_was_a_header = False
+      comment = ''
+      if comment[-8:] != '<br><br>':
+        comment += '<br><br>'
+
+  if output_dir:
+    site_path = environment.get_site_dir(output_dir)
+  else:
+    site_path = environment.get_site_dir(source_dir)
+  create_reference_doc(site_path, properties, section_headers)
+  return 0
+
+
+if __name__ == '__main__':
+  options = environment.parse_arguments(__doc__, sys.argv[1:])
+  sys.exit(main(options.source, options.out))
diff --git a/cobalt/site/scripts/cobalt_documentation.py b/cobalt/site/scripts/cobalt_documentation.py
new file mode 100644
index 0000000..36c9ca4
--- /dev/null
+++ b/cobalt/site/scripts/cobalt_documentation.py
@@ -0,0 +1,61 @@
+# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Module to copy Cobalt doc folders to cobalt site directory."""
+import environment
+import os
+import shutil
+import sys
+
+_COBALT_DOC_LOCATIONS = [
+    'cobalt/doc/',
+    'starboard/doc/',
+    'starboard/build/doc/',
+    'starboard/tools/doc/',
+]
+
+
+def write_header(doc):
+  doc.write('Project: /youtube/cobalt/_project.yaml\n')
+  doc.write('Book: /youtube/cobalt/_book.yaml\n\n')
+
+
+def copy_doc_locations(source_dir, output_dir=None):
+  if output_dir:
+    site_path = environment.get_site_dir(output_dir)
+  else:
+    site_path = environment.get_site_dir(source_dir)
+
+  gen_dir = os.path.join(site_path, 'docs', 'gen')
+  if os.path.exists(gen_dir):
+    shutil.rmtree(gen_dir)
+
+  for location in _COBALT_DOC_LOCATIONS:
+    shutil.copytree(
+        os.path.join(source_dir, location), os.path.join(gen_dir, location))
+
+  for root, _, files in os.walk(gen_dir):
+    for filename in files:
+      if not filename.endswith('.md'):
+        continue
+      filename = os.path.join(root, filename)
+      with open(filename, encoding='utf8') as f:
+        lines = f.readlines()
+      with open(filename, 'w', encoding='utf8') as f:
+        write_header(f)
+        f.writelines(lines)
+
+
+if __name__ == '__main__':
+  out = sys.argv[2] if len(sys.argv) == 3 else None
+  copy_doc_locations(sys.argv[1], out)
diff --git a/cobalt/site/scripts/cobalt_gn_configuration.py b/cobalt/site/scripts/cobalt_gn_configuration.py
new file mode 100644
index 0000000..901554d
--- /dev/null
+++ b/cobalt/site/scripts/cobalt_gn_configuration.py
@@ -0,0 +1,159 @@
+# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Module to generate GN Configuration Reference."""
+import json
+import environment
+import os
+import re
+import subprocess
+import sys
+
+
+def print_doc_header(doc, title):
+  doc.write('Project: /youtube/cobalt/_project.yaml\n')
+  doc.write('Book: /youtube/cobalt/_book.yaml\n\n')
+  doc.write(f'# {title}\n\n')
+
+
+def print_section_property_table_header(doc, section):
+  section = section.replace('_', ' ').capitalize()
+  doc.write('| ' + section + ' |\n')
+  doc.write('| :--- |\n')
+
+
+def format_comment(raw_comment):
+  """Reformats the comment to be a single line and layout lists correctly."""
+  list_item_regex = re.compile(r'\s+"([^"]+)"\s*-+\s*(.*)')
+  continued_list_item_regex = re.compile(r'\s+')
+
+  comment = ''
+  is_last_line_list_item = False
+  for line in raw_comment.splitlines():
+    list_item_match = re.search(list_item_regex, line)
+    comment_text = line.strip()
+    if comment_text[0:4] == 'TODO':
+      continue
+    elif list_item_match:
+      is_last_line_list_item = True
+      comment += f'<li><code>{list_item_match[1]}</code> - {list_item_match[2]}'
+    elif comment_text == '':
+      comment += '<br><br>'
+    else:
+      if is_last_line_list_item:
+        continued_list_item_match = re.search(continued_list_item_regex, line)
+        if not continued_list_item_match:
+          comment += '</li>'
+      comment += ' ' + comment_text
+
+  # Wrap the list items in a list element.
+  comment = comment.replace('<li>', '<ul><li>', 1)
+  comment = last_replace(comment, '</li>', '</li></ul>')
+  return comment
+
+
+def print_item(doc, name, value, comment):
+  comment = format_comment(comment)
+  if value:
+    value = value.replace('|', r'\|')
+    if comment[-8:] != '<br><br>':
+      comment += '<br><br>'
+    comment += ('The default value is `' + value + '`.')
+  if comment[0:8] != '<br><br>':
+    doc.write('| **`' + name + '`**<br><br>' + comment + ' |\n')
+  else:
+    doc.write('| **`' + name + '`**' + comment + ' |\n')
+
+
+def create_reference_doc(site_path, variables):
+  reference_doc_path = os.path.join(site_path, 'docs', 'reference', 'starboard',
+                                    'gn-configuration.md')
+  environment.make_dirs(os.path.dirname(reference_doc_path))
+  with open(reference_doc_path, 'w', encoding='utf8') as doc:
+    print_doc_header(doc, 'Starboard: configuration.gni Reference Guide')
+
+    print_section_property_table_header(doc, 'variables')
+    for name, value, comment in sorted(variables, key=lambda x: x[0]):
+      print_item(doc, name, value, comment)
+
+
+def add_args(args, function_data):
+  function_data = function_data.replace(');', '')
+  if function_data == '':
+    return args
+  arg_list = function_data.split(',')
+  for arg_index in range(0, len(arg_list)):
+    arg_item_no_ws = arg_list[arg_index].strip()
+    if arg_item_no_ws != '':
+      arg_details = arg_item_no_ws.split(' ')
+      args.append({'name': arg_details.pop(), 'type': ' '.join(arg_details)})
+  return args
+
+
+def last_replace(value, old, new):
+  reverse_list = value.rsplit(old, 1)
+  return new.join(reverse_list)
+
+
+def main(source_dir, output_dir=None):
+  base_config_path = '//starboard/build/config/base_configuration.gni'
+
+  # `gn args` will resolve all variables used in the default values before
+  # printing so in order to keep the docs looking reasonable the variables
+  # used must be listed here.
+  # Note that `root_out_dir` is not a build argument and cannot be overridden.
+  args = ['clang_base_path']
+  args_overrides = ' '.join(f'{x}="<{x}>"' for x in args)
+  try:
+    out_dir = '/project_out_dir'
+    subprocess.check_call(['gn', 'gen', out_dir], cwd=source_dir)
+    output = subprocess.check_output(
+        ['gn', 'args', out_dir, '--list', '--json', '--args=' + args_overrides],
+        cwd=source_dir)
+  except subprocess.CalledProcessError as cpe:
+    raise RuntimeError(f'Failed to run GN: {cpe.output}') from cpe
+
+  # If `gn args` invokes any print statements these will be printed before the
+  # json string starts. Strip all lines until we encounter the start of the json
+  # array.
+  output_lines = output.decode('utf-8').splitlines()
+  gn_vars = []
+  while output_lines:
+    try:
+      gn_vars = json.loads(' '.join(output_lines))
+    except ValueError:
+      # If the attempt to parse the rest of the lines fails we remove the first
+      # line and try again.
+      output_lines = output_lines[1:]
+    else:
+      break
+
+  variables = []
+  for variable in gn_vars:
+    if variable['default'].get('file') == base_config_path:
+      name = variable['name']
+      value = variable['default']['value']
+      comment = variable.get('comment', '').strip()
+      variables.append((name, value, comment))
+
+  if output_dir:
+    site_path = environment.get_site_dir(output_dir)
+  else:
+    site_path = environment.get_site_dir(source_dir)
+  create_reference_doc(site_path, variables)
+  return 0
+
+
+if __name__ == '__main__':
+  options = environment.parse_arguments('', sys.argv[1:])
+  sys.exit(main(options.source, options.out))
diff --git a/cobalt/site/scripts/cobalt_module_reference.py b/cobalt/site/scripts/cobalt_module_reference.py
new file mode 100644
index 0000000..8cd3798
--- /dev/null
+++ b/cobalt/site/scripts/cobalt_module_reference.py
@@ -0,0 +1,486 @@
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Generates reference markdown documentation for Starboard modules.
+
+The full process:
+1. Preprocess the files to be Doxygen friendly (Doxygenation).
+2. Run Doxygen to produce XML that describes each module.
+3. Parse the XML and generate Markdown for each module.
+"""
+
+import contextlib
+from io import StringIO
+import logging
+import os
+import re
+import sys
+from xml.etree import ElementTree as ET
+
+import doxygen
+import environment
+from markdown_writer import MarkdownWriter
+
+_HEADER_PATTERN = r'.*\.h$'
+_HEADER_RE = re.compile(_HEADER_PATTERN)
+
+_HEADER_XML_PATTERN = r'.*h\.xml$'
+_HEADER_XML_RE = re.compile(_HEADER_XML_PATTERN)
+
+_SCRIPT_FILE = os.path.basename(__file__)
+_SCRIPT_NAME, _ = os.path.splitext(_SCRIPT_FILE)
+
+_OSS_STARBOARD_VERSIONS = [13, 14, 15]
+
+
+def _strip(string_or_none):
+  if string_or_none:
+    return string_or_none.strip()
+  return ''
+
+
+def _get_files(parent_path, regexp):
+  return sorted([
+      os.path.realpath(os.path.join(parent_path, x))
+      for x in os.listdir(parent_path)
+      if regexp.match(x)
+  ])
+
+
+def _find_filename(compounddef_element):
+  return _strip(compounddef_element.findtext('./compoundname'))
+
+
+def _find_name(member_def):
+  return _strip(member_def.findtext('./name'))
+
+
+def _has_innertext(element, query=''):
+  return bool(_find_innertext(element, query))
+
+
+def _has_description(memberdef_element):
+  return (_has_innertext(memberdef_element, './briefdescription') or
+          _has_innertext(memberdef_element, './detaileddescription'))
+
+
+def _find_innertext(element, query=''):
+  if element is None:
+    return ''
+  if query:
+    node = element.find(query)
+    if node is None:
+      return ''
+  else:
+    node = element
+  return _strip(''.join(x.strip() for x in node.itertext()))
+
+
+def _find_memberdefs(compounddef_element, kind):
+  return compounddef_element.findall(f'./sectiondef/memberdef[@kind="{kind}"]')
+
+
+def _find_documented_memberdefs(compounddef_element, kind):
+  memberdef_elements = _find_memberdefs(compounddef_element, kind)
+  if not memberdef_elements:
+    return {}
+
+  all_memberdefs = {_find_name(x): x for x in memberdef_elements}
+
+  def essential(k, v):
+    return _has_description(v) and not k.endswith('Private')
+
+  return {k: v for k, v in all_memberdefs.items() if essential(k, v)}
+
+
+def _find_structs(compounddef_element, xml_path):
+  innerclass_elements = compounddef_element.findall('./innerclass')
+  if not innerclass_elements:
+    return {}
+
+  all_struct_refids = [x.get('refid') for x in innerclass_elements]
+  all_struct_elements = {}
+  for refid in all_struct_refids:
+    struct_xml_path = os.path.join(xml_path, refid + '.xml')
+    struct_xml = ET.parse(struct_xml_path)
+    struct_elements = struct_xml.findall(
+        './/compounddef[@kind="struct"][compoundname]')
+    for struct_element in struct_elements:
+      struct_name = _find_filename(struct_element)
+      all_struct_elements[struct_name] = struct_element
+
+  def essential(k):
+    return not k.endswith('Private')
+
+  return {k: v for k, v in all_struct_elements.items() if essential(k)}
+
+
+def _find_struct_names(compounddef_element, xml_path):
+  return set(_find_structs(compounddef_element, xml_path).keys())
+
+
+def _find_documented_memberdef_names(compounddef_element, *args):
+  found = set([])
+  for kind in args:
+    found.update(_find_documented_memberdefs(compounddef_element, kind).keys())
+  return found
+
+
+def _find_member_definition(memberdef_element):
+  type_element = memberdef_element.find('./type')
+  type_name = _find_innertext(type_element)
+  args_name = _strip(memberdef_element.findtext('./argsstring'))
+  member_name = _strip(memberdef_element.findtext('./name'))
+  # Doxygen does not handle structs of non-typedef'd function pointers
+  # gracefully. The 'type" and "argsstring' elements are used to temporarily
+  # store the information needed to be able to rebuild the full signature, e.g.:
+  #
+  #  void (*glEnable)(SbGlEnum cap)
+  #
+  #    type = 'void (*'
+  #    name = 'glEnable'
+  #    argsstring = ')(SbGlEnum cap)'
+  #
+  # When we identify these members using the end of 'type' and the beginning of
+  # 'argsstring' we return the full member signature instead.
+  if type_name.endswith('(*') and args_name.startswith(')('):
+    return type_name + member_name + args_name
+  return type_name + ' ' + member_name
+
+
+def _node_to_markdown(out, node):
+  text = node.text.replace('|', '`') if node.text else ''
+  tail = node.tail.replace('|', '`') if node.tail else ''
+
+  if node.tag == 'ndash':
+    assert not _strip(text)
+    out.text('\u2013')
+  elif node.tag == 'mdash':
+    assert not _strip(text)
+    out.text('\u2013')
+  elif node.tag == 'para':
+    # Block tags should never be nested inside other blocks.
+    assert not _strip(tail)
+    out.paragraph()
+  elif node.tag == 'bold':
+    assert len(node) == 0
+    out.bold(text)
+  elif node.tag == 'computeroutput':
+    assert len(node) == 0
+    out.code(text)
+  elif node.tag == 'ulink':
+    url = node.get('url')
+    assert url
+    out.link(url)
+  elif node.tag == 'orderedlist':
+    # List tags should never have any text of their own.
+    assert not _strip(text)
+
+    # Block tags should never be nested inside other blocks.
+    assert not _strip(tail)
+    out.ordered_list()
+  elif node.tag == 'itemizedlist':
+    # List tags should never have any text of their own.
+    assert not _strip(text)
+
+    # Block tags should never be nested inside other blocks.
+    assert not _strip(tail)
+    out.unordered_list()
+  elif node.tag == 'listitem':
+    out.item()
+  elif node.tag == 'heading':
+    # Block tags should never be nested inside other blocks.
+    assert not _strip(tail)
+    try:
+      levels = int(node.get('level'))
+    except ValueError:
+      levels = 1
+    out.heading(levels=levels)
+  elif node.tag == 'verbatim':
+    # Verbatim tags can appear inside paragraphs.
+    assert len(node) == 0
+    # Don't replace pipes in verbatim text.
+    text = node.text if node.text else ''
+    out.code_block(text)
+    text = ''
+  else:
+    logging.warning('UNHANDLED: %s: %s', node.tag, text.replace('\n', '\\n'))
+
+  if text:
+    out.text(text)
+
+  for child in node:
+    _node_to_markdown(out, child)
+
+  if node.tag == 'para':
+    out.end_paragraph()
+  elif node.tag == 'ulink':
+    out.end_link()
+  elif node.tag in ['orderedlist', 'itemizedlist']:
+    out.end_list()
+  elif node.tag == 'heading':
+    out.end_heading()
+    out.pop_heading_level()
+  elif node.tag == 'listitem':
+    out.end_item()
+
+  if tail:
+    out.text(tail)
+
+
+def _description_to_markdown(out, description_element):
+  if description_element is None:
+    return
+
+  for child in description_element:
+    _node_to_markdown(out, child)
+
+
+def _emit_doc_header(out_io):
+  out_io.write('Project: /youtube/cobalt/_project.yaml\n')
+  out_io.write('Book: /youtube/cobalt/_book.yaml\n\n')
+
+
+def _emit_description(out, memberdef_element):
+  _description_to_markdown(out, memberdef_element.find('./briefdescription'))
+  _description_to_markdown(out, memberdef_element.find('./detaileddescription'))
+
+
+def _emit_macro(out, memberdef_element):
+  name = _find_name(memberdef_element)
+  assert name or _has_description(memberdef_element)
+
+  params = ''
+  param_defs = memberdef_element.findall('./param/defname')
+  if param_defs:
+    param_names = [_strip(x.text) for x in param_defs]
+    params = f'({", ".join(param_names)})'
+
+  logging.info('Macro: %s%s', name, params)
+  with out.auto_scoped_heading(name + params):
+    _emit_description(out, memberdef_element)
+
+
+def _emit_enum(out, memberdef_element):
+  name = _find_name(memberdef_element)
+  assert name or _has_description(memberdef_element)
+
+  logging.info('Enum: %s', name)
+  with out.auto_scoped_heading(name):
+    _emit_description(out, memberdef_element)
+    with out.auto_scoped_heading('Values'):
+      with out.auto_unordered_list():
+        for enumvalue_element in memberdef_element.findall('./enumvalue'):
+          with out.auto_item():
+            out.code(_find_name(enumvalue_element))
+            _emit_description(out, enumvalue_element)
+
+
+def _emit_typedef(out, memberdef_element):
+  name = _find_name(memberdef_element)
+  assert name or _has_description(memberdef_element)
+
+  with out.auto_scoped_heading(name):
+    _emit_description(out, memberdef_element)
+    definition = _strip(memberdef_element.findtext('./definition'))
+    if definition:
+      with out.auto_scoped_heading('Definition'):
+        out.code_block(definition)
+
+
+def _emit_struct(out, compounddef_element):
+  name = _find_filename(compounddef_element)
+  assert name or _has_description(compounddef_element)
+
+  logging.info('Struct: %s', name)
+  with out.auto_scoped_heading(name):
+    _emit_description(out, compounddef_element)
+    memberdef_elements = _find_memberdefs(compounddef_element, 'variable')
+    if memberdef_elements:
+      with out.auto_scoped_heading('Members'):
+        with out.auto_unordered_list():
+          for memberdef_element in memberdef_elements:
+            with out.auto_item():
+              out.code(_find_member_definition(memberdef_element))
+              _emit_description(out, memberdef_element)
+
+
+def _emit_variable(out, memberdef_element):
+  name = _find_name(memberdef_element)
+  assert name or _has_description(memberdef_element)
+
+  logging.info('Variable: %s', name)
+  with out.auto_scoped_heading(name):
+    _emit_description(out, memberdef_element)
+
+
+def _emit_function(out, memberdef_element):
+  name = _find_name(memberdef_element)
+  assert name or _has_description(memberdef_element)
+
+  logging.info('Function: %s', name)
+  with out.auto_scoped_heading(name):
+    _emit_description(out, memberdef_element)
+    prototype = memberdef_element.findtext('./definition') + \
+                memberdef_element.findtext('./argsstring')
+    if prototype:
+      with out.auto_scoped_heading('Declaration'):
+        out.code_block(prototype)
+
+
+def _emit_macros(out, compounddef_element):
+  member_dict = _find_documented_memberdefs(compounddef_element, 'define')
+  if not member_dict:
+    return False
+
+  with out.auto_scoped_heading('Macros'):
+    for name in sorted(member_dict.keys()):
+      _emit_macro(out, member_dict[name])
+  return True
+
+
+def _emit_enums(out, compounddef_element):
+  member_dict = _find_documented_memberdefs(compounddef_element, 'enum')
+  if not member_dict:
+    return False
+
+  with out.auto_scoped_heading('Enums'):
+    for name in sorted(member_dict.keys()):
+      _emit_enum(out, member_dict[name])
+  return True
+
+
+def _emit_typedefs(out, compounddef_element, xml_path):
+  member_dict = _find_documented_memberdefs(compounddef_element, 'typedef')
+  redundant_set = _find_documented_memberdef_names(compounddef_element,
+                                                   'define', 'enum', 'function')
+  redundant_set |= _find_struct_names(compounddef_element, xml_path)
+  essential_set = set(member_dict.keys()) - redundant_set
+  if not essential_set:
+    return False
+
+  with out.auto_scoped_heading('Typedefs'):
+    for name in sorted(essential_set):
+      _emit_typedef(out, member_dict[name])
+  return True
+
+
+def _emit_structs(out, compounddef_element, xml_path):
+  struct_dict = _find_structs(compounddef_element, xml_path)
+  if not struct_dict:
+    return False
+
+  with out.auto_scoped_heading('Structs'):
+    for name in sorted(struct_dict.keys()):
+      _emit_struct(out, struct_dict[name])
+  return True
+
+
+def _emit_variables(out, compounddef_element):
+  member_dict = _find_documented_memberdefs(compounddef_element, 'variable')
+  if not member_dict:
+    return False
+
+  with out.auto_scoped_heading('Variables'):
+    for name in sorted(member_dict.keys()):
+      _emit_variable(out, member_dict[name])
+  return True
+
+
+def _emit_functions(out, compounddef_element):
+  member_dict = _find_documented_memberdefs(compounddef_element, 'function')
+  if not member_dict:
+    return False
+
+  with out.auto_scoped_heading('Functions'):
+    for name in sorted(member_dict.keys()):
+      _emit_function(out, member_dict[name])
+  return True
+
+
+def _emit_file(out_io, compounddef_element, xml_path):
+  header_filename = _find_filename(compounddef_element)
+  logging.info('File: %s', header_filename)
+  _emit_doc_header(out_io)
+  mdwriter = MarkdownWriter(out_io)
+  with mdwriter.auto_scoped_heading(
+      f'Starboard Module Reference: `{header_filename}`'):
+    _emit_description(mdwriter, compounddef_element)
+    # When an API is deprecated it will be removed via #ifdef. When this is the
+    # case, we will no longer have macros, enums, typedefs, structs, or
+    # functions and thus the API should not be included in the site.
+    has_content = _emit_macros(mdwriter, compounddef_element)
+    has_content = _emit_enums(mdwriter, compounddef_element) or has_content
+    has_content = _emit_typedefs(mdwriter, compounddef_element,
+                                 xml_path) or has_content
+    has_content = _emit_structs(mdwriter, compounddef_element,
+                                xml_path) or has_content
+    has_content = _emit_variables(mdwriter, compounddef_element) or has_content
+    has_content = _emit_functions(mdwriter, compounddef_element) or has_content
+  return has_content
+
+
+def generate(source_dir, output_dir):
+  if output_dir:
+    site_path = environment.get_site_dir(output_dir)
+  else:
+    site_path = environment.get_site_dir(source_dir)
+  doc_dir_path = os.path.join(site_path, 'docs', 'reference', 'starboard',
+                              'modules')
+  environment.make_clean_dirs(doc_dir_path)
+  starboard_directory_path = environment.get_starboard_dir(source_dir)
+  starboard_files = _get_files(starboard_directory_path, _HEADER_RE)
+  with environment.mkdtemp(suffix='.' + _SCRIPT_NAME) as temp_directory_path:
+    logging.debug('Working directory: %s', temp_directory_path)
+    doxygenated_directory_path = os.path.join(temp_directory_path,
+                                              'doxygenated')
+    doxygenated_files = doxygen.doxygenate(starboard_files,
+                                           doxygenated_directory_path)
+    doxygen_directory_path = os.path.join(temp_directory_path, 'doxygen')
+    for sb_version in _OSS_STARBOARD_VERSIONS:
+      version_path = os.path.join(doxygen_directory_path, str(sb_version))
+      version_doc_dir_path = os.path.join(doc_dir_path, str(sb_version))
+      doxygen.doxygen(sb_version, doxygenated_files, [], version_path)
+      doxygen_xml_path = os.path.join(version_path, 'xml')
+      for header_xml_path in _get_files(doxygen_xml_path, _HEADER_XML_RE):
+        header_xml = ET.parse(header_xml_path)
+        for compounddef_element in header_xml.findall(
+            './/compounddef[@kind="file"][compoundname]'):
+          environment.make_dirs(version_doc_dir_path)
+          header_filename = _find_filename(compounddef_element)
+          doc_filename = (
+              os.path.splitext(os.path.basename(header_filename))[0] + '.md')
+          with contextlib.closing(StringIO()) as doc_file:
+            if not _emit_file(doc_file, compounddef_element, doxygen_xml_path):
+              continue
+            doc_contents = doc_file.getvalue()
+          doc_file_path = os.path.join(version_doc_dir_path, doc_filename)
+          environment.write_file(doc_file_path, doc_contents)
+
+          # Make the latest Starboard documentation version the default version.
+          if sb_version == _OSS_STARBOARD_VERSIONS[-1]:
+            doc_file_path = os.path.join(doc_dir_path, doc_filename)
+            environment.write_file(doc_file_path, doc_contents)
+
+  return 0
+
+
+def main(argv):
+  environment.setup_logging()
+  options = environment.parse_arguments(__doc__, argv)
+  environment.set_log_level(options.log_delta)
+  return generate(options.source, options.out)
+
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv[1:]))
diff --git a/cobalt/site/scripts/doxyfile.template b/cobalt/site/scripts/doxyfile.template
new file mode 100644
index 0000000..f6c5b93
--- /dev/null
+++ b/cobalt/site/scripts/doxyfile.template
@@ -0,0 +1,332 @@
+# Doxyfile 1.8.6
+
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "Starboard API"
+PROJECT_NUMBER         = {project_number}
+PROJECT_BRIEF          = "The Cobalt Porting API"
+OUTPUT_DIRECTORY       = {output_directory}
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = NO
+REPEAT_BRIEF           = NO
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = YES
+STRIP_FROM_PATH        =
+STRIP_FROM_INC_PATH    =
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 2
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+EXTENSION_MAPPING      =
+MARKDOWN_SUPPORT       = YES
+AUTOLINK_SUPPORT       = YES
+BUILTIN_STL_SUPPORT    = YES
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = NO
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS  = NO
+TYPEDEF_HIDES_STRUCT   = NO
+LOOKUP_CACHE_SIZE      = 0
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_PACKAGE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = NO
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = NO
+SHOW_GROUPED_MEMB_INC  = NO
+FORCE_LOCAL_INCLUDES   = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+STRICT_PROTO_MATCHING  = NO
+GENERATE_TODOLIST      = NO
+GENERATE_TESTLIST      = NO
+GENERATE_BUGLIST       = NO
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       =
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = NO
+SHOW_FILES             = NO
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    =
+LAYOUT_FILE            =
+CITE_BIB_FILES         =
+
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           =
+INPUT                  = {input_files}
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.idl \
+                         *.ddl \
+                         *.odl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.cs \
+                         *.d \
+                         *.php \
+                         *.php4 \
+                         *.php5 \
+                         *.phtml \
+                         *.inc \
+                         *.m \
+                         *.markdown \
+                         *.md \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.f90 \
+                         *.f \
+                         *.for \
+                         *.tcl \
+                         *.vhd \
+                         *.vhdl \
+                         *.ucf \
+                         *.qsf \
+                         *.as \
+                         *.js
+RECURSIVE              = NO
+EXCLUDE                =
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       =
+EXCLUDE_SYMBOLS        =
+EXAMPLE_PATH           =
+EXAMPLE_PATTERNS       = *
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             =
+INPUT_FILTER           =
+FILTER_PATTERNS        =
+FILTER_SOURCE_FILES    = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+SOURCE_TOOLTIPS        = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+
+ALPHABETICAL_INDEX     = YES
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          =
+
+GENERATE_HTML          = NO
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            =
+HTML_FOOTER            =
+HTML_STYLESHEET        =
+HTML_EXTRA_STYLESHEET  =
+HTML_EXTRA_FILES       =
+HTML_COLORSTYLE_HUE    = 220
+HTML_COLORSTYLE_SAT    = 100
+HTML_COLORSTYLE_GAMMA  = 80
+HTML_TIMESTAMP         = YES
+HTML_DYNAMIC_SECTIONS  = NO
+HTML_INDEX_NUM_ENTRIES = 100
+
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME  = Publisher
+
+GENERATE_HTMLHELP      = NO
+CHM_FILE               =
+HHC_LOCATION           =
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     =
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+
+GENERATE_QHP           = NO
+QCH_FILE               =
+QHP_NAMESPACE          = org.doxygen.Project
+QHP_VIRTUAL_FOLDER     = doc
+QHP_CUST_FILTER_NAME   =
+QHP_CUST_FILTER_ATTRS  =
+QHP_SECT_FILTER_ATTRS  =
+QHG_LOCATION           =
+
+GENERATE_ECLIPSEHELP   = NO
+ECLIPSE_DOC_ID         = org.doxygen.Project
+DISABLE_INDEX          = NO
+GENERATE_TREEVIEW      = NO
+ENUM_VALUES_PER_LINE   = 4
+TREEVIEW_WIDTH         = 250
+EXT_LINKS_IN_WINDOW    = NO
+FORMULA_FONTSIZE       = 10
+FORMULA_TRANSPARENT    = YES
+USE_MATHJAX            = NO
+MATHJAX_FORMAT         = HTML-CSS
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+MATHJAX_EXTENSIONS     =
+MATHJAX_CODEFILE       =
+SEARCHENGINE           = YES
+SERVER_BASED_SEARCH    = NO
+EXTERNAL_SEARCH        = NO
+SEARCHENGINE_URL       =
+SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
+EXTRA_SEARCH_MAPPINGS  =
+
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4
+EXTRA_PACKAGES         =
+LATEX_HEADER           =
+LATEX_FOOTER           =
+LATEX_EXTRA_FILES      =
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+LATEX_SOURCE_CODE      = NO
+LATEX_BIB_STYLE        = plain
+
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    =
+RTF_EXTENSIONS_FILE    =
+
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+
+GENERATE_XML           = YES
+XML_OUTPUT             = xml
+XML_SCHEMA             =
+XML_DTD                =
+XML_PROGRAMLISTING     = NO
+
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+
+GENERATE_AUTOGEN_DEF   = NO
+
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX =
+
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  = *.h
+PREDEFINED             = COMPONENT_BUILD=1 \
+                         SB_CAN(x)=1 \
+                         SB_C_FORCE_INLINE=inline \
+                         SB_C_INLINE=inline \
+                         SB_DEPRECATED_EXTERNAL(x)=x \
+                         SB_EXPORT= \
+                         SB_HAS(x)=1 \
+                         SB_IS(x)=1 \
+                         STARBOARD_IMPLEMENTATION \
+                         {predefined_macros}
+EXPAND_AS_DEFINED      =
+SKIP_FUNCTION_MACROS   = NO
+
+TAGFILES               =
+GENERATE_TAGFILE       =
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = NO
+EXTERNAL_PAGES         = NO
+PERL_PATH              = /usr/bin/perl
+
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            =
+DIA_PATH               =
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = NO
+DOT_NUM_THREADS        = 0
+DOT_FONTNAME           = Helvetica
+DOT_FONTSIZE           = 10
+DOT_FONTPATH           =
+CLASS_GRAPH            = NO
+COLLABORATION_GRAPH    = NO
+GROUP_GRAPHS           = NO
+UML_LOOK               = NO
+UML_LIMIT_NUM_FIELDS   = 10
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = NO
+INCLUDED_BY_GRAPH      = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+INTERACTIVE_SVG        = NO
+DOT_PATH               =
+DOTFILE_DIRS           =
+MSCFILE_DIRS           =
+DIAFILE_DIRS           =
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
diff --git a/cobalt/site/scripts/doxygen.py b/cobalt/site/scripts/doxygen.py
new file mode 100644
index 0000000..499e258
--- /dev/null
+++ b/cobalt/site/scripts/doxygen.py
@@ -0,0 +1,172 @@
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Python wrapper for Doxygen."""
+
+import errno
+import logging
+import os
+import re
+import subprocess
+
+import environment
+
+_MODULE_OVERVIEW_PATTERN = r'Module Overview: '
+_MODULE_OVERVIEW_RE = re.compile(_MODULE_OVERVIEW_PATTERN)
+
+
+def _subprocess(command, working_directory):
+  """Executes command in working_directory."""
+  if not os.path.isdir(working_directory):
+    raise RuntimeError(
+        f'Running {command}: directory {working_directory} not found')
+
+  try:
+    # shell=True for Windows to be able to find git in the PATH.
+    subprocess.check_output(
+        ' '.join(command),
+        shell=True,
+        cwd=working_directory,
+        stderr=subprocess.STDOUT)
+    return True
+  except subprocess.CalledProcessError as e:
+    logging.warning('%s: \"%s\" failed. Return Code: %d', working_directory,
+                    e.cmd, e.returncode)
+    logging.debug('>>>\n%s\n<<<', e.output)
+    return False
+
+
+def _mkdirs(directory_path):
+  """Makes the given path and all ancestors necessary."""
+  try:
+    os.makedirs(directory_path)
+  except OSError as e:
+    if e.errno == errno.EEXIST and os.path.isdir(directory_path):
+      pass
+    else:
+      raise
+
+
+def _join_config(lines):
+  return ' \\\n  '.join(lines)
+
+
+def doxygen(project_number, input_files, predefined_macros,
+            output_directory_path):
+  """Runs doxygen with the given semantic parameters."""
+  doxyfile_template_path = os.path.join(environment.SCRIPTS_DIR,
+                                        'doxyfile.template')
+  doxyfile_template = environment.read_file(doxyfile_template_path)
+  os.makedirs(output_directory_path)
+  predefined_macros = predefined_macros[:]
+  predefined_macros.append(f'SB_API_VERSION={project_number}')
+  doxyfile_contents = doxyfile_template.format(
+      **{
+          'project_number': 1,
+          'output_directory': output_directory_path,
+          'input_files': _join_config(input_files),
+          'predefined_macros': _join_config(predefined_macros),
+      })
+
+  doxyfile_path = os.path.join(output_directory_path, 'Doxyfile')
+  environment.write_file(doxyfile_path, doxyfile_contents)
+  _subprocess(['doxygen', doxyfile_path], output_directory_path)
+
+
+def _split(line):
+  """Splits a line into a (indentation, lstripped content) tuple."""
+  stripped = line.lstrip()
+  return line[:(len(line) - len(stripped))], stripped
+
+
+def _doxygenate_line(line):
+  """Adds an extra slash to a comment line."""
+  indent, stripped = _split(line)
+  return indent + '/' + stripped
+
+
+def _doxygenate_lines(lines):
+  """Makes a list of comment lines visible to Doxygen."""
+  if not lines:
+    return []
+  indent, _ = _split(lines[0])
+  return [_doxygenate_line(x) for x in lines] + [indent + '///']
+
+
+def _is_comment(line):
+  """Whether the given line is a comment."""
+  stripped = line.lstrip()
+  return stripped[0] == '/'
+
+
+def _find_end_of_block(line_iterator):
+  """Consumes the next comment block, returning (comment_list, terminator)."""
+  lines = []
+  last_line = None
+
+  any_lines = False
+  for line in line_iterator:
+    any_lines = True
+    if not line or not _is_comment(line):
+      last_line = line
+      break
+    lines.append(line)
+  if not any_lines:
+    raise StopIteration
+
+  return lines, last_line
+
+
+def doxygenate(input_file_paths, output_directory):
+  """Converts a list of source files into more doxygen-friendly files."""
+  common_prefix_path = os.path.commonprefix(input_file_paths)
+  output_file_paths = []
+  os.makedirs(output_directory)
+  for input_file_path in input_file_paths:
+    output_file_path = os.path.join(output_directory,
+                                    input_file_path[len(common_prefix_path):])
+    _mkdirs(os.path.dirname(output_file_path))
+    input_contents = environment.read_lines(input_file_path)
+    output_contents = []
+    line_iterator = iter(x.rstrip() for x in input_contents)
+    try:
+      # Remove copyright header.
+      _, _ = _find_end_of_block(line_iterator)
+
+      # Doxygenate module overview.
+      lines, last_line = _find_end_of_block(line_iterator)
+      if not lines:
+        continue
+      output_contents.append(f'/// \\file {os.path.basename(input_file_path)}')
+      if _MODULE_OVERVIEW_RE.search(lines[0]):
+        del lines[0]
+      output_contents.extend(_doxygenate_lines(lines))
+      output_contents.append(last_line)
+
+      # Doxygenate module overview.
+      lines, last_line = _find_end_of_block(line_iterator)
+
+      # Doxygenate the rest of the file, block by block.
+      while True:
+        lines, last_line = _find_end_of_block(line_iterator)
+        if not last_line:
+          continue
+        if lines:
+          output_contents.extend(_doxygenate_lines(lines))
+        output_contents.append(last_line)
+    except StopIteration:
+      pass
+
+    environment.write_file(output_file_path, '\n'.join(output_contents))
+    output_file_paths.append(output_file_path)
+  return output_file_paths
diff --git a/cobalt/site/scripts/environment.py b/cobalt/site/scripts/environment.py
new file mode 100644
index 0000000..8680b56
--- /dev/null
+++ b/cobalt/site/scripts/environment.py
@@ -0,0 +1,165 @@
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Common variables and functions for site generation."""
+
+import argparse
+from contextlib import contextmanager
+import errno
+import logging
+import os
+import shutil
+import tempfile
+import textwrap
+
+SCRIPTS_DIR = os.path.abspath(os.path.dirname(__file__))
+COBALT_SOURCE_DIR = os.path.abspath(
+    os.path.join(*([SCRIPTS_DIR] + 3 * [os.pardir])))
+
+
+@contextmanager
+def mkdtemp(suffix='', prefix='tmp.', base_dir=None):
+  temp_directory_path = tempfile.mkdtemp(suffix, prefix, base_dir)
+  try:
+    yield temp_directory_path
+  finally:
+    if temp_directory_path:
+      try:
+        shutil.rmtree(temp_directory_path)
+      except IOError:
+        logging.warning('Failed to delete temp directory: %s',
+                        temp_directory_path)
+      else:
+        logging.info('Deleted temp directory: %s', temp_directory_path)
+
+
+def read_lines(path):
+  with open(path, 'r', encoding='utf8') as contents:
+    return contents.readlines()
+
+
+def read_file(path):
+  with open(path, 'r', encoding='utf8') as contents:
+    return contents.read()
+
+
+def write_file(path, contents):
+  with open(path, 'w', encoding='utf8') as output:
+    output.write(contents)
+
+
+def setup_logging(default_level=logging.INFO):
+  logging_level = default_level
+  logging_format = '%(asctime)s.%(msecs)03d [%(levelname)-8s] %(message)s'
+  datetime_format = '%H:%M:%S'
+  logging.basicConfig(
+      level=logging_level, format=logging_format, datefmt=datetime_format)
+
+
+_LOG_LEVELS = [
+    logging.CRITICAL,
+    logging.ERROR,
+    logging.WARNING,
+    logging.INFO,
+    logging.DEBUG,
+]
+
+
+def set_log_level(log_delta):
+  """Sets the log level based on the log delta from default."""
+  logger = logging.getLogger()
+  try:
+    level_index = _LOG_LEVELS.index(logger.getEffectiveLevel())
+  except ValueError:
+    level_index = _LOG_LEVELS.index(logging.INFO)
+
+  level_index = min(len(_LOG_LEVELS) - 1, max(0, level_index + log_delta))
+  logging.getLogger().setLevel(_LOG_LEVELS[level_index])
+
+
+def parse_arguments(doc_string, argv):
+  parser = argparse.ArgumentParser(
+      formatter_class=argparse.ArgumentDefaultsHelpFormatter,
+      description=textwrap.dedent(doc_string))
+  parser.add_argument(
+      '-s',
+      '--source',
+      type=str,
+      default=COBALT_SOURCE_DIR,
+      help='The repository root that contains the source code to parse.')
+  parser.add_argument(
+      '-o',
+      '--out',
+      type=str,
+      default=None,
+      help='The root of the directory to output to.')
+  parser.add_argument(
+      '-v',
+      '--verbose',
+      dest='verbose_count',
+      default=0,
+      action='count',
+      help='Verbose level (multiple times for more).')
+  parser.add_argument(
+      '-q',
+      '--quiet',
+      dest='quiet_count',
+      default=0,
+      action='count',
+      help='Quietness level (multiple times for more).')
+  options = parser.parse_args(argv)
+  options.log_delta = options.verbose_count - options.quiet_count
+  return options
+
+
+def get_cobalt_dir(source_dir):
+  return os.path.join(source_dir, 'cobalt')
+
+
+def get_cobalt_build_dir(source_dir):
+  return os.path.join(get_cobalt_dir(source_dir), 'build')
+
+
+def get_site_dir(source_dir):
+  return os.path.join(get_cobalt_dir(source_dir), 'site')
+
+
+def get_starboard_dir(source_dir):
+  return os.path.join(source_dir, 'starboard')
+
+
+def get_starboard_build_dir(source_dir):
+  return os.path.join(get_starboard_dir(source_dir), 'build')
+
+
+def get_stub_platform_dir(source_dir):
+  return os.path.join(get_starboard_dir(source_dir), 'stub')
+
+
+def make_dirs(path):
+  """Make the specified directory and any parents in the path."""
+  if path and not os.path.isdir(path):
+    make_dirs(os.path.dirname(path))
+    try:
+      os.mkdir(path)
+    except OSError as e:
+      if e.errno != errno.EEXIST:
+        raise
+      pass
+
+
+def make_clean_dirs(path):
+  """Make the specified directory and any parents in the path."""
+  make_dirs(os.path.dirname(path))
+  shutil.rmtree(path, ignore_errors=True)
+  make_dirs(path)
diff --git a/cobalt/site/scripts/generate_site.py b/cobalt/site/scripts/generate_site.py
new file mode 100755
index 0000000..2d30d24
--- /dev/null
+++ b/cobalt/site/scripts/generate_site.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Generate the Cobalt Developer site markdown.
+
+This script generates all documentation derived from source, placing
+the precipitate markdown files in the specified output directory.
+"""
+
+import sys
+
+import cobalt_configuration_public
+import cobalt_documentation
+import cobalt_gn_configuration
+import cobalt_module_reference
+import environment
+
+
+def main(argv):
+  environment.setup_logging()
+  arguments = environment.parse_arguments(__doc__, argv)
+  environment.set_log_level(arguments.log_delta)
+
+  result = cobalt_configuration_public.main(arguments.source, arguments.out)
+  if result:
+    return result
+
+  result = cobalt_gn_configuration.main(arguments.source, arguments.out)
+  if result:
+    return result
+
+  result = cobalt_module_reference.generate(arguments.source, arguments.out)
+  if result:
+    return result
+
+  cobalt_documentation.copy_doc_locations(arguments.source, arguments.out)
+
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv[1:]))
diff --git a/cobalt/site/scripts/markdown_writer.py b/cobalt/site/scripts/markdown_writer.py
new file mode 100644
index 0000000..a954e9e
--- /dev/null
+++ b/cobalt/site/scripts/markdown_writer.py
@@ -0,0 +1,359 @@
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Provides an interface to produce valid, readable Markdown documents."""
+
+import contextlib
+import logging
+import textwrap
+
+_CONTEXT_NONE = 'none'
+_CONTEXT_LINK = 'link'
+_CONTEXT_LIST = 'list'
+_CONTEXT_ITEM = 'item'
+_CONTEXT_HEADING = 'heading'
+
+_LIST_TYPE_ORDERED = 'ordered'
+_LIST_TYPE_UNORDERED = 'unordered'
+
+# Ready to start a new parapgrah
+_STATE_BASE = 'base'
+
+# On an empty line with a paragraph on the previous line.
+_STATE_EMPTY = 'empty'
+
+# Inside a partial text block.
+_STATE_INLINE = 'inline'
+
+
+def _strip(string_or_none):
+  if string_or_none:
+    return string_or_none.strip()
+  return ''
+
+
+def _stripwrap(body, width):
+  return textwrap.fill(
+      _strip(body), width, break_long_words=False, replace_whitespace=False)
+
+
+def _get_list_prefix(list_type, depth):
+  list_marker = '1.' if list_type == _LIST_TYPE_ORDERED else '*'
+  return f'{"    " * depth}{list_marker:4.4}'
+
+
+class _Context(object):
+  """Stores info about current context in the document."""
+
+  def __init__(self, context_type, url=None, list_type=None, pending=False):
+    self.context_type = context_type
+    self.url = url
+    self.list_type = list_type
+    self.pending = pending
+
+  def test_and_clear_pending_list(self):
+    if self.context_type == _CONTEXT_ITEM and self.pending:
+      self.pending = False
+      return True
+    return False
+
+
+class MarkdownWriter(object):
+  """Stateful wrapper for a file-like object to generate Markdown."""
+
+  def __init__(self, out, width=80, heading_level=0):
+    assert heading_level >= 0
+    self.out = out
+    self.width = width
+    self.base_heading_level = heading_level
+    self.heading_stack = []
+    self.context_stack = [_Context(_CONTEXT_NONE)]
+    self.state = _STATE_BASE
+    self.current_line = ''
+
+  def heading(self, levels=1):
+    logging.debug('MdW: heading(%d)', levels)
+    assert levels >= 1
+    self.context_stack.append(_Context(_CONTEXT_HEADING))
+    self.heading_stack.append(levels)
+    self._return_to_base()
+    self.text(('#' * self._get_heading_level()) + ' ', wrap=False)
+    assert self._get_heading_level() >= 1
+
+  def end_heading(self):
+    logging.debug('MdW: end_heading()')
+    assert self._get_context_type() == _CONTEXT_HEADING
+    self.context_stack.pop()
+    self._return_to_empty()
+
+  def pop_heading_level(self):
+    logging.debug('MdW: pop_heading_level()')
+    self.heading_stack.pop()
+    assert self._get_heading_level() >= 0
+
+  def code_block(self, contents, language=None):
+    logging.debug('MdW: code_block(%s, %s)', contents.replace('\n', '\\n'),
+                  language)
+    self._return_to_base()
+    if not language:
+      language = ''
+    self.text(f'```{language}\n{contents}\n```\n\n', wrap=False)
+    self._set_state(_STATE_BASE, 'code block')
+
+  def ordered_list(self):
+    logging.debug('MdW: ordered_list()')
+    self._return_to_base()
+    self.context_stack.append(
+        _Context(_CONTEXT_LIST, list_type=_LIST_TYPE_ORDERED))
+
+  def unordered_list(self):
+    logging.debug('MdW: unordered_list()')
+    self._return_to_base()
+    self.context_stack.append(
+        _Context(_CONTEXT_LIST, list_type=_LIST_TYPE_UNORDERED))
+
+  def end_list(self):
+    logging.debug('MdW: end_list()')
+    assert self._get_context_type() == _CONTEXT_LIST
+    self.context_stack.pop()
+    self._return_to_base()
+
+  def item(self):
+    logging.debug('MdW: item()')
+    assert self._get_context_type() == _CONTEXT_LIST
+    self.context_stack.append(_Context(_CONTEXT_ITEM, pending=True))
+
+  def end_item(self):
+    logging.debug('MdW: end_item()')
+    assert self._get_context_type() == _CONTEXT_ITEM
+    self._return_to_empty()
+    self.context_stack.pop()
+
+  def link(self, url):
+    logging.debug('MdW: link(%s)', url)
+    assert url
+    self.context_stack.append(_Context(_CONTEXT_LINK, url=url))
+    self.text('[', wrap=True)
+
+  def end_link(self):
+    logging.debug('MdW: end_link()')
+    context = self._get_context()
+    assert context.context_type == _CONTEXT_LINK
+    self.text(f']({context.url})', wrap=False)
+    self.context_stack.pop()
+
+  def paragraph(self):
+    logging.debug('MdW: paragraph()')
+    self._return_to_base()
+
+  def end_paragraph(self):
+    logging.debug('MdW: end_paragraph()')
+    self._return_to_empty()
+
+  def code(self, contents, wrap=None):
+    self._style_text(contents.replace('`', '``'), '`', wrap)
+
+  def bold(self, contents, wrap=None):
+    self._style_text(contents, '**', wrap)
+
+  def highlight(self, contents, wrap=None):
+    self._style_text(contents, '==', wrap)
+
+  def italics(self, contents, wrap=None):
+    self._style_text(contents, '*', wrap)
+
+  def strikeout(self, contents, wrap=None):
+    self._style_text(contents, '~~', wrap)
+
+  def text(self, contents, wrap=None):
+    logging.debug('MdW: text(%s, %s)', contents.replace('\n', '\\n'), str(wrap))
+    if not contents or not contents.strip():
+      return
+
+    wrap = self._default_wrap(wrap)
+    if wrap:
+      contents = contents.strip()
+      if self.current_line and self.current_line[-1] != ' ':
+        contents = ' ' + contents
+      if not contents:
+        return
+      current_line_length = len(self.current_line)
+      contents = textwrap.fill(
+          self.current_line + contents,
+          self._get_wrap_width(),
+          break_long_words=False)
+      contents = contents[current_line_length:]
+
+    lines = contents.split('\n')
+    if not lines:
+      return
+
+    if self.current_line or self.state in [_STATE_BASE, _STATE_EMPTY]:
+      if self._get_context().test_and_clear_pending_list():
+        self._return_to_empty()
+        self.out.write(self._get_list_prefix())
+        self._set_state(_STATE_INLINE, 'list prefix')
+      elif self.state in [_STATE_BASE, _STATE_EMPTY]:
+        indent = self._get_indent()
+        if indent:
+          self.out.write(indent)
+          self._set_state(_STATE_INLINE, 'indentation')
+      self.out.write(lines[0])
+      self.current_line += lines[0]
+      self._set_state(_STATE_INLINE, 'first line')
+      del lines[0]
+      if lines:
+        self.out.write('\n')
+        self.current_line = ''
+        self._set_state(_STATE_EMPTY, 'more lines')
+
+    if lines:
+      indent = self._get_indent()
+      conjunction = '\n' + indent
+      self.out.write(indent + conjunction.join(lines))
+      self.current_line = lines[-1]
+
+    if not self.current_line:
+      self._set_state(_STATE_EMPTY, 'no current line')
+    else:
+      self._set_state(_STATE_INLINE, 'current line')
+
+  @contextlib.contextmanager
+  def auto_heading(self, levels=1):
+    self.heading(levels=levels)
+    yield
+    self.end_heading()
+
+  @contextlib.contextmanager
+  def auto_scoped_heading(self, text, levels=1):
+    with self.auto_heading(levels):
+      self.text(text)
+    yield
+    self.pop_heading_level()
+
+  @contextlib.contextmanager
+  def auto_paragraph(self):
+    self.paragraph()
+    yield
+    self.end_paragraph()
+
+  @contextlib.contextmanager
+  def auto_link(self, url):
+    self.link(url)
+    yield
+    self.end_link()
+
+  @contextlib.contextmanager
+  def auto_unordered_list(self):
+    self.unordered_list()
+    yield
+    self.end_list()
+
+  @contextlib.contextmanager
+  def auto_ordered_list(self):
+    self.ordered_list()
+    yield
+    self.end_list()
+
+  @contextlib.contextmanager
+  def auto_item(self):
+    self.item()
+    yield
+    self.end_item()
+
+  def _get_list_context(self):
+    for context in reversed(self.context_stack):
+      if context.context_type == _CONTEXT_LIST:
+        return context
+    return None
+
+  def _get_list_type(self):
+    context = self._get_list_context()
+    if not context:
+      return None
+    return context.list_type
+
+  def _get_list_depth(self):
+    depth = 0
+    for context in self.context_stack:
+      if context.context_type == _CONTEXT_LIST:
+        depth += 1
+    if not depth:
+      return 0
+    return depth
+
+  def _get_context_type(self):
+    context = self._get_context()
+    if not context:
+      return None
+    return context.context_type
+
+  def _get_context(self):
+    if not self.context_stack:
+      return None
+    return self.context_stack[-1]
+
+  def _style_text(self, contents, style, wrap):
+    if not contents or not contents.strip():
+      return
+    self.text(f'{style}{contents}{style}', wrap)
+
+  def _return_to_empty(self):
+    if self.state in [_STATE_BASE, _STATE_EMPTY]:
+      return
+
+    if self.state == _STATE_INLINE:
+      self.out.write('\n')
+      self.current_line = ''
+      self._set_state(_STATE_EMPTY)
+      return
+
+    assert False
+
+  def _return_to_base(self):
+    self._return_to_empty()
+
+    if self.state == _STATE_BASE:
+      return
+
+    if self.state == _STATE_EMPTY:
+      self.out.write('\n')
+      self._set_state(_STATE_BASE)
+      return
+
+    assert False
+
+  def _set_state(self, state, label=''):
+    if self.state != state:
+      logging.debug('MdW: STATE%s: %s -> %s',
+                    '(' + label + ')' if label else '', self.state, state)
+    self.state = state
+
+  def _get_indent(self):
+    return (' ' * 4) * self._get_list_depth()
+
+  def _get_heading_level(self):
+    return self.base_heading_level + sum(self.heading_stack)
+
+  def _get_list_prefix(self):
+    return _get_list_prefix(self._get_list_type(), self._get_list_depth() - 1)
+
+  def _get_wrap_width(self):
+    return self.width - self._get_list_depth() * 4
+
+  def _default_wrap(self, wrap):
+    if wrap is not None:
+      return wrap
+    if self._get_context_type() in [_CONTEXT_LINK, _CONTEXT_HEADING]:
+      return False
+    return True
diff --git a/cobalt/site/scripts/markdown_writer_test.py b/cobalt/site/scripts/markdown_writer_test.py
new file mode 100755
index 0000000..4de6bc9
--- /dev/null
+++ b/cobalt/site/scripts/markdown_writer_test.py
@@ -0,0 +1,161 @@
+#!/usr/bin/python
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests the markdown_writer module."""
+
+import contextlib
+from io import StringIO
+import textwrap
+import unittest
+
+from cobalt.site.scripts import markdown_writer
+
+_LOREM_IPSUM_1 = ('Lorem ipsum dolor sit amet, consectetur adipiscing elit, '
+                  'sed do eiusmod tempor incididunt ut labore et dolore magna '
+                  'aliqua.')
+_LOREM_IPSUM_2 = ('Ut enim ad minim veniam, quis nostrud exercitation '
+                  'ullamco laboris nisi ut aliquip ex ea commodo consequat. '
+                  'Duis aute irure dolor in reprehenderit in voluptate velit '
+                  'esse cillum dolore eu fugiat nulla pariatur.')
+_LOREM_IPSUM_3 = ('Excepteur sint occaecat cupidatat non proident, sunt in '
+                  'culpa qui officia deserunt mollit anim id est laborum.')
+
+_LOREM_IPSUM = f'{_LOREM_IPSUM_1} {_LOREM_IPSUM_2} {_LOREM_IPSUM_3}'
+
+
+def _indent(text, size):
+  return _indent_behind(text, ' ' * size)
+
+
+def _indent_behind(text, prefix):
+  if not text:
+    return text
+
+  indentation = '\n' + (' ' * len(prefix))
+  result = prefix + indentation.join(text.split('\n'))
+  return result
+
+
+def _wrap_behind(text, prefix, width):
+  if not text:
+    return text
+  return _indent_behind(textwrap.fill(text, width - len(prefix)), prefix)
+
+
+class MarkdownWriterTest(unittest.TestCase):
+  """Tests the markdown_writer module."""
+
+  def testBasic(self):
+    with contextlib.closing(StringIO()) as test_io:
+      out = markdown_writer.MarkdownWriter(test_io)
+      out.text(_LOREM_IPSUM_1)
+      out.text(_LOREM_IPSUM_2)
+      out.text(_LOREM_IPSUM_3)
+      out.text(_LOREM_IPSUM_1)
+      out.text(_LOREM_IPSUM_2)
+      out.text(_LOREM_IPSUM_3)
+      actual = test_io.getvalue()
+
+    expected = textwrap.fill(_LOREM_IPSUM + ' ' + _LOREM_IPSUM, 80)
+    self.assertEqual(expected, actual)
+
+  def testParagraph(self):
+    with contextlib.closing(StringIO()) as test_io:
+      out = markdown_writer.MarkdownWriter(test_io)
+      out.text(_LOREM_IPSUM_1)
+      out.text(_LOREM_IPSUM_2)
+      out.paragraph()
+      out.text(_LOREM_IPSUM_3)
+      out.text(_LOREM_IPSUM_1)
+      out.paragraph()
+      out.text(_LOREM_IPSUM_2)
+      out.text(_LOREM_IPSUM_3)
+      actual = test_io.getvalue()
+
+    expected = (
+        textwrap.fill(_LOREM_IPSUM_1 + ' ' + _LOREM_IPSUM_2, 80) + '\n\n' +
+        textwrap.fill(_LOREM_IPSUM_3 + ' ' + _LOREM_IPSUM_1, 80) + '\n\n' +
+        textwrap.fill(_LOREM_IPSUM_2 + ' ' + _LOREM_IPSUM_3, 80))
+    self.assertEqual(expected, actual)
+
+  def testListDepth1(self):
+    with contextlib.closing(StringIO()) as test_io:
+      out = markdown_writer.MarkdownWriter(test_io)
+      out.paragraph()
+      out.paragraph()
+      out.paragraph()
+      with out.auto_ordered_list():
+        with out.auto_item():
+          out.text(_LOREM_IPSUM_1)
+          out.text(_LOREM_IPSUM_2)
+          out.paragraph()
+          out.paragraph()
+        with out.auto_item():
+          out.paragraph()
+          out.text(_LOREM_IPSUM_3)
+          out.text(_LOREM_IPSUM_1)
+        with out.auto_item():
+          out.text(_LOREM_IPSUM_2)
+          out.paragraph()
+          out.text(_LOREM_IPSUM_3)
+          out.paragraph()
+      out.text(_LOREM_IPSUM_1)
+      actual = test_io.getvalue()
+    list_prefix = '1.  '
+    expected = (
+        _wrap_behind(_LOREM_IPSUM_1 + ' ' + _LOREM_IPSUM_2, list_prefix, 80) +
+        '\n\n' +
+        _wrap_behind(_LOREM_IPSUM_3 + ' ' + _LOREM_IPSUM_1, list_prefix, 80) +
+        '\n' + _wrap_behind(_LOREM_IPSUM_2, list_prefix, 80) + '\n\n' +
+        _wrap_behind(_LOREM_IPSUM_3, ' ' * len(list_prefix), 80) + '\n\n' +
+        textwrap.fill(_LOREM_IPSUM_1, 80))
+    self.assertEqual(expected, actual)
+
+  def testListDepth2(self):
+    with contextlib.closing(StringIO()) as test_io:
+      out = markdown_writer.MarkdownWriter(test_io)
+      with out.auto_ordered_list():
+        with out.auto_item():
+          out.text(_LOREM_IPSUM_1)
+          with out.auto_unordered_list():
+            with out.auto_item():
+              out.text(_LOREM_IPSUM_2)
+            with out.auto_item():
+              out.text(_LOREM_IPSUM_3)
+              out.text(_LOREM_IPSUM_1)
+        with out.auto_item():
+          out.text(_LOREM_IPSUM_2)
+          with out.auto_unordered_list():
+            with out.auto_item():
+              out.text(_LOREM_IPSUM_3)
+              out.text(_LOREM_IPSUM_1)
+            with out.auto_item():
+              out.text(_LOREM_IPSUM_2)
+      out.text(_LOREM_IPSUM_3)
+      actual = test_io.getvalue()
+    list_prefix_1 = '1.  '
+    list_prefix_2 = '    *   '
+    expected = (
+        _wrap_behind(_LOREM_IPSUM_1, list_prefix_1, 80) + '\n\n' +
+        _wrap_behind(_LOREM_IPSUM_2, list_prefix_2, 80) + '\n' +
+        _wrap_behind(_LOREM_IPSUM_3 + ' ' + _LOREM_IPSUM_1, list_prefix_2, 80) +
+        '\n\n' + _wrap_behind(_LOREM_IPSUM_2, list_prefix_1, 80) + '\n\n' +
+        _wrap_behind(_LOREM_IPSUM_3 + ' ' + _LOREM_IPSUM_1, list_prefix_2, 80) +
+        '\n' + _wrap_behind(_LOREM_IPSUM_2, list_prefix_2, 80) + '\n\n' +
+        textwrap.fill(_LOREM_IPSUM_3, 80))
+    self.assertEqual(expected, actual)
+
+
+if __name__ == '__main__':
+  unittest.main()
diff --git a/cobalt/speech/BUILD.gn b/cobalt/speech/BUILD.gn
index 3f4cc72..1e20f72 100644
--- a/cobalt/speech/BUILD.gn
+++ b/cobalt/speech/BUILD.gn
@@ -105,7 +105,7 @@
     "//cobalt/script",
     "//cobalt/web:dom_exception",
     "//content/browser/speech",
-    "//starboard",
+    "//starboard:starboard_group",
     "//third_party/flac",
     "//third_party/protobuf:protobuf_lite",
     "//url",
diff --git a/cobalt/subtlecrypto/BUILD.gn b/cobalt/subtlecrypto/BUILD.gn
index a3698ea..ebaa1d8 100644
--- a/cobalt/subtlecrypto/BUILD.gn
+++ b/cobalt/subtlecrypto/BUILD.gn
@@ -22,7 +22,7 @@
 
   deps = [
     "//base",
-    "//starboard",
+    "//starboard:starboard_group",
     "//third_party/boringssl:crypto",
   ]
 }
diff --git a/cobalt/subtlecrypto/import_key_algorithm_params.idl b/cobalt/subtlecrypto/import_key_algorithm_params.idl
index 6e913dc..b8a9533 100644
--- a/cobalt/subtlecrypto/import_key_algorithm_params.idl
+++ b/cobalt/subtlecrypto/import_key_algorithm_params.idl
@@ -19,7 +19,7 @@
 
 dictionary ImportKeyAlgorithmParams : Algorithm {
   // The inner hash function to use.
-  DOMString hash;
+  AlgorithmIdentifier hash;
   // The length (in bits) of the key.
   unsigned long length;
 };
diff --git a/cobalt/subtlecrypto/subtle_crypto.cc b/cobalt/subtlecrypto/subtle_crypto.cc
index e9bf7eb..4dc4cea 100644
--- a/cobalt/subtlecrypto/subtle_crypto.cc
+++ b/cobalt/subtlecrypto/subtle_crypto.cc
@@ -382,7 +382,7 @@
         algorithm.AsType<ImportKeyAlgorithmParams>();
     // 29.6.2 Set hash to equal the hash member of normalizedAlgorithm.
     if (algo_params.has_hash()) {
-      cryptoKey->set_hash(algo_params.hash());
+      cryptoKey->set_hash(get_name_or_string(algo_params.hash()));
     }
   }
   // 12. Resolve promise with result.
diff --git a/cobalt/tools/automated_testing/cobalt_runner.py b/cobalt/tools/automated_testing/cobalt_runner.py
index 82db23a..467f65c 100644
--- a/cobalt/tools/automated_testing/cobalt_runner.py
+++ b/cobalt/tools/automated_testing/cobalt_runner.py
@@ -342,9 +342,13 @@
   def _StartWebdriver(self, port):
     host, webdriver_port = self.launcher.GetHostAndPortGivenPort(port)
     self.webdriver_url = f'http://{host}:{webdriver_port}/'
+
+    # Create remote and set a timeout before making the connection
+    rc = self.selenium_webdriver_module.remote.remote_connection
+    executor = rc.RemoteConnection(self.webdriver_url)
+    executor.set_timeout(WEBDRIVER_HTTP_TIMEOUT_SECONDS)
     self.webdriver = self.selenium_webdriver_module.Remote(
-        self.webdriver_url, COBALT_WEBDRIVER_CAPABILITIES)
-    self.webdriver.command_executor.set_timeout(WEBDRIVER_HTTP_TIMEOUT_SECONDS)
+        executor, COBALT_WEBDRIVER_CAPABILITIES)
     logging.info('Selenium Connected')
     self.test_script_started.set()
     with self.start_condition:
@@ -355,11 +359,12 @@
     if self.webdriver:
       self.webdriver.quit()
     if self.webdriver_url:
+      rc = self.selenium_webdriver_module.remote.remote_connection
+      executor = rc.RemoteConnection(self.webdriver_url)
+      executor.set_timeout(WEBDRIVER_HTTP_TIMEOUT_SECONDS)
       self.webdriver = self.selenium_webdriver_module.Remote(
-          self.webdriver_url, COBALT_WEBDRIVER_CAPABILITIES)
+          executor, COBALT_WEBDRIVER_CAPABILITIES)
     if self.webdriver:
-      self.webdriver.command_executor.set_timeout(
-          WEBDRIVER_HTTP_TIMEOUT_SECONDS)
       logging.info('Selenium Reconnected')
 
   def WaitForStart(self):
diff --git a/cobalt/updater/BUILD.gn b/cobalt/updater/BUILD.gn
index 94e7ae6..ad9387b 100644
--- a/cobalt/updater/BUILD.gn
+++ b/cobalt/updater/BUILD.gn
@@ -72,18 +72,18 @@
     "//components/crx_file",
     "//components/prefs",
     "//components/update_client",
-    "//starboard",
+    "//starboard:starboard_group",
   ]
 }
 
 target(final_executable_type, "crash_sandbox") {
   sources = [ "crash_sandbox.cc" ]
-  deps = [ "//starboard" ]
+  deps = [ "//starboard:starboard_group" ]
 }
 
 target(final_executable_type, "noop_sandbox") {
   sources = [ "noop_sandbox.cc" ]
-  deps = [ "//starboard" ]
+  deps = [ "//starboard:starboard_group" ]
 }
 
 target(final_executable_type, "one_app_only_sandbox") {
@@ -93,7 +93,7 @@
     "//cobalt/browser",
     "//cobalt/browser:browser_switches",
     "//net",
-    "//starboard",
+    "//starboard:starboard_group",
     "//starboard/loader_app:app_key",
   ]
 }
diff --git a/cobalt/version.h b/cobalt/version.h
index f54bb3b..8d80aef 100644
--- a/cobalt/version.h
+++ b/cobalt/version.h
@@ -35,6 +35,6 @@
 //                  release is cut.
 //.
 
-#define COBALT_VERSION "24.lts.20"
+#define COBALT_VERSION "24.lts.30"
 
 #endif  // COBALT_VERSION_H_
diff --git a/cobalt/web/BUILD.gn b/cobalt/web/BUILD.gn
index acd599c..c00435d 100644
--- a/cobalt/web/BUILD.gn
+++ b/cobalt/web/BUILD.gn
@@ -187,6 +187,7 @@
     "event_target_test.cc",
     "event_test.cc",
     "message_event_test.cc",
+    "message_port_test.cc",
     "url_test.cc",
     "url_utils_test.cc",
     "window_timers_test.cc",
diff --git a/cobalt/web/event_target.cc b/cobalt/web/event_target.cc
index 2622b4b..4d2fc0a 100644
--- a/cobalt/web/event_target.cc
+++ b/cobalt/web/event_target.cc
@@ -282,9 +282,22 @@
   // instead.
 }
 
+void EventTarget::AddEventListenerRegistrationCallback(
+    void* object, base::Token token, base::OnceClosure callback) {
+  base::AutoLock lock(event_listener_registration_mutex_);
+  event_listener_registration_callbacks_[token][object] = std::move(callback);
+}
+
+void EventTarget::RemoveEventListenerRegistrationCallbacks(void* object) {
+  base::AutoLock lock(event_listener_registration_mutex_);
+  for (auto& token : event_listener_registration_callbacks_)
+    token.second.erase(object);
+}
+
 void EventTarget::AddEventListenerInternal(
     std::unique_ptr<EventTargetListenerInfo> listener_info) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(listener_info);
 
   // Remove existing attribute listener of the same type.
   if (listener_info->is_attribute()) {
@@ -314,7 +327,21 @@
   debugger_hooks().AsyncTaskScheduled(
       listener_info->task(), listener_info->type().c_str(),
       base::DebuggerHooks::AsyncTaskFrequency::kRecurring);
+
+  base::Token type = listener_info->type();
   event_listener_infos_.push_back(std::move(listener_info));
+
+  {
+    // Call the event listener registration callback.
+    base::AutoLock lock(event_listener_registration_mutex_);
+    auto callbacks = event_listener_registration_callbacks_.find(type);
+    if (callbacks != event_listener_registration_callbacks_.end()) {
+      for (auto& object : callbacks->second) {
+        std::move(object.second).Run();
+      }
+      event_listener_registration_callbacks_.erase(type);
+    }
+  }
 }
 
 bool EventTarget::HasEventListener(base::Token type) {
diff --git a/cobalt/web/event_target.h b/cobalt/web/event_target.h
index 1663f80..f61ae41 100644
--- a/cobalt/web/event_target.h
+++ b/cobalt/web/event_target.h
@@ -15,6 +15,7 @@
 #ifndef COBALT_WEB_EVENT_TARGET_H_
 #define COBALT_WEB_EVENT_TARGET_H_
 
+#include <map>
 #include <memory>
 #include <set>
 #include <string>
@@ -536,7 +537,6 @@
   web::EnvironmentSettings* environment_settings() const {
     return environment_settings_;
   }
-
   std::set<base::Token>& event_listener_event_types() const {
     static std::set<base::Token> event_listener_event_types;
     for (auto& event_listener_info : event_listener_infos_) {
@@ -545,6 +545,12 @@
     return event_listener_event_types;
   }
 
+  // Register a callback to be called when an event listener is added for the
+  // given type.
+  void AddEventListenerRegistrationCallback(void* object, base::Token type,
+                                            base::OnceClosure callback);
+  void RemoveEventListenerRegistrationCallbacks(void* object);
+
  protected:
   virtual ~EventTarget() { environment_settings_ = nullptr; }
 
@@ -569,8 +575,12 @@
   // the special case of window.onerror handling.
   bool unpack_onerror_events_;
 
-  // Thread checker ensures all calls to the EventTarget are made from the same
-  // thread that it is created in.
+  base::Lock event_listener_registration_mutex_;
+  std::map<base::Token, std::map<void*, base::OnceClosure>>
+      event_listener_registration_callbacks_;
+
+  // Thread checker ensures all calls to the EventTarget are made from the
+  // same thread that it is created in.
   THREAD_CHECKER(thread_checker_);
 };
 
diff --git a/cobalt/web/message_port.cc b/cobalt/web/message_port.cc
index 871874b..f6de8e2 100644
--- a/cobalt/web/message_port.cc
+++ b/cobalt/web/message_port.cc
@@ -23,7 +23,6 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
 #include "base/task_runner.h"
 #include "cobalt/script/environment_settings.h"
 #include "cobalt/web/context.h"
@@ -34,31 +33,68 @@
 namespace cobalt {
 namespace web {
 
-MessagePort::MessagePort(web::EventTarget* event_target)
-    : event_target_(event_target) {
-  if (!event_target_) {
-    return;
+void MessagePort::EntangleWithEventTarget(web::EventTarget* event_target) {
+  DCHECK(!event_target_);
+  {
+    base::AutoLock lock(mutex_);
+    event_target_ = event_target;
+    if (!event_target_) {
+      enabled_ = false;
+      return;
+    }
   }
-  Context* context = event_target_->environment_settings()->context();
-  base::MessageLoop* message_loop = context->message_loop();
-  if (!message_loop) {
-    return;
-  }
-  message_loop->task_runner()->PostTask(
+  target_task_runner()->PostTask(
       FROM_HERE,
       base::BindOnce(&Context::AddEnvironmentSettingsChangeObserver,
-                     base::Unretained(context), base::Unretained(this)));
+                     base::Unretained(context()), base::Unretained(this)));
   remove_environment_settings_change_observer_ =
       base::BindOnce(&Context::RemoveEnvironmentSettingsChangeObserver,
-                     base::Unretained(context), base::Unretained(this));
+                     base::Unretained(context()), base::Unretained(this));
+
+  target_task_runner()->PostTask(
+      FROM_HERE,
+      base::Bind(
+          [](MessagePort* message_port,
+             web::EventTarget*
+                 event_target) {  // The first time a MessagePort object's
+                                  // onmessage IDL attribute is set, the
+            // port's port message queue must be enabled, as if the start()
+            // method had been called.
+            //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#messageport
+            if (event_target->HasEventListener(base::Tokens::message())) {
+              message_port->Start();
+            } else {
+              event_target->AddEventListenerRegistrationCallback(
+                  message_port, base::Tokens::message(),
+                  base::BindOnce(&MessagePort::Start,
+                                 base::Unretained(message_port)));
+            }
+          },
+          base::Unretained(this), base::Unretained(event_target)));
 }
 
-MessagePort::~MessagePort() { Close(); }
-
-void MessagePort::Close() {
+void MessagePort::Start() {
+  // The start() method steps are to enable this's port message queue, if it is
+  // not already enabled.
+  //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#dom-messageport-start
+  base::AutoLock lock(mutex_);
   if (!event_target_) {
     return;
   }
+  enabled_ = true;
+  for (auto& message : unshipped_messages_) {
+    PostMessageSerializedLocked(std::move(message));
+  }
+  unshipped_messages_.clear();
+}
+
+void MessagePort::Close() {
+  base::AutoLock lock(mutex_);
+  unshipped_messages_.clear();
+  if (!event_target_) {
+    return;
+  }
+  event_target_->RemoveEventListenerRegistrationCallbacks(this);
   if (remove_environment_settings_change_observer_) {
     std::move(remove_environment_settings_change_observer_).Run();
   }
@@ -66,32 +102,36 @@
 }
 
 void MessagePort::PostMessage(const script::ValueHandleHolder& message) {
-  PostMessageSerialized(std::make_unique<script::StructuredClone>(message));
+  auto structured_clone = std::make_unique<script::StructuredClone>(message);
+  {
+    base::AutoLock lock(mutex_);
+    if (!(event_target_ && enabled_)) {
+      unshipped_messages_.push_back(std::move(structured_clone));
+      return;
+    }
+    PostMessageSerializedLocked(std::move(structured_clone));
+  }
 }
 
-void MessagePort::PostMessageSerialized(
+void MessagePort::PostMessageSerializedLocked(
     std::unique_ptr<script::StructuredClone> structured_clone) {
-  if (!event_target_ || !structured_clone) {
+  if (!structured_clone || !event_target_ || !enabled_) {
     return;
   }
-  // TODO: Forward the location of the origating API call to the PostTask call.
-  base::MessageLoop* message_loop =
-      event_target_->environment_settings()->context()->message_loop();
-  if (!message_loop) {
-    return;
-  }
+  // TODO: Forward the location of the origating API call to the PostTask
+  // call.
   //   https://html.spec.whatwg.org/multipage/workers.html#handler-worker-onmessage
   // TODO: Update MessageEvent to support more types. (b/227665847)
   // TODO: Remove dependency of MessageEvent on net iobuffer (b/227665847)
-  message_loop->task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&MessagePort::DispatchMessage, AsWeakPtr(),
-                                std::move(structured_clone)));
-}
-
-void MessagePort::DispatchMessage(
-    std::unique_ptr<script::StructuredClone> structured_clone) {
-  event_target_->DispatchEvent(new web::MessageEvent(
-      base::Tokens::message(), std::move(structured_clone)));
+  target_task_runner()->PostTask(
+      FROM_HERE,
+      base::BindOnce(
+          [](base::WeakPtr<web::EventTarget> event_target,
+             std::unique_ptr<script::StructuredClone> structured_clone) {
+            event_target->DispatchEvent(new web::MessageEvent(
+                base::Tokens::message(), std::move(structured_clone)));
+          },
+          event_target_->AsWeakPtr(), std::move(structured_clone)));
 }
 
 }  // namespace web
diff --git a/cobalt/web/message_port.h b/cobalt/web/message_port.h
index cee5109..71ef615 100644
--- a/cobalt/web/message_port.h
+++ b/cobalt/web/message_port.h
@@ -17,6 +17,8 @@
 
 #include <memory>
 #include <string>
+#include <utility>
+#include <vector>
 
 #include "base/callback_forward.h"
 #include "base/memory/weak_ptr.h"
@@ -34,14 +36,16 @@
 namespace web {
 
 class MessagePort : public script::Wrappable,
-                    public base::SupportsWeakPtr<MessagePort>,
                     public Context::EnvironmentSettingsChangeObserver {
  public:
-  explicit MessagePort(web::EventTarget* event_target);
-  ~MessagePort();
+  MessagePort() = default;
+  ~MessagePort() { Close(); }
+
   MessagePort(const MessagePort&) = delete;
   MessagePort& operator=(const MessagePort&) = delete;
 
+  void EntangleWithEventTarget(web::EventTarget* event_target);
+
   void OnEnvironmentSettingsChanged(bool context_valid) override {
     if (!context_valid) {
       Close();
@@ -53,10 +57,8 @@
   // -> void PostMessage(const script::ValueHandleHolder& message,
   //                     script::Sequence<script::ValueHandle*> transfer) {}
   void PostMessage(const script::ValueHandleHolder& message);
-  void PostMessageSerialized(
-      std::unique_ptr<script::StructuredClone> structured_clone);
 
-  void Start() {}
+  void Start();
   void Close();
 
   const web::EventTargetListenerInfo::EventListenerScriptValue* onmessage()
@@ -91,15 +93,32 @@
                                              event_listener);
   }
 
-  web::EventTarget* event_target() { return event_target_; }
+  EventTarget* event_target() const { return event_target_; }
+  Context* context() const {
+    return event_target_ ? event_target_->environment_settings()->context()
+                         : nullptr;
+  }
+  base::TaskRunner* target_task_runner() const {
+    return event_target_ ? event_target_->environment_settings()
+                               ->context()
+                               ->message_loop()
+                               ->task_runner()
+                         : nullptr;
+  }
 
   DEFINE_WRAPPABLE_TYPE(MessagePort);
 
  private:
-  void DispatchMessage(
+  void PostMessageSerializedLocked(
       std::unique_ptr<script::StructuredClone> structured_clone);
 
-  // The event target to dispatch events to.
+  base::Lock mutex_;
+  std::vector<std::unique_ptr<script::StructuredClone>> unshipped_messages_;
+
+  // A port message queue can be enabled or disabled, and is initially disabled.
+  //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#message-ports
+  bool enabled_ = false;
+
   web::EventTarget* event_target_ = nullptr;
   base::OnceClosure remove_environment_settings_change_observer_;
 };
diff --git a/cobalt/web/message_port_test.cc b/cobalt/web/message_port_test.cc
new file mode 100644
index 0000000..140c291
--- /dev/null
+++ b/cobalt/web/message_port_test.cc
@@ -0,0 +1,45 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/web/message_port.h"
+
+#include "base/strings/string_util.h"
+#include "cobalt/web/testing/test_with_javascript.h"
+
+
+#define EXPECT_SUBSTRING(needle, haystack) \
+  EXPECT_PRED_FORMAT2(::testing::IsSubstring, (needle), (haystack))
+
+namespace cobalt {
+namespace web {
+
+namespace {
+class MessagePortTestWithJavaScript : public testing::TestWebWithJavaScript {};
+}  // namespace
+
+TEST_P(MessagePortTestWithJavaScript, MessagePortIsNotConstructible) {
+  std::string result;
+  EXPECT_FALSE(EvaluateScript("var event = new MessagePort();", &result))
+      << "Failed to evaluate script.";
+  EXPECT_SUBSTRING("TypeError: MessagePort is not constructible", result)
+      << result;
+}
+
+INSTANTIATE_TEST_CASE_P(
+    MessagePortTestsWithJavaScript, MessagePortTestWithJavaScript,
+    ::testing::ValuesIn(testing::TestWebWithJavaScript::GetWebTypes()),
+    testing::TestWebWithJavaScript::GetTypeName);
+
+}  // namespace web
+}  // namespace cobalt
diff --git a/cobalt/websocket/BUILD.gn b/cobalt/websocket/BUILD.gn
index 77469ab..dc0608e 100644
--- a/cobalt/websocket/BUILD.gn
+++ b/cobalt/websocket/BUILD.gn
@@ -35,7 +35,7 @@
     "//cobalt/script",
     "//cobalt/web:dom_exception",
     "//net",
-    "//starboard",
+    "//starboard:starboard_group",
     "//third_party/protobuf:protobuf_lite",
     "//url",
   ]
diff --git a/cobalt/worker/client.cc b/cobalt/worker/client.cc
index 7ca45be..7079588 100644
--- a/cobalt/worker/client.cc
+++ b/cobalt/worker/client.cc
@@ -22,12 +22,12 @@
 
 namespace cobalt {
 namespace worker {
-Client::Client(web::EnvironmentSettings* client)
-    : MessagePort(client->context()
-                      ->GetWindowOrWorkerGlobalScope()
-                      ->navigator_base()
-                      ->service_worker()) {
+Client::Client(web::EnvironmentSettings* client) {
   DCHECK(client);
+  EntangleWithEventTarget(client->context()
+                              ->GetWindowOrWorkerGlobalScope()
+                              ->navigator_base()
+                              ->service_worker());
   // Algorithm for Create Client:
   //   https://www.w3.org/TR/2022/CRD-service-workers-20220712/#create-client
   // 1. Let clientObject be a new Client object.
diff --git a/cobalt/worker/dedicated_worker.cc b/cobalt/worker/dedicated_worker.cc
index 783cead..af3e62b 100644
--- a/cobalt/worker/dedicated_worker.cc
+++ b/cobalt/worker/dedicated_worker.cc
@@ -85,7 +85,8 @@
   // 6. Let worker be a new Worker object.
   // 7. Let outside port be a new MessagePort in outside settings's Realm.
   // 8. Associate the outside port with worker.
-  outside_port_ = new web::MessagePort(this);
+  outside_port_ = new web::MessagePort();
+  outside_port_->EntangleWithEventTarget(this);
   // 9. Run this step in parallel:
   //    1. Run a worker given worker, worker URL, outside settings, outside
   //    port, and options.
diff --git a/cobalt/worker/worker.cc b/cobalt/worker/worker.cc
index 28ee68e..a126d86 100644
--- a/cobalt/worker/worker.cc
+++ b/cobalt/worker/worker.cc
@@ -19,7 +19,6 @@
 
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/message_loop/message_loop.h"
 #include "base/task_runner.h"
 #include "base/threading/thread.h"
 #include "cobalt/browser/user_agent_platform_info.h"
@@ -40,6 +39,7 @@
 namespace worker {
 
 Worker::Worker(const char* name, const Options& options) : options_(options) {
+  message_port_ = new web::MessagePort();
   // Algorithm for 'run a worker'
   //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#run-a-worker
   // 1. Let is shared be true if worker is a SharedWorker object, and false
@@ -71,7 +71,6 @@
   // Destroy members that were constructed in the worker thread.
   loader_.reset();
   worker_global_scope_ = nullptr;
-  message_port_ = nullptr;
   content_.reset();
 }
 
@@ -265,7 +264,7 @@
   // Done at step 8.
   // 16. Let inside port be a new MessagePort object in inside settings's Realm.
   // 17. Associate inside port with worker global scope.
-  message_port_ = new web::MessagePort(worker_global_scope_);
+  message_port_->EntangleWithEventTarget(worker_global_scope_);
   // 18. Entangle outside port and inside port.
   // TODO(b/226640425): Implement this when Message Ports can be entangled.
   // 19. Create a new WorkerLocation object and associate it with worker global
@@ -280,7 +279,6 @@
   //     worker until such time as either the closing flag switches to true or
   //     the worker stops being a suspendable worker.
   // 22. Set inside settings's execution ready flag.
-  execution_ready_.Signal();
   // 23. If script is a classic script, then run the classic script script.
   //     Otherwise, it is a module script; run the module script script.
 
@@ -314,11 +312,11 @@
   // Algorithm for 'run a worker'
   //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#run-a-worker
   // 29. Clear the worker global scope's map of active timers.
-  if (worker_global_scope_ && message_loop()) {
-    message_loop()->task_runner()->PostBlockingTask(
+  if (worker_global_scope_ && task_runner()) {
+    task_runner()->PostTask(
         FROM_HERE, base::Bind(
-                       [](WorkerGlobalScope* worker_global_scope) {
-                         worker_global_scope->DestroyTimers();
+                       [](web::WindowOrWorkerGlobalScope* global_scope) {
+                         global_scope->DestroyTimers();
                        },
                        base::Unretained(worker_global_scope_.get())));
   }
@@ -357,20 +355,8 @@
 }
 
 void Worker::PostMessage(const script::ValueHandleHolder& message) {
-  DCHECK(message_loop());
-  auto structured_clone = std::make_unique<script::StructuredClone>(message);
-  if (base::MessageLoop::current() != message_loop()) {
-    // Block until the worker thread is ready to execute code to handle the
-    // event.
-    execution_ready_.Wait();
-    message_loop()->task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(&web::MessagePort::PostMessageSerialized,
-                                  message_port()->AsWeakPtr(),
-                                  std::move(structured_clone)));
-  } else {
-    DCHECK(execution_ready_.IsSignaled());
-    message_port()->PostMessageSerialized(std::move(structured_clone));
-  }
+  DCHECK(message_port_);
+  message_port_->PostMessage(message);
 }
 
 }  // namespace worker
diff --git a/cobalt/worker/worker.h b/cobalt/worker/worker.h
index 364837a..5cce8cb 100644
--- a/cobalt/worker/worker.h
+++ b/cobalt/worker/worker.h
@@ -24,6 +24,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/message_loop/message_loop_current.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/task_runner.h"
 #include "base/threading/thread.h"
 #include "cobalt/base/source_location.h"
 #include "cobalt/csp/content_security_policy.h"
@@ -81,11 +82,9 @@
 
   void Terminate();
 
-  web::MessagePort* message_port() const { return message_port_.get(); }
-
-  // The message loop this object is running on.
-  base::MessageLoop* message_loop() const {
-    return web_agent_ ? web_agent_->message_loop() : nullptr;
+  // The task runner for this object.
+  base::TaskRunner* task_runner() const {
+    return web_agent_ ? web_agent_->message_loop()->task_runner() : nullptr;
   }
 
   void PostMessage(const script::ValueHandleHolder& message);
@@ -138,12 +137,6 @@
 
   // Content of the script. Released after Execute is called.
   std::unique_ptr<std::string> content_;
-
-  // The execution ready flag.
-  //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#concept-environment-execution-ready-flag
-  base::WaitableEvent execution_ready_ = {
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED};
 };
 
 }  // namespace worker
diff --git a/cobalt/xhr/BUILD.gn b/cobalt/xhr/BUILD.gn
index c2bd6fc..beb1af3 100644
--- a/cobalt/xhr/BUILD.gn
+++ b/cobalt/xhr/BUILD.gn
@@ -46,7 +46,7 @@
     "//cobalt/web",
     "//nb",
     "//net",
-    "//starboard",
+    "//starboard:starboard_group",
     "//third_party/protobuf:protobuf_lite",
     "//url",
   ]
diff --git a/components/update_client/cobalt_slot_management.cc b/components/update_client/cobalt_slot_management.cc
index 6abee58..0014e67 100644
--- a/components/update_client/cobalt_slot_management.cc
+++ b/components/update_client/cobalt_slot_management.cc
@@ -299,8 +299,8 @@
   base::Version slot_candidate_version("1.0.1");
   int slot_candidate = -1;
 
-  // Iterate over all writeable slots - index >= 1.
-  for (int i = 1; i < max_slots; i++) {
+  // Iterate over all slots - index >= 0.
+  for (int i = 0; i < max_slots; i++) {
     LOG(INFO) << "CobaltQuickInstallation: iterating slot=" << i;
     // Get the path to new installation.
     std::vector<char> installation_path(kSbFileMaxPath);
@@ -329,13 +329,15 @@
       continue;
     } else if (slot_candidate_version < installed_version &&
                current_version < installed_version &&
-               !DrainFileIsAnotherAppDraining(installation_dir.value().c_str(),
-                                              app_key) &&
-               !CheckBadFileExists(installation_dir.value().c_str(), app_key) &&
-               !SbFileExists(good_app_key_file_path.c_str()) &&
-               starboard::loader_app::AnyGoodAppKeyFile(
-                   installation_dir.value().c_str())) {
-      // Found a slot with newer version than the current version that's not
+               (i == 0 || !DrainFileIsAnotherAppDraining(
+                              installation_dir.value().c_str(), app_key) &&
+                              !CheckBadFileExists(
+                                  installation_dir.value().c_str(), app_key) &&
+                              !SbFileExists(good_app_key_file_path.c_str()) &&
+                              starboard::loader_app::AnyGoodAppKeyFile(
+                                  installation_dir.value().c_str()))) {
+      // Found a slot with newer version than the current version. It's either
+      // the system image slot, or a writeable installation slot that's not
       // draining, and no bad file of current app exists, and a good file
       // exists from a another app, but not from the current app.
       // The final candidate is the newest version of the valid
diff --git a/content/browser/speech/BUILD.gn b/content/browser/speech/BUILD.gn
index 21ba4c7..93b4a68 100644
--- a/content/browser/speech/BUILD.gn
+++ b/content/browser/speech/BUILD.gn
@@ -42,7 +42,7 @@
     "//cobalt//browser:test_dependencies_on_browser",
     "//cobalt/media",
     "//cobalt/test:run_all_unittests",
-    "//starboard",
+    "//starboard:starboard_group",
     "//testing/gtest",
   ]
 }
diff --git a/crypto/BUILD.gn b/crypto/BUILD.gn
index e1292c4..74af55a 100644
--- a/crypto/BUILD.gn
+++ b/crypto/BUILD.gn
@@ -229,7 +229,7 @@
 # on the current SSL library should just depend on this.
 group("platform") {
   if (is_starboard) {
-    deps = [ "//starboard" ]
+    deps = [ "//starboard:starboard_group", ]
     public_deps = [ "//third_party/boringssl:crypto" ]
   } else {
     public_deps = [ "//third_party/boringssl" ]
diff --git a/docker-compose-windows-internal.yml b/docker-compose-windows-internal.yml
index a18ed0d..5af31e5 100644
--- a/docker-compose-windows-internal.yml
+++ b/docker-compose-windows-internal.yml
@@ -69,6 +69,16 @@
     depends_on:
       - cobalt-build-win-internal
 
+  ps4-kokoro:
+    build:
+      context: ./internal/docker/windows/kokoro/
+      dockerfile: Dockerfile
+      args:
+        - FROM_IMAGE=${FROM_IMAGE:-cobalt-build-ps4}
+    image: cobalt-kokoro-ps4
+    depends_on:
+      - ps4
+
   ps5:
     <<: *common-definitions
     build:
@@ -84,6 +94,16 @@
     depends_on:
       - cobalt-build-win-internal
 
+  ps5-kokoro:
+    build:
+      context: ./internal/docker/windows/kokoro/
+      dockerfile: Dockerfile
+      args:
+        - FROM_IMAGE=${FROM_IMAGE:-cobalt-build-ps5}
+    image: cobalt-kokoro-ps5
+    depends_on:
+      - ps5
+
   xb1:
     <<: *common-definitions
     build:
@@ -100,6 +120,16 @@
     depends_on:
       - cobalt-build-win-internal
 
+  xb1-kokoro:
+    build:
+      context: ./internal/docker/windows/kokoro/
+      dockerfile: Dockerfile
+      args:
+        - FROM_IMAGE=${FROM_IMAGE:-cobalt-build-xb1}
+    image: cobalt-kokoro-xb1
+    depends_on:
+      - xb1
+
   nxswitch:
     <<: *common-definitions
     build:
@@ -114,3 +144,13 @@
     image: cobalt-build-nxswitch
     depends_on:
       - cobalt-build-win-internal
+
+  nxswitch-kokoro:
+    build:
+      context: ./internal/docker/windows/kokoro/
+      dockerfile: Dockerfile
+      args:
+        - FROM_IMAGE=${FROM_IMAGE:-cobalt-build-nxswitch}
+    image: cobalt-kokoro-nxswitch
+    depends_on:
+      - nxswitch
diff --git a/docker/windows/base/build/Dockerfile b/docker/windows/base/build/Dockerfile
index 5484781..9c53d77 100644
--- a/docker/windows/base/build/Dockerfile
+++ b/docker/windows/base/build/Dockerfile
@@ -16,7 +16,8 @@
 ARG FROM_IMAGE
 FROM ${FROM_IMAGE}
 
-SHELL ["powershell", "-ExecutionPolicy", "unrestricted", "-Command"]
+SHELL ["powershell", "-ExecutionPolicy", "Unrestricted", "-Command", `
+       "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
 
 # Helper script for quick delete operations in windows
 COPY ./fast-win-rmdir.cmd /fast-win-rmdir.cmd
@@ -34,12 +35,16 @@
     choco install -y -c C:\choco-cache nodejs-lts;`
     choco install -y -c C:\choco-cache git;`
     choco install -y -c C:\choco-cache cmake --installargs 'ADD_CMAKE_TO_PATH=System';`
+    choco install -y -c C:\choco-cache nasm;`
     Write-Host ('Deleting the chocolately download cache');`
     Remove-Item -Force -Recurse $env:TEMP\*;`
     C:\fast-win-rmdir.cmd C:\choco-cache;`
     # Create version specific copy of each python executable.
     Copy-Item C:\Python3\python.exe C:\Python3\python3.exe
 
+# Configure PATH for nasm.
+RUN setx /M PATH $($Env:PATH + ';C:\Program Files\NASM')
+
 # Install python3 packages via PIP and set various configurations.
 COPY ./requirements.txt /requirements.txt
 RUN mkdir C:\pip-cache;`
diff --git a/docker/windows/base/visualstudio2022/Dockerfile b/docker/windows/base/visualstudio2022/Dockerfile
index a2722ff..0d6cdbf 100644
--- a/docker/windows/base/visualstudio2022/Dockerfile
+++ b/docker/windows/base/visualstudio2022/Dockerfile
@@ -19,18 +19,22 @@
 # Dockerfile for image used to install Visual Studio.
 # WARNING: Changes to this file will result in an extremely long image rebuild.
 
-SHELL ["powershell", "-ExecutionPolicy", "unrestricted", "-Command"]
+SHELL ["powershell", "-ExecutionPolicy", "Unrestricted", "-Command", `
+       "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
 
+# Pins Visual Studio 2022 release version to 17.4.6 (includes Clang 15.0.1).
+# This should be kept in sync with the VS installer used in the dev workstation
+# setup script in: `tools/install_visual_studio_22.ps1`
+ARG MSVS_INSTALLER_URL="https://download.visualstudio.microsoft.com/download/pr/d1ed8638-9e88-461e-92b7-4e29cc6172c3/38b09fc09ae9e590b73ae6752a0ebfd62579798969041bd341689273b842bc10/vs_BuildTools.exe"
 RUN mkdir C:\TEMP;`
     Write-Host ('Downloading vs_buildtools.exe');`
-    Invoke-WebRequest -Uri https://aka.ms/vs/17/release/vs_buildtools.exe `
+    Invoke-WebRequest -Uri ${env:MSVS_INSTALLER_URL} `
       -OutFile C:\TEMP\vs_buildtools.exe
 
 RUN Write-Host ('Installing vs_buildtools.exe');`
     Start-Process C:\TEMP\vs_buildtools.exe -Wait -NoNewWindow`
         -ArgumentList '--quiet --wait --norestart --nocache`
         --installPath C:\BuildTools `
-        --add Microsoft.VisualStudio.Component.VC.CoreIde `
         --add Microsoft.VisualStudio.Component.VC.14.34.17.4.x86.x64  `
         --add Microsoft.VisualStudio.Component.VC.Llvm.Clang          `
         --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset   `
@@ -39,7 +43,6 @@
     Remove-Item -Force -Recurse ${env:ProgramFiles(x86)}\'Microsoft Visual Studio'\Installer;`
     Remove-Item -Force -Recurse $env:TEMP\*;`
     Remove-Item -Force -Recurse $env:ProgramData\'Package Cache'\;`
-    Remove-Item -Force -Recurse C:\BuildTools\VC\Tools\Llvm\ARM64;`
     Remove-Item -Force -Recurse C:\BuildTools\Common7\IDE;`
     Remove-Item C:\TEMP\vs_buildtools.exe
 
diff --git a/nb/BUILD.gn b/nb/BUILD.gn
index ff056c9..433f8a2 100644
--- a/nb/BUILD.gn
+++ b/nb/BUILD.gn
@@ -93,7 +93,7 @@
 
     deps = [
       ":nb",
-      "//starboard",
+      "//starboard:starboard_group",
       "//testing/gmock:gmock",
       "//testing/gtest",
     ]
@@ -106,7 +106,7 @@
   deps = [
     ":nb",
     ":nb_copy_test_data",
-    "//starboard",
+    "//starboard:starboard_group",
   ]
 }
 
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 2fb59e7..e978e30 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -1726,7 +1726,7 @@
     "//base/third_party/dynamic_annotations",
     "//crypto",
     "//nb",
-    "//starboard",
+    "//starboard:starboard_group",
     "//third_party/boringssl:crypto",
     "//third_party/brotli:dec",
     "//third_party/icu:icui18n",
diff --git a/starboard/BUILD.gn b/starboard/BUILD.gn
index aab526b..639c218 100644
--- a/starboard/BUILD.gn
+++ b/starboard/BUILD.gn
@@ -84,12 +84,12 @@
 
 group("default") {
   deps = [
-    ":starboard",
+    ":starboard_group",
     "//starboard/tools:build_app_launcher_zip",
   ]
 }
 
-group("starboard") {
+group("starboard_group") {
   public_deps = [
     ":starboard_headers_only",
     "//starboard/client_porting/cwrappers",
@@ -106,7 +106,7 @@
     if (sb_is_evergreen) {
       public_deps += [ "//starboard/elf_loader:sabi_string" ]
     } else {
-      data_deps = [ ":starboard_platform_group($starboard_toolchain)" ]
+      data_deps = [ ":starboard($starboard_toolchain)" ]
     }
 
     # TODO: b/295702296 Fix libunwind for modular builds.
@@ -115,7 +115,7 @@
     }
   } else {
     public_deps += [
-      ":starboard_platform_group_static($starboard_toolchain)",
+      ":starboard_static($starboard_toolchain)",
       "//starboard/common",
     ]
 
@@ -187,10 +187,10 @@
 
 if (current_toolchain == starboard_toolchain) {
   # This is the default 'starboard_platform_target'; use default properties
-  starboard_platform_target("starboard_platform_group") {
+  starboard_platform_target("starboard") {
   }
 
-  starboard_platform_target("starboard_platform_group_static") {
+  starboard_platform_target("starboard_static") {
     target_type = "group"
   }
 
@@ -211,7 +211,7 @@
   }
 
   group("starboard_with_main") {
-    public_deps = [ ":starboard" ]
+    public_deps = [ ":starboard_group" ]
     if (sb_is_modular && !sb_is_evergreen) {
       public_deps += [ "//$starboard_path:starboard_platform_with_main" ]
     }
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java
index 129b3c1..a7e85e0 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java
@@ -41,6 +41,7 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
+import java.util.regex.*;
 
 /** Native activity that has the required JNI methods called by the Starboard implementation. */
 public abstract class CobaltActivity extends GameActivity {
@@ -65,6 +66,8 @@
   private static final String EVERGREEN_LITE = "--evergreen_lite";
   private static final java.lang.String META_DATA_EVERGREEN_LITE = "cobalt.EVERGREEN_LITE";
 
+  private static final Pattern URL_PARAM_PATTERN = Pattern.compile("^[a-zA-Z0-9_=]*$");
+
   @SuppressWarnings("unused")
   private CobaltA11yHelper a11yHelper;
 
@@ -261,11 +264,48 @@
       }
     }
 
-    addCustomProxyArgs(args);
+    CharSequence[] urlParams = (extras == null) ? null : extras.getCharSequenceArray("url_params");
+    if (urlParams != null) {
+      appendUrlParamsToUrl(args, urlParams);
+    }
 
+    addCustomProxyArgs(args);
     return args.toArray(new String[0]);
   }
 
+  private void appendUrlParamsToUrl(List<String> args, CharSequence[] urlParams) {
+    int idx = -1;
+    for (int i = 0; i < args.size(); i++) {
+      if (args.get(i).startsWith(URL_ARG)) {
+        idx = i;
+        break;
+      }
+    }
+
+    if (idx >= 0) {
+      StringBuilder urlBuilder = new StringBuilder();
+      urlBuilder.append(args.get(idx));
+      // append & if ? is already in the url, otherwise append ?
+      if (urlBuilder.indexOf("?") > 0) {
+        urlBuilder.append("&");
+      } else {
+        urlBuilder.append("?");
+      }
+
+      for (int j = 0; j < urlParams.length; j++) {
+        // sanitize the input before append to the url.
+        String paramKeyValuePair = urlParams[j].toString();
+        if (URL_PARAM_PATTERN.matcher(paramKeyValuePair).matches()) {
+          urlBuilder.append(paramKeyValuePair);
+          urlBuilder.append('&');
+        }
+      }
+
+      urlBuilder.deleteCharAt(urlBuilder.length() - 1);
+      args.set(idx, urlBuilder.toString());
+    }
+  }
+
   private static void addCustomProxyArgs(List<String> args) {
     Pair<String, String> config = detectSystemProxyConfig();
 
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java
index 5d6e8f9..2a11745 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java
@@ -118,6 +118,8 @@
   private static final TimeZone DEFAULT_TIME_ZONE = TimeZone.getTimeZone("America/Los_Angeles");
   private final long timeNanosecondsPerMicrosecond = 1000;
 
+  public static boolean enableBackgroundPlayback = false;
+
   public StarboardBridge(
       Context appContext,
       Holder<Activity> activityHolder,
@@ -189,6 +191,11 @@
   @SuppressWarnings("unused")
   @UsedByNative
   protected void startMediaPlaybackService() {
+    if (!enableBackgroundPlayback) {
+      Log.v(TAG, "Media Playback Service is disabled. Skip startMediaPlaybackService().");
+      return;
+    }
+
     if (cobaltMediaSession == null || !cobaltMediaSession.isActive()) {
       Log.w(TAG, "Do not start a MediaPlaybackService when the MediSsession is null or inactive.");
       return;
@@ -208,13 +215,18 @@
         } else {
           appContext.startService(intent);
         }
-      } catch (SecurityException e) {
+      } catch (RuntimeException e) {
         Log.e(TAG, "Failed to start MediaPlaybackService with intent.", e);
         return;
       }
     } else {
       Log.i(TAG, "Warm start - Restarting the MediaPlaybackService.");
-      ((MediaPlaybackService) service).startService();
+      try {
+        ((MediaPlaybackService) service).startService();
+      } catch (RuntimeException e) {
+        Log.e(TAG, "Failed to restart MediaPlaybackService.", e);
+        return;
+      }
     }
   }
 
@@ -224,7 +236,12 @@
     Service service = serviceHolder.get();
     if (service != null) {
       Log.i(TAG, "Stopping the MediaPlaybackService.");
-      ((MediaPlaybackService) service).stopService();
+      try {
+        ((MediaPlaybackService) service).stopService();
+      } catch (RuntimeException e) {
+        Log.e(TAG, "Failed to stop MediaPlaybackService.", e);
+        return;
+      }
     }
   }
 
@@ -846,4 +863,11 @@
   protected String getBuildFingerprint() {
     return Build.FINGERPRINT;
   }
+
+  @SuppressWarnings("unused")
+  @UsedByNative
+  protected void enableBackgroundPlayback(boolean value) {
+    enableBackgroundPlayback = value;
+    Log.v(TAG, "StarboardBridge set enableBackgroundPlayback: %b", value);
+  }
 }
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-1.2.2.aar b/starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-1.2.2.aar
deleted file mode 100644
index 3b4cb1f..0000000
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-1.2.2.aar
+++ /dev/null
Binary files differ
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-2.0.2.aar b/starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-2.0.2.aar
new file mode 100644
index 0000000..f34483d
--- /dev/null
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-2.0.2.aar
Binary files differ
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java
index d554864..b87b9eb 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java
@@ -165,10 +165,40 @@
       }
       audioTrackBufferSize /= 2;
     }
+
+    String sampleTypeString = "ENCODING_INVALID";
+    if (isAudioTrackValid()) {
+      // If the AudioTrack encoding indicates compressed data,
+      // e.g. AudioFormat.ENCODING_AC3, then the frame count returned
+      // is the size of the AudioTrack buffer in bytes.
+      // In such cases, audioTrackBufferSize does not have to be
+      // multiplied with bytes per sample and channel count below.
+      audioTrackBufferSize = audioTrack.getBufferSizeInFrames();
+      switch (sampleType) {
+        case AudioFormat.ENCODING_PCM_16BIT:
+          sampleTypeString = "ENCODING_PCM_16BIT";
+          audioTrackBufferSize *= getBytesPerSample(sampleType) * channelCount;
+          break;
+        case AudioFormat.ENCODING_PCM_FLOAT:
+          sampleTypeString = "ENCODING_PCM_FLOAT";
+          audioTrackBufferSize *= getBytesPerSample(sampleType) * channelCount;
+          break;
+        case AudioFormat.ENCODING_AC3:
+          sampleTypeString = "ENCODING_AC3";
+          break;
+        case AudioFormat.ENCODING_E_AC3:
+          sampleTypeString = "ENCODING_E_AC3";
+          break;
+        default:
+          Log.i(TAG, String.format("Unknown AudioFormat %d.", sampleType));
+          break;
+      }
+    }
     Log.i(
         TAG,
-        "AudioTrack created with buffer size %d (preferred: %d).  The minimum buffer size is"
-            + " %d.",
+        "AudioTrack created with AudioFormat %s and buffer size %d (preferred: %d)."
+            + " The minimum buffer size is %d.",
+        sampleTypeString,
         audioTrackBufferSize,
         preferredBufferSizeInBytes,
         AudioTrack.getMinBufferSize(sampleRate, channelConfig, sampleType));
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java
index 0b28e08..cd62cf0 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java
@@ -31,6 +31,7 @@
 import android.support.v4.media.session.PlaybackStateCompat;
 import android.view.WindowManager;
 import androidx.annotation.RequiresApi;
+import dev.cobalt.coat.StarboardBridge;
 import dev.cobalt.util.Holder;
 import dev.cobalt.util.Log;
 
@@ -129,6 +130,10 @@
   }
 
   public boolean isActive() {
+    if (!StarboardBridge.enableBackgroundPlayback) {
+      return false;
+    }
+
     if (this.mediaSession == null) {
       return false;
     } else {
@@ -254,7 +259,9 @@
       Log.i(TAG, "MediaSession already released");
       return;
     }
-    mediaSession.setActive(playbackState != PLAYBACK_STATE_NONE);
+    if (StarboardBridge.enableBackgroundPlayback) {
+      mediaSession.setActive(playbackState != PLAYBACK_STATE_NONE);
+    }
     if (lifecycleCallback != null) {
       lifecycleCallback.onMediaSessionLifecycle(
           this.mediaSession.isActive(), this.mediaSession.getSessionToken());
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java
index 8164add..2ae4b23 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java
@@ -86,7 +86,7 @@
   private double mPlaybackRate = 1.0;
   private int mFps = 30;
 
-  private MediaCodec.OnFrameRenderedListener mTunnelModeFrameRendererListener;
+  private MediaCodec.OnFrameRenderedListener mFrameRendererListener;
 
   // Functions that require this will be called frequently in a tight loop.
   // Only create one of these and reuse it to avoid excessive allocations,
@@ -527,9 +527,8 @@
         };
     mMediaCodec.setCallback(mCallback);
 
-    // TODO: support OnFrameRenderedListener for non tunnel mode
-    if (tunnelModeAudioSessionId != -1) {
-      mTunnelModeFrameRendererListener =
+    if (isFrameRenderedCallbackEnabled() || tunnelModeAudioSessionId != -1) {
+      mFrameRendererListener =
           new MediaCodec.OnFrameRenderedListener() {
             @Override
             public void onFrameRendered(MediaCodec codec, long presentationTimeUs, long nanoTime) {
@@ -542,10 +541,17 @@
               }
             }
           };
-      mMediaCodec.setOnFrameRenderedListener(mTunnelModeFrameRendererListener, null);
+      mMediaCodec.setOnFrameRenderedListener(mFrameRendererListener, null);
     }
   }
 
+  @UsedByNative
+  public static boolean isFrameRenderedCallbackEnabled() {
+    // Starting with Android 14, onFrameRendered should be called accurately for each rendered
+    // frame.
+    return Build.VERSION.SDK_INT >= 34;
+  }
+
   @SuppressWarnings("unused")
   @UsedByNative
   public static MediaCodecBridge createAudioMediaCodecBridge(
@@ -618,6 +624,7 @@
       MediaCrypto crypto,
       ColorInfo colorInfo,
       int tunnelModeAudioSessionId,
+      int maxVideoInputSize,
       CreateMediaCodecBridgeResult outCreateMediaCodecBridgeResult) {
     MediaCodec mediaCodec = null;
     outCreateMediaCodecBridgeResult.mMediaCodecBridge = null;
@@ -776,6 +783,20 @@
       }
     }
 
+    if (maxVideoInputSize > 0) {
+      mediaFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, maxVideoInputSize);
+      try {
+        Log.i(
+            TAG,
+            "Set KEY_MAX_INPUT_SIZE to "
+                + maxVideoInputSize
+                + " (actual: "
+                + mediaFormat.getInteger(android.media.MediaFormat.KEY_MAX_INPUT_SIZE)
+                + ").");
+      } catch (Exception e) {
+        Log.e(TAG, "MediaFormat.getInteger(KEY_MAX_INPUT_SIZE) failed with exception: ", e);
+      }
+    }
     if (!bridge.configureVideo(
         mediaFormat, surface, crypto, 0, maxWidth, maxHeight, outCreateMediaCodecBridgeResult)) {
       Log.e(TAG, "Failed to configure video codec.");
@@ -1082,7 +1103,7 @@
         format.setInteger(MediaFormat.KEY_MAX_HEIGHT, Math.min(2160, maxSupportedHeight));
       }
 
-      maybeSetMaxInputSize(format);
+      maybeSetMaxVideoInputSize(format);
       mMediaCodec.configure(format, surface, crypto, flags);
       mFrameRateEstimator = new FrameRateEstimator();
       return true;
@@ -1126,7 +1147,7 @@
   // Use some heuristics to set KEY_MAX_INPUT_SIZE (the size of the input buffers).
   // Taken from ExoPlayer:
   // https://github.com/google/ExoPlayer/blob/8595c65678a181296cdf673eacb93d8135479340/library/src/main/java/com/google/android/exoplayer/MediaCodecVideoTrackRenderer.java
-  private void maybeSetMaxInputSize(MediaFormat format) {
+  private void maybeSetMaxVideoInputSize(MediaFormat format) {
     if (format.containsKey(android.media.MediaFormat.KEY_MAX_INPUT_SIZE)) {
       try {
         Log.i(
@@ -1135,7 +1156,7 @@
                 + format.getInteger(android.media.MediaFormat.KEY_MAX_INPUT_SIZE)
                 + '.');
       } catch (Exception e) {
-        Log.w(TAG, "MediaFormat.getInteger(KEY_MAX_INPUT_SIZE) failed with exception: ", e);
+        Log.e(TAG, "MediaFormat.getInteger(KEY_MAX_INPUT_SIZE) failed with exception: ", e);
       }
       // Already set. The source of the format may know better, so do nothing.
       return;
@@ -1177,18 +1198,18 @@
         return;
     }
     // Estimate the maximum input size assuming three channel 4:2:0 subsampled input frames.
-    int maxInputSize = (maxPixels * 3) / (2 * minCompressionRatio);
-    format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, maxInputSize);
+    int maxVideoInputSize = (maxPixels * 3) / (2 * minCompressionRatio);
+    format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, maxVideoInputSize);
     try {
       Log.i(
           TAG,
-          "KEY_MAX_INPUT_SIZE is "
+          "Set KEY_MAX_INPUT_SIZE to "
+              + maxVideoInputSize
+              + " (actual: "
               + format.getInteger(android.media.MediaFormat.KEY_MAX_INPUT_SIZE)
-              + " after setting it to "
-              + maxInputSize
-              + '.');
+              + ").");
     } catch (Exception e) {
-      Log.w(TAG, "MediaFormat.getInteger(KEY_MAX_INPUT_SIZE) failed with exception: ", e);
+      Log.e(TAG, "MediaFormat.getInteger(KEY_MAX_INPUT_SIZE) failed with exception: ", e);
     }
   }
 
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecCapabilitiesLogger.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecCapabilitiesLogger.java
index f1c640d..8a165be 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecCapabilitiesLogger.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecCapabilitiesLogger.java
@@ -224,15 +224,20 @@
       if (info.isEncoder()) {
         continue;
       }
+      String isHardwareAccelerated = "unknown";
+      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+        isHardwareAccelerated = info.isHardwareAccelerated() ? "true" : "false";
+      }
       for (String supportedType : info.getSupportedTypes()) {
         String name = info.getName();
         decoderDumpString.append(
             String.format(
                 Locale.US,
-                "name: %s (%s, %s):",
+                "name: %s (%s, %s, Hardware accelerated: %s):",
                 name,
                 supportedType,
-                MediaCodecUtil.isCodecDenyListed(name) ? "denylisted" : "not denylisted"));
+                MediaCodecUtil.isCodecDenyListed(name) ? "denylisted" : "not denylisted",
+                isHardwareAccelerated));
         CodecCapabilities codecCapabilities = info.getCapabilitiesForType(supportedType);
         VideoCapabilities videoCapabilities = codecCapabilities.getVideoCapabilities();
         String resultName =
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java
index 190a160..56d1d17 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java
@@ -38,6 +38,7 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.UUID;
 
 /** A wrapper of the android MediaDrm class. */
@@ -460,7 +461,7 @@
         },
         null);
 
-    mMediaDrm.setPropertyString("privacyMode", "enable");
+    mMediaDrm.setPropertyString("privacyMode", "disable");
     mMediaDrm.setPropertyString("sessionSharing", "enable");
     if (keySystem.equals("com.youtube.widevine.l3")
         && mMediaDrm.getPropertyString("securityLevel") != "L3") {
@@ -772,7 +773,7 @@
         Log.i(TAG, "MediaDrm HDCP Level is HDCP_LEVEL_UNKNOWN.");
         break;
       default:
-        Log.i(TAG, String.format("Unknown MediaDrm HDCP level %d.", hdcpLevel));
+        Log.i(TAG, String.format(Locale.US, "Unknown MediaDrm HDCP level %d.", hdcpLevel));
         break;
     }
   }
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/util/Log.java b/starboard/android/apk/app/src/main/java/dev/cobalt/util/Log.java
index cca7c02..5cbb101 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/util/Log.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/util/Log.java
@@ -90,15 +90,24 @@
   }
 
   public static int v(String tag, String messageTemplate, Object... args) {
-    return logWithMethod(logV, tag, messageTemplate, args);
+    if (android.util.Log.isLoggable(TAG, android.util.Log.VERBOSE)) {
+      return logWithMethod(logV, tag, messageTemplate, args);
+    }
+    return 0;
   }
 
   public static int d(String tag, String messageTemplate, Object... args) {
-    return logWithMethod(logD, tag, messageTemplate, args);
+    if (android.util.Log.isLoggable(TAG, android.util.Log.DEBUG)) {
+      return logWithMethod(logD, tag, messageTemplate, args);
+    }
+    return 0;
   }
 
   public static int i(String tag, String messageTemplate, Object... args) {
-    return logWithMethod(logI, tag, messageTemplate, args);
+    if (android.util.Log.isLoggable(TAG, android.util.Log.INFO)) {
+      return logWithMethod(logI, tag, messageTemplate, args);
+    }
+    return 0;
   }
 
   public static int w(String tag, String messageTemplate, Object... args) {
diff --git a/starboard/android/arm/cobalt/configuration.py b/starboard/android/arm/cobalt/configuration.py
new file mode 100644
index 0000000..86c7716
--- /dev/null
+++ b/starboard/android/arm/cobalt/configuration.py
@@ -0,0 +1,53 @@
+# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Starboard Android arm Cobalt configuration."""
+
+from starboard.android.shared.cobalt import configuration
+from starboard.tools.testing import test_filter
+
+# A map of failing or crashing tests per target
+_FILTERED_TESTS = {
+    'blackbox': [
+        'web_debugger',
+        'cancel_sync_loads_when_suspended',
+        'preload_font',
+        'preload_visibility',
+        'preload_launch_parameter',
+        'suspend_visibility',
+        'timer_hit_after_preload',
+        'timer_hit_in_preload',
+        'service_worker_add_to_cache_test',
+        'service_worker_cache_keys_test',
+        'service_worker_controller_activation_test',
+        'service_worker_get_registrations_test',
+        'service_worker_fetch_main_resource_test',
+        'service_worker_fetch_test',
+        'service_worker_message_test',
+        'service_worker_post_message_test',
+        'service_worker_test',
+        'service_worker_persist_test',
+        'deep_links',
+        'web_platform_tests',
+    ],
+}
+
+
+class CobaltAndroidArmConfiguration(configuration.CobaltAndroidConfiguration):
+  """Starboard Android Arm Cobalt configuration."""
+
+  def GetTestFilters(self):
+    filters = super().GetTestFilters()
+    for target, tests in _FILTERED_TESTS.items():
+      filters.extend(test_filter.TestFilter(target, test) for test in tests)
+    return filters
diff --git a/starboard/android/shared/BUILD.gn b/starboard/android/shared/BUILD.gn
index b07982a..45e7412 100644
--- a/starboard/android/shared/BUILD.gn
+++ b/starboard/android/shared/BUILD.gn
@@ -21,11 +21,14 @@
 # Configuration to extract GameActivity native files.
 ##########################################################
 
-game_activity_aar_file = "//starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-1.2.2.aar"
+game_activity_aar_file = "//starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-2.0.2.aar"
 
 game_activity_source_files = [
   "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-activity/GameActivity.cpp",
   "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-activity/GameActivity.h",
+  "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-activity/GameActivityEvents.cpp",
+  "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-activity/GameActivityEvents.h",
+  "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-activity/GameActivityLog.h",
   "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-text-input/gamecommon.h",
   "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-text-input/gametextinput.cpp",
   "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-text-input/gametextinput.h",
@@ -316,6 +319,8 @@
     "get_home_directory.cc",
     "graphics.cc",
     "graphics.h",
+    "h5vcc_config.cc",
+    "h5vcc_config.h",
     "input_events_generator.cc",
     "input_events_generator.h",
     "jni_env_ext.cc",
@@ -358,6 +363,8 @@
     "player_destroy.cc",
     "player_get_preferred_output_mode.cc",
     "player_set_bounds.cc",
+    "player_set_max_video_input_size.cc",
+    "player_set_max_video_input_size.h",
     "player_set_playback_rate.cc",
     "sanitizer_options.cc",
     "socket_get_interface_address.cc",
@@ -387,6 +394,8 @@
     "video_decoder.h",
     "video_frame_tracker.cc",
     "video_frame_tracker.h",
+    "video_max_video_input_size.cc",
+    "video_max_video_input_size.h",
     "video_render_algorithm.cc",
     "video_render_algorithm.h",
     "video_window.cc",
@@ -486,7 +495,7 @@
   configs += [ "//starboard/build/config:starboard_implementation" ]
 
   deps = [
-    "//starboard",
+    "//starboard:starboard_group",
     "//starboard/shared/starboard/player/filter/testing:test_util",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/starboard/android/shared/application_android.cc b/starboard/android/shared/application_android.cc
index 189517e..8d56fa1 100644
--- a/starboard/android/shared/application_android.cc
+++ b/starboard/android/shared/application_android.cc
@@ -433,6 +433,9 @@
 
 bool ApplicationAndroid::SendAndroidMotionEvent(
     const GameActivityMotionEvent* event) {
+  SB_LOG(INFO) << "Received Motion Event from Android OS."
+               << " source:" << event->source;
+
   bool result = false;
 
   ScopedLock lock(input_mutex_);
@@ -454,6 +457,13 @@
 
 bool ApplicationAndroid::SendAndroidKeyEvent(
     const GameActivityKeyEvent* event) {
+  // Find the value reference on
+  // https://developer.android.com/reference/android/view/KeyEvent
+  SB_LOG(INFO) << "Received Key Event from Android OS. "
+               << "keyCode:" << event->keyCode
+               << ", modifiers:" << event->modifiers
+               << ", source:" << event->source;
+
   bool result = false;
 
   ScopedLock lock(input_mutex_);
diff --git a/starboard/android/shared/audio_track_audio_sink_type.cc b/starboard/android/shared/audio_track_audio_sink_type.cc
index 98810e7..f725ed1 100644
--- a/starboard/android/shared/audio_track_audio_sink_type.cc
+++ b/starboard/android/shared/audio_track_audio_sink_type.cc
@@ -216,8 +216,7 @@
     if (bridge_.GetAndResetHasAudioDeviceChanged(env)) {
       SB_LOG(INFO) << "Audio device changed, raising a capability changed "
                       "error to restart playback.";
-      ReportError(kSbPlayerErrorCapabilityChanged,
-                  "Audio device capability changed");
+      ReportError(true, "Audio device capability changed");
       break;
     }
 
@@ -321,11 +320,8 @@
         auto sync_time = start_time_ + accumulated_written_frames *
                                            kSbTimeSecond /
                                            sampling_frequency_hz_;
-        // Not necessary to handle error of WriteData(), even for
-        // kAudioTrackErrorDeadObject, as the audio has reached the end of
-        // stream.
-        // TODO: Ensure that the audio stream can still reach the end when an
-        //       error occurs.
+        // Not necessary to handle error of WriteData(), as the audio has
+        // reached the end of stream.
         WriteData(env, silence_buffer.data(), silence_frames_per_append,
                   sync_time);
       }
@@ -354,16 +350,14 @@
     SbTime now = SbTimeGetMonotonicNow();
 
     if (written_frames < 0) {
-      // Take all |frames_in_audio_track| as consumed since audio track could be
-      // dead.
-      consume_frames_func_(frames_in_audio_track, now, context_);
-
-      bool capabilities_changed =
-          written_frames == AudioTrackBridge::kAudioTrackErrorDeadObject;
-      ReportError(
-          capabilities_changed,
-          FormatString("Error while writing frames: %d", written_frames));
-      SB_LOG(INFO) << "Restarting playback.";
+      if (written_frames == AudioTrackBridge::kAudioTrackErrorDeadObject) {
+        // There might be an audio device change, try to recreate the player.
+        ReportError(true,
+                    "Failed to write data and received dead object error.");
+      } else {
+        ReportError(false, FormatString("Failed to write data and received %d.",
+                                        written_frames));
+      }
       break;
     } else if (written_frames > 0) {
       last_written_succeeded_at = now;
diff --git a/starboard/android/shared/audio_track_bridge.cc b/starboard/android/shared/audio_track_bridge.cc
index 629a96e..3415eeb 100644
--- a/starboard/android/shared/audio_track_bridge.cc
+++ b/starboard/android/shared/audio_track_bridge.cc
@@ -186,13 +186,10 @@
   SB_DCHECK(num_of_samples <= max_samples_per_write_);
 
   num_of_samples = std::min(num_of_samples, max_samples_per_write_);
-
-  // TODO: Test this code path
   env->SetFloatArrayRegion(static_cast<jfloatArray>(j_audio_data_), kNoOffset,
                            num_of_samples, samples);
-  int samples_written = env->CallIntMethodOrAbort(
-      j_audio_track_bridge_, "write", "([FI)I", j_audio_data_, num_of_samples);
-  return samples_written;
+  return env->CallIntMethodOrAbort(j_audio_track_bridge_, "write", "([FI)I",
+                                   j_audio_data_, num_of_samples);
 }
 
 int AudioTrackBridge::WriteSample(const uint16_t* samples,
@@ -204,8 +201,6 @@
   SB_DCHECK(num_of_samples <= max_samples_per_write_);
 
   num_of_samples = std::min(num_of_samples, max_samples_per_write_);
-
-  // TODO: Test this code path
   env->SetByteArrayRegion(static_cast<jbyteArray>(j_audio_data_), kNoOffset,
                           num_of_samples * sizeof(uint16_t),
                           reinterpret_cast<const jbyte*>(samples));
diff --git a/starboard/android/shared/audio_track_bridge.h b/starboard/android/shared/audio_track_bridge.h
index 1844151..b4303ae 100644
--- a/starboard/android/shared/audio_track_bridge.h
+++ b/starboard/android/shared/audio_track_bridge.h
@@ -61,15 +61,18 @@
   void Stop(JniEnvExt* env = JniEnvExt::Get());
   void PauseAndFlush(JniEnvExt* env = JniEnvExt::Get());
 
+  // Returns zero or the positive number of samples written, or a negative error
+  // code.
   int WriteSample(const float* samples,
                   int num_of_samples,
                   JniEnvExt* env = JniEnvExt::Get());
-  // Returns samples written.
   int WriteSample(const uint16_t* samples,
                   int num_of_samples,
                   SbTime sync_time,
                   JniEnvExt* env = JniEnvExt::Get());
   // This is used by passthrough, it treats samples as if they are in bytes.
+  // Returns zero or the positive number of samples written, or a negative error
+  // code.
   int WriteSample(const uint8_t* buffer,
                   int num_of_samples,
                   SbTime sync_time,
diff --git a/starboard/android/shared/h5vcc_config.cc b/starboard/android/shared/h5vcc_config.cc
new file mode 100644
index 0000000..059b417
--- /dev/null
+++ b/starboard/android/shared/h5vcc_config.cc
@@ -0,0 +1,50 @@
+// Copyright 2024 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/extension/h5vcc_config.h"
+#include "starboard/android/shared/h5vcc_config.h"
+#include "starboard/android/shared/jni_env_ext.h"
+#include "starboard/android/shared/jni_utils.h"
+#include "starboard/common/log.h"
+
+namespace starboard {
+namespace android {
+namespace shared {
+
+namespace {
+
+// Definitions of any functions included as components in the extension
+// are added here.
+
+void EnableBackgroundPlayback(bool value) {
+  JniEnvExt* env = JniEnvExt::Get();
+  JniEnvExt::Get()->CallStarboardVoidMethodOrAbort("enableBackgroundPlayback",
+                                                   "(Z)V", (jboolean)value);
+}
+
+const StarboardExtensionH5vccConfigApi kH5vccConfigApi = {
+    kStarboardExtensionH5vccConfigName,
+    1,  // API version that's implemented.
+    &EnableBackgroundPlayback,
+};
+
+}  // namespace
+
+const void* GetH5vccConfigApi() {
+  return &kH5vccConfigApi;
+}
+
+}  // namespace shared
+}  // namespace android
+}  // namespace starboard
diff --git a/starboard/android/shared/h5vcc_config.h b/starboard/android/shared/h5vcc_config.h
new file mode 100644
index 0000000..f2a501c
--- /dev/null
+++ b/starboard/android/shared/h5vcc_config.h
@@ -0,0 +1,28 @@
+// Copyright 2024 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_ANDROID_SHARED_H5VCC_CONFIG_H_
+#define STARBOARD_ANDROID_SHARED_H5VCC_CONFIG_H_
+
+namespace starboard {
+namespace android {
+namespace shared {
+
+const void* GetH5vccConfigApi();
+
+}  // namespace shared
+}  // namespace android
+}  // namespace starboard
+
+#endif  // STARBOARD_ANDROID_SHARED_H5VCC_CONFIG_H_
diff --git a/starboard/android/shared/media_codec_bridge.cc b/starboard/android/shared/media_codec_bridge.cc
index 87bdf32..c126fc0 100644
--- a/starboard/android/shared/media_codec_bridge.cc
+++ b/starboard/android/shared/media_codec_bridge.cc
@@ -228,6 +228,7 @@
     int tunnel_mode_audio_session_id,
     bool force_big_endian_hdr_metadata,
     bool force_improved_support_check,
+    int max_video_input_size,
     std::string* error_message) {
   SB_DCHECK(error_message);
   SB_DCHECK(max_width.has_engaged() == max_height.has_engaged());
@@ -317,14 +318,14 @@
       "(JLjava/lang/String;Ljava/lang/String;IIIIILandroid/view/Surface;"
       "Landroid/media/MediaCrypto;"
       "Ldev/cobalt/media/MediaCodecBridge$ColorInfo;"
-      "I"
+      "II"
       "Ldev/cobalt/media/MediaCodecBridge$CreateMediaCodecBridgeResult;)"
       "V",
       reinterpret_cast<jlong>(native_media_codec_bridge.get()), j_mime.Get(),
       j_decoder_name.Get(), width_hint, height_hint, fps,
       max_width.value_or(-1), max_height.value_or(-1), j_surface,
       j_media_crypto, j_color_info.Get(), tunnel_mode_audio_session_id,
-      j_create_media_codec_bridge_result.Get());
+      max_video_input_size, j_create_media_codec_bridge_result.Get());
 
   jobject j_media_codec_bridge = env->CallObjectMethodOrAbort(
       j_create_media_codec_bridge_result.Get(), "mediaCodecBridge",
diff --git a/starboard/android/shared/media_codec_bridge.h b/starboard/android/shared/media_codec_bridge.h
index bf395d5..ad99b62 100644
--- a/starboard/android/shared/media_codec_bridge.h
+++ b/starboard/android/shared/media_codec_bridge.h
@@ -174,6 +174,7 @@
       int tunnel_mode_audio_session_id,
       bool force_big_endian_hdr_metadata,
       bool force_improved_support_check,
+      int max_video_input_size,
       std::string* error_message);
 
   ~MediaCodecBridge();
diff --git a/starboard/android/shared/media_decoder.cc b/starboard/android/shared/media_decoder.cc
index cf93733..49c9752 100644
--- a/starboard/android/shared/media_decoder.cc
+++ b/starboard/android/shared/media_decoder.cc
@@ -119,6 +119,7 @@
                            int tunnel_mode_audio_session_id,
                            bool force_big_endian_hdr_metadata,
                            bool force_improved_support_check,
+                           int max_video_input_size,
                            std::string* error_message)
     : media_type_(kSbMediaTypeVideo),
       host_(host),
@@ -137,7 +138,7 @@
       j_output_surface, j_media_crypto, color_metadata, require_secured_decoder,
       require_software_codec, tunnel_mode_audio_session_id,
       force_big_endian_hdr_metadata, force_improved_support_check,
-      error_message);
+      max_video_input_size, error_message);
   if (!media_codec_bridge_) {
     SB_LOG(ERROR) << "Failed to create video media codec bridge with error: "
                   << *error_message;
@@ -319,18 +320,18 @@
                                   &dequeue_output_results);
       }
 
-      if (!tunnel_mode_enabled_) {
-        // Output is only processed when tunnel mode is disabled.
-        if (!dequeue_output_results.empty()) {
-          auto& dequeue_output_result = dequeue_output_results.front();
-          if (dequeue_output_result.index < 0) {
-            host_->RefreshOutputFormat(media_codec_bridge_.get());
-          } else {
-            host_->ProcessOutputBuffer(media_codec_bridge_.get(),
-                                       dequeue_output_result);
-          }
-          dequeue_output_results.erase(dequeue_output_results.begin());
+      if (!dequeue_output_results.empty()) {
+        auto& dequeue_output_result = dequeue_output_results.front();
+        if (dequeue_output_result.index < 0) {
+          host_->RefreshOutputFormat(media_codec_bridge_.get());
+        } else {
+          SB_DCHECK(!tunnel_mode_enabled_);
+          host_->ProcessOutputBuffer(media_codec_bridge_.get(),
+                                     dequeue_output_result);
         }
+        dequeue_output_results.erase(dequeue_output_results.begin());
+      }
+      if (!tunnel_mode_enabled_) {
         host_->Tick(media_codec_bridge_.get());
       }
 
@@ -642,7 +643,6 @@
 }
 
 void MediaDecoder::OnMediaCodecFrameRendered(SbTime frame_timestamp) {
-  SB_DCHECK(tunnel_mode_enabled_);
   frame_rendered_cb_(frame_timestamp);
 }
 
diff --git a/starboard/android/shared/media_decoder.h b/starboard/android/shared/media_decoder.h
index 7c7a2eb..23838bd 100644
--- a/starboard/android/shared/media_decoder.h
+++ b/starboard/android/shared/media_decoder.h
@@ -98,6 +98,7 @@
                int tunnel_mode_audio_session_id,
                bool force_big_endian_hdr_metadata,
                bool force_improved_support_check,
+               int max_video_input_size,
                std::string* error_message);
   ~MediaDecoder();
 
diff --git a/starboard/android/shared/platform_configuration/BUILD.gn b/starboard/android/shared/platform_configuration/BUILD.gn
index 5240ff6..a37f130 100644
--- a/starboard/android/shared/platform_configuration/BUILD.gn
+++ b/starboard/android/shared/platform_configuration/BUILD.gn
@@ -70,7 +70,7 @@
     defines += [ "THREAD_SANITIZER" ]
   }
 
-  cflags_cc = [ "-std=c++14" ]
+  cflags_cc = [ "-std=c++17" ]
   cflags += [
     # libwebp uses the cpufeatures library to detect ARM NEON support
     "-I${android_ndk_path}/sources/android/cpufeatures",
diff --git a/starboard/android/shared/player_components_factory.cc b/starboard/android/shared/player_components_factory.cc
index 8646c6f..10fc27e 100644
--- a/starboard/android/shared/player_components_factory.cc
+++ b/starboard/android/shared/player_components_factory.cc
@@ -44,7 +44,11 @@
       return true;
     }
     DrmSystem* android_drm_system = static_cast<DrmSystem*>(drm_system);
-    return !android_drm_system->require_secured_decoder();
+    bool require_secure_decoder = android_drm_system->require_secured_decoder();
+    SB_LOG_IF(INFO, require_secure_decoder)
+        << "Output mode under decode-to-texture is not supported due to secure "
+           "decoder is required.";
+    return !require_secure_decoder;
   }
 
   return false;
diff --git a/starboard/android/shared/player_components_factory.h b/starboard/android/shared/player_components_factory.h
index 57d3b44..82aca7e 100644
--- a/starboard/android/shared/player_components_factory.h
+++ b/starboard/android/shared/player_components_factory.h
@@ -242,6 +242,13 @@
       return scoped_ptr<PlayerComponents>();
     }
 
+    // Set max_video_input_size with a positive value to overwrite
+    // MediaFormat.KEY_MAX_INPUT_SIZE. Use 0 as default value.
+    int max_video_input_size = creation_parameters.max_video_input_size();
+    SB_LOG_IF(INFO, max_video_input_size > 0)
+        << "The maximum size in bytes of a buffer of data is "
+        << max_video_input_size;
+
     scoped_ptr<::starboard::shared::starboard::player::filter::VideoRenderer>
         video_renderer;
     if (creation_parameters.video_codec() != kSbMediaVideoCodecNone) {
@@ -262,11 +269,10 @@
         SB_LOG_IF(INFO, !force_improved_support_check)
             << "Improved support check is disabled for queries under 4K.";
       }
-
-      scoped_ptr<VideoDecoder> video_decoder =
-          CreateVideoDecoder(creation_parameters, kTunnelModeAudioSessionId,
-                             kForceSecurePipelineUnderTunnelMode,
-                             force_improved_support_check, error_message);
+      scoped_ptr<VideoDecoder> video_decoder = CreateVideoDecoder(
+          creation_parameters, kTunnelModeAudioSessionId,
+          kForceSecurePipelineUnderTunnelMode, force_improved_support_check,
+          max_video_input_size, error_message);
       if (video_decoder) {
         using starboard::shared::starboard::player::filter::VideoRendererImpl;
 
@@ -448,15 +454,21 @@
       SB_DCHECK(video_render_algorithm);
       SB_DCHECK(video_renderer_sink);
       SB_DCHECK(error_message);
+      // Set max_video_input_size with a positive value to overwrite
+      // MediaFormat.KEY_MAX_INPUT_SIZE. Use 0 as default value.
+      int max_video_input_size = creation_parameters.max_video_input_size();
+      SB_LOG_IF(INFO, max_video_input_size > 0)
+          << "The maximum size in bytes of a buffer of data is "
+          << max_video_input_size;
 
       if (tunnel_mode_audio_session_id == -1) {
         force_secure_pipeline_under_tunnel_mode = false;
       }
 
-      scoped_ptr<VideoDecoder> video_decoder_impl =
-          CreateVideoDecoder(creation_parameters, tunnel_mode_audio_session_id,
-                             force_secure_pipeline_under_tunnel_mode,
-                             force_improved_support_check, error_message);
+      scoped_ptr<VideoDecoder> video_decoder_impl = CreateVideoDecoder(
+          creation_parameters, tunnel_mode_audio_session_id,
+          force_secure_pipeline_under_tunnel_mode, force_improved_support_check,
+          max_video_input_size, error_message);
       if (video_decoder_impl) {
         *video_render_algorithm = video_decoder_impl->GetRenderAlgorithm();
         *video_renderer_sink = video_decoder_impl->GetSink();
@@ -501,6 +513,7 @@
       int tunnel_mode_audio_session_id,
       bool force_secure_pipeline_under_tunnel_mode,
       bool force_improved_support_check,
+      int max_video_input_size,
       std::string* error_message) {
     bool force_big_endian_hdr_metadata = false;
     if (!creation_parameters.video_mime().empty()) {
@@ -522,7 +535,7 @@
         creation_parameters.max_video_capabilities(),
         tunnel_mode_audio_session_id, force_secure_pipeline_under_tunnel_mode,
         kForceResetSurfaceUnderTunnelMode, force_big_endian_hdr_metadata,
-        force_improved_support_check, error_message));
+        force_improved_support_check, max_video_input_size, error_message));
     if (creation_parameters.video_codec() == kSbMediaVideoCodecAv1 ||
         video_decoder->is_decoder_created()) {
       return video_decoder.Pass();
diff --git a/starboard/android/shared/player_create.cc b/starboard/android/shared/player_create.cc
index ebe6faa..912b705 100644
--- a/starboard/android/shared/player_create.cc
+++ b/starboard/android/shared/player_create.cc
@@ -16,6 +16,7 @@
 
 #include "starboard/player.h"
 
+#include "starboard/android/shared/video_max_video_input_size.h"
 #include "starboard/android/shared/video_window.h"
 #include "starboard/common/log.h"
 #include "starboard/common/media.h"
@@ -207,6 +208,8 @@
 
   starboard::scoped_ptr<PlayerWorker::Handler> handler(
       new FilterBasedPlayerWorkerHandler(creation_param, provider));
+  handler->SetMaxVideoInputSize(
+      starboard::android::shared::GetMaxVideoInputSizeForCurrentThread());
   SbPlayer player = SbPlayerPrivate::CreateInstance(
       audio_codec, video_codec, sample_deallocate_func, decoder_status_func,
       player_status_func, player_error_func, context, handler.Pass());
diff --git a/starboard/android/shared/player_get_preferred_output_mode.cc b/starboard/android/shared/player_get_preferred_output_mode.cc
index c7485e3..185f8e1 100644
--- a/starboard/android/shared/player_get_preferred_output_mode.cc
+++ b/starboard/android/shared/player_get_preferred_output_mode.cc
@@ -82,6 +82,9 @@
         is_sdr) {
       return kSbPlayerOutputModeDecodeToTexture;
     }
+    SB_LOG_IF(INFO, !is_sdr)
+        << "Returning kSbPlayerOutputModeInvalid as HDR videos are not "
+           "supported under decode-to-texture.";
     return kSbPlayerOutputModeInvalid;
   }
 
diff --git a/starboard/android/shared/player_set_max_video_input_size.cc b/starboard/android/shared/player_set_max_video_input_size.cc
new file mode 100644
index 0000000..43c8ede
--- /dev/null
+++ b/starboard/android/shared/player_set_max_video_input_size.cc
@@ -0,0 +1,49 @@
+// Copyright 2024 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/android/shared/player_set_max_video_input_size.h"
+
+#include "starboard/android/shared/video_max_video_input_size.h"
+#include "starboard/extension/player_set_max_video_input_size.h"
+
+namespace starboard {
+namespace android {
+namespace shared {
+
+namespace {
+
+// Definitions of any functions included as components in the extension
+// are added here.
+
+void SetMaxVideoInputSizeForCurrentThread(int max_video_input_size) {
+  starboard::android::shared::SetMaxVideoInputSizeForCurrentThread(
+      max_video_input_size);
+}
+
+const StarboardExtensionPlayerSetMaxVideoInputSizeApi
+    kPlayerSetMaxVideoInputSizeApi = {
+        kStarboardExtensionPlayerSetMaxVideoInputSizeName,
+        1,
+        &SetMaxVideoInputSizeForCurrentThread,
+};
+
+}  // namespace
+
+const void* GetPlayerSetMaxVideoInputSizeApi() {
+  return &kPlayerSetMaxVideoInputSizeApi;
+}
+
+}  // namespace shared
+}  // namespace android
+}  // namespace starboard
diff --git a/starboard/android/shared/player_set_max_video_input_size.h b/starboard/android/shared/player_set_max_video_input_size.h
new file mode 100644
index 0000000..4f6c782
--- /dev/null
+++ b/starboard/android/shared/player_set_max_video_input_size.h
@@ -0,0 +1,28 @@
+// Copyright 2024 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_ANDROID_SHARED_PLAYER_SET_MAX_VIDEO_INPUT_SIZE_H_
+#define STARBOARD_ANDROID_SHARED_PLAYER_SET_MAX_VIDEO_INPUT_SIZE_H_
+
+namespace starboard {
+namespace android {
+namespace shared {
+
+const void* GetPlayerSetMaxVideoInputSizeApi();
+
+}  // namespace shared
+}  // namespace android
+}  // namespace starboard
+
+#endif  // STARBOARD_ANDROID_SHARED_PLAYER_SET_MAX_VIDEO_INPUT_SIZE_H_
diff --git a/starboard/android/shared/system_get_extensions.cc b/starboard/android/shared/system_get_extensions.cc
index 0fcd774..b7f8958 100644
--- a/starboard/android/shared/system_get_extensions.cc
+++ b/starboard/android/shared/system_get_extensions.cc
@@ -17,8 +17,10 @@
 #include "starboard/android/shared/android_media_session_client.h"
 #include "starboard/android/shared/configuration.h"
 #include "starboard/android/shared/graphics.h"
+#include "starboard/android/shared/h5vcc_config.h"
 #include "starboard/android/shared/platform_info.h"
 #include "starboard/android/shared/platform_service.h"
+#include "starboard/android/shared/player_set_max_video_input_size.h"
 #include "starboard/common/log.h"
 #include "starboard/common/string.h"
 #if SB_IS(EVERGREEN_COMPATIBLE)
@@ -30,9 +32,11 @@
 #include "starboard/extension/configuration.h"
 #include "starboard/extension/crash_handler.h"
 #include "starboard/extension/graphics.h"
+#include "starboard/extension/h5vcc_config.h"
 #include "starboard/extension/media_session.h"
 #include "starboard/extension/platform_info.h"
 #include "starboard/extension/platform_service.h"
+#include "starboard/extension/player_set_max_video_input_size.h"
 
 const void* SbSystemGetExtension(const char* name) {
 #if SB_IS(EVERGREEN_COMPATIBLE)
@@ -68,5 +72,11 @@
   if (strcmp(name, kCobaltExtensionPlatformInfoName) == 0) {
     return starboard::android::shared::GetPlatformInfoApi();
   }
+  if (strcmp(name, kStarboardExtensionPlayerSetMaxVideoInputSizeName) == 0) {
+    return starboard::android::shared::GetPlayerSetMaxVideoInputSizeApi();
+  }
+  if (strcmp(name, kStarboardExtensionH5vccConfigName) == 0) {
+    return starboard::android::shared::GetH5vccConfigApi();
+  }
   return NULL;
 }
diff --git a/starboard/android/shared/video_decoder.cc b/starboard/android/shared/video_decoder.cc
index 44e899b..b3fe2bb 100644
--- a/starboard/android/shared/video_decoder.cc
+++ b/starboard/android/shared/video_decoder.cc
@@ -357,6 +357,7 @@
                            bool force_reset_surface_under_tunnel_mode,
                            bool force_big_endian_hdr_metadata,
                            bool force_improved_support_check,
+                           int max_video_input_size,
                            std::string* error_message)
     : video_codec_(video_stream_info.codec),
       drm_system_(static_cast<DrmSystem*>(drm_system)),
@@ -365,8 +366,11 @@
           decode_target_graphics_context_provider),
       max_video_capabilities_(max_video_capabilities),
       tunnel_mode_audio_session_id_(tunnel_mode_audio_session_id),
+      max_video_input_size_(max_video_input_size),
       force_reset_surface_under_tunnel_mode_(
           force_reset_surface_under_tunnel_mode),
+      is_video_frame_tracker_enabled_(IsFrameRenderedCallbackEnabled() ||
+                                      tunnel_mode_audio_session_id != -1),
       has_new_texture_available_(false),
       surface_condition_variable_(surface_destroy_mutex_),
       require_software_codec_(IsSoftwareDecodeRequired(max_video_capabilities)),
@@ -375,9 +379,6 @@
       number_of_preroll_frames_(kInitialPrerollFrameCount) {
   SB_DCHECK(error_message);
 
-  if (tunnel_mode_audio_session_id != -1) {
-    video_frame_tracker_.reset(new VideoFrameTracker(kMaxPendingWorkSize * 2));
-  }
   if (force_secure_pipeline_under_tunnel_mode) {
     SB_DCHECK(tunnel_mode_audio_session_id != -1);
     SB_DCHECK(!drm_system_);
@@ -387,6 +388,10 @@
     drm_system_ = drm_system_to_enforce_tunnel_mode_.get();
   }
 
+  if (is_video_frame_tracker_enabled_) {
+    video_frame_tracker_.reset(new VideoFrameTracker(kMaxPendingWorkSize * 2));
+  }
+
   if (require_software_codec_) {
     SB_DCHECK(output_mode_ == kSbPlayerOutputModeDecodeToTexture);
   }
@@ -428,7 +433,8 @@
 VideoDecoder::GetRenderAlgorithm() {
   if (tunnel_mode_audio_session_id_ == -1) {
     return scoped_ptr<VideoRenderAlgorithm>(
-        new android::shared::VideoRenderAlgorithm(this));
+        new android::shared::VideoRenderAlgorithm(this,
+                                                  video_frame_tracker_.get()));
   }
   return scoped_ptr<VideoRenderAlgorithm>(
       new VideoRenderAlgorithmTunneled(video_frame_tracker_.get()));
@@ -711,9 +717,9 @@
       video_stream_info.frame_height, max_width, max_height, video_fps_,
       j_output_surface, drm_system_,
       color_metadata_ ? &*color_metadata_ : nullptr, require_software_codec_,
-      std::bind(&VideoDecoder::OnTunnelModeFrameRendered, this, _1),
+      std::bind(&VideoDecoder::OnFrameRendered, this, _1),
       tunnel_mode_audio_session_id_, force_big_endian_hdr_metadata_,
-      force_improved_support_check_, error_message));
+      force_improved_support_check_, max_video_input_size_, error_message));
   if (media_decoder_->is_valid()) {
     if (error_cb_) {
       media_decoder_->Initialize(
@@ -804,6 +810,14 @@
     SB_LOG(INFO) << "Trying to write input buffer when media_decoder_ is null.";
     return;
   }
+
+  if (is_video_frame_tracker_enabled_) {
+    SB_DCHECK(video_frame_tracker_);
+    for (const auto& input_buffer : input_buffers) {
+      video_frame_tracker_->OnInputBuffer(input_buffer->timestamp());
+    }
+  }
+
   media_decoder_->WriteInputBuffers(input_buffers);
   if (media_decoder_->GetNumberOfPendingTasks() < kMaxPendingWorkSize) {
     decoder_status_cb_(kNeedMoreInput, NULL);
@@ -818,7 +832,6 @@
   if (tunnel_mode_audio_session_id_ != -1) {
     SbTime max_timestamp = input_buffers[0]->timestamp();
     for (const auto& input_buffer : input_buffers) {
-      video_frame_tracker_->OnInputBuffer(input_buffer->timestamp());
       max_timestamp = std::max(max_timestamp, input_buffer->timestamp());
     }
 
@@ -1148,10 +1161,19 @@
   has_new_texture_available_.store(true);
 }
 
-void VideoDecoder::OnTunnelModeFrameRendered(SbTime frame_timestamp) {
-  SB_DCHECK(tunnel_mode_audio_session_id_ != -1);
+bool VideoDecoder::IsFrameRenderedCallbackEnabled() {
+  return JniEnvExt::Get()->CallStaticBooleanMethodOrAbort(
+             "dev/cobalt/media/MediaCodecBridge",
+             "isFrameRenderedCallbackEnabled", "()Z") == JNI_TRUE;
+}
 
-  tunnel_mode_frame_rendered_.store(true);
+void VideoDecoder::OnFrameRendered(SbTime frame_timestamp) {
+  SB_DCHECK(is_video_frame_tracker_enabled_);
+  SB_DCHECK(video_frame_tracker_);
+
+  if (tunnel_mode_audio_session_id_ != -1) {
+    tunnel_mode_frame_rendered_.store(true);
+  }
   video_frame_tracker_->OnFrameRendered(frame_timestamp);
 }
 
diff --git a/starboard/android/shared/video_decoder.h b/starboard/android/shared/video_decoder.h
index 232db16..c5fde74 100644
--- a/starboard/android/shared/video_decoder.h
+++ b/starboard/android/shared/video_decoder.h
@@ -71,6 +71,7 @@
                bool force_reset_surface_under_tunnel_mode,
                bool force_big_endian_hdr_metadata,
                bool force_improved_support_check,
+               int max_input_size,
                std::string* error_message);
   ~VideoDecoder() override;
 
@@ -116,7 +117,8 @@
   void OnFlushing() override;
 
   void TryToSignalPrerollForTunnelMode();
-  void OnTunnelModeFrameRendered(SbTime frame_timestamp);
+  bool IsFrameRenderedCallbackEnabled();
+  void OnFrameRendered(SbTime frame_timestamp);
   void OnTunnelModePrerollTimeout();
   void OnTunnelModeCheckForNeedMoreInput();
 
@@ -151,6 +153,9 @@
 
   const int tunnel_mode_audio_session_id_ = -1;
 
+  // Set the maximum size in bytes of an input buffer for video.
+  const int max_video_input_size_;
+
   // Force resetting the video surface after tunnel mode playback, which
   // prevents video distortion on some devices.
   const bool force_reset_surface_under_tunnel_mode_;
@@ -158,7 +163,10 @@
   // we create a dummy drm system to force the video playing in secure pipeline
   // to enable tunnel mode.
   scoped_ptr<DrmSystem> drm_system_to_enforce_tunnel_mode_;
+
+  const bool is_video_frame_tracker_enabled_;
   scoped_ptr<VideoFrameTracker> video_frame_tracker_;
+
   // Preroll in tunnel mode is handled in this class instead of in the renderer.
   atomic_bool tunnel_mode_prerolling_{true};
   atomic_bool tunnel_mode_frame_rendered_;
diff --git a/starboard/android/shared/video_max_video_input_size.cc b/starboard/android/shared/video_max_video_input_size.cc
new file mode 100644
index 0000000..0c73155
--- /dev/null
+++ b/starboard/android/shared/video_max_video_input_size.cc
@@ -0,0 +1,53 @@
+// Copyright 2024 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/android/shared/video_max_video_input_size.h"
+
+#include "starboard/common/log.h"
+#include "starboard/once.h"
+#include "starboard/thread.h"
+
+namespace starboard {
+namespace android {
+namespace shared {
+
+SbOnceControl s_once_flag = SB_ONCE_INITIALIZER;
+SbThreadLocalKey s_thread_local_key = kSbThreadLocalKeyInvalid;
+
+void InitThreadLocalKey() {
+  s_thread_local_key = SbThreadCreateLocalKey(NULL);
+  SB_DCHECK(SbThreadIsValidLocalKey(s_thread_local_key));
+}
+
+void EnsureThreadLocalKeyInited() {
+  SbOnce(&s_once_flag, InitThreadLocalKey);
+  SB_DCHECK(SbThreadIsValidLocalKey(s_thread_local_key));
+}
+
+int GetMaxVideoInputSizeForCurrentThread() {
+  EnsureThreadLocalKeyInited();
+  // If the key is not valid or there is no value associated
+  // with the key, it returns 0.
+  return reinterpret_cast<uintptr_t>(SbThreadGetLocalValue(s_thread_local_key));
+}
+
+void SetMaxVideoInputSizeForCurrentThread(int max_video_input_size) {
+  EnsureThreadLocalKeyInited();
+  SbThreadSetLocalValue(s_thread_local_key,
+                        reinterpret_cast<void*>(max_video_input_size));
+}
+
+}  // namespace shared
+}  // namespace android
+}  // namespace starboard
diff --git a/starboard/android/shared/video_max_video_input_size.h b/starboard/android/shared/video_max_video_input_size.h
new file mode 100644
index 0000000..b011ad1
--- /dev/null
+++ b/starboard/android/shared/video_max_video_input_size.h
@@ -0,0 +1,38 @@
+// Copyright 2024 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_ANDROID_SHARED_VIDEO_MAX_VIDEO_INPUT_SIZE_H_
+#define STARBOARD_ANDROID_SHARED_VIDEO_MAX_VIDEO_INPUT_SIZE_H_
+
+namespace starboard {
+namespace android {
+namespace shared {
+
+// Get max_video_input_size setting via SetMaxVideoInputSizeForCurrentThread(),
+// it returns 0 if s_thread_local_key is invalid.
+int GetMaxVideoInputSizeForCurrentThread();
+
+// 1. This is utilized to establish the maximum video input size
+//    for any subsequently created SbPlayer on the current calling thread.
+// 2. The maximum video input dimensions serve as a suggestion; the
+//    implementation is not obligated to adhere to it, and there is no
+//    feedback provided.
+// 3. Set it to 0 disable the setting.
+void SetMaxVideoInputSizeForCurrentThread(int max_video_input_size);
+
+}  // namespace shared
+}  // namespace android
+}  // namespace starboard
+
+#endif  // STARBOARD_ANDROID_SHARED_VIDEO_MAX_VIDEO_INPUT_SIZE_H_
diff --git a/starboard/android/shared/video_render_algorithm.cc b/starboard/android/shared/video_render_algorithm.cc
index 5edf96f..dc22c35 100644
--- a/starboard/android/shared/video_render_algorithm.cc
+++ b/starboard/android/shared/video_render_algorithm.cc
@@ -37,8 +37,9 @@
 
 }  // namespace
 
-VideoRenderAlgorithm::VideoRenderAlgorithm(VideoDecoder* video_decoder)
-    : video_decoder_(video_decoder) {
+VideoRenderAlgorithm::VideoRenderAlgorithm(VideoDecoder* video_decoder,
+                                           VideoFrameTracker* frame_tracker)
+    : video_decoder_(video_decoder), frame_tracker_(frame_tracker) {
   SB_DCHECK(video_decoder_);
   video_decoder_->SetPlaybackRate(playback_rate_);
 }
@@ -116,6 +117,19 @@
   }
 }
 
+void VideoRenderAlgorithm::Seek(SbTime seek_to_time) {
+  if (frame_tracker_) {
+    frame_tracker_->Seek(seek_to_time);
+  }
+}
+
+int VideoRenderAlgorithm::GetDroppedFrames() {
+  if (frame_tracker_) {
+    return frame_tracker_->UpdateAndGetDroppedFrames();
+  }
+  return dropped_frames_;
+}
+
 VideoRenderAlgorithm::VideoFrameReleaseTimeHelper::
     VideoFrameReleaseTimeHelper() {
   auto* env = JniEnvExt::Get();
diff --git a/starboard/android/shared/video_render_algorithm.h b/starboard/android/shared/video_render_algorithm.h
index 132e871..67f4868 100644
--- a/starboard/android/shared/video_render_algorithm.h
+++ b/starboard/android/shared/video_render_algorithm.h
@@ -28,13 +28,15 @@
 class VideoRenderAlgorithm : public ::starboard::shared::starboard::player::
                                  filter::VideoRenderAlgorithm {
  public:
-  explicit VideoRenderAlgorithm(VideoDecoder* video_decoder);
+  VideoRenderAlgorithm(VideoDecoder* video_decoder,
+                       VideoFrameTracker* frame_tracker);
 
   void Render(MediaTimeProvider* media_time_provider,
               std::list<scoped_refptr<VideoFrame>>* frames,
               VideoRendererSink::DrawFrameCB draw_frame_cb) override;
-  void Seek(SbTime seek_to_time) override {}
-  int GetDroppedFrames() override { return dropped_frames_; }
+
+  void Seek(SbTime seek_to_time) override;
+  int GetDroppedFrames() override;
 
  private:
   class VideoFrameReleaseTimeHelper {
@@ -49,6 +51,7 @@
   };
 
   VideoDecoder* video_decoder_ = nullptr;
+  VideoFrameTracker* frame_tracker_;
   double playback_rate_ = 1.0;
   VideoFrameReleaseTimeHelper video_frame_release_time_helper_;
   int dropped_frames_ = 0;
diff --git a/starboard/benchmark/BUILD.gn b/starboard/benchmark/BUILD.gn
index 7fd1215..4cba863 100644
--- a/starboard/benchmark/BUILD.gn
+++ b/starboard/benchmark/BUILD.gn
@@ -22,7 +22,7 @@
   ]
 
   public_deps = [
-    "//starboard",
+    "//starboard:starboard_group",
     "//third_party/google_benchmark",
   ]
   deps = cobalt_platform_dependencies
diff --git a/starboard/build/application_configuration.py b/starboard/build/application_configuration.py
index 947ff90..7c9fabd 100644
--- a/starboard/build/application_configuration.py
+++ b/starboard/build/application_configuration.py
@@ -71,3 +71,11 @@
       A list of strings of test target names.
     """
     return []
+
+  def GetTestBlackBoxTargets(self):
+    """Gets all tests to be run in black box test run.
+
+    Returns:
+      A list of strings of black box test target names.
+    """
+    return []
diff --git a/starboard/build/config/BUILD.gn b/starboard/build/config/BUILD.gn
index 6a0290a..5fd66dc 100644
--- a/starboard/build/config/BUILD.gn
+++ b/starboard/build/config/BUILD.gn
@@ -183,6 +183,9 @@
 config("starboard_implementation") {
   # This allows the benchmarks to include internal only header files.
   defines = [ "STARBOARD_IMPLEMENTATION" ]
+  if (current_cpu == "arm64" || (current_cpu == "arm" && arm_use_neon)) {
+    defines += [ "USE_NEON" ]
+  }
 }
 
 config("speed") {
diff --git a/starboard/build/config/BUILDCONFIG.gn b/starboard/build/config/BUILDCONFIG.gn
index 315e402..7f809bc 100644
--- a/starboard/build/config/BUILDCONFIG.gn
+++ b/starboard/build/config/BUILDCONFIG.gn
@@ -333,8 +333,99 @@
   }
 }
 
+template("evergreen_loader") {
+  # Add additional evergreen_loader target for every native target.
+  original_target_name = invoker.original_target_name
+  shared_data_deps = invoker.data_deps
+  shared_data_deps += [ "//third_party/icu:icudata" ]
+  shared_data_deps += [
+    ":copy_loader_app_lib${original_target_name}",
+    "//starboard/loader_app:copy_loader_app_content",
+  ]
+  if (cobalt_font_package == "empty") {
+    shared_data_deps += [ "//cobalt/content/fonts:copy_font_data" ]
+  } else {
+    shared_data_deps += [
+      "//cobalt/content/fonts:copy_fonts",
+      "//cobalt/content/fonts:fonts_xml",
+    ]
+  }
+  shared_library(target_name) {
+    forward_variables_from(invoker, [ "testonly" ])
+    if (has_pedantic_warnings) {
+      configs += [ "//starboard/build/config:pedantic_warnings" ]
+    }
+
+    configs += [ "//$starboard_path/platform_configuration" ]
+    if (!has_pedantic_warnings) {
+      configs += [ "//starboard/build/config:no_pedantic_warnings" ]
+    }
+
+    sources = [ "//starboard/elf_loader/sandbox.cc" ]
+    configs += [ "//starboard/elf_loader:elf_loader_config" ]
+
+    deps = [
+      ":copy_loader_app_lib${original_target_name}",
+      "//cobalt/content/fonts:copy_font_data",
+      "//starboard:starboard_group",
+      "//starboard/elf_loader:constants",
+      "//starboard/elf_loader:elf_loader",
+      "//starboard/elf_loader:evergreen_info",
+      "//starboard/elf_loader:sabi_string",
+      "//starboard/loader_app:copy_crashpad_handler_named_as_so",
+      "//starboard/loader_app:copy_loader_app_content",
+    ]
+
+    if (!sb_is_evergreen_compatible) {
+      deps += [ "//third_party/crashpad/wrapper:wrapper_stub" ]
+    }
+  }
+  if (separate_install_targets_for_bundling) {
+    import("//starboard/build/config/bundle_content.gni")
+    bundle_content(
+        "copy_loader_app_lib${original_target_name}_bundle_content") {
+      forward_variables_from(invoker, [ "testonly" ])
+
+      bundle_name = "${original_target_name}_evergreen_loader"
+      bundle_deps = shared_data_deps
+    }
+  }
+  copy("copy_loader_app_lib${original_target_name}") {
+    install_content = true
+    if (target_cpu == "arm" && arm_float_abi == "softfp") {
+      sources = [ "$root_out_dir/../evergreen-$target_cpu-${arm_float_abi}_$build_type/lib${original_target_name}.so" ]
+    } else if (target_cpu == "arm64") {
+      sources = [ "$root_out_dir/../evergreen-$target_cpu_$build_type/install/lib/libcobalt.so" ]
+    }
+    outputs = [ "$sb_static_contents_output_data_dir/app/cobalt/lib/lib${original_target_name}.so" ]
+  }
+  install_target(original_target_name + "_evergreen_loader_install") {
+    forward_variables_from(invoker, [ "testonly" ])
+    installable_target_name = original_target_name + "_evergreen_loader"
+    type = "shared_library"
+    deps = []
+    if (defined(invoker.deps)) {
+      deps += invoker.deps
+    }
+    foreach(dep, shared_data_deps) {
+      deps += [ "${dep}_install_content" ]
+    }
+    if (separate_install_targets_for_bundling) {
+      deps += [ ":copy_loader_app_lib${original_target_name}_bundle_content" ]
+    }
+  }
+}
+
 template("executable") {
-  not_needed(invoker, [ "build_loader" ])
+  not_needed(invoker,
+             [
+               "build_loader",
+
+               # TODO(b/305091479): Investigate when this variable is unneeded
+               # so that we can refactor this to avoid the not_needed
+               # declaration.
+               "shared_library_target_name",
+             ])
 
   target_with_platform_configs(target_name) {
     target_type = "executable"
@@ -364,7 +455,16 @@
     }
 
     install_target(target_name + "_install") {
-      forward_variables_from(invoker, [ "testonly" ])
+      # "shared_library_target_name" is used when this executable install_target
+      # is invoked from within a shared_library target that is building a loader
+      # In this case, it allows the install_target to determine the inputs/deps
+      # for the corresponding shared_library install_target.
+      forward_variables_from(invoker,
+                             [
+                               "testonly",
+                               "shared_library_target_name",
+                             ])
+
       installable_target_name = executable_target_name
       installable_target_dep = ":$executable_target_name"
       not_needed([ "installable_target_dep" ])
@@ -422,9 +522,17 @@
     if (current_toolchain == starboard_toolchain) {
       executable("${actual_target_name}_loader") {
         output_name = "${actual_target_name}_loader"
-        forward_variables_from(invoker, [ "testonly" ])
+        forward_variables_from(invoker,
+                               [
+                                 "testonly",
+                                 "data_deps",
+                               ])
         sources = [ "//$starboard_path/starboard_loader.cc" ]
 
+        # Forwards the "shared_library_target_name" to allow this loader install
+        # target to depend the corresponding shared_library install_target outputs.
+        shared_library_target_name = actual_target_name
+
         if (defined(extra_platform_loader_sources)) {
           sources += extra_platform_loader_sources
         }
@@ -449,10 +557,10 @@
 
         deps = [
           ":$original_target_name($cobalt_toolchain)",
-          "//starboard:starboard_platform_group($starboard_toolchain)",
+          "//starboard($starboard_toolchain)",
         ]
         if (!separate_install_targets_for_bundling) {
-          deps += [ "//starboard:starboard_platform_group_install($starboard_toolchain)" ]
+          deps += [ "//starboard:starboard_install($starboard_toolchain)" ]
         }
       }
       if (!is_host_win) {
@@ -489,6 +597,13 @@
       }
     }
 
+    if (sb_is_evergreen_compatible && sb_evergreen_compatible_package &&
+        target_name != "loader_app") {
+      evergreen_loader(original_target_name + "_evergreen_loader") {
+        forward_variables_from(invoker, "*")
+      }
+    }
+
     install_target(target_name + "_install") {
       forward_variables_from(invoker, [ "testonly" ])
       installable_target_name = shared_library_target_name
diff --git a/starboard/build/config/base_configuration.gni b/starboard/build/config/base_configuration.gni
index 6c9d354..9284dc5 100644
--- a/starboard/build/config/base_configuration.gni
+++ b/starboard/build/config/base_configuration.gni
@@ -170,6 +170,11 @@
 
   # Enable WASM and install WebAssembly global.
   v8_enable_webassembly = false
+
+  # Set this to true if the modular toolchain linker doesn't strip
+  # all unused symbols and nplb fails to link.
+  # TODO: b/297808555 Remove this flag after nplb is fixed
+  sb_has_unused_symbol_issue = false
 }
 
 if (current_toolchain == starboard_toolchain &&
diff --git a/starboard/build/config/mac/BUILD.gn b/starboard/build/config/mac/BUILD.gn
index c968be7..c69eaf2 100644
--- a/starboard/build/config/mac/BUILD.gn
+++ b/starboard/build/config/mac/BUILD.gn
@@ -43,8 +43,8 @@
 
 config("common") {
   arflags = [ "-no_warning_for_no_symbols" ]
-  cflags_cc = [ "-std=gnu++14" ]
-  cflags_objcc = [ "-std=gnu++14" ]
+  cflags_cc = [ "-std=gnu++17" ]
+  cflags_objcc = [ "-std=gnu++17" ]
   cflags = [ "-fno-common" ]
   asmflags = [ "-fno-common" ]
   ldflags = [ "-fno-common" ]
diff --git a/starboard/build/config/starboard_target_type.gni b/starboard/build/config/starboard_target_type.gni
index c3c5916..5551828 100644
--- a/starboard/build/config/starboard_target_type.gni
+++ b/starboard/build/config/starboard_target_type.gni
@@ -12,8 +12,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import("//starboard/build/config/os_definitions.gni")
 declare_args() {
   starboard_target_type = ""
+  starboard_shared_library_extension = "so.${sb_api_version}"
 }
 
 if (starboard_target_type == "") {
@@ -37,6 +39,9 @@
     }
     if (target_type == "shared_library") {
       build_loader = false
+      if (!is_host_win) {
+        output_extension = starboard_shared_library_extension
+      }
     }
     public_deps = [
       "//starboard/client_porting/cwrappers",
diff --git a/starboard/build/config/win/BUILD.gn b/starboard/build/config/win/BUILD.gn
index b69e93c..847ddfd 100644
--- a/starboard/build/config/win/BUILD.gn
+++ b/starboard/build/config/win/BUILD.gn
@@ -47,7 +47,7 @@
   ]
   cflags += [
     "/EHsc",
-    "/std:c++14",
+    "/std:c++17",
   ]
 
   # msvs_debug/_devel/etc
diff --git a/starboard/build/doc/migrating_gyp_to_gn.md b/starboard/build/doc/migrating_gyp_to_gn.md
index 9f80b40..506ced4 100644
--- a/starboard/build/doc/migrating_gyp_to_gn.md
+++ b/starboard/build/doc/migrating_gyp_to_gn.md
@@ -201,7 +201,7 @@
 ### Validating a Target
 
 If you're migrating a single target, it's simple to check: just configure the
-build using the the necessary arguments then build that target with `ninja`,
+build using the necessary arguments then build that target with `ninja`,
 i.e.:
 
 ```
@@ -263,8 +263,8 @@
 process for converting the stub platform's GN files to GN files that will be
 able to be built for your platform.
 
-[cobalt_porting_guide]: https://cobalt.dev/starboard/porting.html
-[dev_setup_linux]: https://cobalt.dev/development/setup-linux.html
+[cobalt_porting_guide]: https://developers.google.com/youtube/cobalt/docs/starboard/porting
+[dev_setup_linux]: https://developers.google.com/youtube/cobalt/docs/development/setup-linux
 [gn_check_tool]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/reference.md#cmd_check
 [gn_doc_home]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs
 [gn_format_tool]: https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/docs/reference.md#cmd_format
diff --git a/starboard/build/doc/migration_changes.md b/starboard/build/doc/migration_changes.md
index c63a3bf..c58729a 100644
--- a/starboard/build/doc/migration_changes.md
+++ b/starboard/build/doc/migration_changes.md
@@ -42,7 +42,7 @@
 ## Notes:
 
 *   *Starboard Implementation:* If your platform defined
-    `STARBOARD_IMPLENTATION` in its implementation, you would now add the above
+    `STARBOARD_IMPLEMENTATION` in its implementation, you would now add the above
     config with `configs +=
     ["//starboard/build/config:starboard_implementation"]`.
 
diff --git a/starboard/build/install/install_target.gni b/starboard/build/install/install_target.gni
index 62f83e0..530d585 100644
--- a/starboard/build/install/install_target.gni
+++ b/starboard/build/install/install_target.gni
@@ -13,8 +13,11 @@
 # limitations under the License.
 
 import("//starboard/build/config/install.gni")
+import("//starboard/build/config/starboard_target_type.gni")
 
 template("install_target") {
+  not_needed(invoker, [ "shared_library_target_name" ])
+
   installable_target_name = invoker.installable_target_name
   installable_target_dep = invoker.installable_target_dep
 
@@ -23,7 +26,13 @@
     source_name = installable_target_name
   } else if (invoker.type == "shared_library") {
     install_subdir = "lib"
-    source_name = "lib${installable_target_name}.so"
+    if (installable_target_name == "starboard" ||
+        installable_target_name == "cast_starboard_api") {
+      source_name =
+          "lib${installable_target_name}.${starboard_shared_library_extension}"
+    } else {
+      source_name = "lib${installable_target_name}.so"
+    }
   } else {
     assert(false, "You can only install an executable or shared library.")
   }
diff --git a/starboard/build/platform_configuration.py b/starboard/build/platform_configuration.py
index af3fa2c..408f094 100644
--- a/starboard/build/platform_configuration.py
+++ b/starboard/build/platform_configuration.py
@@ -13,7 +13,8 @@
 # limitations under the License.
 """Base platform build configuration."""
 
-import imp  # pylint: disable=deprecated-module
+import importlib.machinery
+import importlib.util
 import inspect
 import logging
 import os
@@ -32,8 +33,14 @@
   if not os.path.isfile(application_configuration_path):
     return None
 
-  application_configuration = imp.load_source('application_configuration',
-                                              application_configuration_path)
+  loader = importlib.machinery.SourceFileLoader('application_configuration',
+                                                application_configuration_path)
+  spec = importlib.util.spec_from_file_location(
+      'application_configuration',
+      application_configuration_path,
+      loader=loader)
+  application_configuration = importlib.util.module_from_spec(spec)
+  loader.exec_module(application_configuration)
   for name, cls in inspect.getmembers(application_configuration):
     if not inspect.isclass(cls):
       continue
@@ -137,7 +144,12 @@
     module_path = os.path.abspath(
         os.path.join(self.GetLauncherPath(), 'launcher.py'))
     try:
-      return imp.load_source('launcher', module_path)
+      loader = importlib.machinery.SourceFileLoader('launcher', module_path)
+      spec = importlib.util.spec_from_file_location(
+          'launcher', module_path, loader=loader)
+      launcher = importlib.util.module_from_spec(spec)
+      loader.exec_module(launcher)
+      return launcher
     except (IOError, ImportError, RuntimeError) as error:
       logging.error('Unable to load launcher module from %s.', module_path)
       logging.error(error)
@@ -183,3 +195,11 @@
         'slot_management_test',
         'starboard_platform_tests',
     ]
+
+  def GetTestBlackBoxTargets(self):
+    """Gets all tests to be run in a black box test run.
+
+    Returns:
+      A list of strings of black box test target names.
+    """
+    return []
diff --git a/starboard/build/toolchain/cobalt_toolchains.gni b/starboard/build/toolchain/cobalt_toolchains.gni
index 4277164..bfe0b5f 100644
--- a/starboard/build/toolchain/cobalt_toolchains.gni
+++ b/starboard/build/toolchain/cobalt_toolchains.gni
@@ -17,13 +17,15 @@
 
 template("cobalt_clang_toolchain") {
   gcc_toolchain(target_name) {
-    forward_variables_from(invoker.variables,
+    forward_variables_from(invoker,
                            [
                              "native_linker_path",
                              "executable_extension",
                              "tail_lib_dependencies",
-                             "shlib_extension",
                            ])
+    if (defined(invoker.shlib_extension)) {
+      shlib_extension = invoker.shlib_extension
+    }
     assert(defined(native_linker_path),
            "native_linker_path has to be defined by the platform")
     if (!is_host_win) {
diff --git a/starboard/client_porting/cwrappers/BUILD.gn b/starboard/client_porting/cwrappers/BUILD.gn
index b73f43b..71d1d57 100644
--- a/starboard/client_porting/cwrappers/BUILD.gn
+++ b/starboard/client_porting/cwrappers/BUILD.gn
@@ -25,7 +25,7 @@
   ]
   public_deps = [
     ":cwrappers",
-    "//starboard",
+    "//starboard:starboard_group",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/starboard/client_porting/eztime/BUILD.gn b/starboard/client_porting/eztime/BUILD.gn
index 8f19135..061c62d 100644
--- a/starboard/client_porting/eztime/BUILD.gn
+++ b/starboard/client_porting/eztime/BUILD.gn
@@ -37,7 +37,7 @@
 
   deps = [
     ":eztime",
-    "//starboard",
+    "//starboard:starboard_group",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/starboard/client_porting/eztime/eztime.cc b/starboard/client_porting/eztime/eztime.cc
index 7638200..50a5cd5 100644
--- a/starboard/client_porting/eztime/eztime.cc
+++ b/starboard/client_porting/eztime/eztime.cc
@@ -37,7 +37,7 @@
 UChar g_timezones[kEzTimeZoneCount][kMaxTimeZoneSize];
 
 // Once control for initializing eztime static data.
-SbOnceControl g_initialization_once = SB_ONCE_INITIALIZER;
+SbOnceControl g_eztime_initialization_once = SB_ONCE_INITIALIZER;
 
 // The timezone names in ASCII (UTF8-compatible) literals. This must match the
 // order of the EzTimeZone enum.
@@ -66,7 +66,7 @@
 // Initializes ICU and TimeZones so the rest of the functions will work. Should
 // only be called once.
 void Initialize() {
-  SbIcuInit();
+  IcuInit();
 
   // Initialize |g_timezones| table.
   for (int timezone = 0; timezone < kEzTimeZoneCount; ++timezone) {
@@ -89,7 +89,7 @@
 // Gets the cached TimeZone ID from |g_timezones| for the given EzTimeZone
 // |timezone|.
 const UChar* GetTimeZoneId(EzTimeZone timezone) {
-  SbOnce(&g_initialization_once, &Initialize);
+  SbOnce(&g_eztime_initialization_once, &Initialize);
   const UChar* timezone_id = g_timezones[timezone];
   if (timezone_id[0] == 0) {
     return NULL;
diff --git a/starboard/client_porting/icu_init/icu_init.cc b/starboard/client_porting/icu_init/icu_init.cc
index 2867bc8..d10210f 100644
--- a/starboard/client_porting/icu_init/icu_init.cc
+++ b/starboard/client_porting/icu_init/icu_init.cc
@@ -54,6 +54,6 @@
 
 }  // namespace
 
-void SbIcuInit() {
+void IcuInit() {
   SbOnce(&g_initialization_once, &Initialize);
 }
diff --git a/starboard/client_porting/icu_init/icu_init.h b/starboard/client_porting/icu_init/icu_init.h
index 73a451b..40553a1 100644
--- a/starboard/client_porting/icu_init/icu_init.h
+++ b/starboard/client_porting/icu_init/icu_init.h
@@ -17,19 +17,11 @@
 
 #if defined(STARBOARD)
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 // Initializes ICU using a standard path based on the Starboard content path.
 // This function must be threadsafe and idempotent. Applications that wish to
-// initialize ICU differently may define their own SbIcuInit function rather
+// initialize ICU differently may define their own IcuInit function rather
 // than using the implementation here.
-void SbIcuInit();
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
+void IcuInit();
 
 #endif  // STARBOARD
 
diff --git a/starboard/client_porting/poem/BUILD.gn b/starboard/client_porting/poem/BUILD.gn
index eb23fef..80512c2 100644
--- a/starboard/client_porting/poem/BUILD.gn
+++ b/starboard/client_porting/poem/BUILD.gn
@@ -22,7 +22,7 @@
   ]
 
   deps = [
-    "//starboard",
+    "//starboard:starboard_group",
     "//testing/gtest",
   ]
 }
diff --git a/starboard/configuration_constants.h b/starboard/configuration_constants.h
index 916e03a..6355ca4 100644
--- a/starboard/configuration_constants.h
+++ b/starboard/configuration_constants.h
@@ -21,86 +21,87 @@
 #ifndef STARBOARD_CONFIGURATION_CONSTANTS_H_
 #define STARBOARD_CONFIGURATION_CONSTANTS_H_
 
+#include "starboard/export.h"
 #include "starboard/types.h"
 
 // Determines the threshold of allocation size that should be done with mmap
 // (if available), rather than allocated within the core heap.
-extern const size_t kSbDefaultMmapThreshold;
+SB_EXPORT extern const size_t kSbDefaultMmapThreshold;
 
 // The current platform's maximum length of the name of a single directory
 // entry, not including the absolute path.
-extern const int32_t kSbFileMaxName;
+SB_EXPORT extern const int32_t kSbFileMaxName;
 
 // The current platform's maximum number of files that can be opened at the
 // same time by one process.
-extern const uint32_t kSbFileMaxOpen;
+SB_EXPORT extern const uint32_t kSbFileMaxOpen;
 
 // The current platform's alternate file path component separator character.
 // This is like SB_FILE_SEP_CHAR, except if your platform supports an alternate
 // character, then you can place that here. For example, on windows machines,
 // the primary separator character is probably '\', but the alternate is '/'.
-extern const char kSbFileAltSepChar;
+SB_EXPORT extern const char kSbFileAltSepChar;
 
 // The string form of SB_FILE_ALT_SEP_CHAR.
-extern const char* kSbFileAltSepString;
+SB_EXPORT extern const char* kSbFileAltSepString;
 
 // The current platform's maximum length of an absolute path.
-extern const uint32_t kSbFileMaxPath;
+SB_EXPORT extern const uint32_t kSbFileMaxPath;
 
 // The current platform's file path component separator character. This is the
 // character that appears after a directory in a file path. For example, the
 // absolute canonical path of the file "/path/to/a/file.txt" uses '/' as a path
 // component separator character.
-extern const char kSbFileSepChar;
+SB_EXPORT extern const char kSbFileSepChar;
 
 // The string form of SB_FILE_SEP_CHAR.
-extern const char* kSbFileSepString;
+SB_EXPORT extern const char* kSbFileSepString;
 
 #if SB_API_VERSION < 15
 // Allow ac3 and ec3 support
-extern const bool kSbHasAc3Audio;
+SB_EXPORT extern const bool kSbHasAc3Audio;
 #endif
 
 // Specifies whether this platform has webm/vp9 support.  This should be set to
 // non-zero on platforms with webm/vp9 support.
-extern const bool kSbHasMediaWebmVp9Support;
+SB_EXPORT extern const bool kSbHasMediaWebmVp9Support;
 
 // Whether the current platform supports thread priorities.
-extern const bool kSbHasThreadPrioritySupport;
+SB_EXPORT extern const bool kSbHasThreadPrioritySupport;
 
 // Determines the alignment that allocations should have on this platform.
-extern const size_t kSbMallocAlignment;
+SB_EXPORT extern const size_t kSbMallocAlignment;
 
 // The maximum number of thread local storage keys supported by this platform.
 // This comes from _POSIX_THREAD_KEYS_MAX. The value of PTHREAD_KEYS_MAX is
 // higher, but unit tests show that the implementation doesn't support nearly
 // as many keys.
-extern const uint32_t kSbMaxThreadLocalKeys;
+SB_EXPORT extern const uint32_t kSbMaxThreadLocalKeys;
 
 // The maximum length of the name for a thread, including the NULL-terminator.
-extern const int32_t kSbMaxThreadNameLength;
+SB_EXPORT extern const int32_t kSbMaxThreadNameLength;
 
 // Defines the path where memory debugging logs should be written to.
-extern const char* kSbMemoryLogPath;
+SB_EXPORT extern const char* kSbMemoryLogPath;
 
 // The maximum audio bitrate the platform can decode.  The following value
 // equals to 5M bytes per seconds which is more than enough for compressed
 // audio.
-extern const uint32_t kSbMediaMaxAudioBitrateInBitsPerSecond;
+SB_EXPORT extern const uint32_t kSbMediaMaxAudioBitrateInBitsPerSecond;
 
 // The maximum video bitrate the platform can decode.  The following value
 // equals to 8M bytes per seconds which is more than enough for compressed
 // video.
-extern const uint32_t kSbMediaMaxVideoBitrateInBitsPerSecond;
+SB_EXPORT extern const uint32_t kSbMediaMaxVideoBitrateInBitsPerSecond;
 
 // Specifies how video frame buffers must be aligned on this platform.
-extern const uint32_t kSbMediaVideoFrameAlignment;
+SB_EXPORT extern const uint32_t kSbMediaVideoFrameAlignment;
 
 // The memory page size, which controls the size of chunks on memory that
 // allocators deal with, and the alignment of those chunks. This doesn't have to
 // be the hardware-defined physical page size, but it should be a multiple of
 // it.
-extern const size_t kSbMemoryPageSize;
+SB_EXPORT extern const size_t kSbMemoryPageSize;
 
 // Specifies the network receive buffer size in bytes, set via
 // SbSocketSetReceiveBufferSize().
@@ -114,17 +115,17 @@
 //
 // If your platform does not have a good TCP auto-tuning mechanism,
 // a setting of (128 * 1024) here is recommended.
-extern const uint32_t kSbNetworkReceiveBufferSize;
+SB_EXPORT extern const uint32_t kSbNetworkReceiveBufferSize;
 
 // Defines the maximum number of simultaneous threads for this platform. Some
 // platforms require sharing thread handles with other kinds of system handles,
 // like mutexes, so we want to keep this manageable.
-extern const uint32_t kSbMaxThreads;
+SB_EXPORT extern const uint32_t kSbMaxThreads;
 
 // Specifies the preferred byte order of color channels in a pixel. Refer to
 // starboard/configuration.h for the possible values. EGL/GLES platforms should
 // generally prefer a byte order of RGBA, regardless of endianness.
-extern const int kSbPreferredRgbaByteOrder;
+SB_EXPORT extern const int kSbPreferredRgbaByteOrder;
 
 // The current platform's search path component separator character. When
 // specifying an ordered list of absolute paths of directories to search for a
@@ -134,20 +135,23 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
-extern const char kSbPathSepChar;
+SB_EXPORT extern const char kSbPathSepChar;
 #ifdef __cplusplus
 }  // extern "C"
 #endif
 
 // The string form of SB_PATH_SEP_CHAR.
-extern const char* kSbPathSepString;
+SB_EXPORT extern const char* kSbPathSepString;
 
+#if SB_API_VERSION < 16
 // The maximum number of users that can be signed in at the same time.
 extern const uint32_t kSbUserMaxSignedIn;
+SB_EXPORT extern const uint32_t kSbUserMaxSignedIn;
+#endif  // SB_API_VERSION < 16
 
 #if SB_API_VERSION >= 14
 // The maximum size the cache directory is allowed to use in bytes.
-extern const uint32_t kSbMaxSystemPathCacheDirectorySize;
+SB_EXPORT extern const uint32_t kSbMaxSystemPathCacheDirectorySize;
 #endif
 
 #endif  // STARBOARD_CONFIGURATION_CONSTANTS_H_
diff --git a/starboard/contrib/cast/README.md b/starboard/contrib/cast/README.md
index 479ab3c..abfae7d 100644
--- a/starboard/contrib/cast/README.md
+++ b/starboard/contrib/cast/README.md
@@ -6,7 +6,7 @@
 ### Customizations
 
 As of Starboard 15, there are public methods required for Cast that are not
-already exposed by `libstarboard_platform_group.so`. As a result, the dedicated
+already exposed by `libstarboard.so`. As a result, the dedicated
 header `cast_starboard_api.h` is omitted from this release, though it may
 return in the future.
 
diff --git a/starboard/contrib/cast/cast_starboard_api/samples/BUILD.gn b/starboard/contrib/cast/cast_starboard_api/samples/BUILD.gn
index a26bfa4..bebd13a 100644
--- a/starboard/contrib/cast/cast_starboard_api/samples/BUILD.gn
+++ b/starboard/contrib/cast/cast_starboard_api/samples/BUILD.gn
@@ -1,5 +1,4 @@
 # Copyright 2023 The Cobalt Authors. All rights reserved.
-import("//starboard/build/config/starboard_target_type.gni")
 import("//starboard/contrib/cast/cast.gni")
 
 assert(build_with_separate_cobalt_toolchain && use_contrib_cast)
@@ -25,13 +24,14 @@
 }
 
 if (current_toolchain == starboard_toolchain) {
+  import("//starboard/build/config/starboard_target_type.gni")
   starboard_platform_target("cast_starboard_api") {
     extra_configs = [ ":default" ]
   }
 
   copy("cast_starboard_api_test_data") {
     install_content = true
-    sources = [ "$root_out_dir/libcast_starboard_api.so" ]
+    sources = [ "$root_out_dir/libcast_starboard_api.${starboard_shared_library_extension}" ]
 
     # This artifact is consumed by a test built outside of the
     # starboard_toolchain; move from `starboard/content/` to `content/`.
@@ -50,7 +50,7 @@
   ]
   data_deps = [ ":cast_starboard_api_test_data($starboard_toolchain)" ]
   deps = [
-    "//starboard",
+    "//starboard:starboard_group",
     "//starboard/nplb/testdata/file_tests:nplb_file_tests_data",
     "//testing/gtest",
   ]
diff --git a/starboard/decode_target.h b/starboard/decode_target.h
index abc2c13..a39d96d 100644
--- a/starboard/decode_target.h
+++ b/starboard/decode_target.h
@@ -46,7 +46,7 @@
 // SbDecodeTarget creation code needs to execute GLES commands like, for
 // example, glGenTextures().
 //
-// The primary usage is likely to be the the SbPlayer implementation on some
+// The primary usage is likely to be the SbPlayer implementation on some
 // platforms.
 //
 // # SbDecodeTarget Example
diff --git a/starboard/doc/evergreen/cobalt_evergreen_lite.md b/starboard/doc/evergreen/cobalt_evergreen_lite.md
index 06dacf9..ea75ec9 100644
--- a/starboard/doc/evergreen/cobalt_evergreen_lite.md
+++ b/starboard/doc/evergreen/cobalt_evergreen_lite.md
@@ -1,5 +1,4 @@
-Evergreen Lite Partner Doc
-
+# Evergreen Lite Partner Doc
 
 ## What is Cobalt Evergreen Lite?
 
diff --git a/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md b/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md
index bc254cf..d048ea1 100644
--- a/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md
+++ b/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md
@@ -2,9 +2,8 @@
 
 ## Requirements
 
-*   Raspberry Pi 2 (image configured per
-    [instructions](https://cobalt.dev/development/setup-raspi.html) on
-    cobalt.dev)
+*   Raspberry Pi environment setup per
+    [instructions](https://developers.google.com/youtube/cobalt/docs/development/setup-raspi).
 
 ## Build instructions
 
diff --git a/starboard/elf_loader/BUILD.gn b/starboard/elf_loader/BUILD.gn
index 184ccb2..b5bce40 100644
--- a/starboard/elf_loader/BUILD.gn
+++ b/starboard/elf_loader/BUILD.gn
@@ -56,7 +56,7 @@
     ":constants",
     ":evergreen_config",
     ":evergreen_info",
-    "//starboard",
+    "//starboard:starboard_group",
     "//starboard/common",
     "//third_party/lz4_lib:lz4",
   ]
@@ -78,7 +78,7 @@
       ":constants",
       ":evergreen_config",
       ":evergreen_info",
-      "//starboard",
+      "//starboard:starboard_group",
       "//starboard/common",
     ]
 
@@ -112,12 +112,15 @@
       ":evergreen_info",
       ":sabi_string",
       "//cobalt/content/fonts:copy_font_data",
-      "//starboard",
+      "//starboard:starboard_group",
     ]
 
     if (!sb_is_evergreen_compatible) {
       deps += [ "//third_party/crashpad/wrapper:wrapper_stub" ]
     }
+    if (sb_is_evergreen_compatible && sb_evergreen_compatible_package) {
+      deps += [ "//starboard/loader_app:copy_crashpad_handler_named_as_so" ]
+    }
   }
 }
 
@@ -146,7 +149,7 @@
       ":elf_loader_sys",
       ":evergreen_info",
       ":sabi_string",
-      "//starboard",
+      "//starboard:starboard_group",
     ]
 
     if (!sb_is_evergreen_compatible) {
@@ -161,7 +164,7 @@
     testonly = true
     sources = [ "//starboard/common/test_main.cc" ]
     deps = [
-      "//starboard",
+      "//starboard:starboard_group",
       "//testing/gmock",
       "//testing/gtest",
     ]
diff --git a/starboard/evergreen/shared/gyp_configuration.py b/starboard/evergreen/shared/gyp_configuration.py
index c5f355c..5b8441d 100644
--- a/starboard/evergreen/shared/gyp_configuration.py
+++ b/starboard/evergreen/shared/gyp_configuration.py
@@ -42,3 +42,7 @@
       'elf_loader_test',
       'installation_manager_test',
   ]
+
+  def GetTestBlackBoxTargets(self):
+    tests = super().GetTestBlackBoxTargets()
+    return [test for test in tests if test not in self.__FORBIDDEN_TESTS]
diff --git a/starboard/examples/glclear/BUILD.gn b/starboard/examples/glclear/BUILD.gn
index 60c6d62..7a7e49a 100644
--- a/starboard/examples/glclear/BUILD.gn
+++ b/starboard/examples/glclear/BUILD.gn
@@ -14,5 +14,5 @@
 
 target(final_executable_type, "starboard_glclear_example") {
   sources = [ "main.cc" ]
-  deps = [ "//starboard" ]
+  deps = [ "//starboard:starboard_group" ]
 }
diff --git a/starboard/examples/hello_world/BUILD.gn b/starboard/examples/hello_world/BUILD.gn
index 36642f6..d6560ce 100644
--- a/starboard/examples/hello_world/BUILD.gn
+++ b/starboard/examples/hello_world/BUILD.gn
@@ -13,6 +13,6 @@
 # limitations under the License.
 
 target(final_executable_type, "starboard_hello_world_example") {
-  deps = [ "//starboard" ]
+  deps = [ "//starboard:starboard_group" ]
   sources = [ "main.cc" ]
 }
diff --git a/starboard/examples/window/BUILD.gn b/starboard/examples/window/BUILD.gn
index 93c3aae..1d31d6a 100644
--- a/starboard/examples/window/BUILD.gn
+++ b/starboard/examples/window/BUILD.gn
@@ -16,6 +16,6 @@
   testonly = true
 
   sources = [ "main.cc" ]
-  public_deps = [ "//starboard" ]
+  public_deps = [ "//starboard:starboard_group" ]
   data_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/starboard/extension/BUILD.gn b/starboard/extension/BUILD.gn
index 57b95b1..47197ab 100644
--- a/starboard/extension/BUILD.gn
+++ b/starboard/extension/BUILD.gn
@@ -22,7 +22,7 @@
   deps = [
     "//cobalt/base",
     "//cobalt/test:run_all_unittests",
-    "//starboard",
+    "//starboard:starboard_group",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/starboard/extension/extension_test.cc b/starboard/extension/extension_test.cc
index 874cce1..7bbce73 100644
--- a/starboard/extension/extension_test.cc
+++ b/starboard/extension/extension_test.cc
@@ -21,6 +21,7 @@
 #include "starboard/extension/font.h"
 #include "starboard/extension/free_space.h"
 #include "starboard/extension/graphics.h"
+#include "starboard/extension/h5vcc_config.h"
 #include "starboard/extension/ifa.h"
 #include "starboard/extension/installation_manager.h"
 #include "starboard/extension/javascript_cache.h"
@@ -28,6 +29,7 @@
 #include "starboard/extension/memory_mapped_file.h"
 #include "starboard/extension/platform_info.h"
 #include "starboard/extension/platform_service.h"
+#include "starboard/extension/player_set_max_video_input_size.h"
 #include "starboard/extension/time_zone.h"
 #include "starboard/extension/updater_notification.h"
 #include "starboard/extension/url_fetcher_observer.h"
@@ -481,5 +483,46 @@
       << "Extension struct should be a singleton";
 }
 
+TEST(ExtensionTest, PlayerSetMaxVideoInputSize) {
+  typedef StarboardExtensionPlayerSetMaxVideoInputSizeApi ExtensionApi;
+  const char* kExtensionName =
+      kStarboardExtensionPlayerSetMaxVideoInputSizeName;
+
+  const ExtensionApi* extension_api =
+      static_cast<const ExtensionApi*>(SbSystemGetExtension(kExtensionName));
+  if (!extension_api) {
+    return;
+  }
+
+  EXPECT_STREQ(extension_api->name, kExtensionName);
+  EXPECT_EQ(extension_api->version, 1u);
+  EXPECT_NE(extension_api->SetMaxVideoInputSizeForCurrentThread, nullptr);
+
+  const ExtensionApi* second_extension_api =
+      static_cast<const ExtensionApi*>(SbSystemGetExtension(kExtensionName));
+  EXPECT_EQ(second_extension_api, extension_api)
+      << "Extension struct should be a singleton";
+}
+
+TEST(ExtensionTest, H5vccConfig) {
+  typedef StarboardExtensionH5vccConfigApi ExtensionApi;
+  const char* kExtensionName = kStarboardExtensionH5vccConfigName;
+
+  const ExtensionApi* extension_api =
+      static_cast<const ExtensionApi*>(SbSystemGetExtension(kExtensionName));
+  if (!extension_api) {
+    return;
+  }
+
+  EXPECT_STREQ(extension_api->name, kExtensionName);
+  EXPECT_EQ(extension_api->version, 1u);
+  EXPECT_NE(extension_api->EnableBackgroundPlayback, nullptr);
+
+  const ExtensionApi* second_extension_api =
+      static_cast<const ExtensionApi*>(SbSystemGetExtension(kExtensionName));
+  EXPECT_EQ(second_extension_api, extension_api)
+      << "Extension struct should be a singleton";
+}
+
 }  // namespace extension
 }  // namespace starboard
diff --git a/starboard/extension/h5vcc_config.h b/starboard/extension/h5vcc_config.h
new file mode 100644
index 0000000..a88a2f3
--- /dev/null
+++ b/starboard/extension/h5vcc_config.h
@@ -0,0 +1,43 @@
+// Copyright 2024 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_EXTENSION_H5VCC_CONFIG_H_
+#define STARBOARD_EXTENSION_H5VCC_CONFIG_H_
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define kStarboardExtensionH5vccConfigName "dev.starboard.extension.H5vccConfig"
+
+typedef struct StarboardExtensionH5vccConfigApi {
+  // Name should be the string |kStarboardExtensionH5vccConfigName|.
+  // This helps to validate that the extension API is correct.
+  const char* name;
+
+  // This specifies the version of the API that is implemented.
+  uint32_t version;
+
+  // This API enable the Cobalt background playback mode.
+  void (*EnableBackgroundPlayback)(bool value);
+
+} StarboardExtensionH5vccConfigApi;
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+#endif  // STARBOARD_EXTENSION_H5VCC_CONFIG_H_
diff --git a/starboard/extension/player_set_max_video_input_size.h b/starboard/extension/player_set_max_video_input_size.h
new file mode 100644
index 0000000..3a9cb13
--- /dev/null
+++ b/starboard/extension/player_set_max_video_input_size.h
@@ -0,0 +1,51 @@
+// Copyright 2024 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_EXTENSION_PLAYER_SET_MAX_VIDEO_INPUT_SIZE_H_
+#define STARBOARD_EXTENSION_PLAYER_SET_MAX_VIDEO_INPUT_SIZE_H_
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define kStarboardExtensionPlayerSetMaxVideoInputSizeName \
+  "dev.starboard.extension.PlayerSetMaxVideoInputSize"
+
+typedef struct StarboardExtensionPlayerSetMaxVideoInputSizeApi {
+  // Name should be the string
+  // |kStarboardExtensionPlayerSetMaxVideoInputSizeName|. This helps to validate
+  // that the extension API is correct.
+  const char* name;
+
+  // This specifies the version of the API that is implemented.
+  uint32_t version;
+
+  // The fields below this point were added in version 1 or later.
+
+  // 1. This is utilized to establish the maximum video input size
+  //    for any subsequently created SbPlayer on the current calling thread.
+  // 2. The maximum video input dimensions serve as a suggestion; the
+  //    implementation is not obligated to adhere to it, and there is no
+  //    feedback provided.
+  // 3. Set it to 0 disable the setting.
+  void (*SetMaxVideoInputSizeForCurrentThread)(int max_video_input_size);
+} StarboardExtensionPlayerSetMaxVideoInputSizeApi;
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+#endif  // STARBOARD_EXTENSION_PLAYER_SET_MAX_VIDEO_INPUT_SIZE_H_
diff --git a/starboard/linux/shared/cobalt/configuration.py b/starboard/linux/shared/cobalt/configuration.py
index 6deb19f..b66816c 100644
--- a/starboard/linux/shared/cobalt/configuration.py
+++ b/starboard/linux/shared/cobalt/configuration.py
@@ -63,11 +63,19 @@
     ],
 }
 
-# Tracked by b/294070803
 if os.getenv('MODULAR_BUILD', '0') == '1':
+  # Tracked by b/294070803
   _FILTERED_TESTS['layout_tests'] = [
       'CobaltSpecificLayoutTests/Layout.Test/platform_object_user_properties_survive_gc',  # pylint: disable=line-too-long
   ]
+  # TODO: b/303260272 Re-enable these tests.
+  _FILTERED_TESTS['blackbox'] = [
+      'cancel_sync_loads_when_suspended',
+      'preload_font',
+      'preload_launch_parameter',
+      'preload_visibility',
+      'suspend_visibility',
+  ]
 
 
 class CobaltLinuxConfiguration(cobalt_configuration.CobaltConfiguration):
diff --git a/starboard/linux/shared/platform_configuration/BUILD.gn b/starboard/linux/shared/platform_configuration/BUILD.gn
index 4e7334a..6a06cc6 100644
--- a/starboard/linux/shared/platform_configuration/BUILD.gn
+++ b/starboard/linux/shared/platform_configuration/BUILD.gn
@@ -62,14 +62,10 @@
 
       # Do not warn about unused function params.
       "-Wno-unused-parameter",
-    ]
-    if (sb_is_modular && !sb_is_evergreen) {
-      # If we're building with cobalt toolchain and native linker, we need visibility.
-      cflags += [ "-fvisibility=default" ]
-    } else {
+
       # Default visibility to hidden, to enable dead stripping.
-      cflags += [ "-fvisibility=hidden" ]
-    }
+      "-fvisibility=hidden",
+    ]
 
     if (is_gold) {
       cflags += [
diff --git a/starboard/linux/x64x11/clang/3.9/BUILD.gn b/starboard/linux/x64x11/clang/3.9/BUILD.gn
index f947b50..a70887a 100644
--- a/starboard/linux/x64x11/clang/3.9/BUILD.gn
+++ b/starboard/linux/x64x11/clang/3.9/BUILD.gn
@@ -27,3 +27,9 @@
 
   configs += [ "//starboard/build/config:starboard_implementation" ]
 }
+
+if (build_with_separate_cobalt_toolchain) {
+  group("starboard_platform_with_main") {
+    deps = [ "//starboard/linux/x64x11:starboard_platform_with_main" ]
+  }
+}
diff --git a/starboard/linux/x64x11/clang/3.9/args.gn b/starboard/linux/x64x11/clang/3.9/args.gn
index 7473f4a..490cee2 100644
--- a/starboard/linux/x64x11/clang/3.9/args.gn
+++ b/starboard/linux/x64x11/clang/3.9/args.gn
@@ -16,3 +16,4 @@
 target_os = "linux"
 target_cpu = "x64"
 using_old_compiler = true
+build_with_separate_cobalt_toolchain = true
diff --git a/starboard/linux/x64x11/clang/3.9/platform_configuration/BUILD.gn b/starboard/linux/x64x11/clang/3.9/platform_configuration/BUILD.gn
index ef3052c..b2037fd 100644
--- a/starboard/linux/x64x11/clang/3.9/platform_configuration/BUILD.gn
+++ b/starboard/linux/x64x11/clang/3.9/platform_configuration/BUILD.gn
@@ -16,9 +16,12 @@
   cflags = []
   cflags_c = []
   cflags_cc = []
-  ldflags = []
   defines = []
 
+  ldflags = [
+    # Cleanup unused sections
+    "-Wl,-gc-sections",
+  ]
   cflags += [
     "-Werror",
     "-fcolor-diagnostics",
@@ -180,10 +183,15 @@
 }
 
 config("platform_configuration") {
-  configs = [
-    "//starboard/linux/shared/platform_configuration",
-    "//starboard/linux/x64x11/shared/platform_configuration:libraries",
-    "//starboard/build/config/sabi",
-    ":compiler_flags",
-  ]
+  if (current_toolchain == default_toolchain &&
+      build_with_separate_cobalt_toolchain) {
+    configs = [ "//starboard/evergreen/x64/platform_configuration" ]
+  } else {
+    configs = [
+      "//starboard/linux/shared/platform_configuration",
+      "//starboard/linux/x64x11/shared/platform_configuration:libraries",
+      "//starboard/build/config/sabi",
+      ":compiler_flags",
+    ]
+  }
 }
diff --git a/starboard/linux/x64x11/clang/3.9/platform_configuration/configuration.gni b/starboard/linux/x64x11/clang/3.9/platform_configuration/configuration.gni
index a0ffcd5..08b17b6 100644
--- a/starboard/linux/x64x11/clang/3.9/platform_configuration/configuration.gni
+++ b/starboard/linux/x64x11/clang/3.9/platform_configuration/configuration.gni
@@ -12,38 +12,46 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import("//starboard/build/config/base_configuration.gni")
+if (current_toolchain == default_toolchain &&
+    build_with_separate_cobalt_toolchain) {
+  import("//starboard/evergreen/x64/platform_configuration/configuration.gni")
+  platform_tests_path =
+      "//starboard/linux/shared:starboard_platform_tests($starboard_toolchain)"
+  cobalt_font_package = "standard"
 
-nasm_exists = true
+  sb_has_unused_symbol_issue = true
+} else {
+  import("//starboard/build/config/base_configuration.gni")
 
-sb_static_contents_output_data_dir = "$root_out_dir/content"
+  nasm_exists = true
 
-sb_enable_benchmark = true
+  sb_static_contents_output_data_dir = "$root_out_dir/content"
 
-install_target_path = "//starboard/build/install/install_target.gni"
+  sb_enable_benchmark = true
 
-sb_enable_opus_sse = false
+  install_target_path = "//starboard/build/install/install_target.gni"
 
-speed_config_path = "//starboard/linux/shared/platform_configuration:speed"
-size_config_path = "//starboard/linux/shared/platform_configuration:size"
+  sb_enable_opus_sse = false
 
-pedantic_warnings_config_path =
-    "//starboard/linux/shared/platform_configuration:pedantic_warnings"
-no_pedantic_warnings_config_path = "//starboard/linux/x64x11/clang/3.9/platform_configuration:no_pedantic_warnings"
+  speed_config_path = "//starboard/linux/shared/platform_configuration:speed"
+  size_config_path = "//starboard/linux/shared/platform_configuration:size"
 
-sb_widevine_platform = "linux"
+  pedantic_warnings_config_path =
+      "//starboard/linux/shared/platform_configuration:pedantic_warnings"
+  no_pedantic_warnings_config_path = "//starboard/linux/x64x11/clang/3.9/platform_configuration:no_pedantic_warnings"
 
-platform_tests_path = "//starboard/linux/shared:starboard_platform_tests"
+  sb_widevine_platform = "linux"
 
-enable_in_app_dial = true
+  platform_tests_path = "//starboard/linux/shared:starboard_platform_tests"
 
-sabi_path = "//starboard/sabi/x64/sysv/sabi-v$sb_api_version.json"
+  enable_in_app_dial = true
 
-gl_type = "angle"
-sb_angle_enable_gl = true
+  sabi_path = "//starboard/sabi/x64/sysv/sabi-v$sb_api_version.json"
 
-cobalt_v8_emit_builtins_as_inline_asm = true
+  gl_type = "angle"
+  sb_angle_enable_gl = true
 
-sb_enable_cpp17_audit = false
+  cobalt_v8_emit_builtins_as_inline_asm = true
 
-v8_enable_webassembly = false
+  v8_enable_webassembly = false
+}
diff --git a/starboard/linux/x64x11/clang/3.9/starboard_loader.cc b/starboard/linux/x64x11/clang/3.9/starboard_loader.cc
new file mode 100644
index 0000000..065bfaa
--- /dev/null
+++ b/starboard/linux/x64x11/clang/3.9/starboard_loader.cc
@@ -0,0 +1,19 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/event.h"
+
+int main(int argc, char** argv) {
+  return SbRunStarboardMain(argc, argv, SbEventHandle);
+}
diff --git a/starboard/linux/x64x11/clang/3.9/toolchain/BUILD.gn b/starboard/linux/x64x11/clang/3.9/toolchain/BUILD.gn
index 79cd0f0..c306880 100644
--- a/starboard/linux/x64x11/clang/3.9/toolchain/BUILD.gn
+++ b/starboard/linux/x64x11/clang/3.9/toolchain/BUILD.gn
@@ -13,10 +13,16 @@
 # limitations under the License.
 
 import("//build/config/clang/clang.gni")
+import("//build/toolchain/gcc_toolchain.gni")
+import("//starboard/build/toolchain/cobalt_toolchains.gni")
 import("//starboard/shared/toolchain/overridable_gcc_toolchain.gni")
 
 _target_llvm_3_9_bin_dir = "/usr/lib/llvm-3.9/bin"
 
+cobalt_clang_toolchain("cobalt") {
+  native_linker_path = "${_target_llvm_3_9_bin_dir}/clang++"
+}
+
 overridable_gcc_toolchain("target") {
   cc = "${_target_llvm_3_9_bin_dir}/clang"
   cxx = "${_target_llvm_3_9_bin_dir}/clang++"
@@ -27,3 +33,14 @@
     is_clang = true
   }
 }
+
+overridable_gcc_toolchain("starboard") {
+  cc = "${_target_llvm_3_9_bin_dir}/clang"
+  cxx = "${_target_llvm_3_9_bin_dir}/clang++"
+  ld = cxx
+  ar = "ar"
+
+  toolchain_args = {
+    is_clang = true
+  }
+}
diff --git a/starboard/linux/x64x11/gcc/6.3/BUILD.gn b/starboard/linux/x64x11/gcc/6.3/BUILD.gn
index f947b50..a70887a 100644
--- a/starboard/linux/x64x11/gcc/6.3/BUILD.gn
+++ b/starboard/linux/x64x11/gcc/6.3/BUILD.gn
@@ -27,3 +27,9 @@
 
   configs += [ "//starboard/build/config:starboard_implementation" ]
 }
+
+if (build_with_separate_cobalt_toolchain) {
+  group("starboard_platform_with_main") {
+    deps = [ "//starboard/linux/x64x11:starboard_platform_with_main" ]
+  }
+}
diff --git a/starboard/linux/x64x11/gcc/6.3/args.gn b/starboard/linux/x64x11/gcc/6.3/args.gn
index 879e5db..f42d308 100644
--- a/starboard/linux/x64x11/gcc/6.3/args.gn
+++ b/starboard/linux/x64x11/gcc/6.3/args.gn
@@ -15,5 +15,5 @@
 target_platform = "linux-x64x11-gcc-6-3"
 target_os = "linux"
 target_cpu = "x64"
-is_clang = false
 using_old_compiler = true
+build_with_separate_cobalt_toolchain = true
diff --git a/starboard/linux/x64x11/gcc/6.3/cobalt/configuration.py b/starboard/linux/x64x11/gcc/6.3/cobalt/configuration.py
index 8300298..7b5a759 100644
--- a/starboard/linux/x64x11/gcc/6.3/cobalt/configuration.py
+++ b/starboard/linux/x64x11/gcc/6.3/cobalt/configuration.py
@@ -13,6 +13,8 @@
 # limitations under the License.
 """Starboard Linux x64x11 GCC 6.3 Cobalt configuration."""
 
+import os
+
 from starboard.linux.shared.cobalt import configuration as shared_configuration
 from starboard.tools.testing import test_filter
 
@@ -33,3 +35,8 @@
           'ZipReaderTest.ExtractToFileAsync_RegularFile',
       ],
   }
+  if os.getenv('MODULAR_BUILD', '0') == '1':
+    # TODO: b/303845477 Re-enable.
+    __FILTERED_TESTS['blackbox'] = [
+        'wasm_basic_test',
+    ]
diff --git a/starboard/linux/x64x11/gcc/6.3/platform_configuration/BUILD.gn b/starboard/linux/x64x11/gcc/6.3/platform_configuration/BUILD.gn
index 0ba189c..1be472a 100644
--- a/starboard/linux/x64x11/gcc/6.3/platform_configuration/BUILD.gn
+++ b/starboard/linux/x64x11/gcc/6.3/platform_configuration/BUILD.gn
@@ -16,7 +16,11 @@
   cflags = []
   cflags_c = []
   cflags_cc = []
-  ldflags = []
+
+  ldflags = [
+    # Cleanup unused sections
+    "-Wl,-gc-sections",
+  ]
 
   # from common_compiler_flags
   cflags += [
@@ -99,10 +103,15 @@
 }
 
 config("platform_configuration") {
-  configs = [
-    "//starboard/linux/shared/platform_configuration",
-    "//starboard/linux/x64x11/shared/platform_configuration:libraries",
-    "//starboard/build/config/sabi",
-    ":compiler_flags",
-  ]
+  if (current_toolchain == default_toolchain &&
+      build_with_separate_cobalt_toolchain) {
+    configs = [ "//starboard/evergreen/x64/platform_configuration" ]
+  } else {
+    configs = [
+      "//starboard/linux/shared/platform_configuration",
+      "//starboard/linux/x64x11/shared/platform_configuration:libraries",
+      "//starboard/build/config/sabi",
+      ":compiler_flags",
+    ]
+  }
 }
diff --git a/starboard/linux/x64x11/gcc/6.3/platform_configuration/configuration.gni b/starboard/linux/x64x11/gcc/6.3/platform_configuration/configuration.gni
index ddb3a33..46daa23 100644
--- a/starboard/linux/x64x11/gcc/6.3/platform_configuration/configuration.gni
+++ b/starboard/linux/x64x11/gcc/6.3/platform_configuration/configuration.gni
@@ -12,10 +12,17 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import("//starboard/linux/shared/platform_configuration/configuration.gni")
+if (current_toolchain == default_toolchain &&
+    build_with_separate_cobalt_toolchain) {
+  import("//starboard/evergreen/x64/platform_configuration/configuration.gni")
+  platform_tests_path =
+      "//starboard/linux/shared:starboard_platform_tests($starboard_toolchain)"
+  cobalt_font_package = "standard"
+  sb_has_unused_symbol_issue = true
+} else {
+  import("//starboard/linux/shared/platform_configuration/configuration.gni")
 
-sabi_path = "//starboard/sabi/x64/sysv/sabi-v$sb_api_version.json"
-gl_type = "angle"
-sb_angle_enable_gl = true
-
-sb_enable_cpp17_audit = false
+  sabi_path = "//starboard/sabi/x64/sysv/sabi-v$sb_api_version.json"
+  gl_type = "angle"
+  sb_angle_enable_gl = true
+}
diff --git a/starboard/linux/x64x11/gcc/6.3/starboard_loader.cc b/starboard/linux/x64x11/gcc/6.3/starboard_loader.cc
new file mode 100644
index 0000000..7f23deb
--- /dev/null
+++ b/starboard/linux/x64x11/gcc/6.3/starboard_loader.cc
@@ -0,0 +1,21 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <stdio.h>
+#include "starboard/event.h"
+
+int main(int argc, char** argv) {
+  printf("starboard_loader: SbRunStarboardMain\n");
+  return SbRunStarboardMain(argc, argv, SbEventHandle);
+}
diff --git a/starboard/linux/x64x11/gcc/6.3/toolchain/BUILD.gn b/starboard/linux/x64x11/gcc/6.3/toolchain/BUILD.gn
index c962435..b421195 100644
--- a/starboard/linux/x64x11/gcc/6.3/toolchain/BUILD.gn
+++ b/starboard/linux/x64x11/gcc/6.3/toolchain/BUILD.gn
@@ -12,17 +12,21 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import("//build/toolchain/gcc_toolchain.gni")
+import("//starboard/build/toolchain/cobalt_toolchains.gni")
 import("//starboard/shared/toolchain/overridable_gcc_toolchain.gni")
 
 # Directory for GCC 6.3 if it is installed as a system dependency.
 _default_gcc_6_3_bin_dir = "/usr/bin"
 
-overridable_gcc_toolchain("target") {
+cobalt_clang_toolchain("cobalt") {
+  native_linker_path = "${_default_gcc_6_3_bin_dir}/clang++"
+}
+
+overridable_gcc_toolchain("starboard") {
   cc = "${_default_gcc_6_3_bin_dir}/gcc-6"
   cxx = "${_default_gcc_6_3_bin_dir}/g++-6"
   ld = cxx
-
-  # We use whatever 'ar' resolves to.
   ar = "ar"
 
   toolchain_args = {
diff --git a/starboard/linux/x64x11/toolchain/BUILD.gn b/starboard/linux/x64x11/toolchain/BUILD.gn
index 79b7991..9d6fd32 100644
--- a/starboard/linux/x64x11/toolchain/BUILD.gn
+++ b/starboard/linux/x64x11/toolchain/BUILD.gn
@@ -21,9 +21,7 @@
 }
 
 cobalt_clang_toolchain("cobalt") {
-  variables = {
-    native_linker_path = "$clang_base_path/bin/clang++"
-  }
+  native_linker_path = "$clang_base_path/bin/clang++"
 }
 
 overridable_clang_toolchain("target") {
diff --git a/starboard/loader_app/BUILD.gn b/starboard/loader_app/BUILD.gn
index 053c0c2..da5eaee 100644
--- a/starboard/loader_app/BUILD.gn
+++ b/starboard/loader_app/BUILD.gn
@@ -29,7 +29,7 @@
     ":memory_tracker_thread",
     ":reset_evergreen_update",
     ":slot_management",
-    "//starboard",
+    "//starboard:starboard_group",
     "//starboard/elf_loader:constants",
     "//starboard/elf_loader:evergreen_info",
     "//starboard/elf_loader:sabi_string",
@@ -54,18 +54,6 @@
     }
     outputs = [ "$sb_static_contents_output_data_dir/app/cobalt/content" ]
   }
-  copy("copy_loader_app_lib") {
-    install_content = true
-    if (target_cpu == "arm" && arm_float_abi == "softfp") {
-      sources = [ "$root_out_dir/../evergreen-$target_cpu-${arm_float_abi}_$build_type/install/lib/libcobalt.so" ]
-    } else if (target_cpu == "arm64") {
-      sources = [ "$root_out_dir/../evergreen-$target_cpu_$build_type/install/lib/libcobalt.so" ]
-    } else {
-      sources = []
-    }
-    outputs =
-        [ "$sb_static_contents_output_data_dir/app/cobalt/lib/libcobalt.so" ]
-  }
   copy("copy_loader_app_manifest") {
     install_content = true
     if (target_cpu == "arm" && arm_float_abi == "softfp") {
@@ -115,14 +103,14 @@
         data_deps += [
           ":copy_crashpad_handler_named_as_so",
           ":copy_loader_app_content",
-          ":copy_loader_app_lib",
           ":copy_loader_app_manifest",
+          "//cobalt/browser:copy_loader_app_libcobalt",
         ]
         deps += [
           ":copy_crashpad_handler_named_as_so",
           ":copy_loader_app_content",
-          ":copy_loader_app_lib",
           ":copy_loader_app_manifest",
+          "//cobalt/browser:copy_loader_app_libcobalt",
         ]
       }
     }
@@ -158,7 +146,7 @@
     "app_key_files.cc",
     "app_key_files.h",
   ]
-  deps = [ "//starboard" ]
+  deps = [ "//starboard:starboard_group" ]
 }
 
 target(gtest_target_type, "app_key_files_test") {
@@ -182,7 +170,7 @@
     "app_key_internal.h",
   ]
   deps = [
-    "//starboard",
+    "//starboard:starboard_group",
     "//third_party/modp_b64",
   ]
 }
@@ -245,7 +233,7 @@
   deps = [
     ":installation_store_proto",
     ":pending_restart",
-    "//starboard",
+    "//starboard:starboard_group",
   ]
 }
 
@@ -277,7 +265,7 @@
     ":app_key_files",
     ":drain_file",
     ":installation_manager",
-    "//starboard",
+    "//starboard:starboard_group",
     "//starboard/elf_loader",
     "//starboard/elf_loader:constants",
     "//starboard/elf_loader:sabi_string",
@@ -337,7 +325,7 @@
     "reset_evergreen_update.cc",
     "reset_evergreen_update.h",
   ]
-  deps = [ "//starboard" ]
+  deps = [ "//starboard:starboard_group" ]
 }
 
 # TODO: b/309493306 - Stop building evergreen targets for all non-evergreen platforms.
diff --git a/starboard/loader_app/drain_file.cc b/starboard/loader_app/drain_file.cc
index c84d7ac..dc0b9df 100644
--- a/starboard/loader_app/drain_file.cc
+++ b/starboard/loader_app/drain_file.cc
@@ -98,7 +98,8 @@
 
   std::vector<std::string> filenames = FindAllWithPrefix(dir, kDrainFilePrefix);
 
-  std::remove_if(filenames.begin(), filenames.end(), IsExpired);
+  filenames.erase(std::remove_if(filenames.begin(), filenames.end(), IsExpired),
+                  filenames.end());
 
   if (filenames.empty())
     return;
diff --git a/starboard/loader_app/drain_file_test.cc b/starboard/loader_app/drain_file_test.cc
index bf0863c..8265829 100644
--- a/starboard/loader_app/drain_file_test.cc
+++ b/starboard/loader_app/drain_file_test.cc
@@ -19,6 +19,7 @@
 
 #include "starboard/common/file.h"
 #include "starboard/common/log.h"
+#include "starboard/common/string.h"
 #include "starboard/configuration_constants.h"
 #include "starboard/directory.h"
 #include "starboard/loader_app/drain_file_helper.h"
@@ -40,6 +41,11 @@
     temp_dir_.resize(kSbFileMaxPath);
     ASSERT_TRUE(SbSystemGetPath(kSbSystemPathTempDirectory, temp_dir_.data(),
                                 temp_dir_.size()));
+
+    // Use dedicated dir for testing to avoid meddling with other files.
+    starboard::strlcat(temp_dir_.data(), kSbFileSepString, kSbFileMaxPath);
+    starboard::strlcat(temp_dir_.data(), "df", kSbFileMaxPath);
+    ASSERT_TRUE(SbDirectoryCreate(temp_dir_.data()));
   }
 
   void TearDown() override { DrainFileClearForApp(GetTempDir(), ""); }
@@ -168,6 +174,29 @@
   EXPECT_TRUE(SbFileDelete(later_and_greatest.path().c_str()));
 }
 
+// Ranking drain files should ignore expired files.
+TEST_F(DrainFileTest, SunnyDayRankCorrectlyIgnoresExpired) {
+  const SbTime timestamp = SbTimeGetNow();
+
+  ScopedDrainFile early_and_expired(GetTempDir(), "a",
+                                    timestamp - kDrainFileMaximumAge);
+  ScopedDrainFile later_and_least(GetTempDir(), "c", timestamp);
+  ScopedDrainFile later_and_greatest(GetTempDir(), "b",
+                                     timestamp + kDrainFileAgeUnit);
+
+  std::vector<char> result(kSbFileMaxName);
+
+  EXPECT_TRUE(DrainFileRankAndCheck(GetTempDir(), "c"));
+  EXPECT_TRUE(SbFileDelete(later_and_least.path().c_str()));
+
+  EXPECT_TRUE(DrainFileRankAndCheck(GetTempDir(), "b"));
+  EXPECT_TRUE(SbFileDelete(later_and_greatest.path().c_str()));
+
+  // Even though "a" is still there Rank should find nothing since it's expired.
+  EXPECT_TRUE(DrainFileRankAndCheck(GetTempDir(), ""));
+  EXPECT_TRUE(SbFileDelete(early_and_expired.path().c_str()));
+}
+
 // All files in the directory should be cleared except for drain files with an
 // app key matching the provided app key.
 TEST_F(DrainFileTest, SunnyDayPrepareDirectory) {
diff --git a/starboard/media.h b/starboard/media.h
index 8e30e81..4c36c8d 100644
--- a/starboard/media.h
+++ b/starboard/media.h
@@ -606,7 +606,7 @@
   // The number of bytes per second expected with this format.
   uint32_t average_bytes_per_second;
 
-  // Byte block alignment, e.g, 4.
+  // Byte block alignment, e.g., 4.
   uint16_t block_alignment;
 
   // The bit depth for the stream this represents, e.g. |8| or |16|.
@@ -805,7 +805,7 @@
 // media buffers will be stored in a temporary file in the system cache folder
 // acquired by calling SbSystemGetPath() with "kSbSystemPathCacheDirectory".
 // Note that when its value is "file" the media stack will still allocate memory
-// to cache the the buffers in use.
+// to cache the buffers in use.
 SB_EXPORT SbMediaBufferStorageType SbMediaGetBufferStorageType();
 
 // If SbMediaGetBufferUsingMemoryPool returns true, it indicates that media
diff --git a/starboard/nplb/BUILD.gn b/starboard/nplb/BUILD.gn
index 3f314cf..9880bd4 100644
--- a/starboard/nplb/BUILD.gn
+++ b/starboard/nplb/BUILD.gn
@@ -240,7 +240,7 @@
   configs -= [ "//build/config/compiler:no_exceptions" ]
 
   deps = [
-    "//starboard",
+    "//starboard:starboard_group",
     "//starboard/common",
     "//starboard/nplb/compiler_compliance:cpp14_supported",
     "//starboard/shared/starboard/media:media_util",
@@ -271,8 +271,8 @@
     cflags = [ "-Wno-enum-constexpr-conversion" ]
   }
 
-  #  TODO: b/297808555 - Add these tests for windows based platform modular builds.
-  if (sb_is_modular && !sb_is_evergreen && is_host_win) {
+  #  TODO: b/297808555 - Add these tests for all  modular builds.
+  if (sb_has_unused_symbol_issue) {
     sources -= [
       "maximum_player_configuration_explorer.cc",
       "maximum_player_configuration_explorer.h",
diff --git a/starboard/nplb/compiler_compliance/BUILD.gn b/starboard/nplb/compiler_compliance/BUILD.gn
index 58f1dd1..e3638c1 100644
--- a/starboard/nplb/compiler_compliance/BUILD.gn
+++ b/starboard/nplb/compiler_compliance/BUILD.gn
@@ -18,7 +18,7 @@
     "cpp14_initialization.cc",
   ]
   cflags_cc = [ "-std=c++14" ]
-  deps = [ "//starboard" ]
+  deps = [ "//starboard:starboard_group" ]
 }
 
 if (sb_enable_cpp17_audit) {
@@ -26,7 +26,7 @@
     sources = [ "cpp17_support.cc" ]
     deps = [
       ":cpp17_supported_config_shim",
-      "//starboard",
+      "//starboard:starboard_group",
     ]
   }
 
diff --git a/starboard/nplb/nplb_evergreen_compat_tests/BUILD.gn b/starboard/nplb/nplb_evergreen_compat_tests/BUILD.gn
index 6978098..c3d1590 100644
--- a/starboard/nplb/nplb_evergreen_compat_tests/BUILD.gn
+++ b/starboard/nplb/nplb_evergreen_compat_tests/BUILD.gn
@@ -27,7 +27,7 @@
   ]
 
   public_deps = [
-    "//starboard",
+    "//starboard:starboard_group",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/starboard/nplb/player_write_sample_test.cc b/starboard/nplb/player_write_sample_test.cc
index 5bc1653..07ee97a 100644
--- a/starboard/nplb/player_write_sample_test.cc
+++ b/starboard/nplb/player_write_sample_test.cc
@@ -173,7 +173,7 @@
   }
 
   const SbTime kDurationToPlay = kSbTimeSecond;
-  const float kSegmentSize = 0.1f;
+  const float kSegmentSize = 0.3f;
 
   GroupedSamples samples;
   if (player_fixture.HasVideo()) {
@@ -229,7 +229,7 @@
                 << ".";
 }
 
-TEST_P(SbPlayerWriteSampleTest, PartialAudioDiscardAll) {
+TEST_P(SbPlayerWriteSampleTest, DiscardAllAudio) {
   if (!IsPartialAudioSupported()) {
     // TODO: Use GTEST_SKIP when we have a newer version of gtest.
     SB_LOG(INFO)
diff --git a/starboard/player.h b/starboard/player.h
index abf17a6..e7771c5 100644
--- a/starboard/player.h
+++ b/starboard/player.h
@@ -286,7 +286,7 @@
 
 // Callback to free the given sample buffer data.  When more than one buffer
 // are sent in SbPlayerWriteSample(), the implementation only has to call this
-// callback with |sample_buffer| points to the the first buffer.
+// callback with |sample_buffer| points to the first buffer.
 typedef void (*SbPlayerDeallocateSampleFunc)(SbPlayer player,
                                              void* context,
                                              const void* sample_buffer);
diff --git a/starboard/raspi/2/skia/toolchain/BUILD.gn b/starboard/raspi/2/skia/toolchain/BUILD.gn
index 8524670..83c0798 100644
--- a/starboard/raspi/2/skia/toolchain/BUILD.gn
+++ b/starboard/raspi/2/skia/toolchain/BUILD.gn
@@ -32,9 +32,7 @@
 }
 
 cobalt_clang_toolchain("cobalt") {
-  variables = {
-    native_linker_path = gcc_toolchain_cxx
-  }
+  native_linker_path = gcc_toolchain_cxx
 }
 
 gcc_toolchain("starboard") {
diff --git a/starboard/raspi/2/toolchain/BUILD.gn b/starboard/raspi/2/toolchain/BUILD.gn
index 2c49b20..2347494 100644
--- a/starboard/raspi/2/toolchain/BUILD.gn
+++ b/starboard/raspi/2/toolchain/BUILD.gn
@@ -17,9 +17,7 @@
 import("//starboard/raspi/shared/toolchain/raspi_shared_toolchain.gni")
 
 cobalt_clang_toolchain("cobalt") {
-  variables = {
-    native_linker_path = gcc_toolchain_cxx
-  }
+  native_linker_path = gcc_toolchain_cxx
 }
 
 gcc_toolchain("starboard") {
diff --git a/starboard/raspi/shared/install_target.gni b/starboard/raspi/shared/install_target.gni
index 7413840..cf74ac4 100644
--- a/starboard/raspi/shared/install_target.gni
+++ b/starboard/raspi/shared/install_target.gni
@@ -12,8 +12,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import("//starboard/build/config/starboard_target_type.gni")
 import("//starboard/raspi/shared/toolchain/raspi_shared_toolchain.gni")
+
 template("install_target") {
+  not_needed(invoker, [ "shared_library_target_name" ])
+
   installable_target_name = invoker.installable_target_name
 
   # TODO(b/218889313): raspi relies on install_content being adjacent to the
@@ -25,7 +29,12 @@
     source_name = installable_target_name
   } else if (invoker.type == "shared_library") {
     install_subdir = "lib"
-    source_name = "lib${installable_target_name}.so"
+    if (installable_target_name == "starboard") {
+      source_name =
+          "lib${installable_target_name}.${starboard_shared_library_extension}"
+    } else {
+      source_name = "lib${installable_target_name}.so"
+    }
   } else {
     assert(false, "You can only install an executable or shared library.")
   }
diff --git a/starboard/shared/ffmpeg/BUILD.gn b/starboard/shared/ffmpeg/BUILD.gn
index 5ad4693..ed5b5e4 100644
--- a/starboard/shared/ffmpeg/BUILD.gn
+++ b/starboard/shared/ffmpeg/BUILD.gn
@@ -116,7 +116,7 @@
   deps = [
     ":ffmpeg_dispatch_sources",
     "//cobalt/test:run_all_unittests",
-    "//starboard",
+    "//starboard:starboard_group",
     "//starboard/common",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc b/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
index 0816518..d56b562 100644
--- a/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
+++ b/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
@@ -83,6 +83,7 @@
       audio_stream_info_(creation_param->audio_sample_info),
 #endif  // SB_API_VERSION >= 15
       output_mode_(creation_param->output_mode),
+      max_video_input_size_(0),
       decode_target_graphics_context_provider_(provider),
 #if SB_API_VERSION >= 15
       video_stream_info_(creation_param->video_stream_info) {
@@ -138,7 +139,8 @@
 
   PlayerComponents::Factory::CreationParameters creation_parameters(
       audio_stream_info_, video_stream_info_, player_, output_mode_,
-      decode_target_graphics_context_provider_, drm_system_);
+      max_video_input_size_, decode_target_graphics_context_provider_,
+      drm_system_);
 
   {
     ::starboard::ScopedLock lock(player_components_existence_mutex_);
@@ -546,6 +548,13 @@
   return decode_target;
 }
 
+void FilterBasedPlayerWorkerHandler::SetMaxVideoInputSize(
+    int max_video_input_size) {
+  SB_LOG(INFO) << "Set max_video_input_size from " << max_video_input_size_
+               << " to " << max_video_input_size;
+  max_video_input_size_ = max_video_input_size;
+}
+
 }  // namespace filter
 }  // namespace player
 }  // namespace starboard
diff --git a/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h b/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
index e553774..d195e15 100644
--- a/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
+++ b/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
@@ -61,6 +61,7 @@
   HandlerResult SetPlaybackRate(double playback_rate) override;
   void SetVolume(double volume) override;
   HandlerResult SetBounds(const Bounds& bounds) override;
+  void SetMaxVideoInputSize(int max_video_input_size) override;
   void Stop() override;
 
   void Update();
@@ -111,6 +112,7 @@
   bool video_ended_ = false;
 
   SbPlayerOutputMode output_mode_;
+  int max_video_input_size_;
   SbDecodeTargetGraphicsContextProvider*
       decode_target_graphics_context_provider_;
   const media::VideoStreamInfo video_stream_info_;
diff --git a/starboard/shared/starboard/player/filter/player_components.cc b/starboard/shared/starboard/player/filter/player_components.cc
index 624efd6..04dfc4d 100644
--- a/starboard/shared/starboard/player/filter/player_components.cc
+++ b/starboard/shared/starboard/player/filter/player_components.cc
@@ -93,12 +93,14 @@
     const media::VideoStreamInfo& video_stream_info,
     SbPlayer player,
     SbPlayerOutputMode output_mode,
+    int max_video_input_size,
     SbDecodeTargetGraphicsContextProvider*
         decode_target_graphics_context_provider,
     SbDrmSystem drm_system)
     : video_stream_info_(video_stream_info),
       player_(player),
       output_mode_(output_mode),
+      max_video_input_size_(max_video_input_size),
       decode_target_graphics_context_provider_(
           decode_target_graphics_context_provider),
       drm_system_(drm_system) {
@@ -112,6 +114,7 @@
     const media::VideoStreamInfo& video_stream_info,
     SbPlayer player,
     SbPlayerOutputMode output_mode,
+    int max_video_input_size,
     SbDecodeTargetGraphicsContextProvider*
         decode_target_graphics_context_provider,
     SbDrmSystem drm_system)
@@ -119,6 +122,7 @@
       video_stream_info_(video_stream_info),
       player_(player),
       output_mode_(output_mode),
+      max_video_input_size_(max_video_input_size),
       decode_target_graphics_context_provider_(
           decode_target_graphics_context_provider),
       drm_system_(drm_system) {
@@ -132,6 +136,7 @@
   this->video_stream_info_ = that.video_stream_info_;
   this->player_ = that.player_;
   this->output_mode_ = that.output_mode_;
+  this->max_video_input_size_ = that.max_video_input_size_;
   this->decode_target_graphics_context_provider_ =
       that.decode_target_graphics_context_provider_;
   this->drm_system_ = that.drm_system_;
diff --git a/starboard/shared/starboard/player/filter/player_components.h b/starboard/shared/starboard/player/filter/player_components.h
index 8e067e9..4990ec4 100644
--- a/starboard/shared/starboard/player/filter/player_components.h
+++ b/starboard/shared/starboard/player/filter/player_components.h
@@ -66,6 +66,7 @@
       CreationParameters(const media::VideoStreamInfo& video_stream_info,
                          SbPlayer player,
                          SbPlayerOutputMode output_mode,
+                         int max_video_input_size,
                          SbDecodeTargetGraphicsContextProvider*
                              decode_target_graphics_context_provider,
                          SbDrmSystem drm_system = kSbDrmSystemInvalid);
@@ -73,6 +74,7 @@
                          const media::VideoStreamInfo& video_stream_info,
                          SbPlayer player,
                          SbPlayerOutputMode output_mode,
+                         int max_video_input_size,
                          SbDecodeTargetGraphicsContextProvider*
                              decode_target_graphics_context_provider,
                          SbDrmSystem drm_system = kSbDrmSystemInvalid);
@@ -117,6 +119,7 @@
 
       SbPlayer player() const { return player_; }
       SbPlayerOutputMode output_mode() const { return output_mode_; }
+      int max_video_input_size() const { return max_video_input_size_; }
       SbDecodeTargetGraphicsContextProvider*
       decode_target_graphics_context_provider() const {
         SB_DCHECK(video_stream_info_.codec != kSbMediaVideoCodecNone);
@@ -137,6 +140,7 @@
       media::VideoStreamInfo video_stream_info_;
       SbPlayer player_ = kSbPlayerInvalid;
       SbPlayerOutputMode output_mode_ = kSbPlayerOutputModeInvalid;
+      int max_video_input_size_ = 0;
       SbDecodeTargetGraphicsContextProvider*
           decode_target_graphics_context_provider_ = nullptr;
 
diff --git a/starboard/shared/starboard/player/filter/testing/BUILD.gn b/starboard/shared/starboard/player/filter/testing/BUILD.gn
index d1cb5be..ad2dd0e 100644
--- a/starboard/shared/starboard/player/filter/testing/BUILD.gn
+++ b/starboard/shared/starboard/player/filter/testing/BUILD.gn
@@ -79,7 +79,7 @@
     public_configs = [ "//starboard/build/config:starboard_implementation" ]
 
     public_deps = [
-      "//starboard",
+      "//starboard:starboard_group",
       "//starboard/shared/starboard/media:media_util",
       "//starboard/shared/starboard/player:player_download_test_data",
       "//starboard/shared/starboard/player:video_dmp",
diff --git a/starboard/shared/starboard/player/filter/testing/player_components_test.cc b/starboard/shared/starboard/player/filter/testing/player_components_test.cc
index 0e3b3ad..618c0b1 100644
--- a/starboard/shared/starboard/player/filter/testing/player_components_test.cc
+++ b/starboard/shared/starboard/player/filter/testing/player_components_test.cc
@@ -49,7 +49,7 @@
 typedef VideoDmpReader::AudioAccessUnit AudioAccessUnit;
 typedef VideoDmpReader::VideoAccessUnit VideoAccessUnit;
 typedef PlayerComponents::Factory::CreationParameters CreationParameters;
-typedef std::tuple<const char*, const char*, SbPlayerOutputMode>
+typedef std::tuple<const char*, const char*, SbPlayerOutputMode, int>
     PlayerComponentsTestParam;
 
 const SbTimeMonotonic kDefaultPrerollTimeOut = 5 * kSbTimeSecond;
@@ -64,12 +64,14 @@
   PlayerComponentsTest()
       : audio_filename_(std::get<0>(GetParam())),
         video_filename_(std::get<1>(GetParam())),
-        output_mode_(std::get<2>(GetParam())) {
+        output_mode_(std::get<2>(GetParam())),
+        max_video_input_size_(std::get<3>(GetParam())) {
     SB_LOG(INFO) << "Testing: \"" << audio_filename_ << "\", \""
                  << video_filename_
                  << (output_mode_ == kSbPlayerOutputModeDecodeToTexture
-                         ? "\", kSbPlayerOutputModeDecodeToTexture."
-                         : "\", kSbPlayerOutputModePunchOut.");
+                         ? "\", kSbPlayerOutputModeDecodeToTexture, "
+                         : "\", kSbPlayerOutputModePunchOut, ")
+                 << max_video_input_size_ << ".";
   }
 
   void SetUp() override {
@@ -89,7 +91,10 @@
       CreationParameters creation_parameters(
           audio_reader_->audio_stream_info(),
           video_reader_->video_stream_info(), kDummyPlayer, output_mode_,
+          max_video_input_size_,
           fake_graphics_context_provider_.decoder_target_provider());
+      ASSERT_EQ(creation_parameters.max_video_input_size(),
+                max_video_input_size_);
       player_components_ =
           factory->CreateComponents(creation_parameters, &error_message);
     } else if (audio_reader_) {
@@ -103,7 +108,10 @@
       ASSERT_TRUE(video_reader_);
       CreationParameters creation_parameters(
           video_reader_->video_stream_info(), kDummyPlayer, output_mode_,
+          max_video_input_size_,
           fake_graphics_context_provider_.decoder_target_provider());
+      ASSERT_EQ(creation_parameters.max_video_input_size(),
+                max_video_input_size_);
       player_components_ =
           factory->CreateComponents(creation_parameters, &error_message);
     }
@@ -471,6 +479,7 @@
   const std::string audio_filename_;
   const std::string video_filename_;
   const SbPlayerOutputMode output_mode_;
+  const int max_video_input_size_;
   JobQueue job_queue_;
   FakeGraphicsContextProvider fake_graphics_context_provider_;
   unique_ptr<VideoDmpReader> audio_reader_;
@@ -491,12 +500,14 @@
   std::string audio_filename(std::get<0>(info.param));
   std::string video_filename(std::get<1>(info.param));
   SbPlayerOutputMode output_mode = std::get<2>(info.param);
+  int max_video_input_size = std::get<3>(info.param);
 
   std::string config_name(FormatString(
-      "%s_%s_%s", audio_filename.empty() ? "null" : audio_filename.c_str(),
+      "%s_%s_%s_%d", audio_filename.empty() ? "null" : audio_filename.c_str(),
       video_filename.empty() ? "null" : video_filename.c_str(),
       output_mode == kSbPlayerOutputModeDecodeToTexture ? "DecodeToTexture"
-                                                        : "Punchout"));
+                                                        : "Punchout",
+      max_video_input_size));
 
   std::replace(config_name.begin(), config_name.end(), '.', '_');
   return config_name;
@@ -675,13 +686,15 @@
 }
 
 PlayerComponentsTestParam CreateParam(const char* audio_file,
-                                      const VideoTestParam& video_param) {
+                                      const VideoTestParam& video_param,
+                                      const int max_video_input_size) {
   return std::make_tuple(audio_file, std::get<0>(video_param),
-                         std::get<1>(video_param));
+                         std::get<1>(video_param), max_video_input_size);
 }
 
 vector<PlayerComponentsTestParam> GetSupportedCreationParameters() {
   vector<PlayerComponentsTestParam> supported_parameters;
+  int max_video_input_size = 0;
 
   // TODO: Enable tests of "heaac.dmp".
   vector<const char*> audio_files =
@@ -708,10 +721,11 @@
   }
 
   for (size_t i = 0; i < video_params.size(); i++) {
-    supported_parameters.push_back(CreateParam("", video_params[i]));
+    supported_parameters.push_back(
+        CreateParam("", video_params[i], max_video_input_size));
     for (size_t j = 0; j < audio_files.size(); j++) {
       supported_parameters.push_back(
-          CreateParam(audio_files[j], video_params[i]));
+          CreateParam(audio_files[j], video_params[i], max_video_input_size));
     }
   }
   SB_DCHECK(supported_parameters.size() < 50)
@@ -723,13 +737,15 @@
             kSbPlayerOutputModeDecodeToTexture, kSbMediaVideoCodecNone,
             kSbDrmSystemInvalid)) {
       supported_parameters.push_back(std::make_tuple(
-          audio_files[i], "", kSbPlayerOutputModeDecodeToTexture));
+          audio_files[i], "", kSbPlayerOutputModeDecodeToTexture,
+          max_video_input_size));
     }
     if (PlayerComponents::Factory::OutputModeSupported(
             kSbPlayerOutputModePunchOut, kSbMediaVideoCodecNone,
             kSbDrmSystemInvalid)) {
       supported_parameters.push_back(
-          std::make_tuple(audio_files[i], "", kSbPlayerOutputModePunchOut));
+          std::make_tuple(audio_files[i], "", kSbPlayerOutputModePunchOut,
+                          max_video_input_size));
     }
   }
 
diff --git a/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc b/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc
index 02013b6..559dad7 100644
--- a/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc
+++ b/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc
@@ -143,54 +143,59 @@
       kSbMediaVideoCodecNone,  kSbMediaVideoCodecH264,   kSbMediaVideoCodecH265,
       kSbMediaVideoCodecMpeg2, kSbMediaVideoCodecTheora, kSbMediaVideoCodecVc1,
       kSbMediaVideoCodecAv1,   kSbMediaVideoCodecVp8,    kSbMediaVideoCodecVp9};
+  int kMaxVideoInputSizes[] = {0, 777000, 3110500};
 
   for (auto output_mode : kOutputModes) {
     for (auto video_codec : kVideoCodecs) {
-      if (PlayerComponents::Factory::OutputModeSupported(
-              output_mode, video_codec, kSbDrmSystemInvalid)) {
-        SbPlayerPrivate players[kDecodersToCreate];
-        scoped_ptr<VideoDecoder> video_decoders[kDecodersToCreate];
-        scoped_ptr<VideoRenderAlgorithm>
-            video_render_algorithms[kDecodersToCreate];
-        scoped_refptr<VideoRendererSink>
-            video_renderer_sinks[kDecodersToCreate];
+      for (auto max_video_input_size : kMaxVideoInputSizes) {
+        if (PlayerComponents::Factory::OutputModeSupported(
+                output_mode, video_codec, kSbDrmSystemInvalid)) {
+          SbPlayerPrivate players[kDecodersToCreate];
+          scoped_ptr<VideoDecoder> video_decoders[kDecodersToCreate];
+          scoped_ptr<VideoRenderAlgorithm>
+              video_render_algorithms[kDecodersToCreate];
+          scoped_refptr<VideoRendererSink>
+              video_renderer_sinks[kDecodersToCreate];
 
-        for (int i = 0; i < kDecodersToCreate; ++i) {
-          SbMediaAudioSampleInfo dummy_audio_sample_info = {
-              kSbMediaAudioCodecNone};
-          PlayerComponents::Factory::CreationParameters creation_parameters(
-              CreateVideoStreamInfo(fixture_.dmp_reader().video_codec()),
-              &players[i], output_mode,
-              fake_graphics_context_provider_.decoder_target_provider(),
-              nullptr);
+          for (int i = 0; i < kDecodersToCreate; ++i) {
+            SbMediaAudioSampleInfo dummy_audio_sample_info = {
+                kSbMediaAudioCodecNone};
+            PlayerComponents::Factory::CreationParameters creation_parameters(
+                CreateVideoStreamInfo(fixture_.dmp_reader().video_codec()),
+                &players[i], output_mode, max_video_input_size,
+                fake_graphics_context_provider_.decoder_target_provider(),
+                nullptr);
+            ASSERT_EQ(creation_parameters.max_video_input_size(),
+                      max_video_input_size);
 
-          std::string error_message;
-          ASSERT_TRUE(factory->CreateSubComponents(
-              creation_parameters, nullptr, nullptr, &video_decoders[i],
-              &video_render_algorithms[i], &video_renderer_sinks[i],
-              &error_message));
-          ASSERT_TRUE(video_decoders[i]);
+            std::string error_message;
+            ASSERT_TRUE(factory->CreateSubComponents(
+                creation_parameters, nullptr, nullptr, &video_decoders[i],
+                &video_render_algorithms[i], &video_renderer_sinks[i],
+                &error_message));
+            ASSERT_TRUE(video_decoders[i]);
 
-          if (video_renderer_sinks[i]) {
-            video_renderer_sinks[i]->SetRenderCB(
-                std::bind(&VideoDecoderTestFixture::Render, &fixture_, _1));
-          }
+            if (video_renderer_sinks[i]) {
+              video_renderer_sinks[i]->SetRenderCB(
+                  std::bind(&VideoDecoderTestFixture::Render, &fixture_, _1));
+            }
 
-          video_decoders[i]->Initialize(
-              std::bind(&VideoDecoderTestFixture::OnDecoderStatusUpdate,
-                        &fixture_, _1, _2),
-              std::bind(&VideoDecoderTestFixture::OnError, &fixture_));
+            video_decoders[i]->Initialize(
+                std::bind(&VideoDecoderTestFixture::OnDecoderStatusUpdate,
+                          &fixture_, _1, _2),
+                std::bind(&VideoDecoderTestFixture::OnError, &fixture_));
 
 #if SB_HAS(GLES2)
-          if (output_mode == kSbPlayerOutputModeDecodeToTexture) {
-            fixture_.AssertInvalidDecodeTarget();
-          }
+            if (output_mode == kSbPlayerOutputModeDecodeToTexture) {
+              fixture_.AssertInvalidDecodeTarget();
+            }
 #endif  // SB_HAS(GLES2)
-        }
-        if (fixture_.HasPendingEvents()) {
-          bool error_occurred = false;
-          ASSERT_NO_FATAL_FAILURE(fixture_.DrainOutputs(&error_occurred));
-          ASSERT_FALSE(error_occurred);
+          }
+          if (fixture_.HasPendingEvents()) {
+            bool error_occurred = false;
+            ASSERT_NO_FATAL_FAILURE(fixture_.DrainOutputs(&error_occurred));
+            ASSERT_FALSE(error_occurred);
+          }
         }
       }
     }
diff --git a/starboard/shared/starboard/player/filter/testing/video_decoder_test_fixture.cc b/starboard/shared/starboard/player/filter/testing/video_decoder_test_fixture.cc
index 0d73ff0..bf9a2e7 100644
--- a/starboard/shared/starboard/player/filter/testing/video_decoder_test_fixture.cc
+++ b/starboard/shared/starboard/player/filter/testing/video_decoder_test_fixture.cc
@@ -84,10 +84,13 @@
   SbPlayerOutputMode output_mode = output_mode_;
   ASSERT_TRUE(PlayerComponents::Factory::OutputModeSupported(
       output_mode, dmp_reader_.video_codec(), kSbDrmSystemInvalid));
+  int max_video_input_size = 0;
 
   PlayerComponents::Factory::CreationParameters creation_parameters(
       GetVideoInputBuffer(0)->video_stream_info(), &player_, output_mode,
+      max_video_input_size,
       fake_graphics_context_provider_->decoder_target_provider(), nullptr);
+  ASSERT_EQ(creation_parameters.max_video_input_size(), max_video_input_size);
 
   scoped_ptr<PlayerComponents::Factory> factory;
   if (using_stub_decoder_) {
diff --git a/starboard/shared/starboard/player/filter/wsola_internal.cc b/starboard/shared/starboard/player/filter/wsola_internal.cc
index deb2928..ad4e1bf 100644
--- a/starboard/shared/starboard/player/filter/wsola_internal.cc
+++ b/starboard/shared/starboard/player/filter/wsola_internal.cc
@@ -33,11 +33,13 @@
 #include "starboard/common/scoped_ptr.h"
 #include "starboard/memory.h"
 
-// TODO: Detect Neon on ARM platform and enable SIMD.
 #if SB_IS(ARCH_X86) || SB_IS(ARCH_X64)
 #define USE_SIMD 1
 #include <xmmintrin.h>
-#endif  // SB_IS(ARCH_X86) || SB_IS(ARCH_X64)
+#elif (SB_IS(ARCH_ARM) || SB_IS(ARCH_ARM64)) && defined(USE_NEON)
+#define USE_SIMD 1
+#include <arm_neon.h>
+#endif
 
 namespace starboard {
 namespace shared {
@@ -111,7 +113,7 @@
     // Reduce to a single float for this channel.
     float32x2_t m_half = vadd_f32(vget_high_f32(m_sum), vget_low_f32(m_sum));
     dot_product[ch] = vget_lane_f32(vpadd_f32(m_half, m_half), 0);
-#endif  // SB_IS(ARCH_X86) || SB_IS(ARCH_X64)
+#endif
   }
 
   if (!rem) {
diff --git a/starboard/shared/starboard/player/player_worker.h b/starboard/shared/starboard/player/player_worker.h
index 96bae3d..aed0650 100644
--- a/starboard/shared/starboard/player/player_worker.h
+++ b/starboard/shared/starboard/player/player_worker.h
@@ -111,6 +111,8 @@
 
     virtual SbDecodeTarget GetCurrentDecodeTarget() = 0;
 
+    virtual void SetMaxVideoInputSize(int max_video_input_size) = 0;
+
    private:
     Handler(const Handler&) = delete;
     Handler& operator=(const Handler&) = delete;
diff --git a/starboard/shared/uwp/extended_resources_manager.cc b/starboard/shared/uwp/extended_resources_manager.cc
index 21d2821..e8a730b 100644
--- a/starboard/shared/uwp/extended_resources_manager.cc
+++ b/starboard/shared/uwp/extended_resources_manager.cc
@@ -68,8 +68,10 @@
 //
 // To make playback more smooth it is better to increase the output queue size
 // up to 30-50 frames, but it should not exceed memory budgetd.
-// So, the value of 440 Mb looks as compromise.
-const uint64_t kFrameBuffersPoolMemorySize = 440 * 1024 * 1024;
+// Compromise value was found out experimentally.
+// 400 Mb leaves enough memory for stable working of the rest system.
+// Just in case to be more sure we reduce this value down to 380 Mb.
+const uint64_t kFrameBuffersPoolMemorySize = 380 * 1024 * 1024;
 
 bool IsExtendedResourceModeRequired() {
   if (!::starboard::xb1::shared::CanAcquire()) {
diff --git a/starboard/shared/widevine/drm_system_widevine.cc b/starboard/shared/widevine/drm_system_widevine.cc
index 3320eba..8ec4544 100644
--- a/starboard/shared/widevine/drm_system_widevine.cc
+++ b/starboard/shared/widevine/drm_system_widevine.cc
@@ -238,7 +238,7 @@
 
   static WidevineStorage s_storage(GetWidevineStoragePath());
   EnsureWidevineCdmIsInitialized(company_name, model_name, &s_storage);
-  const bool kEnablePrivacyMode = true;
+  const bool kEnablePrivacyMode = false;
   cdm_.reset(wv3cdm::create(this, &s_storage, kEnablePrivacyMode));
   SB_DCHECK(cdm_);
 
@@ -633,8 +633,8 @@
   }
 }
 
-void DrmSystemWidevine::onKeyStatusesChange(
-    const std::string& wvcdm_session_id) {
+void DrmSystemWidevine::onKeyStatusesChange(const std::string& wvcdm_session_id,
+                                            bool has_new_usable_key) {
   wv3cdm::KeyStatusMap key_statuses;
   wv3cdm::Status status = cdm_->getKeyStatuses(wvcdm_session_id, &key_statuses);
 
diff --git a/starboard/shared/widevine/drm_system_widevine.h b/starboard/shared/widevine/drm_system_widevine.h
index af39389..6a9d286 100644
--- a/starboard/shared/widevine/drm_system_widevine.h
+++ b/starboard/shared/widevine/drm_system_widevine.h
@@ -117,7 +117,9 @@
                  ::widevine::Cdm::MessageType message_type,
                  const std::string& message) override;
   // There has been a change in the keys in the session or their status.
-  void onKeyStatusesChange(const std::string& wvcdm_session_id) override;
+  void onKeyStatusesChange(const std::string& wvcdm_session_id,
+                           bool has_new_usable_key) override;
+
   // A remove() operation has been completed.
   void onRemoveComplete(const std::string& wvcdm_session_id) override;
   // Called when a deferred action has completed.
diff --git a/starboard/shared/win32/socket_set_tcp_window_scaling.cc b/starboard/shared/win32/socket_set_tcp_window_scaling.cc
index 0e73066..091af3c 100644
--- a/starboard/shared/win32/socket_set_tcp_window_scaling.cc
+++ b/starboard/shared/win32/socket_set_tcp_window_scaling.cc
@@ -30,6 +30,9 @@
   // later, receive window auto-tuning is enabled and the TCP window scale
   // factor is reduced to 2 from the default value of 8."
 
+  if (socket == kSbSocketInvalid)
+    return false;
+
   const ULONG target_os_version =
       enable_window_scaling ? NTDDI_VISTA : NTDDI_WS03;
   WSA_COMPATIBILITY_MODE compatibility_mode = {WsaBehaviorAutoTuning,
diff --git a/starboard/tools/BUILD.gn b/starboard/tools/BUILD.gn
index 27dca14..6e1cc2f 100644
--- a/starboard/tools/BUILD.gn
+++ b/starboard/tools/BUILD.gn
@@ -12,7 +12,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-action("build_app_launcher_zip") {
+group("build_app_launcher_zip") {
+  deps = [
+    ":package_app_launcher_directory",
+    ":package_app_launcher_zip",
+  ]
+}
+
+# TODO(b/294130306): Get rid of app_launcher.zip.
+action("package_app_launcher_zip") {
   script = "//starboard/tools/app_launcher_packager.py"
 
   file_list = exec_script(script, [ "-l" ], "trim string")
@@ -20,7 +28,23 @@
   outputs = [ "$root_out_dir/app_launcher.zip" ]
 
   args = [
+    # TODO(b/294130306): Control this flag with a GN variable.
+    "--include_integration_tests",
     "-z",
     rebase_path(outputs[0], root_build_dir),
   ]
 }
+
+# Platforms that has windows based toolchains (ps4/5, xb1, switch) expect the
+# app launcher files to be in a folder in the test archive as opposed to in a
+# zip file.
+copy("package_app_launcher_directory") {
+  script = "//starboard/tools/app_launcher_packager.py"
+
+  app_launcher_dir = "$root_out_dir/app_launcher"
+
+  file_list = exec_script(script, [ "-l" ], "trim string")
+  sources = string_split(file_list)
+  outputs =
+      [ "$app_launcher_dir/{{source_root_relative_dir}}/{{source_file_part}}" ]
+}
diff --git a/starboard/tools/app_launcher_packager.py b/starboard/tools/app_launcher_packager.py
index f8ae9ba..fff419b 100644
--- a/starboard/tools/app_launcher_packager.py
+++ b/starboard/tools/app_launcher_packager.py
@@ -45,7 +45,7 @@
     ('starboard/tools/testing', 'sharding_configuration.json')
 ]
 
-_INCLUDE_BLACK_BOX_TESTS_PATTERNS = [
+_INCLUDE_INTEGRATION_TESTS_PATTERNS = [
     # Black box and web platform tests have non-py assets, so everything
     # is picked up.
     ('cobalt/black_box_tests', '*'),
@@ -105,7 +105,8 @@
 def CopyAppLauncherTools(repo_root,
                          dest_root,
                          additional_glob_patterns=None,
-                         include_black_box_tests=True):
+                         include_black_box_tests=False,
+                         include_integration_tests=False):
   """Copies app launcher related files to the destination root.
 
   Args:
@@ -114,12 +115,16 @@
     additional_glob_patterns: Some platforms may need to include certain
       dependencies beyond the default include file patterns. The results here
       will be merged in with _INCLUDE_FILE_PATTERNS.
-    include_black_box_tests: If True then the resources for the black box tests
-      are included.
+    include_integration_tests: If True then the resources for the integration
+      tests are included.
+    include_black_box_tests: Same as above. Kept for compatibility reasons.
   """
+  # TODO(b/294129333): Remove include_black_box_tests when DS is gone.
+  include_integration_tests = (
+      include_integration_tests or include_black_box_tests)
   dest_root = _PrepareDestination(dest_root)
   copy_list = _GetSourceFilesList(repo_root, additional_glob_patterns,
-                                  include_black_box_tests)
+                                  include_integration_tests)
   _CopyFiles(repo_root, dest_root, copy_list)
 
 
@@ -140,13 +145,13 @@
 def _GetSourceFilesList(  # pylint: disable=missing-docstring
     repo_root,
     additional_glob_patterns=None,
-    include_black_box_tests=True):
+    include_integration_tests=False):
   # Find all glob files from specified search directories.
   include_glob_patterns = _INCLUDE_FILE_PATTERNS
   if additional_glob_patterns:
     include_glob_patterns += additional_glob_patterns
-  if include_black_box_tests:
-    include_glob_patterns += _INCLUDE_BLACK_BOX_TESTS_PATTERNS
+  if include_integration_tests:
+    include_glob_patterns += _INCLUDE_INTEGRATION_TESTS_PATTERNS
   copy_list = []
   for d, glob_pattern in include_glob_patterns:
     flist = _FindFilesRecursive(os.path.join(repo_root, d), glob_pattern)
@@ -222,6 +227,10 @@
       action='store_true',
       help='Return the application resources instead of printing them.')
   parser.add_argument(
+      '--include_integration_tests',
+      action='store_true',
+      help='Includes integration test files.')
+  parser.add_argument(
       '-v',
       '--verbose',
       action='store_true',
@@ -232,17 +241,25 @@
   log_level.InitializeLogging(args)
 
   if args.destination_root:
-    CopyAppLauncherTools(REPOSITORY_ROOT, args.destination_root)
+    CopyAppLauncherTools(
+        REPOSITORY_ROOT,
+        args.destination_root,
+        include_integration_tests=args.include_integration_tests)
   elif args.zip_file:
     try:
       temp_dir = tempfile.mkdtemp(prefix='cobalt_app_launcher_')
-      CopyAppLauncherTools(REPOSITORY_ROOT, temp_dir)
+      CopyAppLauncherTools(
+          REPOSITORY_ROOT,
+          temp_dir,
+          include_integration_tests=args.include_integration_tests)
       MakeZipArchive(temp_dir, args.zip_file)
     finally:
       shutil.rmtree(temp_dir)
   elif args.list:
     src_files = []
-    for src_file in _GetSourceFilesList(REPOSITORY_ROOT):
+    for src_file in _GetSourceFilesList(
+        REPOSITORY_ROOT,
+        include_integration_tests=args.include_integration_tests):
       # Skip paths with '$' since they won't get through the Ninja generator.
       if '$' in src_file:
         continue
@@ -257,10 +274,5 @@
   return 0
 
 
-def DoMain(argv):
-  """Script main function."""
-  return main(argv)
-
-
 if __name__ == '__main__':
   sys.exit(main(sys.argv[1:]))
diff --git a/starboard/tools/build.py b/starboard/tools/build.py
index ae9fc04..4c9f513 100644
--- a/starboard/tools/build.py
+++ b/starboard/tools/build.py
@@ -15,8 +15,9 @@
 #
 """Build related constants and helper functions."""
 
-import imp  # pylint: disable=deprecated-module
 import importlib
+import importlib.machinery
+import importlib.util
 import logging
 import os
 import sys
@@ -94,7 +95,12 @@
                                    PLATFORMS[platform_name])
       module_path = os.path.join(platform_path, file_name)
       if not _ModuleLoaded('platform_module', module_path):
-        platform_module = imp.load_source('platform_module', module_path)
+        loader = importlib.machinery.SourceFileLoader('platform_module',
+                                                      module_path)
+        spec = importlib.util.spec_from_file_location(
+            'platform_module', module_path, loader=loader)
+        platform_module = importlib.util.module_from_spec(spec)
+        loader.exec_module(platform_module)
       else:
         platform_module = sys.modules['platform_module']
     else:
diff --git a/starboard/tools/testing/test_runner.py b/starboard/tools/testing/test_runner.py
index 0fb343a..0c48536 100755
--- a/starboard/tools/testing/test_runner.py
+++ b/starboard/tools/testing/test_runner.py
@@ -86,13 +86,14 @@
 def _VerifyConfig(config, filters):
   """Ensures a platform or app config is self-consistent."""
   targets = config.GetTestTargets()
+  blackbox_targets = config.GetTestBlackBoxTargets()
   filter_targets = [
       f.target_name for f in filters if f != test_filter.DISABLE_TESTING
   ]
 
   # Filters must be defined in the same config as the targets they're filtering,
   # platform filters in platform config, and app filters in app config.
-  unknown_targets = set(filter_targets) - set(targets)
+  unknown_targets = set(filter_targets) - set(targets) - set(blackbox_targets)
   if unknown_targets:
     raise ValueError("Unknown filter targets in {} config ({}): {}".format(
         config.GetName(), config.__class__.__name__, sorted(unknown_targets)))
diff --git a/starboard/win/shared/platform_configuration/configuration.gni b/starboard/win/shared/platform_configuration/configuration.gni
index 1798610..74fe806 100644
--- a/starboard/win/shared/platform_configuration/configuration.gni
+++ b/starboard/win/shared/platform_configuration/configuration.gni
@@ -27,5 +27,3 @@
     "//starboard/win/shared/platform_configuration:pedantic_warnings"
 
 cobalt_platform_dependencies = [ "//starboard/egl_and_gles" ]
-
-sb_enable_cpp17_audit = false
diff --git a/starboard/xb1/platform_configuration/BUILD.gn b/starboard/xb1/platform_configuration/BUILD.gn
index db2a0b2..85a72d6 100644
--- a/starboard/xb1/platform_configuration/BUILD.gn
+++ b/starboard/xb1/platform_configuration/BUILD.gn
@@ -39,6 +39,7 @@
     # The warning "Padding was added at the end of a structure" happens
     # in the library third_party/internal/libav1_xb1.
     "/wd4324",
+    "/Zc:__cplusplus",  # enable preprocessor macro for language support
   ]
 
   if (is_debug || is_devel) {
diff --git a/starboard/xb1/shared/BUILD.gn b/starboard/xb1/shared/BUILD.gn
index 9fd99b9..a3a3538 100644
--- a/starboard/xb1/shared/BUILD.gn
+++ b/starboard/xb1/shared/BUILD.gn
@@ -23,7 +23,7 @@
   configs += [ "//starboard/build/config:starboard_implementation" ]
 
   deps = [
-    "//starboard",
+    "//starboard:starboard_group",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/starboard/xb1/shared/gpu_base_video_decoder.cc b/starboard/xb1/shared/gpu_base_video_decoder.cc
index 84bab91..6cdc999 100644
--- a/starboard/xb1/shared/gpu_base_video_decoder.cc
+++ b/starboard/xb1/shared/gpu_base_video_decoder.cc
@@ -555,11 +555,14 @@
   {

     ScopedLock input_queue_lock(written_inputs_mutex_);

     const auto iter = FindByTimestamp(written_inputs_, timestamp);

-    SB_DCHECK(iter != written_inputs_.cend());

-    if (is_hdr_video_) {

-      image->AttachColorMetadata((*iter)->video_stream_info().color_metadata);

+    // Reset might be called too early, cause clearing of written_inputs_ and

+    // absence of requested timestamp.

+    if (iter != written_inputs_.cend()) {

+      if (is_hdr_video_) {

+        image->AttachColorMetadata((*iter)->video_stream_info().color_metadata);

+      }

+      written_inputs_.erase(iter);

     }

-    written_inputs_.erase(iter);

   }

   scoped_refptr<VideoFrameImpl> frame(new VideoFrameImpl(

       timestamp, std::bind(&GpuVideoDecoderBase::DeleteVideoFrame, this,

diff --git a/third_party/QR-Code-generator/BUILD.gn b/third_party/QR-Code-generator/BUILD.gn
index 53153fd..260aed5 100644
--- a/third_party/QR-Code-generator/BUILD.gn
+++ b/third_party/QR-Code-generator/BUILD.gn
@@ -22,5 +22,5 @@
     "cpp/QrSegment.hpp",
   ]
   include_dirs = [ "." ]
-  deps = [ "//starboard" ]
+  deps = [ "//starboard:starboard_group", ]
 }
diff --git a/third_party/boringssl/BUILD.gn b/third_party/boringssl/BUILD.gn
index 51f71e4..fbc4a85 100644
--- a/third_party/boringssl/BUILD.gn
+++ b/third_party/boringssl/BUILD.gn
@@ -1,5 +1,6 @@
 import("//starboard/sabi/sabi.gni")
 import("//third_party/boringssl/buildfiles.gni")
+import("//starboard/build/config/os_definitions.gni")
 
 declare_args() {
   asm_target_arch = target_cpu
@@ -107,7 +108,7 @@
       if ((calling_convention != "aarch64" && calling_convention != "eabi" &&
            calling_convention != "sysv" && calling_convention != "windows") ||
           (asm_target_arch != "x86" && asm_target_arch != "x64" &&
-           asm_target_arch != "arm" && asm_target_arch != "arm64")) {
+           asm_target_arch != "arm" && asm_target_arch != "arm64") || is_host_win) {  # is_host_win : windows host modular builds need OPENSSL_NO_ASM ) 
         defines = [ "OPENSSL_NO_ASM" ]
       } else {
         if (calling_convention == "aarch64" || calling_convention == "eabi" ||
diff --git a/third_party/chromium/media/BUILD.gn b/third_party/chromium/media/BUILD.gn
index e914124..4ed113c 100644
--- a/third_party/chromium/media/BUILD.gn
+++ b/third_party/chromium/media/BUILD.gn
@@ -247,7 +247,7 @@
     "//build:chromecast_buildflags",
     "//build:chromeos_buildflags",
     "//net",
-    "//starboard",
+    "//starboard:starboard_group",
     "//url",
   ]
 }
diff --git a/third_party/chromium/media/base/pipeline_status.cc b/third_party/chromium/media/base/pipeline_status.cc
index 3e4861e..7e439f2 100644
--- a/third_party/chromium/media/base/pipeline_status.cc
+++ b/third_party/chromium/media/base/pipeline_status.cc
@@ -94,11 +94,6 @@
       return StatusCode::kPipelineErrorDemuxerErrorDetectedHLS;
     case PIPELINE_ERROR_HARDWARE_CONTEXT_RESET:
       return StatusCode::kPipelineErrorHardwareContextReset;
-#if defined(STARBOARD)
-    case PLAYBACK_CAPABILITY_CHANGED:
-      NOTREACHED();
-      return StatusCode::kPipelineErrorDecode;
-#endif  // defined(STARBOARD)
   }
 
   NOTREACHED();
@@ -132,9 +127,6 @@
     STRINGIFY_STATUS_CASE(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR);
     STRINGIFY_STATUS_CASE(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR);
     STRINGIFY_STATUS_CASE(AUDIO_RENDERER_ERROR);
-#if defined(STARBOARD)
-    STRINGIFY_STATUS_CASE(PLAYBACK_CAPABILITY_CHANGED);
-#endif  // defined(STARBOARD)
   }
 
 #undef STRINGIFY_STATUS_CASE
diff --git a/third_party/chromium/media/base/pipeline_status.h b/third_party/chromium/media/base/pipeline_status.h
index 808c6a8..88b6c8c 100644
--- a/third_party/chromium/media/base/pipeline_status.h
+++ b/third_party/chromium/media/base/pipeline_status.h
@@ -63,15 +63,8 @@
   // https://crbug.com/1208618
   PIPELINE_ERROR_HARDWARE_CONTEXT_RESET = 23,
 
-#if defined(STARBOARD)
-  // Transient errors.
-  PLAYBACK_CAPABILITY_CHANGED = 24,
-
-  PIPELINE_STATUS_MAX = PLAYBACK_CAPABILITY_CHANGED,
-#else  // defined(STARBOARD)
   // Must be equal to the largest value ever logged.
   PIPELINE_STATUS_MAX = PIPELINE_ERROR_HARDWARE_CONTEXT_RESET,
-#endif  // defined(STARBOARD)
 };
 
 MEDIA_EXPORT absl::optional<PipelineStatus> StatusCodeToPipelineStatus(
diff --git a/third_party/crashpad/handler/BUILD.gn b/third_party/crashpad/handler/BUILD.gn
index 2b9d2e4..c1f3204 100644
--- a/third_party/crashpad/handler/BUILD.gn
+++ b/third_party/crashpad/handler/BUILD.gn
@@ -105,7 +105,7 @@
   }
 
   if (crashpad_is_in_starboard) {
-    public_deps += [ "//starboard" ]
+    public_deps += [ "//starboard:starboard_group", ]
   }
 }
 
diff --git a/third_party/crashpad/tools/BUILD.gn b/third_party/crashpad/tools/BUILD.gn
index 76d6d28..ef25513 100644
--- a/third_party/crashpad/tools/BUILD.gn
+++ b/third_party/crashpad/tools/BUILD.gn
@@ -48,7 +48,7 @@
 
     if (crashpad_is_in_starboard) {
       deps += [
-        "//starboard",
+        "//starboard:starboard_group",
       ]
     }
 
diff --git a/third_party/devtools/front_end/sdk/TracingModel.js b/third_party/devtools/front_end/sdk/TracingModel.js
index ee8632f..f69b051 100644
--- a/third_party/devtools/front_end/sdk/TracingModel.js
+++ b/third_party/devtools/front_end/sdk/TracingModel.js
@@ -105,7 +105,7 @@
     if (!processes.length) {
       return null;
     }
-    const browserMainThreadName = 'CrBrowserMain';
+    const browserMainThreadName = 'cobalt';
     const browserProcesses = [];
     const browserMainThreads = [];
     for (const process of processes) {
diff --git a/third_party/devtools/front_end/timeline_model/TimelineModel.js b/third_party/devtools/front_end/timeline_model/TimelineModel.js
index 68e9bf6..e1f3d05 100644
--- a/third_party/devtools/front_end/timeline_model/TimelineModel.js
+++ b/third_party/devtools/front_end/timeline_model/TimelineModel.js
@@ -815,8 +815,15 @@
       }
 
       case recordTypes.Layout: {
+        let frameId = -1;
+        if (event.args && event.args['beginData'] && event.args['beginData']['frame']) {
+          frameId = event.args['beginData']['frame'];
+        }
+        if (frameId === -1) {
+          break;
+        }
+
         this._invalidationTracker.didLayout(event);
-        const frameId = event.args['beginData']['frame'];
         timelineData.setInitiator(this._layoutInvalidate[frameId]);
         // In case we have no closing Layout event, endData is not available.
         if (event.args['endData']) {
diff --git a/third_party/googletest/BUILD.gn b/third_party/googletest/BUILD.gn
index 143b025..a20c56e 100644
--- a/third_party/googletest/BUILD.gn
+++ b/third_party/googletest/BUILD.gn
@@ -156,7 +156,7 @@
   # line, so it happens to work in this case.
   all_dependent_configs = [ "//build/config/compiler:rtti" ]
 
-  public_deps = [  "//starboard"  ]
+  public_deps = [  "//starboard:starboard_group",  ]
 }
 
 # Do NOT depend on this directly. Use //testing/gtest:gtest_main instead.
diff --git a/third_party/musl/src/exit/atexit.c b/third_party/musl/src/exit/atexit.c
index 254eeb7..9a6ae8d 100644
--- a/third_party/musl/src/exit/atexit.c
+++ b/third_party/musl/src/exit/atexit.c
@@ -55,7 +55,11 @@
 }
 
 #if !defined(ADDRESS_SANITIZER)
+#if defined(USE_CUSTOM_MUSL_FINALIZE_SIGNATURE)
+void __musl_cxa_finalize(void *dso)
+#else  // defined(USE_CUSTOM_MUSL_FINALIZE_SIGNATURE)
 void __cxa_finalize(void *dso)
+#endif  // defined(USE_CUSTOM_MUSL_FINALIZE_SIGNATURE)
 {
 #ifdef STARBOARD
   __funcs_on_exit();
@@ -63,7 +67,11 @@
 }
 #endif  // !defined(ADDRESS_SANITIZER)
 
+#if defined(USE_CUSTOM_MUSL_ATEXIT_SIGNATURE)
+int __musl_cxa_atexit(void (*func)(void *), void *arg, void *dso)
+#else  // defined(USE_CUSTOM_MUSL_ATEXIT_SIGNATURE)
 int __cxa_atexit(void (*func)(void *), void *arg, void *dso)
+#endif  // defined(USE_CUSTOM_MUSL_ATEXIT_SIGNATURE)
 {
 	LOCK(lock);
 
@@ -98,5 +106,9 @@
 
 int atexit(void (*func)(void))
 {
+#if defined(USE_CUSTOM_MUSL_ATEXIT_SIGNATURE)
+	return __musl_cxa_atexit(call, (void *)(uintptr_t)func, 0);
+#else  // defined(USE_CUSTOM_MUSL_ATEXIT_SIGNATURE)
 	return __cxa_atexit(call, (void *)(uintptr_t)func, 0);
+#endif  // defined(USE_CUSTOM_MUSL_ATEXIT_SIGNATURE)
 }
diff --git a/third_party/v8/BUILD.gn b/third_party/v8/BUILD.gn
index 3999486..10ef47c 100644
--- a/third_party/v8/BUILD.gn
+++ b/third_party/v8/BUILD.gn
@@ -2383,6 +2383,8 @@
   # Split static libraries on windows into two.
   split_count = 2
 
+  cflags = []
+
   sources = [
     "//base/trace_event/common/trace_event_common.h",
 
@@ -3938,7 +3940,7 @@
   }
 
   if (is_clang_16 && use_cobalt_customizations) {
-    cflags = [ "-Wno-implicit-const-int-float-conversion"]
+    cflags += [ "-Wno-implicit-const-int-float-conversion"]
   }
 
   configs = [
@@ -3947,7 +3949,7 @@
   ]
 
   if (is_starboard && is_win) {
-    cflags = [
+    cflags += [
       "/wd4267",
       "/wd4312",
       "/wd4351",
diff --git a/third_party/v8/include/v8-profiler.h b/third_party/v8/include/v8-profiler.h
index 74b6df8..85d3f8a 100644
--- a/third_party/v8/include/v8-profiler.h
+++ b/third_party/v8/include/v8-profiler.h
@@ -259,6 +259,17 @@
 };
 
 /**
+ * Delegate for when max samples reached and samples are discarded.
+ */
+class V8_EXPORT DiscardedSamplesDelegate {
+ public:
+  DiscardedSamplesDelegate() {}
+
+  virtual ~DiscardedSamplesDelegate() = default;
+  virtual void Notify() = 0;
+};
+
+/**
  * Optional profiling attributes.
  */
 class V8_EXPORT CpuProfilingOptions {
@@ -346,8 +357,9 @@
    * profiles may be collected at once. Attempts to start collecting several
    * profiles with the same title are silently ignored.
    */
-  CpuProfilingStatus StartProfiling(Local<String> title,
-                                    CpuProfilingOptions options);
+  CpuProfilingStatus StartProfiling(
+      Local<String> title, CpuProfilingOptions options,
+      std::unique_ptr<DiscardedSamplesDelegate> delegate = nullptr);
 
   /**
    * Starts profiling with the same semantics as above, except with expanded
diff --git a/third_party/v8/src/api/api.cc b/third_party/v8/src/api/api.cc
index 6d4e322..74ea43b 100644
--- a/third_party/v8/src/api/api.cc
+++ b/third_party/v8/src/api/api.cc
@@ -10750,10 +10750,11 @@
       use_precise_sampling);
 }
 
-CpuProfilingStatus CpuProfiler::StartProfiling(Local<String> title,
-                                               CpuProfilingOptions options) {
+CpuProfilingStatus CpuProfiler::StartProfiling(
+    Local<String> title, CpuProfilingOptions options,
+    std::unique_ptr<DiscardedSamplesDelegate> delegate) {
   return reinterpret_cast<i::CpuProfiler*>(this)->StartProfiling(
-      *Utils::OpenHandle(*title), options);
+      *Utils::OpenHandle(*title), options, std::move(delegate));
 }
 
 CpuProfilingStatus CpuProfiler::StartProfiling(Local<String> title,
diff --git a/third_party/v8/src/profiler/cpu-profiler.cc b/third_party/v8/src/profiler/cpu-profiler.cc
index 6ee7539..81e4c09 100644
--- a/third_party/v8/src/profiler/cpu-profiler.cc
+++ b/third_party/v8/src/profiler/cpu-profiler.cc
@@ -535,9 +535,11 @@
   }
 }
 
-CpuProfilingStatus CpuProfiler::StartProfiling(const char* title,
-                                               CpuProfilingOptions options) {
-  StartProfilingStatus status = profiles_->StartProfiling(title, options);
+CpuProfilingStatus CpuProfiler::StartProfiling(
+    const char* title, CpuProfilingOptions options,
+    std::unique_ptr<DiscardedSamplesDelegate> delegate) {
+  StartProfilingStatus status =
+      profiles_->StartProfiling(title, options, std::move(delegate));
 
   // TODO(nicodubus): Revisit logic for if we want to do anything different for
   // kAlreadyStarted
@@ -551,9 +553,11 @@
   return status;
 }
 
-CpuProfilingStatus CpuProfiler::StartProfiling(String title,
-                                               CpuProfilingOptions options) {
-  return StartProfiling(profiles_->GetName(title), options);
+CpuProfilingStatus CpuProfiler::StartProfiling(
+    String title, CpuProfilingOptions options,
+    std::unique_ptr<DiscardedSamplesDelegate> delegate) {
+  return StartProfiling(profiles_->GetName(title), options,
+                        std::move(delegate));
 }
 
 void CpuProfiler::StartProcessorIfNotStarted() {
diff --git a/third_party/v8/src/profiler/cpu-profiler.h b/third_party/v8/src/profiler/cpu-profiler.h
index e7ca3fb..292b4a9 100644
--- a/third_party/v8/src/profiler/cpu-profiler.h
+++ b/third_party/v8/src/profiler/cpu-profiler.h
@@ -314,10 +314,12 @@
   void set_sampling_interval(base::TimeDelta value);
   void set_use_precise_sampling(bool);
   void CollectSample();
-  StartProfilingStatus StartProfiling(const char* title,
-                                      CpuProfilingOptions options = {});
-  StartProfilingStatus StartProfiling(String title,
-                                      CpuProfilingOptions options = {});
+  StartProfilingStatus StartProfiling(
+      const char* title, CpuProfilingOptions options = {},
+      std::unique_ptr<DiscardedSamplesDelegate> delegate = nullptr);
+  StartProfilingStatus StartProfiling(
+      String title, CpuProfilingOptions options = {},
+      std::unique_ptr<DiscardedSamplesDelegate> delegate = nullptr);
 
   CpuProfile* StopProfiling(const char* title);
   CpuProfile* StopProfiling(String title);
diff --git a/third_party/v8/src/profiler/profile-generator.cc b/third_party/v8/src/profiler/profile-generator.cc
index f3344c5..1694aad 100644
--- a/third_party/v8/src/profiler/profile-generator.cc
+++ b/third_party/v8/src/profiler/profile-generator.cc
@@ -468,9 +468,11 @@
 std::atomic<uint32_t> CpuProfile::last_id_;
 
 CpuProfile::CpuProfile(CpuProfiler* profiler, const char* title,
-                       CpuProfilingOptions options)
+                       CpuProfilingOptions options,
+                       std::unique_ptr<DiscardedSamplesDelegate> delegate)
     : title_(title),
       options_(options),
+      delegate_(std::move(delegate)),
       start_time_(base::TimeTicks::HighResolutionNow()),
       top_down_(profiler->isolate()),
       profiler_(profiler),
@@ -517,8 +519,19 @@
       (options_.max_samples() == CpuProfilingOptions::kNoSampleLimit ||
        samples_.size() < options_.max_samples());
 
-  if (should_record_sample)
+  if (should_record_sample) {
     samples_.push_back({top_frame_node, timestamp, src_line});
+  }
+
+  if (!should_record_sample && delegate_ != nullptr) {
+    const auto task_runner = V8::GetCurrentPlatform()->GetForegroundTaskRunner(
+        reinterpret_cast<v8::Isolate*>(profiler_->isolate()));
+
+    task_runner->PostTask(std::make_unique<CpuProfileMaxSamplesCallbackTask>(
+        std::move(delegate_)));
+    // std::move ensures that the delegate_ will be null on the next sample,
+    // so we don't post a task multiple times.
+  }
 
   const int kSamplesFlushCount = 100;
   const int kNodesFlushCount = 10;
@@ -734,7 +747,8 @@
     : profiler_(nullptr), current_profiles_semaphore_(1) {}
 
 CpuProfilingStatus CpuProfilesCollection::StartProfiling(
-    const char* title, CpuProfilingOptions options) {
+    const char* title, CpuProfilingOptions options,
+    std::unique_ptr<DiscardedSamplesDelegate> delegate) {
   current_profiles_semaphore_.Wait();
 
   if (static_cast<int>(current_profiles_.size()) >= kMaxSimultaneousProfiles) {
@@ -750,7 +764,9 @@
       return CpuProfilingStatus::kAlreadyStarted;
     }
   }
-  current_profiles_.emplace_back(new CpuProfile(profiler_, title, options));
+
+  current_profiles_.emplace_back(
+      new CpuProfile(profiler_, title, options, std::move(delegate)));
   current_profiles_semaphore_.Signal();
   return CpuProfilingStatus::kStarted;
 }
diff --git a/third_party/v8/src/profiler/profile-generator.h b/third_party/v8/src/profiler/profile-generator.h
index 9183d56..f819dfd 100644
--- a/third_party/v8/src/profiler/profile-generator.h
+++ b/third_party/v8/src/profiler/profile-generator.h
@@ -351,8 +351,9 @@
     int line;
   };
 
-  V8_EXPORT_PRIVATE CpuProfile(CpuProfiler* profiler, const char* title,
-                               CpuProfilingOptions options);
+  V8_EXPORT_PRIVATE CpuProfile(
+      CpuProfiler* profiler, const char* title, CpuProfilingOptions options,
+      std::unique_ptr<DiscardedSamplesDelegate> delegate = nullptr);
 
   // Checks whether or not the given TickSample should be (sub)sampled, given
   // the sampling interval of the profiler that recorded it (in microseconds).
@@ -386,6 +387,7 @@
 
   const char* title_;
   const CpuProfilingOptions options_;
+  std::unique_ptr<DiscardedSamplesDelegate> delegate_;
   base::TimeTicks start_time_;
   base::TimeTicks end_time_;
   std::deque<SampleInfo> samples_;
@@ -402,6 +404,18 @@
   DISALLOW_COPY_AND_ASSIGN(CpuProfile);
 };
 
+class CpuProfileMaxSamplesCallbackTask : public v8::Task {
+ public:
+  CpuProfileMaxSamplesCallbackTask(
+      std::unique_ptr<DiscardedSamplesDelegate> delegate)
+      : delegate_(std::move(delegate)) {}
+
+  void Run() override { delegate_->Notify(); }
+
+ private:
+  std::unique_ptr<DiscardedSamplesDelegate> delegate_;
+};
+
 class V8_EXPORT_PRIVATE CodeMap {
  public:
   CodeMap();
@@ -446,8 +460,9 @@
   explicit CpuProfilesCollection(Isolate* isolate);
 
   void set_cpu_profiler(CpuProfiler* profiler) { profiler_ = profiler; }
-  CpuProfilingStatus StartProfiling(const char* title,
-                                    CpuProfilingOptions options = {});
+  CpuProfilingStatus StartProfiling(
+      const char* title, CpuProfilingOptions options = {},
+      std::unique_ptr<DiscardedSamplesDelegate> delegate = nullptr);
 
   CpuProfile* StopProfiling(const char* title);
   std::vector<std::unique_ptr<CpuProfile>>* profiles() {
diff --git a/third_party/v8/test/cctest/test-profile-generator.cc b/third_party/v8/test/cctest/test-profile-generator.cc
index 02e65e7..1e22aaa 100644
--- a/third_party/v8/test/cctest/test-profile-generator.cc
+++ b/third_party/v8/test/cctest/test-profile-generator.cc
@@ -518,6 +518,117 @@
   }
 }
 
+namespace {
+class DiscardedSamplesDelegateImpl : public v8::DiscardedSamplesDelegate {
+ public:
+  DiscardedSamplesDelegateImpl() : DiscardedSamplesDelegate() {}
+  void Notify() override {}
+};
+
+class MockPlatform : public TestPlatform {
+ public:
+  MockPlatform()
+      : old_platform_(i::V8::GetCurrentPlatform()),
+        mock_task_runner_(new MockTaskRunner()) {
+    // Now that it's completely constructed, make this the current platform.
+    i::V8::SetPlatformForTesting(this);
+  }
+
+  // When done, explicitly revert to old_platform_.
+  ~MockPlatform() override { i::V8::SetPlatformForTesting(old_platform_); }
+
+  std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner(
+      v8::Isolate*) override {
+    return mock_task_runner_;
+  }
+
+  int posted_count() { return mock_task_runner_->posted_count(); }
+
+ private:
+  class MockTaskRunner : public v8::TaskRunner {
+   public:
+    void PostTask(std::unique_ptr<v8::Task> task) override {
+      task->Run();
+      posted_count_++;
+    }
+
+    void PostDelayedTask(std::unique_ptr<Task> task,
+                         double delay_in_seconds) override {
+      task_ = std::move(task);
+      delay_ = delay_in_seconds;
+    }
+
+    void PostIdleTask(std::unique_ptr<IdleTask> task) override {
+      UNREACHABLE();
+    }
+
+    bool IdleTasksEnabled() override { return false; }
+
+    int posted_count() { return posted_count_; }
+
+   private:
+    int posted_count_ = 0;
+    double delay_ = -1;
+    std::unique_ptr<Task> task_;
+  };
+
+  v8::Platform* old_platform_;
+  std::shared_ptr<MockTaskRunner> mock_task_runner_;
+};
+}  // namespace
+
+TEST(MaxSamplesCallback) {
+  i::Isolate* isolate = CcTest::i_isolate();
+  CpuProfilesCollection profiles(isolate);
+  CpuProfiler profiler(isolate);
+  profiles.set_cpu_profiler(&profiler);
+  MockPlatform* mock_platform = new MockPlatform();
+  std::unique_ptr<DiscardedSamplesDelegateImpl> impl =
+      std::make_unique<DiscardedSamplesDelegateImpl>(
+          DiscardedSamplesDelegateImpl());
+  profiles.StartProfiling("",
+                          {v8::CpuProfilingMode::kLeafNodeLineNumbers, 1, 1,
+                           MaybeLocal<v8::Context>()},
+                          std::move(impl));
+
+  StringsStorage strings;
+  CodeMap code_map(strings);
+  Symbolizer symbolizer(&code_map);
+  TickSample sample1;
+  sample1.timestamp = v8::base::TimeTicks::HighResolutionNow();
+  sample1.pc = ToPointer(0x1600);
+  sample1.stack[0] = ToPointer(0x1510);
+  sample1.frames_count = 1;
+  auto symbolized = symbolizer.SymbolizeTickSample(sample1);
+  profiles.AddPathToCurrentProfiles(sample1.timestamp, symbolized.stack_trace,
+                                    symbolized.src_line, true,
+                                    base::TimeDelta());
+  CHECK_EQ(0, mock_platform->posted_count());
+  TickSample sample2;
+  sample2.timestamp = v8::base::TimeTicks::HighResolutionNow();
+  sample2.pc = ToPointer(0x1925);
+  sample2.stack[0] = ToPointer(0x1780);
+  sample2.frames_count = 2;
+  symbolized = symbolizer.SymbolizeTickSample(sample2);
+  profiles.AddPathToCurrentProfiles(sample2.timestamp, symbolized.stack_trace,
+                                    symbolized.src_line, true,
+                                    base::TimeDelta());
+  CHECK_EQ(1, mock_platform->posted_count());
+  TickSample sample3;
+  sample3.timestamp = v8::base::TimeTicks::HighResolutionNow();
+  sample3.pc = ToPointer(0x1510);
+  sample3.frames_count = 3;
+  symbolized = symbolizer.SymbolizeTickSample(sample3);
+  profiles.AddPathToCurrentProfiles(sample3.timestamp, symbolized.stack_trace,
+                                    symbolized.src_line, true,
+                                    base::TimeDelta());
+  CHECK_EQ(1, mock_platform->posted_count());
+
+  // Teardown
+  profiles.StopProfiling("");
+  delete mock_platform;
+}
+
 TEST(NoSamples) {
   TestSetup test_setup;
   i::Isolate* isolate = CcTest::i_isolate();
diff --git a/tools/install_visual_studio_22.ps1 b/tools/install_visual_studio_22.ps1
index 9849141..86fd659 100644
--- a/tools/install_visual_studio_22.ps1
+++ b/tools/install_visual_studio_22.ps1
@@ -2,8 +2,12 @@
 
 New-Item -Path "C:\" -Name "src" -ItemType "directory" -Force
 
-Invoke-WebRequest -Uri https://aka.ms/vs/17/release/vs_professional.exe `
-    -OutFile C:\src\vs_professional.exe
+# Pins Visual Studio 2022 release version to 17.4.6 (includes Clang 15.0.1).
+# This should be kept in sync with the VS installer used in Build CI containers
+# defined in `docker/windows/base/visualstudio2022/Dockerfile`
+$VS_INSTALL_URL="https://download.visualstudio.microsoft.com/download/pr/d1ed8638-9e88-461e-92b7-4e29cc6172c3/30be9c2a5e40d5666eeae683e319b472c8bcc8231c7b346fe798f0ad0f7e498b/vs_Professional.exe"
+
+Invoke-WebRequest -Uri $VS_INSTALL_URL -OutFile C:\src\vs_professional.exe
 
 C:\src\vs_professional.exe --wait --installPath `
     "C:/Program Files (x86)/Microsoft Visual Studio/2022/Professional" `
diff --git a/tools/update_certs.py b/tools/update_certs.py
new file mode 100755
index 0000000..e3b33b8
--- /dev/null
+++ b/tools/update_certs.py
@@ -0,0 +1,138 @@
+#!/usr/bin/env python3
+# Copyright 2024 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tool for updating Cobalt SSL Certificates.
+
+Usage:
+  update_certs.py -r <cobalt_repo> -b <openssl_bin> -p <pem_files>
+
+Args:
+    cobalt_repo: The path to the Cobalt repository root.
+    openssl_bin: The path to the OpenSSL binary, defaults to "/usr/bin/openssl"
+      when not specified.
+    pem_files: The paths to the source pem files.
+"""
+
+import argparse
+import os
+import shutil
+import subprocess
+
+from typing import List
+from typing import Set
+
+_CERTS_PATH = 'cobalt/content/ssl/certs'
+_BUILD_PATH = 'cobalt/network/certs.gni'
+
+
+def SplitCerts(concatenated_cert_file: str) -> List[str]:
+  """Split concatenated .pem file into a list of individual certs."""
+  begin_anchor = '-----BEGIN CERTIFICATE-----'
+  end_anchor = '-----END CERTIFICATE-----'
+
+  cert_list = []
+  current_cert = ''
+  in_cert = False
+
+  for line in concatenated_cert_file:
+    if not in_cert and line.find(begin_anchor) != -1:
+      in_cert = True
+      current_cert += line
+    elif in_cert and line.find(end_anchor) != -1:
+      in_cert = False
+      current_cert += line
+      cert_list.append(current_cert)
+      current_cert = ''
+    elif in_cert:
+      current_cert += line
+
+  return cert_list
+
+
+def ComputeCertFilename(openssl_bin: str, cert: str) -> str:
+  """Use x509 to get the hashed filename for the individual cert."""
+  command_args = [openssl_bin, 'x509', '-subject_hash', '-noout']
+  output = subprocess.check_output(command_args, input=cert.encode('utf-8'))
+
+  return output.decode().rstrip() + '.0'
+
+
+def UpdateBuild(build_file: str, cert_filepaths: Set[str]) -> None:
+  cert_filepaths = list(cert_filepaths)
+  cert_filepaths.sort()
+
+  # Adds build file
+  cert_lines = ['network_certs = [\n']
+  cert_lines += [f'  "//{path}",\n' for path in cert_filepaths]
+  cert_lines += [']\n']
+  with open(build_file, 'w', encoding='utf-8') as f:
+    f.writelines(cert_lines)
+
+
+def UpdateCerts(certs_repo: str, openssl_bin: str, pem_files: str) -> None:
+  certs_path = os.path.join(certs_repo, _CERTS_PATH)
+
+  # Removes existing certs
+  if os.path.exists(certs_path):
+    shutil.rmtree(certs_path)
+  os.mkdir(certs_path)
+
+  # Adds certs
+  relative_filepaths = set()
+  for pem_file in pem_files:
+    cert_list = []
+    with open(pem_file, encoding='utf-8') as p:
+      cert_list = SplitCerts(p)
+    for cert in cert_list:
+      filename = ComputeCertFilename(openssl_bin, cert)
+      filepath = os.path.join(certs_path, filename)
+      relative_filepath = os.path.join(_CERTS_PATH, filename)
+      relative_filepaths.add(relative_filepath)
+      with open(filepath, 'w', encoding='utf-8') as f:
+        f.write(cert)
+
+  # Updates certs.gni with updated certs
+  build_file = os.path.join(certs_repo, _BUILD_PATH)
+  UpdateBuild(build_file, relative_filepaths)
+
+
+def main() -> None:
+  parser = argparse.ArgumentParser()
+  parser.add_argument(
+      '-r',
+      '--cobalt_repo',
+      type=str,
+      required=True,
+      help='The path to the Cobalt repository root.')
+  parser.add_argument(
+      '-b',
+      '--openssl_bin',
+      type=str,
+      required=False,
+      default='/usr/bin/openssl',
+      help='The path to the OpenSSL binary.')
+  parser.add_argument(
+      '-p',
+      '--pem_files',
+      type=str,
+      nargs='+',
+      required=True,
+      help='The paths to the source pem files.')
+  args = parser.parse_args()
+
+  UpdateCerts(args.cobalt_repo, args.openssl_bin, args.pem_files)
+
+
+if __name__ == '__main__':
+  main()
diff --git a/tools/update_certs_test.py b/tools/update_certs_test.py
new file mode 100644
index 0000000..469f375
--- /dev/null
+++ b/tools/update_certs_test.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python3
+# Copyright 2024 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Test for tool for updating Cobalt SSL Certificates."""
+
+import io
+import tempfile
+import unittest
+
+from tools import update_certs
+
+_CERT_NAME = '8cb5ee0f.0'
+_CERT = '''\
+-----BEGIN CERTIFICATE-----
+MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5
+MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
+Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
+A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
+Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl
+ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr
+ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr
+BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM
+YyRIHN8wfdVoOw==
+-----END CERTIFICATE-----
+'''
+
+
+class UpdateCertsTest(unittest.TestCase):
+
+  def testSplitCerts(self):
+    pem = io.StringIO(_CERT + _CERT)
+    output = update_certs.SplitCerts(pem)
+    self.assertEqual(len(output), 2)
+    self.assertEqual(output[0], _CERT)
+    self.assertEqual(output[1], _CERT)
+
+  def testUpdateBuild(self):
+    filepaths = {'foo', 'bar'}
+    build_content = '''\
+network_certs = [
+  "//bar",
+  "//foo",
+]
+'''
+    with tempfile.NamedTemporaryFile(delete=False) as tmp:
+      update_certs.UpdateBuild(tmp.name, filepaths)
+      with open(tmp.name, encoding='utf-8') as f:
+        self.assertEqual(f.read(), build_content)
+
+
+if __name__ == '__main__':
+  unittest.main()