diff --git a/.drone.yml b/.drone.yml
index d05a96ce6..308435177 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -154,7 +154,7 @@ steps:
     when:
       event:
         exclude:
-        - pull_request
+          - pull_request
 
   - name: publish-rootless
     image: plugins/docker:latest
@@ -176,7 +176,7 @@ steps:
     when:
       event:
         exclude:
-        - pull_request
+          - pull_request
 ---
 
 kind: pipeline
@@ -220,7 +220,7 @@ steps:
     when:
       event:
         exclude:
-        - pull_request
+          - pull_request
 
   - name: publish-rootless
     image: plugins/docker:latest
@@ -241,7 +241,7 @@ steps:
     when:
       event:
         exclude:
-        - pull_request
+          - pull_request
 
 ---
 kind: pipeline
@@ -289,7 +289,7 @@ steps:
     when:
       event:
         exclude:
-        - pull_request
+          - pull_request
 
   - name: publish-rootless
     image: plugins/docker:latest
@@ -311,7 +311,7 @@ steps:
     when:
       event:
         exclude:
-        - pull_request
+          - pull_request
 
 ---
 kind: pipeline
@@ -355,7 +355,7 @@ steps:
     when:
       event:
         exclude:
-        - pull_request
+          - pull_request
 
   - name: publish-rootless
     image: plugins/docker:latest
@@ -376,7 +376,7 @@ steps:
     when:
       event:
         exclude:
-        - pull_request
+          - pull_request
 
 ---
 kind: pipeline
@@ -413,7 +413,7 @@ steps:
 
 trigger:
   ref:
-  - "refs/tags/**"
+    - "refs/tags/**"
   paths:
     exclude:
       - "docs/**"
diff --git a/.eslintrc.yaml b/.eslintrc.yaml
index dd2c32eec..846823abc 100644
--- a/.eslintrc.yaml
+++ b/.eslintrc.yaml
@@ -156,7 +156,7 @@ rules:
   import/no-restricted-paths: [0]
   import/no-self-import: [2]
   import/no-unassigned-import: [0]
-  import/no-unresolved: [2, {commonjs: true, ignore: [\?.+$, ^vitest/]}]
+  import/no-unresolved: [2, {commonjs: true, ignore: ["\\?.+$", ^vitest/]}]
   import/no-unused-modules: [2, {unusedExports: true}]
   import/no-useless-path-segments: [2, {commonjs: true}]
   import/no-webpack-loader-syntax: [2]
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yaml b/.github/ISSUE_TEMPLATE/bug-report.yaml
index 1004c55de..c482affbb 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yaml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yaml
@@ -2,90 +2,90 @@ name: Bug Report
 description: Found something you weren't expecting? Report it here!
 labels: ["kind/bug"]
 body:
