diff --git a/.binder/Dockerfile b/.binder/Dockerfile
index a6bea25b4458475281bedcd248d613c6d2d708bf..4616e6370c7be22cc074f0acd5e57ca5ee1a4af2 100644
--- a/.binder/Dockerfile
+++ b/.binder/Dockerfile
@@ -6,7 +6,8 @@
 ###                                                                          ###
 ################################################################################
 
-FROM registry.gitlab.inria.fr/mgenet/dolfin_warp-tutorials:latest
+# FROM registry.gitlab.inria.fr/mgenet/dolfin_warp-tutorials:latest
+FROM ghcr.io/mgenet/dolfin_warp-tutorials:latest
 
 # Copy repo into the image, cf. https://mybinder.readthedocs.io/en/latest/tutorials/dockerfile.html. MG20230531: OMG this copies from the "build context", cf. https://stackoverflow.com/questions/73156067/where-does-the-copy-command-in-docker-copy-from; here it seems to be the repo itself.
 ARG NB_USER=jovyan
diff --git a/.github/workflows/build_and_deploy_jupyter_book.yml b/.github/workflows/build_and_deploy_jupyter_book.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6ce0af8740483332340ed23552a1d45a5db04118
--- /dev/null
+++ b/.github/workflows/build_and_deploy_jupyter_book.yml
@@ -0,0 +1,31 @@
+on:
+  - push
+
+jobs:
+  build_and_deploy_jupyter_book:
+    runs-on: ubuntu-latest
+
+    permissions:
+      pages: write
+      
+    environment:
+      name: github-pages
+    
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+    
+      - name: Build Jupyter Book
+        run: |
+          pip install -U jupyter-book
+          jupyter-book clean .
+          jupyter-book build .
+
+      - name: Upload artifact
+        uses: actions/upload-artifact@v4
+        with:
+          name: github-pages
+          path: "_build/html"
+
+      - name: Deploy Jupyter Book to GitHub Pages
+        uses: actions/deploy-pages@v4
diff --git a/.github/workflows/build_and_push_docker_image.yml b/.github/workflows/build_and_push_docker_image.yml
new file mode 100644
index 0000000000000000000000000000000000000000..61f2358f086dc6ac9f360977aa8c770cd00d934f
--- /dev/null
+++ b/.github/workflows/build_and_push_docker_image.yml
@@ -0,0 +1,21 @@
+on:
+  - push
+
+jobs:
+  build_and_push_docker_image:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@main
+
+      - name: Removing Docker file
+        run: |
+          rm -rf ${{github.workspace}}/.binder
+          cp ${{github.workspace}}/.repo2docker/* ${{github.workspace}}/.
+          
+      - name: Build and push docker image
+        uses: jupyterhub/repo2docker-action@master
+        with:
+          DOCKER_USERNAME: ${{github.actor}}
+          DOCKER_PASSWORD: ${{secrets.GITHUB_TOKEN}}
+          DOCKER_REGISTRY: ghcr.io
diff --git a/.github/workflows/mirror_to_gitlab.yml b/.github/workflows/mirror_to_gitlab.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b170881a19b6b13b43e79529729b6a853b6caa67
--- /dev/null
+++ b/.github/workflows/mirror_to_gitlab.yml
@@ -0,0 +1,16 @@
+on:
+  - push
+  - delete
+
+jobs:
+  sync:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v4
+      with:
+        fetch-depth: 0
+    - uses: wangchucheng/git-repo-sync@v0.1.0
+      with:
+        target-url: https://gitlab.inria.fr/mgenet/dolfin_warp-tutorials
+        target-username: mgenet
+        target-token: ${{secrets.GITLAB_TOKEN}}
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 202488a3338a5a852cc39aa8556df6615aa1d46e..1fe78650094b656d2dd6ef05c01eed8cff5216ea 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -15,7 +15,6 @@ build_docker:
   tags:
     - ci.inria.fr
     - large
-  # image: registry.gitlab.inria.fr/inria-ci/docker/ubuntu:20.04
   image: ubuntu:20.04
   script:
     - apt update; DEBIAN_FRONTEND=noninteractive apt install -y ca-certificates curl git gnupg lsb-release mercurial python3 python3-pip tzdata
diff --git a/README.md b/README.md
index 65ac8bcde465bda836ac5e51f341a4a37e5e6e33..d20e8b03898b8ec2fa59ea57f9c110cfeb9b14a5 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 # Welcome to the dolfin_warp tutorials!
 
-Main library can be found at https://gitlab.inria.fr/mgenet/dolfin_warp
+Main library can be found at https://github.com/mgenet/dolfin_warp
 
-Interactive tutorials can be found at https://mgenet.gitlabpages.inria.fr/dolfin_warp-tutorials/index.html.
+Interactive tutorials can be found at https://mgenet.github.io/dolfin_warp-tutorials.
diff --git a/index.md b/index.md
index 62521e93834e5c95a91852cd795c54c70bfee0e7..a25cfb2961ad6062a7dc3a7cbf590a54cefbfc2c 100644
--- a/index.md
+++ b/index.md
@@ -1,5 +1,5 @@
 # Welcome to the dolfin_warp tutorials!
 
-Main library can be found at [https://gitlab.inria.fr/mgenet/dolfin_warp](https://gitlab.inria.fr/mgenet/dolfin_warp).
+Main library can be found at [https://github.com/mgenet/dolfin_warp](https://github.com/mgenet/dolfin_warp).
 
 Tutorials can be browsed statically but also interactively—to start a session and run the code just click on the rocket icon at the top of a tutorial page and then click on Binder.
diff --git a/tutos/tuto_warp.ipynb b/tutos/tuto_warp.ipynb
index df6b63db05f3d31b9d009a116edb69be9e136779..8428901bd65be35667a492e4c8f068ceec8a1592 100644
--- a/tutos/tuto_warp.ipynb
+++ b/tutos/tuto_warp.ipynb
@@ -24,7 +24,7 @@
    "source": [
     "import dolfin # https://fenicsproject.org\n",
     "\n",
-    "import dolfin_warp as dwarp # https://gitlab.inria.fr/mgenet/dolfin_warp\n",
+    "import dolfin_warp as dwarp # https://github.com/mgenet/dolfin_warp\n",
     "\n",
     "import lib_viewer"
    ]
@@ -488,7 +488,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.15"
+   "version": "3.10.14"
   },
   "toc": {
    "base_numbering": 1,