diff --git a/CHANGELOG.md b/CHANGELOG.md
index 15ffc8d..67020e2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
 ## Unreleased
 
 * Use `watchgod`, if installed, for watching code changes.
+* Reload application when any files in watched directories change, not just `.py` files.
 
 ## 0.11.3
 
diff --git a/uvicorn/supervisors/statreload.py b/uvicorn/supervisors/statreload.py
index 3209c2c..03c96be 100644
--- a/uvicorn/supervisors/statreload.py
+++ b/uvicorn/supervisors/statreload.py
@@ -14,7 +14,7 @@ class StatReload(BaseReload):
         self.mtimes = {}
 
     def should_restart(self):
-        for filename in self.iter_py_files():
+        for filename in self.iter_files():
             try:
                 mtime = os.path.getmtime(filename)
             except OSError:  # pragma: nocover
@@ -33,9 +33,9 @@ class StatReload(BaseReload):
                 return True
         return False
 
-    def iter_py_files(self):
+    def iter_files(self):
         for reload_dir in self.config.reload_dirs:
             for subdir, dirs, files in os.walk(reload_dir):
                 for file in files:
-                    if file.endswith(".py"):
+                    if not file.startswith("."):
                         yield subdir + os.sep + file

Add support for --reload to monitor additional file types.
The "reload" process currently only monitors ".py" files in various directories. I have a changes that will pass in a list of additional "reload_suffixes" that the process will monitor. This allows the service to monitor data files in addition to code files.

Any feedback on whether this is useful to others?
diff --git a/tests/supervisors/__init__.py b/tests/supervisors/__init__.py
new file mode 100644
index 0000000..2def547
--- /dev/null
+++ b/tests/supervisors/__init__.py
@@ -0,0 +1,5 @@
+WATCHED_FILES = (
+    "example.py",
+    "example.html",
+    "example.graphql",
+)
diff --git a/tests/supervisors/test_statreload.py b/tests/supervisors/test_statreload.py
index 891a4fc..49a5ba3 100644
--- a/tests/supervisors/test_statreload.py
+++ b/tests/supervisors/test_statreload.py
@@ -3,9 +3,13 @@ import signal
 import time
 from pathlib import Path
 
+import pytest
+
 from uvicorn.config import Config
 from uvicorn.supervisors.statreload import StatReload
 
+from . import WATCHED_FILES
+
 
 def run(sockets):
     pass
@@ -24,8 +28,9 @@ def test_statreload():
     reloader.run()
 
 
-def test_should_reload(tmpdir):
-    update_file = Path(os.path.join(str(tmpdir), "example.py"))
+@pytest.mark.parametrize("filename", WATCHED_FILES)
+def test_should_reload_when_watched_file_is_changed(tmpdir, filename):
+    update_file = Path(tmpdir) / filename
     update_file.touch()
 
     working_dir = os.getcwd()
@@ -45,3 +50,26 @@ def test_should_reload(tmpdir):
         reloader.shutdown()
     finally:
         os.chdir(working_dir)
+
+
+def test_should_not_reload_when_dot_file_is_changed(tmpdir):
+    update_file = Path(tmpdir) / ".dotted"
+    update_file.touch()
+
+    working_dir = os.getcwd()
+    os.chdir(str(tmpdir))
+    try:
+        config = Config(app=None, reload=True)
+        reloader = StatReload(config, target=run, sockets=[])
+        reloader.signal_handler(sig=signal.SIGINT, frame=None)
+        reloader.startup()
+
+        assert not reloader.should_restart()
+        time.sleep(0.1)
+        update_file.touch()
+        assert not reloader.should_restart()
+
+        reloader.restart()
+        reloader.shutdown()
+    finally:
+        os.chdir(working_dir)
diff --git a/tests/supervisors/test_watchgodreload.py b/tests/supervisors/test_watchgodreload.py
index f8bc774..4bba1c2 100644
--- a/tests/supervisors/test_watchgodreload.py
+++ b/tests/supervisors/test_watchgodreload.py
@@ -3,9 +3,13 @@ import signal
 import time
 from pathlib import Path
 
+import pytest
+
 from uvicorn.config import Config
 from uvicorn.supervisors.watchgodreload import WatchGodReload
 
+from . import WATCHED_FILES
+
 
 def run(sockets):
     pass
@@ -18,9 +22,9 @@ def test_watchgodreload(certfile_and_keyfile):
     reloader.run()
 
 
-def test_should_reload_when_python_file_is_changed(tmpdir):
-    file = "example.py"
-    update_file = Path(os.path.join(str(tmpdir), file))
+@pytest.mark.parametrize("filename", WATCHED_FILES)
+def test_should_reload_when_file_is_changed(tmpdir, filename):
+    update_file = Path(tmpdir) / filename
     update_file.touch()
 
     working_dir = os.getcwd()
@@ -43,8 +47,7 @@ def test_should_reload_when_python_file_is_changed(tmpdir):
 
 
 def test_should_not_reload_when_dot_file_is_changed(tmpdir):
-    file = ".dotted"
-    update_file = Path(os.path.join(str(tmpdir), file))
+    update_file = Path(tmpdir) / ".dotted"
     update_file.touch()
 
     working_dir = os.getcwd()