-- type: markdown
-  attributes:
-    value: |
-      NOTE: If your issue is a security concern, please send an email to security@gitea.io instead of opening a public issue.
-- type: markdown
-  attributes:
-    value: |
-      1. Please speak English, this is the language all maintainers can speak and write.
-      2. Please ask questions or configuration/deploy problems on our Discord
-         server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
-      3. Make sure you are using the latest release and
-         take a moment to check that your issue hasn't been reported before.
-      4. Make sure it's not mentioned in the FAQ (https://docs.gitea.com/help/faq)
-      5. It's really important to provide pertinent details and logs (https://docs.gitea.com/help/support),
-         incomplete details will be handled as an invalid report.
-- type: textarea
-  id: description
-  attributes:
-    label: Description
-    description: |
-      Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see below)
-      If you are using a proxy or a CDN (e.g. Cloudflare) in front of Gitea, please disable the proxy/CDN fully and access Gitea directly to confirm the issue still persists without those services.
-- type: input
-  id: gitea-ver
-  attributes:
-    label: Gitea Version
-    description: Gitea version (or commit reference) of your instance
-  validations:
-    required: true
-- type: dropdown
-  id: can-reproduce
-  attributes:
-    label: Can you reproduce the bug on the Gitea demo site?
-    description: |
-      If so, please provide a URL in the Description field
-      URL of Gitea demo: https://try.gitea.io
-    options:
-    - "Yes"
-    - "No"
-  validations:
-    required: true
-- type: markdown
-  attributes:
-    value: |
-      It's really important to provide pertinent logs
-      Please read https://docs.gitea.com/administration/logging-config#collecting-logs-for-help
-      In addition, if your problem relates to git commands set `RUN_MODE=dev` at the top of app.ini
-- type: input
-  id: logs
-  attributes:
-    label: Log Gist
-    description: Please provide a gist URL of your logs, with any sensitive information (e.g. API keys) removed/hidden
-- type: textarea
-  id: screenshots
-  attributes:
-    label: Screenshots
-    description: If this issue involves the Web Interface, please provide one or more screenshots
-- type: input
-  id: git-ver
-  attributes:
-    label: Git Version
-    description: The version of git running on the server
-- type: input
-  id: os-ver
-  attributes:
-    label: Operating System
-    description: The operating system you are using to run Gitea
-- type: textarea
-  id: run-info
-  attributes:
-    label: How are you running Gitea?
-    description: |
-      Please include information on whether you built Gitea yourself, used one of our downloads, are using https://try.gitea.io or are using some other package
-      Please also tell us how you are running Gitea, e.g. if it is being run from docker, a command-line, systemd etc.
-      If you are using a package or systemd tell us what distribution you are using
-  validations:
-    required: true
-- type: dropdown
-  id: database
-  attributes:
-    label: Database
-    description: What database system are you running?
-    options:
-    - PostgreSQL
-    - MySQL/MariaDB
-    - MSSQL
-    - SQLite
+  - type: markdown
+    attributes:
+      value: |
+        NOTE: If your issue is a security concern, please send an email to security@gitea.io instead of opening a public issue.
+  - type: markdown
+    attributes:
+      value: |
+        1. Please speak English, this is the language all maintainers can speak and write.
+        2. Please ask questions or configuration/deploy problems on our Discord
+           server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
+        3. Make sure you are using the latest release and
+           take a moment to check that your issue hasn't been reported before.
+        4. Make sure it's not mentioned in the FAQ (https://docs.gitea.com/help/faq)
+        5. It's really important to provide pertinent details and logs (https://docs.gitea.com/help/support),
+           incomplete details will be handled as an invalid report.
+  - type: textarea
+    id: description
+    attributes:
+      label: Description
+      description: |
+        Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see below)
+        If you are using a proxy or a CDN (e.g. Cloudflare) in front of Gitea, please disable the proxy/CDN fully and access Gitea directly to confirm the issue still persists without those services.
+  - type: input
+    id: gitea-ver
+    attributes:
+      label: Gitea Version
+      description: Gitea version (or commit reference) of your instance
+    validations:
+      required: true
+  - type: dropdown
+    id: can-reproduce
+    attributes:
+      label: Can you reproduce the bug on the Gitea demo site?
+      description: |
+        If so, please provide a URL in the Description field
+        URL of Gitea demo: https://try.gitea.io
+      options:
+        - "Yes"
+        - "No"
+    validations:
+      required: true
+  - type: markdown
+    attributes:
+      value: |
+        It's really important to provide pertinent logs
+        Please read https://docs.gitea.com/administration/logging-config#collecting-logs-for-help
+        In addition, if your problem relates to git commands set `RUN_MODE=dev` at the top of app.ini
+  - type: input
+    id: logs
+    attributes:
+      label: Log Gist
+      description: Please provide a gist URL of your logs, with any sensitive information (e.g. API keys) removed/hidden
+  - type: textarea
+    id: screenshots
+    attributes:
+      label: Screenshots
+      description: If this issue involves the Web Interface, please provide one or more screenshots
+  - type: input
+    id: git-ver
+    attributes:
+      label: Git Version
+      description: The version of git running on the server
+  - type: input
+    id: os-ver
+    attributes:
+      label: Operating System
+      description: The operating system you are using to run Gitea
+  - type: textarea
+    id: run-info
+    attributes:
+      label: How are you running Gitea?
+      description: |
+        Please include information on whether you built Gitea yourself, used one of our downloads, are using https://try.gitea.io or are using some other package
+        Please also tell us how you are running Gitea, e.g. if it is being run from docker, a command-line, systemd etc.
+        If you are using a package or systemd tell us what distribution you are using
+    validations:
+      required: true
+  - type: dropdown
+    id: database
+    attributes:
+      label: Database
+      description: What database system are you running?
+      options:
+        - PostgreSQL
+        - MySQL/MariaDB
+        - MSSQL
+        - SQLite
diff --git a/.github/ISSUE_TEMPLATE/feature-request.yaml b/.github/ISSUE_TEMPLATE/feature-request.yaml
index b481e0c2d..71aaa0942 100644
--- a/.github/ISSUE_TEMPLATE/feature-request.yaml
+++ b/.github/ISSUE_TEMPLATE/feature-request.yaml
@@ -2,23 +2,23 @@ name: Feature Request
 description: Got an idea for a feature that Gitea doesn't have currently?  Submit your idea here!
 labels: ["kind/proposal"]
 body:
