diff --git a/.github/workflows/check_encoding.yml b/.github/workflows/check_encoding.yml
index 9621310b4c6a3746c775e07540ceed6e02d8cd0d..b6676a4afbfcc9602690bc6302cb13d0dedc47d4 100644
--- a/.github/workflows/check_encoding.yml
+++ b/.github/workflows/check_encoding.yml
@@ -4,11 +4,7 @@ name: check_encoding
 
 # Controls when the action will run. Triggers the workflow on push or pull request
 # events but only for the master branch
-on:
-  push:
-    branches: [ master ]
-  pull_request:
-    branches: [ master ]
+on: [push]
 
 # A workflow run is made up of one or more jobs that can run sequentially or in parallel
 jobs:
@@ -23,34 +19,15 @@ jobs:
     - name: checking out personoj
       uses: actions/checkout@v2
 
-    - name: recovering cached opam files...
-      uses: actions/cache@v2
-      with:
-        path: ~/.opam
-        key: ${{ runner.os }}-ocaml-4.11.1
+    - name: Use opam
+      uses: ocaml/setup-ocaml@v2
 
-    - name: setting up opam
-      uses: avsm/setup-ocaml@v1
-      with:
-        ocaml-version: 4.11.1
-
-    - name: get lambdapi
-      uses: actions/checkout@v2
-      with:
-        repository: gabrielhdt/lambdapi
-        ref: refiner
-        path: lambdapi
-
-    # Runs a set of commands using the runners shell
-    - name: install lambdapi and deps
+    - name: Install lambdapi
       run: |
-        sudo apt install --yes bmake perl
-        (cd "${GITHUB_WORKSPACE}/lambdapi/" || exit 1
-         opam install .)
-        eval $(opam env)
-        why3 config detect
+        opam pin add 'git://github.com/gabrielhdt/lambdapi#refiner'
+        opam exec -- why3 config detect
 
     - name: check encoding
       run: |
-        eval $(opam env)
-        bmake encoding
+        yes | sudo apt install bmake
+        opam exec -- bmake encoding
diff --git a/.github/workflows/proof_tools.yml b/.github/workflows/proof_tools.yml
index f219314ab1d499769e5da85ed17cbf5a7834fef4..82d47017026ae989c0c576a592fd1f7a8badbb55 100644
--- a/.github/workflows/proof_tools.yml
+++ b/.github/workflows/proof_tools.yml
@@ -4,6 +4,13 @@ on: [push]
 
 jobs:
   build:
+    strategy:
+      fail-fast: false
+      matrix:
+        ocaml-compiler:
+          - 4.08.x
+          - 4.13.x
+
     runs-on: ubuntu-latest
 
     steps:
@@ -11,20 +18,31 @@ jobs:
       with:
         path: personoj
 
-    - name: setup
-      run: ${GITHUB_WORKSPACE}/personoj/tools/bootstrap.sh
-      shell: sh
+    - name: Use ocaml
+      uses: ocaml/setup-ocaml@v2
+      with:
+        ocaml-compiler: ${{ matrix.ocaml-compiler }}
+
+    - name: Pin lambdapi
+      run: opam pin add 'git://github.com/gabrielhdt/lambdapi#refiner'
+
+    - name: dopth
+      run: |
+        cd "${GITHUB_WORKSPACE}"/personoj/proofs/dopth || exit 1
+        opam install dune --yes
+        opam exec -- dune build
+        opam exec -- dune runtest
+
+    - name: chainprops
+      run: |
+        cd "${GITHUB_WORKSPACE}"/personoj/proofs/chainprops || exit 1
+        opam install . --deps-only --yes
+        opam exec -- dune build
+        opam exec -- dune runtest
 
-    - name: compile and run tests
+    - name: appaxiom
       run: |
-        cd "${GITHUB_WORKSPACE}"/personoj/proofs/ || exit 1
-        (cd dopth || exit 1
-         opam switch create . --packages dune --yes
-         eval $(opam env)
-         bmake tests)
-        (cd chainprops || exit 1
-         opam switch create . --deps-only --yes
-         eval $(opam env)
-         opam pin add ~/lambdapi --yes
-         eval $(opam env)
-         bmake tests)
+        cd "${GITHUB_WORKSPACE}"/personoj/proofs/appaxiom || exit 1
+        opam install . --deps-only --yes
+        opam exec -- dune build
+        opam exec -- dune runtest
diff --git a/.github/workflows/pvs_prelude.yml b/.github/workflows/pvs_prelude.yml
index bab941ebe75ea07b20dec55613f0a0338ed4eda5..d23b80a4150001521c012db144908b9bdb96d5d7 100644
--- a/.github/workflows/pvs_prelude.yml
+++ b/.github/workflows/pvs_prelude.yml
@@ -11,20 +11,26 @@ jobs:
       with:
         path: personoj
 