pip install -e .[watchgodreload]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio
apt-get update apt-get install -y gcc
3.8
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
autoflake==2.3.1
babel==2.17.0
backrefs==5.7.post1
black==24.8.0
certifi==2025.1.31
charset-normalizer==3.4.1
click==7.1.2
codecov==2.1.13
colorama==0.4.6
coverage==7.6.1
exceptiongroup==1.2.2
execnet==2.1.1
flake8==7.1.2
ghp-import==2.1.0
gunicorn==23.0.0
h11==0.8.1
httptools==0.1.2
idna==3.10
importlib_metadata==8.5.0
iniconfig==2.1.0
isort==5.13.2
Jinja2==3.1.6
Markdown==3.7
MarkupSafe==2.1.5
mccabe==0.7.0
mergedeep==1.3.4
mkdocs==1.6.1
mkdocs-get-deps==0.2.0
mkdocs-material==9.6.10
mkdocs-material-extensions==1.3.1
mypy-extensions==1.0.0
packaging==24.2
paginate==0.5.7
pathspec==0.12.1
platformdirs==4.3.6
pluggy==1.5.0
pycodestyle==2.12.1
pyflakes==3.2.0
Pygments==2.19.1
pymdown-extensions==10.14.3
pytest==8.3.5
pytest-asyncio==0.24.0
pytest-cov==5.0.0
pytest-mock==3.14.0
pytest-xdist==3.6.1
python-dateutil==2.9.0.post0
pytz==2025.2
PyYAML==6.0.2
pyyaml_env_tag==0.1
requests==2.32.3
six==1.17.0
tomli==2.2.1
typing_extensions==4.13.0
urllib3==2.2.3
-e git+https://github.com/encode/uvicorn.git@7e55554a9f32a127ea3511fa2f55d1b47b66029d#egg=uvicorn
uvloop==0.21.0
watchdog==4.0.2
watchgod==0.6
websockets==8.1
wsproto==0.13.0
zipp==3.20.2

name: uvicorn
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=24.2=py38h06a4308_0
  - python=3.8.20=he870216_0
  - readline=8.2=h5eee18b_0
  - setuptools=75.1.0=py38h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.44.0=py38h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - autoflake==2.3.1
      - babel==2.17.0
      - backrefs==5.7.post1
      - black==24.8.0
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - click==7.1.2
      - codecov==2.1.13
      - colorama==0.4.6
      - coverage==7.6.1
      - exceptiongroup==1.2.2
      - execnet==2.1.1
      - flake8==7.1.2
      - ghp-import==2.1.0
      - gunicorn==23.0.0
      - h11==0.8.1
      - httptools==0.1.2
      - idna==3.10
      - importlib-metadata==8.5.0
      - iniconfig==2.1.0
      - isort==5.13.2
      - jinja2==3.1.6
      - markdown==3.7
      - markupsafe==2.1.5
      - mccabe==0.7.0
      - mergedeep==1.3.4
      - mkdocs==1.6.1
      - mkdocs-get-deps==0.2.0
      - mkdocs-material==9.6.10
      - mkdocs-material-extensions==1.3.1
      - mypy-extensions==1.0.0
      - packaging==24.2
      - paginate==0.5.7
      - pathspec==0.12.1
      - platformdirs==4.3.6
      - pluggy==1.5.0
      - pycodestyle==2.12.1
      - pyflakes==3.2.0
      - pygments==2.19.1
      - pymdown-extensions==10.14.3
      - pytest==8.3.5
      - pytest-asyncio==0.24.0
      - pytest-cov==5.0.0
      - pytest-mock==3.14.0
      - pytest-xdist==3.6.1
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - pyyaml==6.0.2
      - pyyaml-env-tag==0.1
      - requests==2.32.3
      - six==1.17.0
      - tomli==2.2.1
      - typing-extensions==4.13.0
      - urllib3==2.2.3
      - uvloop==0.21.0
      - watchdog==4.0.2
      - watchgod==0.6
      - websockets==8.1
      - wsproto==0.13.0
      - zipp==3.20.2
prefix: /opt/conda/envs/uvicorn

tests/supervisors/test_statreload.py::test_should_reload_when_watched_file_is_changed[example.html] tests/supervisors/test_statreload.py::test_should_reload_when_watched_file_is_changed[example.graphql]
tests/supervisors/test_statreload.py::test_statreload tests/supervisors/test_statreload.py::test_should_reload_when_watched_file_is_changed[example.py] tests/supervisors/test_statreload.py::test_should_not_reload_when_dot_file_is_changed tests/supervisors/test_watchgodreload.py::test_watchgodreload tests/supervisors/test_watchgodreload.py::test_should_reload_when_file_is_changed[example.py] tests/supervisors/test_watchgodreload.py::test_should_reload_when_file_is_changed[example.html] tests/supervisors/test_watchgodreload.py::test_should_reload_when_file_is_changed[example.graphql] tests/supervisors/test_watchgodreload.py::test_should_not_reload_when_dot_file_is_changed
uvicorn/supervisors/statreload.py CHANGELOG.md
uvicorn/supervisors/statreload.py CHANGELOG.md