-- type: markdown
-  attributes:
-    value: |
-      1. Please speak English, this is the language all maintainers can speak and write.
-      2. Please ask questions or configuration/deploy problems on our Discord
-         server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
-      3. Please take a moment to check that your feature hasn't already been suggested.
-- type: textarea
-  id: description
-  attributes:
-    label: Feature Description
-    placeholder: |
-      I think it would be great if Gitea had...
-  validations:
-    required: true
-- type: textarea
-  id: screenshots
-  attributes:
-    label: Screenshots
-    description: If you can, provide screenshots of an implementation on another site e.g. GitHub
+  - type: markdown
+    attributes:
+      value: |
+        1. Please speak English, this is the language all maintainers can speak and write.
+        2. Please ask questions or configuration/deploy problems on our Discord
+           server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
+        3. Please take a moment to check that your feature hasn't already been suggested.
+  - type: textarea
+    id: description
+    attributes:
+      label: Feature Description
+      placeholder: |
+        I think it would be great if Gitea had...
+    validations:
+      required: true
+  - type: textarea
+    id: screenshots
+    attributes:
+      label: Screenshots
+      description: If you can, provide screenshots of an implementation on another site e.g. GitHub
diff --git a/.github/ISSUE_TEMPLATE/ui.bug-report.yaml b/.github/ISSUE_TEMPLATE/ui.bug-report.yaml
index d5c41bb83..ef0a1014e 100644
--- a/.github/ISSUE_TEMPLATE/ui.bug-report.yaml
+++ b/.github/ISSUE_TEMPLATE/ui.bug-report.yaml
@@ -2,65 +2,65 @@ name: Web Interface Bug Report
 description: Something doesn't look quite as it should?  Report it here!
 labels: ["kind/bug", "kind/ui"]
 body:
