diff --git a/.gitignore b/.gitignore
index 28bff337f5f6a8a6611d4f825ccb0e5a81435602..371d8130242387041525da5cff703aed09aeabed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,4 +28,5 @@ yarn-error.log
 ###> squizlabs/php_codesniffer ###
 /.phpcs-cache
 /phpcs.xml
+./.php-cs-fixer.cache
 ###< squizlabs/php_codesniffer ###
diff --git a/composer.json b/composer.json
index 618202b02764ab4957fa2297b0273bba39690dca..ea32548189ac22ef923655034cfd647b6a7629ec 100644
--- a/composer.json
+++ b/composer.json
@@ -101,11 +101,12 @@
             "@auto-scripts"
         ],
         "ci": [
-            "@php-cs-fixer",
+            "@php_codesniffer",
             "@phpstan",
             "@unit-tests"
         ],
         "php-cs-fixer": "tools/php-cs-fixer/vendor/bin/php-cs-fixer fix src/",
+        "php_codesniffer": "php ./vendor/bin/phpcs",
         "phpstan": "vendor/bin/phpstan analyse src/",
         "unit-tests": "php ./vendor/bin/phpunit"
     },
diff --git a/phpcs.xml.dist b/phpcs.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..89195e2b0775569963cd339fcab3cb76000c8e8b
--- /dev/null
+++ b/phpcs.xml.dist
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="vendor/squizlabs/php_codesniffer/phpcs.xsd">
+
+    <arg name="basepath" value="."/>
+    <arg name="cache" value=".phpcs-cache"/>
+    <arg name="colors"/>
+    <arg name="extensions" value="php"/>
+
+    <rule ref="PSR12"/>
+
+    <file>bin/</file>
+    <file>config/</file>
+    <file>public/</file>
+    <file>src/</file>
+    <file>tests/</file>
+
+</ruleset>