diff -pruN 1:6.0.0-1/.github/workflows/release.yml 1:6.1.0-1/.github/workflows/release.yml
--- 1:6.0.0-1/.github/workflows/release.yml	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/.github/workflows/release.yml	2025-10-30 19:33:25.000000000 +0000
@@ -13,9 +13,9 @@ jobs:
     runs-on: ubuntu-latest
 
     steps:
-    - uses: actions/checkout@v4
+    - uses: actions/checkout@v5
     - name: Set up Python
-      uses: actions/setup-python@v5
+      uses: actions/setup-python@v6
       with:
         python-version: "3.x"
     - name: Install pypa/build
@@ -24,7 +24,7 @@ jobs:
     - name: Build a binary wheel and a source tarball
       run: python3 -m build
     - name: Store the distribution packages
-      uses: actions/upload-artifact@v4
+      uses: actions/upload-artifact@v5
       with:
         name: python-package-distributions
         path: dist/
@@ -43,12 +43,12 @@ jobs:
       id-token: write  # IMPORTANT: mandatory for trusted publishing
     steps:
     - name: Download all the dists
-      uses: actions/download-artifact@v4
+      uses: actions/download-artifact@v6
       with:
         name: python-package-distributions
         path: dist/
     - name: Publish distribution 📦 to PyPI
-      uses: pypa/gh-action-pypi-publish@release/v1.12
+      uses: pypa/gh-action-pypi-publish@release/v1.13
 
   github-release:
     name: >-
@@ -64,12 +64,12 @@ jobs:
 
     steps:
     - name: Download all the dists
-      uses: actions/download-artifact@v4
+      uses: actions/download-artifact@v6
       with:
         name: python-package-distributions
         path: dist/
     - name: Sign the dists with Sigstore
