diff --git a/public/games/index.html b/public/games/index.html
index 4b82f26a4140e0f9cb4ee9828ebbeb73ac5595d9..ebb6c4170d42a24ef67f4b6edd2e9e19a71ef210 100644
--- a/public/games/index.html
+++ b/public/games/index.html
@@ -4,22 +4,20 @@
 <head>
     <meta charset="utf-8" />
     <title>Kuadrado Software | Jeux</title>
-    <meta name="description"
-        content="Création de jeux vidéos indépendants. Jeux web, PC et projets en cours de développement" />
+    <meta name="description" content="Création de jeux vidéos indépendants. Jeux web, PC et projets en cours de développement"/>
     <meta name="author" content="Kuadrado Software" />
-    <meta name="image" content="https://kuadrado-software.fr/assets/images/game_controller.png" />
+    <meta name="image" content="https://kuadrado-software.fr/assets/images/game_controller.png"/>
 
     <!-- Open Graph Protocol meta data -->
-    <meta property="og:title" content="Kuadrado Software | Jeux" />
-    <meta property="og:description"
-        content="Création de jeux vidéos indépendants. Jeux web, PC et projets en cours de développement" />
+    <meta property="og:title" content="Kuadrado Software | Jeux"/>
+    <meta property="og:description" content="Création de jeux vidéos indépendants. Jeux web, PC et projets en cours de développement"/>
     <meta property="og:type" content="website" />
-    <meta property="og:url" content="https://kuadrado-software.fr/games" />
-    <meta property="og:image" content="https://kuadrado-software.fr/assets/images/game_controller.png" />
-    <meta property="og:image" content="https://kuadrado-software.fr/assets/images/game_studio_banner.png" />
-    <meta property="og:image" content="https://kuadrado-software.fr/assets/images/popularization_banner.png" />
-    <meta property="twitter:image" content="https://kuadrado-software.fr/assets/images/game_controller.png" />
-    <meta property="og:locale" content="fr_FR" />
+    <meta property="og:url" content="https://kuadrado-software.fr/games"/>
+    <meta property="og:image" content="https://kuadrado-software.fr/assets/images/game_controller.png"/>
+<meta property="og:image" content="https://kuadrado-software.fr/assets/images/game_studio_banner.png"/>
+<meta property="og:image" content="https://kuadrado-software.fr/assets/images/popularization_banner.png"/>
+    <meta property="twitter:image" content="https://kuadrado-software.fr/assets/images/game_controller.png"/>
+    <meta property="og:locale" content="fr_FR"/>
     <meta property="og:site_name" content="Kuadrado Software" />
 
     <!-- English translation not ready yet -->
@@ -28,8 +26,7 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
     <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
     <link href="/style/style.css" rel="stylesheet" />
-    <script
-        type="application/ld+json">{"@context":"https://schema.org","type":"WebPage","description":"Création de jeux vidéos indépendants. Jeux web, PC et projets en cours de développement","image":["https://kuadrado-software.fr/assets/images/game_controller.svg","https://kuadrado-software.fr/assets/images/game_controller.png"],"keywords":"gamedev, pixelart, jeux vidéo, création, video games, indépendants, indie gamedev","name":"Kuadrado Software - Jeux","url":"https://kuadrado-software.fr/games"}</script>
+    <script type="application/ld+json">{"@context":"https://schema.org","type":"WebPage","description":"Création de jeux vidéos indépendants. Jeux web, PC et projets en cours de développement","image":["https://kuadrado-software.fr/assets/images/game_controller.svg","https://kuadrado-software.fr/assets/images/game_controller.png"],"keywords":"gamedev, pixelart, jeux vidéo, création, video games, indépendants, indie gamedev","name":"Kuadrado Software - Jeux","url":"https://kuadrado-software.fr/games"}</script>
 </head>
 <!-- The vocab attribute defines the standard vocabulary used for RDFa standard.
     The DOM may contain properties such as "typeof" and "property" accordinly to the schema.org vocabulary -->
diff --git a/src/static_view.rs b/src/static_view.rs
index 48a1fdcde8ca15f29762fdfd4ed2ec3d7492083d..b8b393f234fb83b5975bcaff9a77973241aed583 100644
--- a/src/static_view.rs
+++ b/src/static_view.rs
@@ -15,7 +15,6 @@ enum UpdateSitemapMode {
     CreateUrl,
     DeleteUrl,
 }
