diff --git a/components/ErrorAlert.vue b/components/ErrorAlert.vue
new file mode 100644
index 0000000000000000000000000000000000000000..90aad0e06070d3d16e8e03a4ee0a2c2fff2132d8
--- /dev/null
+++ b/components/ErrorAlert.vue
@@ -0,0 +1,29 @@
+<script setup lang="ts">
+import type { FetchError } from "ofetch"
+
+defineEmits(['clearError'])
+
+export interface Props {
+    error?: MaybeRef<Error | FetchError | null | undefined>
+}
+const props = withDefaults(defineProps<Props>(), {
+    error: undefined,
+});
+
+
+</script>
+
+<template>
+    <v-alert type="error" variant="tonal" prominent>
+        <v-card flat color="transparent">
+            <v-card-text>
+                {{ error }}
+            </v-card-text>
+            <v-card-actions>
+                <v-btn color="currentColor" prepend-icon="md:home" variant="text" @click="$emit('clearError')">
+                    Back home
+                </v-btn>
+            </v-card-actions>
+        </v-card>
+    </v-alert>
+</template>
\ No newline at end of file
diff --git a/components/content/pdockqMatrix.vue b/components/content/pdockqMatrix.vue
index f32f1cebdf8ccbcf5b1dd3087656f86096df9afd..cfef833016660ecd8905502f8d989d8ef318b757 100644
--- a/components/content/pdockqMatrix.vue
+++ b/components/content/pdockqMatrix.vue
@@ -1,8 +1,8 @@
 <script setup lang="ts">
 import * as d3 from "d3";
 import * as Plot from "@observablehq/plot";