-    - name: setup
-      run: ${GITHUB_WORKSPACE}/personoj/tools/bootstrap.sh
+    - name: setup ocaml
+      uses: ocaml/setup-ocaml@v2
+      with:
+        ocaml-compiler: 4.11.1
+
+    - name: pin lambdapi
+      run: opam pin add 'git://github.com/gabrielhdt/lambdapi#refiner'
+
+    - name: Install PVS
+      run: ${GITHUB_WORKSPACE}/personoj/tools/setup-pvs.sh
       shell: sh
 
     - name: install personoj
       run: |
-        eval $(opam env --switch=~/lambdapi --set-switch)
-        bmake -C "${GITHUB_WORKSPACE}"/personoj/encoding install
+        opam exec -- bmake -C "${GITHUB_WORKSPACE}"/personoj/encoding install
         cp "${GITHUB_WORKSPACE}/personoj/tools/load-personoj.lisp" ~/.pvs.lisp
         echo '(load-personoj)' >> ~/.pvs.lisp
 
     - name: translate and typecheck
       run: |
-        eval $(opam env --switch=~/lambdapi --set-switch)
         cd "${GITHUB_WORKSPACE}"/personoj/specs/tools/prelude || exit 1
         # Comment out theories that consume too much memory during 
         # typechecking
@@ -32,4 +38,4 @@ jobs:
         sed -i 's/^modulo_arithmetic$/-modulo_arithmetic/' theories
         sed -i 's/^mod$/-mod/' theories
         PERSONOJPATH="${GITHUB_WORKSPACE}"/personoj/
-        bmake PERSONOJPATH="${PERSONOJPATH}" PVSPATH=~/PVS
+        opam exec -- bmake PERSONOJPATH="${PERSONOJPATH}" PVSPATH=~/PVS
diff --git a/proofs/appaxiom/appaxiom.opam b/proofs/appaxiom/appaxiom.opam
index 76392f44ef4b8182aa105a0743625d3a137b825c..b0418660e6cef4158b109a22dd9fb4d5ecf58c08 100644
--- a/proofs/appaxiom/appaxiom.opam
+++ b/proofs/appaxiom/appaxiom.opam
@@ -1,5 +1,7 @@
 # This file is generated by dune, edit dune-project instead
 opam-version: "2.0"