-
 pub fn create_static_view(app_state: &AppState, article: &Article) -> Result<(), String> {
     let view_path = app_state
         .env
@@ -48,27 +47,37 @@ pub fn create_static_view(app_state: &AppState, article: &Article) -> Result<(),
         art_image_uri = format!("/assets/images/{}", art_image_uri);
     }
 
+    let art_json = serde_json::to_string(&article).unwrap();
+    let (locale, title, subtitle, description) = {
+        (
+            &article.locale,
+            &article.title,
+            &article.subtitle,
+            &article.metadata.description,
+        )
+    };
     let html = format!(
         "
-<html lang='{}'>
+<html lang='{locale}'>
 <head>
     <meta charset='UTF-8'>
     <meta http-equiv='X-UA-Compatible' content='IE=edge'>
     <meta name='viewport' content='width=device-width, initial-scale=1.0'>
     <meta name='author' content='Kuadrado Software' />
-    <meta name='image' content='{}'/>
-    <meta name='description' content='{}'>
+    <meta name='image' content='{art_image_uri}'/>
+    <meta name='description' content='{description}'>
     <link rel='icon' type='image/svg+xml' href='/favicon.svg' />
-    <title>{}</title>
+    <title>{title}</title>
     <link href='/style/style.css' rel='stylesheet' />
 </head>
 <body>
-    <div>{}<div>
+    <main data='{art_json}'></main>
+    <h1 style='visibility:hidden;'>{title}</h1>
+    <h2 style='visibility:hidden;'>{subtitle}</h2>
 </body>
-<script type='text/javascript' src='/games/view.js'></script>
+<script type='text/javascript' src='/article-view.js'></script>
 </html>
-            ",
-        article.locale, art_image_uri, article.metadata.description, article.title, article.body,
+            "
     );
 
     let f_path = d_path.join("index.html");
diff --git a/website/build.js b/website/build.js
index d64b7393c9767f576387a2434b9d403f20090e7b..603c14c9d0657039e0e81617e0319f5c5c702213 100644
--- a/website/build.js
+++ b/website/build.js
@@ -12,7 +12,10 @@ const _path = require("path");
 const parent_dir = _path.join(_dir, "..");
 
 // Handle home page
-bundle(`${_dir}/src/main.js`, `${parent_dir}/public/main.js`, { minify: build_minified })
+bundle(`${_dir}/src/main.js`, `${parent_dir}/public/main.js`, { minify: build_minified });
+
+// Handle article-view script
+bundle(`${_dir}/src/article-view.js`, `${parent_dir}/public/article-view.js`, { minify: build_minified });
 
 // Handle subpages
 function getPageHtml(pageName, pageMeta) {
@@ -196,7 +199,7 @@ function createPages(rootdir, destdir) {
             createPages(`${fPath}/subpages`, targetDirPath);
         } else {
             for (const d of fs.readdirSync(targetDirPath).filter(f => {
-                return fs.statSync(`${targetDirPath}/${f}`).isDirectory()
+                return fs.statSync(`${targetDirPath}/${f}`).isDirectory() && !build_conf.protected_dirs.includes(f);
             })) {
                 deletePageDirectory(`${targetDirPath}/${d}`)
             }
diff --git a/website/config.js b/website/config.js
index 864f2cb4454ddfaf32023227a992e6a0e451e089..3bc10b137944f002edfcb51631ac8481e45e4969 100644
--- a/website/config.js
+++ b/website/config.js
@@ -1,6 +1,6 @@
 module.exports = {
     build: {
-        protected_dirs: ["assets", "style", "views", "standard"],
+        protected_dirs: ["assets", "style", "views", "standard", "view"],
         default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"],
     },
 };
diff --git a/website/src/article-view.js b/website/src/article-view.js
new file mode 100644
index 0000000000000000000000000000000000000000..60613f1d18eb43e4a0622fca157a68e5d188513d
--- /dev/null
+++ b/website/src/article-view.js
@@ -0,0 +1,20 @@
+"use strict";
+
+const WebPage = require("./lib/web-page");
+const runPage = require("./run-page");
+
+class ArticlePage extends WebPage {
+    constructor() {
+        super({ id: "article-page" });
+        this.article = JSON.parse(document.querySelector("main").getAttribute("data"))
+    }
+
+    render() {
+        return {
+            tag: "h1",
+            contents: this.article.title,
+        }
+    }
+}
+
+runPage(ArticlePage);