-import PlotFigure from "~/components/PlotFigure";
-
+import PlotFigure from "@/components/PlotFigure";
+// import { useMeiliSearchRef } from 'nuxt-meilisearch'
 
 
 export interface Props {
@@ -31,38 +31,25 @@ const margin = ref<PlotMargin>({
 })
 
 const data = ref()
-onBeforeMount(async () => {
-
-    const { data: d, error } = await useAsyncMeiliSearch({
-        index: toValue(dbName), query: "", params: {
-            facets: ["*"],
-            filter: [
-                `System='${toValue(computedSystem)}'`,
-                ...toValue(filterBase)
-            ],
-        }
-    })
-    data.value = d.value
-    if (error.value) {
-        throw createError("Error while getting structure pdocks")
-    }
-})
+const client = useMeiliSearchRef()
 
 onMounted(async () => {
-
-    const { data: d, error } = await useAsyncMeiliSearch({
-        index: toValue(dbName), query: "", params: {
+    console.log("dans le mounted")
+    try {
+        const d = await client.index(toValue(dbName)).search("", {
             facets: ["*"],
             filter: [
                 `System='${toValue(computedSystem)}'`,
                 ...toValue(filterBase)
             ],
-        }
-    })
-    data.value = d.value
-    if (error.value) {
+        })
+        console.log(d)
+        data.value = d
+    } catch (error) {
+        console.log(error)
         throw createError("Error while getting structure pdocks")
     }
+
 })
 
 
@@ -80,6 +67,7 @@ const computedSystem = computed(() => {
 
 
 const groupedPdocks = computed(() => {
+    console.log(data)
     const toValData = toValue(data)
     const getSeqName = (d) => {
         if (d.includes("__")) {
@@ -90,8 +78,7 @@ const groupedPdocks = computed(() => {
     }
     if (toValData?.hits) {
         return d3.groups(toValData.hits.flatMap(({ System_name_ok, pDockQ, pdb, nb_sys, proteins_in_the_prediction, system_genes }) => {
-
-
+            console.log(proteins_in_the_prediction)
             if (proteins_in_the_prediction.length === 2) {
                 const sanitizedSystemGenes = system_genes.map(getSeqName)
                 const sanitizedProteins = proteins_in_the_prediction.map(getSeqName)
@@ -119,8 +106,9 @@ const groupedPdocks = computed(() => {
 
 const computedPDocksMatrixPlotOptions = computed(() => {
     const { marginBottom, marginLeft, marginRight, marginTop } = toValue(margin)
-
+    console.log(groupedPdocks)
     return toValue(groupedPdocks).map((matrix) => {
+        console.log(matrix)
         return {
             width: matrix[1][0].system_genes.length * 75 + marginLeft + marginRight,
             height: matrix[1][0].system_genes.length * 75 + marginTop + marginBottom,
diff --git a/composables/useFetchArticle.ts b/composables/useFetchArticle.ts
index eef82b70629bd8487f6c421e0537733cf7068628..dc85803f295dc74460c56a64695dedde9bbb5c2b 100644
--- a/composables/useFetchArticle.ts
+++ b/composables/useFetchArticle.ts
@@ -66,10 +66,11 @@ export async function useFetchArticle(doi: string = "") {
         )
 
         if (error.value) {
-            throw createError({
-                ...error.value,
-                statusMessage: `Could not fetch article ${doi}`
-            })
+            article.value = { DOI: doi }
+            // throw createError({
+            //     ...error.value,
+            //     statusMessage: `Could not fetch article ${doi}`
+            // })
         }
         article.value = data.value
     }
diff --git a/content/3.defense-systems/abia.md b/content/3.defense-systems/abia.md
index b201de9d7b3583a300a960c1258001367dfe775f..af2ab565e7902b8adb6d3f7e20d23010e305124b 100644
--- a/content/3.defense-systems/abia.md
+++ b/content/3.defense-systems/abia.md
@@ -61,30 +61,16 @@ Proportion of genome encoding the AbiA system for the 14 phyla with more than 50
 
 
 ## Structure
-### AbiA_large
-##### Example 1
 
-::molstar-pdbe-plugin
----
-height: 700
-dataUrls:
-   - /abia/AbiA_large__AbiA_large.cif
-
----
+::pdockq-matrix
 ::
-### AbiA_small
-##### Example 1
 
-::molstar-pdbe-plugin
----
-height: 700
-dataUrls:
-   - /abia/AbiA_small.AbiA_small__AbiA_small.0.DF.cif
-   - /abia/AbiA_small.AbiA_small__AbiA_SLATT.0.DF.cif
+### All predicted structures
 
----
+::article-structure
 ::
 
+
 ## Experimental validation
 
 
diff --git a/content/3.defense-systems/avs.md b/content/3.defense-systems/avs.md
index 8e224bc2ef668725f0cf8ff18e944fe94e1fb4d3..c476c899e4effc0c2a05edf289d1f06f94972f19 100644
--- a/content/3.defense-systems/avs.md
+++ b/content/3.defense-systems/avs.md
@@ -76,6 +76,13 @@ Proportion of genome encoding the Avs system for the 14 phyla with more than 50
 ## Structure
 
 
+### matrix
+
+::pdockq-matrix
+::
+
+### List
+
 ::article-structure
 ::
 
diff --git a/docker-compose.yml b/docker-compose.yml
index 6744c4e3daf6379122c804b82e81aa173c38b3bf..c9ab11ca13a7986ef613e0b2ed093972dc2daaa0 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -7,7 +7,7 @@ services:
       args:
         BASE_URL: /wiki
         MEILI_HOST: http://localhost:7700
-        MEILI_API_KEY: f5f5f1bc48e6379fc2509f5bf0aed1fce96c1bbf86e0a194c605b258d7cfe890
+        MEILI_API_KEY: 3534db2924c3938bab5fc878906aaf1b83f8f39867891c6d020b05043b04b1ef
         HOST_URL: http://localhost:8082
     container_name: nuxt
     environment:
diff --git a/package-lock.json b/package-lock.json
index 92be4468f20ad15133c3d8512e710a16ec84c32d..322c1b7ea83f7b94eac52354913ffd3e1dbb6ebd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -26,6 +26,7 @@
         "@nuxt/content": "^2.10.0",
         "@nuxtjs/plausible": "^0.2.4",
         "@nuxtjs/seo": "^2.0.0-rc.9",
+        "@types/d3": "^7.4.3",
         "@types/node": "^20.11.0",
         "@unocss/nuxt": "^0.58.3",
         "@unocss/preset-icons": "^0.58.3",
@@ -3569,6 +3570,192 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/@types/d3": {
+      "version": "7.4.3",
+      "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",
+      "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
+      "dev": true,
+      "dependencies": {
+        "@types/d3-array": "*",
+        "@types/d3-axis": "*",
+        "@types/d3-brush": "*",
+        "@types/d3-chord": "*",
+        "@types/d3-color": "*",
+        "@types/d3-contour": "*",
+        "@types/d3-delaunay": "*",
+        "@types/d3-dispatch": "*",
+        "@types/d3-drag": "*",
+        "@types/d3-dsv": "*",
+        "@types/d3-ease": "*",
+        "@types/d3-fetch": "*",
+        "@types/d3-force": "*",
+        "@types/d3-format": "*",
+        "@types/d3-geo": "*",
+        "@types/d3-hierarchy": "*",
+        "@types/d3-interpolate": "*",
+        "@types/d3-path": "*",
+        "@types/d3-polygon": "*",
+        "@types/d3-quadtree": "*",
+        "@types/d3-random": "*",
+        "@types/d3-scale": "*",
+        "@types/d3-scale-chromatic": "*",
+        "@types/d3-selection": "*",
+        "@types/d3-shape": "*",
+        "@types/d3-time": "*",
+        "@types/d3-time-format": "*",
+        "@types/d3-timer": "*",
+        "@types/d3-transition": "*",
+        "@types/d3-zoom": "*"
+      }
+    },
+    "node_modules/@types/d3-array": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
+      "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==",
+      "dev": true
+    },
+    "node_modules/@types/d3-axis": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz",
+      "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
+      "dev": true,
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-brush": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz",
+      "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
+      "dev": true,
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-chord": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz",
+      "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==",
+      "dev": true
+    },
+    "node_modules/@types/d3-color": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
+      "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
+      "dev": true
+    },
+    "node_modules/@types/d3-contour": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz",
+      "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
+      "dev": true,
+      "dependencies": {
+        "@types/d3-array": "*",
+        "@types/geojson": "*"
+      }
+    },
+    "node_modules/@types/d3-delaunay": {
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+      "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==",
+      "dev": true
+    },
+    "node_modules/@types/d3-dispatch": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz",
+      "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==",
+      "dev": true
+    },
+    "node_modules/@types/d3-drag": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",
+      "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-dsv": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
+      "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==",
+      "dev": true
+    },
+    "node_modules/@types/d3-ease": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+      "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
+      "dev": true
+    },
+    "node_modules/@types/d3-fetch": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
+      "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
+      "dev": true,
+      "dependencies": {
+        "@types/d3-dsv": "*"
+      }
+    },
+    "node_modules/@types/d3-force": {
+      "version": "3.0.9",
+      "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz",
+      "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==",
+      "dev": true
+    },
+    "node_modules/@types/d3-format": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz",
+      "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==",
+      "dev": true
+    },
+    "node_modules/@types/d3-geo": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz",
+      "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/geojson": "*"
+      }
+    },
+    "node_modules/@types/d3-hierarchy": {
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",
+      "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==",
+      "dev": true
+    },
+    "node_modules/@types/d3-interpolate": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
+      "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
+      "dev": true,
+      "dependencies": {
+        "@types/d3-color": "*"
+      }
+    },
+    "node_modules/@types/d3-path": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz",
+      "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==",
+      "dev": true
+    },
+    "node_modules/@types/d3-polygon": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",
+      "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==",
+      "dev": true
+    },
+    "node_modules/@types/d3-quadtree": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
+      "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==",
+      "dev": true
+    },
+    "node_modules/@types/d3-random": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz",
+      "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==",
+      "dev": true
+    },
     "node_modules/@types/d3-scale": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz",
@@ -3582,11 +3769,57 @@
       "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz",
       "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw=="
     },
+    "node_modules/@types/d3-selection": {
+      "version": "3.0.10",
+      "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz",
+      "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==",
+      "dev": true
+    },
+    "node_modules/@types/d3-shape": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz",
+      "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==",
+      "dev": true,
+      "dependencies": {
+        "@types/d3-path": "*"
+      }
+    },
     "node_modules/@types/d3-time": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz",
       "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw=="
     },