-- type: markdown
-  attributes:
-    value: |
-      NOTE: If your issue is a security concern, please send an email to security@gitea.io instead of opening a public issue.
-- type: markdown
-  attributes:
-    value: |
-      1. Please speak English, this is the language all maintainers can speak and write.
-      2. Please ask questions or configuration/deploy problems on our Discord
-         server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
-      3. Please take a moment to check that your issue doesn't already exist.
-      4. Make sure it's not mentioned in the FAQ (https://docs.gitea.com/help/faq)
-      5. Please give all relevant information below for bug reports, because
-         incomplete details will be handled as an invalid report.
-      6. In particular it's really important to provide pertinent logs. If you are certain that this is a javascript
-         error, show us the javascript console. If the error appears to relate to Gitea the server you must also give us
-         DEBUG level logs. (See https://docs.gitea.com/administration/logging-config#collecting-logs-for-help)
-- type: textarea
-  id: description
-  attributes:
-    label: Description
-    description: |
-      Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see below)
-      If using a proxy or a CDN (e.g. CloudFlare) in front of gitea, please disable the proxy/CDN fully and connect to gitea directly to confirm the issue still persists without those services.
-- type: textarea
-  id: screenshots
-  attributes:
-    label: Screenshots
-    description: Please provide at least 1 screenshot showing the issue.
-  validations:
-    required: true
-- type: input
-  id: gitea-ver
-  attributes:
-    label: Gitea Version
-    description: Gitea version (or commit reference) your instance is running
-  validations:
-    required: true
-- type: dropdown
-  id: can-reproduce
-  attributes:
-    label: Can you reproduce the bug on the Gitea demo site?
-    description: |
-      If so, please provide a URL in the Description field
-      URL of Gitea demo: https://try.gitea.io
-    options:
-    - "Yes"
-    - "No"
-  validations:
-    required: true
-- type: input
-  id: os-ver
-  attributes:
-    label: Operating System
-    description: The operating system you are using to access Gitea
-- type: input
-  id: browser-ver
-  attributes:
-    label: Browser Version
-    description: The browser and version that you are using to access Gitea
-  validations:
-    required: true
+  - type: markdown
+    attributes:
+      value: |
+        NOTE: If your issue is a security concern, please send an email to security@gitea.io instead of opening a public issue.
+  - type: markdown
+    attributes:
+      value: |
+        1. Please speak English, this is the language all maintainers can speak and write.
+        2. Please ask questions or configuration/deploy problems on our Discord
+           server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
+        3. Please take a moment to check that your issue doesn't already exist.
+        4. Make sure it's not mentioned in the FAQ (https://docs.gitea.com/help/faq)
+        5. Please give all relevant information below for bug reports, because
+           incomplete details will be handled as an invalid report.
+        6. In particular it's really important to provide pertinent logs. If you are certain that this is a javascript
+           error, show us the javascript console. If the error appears to relate to Gitea the server you must also give us
+           DEBUG level logs. (See https://docs.gitea.com/administration/logging-config#collecting-logs-for-help)
+  - type: textarea
+    id: description
+    attributes:
+      label: Description
+      description: |
+        Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see below)
+        If using a proxy or a CDN (e.g. CloudFlare) in front of gitea, please disable the proxy/CDN fully and connect to gitea directly to confirm the issue still persists without those services.
+  - type: textarea
+    id: screenshots
+    attributes:
+      label: Screenshots
+      description: Please provide at least 1 screenshot showing the issue.
+    validations:
+      required: true
+  - type: input
+    id: gitea-ver
+    attributes:
+      label: Gitea Version
+      description: Gitea version (or commit reference) your instance is running
+    validations:
+      required: true
+  - type: dropdown
+    id: can-reproduce
+    attributes:
+      label: Can you reproduce the bug on the Gitea demo site?
+      description: |
+        If so, please provide a URL in the Description field
+        URL of Gitea demo: https://try.gitea.io
+      options:
+        - "Yes"
+        - "No"
+    validations:
+      required: true
+  - type: input
+    id: os-ver
+    attributes:
+      label: Operating System
+      description: The operating system you are using to access Gitea
+  - type: input
+    id: browser-ver
+    attributes:
+      label: Browser Version
+      description: The browser and version that you are using to access Gitea
+    validations:
+      required: true
diff --git a/.github/labeler.yml b/.github/labeler.yml
index c9ee8a9e5..4b4fc91e3 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -22,3 +22,4 @@ kind/lint:
   - ".markdownlint.yaml"
   - ".spectral.yaml"
   - ".stylelintrc.yaml"