+synopsis: "Apply something on Dedukti axioms"
+maintainer: ["dedukti-dev@inria.fr"]
 depends: [
   "dune" {>= "2.9"}
   "cmdliner"
diff --git a/proofs/appaxiom/dune-project b/proofs/appaxiom/dune-project
index c42bfe5bf97323c8f3946d145360b71f11b968c4..1c9b5d940764918fa8f3120ce39b2febde671f4f 100644
--- a/proofs/appaxiom/dune-project
+++ b/proofs/appaxiom/dune-project
@@ -2,6 +2,9 @@
 (cram enable)
 (generate_opam_files true)
 
+(maintainers "dedukti-dev@inria.fr")
+
 (package
  (name appaxiom)
+ (synopsis "Apply something on Dedukti axioms")
  (depends cmdliner lambdapi))
diff --git a/proofs/chainprops/chainprops.opam b/proofs/chainprops/chainprops.opam
index c69df8e8146f2e8ab636088cf1ed40054718750f..79bc42c721470c50b69bc6a29e28d04a116572c5 100644
--- a/proofs/chainprops/chainprops.opam
+++ b/proofs/chainprops/chainprops.opam
@@ -1,5 +1,7 @@
 # This file is generated by dune, edit dune-project instead
 opam-version: "2.0"
+synopsis: "Make inference steps out of Dedukti propositions"
+maintainer: ["dedukti-dev@inria.fr"]
 depends: [
   "dune" {>= "2.9"}
   "cmdliner"
diff --git a/proofs/chainprops/dune-project b/proofs/chainprops/dune-project
index b2b9816a4da46ed318f63fa5d06f82eccb5922ca..fb65ab4c61d7c10fa59133a3f3ddf85e0e2ee837 100644
--- a/proofs/chainprops/dune-project
+++ b/proofs/chainprops/dune-project
@@ -3,8 +3,10 @@
 (cram enable)
 
 (generate_opam_files true)
+(maintainers "dedukti-dev@inria.fr")
 
 (package
  (name chainprops)
+ (synopsis "Make inference steps out of Dedukti propositions")
  (depends
-  cmdliner angstrom))
+  cmdliner angstrom lambdapi))
diff --git a/tools/bootstrap.sh b/tools/bootstrap.sh
deleted file mode 100755
index 52bd155ec10a876ba1ee96a6db30c32daa98445d..0000000000000000000000000000000000000000
--- a/tools/bootstrap.sh
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/sh
-set -eu
-
-SCRIPT=$(realpath "$0")
-DIR=$(dirname "$SCRIPT")
-ROOT=$(realpath "${DIR}/..") # Root of personoj repo
-
-## Opam
-
-yes | sudo apt-get -q install \
-	zlib1g-dev libx11-dev libgmp-dev bubblewrap m4 gcc autoconf \
-	make unzip pkg-config git rsync bmake gcc perl \
-	emacs-nox
-sudo sysctl kernel.unprivileged_userns_clone=1 
-yes '/usr/local/bin' | sudo bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh) --version 2.1.0"
-
-opam init --bare --no-setup -q
-
-## SBCL
-
-url="https://downloads.sourceforge.net/project/sbcl/sbcl/1.4.16/sbcl-1.4.16-x86-64-linux-binary.tar.bz2"
-(cd "${HOME}" || exit 1
- curl "$url" -L | tar jx
- ln -s sbcl* sbcl)
-
-gclone () {
-    (cd "$HOME"
-     git clone "$1"
-     (cd "$2" || exit 1
-      git checkout "$3"))
-}
-
-# Lambdapi
-
-gclone https://github.com/gabrielhdt/lambdapi.git lambdapi 1a7031e4
-
-(cd "${HOME}/lambdapi" || exit 1
- opam switch create . --locked --deps-only --yes
- eval "$(opam env)"
- make install
- why3 config detect)
-
-# PVS
-
-gclone https://github.com/SRI-CSL/PVS.git PVS pvs7.1
-
-(cd "${HOME}/PVS" || exit 1
- autoconf
- ./configure)
-
- EMACS="$(command -v emacs)"
- SBCLISP_HOME="${HOME}/sbcl"
- PVSPATH="${HOME}/PVS"
- export PVSPATH
-
- for p in $(find "${ROOT}"/specs/tools/prelude_patches -name '*.diff' | sort); do
-     patch "${PVSPATH}/lib/prelude.pvs" "$p"
- done
-
- (cd "${PVSPATH}"
-  make EMACS="$EMACS" SBCLISP_HOME="$SBCLISP_HOME" >output 2>&1)
diff --git a/tools/personoj.opam b/tools/personoj.opam
new file mode 100644
index 0000000000000000000000000000000000000000..a785608358c1a074a27cf06c2e174c03cf545b63
--- /dev/null
+++ b/tools/personoj.opam
@@ -0,0 +1,115 @@
+opam-version: "2.0"
+compiler: ["ocaml.4.11.1"]
+roots: [
+  "lambdapi.1.0"
+  "ocaml.4.11.1"
+  "ocaml-lsp-server.1.4.1"
+  "ocamlformat.0.19.0"
+  "ocamlformat-rpc.0.19.0"
+]
+installed: [
+  "astring.0.8.5"
+  "base.v0.14.1"
+  "base-bigarray.base"
+  "base-bytes.base"
+  "base-threads.base"
+  "base-unix.base"
+  "bindlib.5.0.1"
+  "biniou.1.2.1"
+  "cmdliner.1.0.4"
+  "cppo.1.6.8"
+  "csexp.1.5.1"
+  "dot-merlin-reader.4.1"
+  "dune.2.9.1"
+  "dune-build-info.2.9.1"
+  "dune-configurator.2.9.1"
+  "easy-format.1.3.2"
+  "fix.20201120"
+  "fpath.0.7.3"
+  "gen.0.5.3"
+  "lambdapi.1.0"
+  "menhir.20211012"
+  "menhirLib.20211012"
+  "menhirSdk.20211012"
+  "num.1.4"
+  "ocaml.4.11.1"
+  "ocaml-compiler-libs.v0.12.4"
+  "ocaml-config.1"
+  "ocaml-lsp-server.1.4.1"
+  "ocaml-system.4.11.1"
+  "ocamlbuild.0.14.0"
+  "ocamlfind.1.9.1"
+  "ocamlformat.0.19.0"
+  "ocamlformat-rpc.0.19.0"
+  "ocamlformat-rpc-lib.0.19.0"
+  "ocp-indent.1.8.1"
+  "odoc-parser.0.9.0"
+  "ppx_derivers.1.2.1"
+  "ppx_yojson_conv_lib.v0.14.0"
+  "ppxlib.0.23.0"
+  "pratter.1.2"
+  "re.1.10.3"
+  "result.1.5"
+  "sedlex.2.4"
+  "seq.base"
+  "sexplib0.v0.14.0"
+  "stdio.v0.14.0"
+  "stdlib-shims.0.3.0"
+  "timed.1.0"
+  "topkg.1.0.4"
+  "uchar.0.0.2"
+  "uucp.14.0.0"
+  "uuseg.14.0.0"
+  "uutf.1.0.2"
+  "why3.1.4.0"
+  "yojson.1.7.0"
+]
+pinned: "lambdapi.1.0"
+package "lambdapi" {
+  opam-version: "2.0"
+  version: "1.0"
+  synopsis: "Proof assistant based on the λΠ-calculus modulo rewriting"
+  description: """\
+Proof assistant based on the λΠ-calculus modulo rewriting,
+mostly compatible with Dedukti.
+
+This package contains both the `lambdapi` proof assistant and the `lp-lsp`
+Language Server Protocol helper for IDEs to check lambdapi files."""
+  maintainer: "dedukti-dev@inria.fr"
+  authors: "Deducteam"
+  license: "CECILL-2.1"
+  homepage: "https://github.com/Deducteam/lambdapi"
+  bug-reports: "https://github.com/Deducteam/lambdapi/issues"
+  depends: [
+    "dune" {>= "2.1"}
+    "ocaml" {>= "4.07.0"}
+    "menhir" {>= "20200624"}
+    "sedlex" {>= "2.2"}
+    "alcotest" {with-test}
+    "bindlib" {>= "5.0.1"}
+    "timed" {>= "1.0"}
+    "pratter" {>= "1.2"}
+    "why3" {>= "1.4.0"}
+    "yojson" {>= "1.6.0"}
+    "cmdliner" {>= "1.0.3"}
+    "stdlib-shims" {>= "0.1.0"}
+  ]
+  build: [
+    ["dune" "subst"] {pinned}
+    [
+      "dune"
+      "build"
+      "-p"
+      name
+      "-j"
+      jobs
+      "@install"
+      "@runtest" {with-test}
+      "@doc" {with-doc}
+    ]
+  ]
+  dev-repo: "git+https://github.com/Deducteam/lambdapi.git"
+  url {
+    src: "git://github.com/gabrielhdt/lambdapi#refiner"
+  }
+}
diff --git a/tools/setup-pvs.sh b/tools/setup-pvs.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e6d49b611c8d1e0841215d789e0f6fc5c9c828e7
--- /dev/null
+++ b/tools/setup-pvs.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+set -eu
+
+SCRIPT=$(realpath "$0")
+DIR=$(dirname "$SCRIPT")
+ROOT=$(realpath "${DIR}/..") # Root of personoj repo
+
+sudo apt-get -q install bmake perl gcc git emacs-nox
+
+## SBCL
+
+url="https://downloads.sourceforge.net/project/sbcl/sbcl/1.4.16/sbcl-1.4.16-x86-64-linux-binary.tar.bz2"
+(cd "${HOME}" || exit 1
+ curl "$url" -L | tar jx
+ ln -s sbcl* sbcl)
+
+# PVS
+(cd "$HOME" || exit 1
+ git clone https://github.com/SRI-CSL/PVS.git -q
+ cd PVS && git checkout pvs7.1)
+
+(cd "${HOME}/PVS" || exit 1
+ autoconf
+ ./configure)
+
+ EMACS="$(command -v emacs)"
+ SBCLISP_HOME="${HOME}/sbcl"
+ PVSPATH="${HOME}/PVS"
+ export PVSPATH
+
+ for p in $(find "${ROOT}"/specs/tools/prelude_patches -name '*.diff' | sort); do
+     patch "${PVSPATH}/lib/prelude.pvs" "$p"
+ done
+
+ (cd "${PVSPATH}"
+  make EMACS="$EMACS" SBCLISP_HOME="$SBCLISP_HOME" >output 2>&1)