+    "node_modules/@types/d3-time-format": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",
+      "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==",
+      "dev": true
+    },
+    "node_modules/@types/d3-timer": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+      "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
+      "dev": true
+    },
+    "node_modules/@types/d3-transition": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz",
+      "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-zoom": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz",
+      "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==",
+      "dev": true,
+      "dependencies": {
+        "@types/d3-interpolate": "*",
+        "@types/d3-selection": "*"
+      }
+    },
     "node_modules/@types/debug": {
       "version": "4.1.12",
       "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
@@ -3628,6 +3861,12 @@
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
       "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
     },
+    "node_modules/@types/geojson": {
+      "version": "7946.0.14",
+      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
+      "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==",
+      "dev": true
+    },
     "node_modules/@types/google.maps": {
       "version": "3.55.4",
       "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.55.4.tgz",
diff --git a/package.json b/package.json
index e9bcee5d0ac62736490a415c5c1b6ac9a888b20f..5d26c4a296b0a6a7027b20bd340798358964b74a 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
     "@nuxt/content": "^2.10.0",
     "@nuxtjs/plausible": "^0.2.4",
     "@nuxtjs/seo": "^2.0.0-rc.9",
+    "@types/d3": "^7.4.3",
     "@types/node": "^20.11.0",
     "@unocss/nuxt": "^0.58.3",
     "@unocss/preset-icons": "^0.58.3",
diff --git a/pages/[...slug].vue b/pages/[...slug].vue
index 6afff5a4bfe86b353f2c4aefbb20a06983900740..0711392d4f23381f69ee93e19d0df1b317310868 100644
--- a/pages/[...slug].vue
+++ b/pages/[...slug].vue
@@ -1,6 +1,16 @@
+<script setup lang="ts">
+function resetError(error) {
+  error.value = null
+  navigateTo("/")
+}</script>
 <template>
   <v-card-text>
-    <ContentDoc />
+    <NuxtErrorBoundary>
+      <!-- ... -->
+      <template #error="{ error }">
+        <ErrorAlert :error="error" @clear-error="resetError(error)"></ErrorAlert>
+      </template>
+      <ContentDoc />
+    </NuxtErrorBoundary>
   </v-card-text>
 </template>
-
diff --git a/server/plugins/content.ts b/server/plugins/content.ts
index 50a4492a7e3ca7b4957a973c1be8957191c96c70..5484db711c461443af4a9dca904d7d5a4340f784 100644
--- a/server/plugins/content.ts
+++ b/server/plugins/content.ts
@@ -76,14 +76,14 @@ export default defineNitroPlugin((nitroApp) => {
 
                 const index = file.body.children.findIndex(child => child.tag === "h2" && child.props.id === "structure")
                 console.log(index)
-                if (index !== -1) {
-                    file.body.children.splice(index + 1, 0, {
-                        type: "element",
-                        tag: 'pdockq-matrix',
-                        props: {},
-                        children: []
-                    })
-                }
+                // if (index !== -1) {
+                //     file.body.children.splice(index + 1, 0, {
+                //         type: "element",
+                //         tag: 'pdockq-matrix',
+                //         props: {},
+                //         children: []
+                //     })
+                // }
             }
         })
 })
\ No newline at end of file