-      uses: sigstore/gh-action-sigstore-python@v3.0.1
+      uses: sigstore/gh-action-sigstore-python@v3.1.0
       with:
         inputs: >-
           ./dist/*.tar.gz
@@ -109,12 +109,12 @@ jobs:
 
     steps:
     - name: Download all the dists
-      uses: actions/download-artifact@v4
+      uses: actions/download-artifact@v6
       with:
         name: python-package-distributions
         path: dist/
     - name: Publish distribution 📦 to TestPyPI
-      uses: pypa/gh-action-pypi-publish@release/v1.12
+      uses: pypa/gh-action-pypi-publish@release/v1.13
       with:
         repository-url: https://test.pypi.org/legacy/
         skip-existing: true
diff -pruN 1:6.0.0-1/.github/workflows/test.yml 1:6.1.0-1/.github/workflows/test.yml
--- 1:6.0.0-1/.github/workflows/test.yml	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/.github/workflows/test.yml	2025-10-30 19:33:25.000000000 +0000
@@ -14,7 +14,7 @@ jobs:
       fail-fast: false
       max-parallel: 5
       matrix:
-        python-version: ['3.9', '3.10', '3.11', '3.12', '3.13']
+        python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
 
     services:
       mariadb:
@@ -30,10 +30,10 @@ jobs:
         - 3306:3306
 
     steps:
-    - uses: actions/checkout@v4
+    - uses: actions/checkout@v5
 
     - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v5
+      uses: actions/setup-python@v6
       with:
         python-version: ${{ matrix.python-version }}
         allow-prereleases: true
@@ -73,25 +73,37 @@ jobs:
       fail-fast: false
       max-parallel: 5
       matrix:
-        # Skip 3.13 here, it needs the psycopg3 / postgis3 database
-        python-version: ['3.9', '3.10', '3.11', '3.12']
-        database: [postgresql, postgis]
-        # Add psycopg3 to our matrix for modern python versions
-        include:
-            - python-version: '3.10'
-              database: psycopg3
-            - python-version: '3.11'
-              database: psycopg3
-            - python-version: '3.12'
+        python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
+        database: [postgresql, postgis, psycopg3]
+        exclude:
+            - python-version: '3.9'
               database: psycopg3
             - python-version: '3.13'
-              database: psycopg3
+              database: postgis
+            - python-version: '3.13'
+              database: postgresql
+            - python-version: '3.14'
+              database: postgis
+            - python-version: '3.14'
+              database: postgresql
+        # Add postgis3 to our matrix for modern Python versions
+        include:
             - python-version: '3.13'
               database: postgis3
+            - python-version: '3.13'
+              database: psycopg3
+              env:
+                DJANGO_SELENIUM_TESTS=true
+            - python-version: '3.14'
+              database: postgis3
+            - python-version: '3.14'
+              database: psycopg3
+              env:
+                DJANGO_SELENIUM_TESTS=true
 
     services:
       postgres:
-        image: postgis/postgis:14-3.1
+        image: postgis/postgis:17-3.5
         env:
           POSTGRES_DB: debug_toolbar
           POSTGRES_USER: debug_toolbar
@@ -105,10 +117,10 @@ jobs:
           --health-retries 5
 
     steps:
-    - uses: actions/checkout@v4
+    - uses: actions/checkout@v5
 
     - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v5
+      uses: actions/setup-python@v6
       with:
         python-version: ${{ matrix.python-version }}
         allow-prereleases: true
@@ -143,6 +155,7 @@ jobs:
         DB_BACKEND: ${{ matrix.database }}
         DB_HOST: localhost
         DB_PORT: 5432
+        DJANGO_SELENIUM_TESTS: ${{ matrix.env.DJANGO_SELENIUM_TESTS }}
 
   sqlite:
     runs-on: ubuntu-latest
@@ -150,13 +163,13 @@ jobs:
       fail-fast: false
       max-parallel: 5
       matrix:
-        python-version: ['3.9', '3.10', '3.11', '3.12', '3.13']
+        python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
 
     steps:
-    - uses: actions/checkout@v4
+    - uses: actions/checkout@v5
 
     - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v5
+      uses: actions/setup-python@v6
       with:
         python-version: ${{ matrix.python-version }}
         allow-prereleases: true
@@ -192,10 +205,10 @@ jobs:
       fail-fast: false
 
     steps:
-    - uses: actions/checkout@v4
+    - uses: actions/checkout@v5
 
     - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v5
+      uses: actions/setup-python@v6
       with:
         python-version: 3.9
 
diff -pruN 1:6.0.0-1/.gitignore 1:6.1.0-1/.gitignore
--- 1:6.0.0-1/.gitignore	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/.gitignore	2025-10-30 19:33:25.000000000 +0000
@@ -15,4 +15,5 @@ coverage.xml
 venv
 .direnv/
 .envrc
-venv
+.venv
+.vscode
diff -pruN 1:6.0.0-1/.pre-commit-config.yaml 1:6.1.0-1/.pre-commit-config.yaml
--- 1:6.0.0-1/.pre-commit-config.yaml	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/.pre-commit-config.yaml	2025-10-30 19:33:25.000000000 +0000
@@ -1,6 +1,6 @@
 repos:
 -   repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v5.0.0
+    rev: v6.0.0
     hooks:
     -   id: check-toml
     -   id: check-yaml
@@ -14,12 +14,12 @@ repos:
     hooks:
     -   id: doc8
 -   repo: https://github.com/adamchainz/django-upgrade
-    rev: 1.25.0
+    rev: 1.29.1
     hooks:
     -   id: django-upgrade
         args: [--target-version, "4.2"]
 -   repo: https://github.com/adamchainz/djade-pre-commit
-    rev: "1.4.0"
+    rev: "1.6.0"
     hooks:
     -   id: djade
         args: [--target-version, "4.2"]
@@ -29,18 +29,18 @@ repos:
     -   id: rst-backticks
     -   id: rst-directive-colons
 -   repo: https://github.com/biomejs/pre-commit
-    rev: v2.1.2
+    rev: v2.3.1
     hooks:
       - id: biome-check
         verbose: true
 -   repo: https://github.com/astral-sh/ruff-pre-commit
-    rev: 'v0.12.4'
+    rev: 'v0.14.2'
     hooks:
       - id: ruff
         args: [--fix, --exit-non-zero-on-fix]
       - id: ruff-format
 -   repo: https://github.com/tox-dev/pyproject-fmt
-    rev: v2.6.0
+    rev: v2.11.0
     hooks:
       - id: pyproject-fmt
 -   repo: https://github.com/abravalheri/validate-pyproject
diff -pruN 1:6.0.0-1/README.rst 1:6.1.0-1/README.rst
--- 1:6.0.0-1/README.rst	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/README.rst	2025-10-30 19:33:25.000000000 +0000
@@ -40,7 +40,7 @@ Here's a screenshot of the toolbar in ac
 In addition to the built-in panels, a number of third-party panels are
 contributed by the community.
 
-The current stable version of the Debug Toolbar is 6.0.0. It works on
+The current stable version of the Debug Toolbar is 6.1.0. It works on
 Django ≥ 4.2.0.
 
 The Debug Toolbar has experimental support for `Django's asynchronous views
diff -pruN 1:6.0.0-1/biome.json 1:6.1.0-1/biome.json
--- 1:6.0.0-1/biome.json	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/biome.json	2025-10-30 19:33:25.000000000 +0000
@@ -1,5 +1,5 @@
 {
-    "$schema": "https://biomejs.dev/schemas/2.0.6/schema.json",
+    "$schema": "https://biomejs.dev/schemas/2.2.3/schema.json",
     "formatter": {
         "enabled": true,
         "useEditorconfig": true
@@ -15,6 +15,9 @@
         "enabled": true,
         "rules": {
             "recommended": true,
+            "complexity": {
+                "noImportantStyles": "off"
+            },
             "correctness": {
                 "noUndeclaredVariables": "error"
             },
diff -pruN 1:6.0.0-1/debian/changelog 1:6.1.0-1/debian/changelog
--- 1:6.0.0-1/debian/changelog	2025-08-16 13:34:10.000000000 +0000
+++ 1:6.1.0-1/debian/changelog	2025-11-03 15:46:26.000000000 +0000
@@ -1,3 +1,11 @@
+python-django-debug-toolbar (1:6.1.0-1) unstable; urgency=medium
+
+  * Team upload.
+  * [0c4d1fe] d/watch: Convert to version 5
+  * [e442fd0] New upstream version 6.1.0
+
+ -- Carsten Schoenert <c.schoenert@t-online.de>  Mon, 03 Nov 2025 17:46:26 +0200
+
 python-django-debug-toolbar (1:6.0.0-1) unstable; urgency=medium
 
   * [1a2fc43] New upstream version 6.0.0
diff -pruN 1:6.0.0-1/debian/watch 1:6.1.0-1/debian/watch
--- 1:6.0.0-1/debian/watch	2025-01-12 07:38:58.000000000 +0000
+++ 1:6.1.0-1/debian/watch	2025-09-12 15:54:15.000000000 +0000
@@ -1,9 +1,8 @@
-version=4
+Version: 5
 
-opts="compression=gz, \
-      pgpmode=none, \
-      mode=git, \
-	  uversionmangle=s/(\d)[_\.\-\+]?((alpha|beta|post|pre|dev|RC|rc)\.?\d*)$/$1~$2/, \
-      dversionmangle=s/\+(debian|dfsg|ds|deb)([\.\d]+)?$//" \
-https://github.com/jazzband/django-debug-toolbar.git \
-      refs/tags/@ANY_VERSION@
+Source: https://github.com/jazzband/django-debug-toolbar.git
+Matching-Pattern: refs/tags/@ANY_VERSION@
+Compression: gz
+Dversionmangle: s/\+(debian|dfsg|ds|deb)([\.\d]+)?$//
+Mode: git
+Pgpmode: none
diff -pruN 1:6.0.0-1/debug_toolbar/__init__.py 1:6.1.0-1/debug_toolbar/__init__.py
--- 1:6.0.0-1/debug_toolbar/__init__.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/__init__.py	2025-10-30 19:33:25.000000000 +0000
@@ -4,7 +4,7 @@ APP_NAME = "djdt"
 
 # Do not use pkg_resources to find the version but set it here directly!
 # see issue #1446
-VERSION = "6.0.0"
+VERSION = "6.1.0"
 
 # Code that discovers files or modules in INSTALLED_APPS imports this module.
 urls = "debug_toolbar.urls", APP_NAME
diff -pruN 1:6.0.0-1/debug_toolbar/apps.py 1:6.1.0-1/debug_toolbar/apps.py
--- 1:6.0.0-1/debug_toolbar/apps.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/apps.py	2025-10-30 19:33:25.000000000 +0000
@@ -24,6 +24,35 @@ class DebugToolbarConfig(AppConfig):
         # allows panels like CachePanel to enable their instrumentation immediately.
         for cls in DebugToolbar.get_panel_classes():
             cls.ready()
+        _manage_migrations_visibility(self.name)
+
+    def import_models(self):
+        """
+        Override import models to avoid allowing users to dynamically fetch a model
+        that doesn't have a table behind it unless they are using the DatabaseStore.
+        This also prevents the command `migrate --run-syncdb` from creating tables
+        for the models.
+        """
+        dt_config = dt_settings.get_config()
+        if dt_config["TOOLBAR_STORE_CLASS"] == "debug_toolbar.store.DatabaseStore":
+            return super().import_models()
+        # Not using the database store, don't import the models
+        self.models = {}
+
+
+def _manage_migrations_visibility(app_name):
+    """
+    Adjust the toolbar's migration visibility by manipulating the
+    project's settings.
+
+    This is a hack since it's manipulating settings.
+    """
+    if (
+        dt_settings.get_config()["TOOLBAR_STORE_CLASS"]
+        != "debug_toolbar.store.DatabaseStore"
+    ):
+        # This effectively hides the migrations by telling Django they don't exist.
+        settings.MIGRATION_MODULES.setdefault(app_name, None)
 
 
 def check_template_config(config):
diff -pruN 1:6.0.0-1/debug_toolbar/forms.py 1:6.1.0-1/debug_toolbar/forms.py
--- 1:6.0.0-1/debug_toolbar/forms.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/forms.py	2025-10-30 19:33:25.000000000 +0000
@@ -3,7 +3,8 @@ import json
 from django import forms
 from django.core import signing
 from django.core.exceptions import ValidationError
-from django.utils.encoding import force_str
+
+from debug_toolbar.sanitize import force_str
 
 
 class SignedDataForm(forms.Form):
diff -pruN 1:6.0.0-1/debug_toolbar/locale/en/LC_MESSAGES/django.po 1:6.1.0-1/debug_toolbar/locale/en/LC_MESSAGES/django.po
--- 1:6.0.0-1/debug_toolbar/locale/en/LC_MESSAGES/django.po	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/locale/en/LC_MESSAGES/django.po	2025-10-30 19:33:25.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Django Debug Toolbar\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"POT-Creation-Date: 2025-10-16 19:11-0500\n"
 "PO-Revision-Date: 2012-03-31 20:10+0000\n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -20,6 +20,14 @@ msgstr ""
 msgid "Debug Toolbar"
 msgstr ""
 
+#: models.py:11
+msgid "history entry"
+msgstr ""
+
+#: models.py:12
+msgid "history entries"
+msgstr ""
+
 #: panels/alerts.py:67
 #, python-brace-format
 msgid ""
@@ -44,37 +52,41 @@ msgstr ""
 msgid "Alerts"
 msgstr ""
 
-#: panels/cache.py:168
+#: panels/cache.py:170
 msgid "Cache"
 msgstr ""
 
-#: panels/cache.py:174
+#: panels/cache.py:177
 #, python-format
 msgid "%(cache_calls)d call in %(time).2fms"
 msgid_plural "%(cache_calls)d calls in %(time).2fms"
 msgstr[0] ""
 msgstr[1] ""
 
-#: panels/cache.py:183
+#: panels/cache.py:186
 #, python-format
 msgid "Cache calls from %(count)d backend"
 msgid_plural "Cache calls from %(count)d backends"
 msgstr[0] ""
 msgstr[1] ""
 
+#: panels/community.py:13
+msgid "Community"
+msgstr ""
+
 #: panels/headers.py:31
 msgid "Headers"
 msgstr ""
 
-#: panels/history/panel.py:19 panels/history/panel.py:20
+#: panels/history/panel.py:20 panels/history/panel.py:21
 msgid "History"
 msgstr ""
 
-#: panels/profiling.py:140
+#: panels/profiling.py:156
 msgid "Profiling"
 msgstr ""
 
-#: panels/redirects.py:17
+#: panels/redirects.py:18
 msgid "Intercept redirects"
 msgstr ""
 
@@ -82,125 +94,133 @@ msgstr ""
 msgid "Request"
 msgstr ""
 
-#: panels/request.py:38
+#: panels/request.py:36
 msgid "<no view>"
 msgstr ""
 
-#: panels/request.py:55
+#: panels/request.py:53
 msgid "<unavailable>"
 msgstr ""
 
-#: panels/settings.py:17
+#: panels/settings.py:19
 msgid "Settings"
 msgstr ""
 
-#: panels/settings.py:20
+#: panels/settings.py:22
 #, python-format
 msgid "Settings from %s"
 msgstr ""
 
-#: panels/signals.py:57
+#: panels/signals.py:59
 #, python-format
 msgid "%(num_receivers)d receiver of 1 signal"
 msgid_plural "%(num_receivers)d receivers of 1 signal"
 msgstr[0] ""
 msgstr[1] ""
 
-#: panels/signals.py:62
+#: panels/signals.py:64
 #, python-format
 msgid "%(num_receivers)d receiver of %(num_signals)d signals"
 msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
 msgstr[0] ""
 msgstr[1] ""
 
-#: panels/signals.py:67
+#: panels/signals.py:69
 msgid "Signals"
 msgstr ""
 
-#: panels/sql/panel.py:30 panels/sql/panel.py:41
+#: panels/sql/forms.py:56
+msgid "Data for this panel isn't available anymore."
+msgstr ""
+
+#: panels/sql/forms.py:68
+msgid "Invalid query id."
+msgstr ""
+
+#: panels/sql/panel.py:32 panels/sql/panel.py:43
 msgid "Read uncommitted"
 msgstr ""
 
-#: panels/sql/panel.py:31 panels/sql/panel.py:43
+#: panels/sql/panel.py:33 panels/sql/panel.py:45
 msgid "Read committed"
 msgstr ""
 
-#: panels/sql/panel.py:32 panels/sql/panel.py:45
+#: panels/sql/panel.py:34 panels/sql/panel.py:47
 msgid "Repeatable read"
 msgstr ""
 
-#: panels/sql/panel.py:33 panels/sql/panel.py:47
+#: panels/sql/panel.py:35 panels/sql/panel.py:49
 msgid "Serializable"
 msgstr ""
 
-#: panels/sql/panel.py:39
+#: panels/sql/panel.py:41
 msgid "Autocommit"
 msgstr ""
 
-#: panels/sql/panel.py:61 panels/sql/panel.py:71
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
 msgid "Idle"
 msgstr ""
 
-#: panels/sql/panel.py:62 panels/sql/panel.py:72
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
 msgid "Active"
 msgstr ""
 
-#: panels/sql/panel.py:63 panels/sql/panel.py:73
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
 msgid "In transaction"
 msgstr ""
 
-#: panels/sql/panel.py:64 panels/sql/panel.py:74
+#: panels/sql/panel.py:66 panels/sql/panel.py:76
 msgid "In error"
 msgstr ""
 
-#: panels/sql/panel.py:65 panels/sql/panel.py:75
+#: panels/sql/panel.py:67 panels/sql/panel.py:77
 msgid "Unknown"
 msgstr ""
 
-#: panels/sql/panel.py:162
+#: panels/sql/panel.py:165
 msgid "SQL"
 msgstr ""
 
-#: panels/sql/panel.py:168
+#: panels/sql/panel.py:172
 #, python-format
 msgid "%(query_count)d query in %(sql_time).2fms"
 msgid_plural "%(query_count)d queries in %(sql_time).2fms"
 msgstr[0] ""
 msgstr[1] ""
 
-#: panels/sql/panel.py:180
+#: panels/sql/panel.py:184
 #, python-format
 msgid "SQL queries from %(count)d connection"
 msgid_plural "SQL queries from %(count)d connections"
 msgstr[0] ""
 msgstr[1] ""
 
-#: panels/staticfiles.py:82
+#: panels/staticfiles.py:47
 #, python-format
 msgid "Static files (%(num_found)s found, %(num_used)s used)"
 msgstr ""
 
-#: panels/staticfiles.py:103
+#: panels/staticfiles.py:81
 msgid "Static files"
 msgstr ""
 
-#: panels/staticfiles.py:109
+#: panels/staticfiles.py:87
 #, python-format
 msgid "%(num_used)s file used"
 msgid_plural "%(num_used)s files used"
 msgstr[0] ""
 msgstr[1] ""
 
-#: panels/templates/panel.py:101
+#: panels/templates/panel.py:104
 msgid "Templates"
 msgstr ""
 
-#: panels/templates/panel.py:106
+#: panels/templates/panel.py:109
 #, python-format
 msgid "Templates (%(num_templates)s rendered)"
 msgstr ""
 
-#: panels/templates/panel.py:195
+#: panels/templates/panel.py:199
 msgid "No origin"
 msgstr ""
 
@@ -266,23 +286,23 @@ msgstr ""
 msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
 msgstr ""
 
-#: panels/versions.py:19
+#: panels/versions.py:21
 msgid "Versions"
 msgstr ""
 
-#: templates/debug_toolbar/base.html:23
+#: templates/debug_toolbar/base.html:22
 msgid "Hide toolbar"
 msgstr ""
 
-#: templates/debug_toolbar/base.html:23
+#: templates/debug_toolbar/base.html:22
 msgid "Hide"
 msgstr ""
 
-#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+#: templates/debug_toolbar/base.html:24 templates/debug_toolbar/base.html:25
 msgid "Toggle Theme"
 msgstr ""
 
-#: templates/debug_toolbar/base.html:35
+#: templates/debug_toolbar/base.html:34
 msgid "Show toolbar"
 msgstr ""
 
@@ -353,6 +373,44 @@ msgstr ""
 msgid "Backend"
 msgstr ""
 
+#: templates/debug_toolbar/panels/community.html:5
+msgid "Community & Contribution"
+msgstr ""
+
+#: templates/debug_toolbar/panels/community.html:8
+msgid ""
+"Want to contribute to Django Debug Toolbar? Get involved in our community!"
+msgstr ""
+
+#: templates/debug_toolbar/panels/community.html:14
+msgid "Join Discussions"
+msgstr ""
+
+#: templates/debug_toolbar/panels/community.html:19
+msgid "View Issues"
+msgstr ""
+
+#: templates/debug_toolbar/panels/community.html:24
+msgid "Contribution Guide"
+msgstr ""
+
+#: templates/debug_toolbar/panels/community.html:31
+msgid "Django Debug Toolbar Documentation"
+msgstr ""
+
+#: templates/debug_toolbar/panels/community.html:34
+msgid ""
+"Explore the official documentation to learn more about Django Debug Toolbar."
+msgstr ""
+
+#: templates/debug_toolbar/panels/community.html:39
+msgid "Read Documentation"
+msgstr ""
+
+#: templates/debug_toolbar/panels/community.html:44
+msgid "How to Use Django Debug Toolbar"
+msgstr ""
+
 #: templates/debug_toolbar/panels/headers.html:3
 msgid "Request headers"
 msgstr ""
@@ -551,7 +609,7 @@ msgstr ""
 msgid "No SQL queries were recorded during this request."
 msgstr ""
 
-#: templates/debug_toolbar/panels/sql_explain.html:4
+#: templates/debug_toolbar/panels/sql_explain.html:3
 msgid "SQL explained"
 msgstr ""
 
@@ -567,7 +625,7 @@ msgstr ""
 msgid "Database"
 msgstr ""
 
-#: templates/debug_toolbar/panels/sql_profile.html:4
+#: templates/debug_toolbar/panels/sql_profile.html:3
 msgid "SQL profiled"
 msgstr ""
 
@@ -575,7 +633,7 @@ msgstr ""
 msgid "Error"
 msgstr ""
 
-#: templates/debug_toolbar/panels/sql_select.html:4
+#: templates/debug_toolbar/panels/sql_select.html:3
 msgid "SQL selected"
 msgstr ""
 
@@ -626,7 +684,7 @@ msgstr[1] ""
 msgid "Location"
 msgstr ""
 
-#: templates/debug_toolbar/panels/template_source.html:4
+#: templates/debug_toolbar/panels/template_source.html:3
 msgid "Template source:"
 msgstr ""
 
@@ -696,7 +754,7 @@ msgid ""
 "redirect as normal."
 msgstr ""
 
-#: views.py:16
+#: views.py:18
 msgid ""
 "Data for this panel isn't available anymore. Please reload the page and "
 "retry."
diff -pruN 1:6.0.0-1/debug_toolbar/panels/community.py 1:6.1.0-1/debug_toolbar/panels/community.py
--- 1:6.0.0-1/debug_toolbar/panels/community.py	1970-01-01 00:00:00.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/panels/community.py	2025-10-30 19:33:25.000000000 +0000
@@ -0,0 +1,13 @@
+from django.utils.translation import gettext_lazy as _
+
+from debug_toolbar.panels import Panel
+
+
+class CommunityPanel(Panel):
+    """
+    A panel that provides links to the Django Debug Toolbar community.
+    """
+
+    is_async = True
+    template = "debug_toolbar/panels/community.html"
+    title = _("Community")
diff -pruN 1:6.0.0-1/debug_toolbar/panels/settings.py 1:6.1.0-1/debug_toolbar/panels/settings.py
--- 1:6.0.0-1/debug_toolbar/panels/settings.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/panels/settings.py	2025-10-30 19:33:25.000000000 +0000
@@ -1,8 +1,8 @@
-from django.utils.encoding import force_str
 from django.utils.translation import gettext_lazy as _
 from django.views.debug import get_default_exception_reporter_filter
 
 from debug_toolbar.panels import Panel
+from debug_toolbar.sanitize import force_str
 
 get_safe_settings = get_default_exception_reporter_filter().get_safe_settings
 
diff -pruN 1:6.0.0-1/debug_toolbar/panels/sql/tracking.py 1:6.1.0-1/debug_toolbar/panels/sql/tracking.py
--- 1:6.0.0-1/debug_toolbar/panels/sql/tracking.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/panels/sql/tracking.py	2025-10-30 19:33:25.000000000 +0000
@@ -5,8 +5,8 @@ import json
 from time import perf_counter
 
 import django.test.testcases
-from django.utils.encoding import force_str
 
+from debug_toolbar.sanitize import force_str
 from debug_toolbar.utils import get_stack_trace, get_template_info
 
 try:
@@ -128,10 +128,7 @@ class NormalCursorMixin(DjDTCursorWrappe
 
         # make sure datetime, date and time are converted to string by force_str
         CONVERT_TYPES = (datetime.datetime, datetime.date, datetime.time)
-        try:
-            return force_str(param, strings_only=not isinstance(param, CONVERT_TYPES))
-        except UnicodeDecodeError:
-            return "(encoded string)"
+        return force_str(param, strings_only=not isinstance(param, CONVERT_TYPES))
 
     def _last_executed_query(self, sql, params):
         """Get the last executed query from the connection."""
diff -pruN 1:6.0.0-1/debug_toolbar/panels/templates/panel.py 1:6.1.0-1/debug_toolbar/panels/templates/panel.py
--- 1:6.0.0-1/debug_toolbar/panels/templates/panel.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/panels/templates/panel.py	2025-10-30 19:33:25.000000000 +0000
@@ -10,12 +10,12 @@ from django.template import RequestConte
 from django.test.signals import template_rendered
 from django.test.utils import instrumented_test_render
 from django.urls import path
-from django.utils.encoding import force_str
 from django.utils.translation import gettext_lazy as _
 
 from debug_toolbar.panels import Panel
 from debug_toolbar.panels.sql.tracking import SQLQueryTriggered, allow_sql
 from debug_toolbar.panels.templates import views
+from debug_toolbar.sanitize import force_str
 
 if find_spec("jinja2"):
     from debug_toolbar.panels.templates.jinja2 import patch_jinja_render
diff -pruN 1:6.0.0-1/debug_toolbar/panels/timer.py 1:6.1.0-1/debug_toolbar/panels/timer.py
--- 1:6.0.0-1/debug_toolbar/panels/timer.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/panels/timer.py	2025-10-30 19:33:25.000000000 +0000
@@ -17,6 +17,8 @@ class TimerPanel(Panel):
     Panel that displays the time a response took in milliseconds.
     """
 
+    is_async = True
+
     def nav_subtitle(self):
         stats = self.get_stats()
         if stats.get("utime"):
diff -pruN 1:6.0.0-1/debug_toolbar/sanitize.py 1:6.1.0-1/debug_toolbar/sanitize.py
--- 1:6.0.0-1/debug_toolbar/sanitize.py	1970-01-01 00:00:00.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/sanitize.py	2025-10-30 19:33:25.000000000 +0000
@@ -0,0 +1,12 @@
+from django.utils.encoding import DjangoUnicodeDecodeError, force_str as force_string
+
+
+def force_str(s, *args, **kwargs):
+    """
+    Forces values to strings.
+    Will return "Django Debug Toolbar was unable to parse value." when there's a decoding error.
+    """
+    try:
+        return force_string(s, *args, **kwargs)
+    except DjangoUnicodeDecodeError:
+        return "Django Debug Toolbar was unable to parse value."
diff -pruN 1:6.0.0-1/debug_toolbar/settings.py 1:6.1.0-1/debug_toolbar/settings.py
--- 1:6.0.0-1/debug_toolbar/settings.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/settings.py	2025-10-30 19:33:25.000000000 +0000
@@ -80,6 +80,7 @@ PANELS_DEFAULTS = [
     "debug_toolbar.panels.alerts.AlertsPanel",
     "debug_toolbar.panels.cache.CachePanel",
     "debug_toolbar.panels.signals.SignalsPanel",
+    "debug_toolbar.panels.community.CommunityPanel",
     "debug_toolbar.panels.redirects.RedirectsPanel",
     "debug_toolbar.panels.profiling.ProfilingPanel",
 ]
diff -pruN 1:6.0.0-1/debug_toolbar/static/debug_toolbar/css/toolbar.css 1:6.1.0-1/debug_toolbar/static/debug_toolbar/css/toolbar.css
--- 1:6.0.0-1/debug_toolbar/static/debug_toolbar/css/toolbar.css	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/static/debug_toolbar/css/toolbar.css	2025-10-30 19:33:25.000000000 +0000
@@ -1182,3 +1182,40 @@ To regenerate:
     height: 1rem;
     width: 1rem;
 }
+
+#djDebug .djdt-community-panel {
+    padding: 1.5em;
+}
+
+#djDebug .djdt-community-panel h2 {
+    font-size: 2em;
+}
+
+#djDebug .djdt-community-panel p {
+    font-size: 1em;
+    margin: 0 0 1em 0;
+}
+
+#djDebug .djdt-community-panel .djdt-community-description {
+    font-size: 1em;
+    margin: 0 0 1.5em 0;
+}
+
+#djDebug .djdt-community-panel ul {
+    list-style-type: disc;
+    padding-left: 1.25em;
+    margin: 1em 0;
+}
+
+#djDebug .djdt-community-panel li {
+    margin: 0.5em 0;
+}
+
+#djDebug .djdt-community-panel a {
+    font-weight: bold;
+    font-size: 1em;
+}
+
+#djDebug .djdt-community-panel a:hover {
+    text-decoration: underline;
+}
diff -pruN 1:6.0.0-1/debug_toolbar/store.py 1:6.1.0-1/debug_toolbar/store.py
--- 1:6.0.0-1/debug_toolbar/store.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/store.py	2025-10-30 19:33:25.000000000 +0000
@@ -1,19 +1,16 @@
 import contextlib
 import json
-import logging
 from collections import defaultdict, deque
 from collections.abc import Iterable
 from typing import Any
 
 from django.core.serializers.json import DjangoJSONEncoder
 from django.db import transaction
-from django.utils.encoding import force_str
 from django.utils.module_loading import import_string
 
 from debug_toolbar import settings as dt_settings
 from debug_toolbar.models import HistoryEntry
-
-logger = logging.getLogger(__name__)
+from debug_toolbar.sanitize import force_str
 
 
 class DebugToolbarJSONEncoder(DjangoJSONEncoder):
@@ -21,7 +18,6 @@ class DebugToolbarJSONEncoder(DjangoJSON
         try:
             return super().default(o)
         except (TypeError, ValueError):
-            logger.debug("The debug toolbar can't serialize %s into JSON" % o)
             return force_str(o)
 
 
diff -pruN 1:6.0.0-1/debug_toolbar/templates/debug_toolbar/panels/community.html 1:6.1.0-1/debug_toolbar/templates/debug_toolbar/panels/community.html
--- 1:6.0.0-1/debug_toolbar/templates/debug_toolbar/panels/community.html	1970-01-01 00:00:00.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/templates/debug_toolbar/panels/community.html	2025-10-30 19:33:25.000000000 +0000
@@ -0,0 +1,48 @@
+﻿{% load i18n %}
+
+<div class="djdt-community-panel">
+    <h2>
+        {% translate "Community & Contribution" %}
+    </h2>
+    <p>
+        {% translate "Want to contribute to Django Debug Toolbar? Get involved in our community!" %}
+    </p>
+
+    <ul>
+        <li>
+            <a href="https://github.com/django-commons/django-debug-toolbar/discussions" target="_blank">
+                {% translate "Join Discussions" %}
+            </a>
+        </li>
+        <li>
+            <a href="https://github.com/django-commons/django-debug-toolbar/issues" target="_blank">
+                {% translate "View Issues" %}
+            </a>
+        </li>
+        <li>
+            <a href="https://django-debug-toolbar.readthedocs.io/en/latest/contributing.html" target="_blank">
+                {% translate "Contribution Guide" %}
+            </a>
+        </li>
+    </ul>
+    <hr>
+    <br>
+    <h2>
+        {% translate "Django Debug Toolbar Documentation" %}
+    </h2>
+    <p class="djdt-community-description">
+        {% translate "Explore the official documentation to learn more about Django Debug Toolbar." %}
+    </p>
+    <ul>
+        <li>
+            <a href="https://django-debug-toolbar.readthedocs.io/en/latest/" target="_blank">
+                {% translate "Read Documentation" %}
+            </a>
+        </li>
+        <li>
+            <a href="https://django-debug-toolbar.readthedocs.io/en/latest/resources.html" target="_blank">
+                {% translate "How to Use Django Debug Toolbar" %}
+            </a>
+        </li>
+    </ul>
+</div>
diff -pruN 1:6.0.0-1/debug_toolbar/toolbar.py 1:6.1.0-1/debug_toolbar/toolbar.py
--- 1:6.0.0-1/debug_toolbar/toolbar.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/debug_toolbar/toolbar.py	2025-10-30 19:33:25.000000000 +0000
@@ -221,9 +221,8 @@ class StoredDebugToolbar(DebugToolbar):
             if panel_id and panel.panel_id != panel_id:
                 continue
             data = toolbar.store.panel(toolbar.request_id, panel.panel_id)
-            if data:
-                panel.load_stats_from_store(data)
-                toolbar._panels[panel.panel_id] = panel
+            panel.load_stats_from_store(data)
+            toolbar._panels[panel.panel_id] = panel
         return toolbar
 
 
diff -pruN 1:6.0.0-1/docs/architecture.rst 1:6.1.0-1/docs/architecture.rst
--- 1:6.0.0-1/docs/architecture.rst	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/docs/architecture.rst	2025-10-30 19:33:25.000000000 +0000
@@ -81,7 +81,9 @@ Problematic Parts
   the main benefit of the toolbar
 - Support for async and multi-threading: ``debug_toolbar.middleware.DebugToolbarMiddleware``
   is now async compatible and can process async requests. However certain
-  panels such as ``TimerPanel``, ``RequestPanel`` and ``ProfilingPanel`` aren't
+  panels such as ``RequestPanel`` and ``ProfilingPanel`` aren't
   fully compatible and currently being worked on. For now, these panels
   are disabled by default when running in async environment.
   follow the progress of this issue in `Async compatible toolbar project <https://github.com/orgs/jazzband/projects/9>`_.
+- Django Channels incompatibility: The toolbar does not currently support
+  Django Channels' consumers due to the difference in middleware design.
diff -pruN 1:6.0.0-1/docs/changes.rst 1:6.1.0-1/docs/changes.rst
--- 1:6.0.0-1/docs/changes.rst	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/docs/changes.rst	2025-10-30 19:33:25.000000000 +0000
@@ -1,6 +1,34 @@
 Change log
 ==========
 
+Pending
+-------
+
+6.1.0 (2025-10-30)
+------------------
+
+* Added support for async to timer panel.
+* Added a note about the default password in ``make example``.
+* Removed logging about the toolbar failing to serialize a value into JSON.
+* Moved the the import statement of ``debug_toolbar.urls`` to within the if
+  statement's scope on the installation documentation.
+* Changed ``StoredDebugToolbar.from_store`` to always create a panel key and
+  class instance, regardless if any data was generated.
+* Fixed selenium tests for CI by using psycopg for Python 3.13 runs.
+* Added ``CommunityPanel`` containing links to documentation and resources.
+* Upgraded CI ``postgis`` version to 17-3.5.
+* Added how to generate the documentation locally to the contributing
+  documentation.
+* Updated logic that forces values to strings (``force_str``) to render
+  "Django Debug Toolbar was unable to parse value." when there's a decoding
+  error.
+* Updated docs to show incompatibility with Django Channels.
+* Hide the toolbar's migrations unless ``debug_toolbar.store.DatabaseStore``
+  is being used. This may change in the future.
+* Hide ``debug_toolbar.HistoryEntry`` as a model unless
+  ``debug_toolbar.store.DatabaseStore`` is being used. This may change in the
+  future.
+
 6.0.0 (2025-07-22)
 ------------------
 
diff -pruN 1:6.0.0-1/docs/conf.py 1:6.1.0-1/docs/conf.py
--- 1:6.0.0-1/docs/conf.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/docs/conf.py	2025-10-30 19:33:25.000000000 +0000
@@ -25,7 +25,7 @@ copyright = "{}, Django Debug Toolbar de
 copyright = copyright.format(datetime.date.today().year)
 
 # The full version, including alpha/beta/rc tags
-release = "6.0.0"
+release = "6.1.0"
 
 
 # -- General configuration ---------------------------------------------------
diff -pruN 1:6.0.0-1/docs/configuration.rst 1:6.1.0-1/docs/configuration.rst
--- 1:6.0.0-1/docs/configuration.rst	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/docs/configuration.rst	2025-10-30 19:33:25.000000000 +0000
@@ -32,6 +32,7 @@ default value is::
         'debug_toolbar.panels.alerts.AlertsPanel',
         'debug_toolbar.panels.cache.CachePanel',
         'debug_toolbar.panels.signals.SignalsPanel',
+        'debug_toolbar.panels.community.CommunityPanel',
         'debug_toolbar.panels.redirects.RedirectsPanel',
         'debug_toolbar.panels.profiling.ProfilingPanel',
     ]
@@ -195,15 +196,15 @@ Toolbar options
   The DatabaseStore provides persistence and automatically cleans up old
   entries based on the ``RESULTS_CACHE_SIZE`` setting.
 
-  Note: For full functionality, DatabaseStore requires migrations for
-  the debug_toolbar app:
+  Note: When using ``DatabaseStore`` migrations are required for
+  the ``debug_toolbar`` app:
 
   .. code-block:: bash
 
       python manage.py migrate debug_toolbar
 
-  For the DatabaseStore to work properly, you need to run migrations for the
-  debug_toolbar app. The migrations create the necessary database table to store
+  For the ``DatabaseStore`` to work properly, you need to run migrations for the
+  ``debug_toolbar`` app. The migrations create the necessary database table to store
   toolbar data.
 
 .. _TOOLBAR_LANGUAGE:
diff -pruN 1:6.0.0-1/docs/contributing.rst 1:6.1.0-1/docs/contributing.rst
--- 1:6.0.0-1/docs/contributing.rst	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/docs/contributing.rst	2025-10-30 19:33:25.000000000 +0000
@@ -12,6 +12,8 @@ You can report bugs and request features
 
 Please search the existing database for duplicates before filing an issue.
 
+.. _code:
+
 Code
 ----
 
@@ -40,6 +42,9 @@ For convenience, there's an alias for th
 
     $ make example
 
+The default password is ``p``, it can be overridden by setting the environment
+variable ``DJANGO_SUPERUSER_PASSWORD``.
+
 Look at ``example/settings.py`` for running the example with another database
 than SQLite.
 
@@ -150,7 +155,7 @@ Translations
 ------------
 
 Translation efforts are coordinated on `Transifex
-<https://www.transifex.com/projects/p/django-debug-toolbar/>`_.
+<https://explore.transifex.com/django-debug-toolbar/django-debug-toolbar/>`_.
 
 Help translate the Debug Toolbar in your language!
 
@@ -204,3 +209,69 @@ The release itself requires the followin
 #. **After the publishing completed** edit the automatically created GitHub
    release to include the release notes (you may use GitHub's "Generate release
    notes" button for this).
+
+
+Building the documentation locally
+----------------------------------
+
+The project's documentation is built using `Sphinx <https://www.sphinx-doc.org>`_.
+You can generate it locally to preview your changes before submitting a pull
+request.
+
+
+Prerequisites
+--------------
+
+Before building the documentation, ensure that all dependencies are installed
+as described in :ref:`the setup instructions <code>`.
+
+Additionally, to build the documentation with proper spell checking,
+you need to install:
+
+- **Enchant Library** - This is required by the sphinxcontrib-spelling
+        extension via the pyenchant package. For detailed installation
+        instructions, see the
+        `pyenchant installation documentation <https://pyenchant.github.io/pyenchant/install.html#installing-the-enchant-c-library>`_.
+
+
+
+
+Using Tox (Cross-Platform)
+------------------------------------
+
+To build the documentation using Tox, run from the project root:
+
+.. code-block:: bash
+
+    tox -e docs -- html
+
+This will generate the HTML files in ``docs/_build/html/``.
+
+You can then open the documentation in your browser:
+
+- **Linux:** ``xdg-open docs/_build/html/index.html``
+- **macOS:** ``open docs/_build/html/index.html``
+- **Windows:** ``start docs\_build\html\index.html``
+
+*Tox automatically installs the necessary dependencies, so you don’t need
+to activate a virtual environment manually.*
+
+
+Troubleshooting
+----------------
+
+
+If you encounter an error about a missing dependency such as
+``sphinx-build: command not found``, ensure that your virtual environment is
+activated and all dependencies are installed:
+
+.. code-block:: bash
+
+    pip install -r requirements_dev.txt
+
+Alternatively, you can build the documentation using Tox, which automatically
+handles dependencies and environment setup:
+
+.. code-block:: bash
+
+    tox -e docs -- html
diff -pruN 1:6.0.0-1/docs/installation.rst 1:6.1.0-1/docs/installation.rst
--- 1:6.0.0-1/docs/installation.rst	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/docs/installation.rst	2025-10-30 19:33:25.000000000 +0000
@@ -183,9 +183,10 @@ You should also modify your URLconf file
 .. code-block:: python
 
     from django.conf import settings
-    from debug_toolbar.toolbar import debug_toolbar_urls
 
     if not settings.TESTING:
+        from debug_toolbar.toolbar import debug_toolbar_urls
+
         urlpatterns = [
             *urlpatterns,
         ] + debug_toolbar_urls()
@@ -272,12 +273,13 @@ And for Apache:
 Django Channels & Async
 ^^^^^^^^^^^^^^^^^^^^^^^
 
-The Debug Toolbar currently has experimental support for Django Channels and
-async projects. The Debug Toolbar is compatible with the following exceptions:
+The Debug Toolbar currently has experimental support for async projects.
+The Debug Toolbar is compatible with the following exceptions:
 
 - Concurrent requests aren't supported
 - ``TimerPanel``, ``RequestPanel`` and ``ProfilingPanel`` can't be used
   in async contexts.
+- Django Channels is not supported yet.
 
 HTMX
 ^^^^
diff -pruN 1:6.0.0-1/docs/panels.rst 1:6.1.0-1/docs/panels.rst
--- 1:6.0.0-1/docs/panels.rst	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/docs/panels.rst	2025-10-30 19:33:25.000000000 +0000
@@ -108,6 +108,13 @@ Signals
 
 List of signals and receivers.
 
+Community
+~~~~~~~~~
+
+.. class:: debug_toolbar.panels.community.CommunityPanel
+
+A panel that provides links to the Django Debug Toolbar community.
+
 Redirects
 ~~~~~~~~~
 
diff -pruN 1:6.0.0-1/docs/spelling_wordlist.txt 1:6.1.0-1/docs/spelling_wordlist.txt
--- 1:6.0.0-1/docs/spelling_wordlist.txt	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/docs/spelling_wordlist.txt	2025-10-30 19:33:25.000000000 +0000
@@ -48,6 +48,7 @@ pre
 profiler
 psycopg
 py
+pyenchant
 pyflame
 pylibmc
 pytest
@@ -58,6 +59,7 @@ reinitializing
 resizing
 runserver
 spellchecking
+sphinxcontrib
 spooler
 stacktrace
 stacktraces
diff -pruN 1:6.0.0-1/pyproject.toml 1:6.1.0-1/pyproject.toml
--- 1:6.0.0-1/pyproject.toml	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/pyproject.toml	2025-10-30 19:33:25.000000000 +0000
@@ -31,6 +31,7 @@ classifiers = [
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
   "Programming Language :: Python :: 3.13",
+  "Programming Language :: Python :: 3.14",
   "Topic :: Software Development :: Libraries :: Python Modules",
 ]
 dynamic = [
diff -pruN 1:6.0.0-1/tests/panels/test_history.py 1:6.1.0-1/tests/panels/test_history.py
--- 1:6.0.0-1/tests/panels/test_history.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/tests/panels/test_history.py	2025-10-30 19:33:25.000000000 +0000
@@ -5,6 +5,7 @@ from django.test import RequestFactory,
 from django.urls import resolve, reverse
 
 from debug_toolbar.panels.history import HistoryPanel
+from debug_toolbar.panels.redirects import RedirectsPanel
 from debug_toolbar.store import get_store
 from debug_toolbar.toolbar import DebugToolbar
 
@@ -80,6 +81,8 @@ class HistoryViewsTestCase(IntegrationTe
         "AlertsPanel",
         "CachePanel",
         "SignalsPanel",
+        "CommunityPanel",
+        "ProfilingPanel",
     }
 
     def test_history_panel_integration_content(self):
@@ -138,6 +141,7 @@ class HistoryViewsTestCase(IntegrationTe
         self.client.get("/json_view/")
         panel_keys = copy.copy(self.PANEL_KEYS)
         panel_keys.add(HistoryPanel.panel_id)
+        panel_keys.add(RedirectsPanel.panel_id)
         request_id = list(get_store().request_ids())[0]
         data = {"request_id": request_id}
         response = self.client.get(reverse("djdt:history_sidebar"), data=data)
diff -pruN 1:6.0.0-1/tests/settings.py 1:6.1.0-1/tests/settings.py
--- 1:6.0.0-1/tests/settings.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/tests/settings.py	2025-10-30 19:33:25.000000000 +0000
@@ -128,6 +128,10 @@ DATABASES = {
 
 DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
 
+# Force the MIGRATION_MODULES to always find our migrations.
+# See debug_toolbar/apps.py::_manage_migrations_visibility
+MIGRATION_MODULES = {"debug_toolbar": "debug_toolbar.migrations"}
+
 # Debug Toolbar configuration
 
 DEBUG_TOOLBAR_CONFIG = {
diff -pruN 1:6.0.0-1/tests/test_apps.py 1:6.1.0-1/tests/test_apps.py
--- 1:6.0.0-1/tests/test_apps.py	1970-01-01 00:00:00.000000000 +0000
+++ 1:6.1.0-1/tests/test_apps.py	2025-10-30 19:33:25.000000000 +0000
@@ -0,0 +1,47 @@
+from unittest.mock import patch
+
+from django.apps import apps
+from django.test import SimpleTestCase, override_settings
+
+from debug_toolbar.apps import _manage_migrations_visibility
+
+
+class AppsTestCase(SimpleTestCase):
+    @override_settings(
+        DEBUG_TOOLBAR_CONFIG={
+            "TOOLBAR_STORE_CLASS": "debug_toolbar.store.DatabaseStore"
+        }
+    )
+    @patch("debug_toolbar.apps.settings.MIGRATION_MODULES")
+    def test_migrations_are_visible(self, mocked_migration_modules):
+        _manage_migrations_visibility("debug_toolbar")
+        self.assertFalse(mocked_migration_modules.setdefault.called)
+
+    @override_settings(
+        DEBUG_TOOLBAR_CONFIG={"TOOLBAR_STORE_CLASS": "debug_toolbar.store.MemoryStore"}
+    )
+    @patch("debug_toolbar.apps.settings.MIGRATION_MODULES")
+    def test_migrations_are_hidden(self, mocked_migration_modules):
+        _manage_migrations_visibility("debug_toolbar")
+        mocked_migration_modules.setdefault.assert_called_once_with(
+            "debug_toolbar", None
+        )
+
+    @override_settings(
+        DEBUG_TOOLBAR_CONFIG={
+            "TOOLBAR_STORE_CLASS": "debug_toolbar.store.DatabaseStore"
+        }
+    )
+    def test_models_are_visible(self):
+        app_config = apps.get_app_config("debug_toolbar")
+        app_config.import_models()
+        apps.get_model("debug_toolbar", "HistoryEntry")
+
+    @override_settings(
+        DEBUG_TOOLBAR_CONFIG={"TOOLBAR_STORE_CLASS": "debug_toolbar.store.MemoryStore"}
+    )
+    def test_models_are_hidden(self):
+        app_config = apps.get_app_config("debug_toolbar")
+        app_config.import_models()
+        with self.assertRaises(LookupError):
+            apps.get_model("debug_toolbar", "HistoryEntry")
diff -pruN 1:6.0.0-1/tests/test_integration_async.py 1:6.1.0-1/tests/test_integration_async.py
--- 1:6.0.0-1/tests/test_integration_async.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/tests/test_integration_async.py	2025-10-30 19:33:25.000000000 +0000
@@ -1,3 +1,4 @@
+import re
 import unittest
 from unittest.mock import patch
 
@@ -506,6 +507,29 @@ class DebugToolbarIntegrationTestCase(In
         # Link to LOCATION header.
         self.assertIn(b'href="/regular/redirect/"', response.content)
 
+    async def test_server_timing_headers(self):
+        response = await self.async_client.get("/execute_sql/")
+        server_timing = response["Server-Timing"]
+        expected_partials = [
+            r'TimerPanel_utime;dur=(\d)*(\.(\d)*)?;desc="User CPU time", ',
+            r'TimerPanel_stime;dur=(\d)*(\.(\d)*)?;desc="System CPU time", ',
+            r'TimerPanel_total;dur=(\d)*(\.(\d)*)?;desc="Total CPU time", ',
+            r'TimerPanel_total_time;dur=(\d)*(\.(\d)*)?;desc="Elapsed time", ',
+            r'SQLPanel_sql_time;dur=(\d)*(\.(\d)*)?;desc="SQL 1 queries", ',
+            r'CachePanel_total_time;dur=0;desc="Cache 0 Calls"',
+        ]
+        for expected in expected_partials:
+            self.assertTrue(re.compile(expected).search(server_timing))
+
+    @override_settings(DEBUG_TOOLBAR_CONFIG={"RENDER_PANELS": True})
+    async def test_timer_panel(self):
+        response = await self.async_client.get("/regular/basic/")
+        self.assertEqual(response.status_code, 200)
+        self.assertContains(
+            response,
+            '<script type="module" src="/static/debug_toolbar/js/timer.js" async>',
+        )
+
     async def test_auth_login_view_without_redirect(self):
         response = await self.async_client.get("/login_without_redirect/")
         self.assertEqual(response.status_code, 200)
diff -pruN 1:6.0.0-1/tests/test_sanitize.py 1:6.1.0-1/tests/test_sanitize.py
--- 1:6.0.0-1/tests/test_sanitize.py	1970-01-01 00:00:00.000000000 +0000
+++ 1:6.1.0-1/tests/test_sanitize.py	2025-10-30 19:33:25.000000000 +0000
@@ -0,0 +1,18 @@
+import unittest
+
+from debug_toolbar.sanitize import force_str
+
+
+class ForceStrTestCase(unittest.TestCase):
+    def test_success_convert(self):
+        input = 0
+
+        self.assertEqual(force_str(input), "0")
+
+    def test_failed_convert(self):
+        input = bytes.fromhex(
+            "a3f2b8c14e972d5a8fb3c7291a64e0859c472bf63d18a0945e73b2c84f917ae2"
+        )
+        self.assertEqual(
+            force_str(input), "Django Debug Toolbar was unable to parse value."
+        )
diff -pruN 1:6.0.0-1/tests/test_store.py 1:6.1.0-1/tests/test_store.py
--- 1:6.0.0-1/tests/test_store.py	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/tests/test_store.py	2025-10-30 19:33:25.000000000 +0000
@@ -14,6 +14,12 @@ class SerializationTestCase(TestCase):
             '{"hello": {"foo": "bar"}}',
         )
 
+    def test_serialize_logs_on_failure(self):
+        self.assertEqual(
+            store.serialize({"hello": {"foo": b"bar"}}),
+            '{"hello": {"foo": "bar"}}',
+        )
+
     def test_deserialize(self):
         self.assertEqual(
             store.deserialize('{"hello": {"foo": "bar"}}'),
@@ -126,6 +132,9 @@ class GetStoreTestCase(TestCase):
         self.assertIs(store.get_store(), StubStore)
 
 
+@override_settings(
+    DEBUG_TOOLBAR_CONFIG={"TOOLBAR_STORE_CLASS": "debug_toolbar.store.DatabaseStore"}
+)
 class DatabaseStoreTestCase(TestCase):
     @classmethod
     def setUpTestData(cls) -> None:
diff -pruN 1:6.0.0-1/tox.ini 1:6.1.0-1/tox.ini
--- 1:6.0.0-1/tox.ini	2025-07-25 13:09:50.000000000 +0000
+++ 1:6.1.0-1/tox.ini	2025-10-30 19:33:25.000000000 +0000
@@ -6,6 +6,7 @@ envlist =
     py{39,310,311,312}-dj{42}-{sqlite,postgresql,postgis,mysql}
     py{310,311,312}-dj{42,50,51,52}-{sqlite,postgresql,psycopg3,postgis,mysql}
     py{313}-dj{51,52,main}-{sqlite,psycopg3,postgis3,mysql}
+    py{314}-dj{52,main}-{sqlite,psycopg3,postgis3,mysql}
 
 [testenv]
 deps =
@@ -42,7 +43,6 @@ passenv=
 setenv =
     PYTHONPATH = {toxinidir}
     PYTHONWARNINGS = d
-    py311-dj42-postgresql: DJANGO_SELENIUM_TESTS = {env:DJANGO_SELENIUM_TESTS:true}
     DB_NAME = {env:DB_NAME:debug_toolbar}
     DB_USER = {env:DB_USER:debug_toolbar}
     DB_HOST = {env:DB_HOST:localhost}
@@ -53,28 +53,28 @@ pip_pre = True
 commands = python -b -W always -m coverage run -m django test -v2 {posargs:tests}
 
 
-[testenv:py{39,310,311,312,313}-dj{42,50,51,52,main}-{postgresql,psycopg3}]
+[testenv:py{39,310,311,312,313,314}-dj{42,50,51,52,main}-{postgresql,psycopg3}]
 setenv =
     {[testenv]setenv}
     DB_BACKEND = postgresql
     DB_PORT = {env:DB_PORT:5432}
 
 
-[testenv:py{39,310,311,312,313}-dj{42,50,51,52,main}-{postgis,postgis3}]
+[testenv:py{39,310,311,312,313,314}-dj{42,50,51,52,main}-{postgis,postgis3}]
 setenv =
     {[testenv]setenv}
     DB_BACKEND = postgis
     DB_PORT = {env:DB_PORT:5432}
 
 
-[testenv:py{39,310,311,312,313}-dj{42,50,51,52,main}-mysql]
+[testenv:py{39,310,311,312,313,314}-dj{42,50,51,52,main}-mysql]
 setenv =
     {[testenv]setenv}
     DB_BACKEND = mysql
     DB_PORT = {env:DB_PORT:3306}
 
 
-[testenv:py{39,310,311,312,313}-dj{42,50,51,52,main}-sqlite]
+[testenv:py{39,310,311,312,313,314}-dj{42,50,51,52,main}-sqlite]
 setenv =
     {[testenv]setenv}
     DB_BACKEND = sqlite3
@@ -104,6 +104,7 @@ python =
     3.11: py311
     3.12: py312
     3.13: py313
+    3.14: py314
 
 [gh-actions:env]
 DB_BACKEND =