+  - ".yamllint.yaml"
diff --git a/.github/stale.yml b/.github/stale.yml
index 6a9f341cb..ebe95acf5 100644
--- a/.github/stale.yml
+++ b/.github/stale.yml
@@ -9,8 +9,8 @@ daysUntilClose: 14
 
 # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
 exemptLabels:
-  - status/blocked 
-  - kind/security 
+  - status/blocked
+  - kind/security
   - lgtm/done
   - reviewed/confirmed
   - priority/critical
@@ -27,7 +27,7 @@ staleLabel: stale
 
 # Comment to post when marking as stale. Set to `false` to disable
 markComment: >
-  This issue has been automatically marked as stale because it has not had recent activity. 
+  This issue has been automatically marked as stale because it has not had recent activity.
   I am here to help clear issues left open even if solved or waiting for more insight.
   This issue will be closed if no further activity occurs during the next 2 weeks.
   If the issue is still valid just add a comment to keep it alive.
diff --git a/.github/workflows/files-changed.yml b/.github/workflows/files-changed.yml
index 24de4076f..48db7a732 100644
--- a/.github/workflows/files-changed.yml
+++ b/.github/workflows/files-changed.yml
@@ -17,6 +17,8 @@ on:
         value: ${{ jobs.detect.outputs.docker }}
       swagger:
         value: ${{ jobs.detect.outputs.swagger }}
+      yaml:
+        value: ${{ jobs.detect.outputs.yaml }}
 
 jobs:
   detect:
@@ -30,6 +32,7 @@ jobs:
       templates: ${{ steps.changes.outputs.templates }}
       docker: ${{ steps.changes.outputs.docker }}
       swagger: ${{ steps.changes.outputs.swagger }}
+      yaml: ${{ steps.changes.outputs.yaml }}
     steps:
       - uses: actions/checkout@v3
       - uses: dorny/paths-filter@v2
@@ -82,3 +85,8 @@ jobs:
               - "package.json"
               - "package-lock.json"
               - ".spectral.yaml"
+
+            yaml:
+              - "**/*.yml"
+              - "**/*.yaml"
+              - ".yamllint.yaml"
diff --git a/.github/workflows/pull-compliance.yml b/.github/workflows/pull-compliance.yml
index 45dd77fd9..bcbd21884 100644
--- a/.github/workflows/pull-compliance.yml
+++ b/.github/workflows/pull-compliance.yml
@@ -39,6 +39,19 @@ jobs:
       - run: make deps-py
       - run: make lint-templates
 
+  lint-yaml:
+    if: needs.files-changed.outputs.yaml == 'true'
+    needs: files-changed
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - uses: actions/setup-python@v4
+        with:
+          python-version: "3.11"
+      - run: pip install poetry
+      - run: make deps-py
+      - run: make lint-yaml
+
   lint-swagger:
     if: needs.files-changed.outputs.swagger == 'true'
     needs: files-changed
diff --git a/.github/workflows/pull-db-tests.yml b/.github/workflows/pull-db-tests.yml
index 50c92a9e9..bbe589d5c 100644
--- a/.github/workflows/pull-db-tests.yml
+++ b/.github/workflows/pull-db-tests.yml
@@ -88,7 +88,7 @@ jobs:
       mysql:
         image: mysql:5.7
         env:
-          MYSQL_ALLOW_EMPTY_PASSWORD: yes
+          MYSQL_ALLOW_EMPTY_PASSWORD: true
           MYSQL_DATABASE: test
         ports:
           - "3306:3306"
@@ -160,7 +160,7 @@ jobs:
       mysql:
         image: mysql:5.7
         env:
-          MYSQL_ALLOW_EMPTY_PASSWORD: yes
+          MYSQL_ALLOW_EMPTY_PASSWORD: true
           MYSQL_DATABASE: test
         ports:
           - "3306:3306"
@@ -205,7 +205,7 @@ jobs:
       mysql8:
         image: mysql:8
         env:
