diff --git a/.github/workflows/all-lints.yml b/.github/workflows/all-lints.yml
index 0a15aec..de59ecf 100644
--- a/.github/workflows/all-lints.yml
+++ b/.github/workflows/all-lints.yml
@@ -1,11 +1,41 @@
-name: all-lints
-
-on: [push]
-
+on:
+  push:
+  pull_request:
+name: Lint Python
 jobs:
-  lint:
-    runs-on: ubuntu-latest
+  lintpython:
+    name: Lint Python
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        os: [ubuntu-latest, macos-13, macos-latest, windows-latest]
+        python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']
+        exclude:
+          - os: macos-latest
+            python-version: 3.8
+          - os: macos-latest
+            python-version: 3.9
+          - os: macos-latest
+            python-version: 3.10
+          - os: macos-13
+            python-version: 3.11
+          - os: macos-13
+            python-version: 3.12
 
     steps:
-      - uses: actions/checkout@v1
-      - uses: rahul-deepsource/pyaction@master
+    - uses: actions/checkout@v4
+    - uses: ./
+      with:
+        python-root-list: "./tests/*.py ./tests/subtest/*.py"
+        use-black: true
+        use-isort: true
+        use-mypy: true
+        use-pycodestyle: true
+        use-pydocstyle: true
+        extra-pycodestyle-options: "--max-line-length=88"
+        use-pylint: false
+        use-flake8: false
+        use-vulture: true
+        python-version: ${{ matrix.python-version }}
+
+
diff --git a/.github/workflows/test-python-install.yml b/.github/workflows/test-python-install.yml
new file mode 100644
index 0000000..038dcd5
--- /dev/null
+++ b/.github/workflows/test-python-install.yml
@@ -0,0 +1,55 @@
+on:
+  push:
+  pull_request:
+name: Check python installation
+jobs:
+  pythoninstall:
+    name: Test Python install
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        os: [ubuntu-latest]
+        python-version: ['3.11']
+        use-external-python: [true, false]
+    env:
+      python-test-package: python-dummy
+    steps:
+    - uses: actions/checkout@v4
+
+    - name: Install Python if required
+      if: ${{ matrix.use-external-python }}
+      uses: actions/setup-python@v5
+      with:
+        python-version: ${{ matrix.python-version }}
+
+    - name: Install a test dependency if external Python is used
+      if: ${{ matrix.use-external-python }}
+      run:
+        pip install ${{ env.python-test-package }}
+
+    - name: Test Action usage
+      uses: ./
+      with:
+        python-root-list: "./tests/*.py ./tests/subtest/*.py"
+        use-black: true
+        use-isort: true
+        use-mypy: true
+        use-pycodestyle: true
+        use-pydocstyle: true
+        extra-pycodestyle-options: "--max-line-length=88"
+        use-pylint: false
+        use-flake8: false
+        use-vulture: true
+        python-version: ${{ matrix.python-version }}
+        use-external-python: ${{ matrix.use-external-python }}
+
+    - name: Check if test dependency exists after execution
+      run: |
+        pip freeze > all-deps.txt
+        should_appear=$( if [[ "${{ matrix.use-external-python }}" == "true" ]]; then echo 0; else echo 1; fi )
+        line_exists=$( grep -qF "${{ env.python-test-package }}" "all-deps.txt"; echo $? )
+        echo "test package should be installed: ${{ matrix.use-external-python }}"
+        echo "test package is present (0 = present): ${line_exists}"
+        cat all-deps.txt
+        test "${should_appear}" == "${line_exists}"
+      
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..ec93846
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+    "python.pythonPath": "/home/rynik/Software/anaconda3/bin/python"
+}
\ No newline at end of file
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
deleted file mode 100644
index ae75f26..0000000
--- a/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# Contributor Covenant Code of Conduct
-
-## Our Pledge
-
-In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to making participation in our project and
-our community a harassment-free experience for everyone, regardless of age, body
-size, disability, ethnicity, sex characteristics, gender identity and expression,
-level of experience, education, socio-economic status, nationality, personal
-appearance, race, religion, or sexual identity and orientation.
-
-## Our Standards
-
-Examples of behavior that contributes to creating a positive environment
-include:
-
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
-
-Examples of unacceptable behavior by participants include:
-
-* The use of sexualized language or imagery and unwelcome sexual attention or
- advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or electronic
- address, without explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Our Responsibilities
-
-Project maintainers are responsible for clarifying the standards of acceptable
-behavior and are expected to take appropriate and fair corrective action in
-response to any instances of unacceptable behavior.
-
-Project maintainers have the right and responsibility to remove, edit, or
-reject comments, commits, code, wiki edits, issues, and other contributions
-that are not aligned to this Code of Conduct, or to ban temporarily or
-permanently any contributor for other behaviors that they deem inappropriate,
-threatening, offensive, or harmful.
-
-## Scope
-
-This Code of Conduct applies both within project spaces and in public spaces
-when an individual is representing the project or its community. Examples of
-representing a project or community include using an official project e-mail
-address, posting via an official social media account, or acting as an appointed
-representative at an online or offline event. Representation of a project may be
-further defined and clarified by project maintainers.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported by contacting the project team at ricardobchaves6@gmail.com. All
-complaints will be reviewed and investigated and will result in a response that
-is deemed necessary and appropriate to the circumstances. The project team is
-obligated to maintain confidentiality with regard to the reporter of an incident.
-Further details of specific enforcement policies may be posted separately.
-
-Project maintainers who do not follow or enforce the Code of Conduct in good
-faith may face temporary or permanent repercussions as determined by other
-members of the project's leadership.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
-available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
-
-[homepage]: https://www.contributor-covenant.org
-
-For answers to common questions about this code of conduct, see
-https://www.contributor-covenant.org/faq
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 9d29f55..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-# Container image that runs your code
-FROM ricardobchaves6/python-lint-image:1.3.0
-
-# Copies your code file from your action repository to the filesystem path `/` of the container
-COPY entrypoint.sh /entrypoint.sh
-
-# Code file to execute when the docker container starts up (`entrypoint.sh`)
-ENTRYPOINT ["/entrypoint.sh"]
diff --git a/README.md b/README.md
index 5a46dc7..34e8534 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,9 @@
-# PyAction
+# python-lint-annotate
 
