diff --git a/.gitignore b/.gitignore
index 1857403580cec0f3b94131e261a31dd777b30897..57d18f0f2b470c6d9076d55d310150efc9dba424 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,6 @@ a.out
 .pytest_cache
 
 test/nodal-dg
+
+.pylintrc.yml
+.run-pylint.py
diff --git a/run-pylint.sh b/run-pylint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6c7386669da645c3349bfb09355b80d0573f7273
--- /dev/null
+++ b/run-pylint.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+set -o errexit -o nounset
+
+ci_support="https://gitlab.tiker.net/inducer/ci-support/raw/main"
+
+if [[ ! -f .pylintrc.yml ]]; then
+    curl -o .pylintrc.yml "${ci_support}/.pylintrc-default.yml"
+fi
+
+
+if [[ ! -f .run-pylint.py ]]; then
+    curl -L -o .run-pylint.py "${ci_support}/run-pylint.py"
+fi
+
+
+PYLINT_RUNNER_ARGS="--jobs=4 --yaml-rcfile=.pylintrc.yml"
+
+if [[ -f .pylintrc-local.yml ]]; then
+    PYLINT_RUNNER_ARGS+=" --yaml-rcfile=.pylintrc-local.yml"
+fi
+
+python .run-pylint.py $PYLINT_RUNNER_ARGS $(basename $PWD) test/test_*.py examples "$@"