-          MYSQL_ALLOW_EMPTY_PASSWORD: yes
+          MYSQL_ALLOW_EMPTY_PASSWORD: true
           MYSQL_DATABASE: testgitea
         ports:
           - "3306:3306"
diff --git a/.yamllint.yaml b/.yamllint.yaml
new file mode 100644
index 000000000..c0fce7c30
--- /dev/null
+++ b/.yamllint.yaml
@@ -0,0 +1,48 @@
+extends: default
+
+rules:
+  braces:
+    min-spaces-inside: 0
+    max-spaces-inside: 1
+    min-spaces-inside-empty: 0
+    max-spaces-inside-empty: 0
+
+  brackets:
+    min-spaces-inside: 0
+    max-spaces-inside: 1
+    min-spaces-inside-empty: 0
+    max-spaces-inside-empty: 0
+
+  comments:
+    require-starting-space: true
+    ignore-shebangs: true
+    min-spaces-from-content: 1
+
+  comments-indentation:
+    level: error
+
+  document-start:
+    level: error
+    present: false
+    ignore: |
+      /.drone.yml
+
+  document-end:
+    present: false
+
+  empty-lines:
+    max: 1
+
+  indentation:
+    spaces: 2
+
+  line-length: disable
+
+  truthy:
+    allowed-values: ["true", "false", "on", "off"]
+
+ignore: |
+  .venv
+  node_modules
+  /models/fixtures
+  /models/migrations/fixtures
diff --git a/Makefile b/Makefile
index 908ee7a33..fd852cbaf 100644
--- a/Makefile
+++ b/Makefile
@@ -218,6 +218,7 @@ help:
 	@echo " - lint-md                          lint markdown files"
 	@echo " - lint-swagger                     lint swagger files"
 	@echo " - lint-templates                   lint template files"
+	@echo " - lint-yaml                        lint yaml files"
 	@echo " - checks                           run various consistency checks"
 	@echo " - checks-frontend                  check frontend files"
 	@echo " - checks-backend                   check backend files"
@@ -427,6 +428,10 @@ lint-actions:
 lint-templates: .venv
 	@poetry run djlint $(shell find templates -type f -iname '*.tmpl')
 
+.PHONY: lint-yaml
+lint-yaml: .venv
+	@poetry run yamllint .
+
 .PHONY: watch
 watch:
 	@bash build/watch.sh
diff --git a/poetry.lock b/poetry.lock
index 69fc27b10..0b221b932 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand.
 
 [[package]]
 name = "click"
@@ -325,7 +325,25 @@ notebook = ["ipywidgets (>=6)"]
 slack = ["slack-sdk"]
 telegram = ["requests"]
 
+[[package]]
+name = "yamllint"
+version = "1.32.0"
+description = "A linter for YAML files."
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "yamllint-1.32.0-py3-none-any.whl", hash = "sha256:d97a66e48da820829d96077d76b8dfbe6c6140f106e558dae87e81ac4e6b30b7"},
+    {file = "yamllint-1.32.0.tar.gz", hash = "sha256:d01dde008c65de5b235188ab3110bebc59d18e5c65fc8a58267cd211cd9df34a"},
+]
+
+[package.dependencies]
+pathspec = ">=0.5.3"
+pyyaml = "*"
+
+[package.extras]
+dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"]
+
 [metadata]
 lock-version = "2.0"
 python-versions = "^3.8"
-content-hash = "1b154f70c35b75d47c843959af9df0e7343f3bb579835825ca889ec9350afc41"
+content-hash = "4017ac7637dcc0703b37f8dc640d3e11e67e60c7b14660838135cff38ad91656"
diff --git a/pyproject.toml b/pyproject.toml
index f4cd2e674..63143a72a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -9,6 +9,7 @@ python = "^3.8"
 
 [tool.poetry.group.dev.dependencies]
 djlint = "1.32.1"
+yamllint = "^1.32.0"
 
 [tool.djlint]
 profile="golang"