diff --git a/.hooks/pre-commit b/.hooks/pre-commit
deleted file mode 100755
index e206cfbe424d6b1409434282ad245c40756baa68..0000000000000000000000000000000000000000
--- a/.hooks/pre-commit
+++ /dev/null
@@ -1,195 +0,0 @@
-#!/usr/bin/env python
-"""File generated by pre-commit: https://pre-commit.com"""
-from __future__ import print_function
-
-import distutils.spawn
-import os
-import subprocess
-import sys
-
-# work around https://github.com/Homebrew/homebrew-core/issues/30445
-os.environ.pop('__PYVENV_LAUNCHER__', None)
-
-HERE = os.path.dirname(os.path.abspath(__file__))
-Z40 = '0' * 40
-ID_HASH = '138fd403232d2ddd5efb44317e38bf03'
-# start templated
-CONFIG = '.pre-commit-config.yaml'
-HOOK_TYPE = 'pre-commit'
-INSTALL_PYTHON = '/home/rplanel/.virtualenvs/crispr-bact/bin/python3'
-SKIP_ON_MISSING_CONFIG = False
-# end templated
-
-
-class EarlyExit(RuntimeError):
-    pass
-
-
-class FatalError(RuntimeError):
-    pass
-
-
-def _norm_exe(exe):
-    """Necessary for shebang support on windows.
-
-    roughly lifted from `identify.identify.parse_shebang`
-    """
-    with open(exe, 'rb') as f:
-        if f.read(2) != b'#!':
-            return ()
-        try:
-            first_line = f.readline().decode('UTF-8')
-        except UnicodeDecodeError:
-            return ()
-
-        cmd = first_line.split()
-        if cmd[0] == '/usr/bin/env':
-            del cmd[0]
-        return tuple(cmd)
-
-
-def _run_legacy():
-    if __file__.endswith('.legacy'):
-        raise SystemExit(
-            "bug: pre-commit's script is installed in migration mode\n"
-            'run `pre-commit install -f --hook-type {}` to fix this\n\n'
-            'Please report this bug at '
-            'https://github.com/pre-commit/pre-commit/issues'.format(
-                HOOK_TYPE,
-            ),
-        )
-
-    if HOOK_TYPE == 'pre-push':
-        stdin = getattr(sys.stdin, 'buffer', sys.stdin).read()
-    else:
-        stdin = None
-
-    legacy_hook = os.path.join(HERE, '{}.legacy'.format(HOOK_TYPE))
-    if os.access(legacy_hook, os.X_OK):
-        cmd = _norm_exe(legacy_hook) + (legacy_hook,) + tuple(sys.argv[1:])
-        proc = subprocess.Popen(cmd, stdin=subprocess.PIPE if stdin else None)
-        proc.communicate(stdin)
-        return proc.returncode, stdin
-    else:
-        return 0, stdin
-
-
-def _validate_config():
-    cmd = ('git', 'rev-parse', '--show-toplevel')
-    top_level = subprocess.check_output(cmd).decode('UTF-8').strip()
-    cfg = os.path.join(top_level, CONFIG)
-    if os.path.isfile(cfg):
-        pass
-    elif SKIP_ON_MISSING_CONFIG or os.getenv('PRE_COMMIT_ALLOW_NO_CONFIG'):
-        print(
-            '`{}` config file not found. '
-            'Skipping `pre-commit`.'.format(CONFIG),
-        )
-        raise EarlyExit()
-    else:
-        raise FatalError(
-            'No {} file was found\n'
-            '- To temporarily silence this, run '
-            '`PRE_COMMIT_ALLOW_NO_CONFIG=1 git ...`\n'
-            '- To permanently silence this, install pre-commit with the '
-            '--allow-missing-config option\n'
-            '- To uninstall pre-commit run '
-            '`pre-commit uninstall`'.format(CONFIG),
-        )
-
-
-def _exe():
-    with open(os.devnull, 'wb') as devnull:
-        for exe in (INSTALL_PYTHON, sys.executable):
-            try:
-                if not subprocess.call(
-                        (exe, '-c', 'import pre_commit.main'),
-                        stdout=devnull, stderr=devnull,
-                ):
-                    return (exe, '-m', 'pre_commit.main', 'run')
-            except OSError:
-                pass
-
-    if distutils.spawn.find_executable('pre-commit'):
-        return ('pre-commit', 'run')
-
-    raise FatalError(
-        '`pre-commit` not found.  Did you forget to activate your virtualenv?',
-    )
-
-
-def _rev_exists(rev):
-    return not subprocess.call(('git', 'rev-list', '--quiet', rev))
-
-
-def _pre_push(stdin):
-    remote = sys.argv[1]
-
-    opts = ()
-    for line in stdin.decode('UTF-8').splitlines():
-        _, local_sha, _, remote_sha = line.split()
-        if local_sha == Z40:
-            continue
-        elif remote_sha != Z40 and _rev_exists(remote_sha):
-            opts = ('--origin', local_sha, '--source', remote_sha)
-        else:
-            # ancestors not found in remote
-            ancestors = subprocess.check_output((
-                'git', 'rev-list', local_sha, '--topo-order', '--reverse',
-                '--not', '--remotes={}'.format(remote),
-            )).decode().strip()
-            if not ancestors:
-                continue
-            else:
-                first_ancestor = ancestors.splitlines()[0]
-                cmd = ('git', 'rev-list', '--max-parents=0', local_sha)
-                roots = set(subprocess.check_output(cmd).decode().splitlines())
-                if first_ancestor in roots:
-                    # pushing the whole tree including root commit
-                    opts = ('--all-files',)
-                else:
-                    cmd = ('git', 'rev-parse', '{}^'.format(first_ancestor))
-                    source = subprocess.check_output(cmd).decode().strip()
-                    opts = ('--origin', local_sha, '--source', source)
-
-    if opts:
-        return opts
-    else:
-        # An attempt to push an empty changeset
-        raise EarlyExit()
-
-
-def _opts(stdin):
-    fns = {
-        'prepare-commit-msg': lambda _: ('--commit-msg-filename', sys.argv[1]),
-        'commit-msg': lambda _: ('--commit-msg-filename', sys.argv[1]),
-        'pre-commit': lambda _: (),
-        'pre-push': _pre_push,
-    }
-    stage = HOOK_TYPE.replace('pre-', '')
-    return ('--config', CONFIG, '--hook-stage', stage) + fns[HOOK_TYPE](stdin)
-
-
-if sys.version_info < (3, 7):  # https://bugs.python.org/issue25942
-    def _subprocess_call(cmd):  # this is the python 2.7 implementation
-        return subprocess.Popen(cmd).wait()
-else:
-    _subprocess_call = subprocess.call
-
-
-def main():
-    retv, stdin = _run_legacy()
-    try:
-        _validate_config()
-        return retv | _subprocess_call(_exe() + _opts(stdin))
-    except EarlyExit:
-        return retv
-    except FatalError as e:
-        print(e.args[0])
-        return 1
-    except KeyboardInterrupt:
-        return 1
-
-
-if __name__ == '__main__':
-    exit(main())
diff --git a/README.md b/README.md
index 4441a6392fa820cb9065f718b2ba1c40fc6129a8..a40e33be7696d684af6113f7e823287136b2755d 100644
--- a/README.md
+++ b/README.md
@@ -164,3 +164,37 @@ CGTTTGAGGAGATCCACAAAATTAT	732	-1.2437430146548256	CP027060.1
 CATGAATGGTATAAACCGGCGTGCC	680	-0.8043242669169294	CP027060.1
 
 ```
+
+## Contributing
+
+### Create a virtualenv
+
+```console
+$ virtualenv -p pyton3.7 .venv
+$ . .venv/bin/activate
+$ pip install poetry
+```
+
+### Install crisprbact dependencies
+
+```console
+$ poetry install
+```
+
+### Install hooks
+
+```console
+$ pre-commit install
+```
+
+
+<!--
+### Change hooks
+
+
+```console
+$ git config --unset-all core.hooksPath
+$ pre-commit install
+$ cp .git/hooks/pre-commit .hooks/pre-commit
+$ git config core.hooksPath .hooks/
+``` -->