diff --git a/README.md b/README.md
index 5283c1b..9313b6f 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,7 @@

+
- [Teilchensammler: Collect parts in a list](#teilchensammler-collect-parts-in-a-list)
- [Badges](#badges)
- [Development](#development)
@@ -23,6 +24,7 @@
- [Direnv (automatic venv)](#direnv-automatic-venv)
- [Subshells or Shells started from Editors](#subshells-or-shells-started-from-editors)
- [just](#just)
+
## Development
diff --git a/docs/coverage-badge.svg b/docs/coverage-badge.svg
index 8f71438..3ed6d83 100644
--- a/docs/coverage-badge.svg
+++ b/docs/coverage-badge.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/requirements/dev.in b/requirements/dev.in
index 45f88d4..2a41edd 100644
--- a/requirements/dev.in
+++ b/requirements/dev.in
@@ -9,3 +9,4 @@ ruff # linter
uv # resolver for pip-compile-multi
genbadge[tests,coverage] # create badges from coverage reports and pytest
pymarkdownlnt # lint markdown files, note: it's "lnt" at the end, not "lint"
+pytest-randomly # run tests in random order; installed in dev env because in test/ci we want more reproducibility
diff --git a/requirements/dev.txt b/requirements/dev.txt
index 9eaca0d..67198cc 100644
--- a/requirements/dev.txt
+++ b/requirements/dev.txt
@@ -1,4 +1,4 @@
-# SHA1:0fe30e8de6a24fe0b1d50d82a23038919d203909
+# SHA1:596eaea6df10023a3db5f9b26c0cf974c97cb86e
#
# This file was generated by pip-compile-multi.
# To update, run:
@@ -6,51 +6,110 @@
# requirements upgrade
#
-r test.txt
-application-properties==0.8.2
+application-properties==0.8.3
+ # via pymarkdownlnt
asttokens==3.0.0
+ # via stack-data
build==1.2.2.post1
-certifi==2025.4.26
+ # via pip-tools
+certifi==2025.6.15
+ # via requests
charset-normalizer==3.4.2
-click==8.1.8
+ # via requests
+click==8.2.1
+ # via
+ # genbadge
+ # pip-compile-multi
+ # pip-tools
columnar==1.4.1
+ # via pymarkdownlnt
decorator==5.2.1
+ # via ipython
defusedxml==0.7.1
+ # via genbadge
django-debug-toolbar==5.2.0
-django-stubs==5.2.0
-django-stubs-ext==5.2.0
+ # via -r requirements/dev.in
+django-stubs==5.2.1
+ # via -r requirements/dev.in
+django-stubs-ext==5.2.1
+ # via django-stubs
executing==2.2.0
+ # via stack-data
genbadge==1.1.2
+ # via -r requirements/dev.in
idna==3.10
-ipython==9.2.0
+ # via requests
+ipython==9.3.0
+ # via -r requirements/dev.in
ipython-pygments-lexers==1.1.1
+ # via ipython
jedi==0.19.2
+ # via ipython
markdown-it-py==3.0.0
+ # via rich
matplotlib-inline==0.1.7
+ # via ipython
mdurl==0.1.2
+ # via markdown-it-py
parso==0.8.4
+ # via jedi
pexpect==4.9.0
+ # via ipython
pillow==11.2.1
+ # via genbadge
pip==25.1.1
-pip-compile-multi==3.0.0
+ # via pip-tools
+pip-compile-multi==3.2.1
+ # via -r requirements/dev.in
pip-tools==7.4.1
+ # via pip-compile-multi
prompt-toolkit==3.0.51
+ # via ipython
ptyprocess==0.7.0
+ # via pexpect
pure-eval==0.2.3
-pygments==2.19.1
-pymarkdownlnt==0.9.29
+ # via stack-data
+pymarkdownlnt==0.9.30
+ # via -r requirements/dev.in
pyproject-hooks==1.2.0
+ # via
+ # build
+ # pip-tools
+pytest-randomly==3.16.0
+ # via -r requirements/dev.in
pyyaml==6.0.2
-requests==2.32.3
+ # via application-properties
+requests==2.32.4
+ # via genbadge
rich==14.0.0
-ruff==0.11.8
-setuptools==80.3.1
+ # via -r requirements/dev.in
+ruff==0.12.0
+ # via -r requirements/dev.in
+setuptools==80.9.0
+ # via
+ # genbadge
+ # pip-tools
stack-data==0.6.3
+ # via ipython
tomli==2.2.1
+ # via application-properties
toolz==1.0.0
+ # via columnar
toposort==1.10
+ # via pip-compile-multi
traitlets==5.14.3
-types-pyyaml==6.0.12.20250402
-urllib3==2.4.0
-uv==0.7.3
+ # via
+ # ipython
+ # matplotlib-inline
+types-pyyaml==6.0.12.20250516
+ # via django-stubs
+urllib3==2.5.0
+ # via requests
+uv==0.7.13
+ # via -r requirements/dev.in
wcwidth==0.2.13
+ # via
+ # columnar
+ # prompt-toolkit
wheel==0.45.1
+ # via pip-tools
diff --git a/requirements/prod.txt b/requirements/prod.txt
index 8499f3c..5ec662d 100644
--- a/requirements/prod.txt
+++ b/requirements/prod.txt
@@ -6,15 +6,37 @@
# requirements upgrade
#
asgiref==3.8.1
-django==5.2.1
+ # via
+ # django
+ # django-structlog
+django==5.2.3
+ # via
+ # -r requirements/prod.in
+ # django-extensions
+ # django-structlog
django-environ==0.12.0
+ # via -r requirements/prod.in
django-extensions==4.1
+ # via
+ # -r requirements/prod.in
+ # django-structlog
django-ipware==7.0.1
+ # via django-structlog
django-structlog==9.1.1
-psycopg==3.2.7
-psycopg-binary==3.2.7
+ # via -r requirements/prod.in
+psycopg==3.2.9
+ # via -r requirements/prod.in
+psycopg-binary==3.2.9
+ # via psycopg
psycopg-pool==3.2.6
+ # via psycopg
python-ipware==3.0.0
+ # via django-ipware
sqlparse==0.5.3
+ # via django
structlog==24.4.0
-typing-extensions==4.13.2
+ # via
+ # -r requirements/prod.in
+ # django-structlog
+typing-extensions==4.14.0
+ # via psycopg-pool
diff --git a/requirements/test.txt b/requirements/test.txt
index 77dcff2..afb256e 100644
--- a/requirements/test.txt
+++ b/requirements/test.txt
@@ -7,12 +7,29 @@
#
-r prod.txt
attrs==25.3.0
-coverage==7.8.0
-hypothesis==6.131.15
+ # via hypothesis
+coverage==7.9.1
+ # via pytest-cov
+hypothesis==6.135.14
+ # via -r requirements/test.in
iniconfig==2.1.0
+ # via pytest
packaging==25.0
-pluggy==1.5.0
-pytest==8.3.5
-pytest-cov==6.1.1
+ # via pytest
+pluggy==1.6.0
+ # via
+ # pytest
+ # pytest-cov
+pygments==2.19.1
+ # via pytest
+pytest==8.4.1
+ # via
+ # -r requirements/test.in
+ # pytest-cov
+ # pytest-django
+pytest-cov==6.2.1
+ # via -r requirements/test.in
pytest-django==4.11.1
+ # via -r requirements/test.in
sortedcontainers==2.4.0
+ # via hypothesis