-One-stop, zero-configuration GitHub Action for linting and enforcing style in Python projects.
+Zero-configuration GitHub Action to maintain code quality with push and PR annotations.
+
+On every push and pull request git diffs will get inline annotated with found errors from
+selected linters.
 
 ![Screenshot of annotations](static/annotations.png)
 
@@ -8,7 +11,9 @@ One-stop, zero-configuration GitHub Action for linting and enforcing style in Py
 
 - Zero configuration based: Add a single line in your CI and done!
 - GitHub Annotations on PR: Highlights issues inline on the PR diff.
-- all of most popular community trusted linters in one place.
+- Most of the popular community trusted linters in one place.
+- Allows to use either a new or existing Python version using `use-external-python`.
+See [this example](examples/actions-use_external_python.yml).
 
 ## Linters supported
 
@@ -19,6 +24,7 @@ One-stop, zero-configuration GitHub Action for linting and enforcing style in Py
 - [pylint](https://www.pylint.org/)
 - [pycodestyle](https://pycodestyle.readthedocs.io)
 - [vulture](https://github.com/jendrikseipp/vulture)
+- [pydocstyle](https://github.com/PyCQA/pydocstyle)
 
 ## Usage
 
@@ -26,22 +32,80 @@ Basic:
 
 ```yml
 steps:
-  - uses: actions/checkout@v1
-  - uses: rahul-deepsource/pyaction@v1.4.0
+  - uses: actions/checkout@v4
+  - uses: marian-code/python-lint-annotate@v4
 ```
 
 Options:
 
 ```yml
 steps:
-  - uses: actions/checkout@v1
-  - uses: rahul-deepsource/pyaction@v1.4.0
+  - uses: actions/checkout@v4
+  - uses: marian-code/python-lint-annotate@v4
     with:
-      python-root-list: "src/ tests/"
+      python-root-list: "src/ tests/*"  # accepts wildcards
       use-pycodestyle: false
       use-mypy: false
       use-vulture: true
       extra-pylint-options: "--output-format="colorized"
+      python-version: "3.8"
+```
+
+### Examples
+* [Only lint changed files, and ignore missing docstrings](examples/actions-only_changed_files.yml)
+
+## Details
+
+Uses `actions/setup-python@v5`. Only python `3.8` - `3.12` versions are tested.
+Python `3.x` versions prior to `3.8` are not tested since they are EOL now.
+Any python `2.x` versions are unsupported! You can lint on Linux, Windows and MacOS.
+
+The linter versions are defined in [requirements.txt](requirements.txt).
+
+## IMPORTANT - test environment
+
+The python version is set by `actions/setup-python@v5` using composite actions. This
+means that the the action will change python you might have previously set with
+`actions/setup-python@v5`. There are two ways to circumvent this.
+
+- Keep the lintnig action separated from others
+- Use it at the and of your workflow when the change in python version will not
+   affect anything else
+
+Example:
+
+```yml
+on:
+  push:
+  pull_request:
+name: Lint Python
+jobs:
+  lintpython:
+    name: Lint Python
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v4
+    - uses: actions/setup-python@v5
+      with:
+        python-version: 3.9
+    - run: |
+        python --version  # this will output 3.9 now
+        run tests or other things using python ...
+    - uses: marian-code/python-lint-annotate@v4
+      with:
+        python-root-list: "./tests/*.py"
+        use-black: true
+        use-isort: true
+        use-mypy: true
+        use-pycodestyle: true
+        use-pydocstyle: true
+        extra-pycodestyle-options: "--max-line-length=88"
+        use-pylint: false
+        use-flake8: false
+        use-vulture: true
+        python-version: "3.8"
+    - run: |
+        python --version  # this will output 3.8 now !!!
 ```
 
 ## License
@@ -50,9 +114,9 @@ The scripts and documentation in this project are released under the [MIT Licens
 
 ## Contributions
 
-Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md)
+Contributions are welcome through PRs.
 
-## Thanks to
+## TODO
 
-- Ricardo Baltazar Chaves' [python-lint](https://github.com/ricardochaves/python-lint) which was used as a starting point for this project.
-- Florian Bruhin who provided most of the regular expressions for problem matchers.
+Wait until this is resolved: [PR646](https://github.com/actions/runner/issues/646)
+so we can implement better python version control
diff --git a/action.yml b/action.yml
index 0204457..746853d 100644
--- a/action.yml
+++ b/action.yml
@@ -1,10 +1,13 @@
-name: "PyAction: One-stop Python linter"
-description: "One-stop, zero-configuration GitHub Action for linting and enforcing style in Python projects."
+name: "Python-lint-annotate: maintain code quality with annotated PRs and pushes"
+description: "Zero-configuration GitHub Action to maintain code quality with push and PR annotations."
+branding:
+  icon: "alert-triangle"
+  color: "yellow"
 inputs:
   python-root-list:
     description: "A list of all paths to test"
     required: false
-    default: "./**/*.py"
+    default: "."
   use-pylint:
     description: "Use Pylint"
     required: false
@@ -33,6 +36,10 @@ inputs:
     description: "Use vulture"
     required: false
     default: true
+  use-pydocstyle:
+    description: "Use pydocstyle"
+    required: false
+    default: true
   extra-pylint-options:
     description: "Extra options: pylint $(extra-pylint-options) $(python-root-list)"
     required: false
@@ -61,26 +68,88 @@ inputs:
     description: "Extra options: vulture $(extra-vulture-options) $(python-root-list)"
     required: false
     default: ""
+  extra-pydocstyle-options:
+    description: "Extra options: pydocstyle $(extra-pydocstyle-options) $(python-root-list)"
+    required: false
+    default: ""
+  python-version:
+    description: "Set desired python version with this keyword"
+    required: false
+    default: "3.8"
+  use-external-python:
+    description: "false (default): Install a new Python for this action; true: use the python installation in the previous steps"
+    type: boolean
+    required: false
+    default: false
 
 runs:
-  using: "docker"
-  image: "Dockerfile"
-  args:
-    - ${{ inputs.python-root-list }}
-    - ${{ inputs.use-pylint }}
-    - ${{ inputs.use-pycodestyle }}
-    - ${{ inputs.use-flake8 }}
-    - ${{ inputs.use-black }}
-    - ${{ inputs.use-mypy }}
-    - ${{ inputs.use-isort }}
-    - ${{ inputs.use-vulture }}
-    - ${{ inputs.extra-pylint-options }}
-    - ${{ inputs.extra-pycodestyle-options }}
-    - ${{ inputs.extra-flake8-options }}
-    - ${{ inputs.extra-black-options }}
-    - ${{ inputs.extra-mypy-options }}
-    - ${{ inputs.extra-isort-options }}
-    - ${{ inputs.extra-vulture-options }}
-branding:
-  icon: "check"
-  color: "gray-dark"
+  using: "composite"
+  steps:
+    - name: Setup python
+      if: ${{ ! inputs.use-external-python }}
+      uses: actions/setup-python@v5
+      with:
+        python-version: ${{ inputs.python-version }}
+        architecture: x64
+        cache: pip
+    
+    - run: python --version
+      shell: bash
+
+    - name: Windows install dependencies
+      if: ${{ runner.os == 'Windows' }}
+      run:  |
+        pip install -r ${{ github.action_path }}\requirements.txt --ignore-installed
+        echo "path_sep=" >> $GITHUB_ENV
+      shell: pwsh
+
+    - name: Posix install dependencies
+      if: ${{ runner.os != 'Windows' }}
+      run:  pip install -r ${{ github.action_path }}/requirements.txt --ignore-installed
+      shell: bash
+
+    - name: Lint on Windows
+      if: ${{ runner.os == 'Windows' }}
+      run: >
+        ${{ github.action_path }}\entrypoint.sh
+        '${{ inputs.python-root-list }}'
+        ${{ inputs.use-pylint }}
+        ${{ inputs.use-pycodestyle }}
+        ${{ inputs.use-flake8 }}
+        ${{ inputs.use-black }}
+        ${{ inputs.use-mypy }}
+        ${{ inputs.use-isort }}
+        ${{ inputs.use-vulture }}
+        ${{ inputs.use-pydocstyle }}
+        '${{ inputs.extra-pylint-options }}'
+        '${{ inputs.extra-pycodestyle-options }}'
+        '${{ inputs.extra-flake8-options }}'
+        '${{ inputs.extra-black-options }}'
+        '${{ inputs.extra-mypy-options }}'
+        '${{ inputs.extra-isort-options }}'
+        '${{ inputs.extra-vulture-options }}'
+        '${{ inputs.extra-pydocstyle-options }}'
+      shell: pwsh
+
+    - name: Lint on Linux
+      if: ${{ runner.os == 'Linux' }}
+      run: >
+        ${{ github.action_path }}/entrypoint.sh
+        '${{ inputs.python-root-list }}'
+        ${{ inputs.use-pylint }}
+        ${{ inputs.use-pycodestyle }}
+        ${{ inputs.use-flake8 }}
+        ${{ inputs.use-black }}
+        ${{ inputs.use-mypy }}
+        ${{ inputs.use-isort }}
+        ${{ inputs.use-vulture }}
+        ${{ inputs.use-pydocstyle }}
+        '${{ inputs.extra-pylint-options }}'
+        '${{ inputs.extra-pycodestyle-options }}'
+        '${{ inputs.extra-flake8-options }}'
+        '${{ inputs.extra-black-options }}'
+        '${{ inputs.extra-mypy-options }}'
+        '${{ inputs.extra-isort-options }}'
+        '${{ inputs.extra-vulture-options }}'
+        '${{ inputs.extra-pydocstyle-options }}'
+      shell: bash
diff --git a/entrypoint.sh b/entrypoint.sh
index 9e6f2f3..0e84798 100755
--- a/entrypoint.sh
+++ b/entrypoint.sh
@@ -1,5 +1,3 @@
-#!/bin/sh -l
-
 # Parameters
 #
 # $1 - python-root-list
@@ -10,32 +8,57 @@
 # $6 - use-mypy
 # $7 - use-isort
 # $8 - use-vulture
-# $9 - extra-pylint-options
-# ${10} - extra-pycodestyle-options
-# ${11} - extra-flake8-options
-# ${12} - extra-black-options
-# ${13} - extra-mypy-options
-# ${14} - extra-isort-options
-# ${15} - extra-vulture-options
-
-cp flake8.json /github/workflow/flake8.json
-cp mypy.json /github/workflow/mypy.json
-cp pylint-error.json /github/workflow/pylint-error.json
-cp pylint-warning.json /github/workflow/pylint-warning.json
-cp vulture.json /github/workflow/vulture.json
-echo "::add-matcher::${RUNNER_TEMP}/_github_workflow/flake8.json"
-echo "::add-matcher::${RUNNER_TEMP}/_github_workflow/mypy.json"
-echo "::add-matcher::${RUNNER_TEMP}/_github_workflow/pylint-error.json"
-echo "::add-matcher::${RUNNER_TEMP}/_github_workflow/pylint-warning.json"
-echo "::add-matcher::${RUNNER_TEMP}/_github_workflow/vulture.json"
+# $9 - use-pydocstyle
+# ${10} - extra-pylint-options
+# ${11} - extra-pycodestyle-options
+# ${12} - extra-flake8-options
+# ${13} - extra-black-options
+# ${14} - extra-mypy-options
+# ${15} - extra-isort-options
+# ${16} - extra-vulture-options
+# ${17} - extra-pydocstyle-options
+
+echo python-root-list:          $1
+echo use-pylint:                $2
+echo use-pycodestyle:           $3
+echo use-flake8:                $4
+echo use-black:                 $5
+echo use-mypy:                  $6
+echo use-isort:                 $7
+echo use-vulture:               $8
+echo use-pydocstyle             $9
+echo extra-pylint-options:      ${10}
+echo extra-pycodestyle-options: ${11}
+echo extra-flake8-options:      ${12}
+echo extra-black-options:       ${13}
+echo extra-mypy-options:        ${14}
+echo extra-isort-options:       ${15}
+echo extra-vulture-options:     ${16}
+echo extra-pydocstyle-options:  ${17}
+
+# actions path has the copy of this actions repo
+echo $RUNNER_OS
+if [ $RUNNER_OS = 'Windows' ]
+then
+    MATCHERS=$GITHUB_ACTION_PATH\matchers\*.json
+else
+    MATCHERS=$GITHUB_ACTION_PATH/matchers/*.json
+fi
+echo $MATCHERS
+
+for matcher in $MATCHERS
+do
+    echo adding matcher $matcher
+    echo "::add-matcher::${matcher}"
+done
 echo "TERM: changing from $TERM -> xterm"
 export TERM=xterm
 
 if [ "$2" = true ] ; then
 
-    echo Running: pylint $9 $1
+    echo Running: pylint ${10} $1
 
-    pylint --output-format="colorized" $9 $1
+    pylint --output-format="colorized" ${10} $1
     exit_code=$?
 
     if [ "$exit_code" = "0" ]; then
@@ -46,12 +69,11 @@ if [ "$2" = true ] ; then
 
 fi
 
-
 if [ "$3" = true ] ; then
 
-    echo Running: pycodestyle ${10} $1
+    echo Running: pycodestyle ${11} $1
 
-    pycodestyle ${10} $1
+    pycodestyle ${11} $1
     exit_code=$?
 
     if [ "$exit_code" = "0" ]; then
@@ -64,9 +86,9 @@ fi
 
 if [ "$4" = true ] ; then
 
-    echo Running: flake8 ${11} $1
+    echo Running: flake8 ${12} $1
 
-    flake8 ${11} $1
+    flake8 ${12} $1
     exit_code=$?
 
     if [ "$exit_code" = "0" ]; then
@@ -79,9 +101,9 @@ fi
 
 if [ "$5" = true ] ; then
 
-    echo Running: black --check ${12} $1
+    echo Running: black --check ${13} $1
 
-    black --check ${12} $1
+    black --check ${13} $1
     exit_code=$?
 
     if [ "$exit_code" = "0" ]; then
@@ -94,9 +116,13 @@ fi
 
 if [ "$6" = true ] ; then
 
-    echo Running: mypy ${13} $1
+    echo Running: mypy --install-types --non-interactive --ignore-missing-imports --follow-imports=silent --show-column-numbers ${14} $1
 
-    mypy ${13} $1
+    mypy \
+      --install-types --non-interactive \
+      --ignore-missing-imports \
+      --follow-imports=silent \
+      --show-column-numbers ${14} $1
     exit_code=$?
 
     if [ "$exit_code" = "0" ]; then
@@ -109,9 +135,9 @@ fi
 
 if [ "$7" = true ] ; then
 
-    echo Running: isort ${14} $1 -c --diff
+    echo Running: isort ${15} $1 -c --diff
 
-    isort ${14} $1 -c --diff
+    isort ${15} $1 -c --diff
     exit_code=$?
 
     if [ "$exit_code" = "0" ]; then
@@ -124,9 +150,9 @@ fi
 
 if [ "$8" = true ] ; then
 
-    echo Running: vulture ${15} $1
+    echo Running: vulture ${16} $1
 
-    vulture ${15} $1
+    vulture ${16} $1
     exit_code=$?
 
     if [ "$exit_code" = "0" ]; then
@@ -136,3 +162,18 @@ if [ "$8" = true ] ; then
     fi
 
 fi
+
+if [ "$9" = true ] ; then
+
+    echo Running: pydocstyle ${17} $1
+
+    pydocstyle ${17} $1
+    exit_code=$?
+
+    if [ "$exit_code" = "0" ]; then
+        echo "pycodestyle ok"
+    else
+        echo "pycodestyle error"
+    fi
+
+fi
diff --git a/examples/actions-only_changed_files.yml b/examples/actions-only_changed_files.yml
new file mode 100644
index 0000000..3bb23bd
--- /dev/null
+++ b/examples/actions-only_changed_files.yml
@@ -0,0 +1,26 @@
+name: Lint only files changed in Pull Request, and ignore Missing docstrings
+on:
+  pull_request:
+    types: [ opened, reopened, synchronize, edited ]
+jobs:
+  lint:
+    runs-on: ubuntu-latest
+    name: Lint
+    steps:
+      - name: Check out source repository
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0  # This is necessary to get the commits
+      - name: Set up Python environment
+        uses: actions/setup-python@v5
+        with:
+          python-version: "3.8"
+      - name: Get changed python files between base and head
+        run: >
+          echo "CHANGED_FILES=$(echo $(git diff --name-only ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }} -- | grep \.py))" >> $GITHUB_ENV
+      - if: ${{ env.CHANGED_FILES }}
+        uses: marian-code/python-lint-annotate@v3
+        with:
+          python-root-list: ${{ env.CHANGED_FILES }}
+          extra-pylint-options: "--disable=C0114,C0116"  # Missing doctrings
+          extra-pydocstyle-options: "--ignore=D1"  # Missing doctrings http://www.pydocstyle.org/en/stable/error_codes.html#grouping
diff --git a/matchers/black.json b/matchers/black.json
new file mode 100644
index 0000000..00d1aff
--- /dev/null
+++ b/matchers/black.json
@@ -0,0 +1,18 @@
+{
+  "problemMatcher": [
+    {
+      "severity": "warning",
+      "column": 1,
+      "line": 1,
+      "code": "W",
+      "pattern": [
+        {
+          "regexp": "^(would reformat) (.*)$",
+          "file": 2,
+          "message": 1
+        }
+      ],
+      "owner": "black"
+    }
+  ]
+}
diff --git a/matchers/black_severity.json b/matchers/black_severity.json
new file mode 100644
index 0000000..d2af053
--- /dev/null
+++ b/matchers/black_severity.json
@@ -0,0 +1,18 @@
+{
+  "problemMatcher": [
+    {
+      "column": 1,
+      "line": 1,
+      "code": "W",
+      "pattern": [
+        {
+          "regexp": "^#{0,2}\\[([a-z]*)\\](would reformat) (.*)$",
+          "severity": 1,
+          "file": 3,
+          "message": 2
+        }
+      ],
+      "owner": "black_severity"
+    }
+  ]
+}
diff --git a/matchers/flake8.json b/matchers/flake8.json
new file mode 100644
index 0000000..aa0f342
--- /dev/null
+++ b/matchers/flake8.json
@@ -0,0 +1,18 @@
+{
+  "problemMatcher": [
+    {
+      "severity": "warning",
+      "pattern": [
+        {
+          "regexp": "(\\S+):(\\d+):(\\d+): ([A-Z]\\d+) (.*)",
+          "file": 1,
+          "line": 2,
+          "column": 3,
+          "code": 4,
+          "message": 5
+        }
+      ],
+      "owner": "flake8"
+    }
+  ]
+}
diff --git a/flake8.json b/matchers/flake8_severity.json
similarity index 59%
rename from flake8.json
rename to matchers/flake8_severity.json
index 7ae5e85..69ef267 100644
--- a/flake8.json
+++ b/matchers/flake8_severity.json
@@ -1,10 +1,10 @@
 {
   "problemMatcher": [
     {
-      "severity": "warning",
       "pattern": [
         {
-          "regexp": "^(\\033\\[0m)?([^:]+):(\\d+):(\\d+): ([A-Z]\\d{3}) (.*)$",
+          "regexp": "^##\\[([a-z]+)\\](\\S+):(\\d+):(\\d+): ([A-Z]\\d+) (.*)",
+          "severity": 1,
           "file": 2,
           "line": 3,
           "column": 4,
@@ -12,7 +12,7 @@
           "message": 6
         }
       ],
-      "owner": "flake8"
+      "owner": "flake8_severity"
     }
   ]
 }
diff --git a/matchers/isort.json b/matchers/isort.json
new file mode 100644
index 0000000..0bbe6df
--- /dev/null
+++ b/matchers/isort.json
@@ -0,0 +1,16 @@
+{
+    "problemMatcher": [
+      {
+        "pattern": [
+          {
+            "regexp": "^(\\S*): (\\S*) (.*)$",
+            "file": 2,
+            "severity": 1,
+            "message": 3
+          }
+        ],
+        "owner": "isort"
+      }
+    ]
+  }
+  
\ No newline at end of file
diff --git a/matchers/isort_severity.json b/matchers/isort_severity.json
new file mode 100644
index 0000000..b1b5616
--- /dev/null
+++ b/matchers/isort_severity.json
@@ -0,0 +1,16 @@
+{
+    "problemMatcher": [
+      {
+        "pattern": [
+          {
+            "regexp": "^#{0,2}\\[([a-z]*)\\](\\S*): (\\S*) (.*)$",
+            "file": 3,
+            "severity": 1,
+            "message": 4
+          }
+        ],
+        "owner": "isort_severity"
+      }
+    ]
+  }
+  
\ No newline at end of file
diff --git a/matchers/mypy.json b/matchers/mypy.json
new file mode 100644
index 0000000..1c6d7b2
--- /dev/null
+++ b/matchers/mypy.json
@@ -0,0 +1,18 @@
+{
+  "problemMatcher": [
+    {
+      "code": "E",
+      "pattern": [
+        {
+          "regexp": "^(\\S*):(\\d+):(\\d+): ([a-z]+): (.*)$",
+          "file": 1,
+          "column": 3,
+          "line": 2,
+          "severity": 4,
+          "message": 5
+        }
+      ],
+      "owner": "mypy"
+    }
+  ]
+}
diff --git a/matchers/mypy_severity.json b/matchers/mypy_severity.json
new file mode 100644
index 0000000..4547d8b
--- /dev/null
+++ b/matchers/mypy_severity.json
@@ -0,0 +1,18 @@
+{
+  "problemMatcher": [
+    {
+      "code": "E",
+      "pattern": [
+        {
+          "regexp": "^#{0,2}\\[([a-z]*)\\](\\S*)(\\d+):(\\d+): ([a-z]+): (.*)$",
+          "file": 2,
+          "column": 4,
+          "line": 3,
+          "severity": 1,
+          "message": 6
+        }
+      ],
+      "owner": "mypy_severity"
+    }
+  ]
+}
diff --git a/matchers/pycodestyle.json b/matchers/pycodestyle.json
new file mode 100644
index 0000000..fe22a4c
--- /dev/null
+++ b/matchers/pycodestyle.json
@@ -0,0 +1,18 @@
+{
+  "problemMatcher": [
+    {
+      "severity": "warning",
+      "pattern": [
+        {
+          "regexp": "^(\\S*):(\\d+):(\\d+): ([A-Z]\\d+) (.*)$",
+          "file": 1,
+          "line": 2,
+          "column": 3,
+          "code": 4,
+          "message": 5
+        }
+      ],
+      "owner": "pycodestyle"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/matchers/pycodestyle_severity.json b/matchers/pycodestyle_severity.json
new file mode 100644
index 0000000..940639e
--- /dev/null
+++ b/matchers/pycodestyle_severity.json
@@ -0,0 +1,18 @@
+{
+  "problemMatcher": [
+    {
+      "pattern": [
+        {
+          "regexp": "^##\\[([a-z]*)\\](\\S*):(\\d+):(\\d+): ([A-Z]\\d+) (.*)$",
+          "severity": 1,
+          "file": 2,
+          "line": 3,
+          "column": 4,
+          "code": 5,
+          "message": 6
+        }
+      ],
+      "owner": "pycodestyle_severity"
+    }
+  ]
+}
diff --git a/matchers/pydocstyle.json b/matchers/pydocstyle.json
new file mode 100644
index 0000000..d533daa
--- /dev/null
+++ b/matchers/pydocstyle.json
@@ -0,0 +1,21 @@
+{
+    "problemMatcher": [
+        {
+            "severity": "warning",
+            "column": 1,
+            "pattern": [
+                {
+                    "regexp": "^(\\S*):(\\d*) .*",
+                    "file": 1,
+                    "line": 2
+                },
+                {
+                    "regexp": "\\s*(D\\d*): (.*)$",
+                    "message": 2,
+                    "code": 1
+                }
+            ],
+            "owner": "pydocstyle"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/matchers/pydocstyle_severity.json b/matchers/pydocstyle_severity.json
new file mode 100644
index 0000000..808d8ae
--- /dev/null
+++ b/matchers/pydocstyle_severity.json
@@ -0,0 +1,21 @@
+{
+    "problemMatcher": [
+        {
+            "column": 1,
+            "pattern": [
+                {
+                    "regexp": "^(\\S*):(\\d*) .*",
+                    "file": 1,
+                    "line": 2
+                },
+                {
+                    "regexp": "^##\\[([a-z]*)\\]\\s*(D\\d*): (.*)$",
+                    "severity": 1,
+                    "message": 3,
+                    "code": 2
+                }
+            ],
+            "owner": "pydocstyle_severity"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/pylint-error.json b/matchers/pylint-error.json
similarity index 100%
rename from pylint-error.json
rename to matchers/pylint-error.json
diff --git a/pylint-warning.json b/matchers/pylint-warning.json
similarity index 100%
rename from pylint-warning.json
rename to matchers/pylint-warning.json
diff --git a/vulture.json b/matchers/vulture.json
similarity index 89%
rename from vulture.json
rename to matchers/vulture.json
index ec57511..fdb7dd5 100644
--- a/vulture.json
+++ b/matchers/vulture.json
@@ -1,7 +1,6 @@
 {
   "problemMatcher": [
     {
-      "severity": "warning",
       "pattern": [
         {
           "regexp": "^([^:]+):(\\d+): ([^(]+ \\(\\d+% confidence\\))$",
diff --git a/matchers/vulture_severity.json b/matchers/vulture_severity.json
new file mode 100644
index 0000000..d65b82f
--- /dev/null
+++ b/matchers/vulture_severity.json
@@ -0,0 +1,16 @@
+{
+  "problemMatcher": [
+    {
+      "pattern": [
+        {
+          "regexp": "^##\\[([a-z]*)\\](\\S+):(\\d+): ([^(]+ \\(\\d+% confidence\\))$",
+          "severity": 1,
+          "file": 2,
+          "line": 3,
+          "message": 4
+        }
+      ],
+      "owner": "vulture_severity"
+    }
+  ]
+}
diff --git a/mypy.json b/mypy.json
deleted file mode 100644
index bd29cb9..0000000
--- a/mypy.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "problemMatcher": [
-    {
-      "pattern": [
-        {
-          "regexp": "^(\\033\\[0m)?([^:]+):(\\d+): ([^:]+): (.*)  \\[(.*)\\]$",
-          "file": 2,
-          "line": 3,
-          "severity": 4,
-          "message": 5,
-          "code": 6
-        }
-      ],
-      "owner": "mypy"
-    }
-  ]
-}
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..95890b8
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,8 @@
+black==24.3.0
+flake8==7.0.0
+isort==5.13.2
+mypy~=1.9.0
+pycodestyle==2.11.1
+pydocstyle==6.3.0
+pylint==3.1.0
+vulture==2.11
diff --git a/tests/subtest/subtest_python_code.py b/tests/subtest/subtest_python_code.py
new file mode 100644
index 0000000..3bc587a
--- /dev/null
+++ b/tests/subtest/subtest_python_code.py
@@ -0,0 +1,6 @@
+import this
+
+print (
+    ""
+    end     =    ""
+)
\ No newline at end of file
diff --git a/tests/test_python_code.py b/tests/test_python_code.py
index 2ba26f8..1ddb38e 100644
--- a/tests/test_python_code.py
+++ b/tests/test_python_code.py
@@ -1,13 +1,19 @@
-"""Just one teste"""
+"""Just one test"""
 
 import uuid
+import collections
+import pathlib
 
 
-def get_name_len(name: str) -> int:
+def get_name_len(name: str) -> str:
     """Len var"""
-    return len(name)
-
+    a=5
+    a = 5    
+    c = 8    
+    f=5
 
+    f = lambda x: x**2
+    return len(name)
 def start():
     "Run ... "
     print(get_name_len("Ricardo"))
