diff --git a/.gitignore b/.gitignore
index fb71fd6ea84ecdb7ab7f05dcb9391b705376c0c7..cfb2a61c90f774a8ee794010bfeeaba0f288fad4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,6 @@ dist/html/*
 
 # Files
 index.html
-config.php
+config.pug
 issues.md
 oidc-client-preprod-config.json
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..2fc30ec3fcb961cbb2e8ca522e91407e26c9a74a
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,21 @@
+default: install
+
+config.pug:
+	cp config-sample.pug config.pug
+
+dist/css/hd-app.css: src/scss/main.scss
+	npx grunt sass
+
+install: 
+	git submodule update --init --recursive
+	npm install
+
+build: config.pug
+	npx grunt sass
+	npx pug --pretty -p index.pug < index.pug > index.html
+
+serve: dist/css/hd-app.css
+	php -S 127.0.0.1:8080 router.php
+
+
+.PHONY: default install build serve
diff --git a/README.md b/README.md
index 3b36a27e02ea3f37da2f701f2f94e3266fb16dab..3258dd3a95c07f82ec5fbf502b0a3a515cd37ef8 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,19 @@
+# HD app
 HD app is the magic tool that allows the Happy Dev network to thrive in a decentralized way.
 
 ## Install
-  * `git clone --recurse-submodules https://git.happy-dev.fr/happy-dev/hd-app.git`
-  * `cd hd-app`
-  * `cp config-sample.php config.php`
-  * Edit `config.php` to suit your own setup
-  * `npm install -g grunt-cli`
-  * `npm install`
-
-## Compile SASS
-  * `grunt watch`
+
+clone then:
+
+* `make install`
+
+## Build
+
+Compile sass & pug
+
+* `make build`
+
+## Run server
+
+require PHP
+* `make serve`
diff --git a/config-sample.php b/config-sample.php
deleted file mode 100644
index 9e8c1d0e9efd95a81072d3109e49622dfb49638e..0000000000000000000000000000000000000000
--- a/config-sample.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-  $dn   = getenv("DN");// Domain Name of the app
-  $sdn  = getenv("SDN");// Server Domain Name
-
-  if ($dn === NULL) {
-    $dn   = 'http://hd-app.local';
-    $sdn  = 'http://localhost:8000';
-  }
diff --git a/config-sample.pug b/config-sample.pug
new file mode 100644
index 0000000000000000000000000000000000000000..1a30c0ff4f4418a76db7431feef6404df880ca11
--- /dev/null
+++ b/config-sample.pug
@@ -0,0 +1,3 @@
+- var dn   = 'http://127.0.0.1:8080'
+- var sdn  = 'http://127.0.0.1:8000'
+- v = Math.random()
\ No newline at end of file
diff --git a/index.php b/index.php
deleted file mode 100644
index 6585d4b6388d8100ba580e9a06343b9e4348e5d5..0000000000000000000000000000000000000000
--- a/index.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-  // Some useful variables
-  $v  = rand();// Used to avoid abusive caching by the browser 
-  require_once("config.php");// Use "config-sample.php" to create your own
-?>
-<!DOCTYPE html>
-<html lang="fr">
-  <head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <meta http-equiv="X-UA-Compatible" content="ie=edge">
-
-    <title>Happy Dev App</title>
-
-    <?php 
-    // Prod/Dev setup
-    if (in_array($dn, array('https://app.happy-dev.fr', 'https://staging-app.happy-dev.fr'))) {
-      require_once("src/html/dependencies-prod.php");
-    } else {
-      require_once("src/html/dependencies-dev.php");
-    }
-    ?>
-  </head>
-
-  <body>
-    <?php require_once('src/html/menu.html'); ?>
-
-    <main id="mainContainer" class="container-fluid">
-      <?php require_once('src/html/dashboard.html'); ?>
-      <?php require_once('src/html/members.html'); ?>
-      <?php require_once('src/html/member.php'); ?>
-      <?php require_once('src/html/projects.html'); ?>
-      <?php require_once('src/html/project.php'); ?>
-      <?php require_once('src/html/client-creation.html'); ?>
-      <?php require_once('src/html/channels.html'); ?>
-      <?php require_once('src/html/channel.php'); ?>
-      <?php require_once('src/html/search.html'); ?>
-    </main>
-
-    <sib-chat
-      id="chat-singleton"
-      data-authentication="login"
-      data-auto-login="true"
-      data-bosh-service-url="https://jabber.happy-dev.fr/http-bind/"
-      data-debug="false"
-      data-locales-url="en"
-      bind-resources
-    ></sib-chat>
-
-    <script>
-      // Move the chat singleton to the right view on "page load"
-      window.onload = function() {
-        if (window.location.pathname.indexOf("-chat") !== -1) {
-          var chatSingleton = document.querySelector("#chat-singleton");
-          var pathnameParts = window.location.pathname.split("/");
-          var viewName      = pathnameParts[pathnameParts.length - 1];
-          var view          = document.getElementById(viewName);
-
-          view.appendChild(chatSingleton);
-          chatSingleton.dataset.src = view.dataset.src;
-        }
-      }
-      
-      // Move the chat singleton to the right view on "navigate"
-      window.addEventListener('navigate', event => {
-        var chatSingleton = document.querySelector("#chat-singleton");
-        var view = document.getElementById(event.detail.route);
-
-        view.querySelector(".chat-view").appendChild(chatSingleton);
-        chatSingleton.dataset.src = view.dataset.src;
-      });
-    </script>
-  </body>
-</html>
diff --git a/index.pug b/index.pug
new file mode 100644
index 0000000000000000000000000000000000000000..560bc2dfc788f34da93e5368c2b7e3b94a2868ba
--- /dev/null
+++ b/index.pug
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+include config.pug
+html(lang='fr')
+  head
+    meta(charset='UTF-8')
+    meta(name='viewport', content='width=device-width, initial-scale=1.0')
+    meta(http-equiv='X-UA-Compatible', content='ie=edge')
+    title Happy Dev App
+    //- Prod/Dev setup
+    if (['https://app.happy-dev.fr', 'https://staging-app.happy-dev.fr'].includes(dn))
+      include src/html/dependencies-prod.pug
+    else
+      include src/html/dependencies-dev.pug
+  body
+    include src/html/menu.pug
+    main#mainContainer.container-fluid
+      include src/html/dashboard.pug
+      include src/html/members.pug
+      include src/html/member.pug
+      include src/html/projects.pug
+      include src/html/project.pug
+      include src/html/client-creation.pug
+      include src/html/channels.pug
+      include src/html/channel.pug
+      include src/html/search.pug
+    sib-chat#chat-singleton(data-authentication='login', data-auto-login='true', data-bosh-service-url='https://jabber.happy-dev.fr/http-bind/', data-debug='false', data-locales-url='en', bind-resources='')
+    script.
+      // Move the chat singleton to the right view on "page load"
+      window.onload = function() {
+        if (window.location.pathname.indexOf("-chat") !== -1) {
+          var chatSingleton = document.querySelector("#chat-singleton");
+          var pathnameParts = window.location.pathname.split("/");
+          var viewName      = pathnameParts[pathnameParts.length - 1];
+          var view          = document.getElementById(viewName);
+
+          view.appendChild(chatSingleton);
+          chatSingleton.dataset.src = view.dataset.src;
+        }
+      }
+      
+      // Move the chat singleton to the right view on "navigate"
+      window.addEventListener('navigate', event => {
+        var chatSingleton = document.querySelector("#chat-singleton");
+        var view = document.getElementById(event.detail.route);
+
+        view.querySelector(".chat-view").appendChild(chatSingleton);
+        chatSingleton.dataset.src = view.dataset.src;
+      });
diff --git a/oidc-client-config.json b/oidc-client-config.json
index 7f4d9dda01c824fa1db831bca5f933ca637b3d0c..6141b66c77ba4449b337c7885b8aec12926ee757 100644
--- a/oidc-client-config.json
+++ b/oidc-client-config.json
@@ -1,10 +1,10 @@
 {
   "authority": "https://test-paris.happy-dev.fr/openid/",
   "client_id": "125356",
-  "redirect_uri": "http://hd-app.local",
+  "redirect_uri": "http://127.0.0.1:8080",
   "response_type": "id_token token",
   "scope": "openid profile email",
   "automaticSilentRenew": true,
-  "silent_redirect_uri": "http://hd-app.local",
+  "silent_redirect_uri": "http://127.0.0.1:8080",
   "loadUserInfo": true
 }
diff --git a/router.php b/router.php
new file mode 100644
index 0000000000000000000000000000000000000000..0042b794fe592a61ed73d2e7b65b0e1faefc5cbc
--- /dev/null
+++ b/router.php
@@ -0,0 +1,8 @@
+<?php
+
+if (PHP_SAPI == 'cli-server') {
+  $url  = parse_url($_SERVER['REQUEST_URI']);
+  $file = __DIR__ . $url['path'];
+  if (is_file($file)) return false;
+}
+include "index.html";
\ No newline at end of file
diff --git a/src/html/calendar.html b/src/html/calendar.html
deleted file mode 100644
index a5cfd4deb3f2478bc6626ea217fa0f8166388684..0000000000000000000000000000000000000000
--- a/src/html/calendar.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<div id="calendar" style="display: none">
-  <h1 class="page-title">Agenda</h1>
-  <ldp-calendar data-src="http://lucky.alwaysdata.net/api/events/" style="display: block; height: 300px; width: 500px;"></ldp-calendar>
-</div>
diff --git a/src/html/calendar.pug b/src/html/calendar.pug
new file mode 100644
index 0000000000000000000000000000000000000000..bc172f314a6120bef6e40b9195b57e53824e49c0
--- /dev/null
+++ b/src/html/calendar.pug
@@ -0,0 +1,6 @@
+#calendar(style='display: none')
+  h1.page-title Agenda
+  ldp-calendar(
+    data-src='http://lucky.alwaysdata.net/api/events/',
+    style='display: block; height: 300px; width: 500px;'
+  )
diff --git a/src/html/channel-chat.html b/src/html/channel-chat.html
deleted file mode 100644
index e6d99da5071fc011a251e846b8242bcb1b6aded8..0000000000000000000000000000000000000000
--- a/src/html/channel-chat.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<div id="channel-chat" class="chat-view" style="display: none" bind-resources></div>
-
diff --git a/src/html/channel-chat.pug b/src/html/channel-chat.pug
new file mode 100644
index 0000000000000000000000000000000000000000..d892ccf2586e9967d70d4d487a9f43909d0f7877
--- /dev/null
+++ b/src/html/channel-chat.pug
@@ -0,0 +1 @@
+#channel-chat.chat-view(style='display: none', bind-resources='')
diff --git a/src/html/channel-create.html b/src/html/channel-create.html
deleted file mode 100644
index 5364a419258e93a021e28753aabc0b6e970eb13d..0000000000000000000000000000000000000000
--- a/src/html/channel-create.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<div id="channel-create" style="display: none">
-  <sib-form 
-    data-src="<?php echo $sdn; ?>/channels/" 
-    range-owner="<?php echo $sdn; ?>/members/"
-    widget-members="sib-form-multiple-dropdown"
-    range-members="<?php echo $sdn; ?>/members/"
-  ></sib-form>
-</div>
-
diff --git a/src/html/channel-create.pug b/src/html/channel-create.pug
new file mode 100644
index 0000000000000000000000000000000000000000..5e7b3035c1b9e2c921985655abd3d1795af2aa58
--- /dev/null
+++ b/src/html/channel-create.pug
@@ -0,0 +1,7 @@
+#channel-create(style='display: none')
+  sib-form(
+    data-src=`${sdn}/channels/`, 
+    range-owner=`${sdn}/members/`, 
+    widget-members='sib-form-multiple-dropdown', 
+    range-members=`${sdn}/members/`
+  )
diff --git a/src/html/channel-edit.html b/src/html/channel-edit.html
deleted file mode 100644
index b3c66e18a5b7fb7c42fff446470649a5bf913b9d..0000000000000000000000000000000000000000
--- a/src/html/channel-edit.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<div id="channel-edit" style="display: none">
-  <sib-form 
-    range-owner="<?php echo $sdn; ?>/members/"
-    widget-members="sib-form-multiple-dropdown"
-    range-members="<?php echo $sdn; ?>/members/"
-    bind-resources
-  ></sib-form>
-</div>
diff --git a/src/html/channel-edit.pug b/src/html/channel-edit.pug
new file mode 100644
index 0000000000000000000000000000000000000000..9244226d18703f9dc719295c83c6fea1079e0368
--- /dev/null
+++ b/src/html/channel-edit.pug
@@ -0,0 +1,7 @@
+#channel-edit(style='display: none')
+  sib-form(
+    range-owner=`${sdn}/members/`,
+    widget-members='sib-form-multiple-dropdown',
+    range-members=`${sdn}/members/`,
+    bind-resources=''
+  )
diff --git a/src/html/channel-profile.html b/src/html/channel-profile.pug
similarity index 53%
rename from src/html/channel-profile.html
rename to src/html/channel-profile.pug
index 2186fc5ce937f391f03e50c38509b717ef107a53..bd47756e71b7442575707fb14446ba68d32e2460 100644
--- a/src/html/channel-profile.html
+++ b/src/html/channel-profile.pug
@@ -1,4 +1,4 @@
-<script>
+script.
   document.addEventListener("WebComponentsReady", function(event) { 
     class HDAppMember extends SIBWidget {
       get template() {
@@ -18,21 +18,19 @@
     }
     customElements.define("hdapp-member", HDAppMember);
   });
-</script>
 
-<div id="channel-profile" style="display: none">
-  <sib-display 
-    data-fields="name, description, owner"
-    widget-owner="hdapp-member"
-    bind-resources
-  ></sib-display>
+#channel-profile(style='display: none')
+  sib-display(
+    data-fields='name, description, owner', 
+    widget-owner='hdapp-member', 
+    bind-resources=''
+  )
+  h2.section.skills Participants
+  sib-display(
+    id-suffix='members',
+    data-fields='avatar, user',
+    widget-avatar='sib-display-img',
+    widget-user='hdapp-userinfo',
+    bind-resources=''
+  )
 
-  <h2 class="section skills">Participants</h2>
-  <sib-display 
-    id-suffix="members"
-    data-fields="avatar, user"
-    widget-avatar="sib-display-img"
-    widget-user="hdapp-userinfo"
-    bind-resources
-  ></sib-display>
-</div>
diff --git a/src/html/channel.php b/src/html/channel.php
deleted file mode 100644
index 612396f04e3cdeb75c2a2b1505aba08381806ae8..0000000000000000000000000000000000000000
--- a/src/html/channel.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<div id="channel" style="display: none">
-  <sib-router id="channel-router" default-route="channel-profile">
-    <sib-route name="channel-chat">
-      <button>Chat</button>
-    </sib-route>
-    <sib-route name="channel-profile">
-      <button>Info</button>
-    </sib-route>
-    <sib-route name="channel-edit">
-      <button>Éditer</button>
-    </sib-route>
-    <sib-route name="channel-create">
-      <button>Nouveau</button>
-    </sib-route>
-  </sib-router>
-
-  <div id="network-views-container">
-    <?php require_once('channel-chat.html'); ?>
-    <?php require_once('channel-profile.html'); ?>
-    <?php require_once('channel-edit.html'); ?>
-    <?php require_once('channel-create.html'); ?>
-  </div>
-</div>
diff --git a/src/html/channel.pug b/src/html/channel.pug
new file mode 100644
index 0000000000000000000000000000000000000000..728f3e8a1e2a4b9ee5c3eb9f87b92d8ad4fcca5c
--- /dev/null
+++ b/src/html/channel.pug
@@ -0,0 +1,15 @@
+#channel(style='display: none')
+  sib-router#channel-router(default-route='channel-profile')
+    sib-route(name='channel-chat')
+      button Chat
+    sib-route(name='channel-profile')
+      button Info
+    sib-route(name='channel-edit')
+      button Éditer
+    sib-route(name='channel-create')
+      button Nouveau
+  #network-views-container
+    include channel-chat.pug
+    include channel-profile.pug
+    include channel-edit.pug
+    include channel-create.pug
diff --git a/src/html/channels.html b/src/html/channels.html
deleted file mode 100644
index 3afdcc1d00d336d039c1813b9c92c5345e737c36..0000000000000000000000000000000000000000
--- a/src/html/channels.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<div id="channels" style="display: none">
-  <sib-display 
-    id="channels-list" 
-    data-src="<?php echo $sdn; ?>/channels/" 
-    data-fields="name, description" 
-    search-fields="name, description"
-    next="channel"
-  ></sib-display>
-</div>
diff --git a/src/html/channels.pug b/src/html/channels.pug
new file mode 100644
index 0000000000000000000000000000000000000000..4a46b1945fe61755db05530fe3a12881b71cf290
--- /dev/null
+++ b/src/html/channels.pug
@@ -0,0 +1,7 @@
+#channels(style='display: none')
+  sib-display#channels-list(
+    data-src=`${sdn}/channels/`, 
+    data-fields='name, description', 
+    search-fields='name, description', 
+    next='channel'
+    )
diff --git a/src/html/client-creation.html b/src/html/client-creation.html
deleted file mode 100644
index 21edcff9855700c1b9fda2071d399e5093f8b9cb..0000000000000000000000000000000000000000
--- a/src/html/client-creation.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<div id="client-create" style="display: none">
-  <sib-form 
-    data-src="<?php echo $sdn; ?>/clients/" 
-    data-fields="name, address, logo"
-  ></sib-form>
-</div>
-
diff --git a/src/html/client-creation.pug b/src/html/client-creation.pug
new file mode 100644
index 0000000000000000000000000000000000000000..d0235048903f5ea782b0a63a0dc4389da2a2eaca
--- /dev/null
+++ b/src/html/client-creation.pug
@@ -0,0 +1,5 @@
+#client-create(style='display: none')
+  sib-form(
+    data-src=`${sdn}/clients/`, 
+    data-fields='name, address, logo'
+  )
diff --git a/src/html/dashboard.html b/src/html/dashboard.html
deleted file mode 100644
index 37ffb96e3fc5cefd590b4911599323da2d440fe3..0000000000000000000000000000000000000000
--- a/src/html/dashboard.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<div id="dashboard" style="display: none">
-  <!--<form>-->
-  <!--<div class="form-group">-->
-  <!--<input type="text" class="form-control form-control-sm" id="search-input" placeholder="Recherche" aria-describedby="search-help" autofocus />-->
-  <!--<small id="search-help" class="form-text text-muted">* parmi les membres, les projets et les groupes de discussion</small>-->
-  <!--</div>-->
-  <!--</form>-->
-
-  <div class="list-condensed">
-    <ldp-display 
-      id="to-user-profile"
-      data-src="<?php echo $sdn; ?>/members/1/" 
-      set-name="firstname, name-separator, lastname"
-      value-name-separator="&nbsp;"
-      data-fields="avatar, name"
-      widget-avatar="ldp-display-img"
-    ></ldp-display>
-  </div>
-
-  <script>
-    document.querySelector("#to-user-profile").addEventListener("click", () => {
-      document.getElementById("navbar-router").navigate("member");
-      document.getElementById("member-page-router").navigate("member-detail");
-    });
-  </script>
-</div>
diff --git a/src/html/dashboard.pug b/src/html/dashboard.pug
new file mode 100644
index 0000000000000000000000000000000000000000..61a18a3a7b61c88cbe7a8838cf23c789b59992f8
--- /dev/null
+++ b/src/html/dashboard.pug
@@ -0,0 +1,21 @@
+#dashboard(style='display: none')
+  //-
+    <form>
+    <div class="form-group">
+    <input type="text" class="form-control form-control-sm" id="search-input" placeholder="Recherche" aria-describedby="search-help" autofocus />
+    <small id="search-help" class="form-text text-muted">* parmi les membres, les projets et les groupes de discussion</small>
+    </div>
+    </form>
+  .list-condensed
+    ldp-display#to-user-profile(
+      data-src=`${sdn}/members/1/`, 
+      set-name='firstname, name-separator, lastname', 
+      value-name-separator=' ', 
+      data-fields='avatar, name', 
+      widget-avatar='ldp-display-img'
+      )
+  script.
+    document.querySelector("#to-user-profile").addEventListener("click", () => {
+      document.getElementById("navbar-router").navigate("member");
+      document.getElementById("member-page-router").navigate("member-detail");
+    });
diff --git a/src/html/dependencies-dev.php b/src/html/dependencies-dev.php
deleted file mode 100644
index 1cefc27c1072db6554c5a4d480fca369735a404b..0000000000000000000000000000000000000000
--- a/src/html/dependencies-dev.php
+++ /dev/null
@@ -1,19 +0,0 @@
-    <!-- Stylesheets -->
-    <link rel="stylesheet" href="<?php echo $dn; ?>/node_modules/bootstrap/dist/css/bootstrap.min.css" />
-    <link rel="stylesheet" href="<?php echo $dn; ?>/node_modules/cropper/dist/cropper.min.css" />
-    <link rel="stylesheet" href="<?php echo $dn; ?>/node_modules/font-awesome/css/font-awesome.min.css" />
-    <link rel="stylesheet" href="<?php echo $dn; ?>/dist/css/hd-app.css?v=<?php echo $v ?>" />
-
-    <!-- Javascript -->
-    <script type="text/javascript" src="<?php echo $dn; ?>/node_modules/jquery/dist/jquery.min.js"></script>
-    <script type="text/javascript" src="<?php echo $dn; ?>/node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
-    <script type="text/javascript" src="<?php echo $dn; ?>/node_modules/cropper/dist/cropper.min.js"></script>
-    <script type="text/javascript" src="<?php echo $dn; ?>/dist/lib/webcomponentsjs/webcomponents-loader.js"></script>
-    <script type="text/javascript" src="<?php echo $dn; ?>/src/js/hd-app.js?v=<?php echo $v ?>"></script>
-    <script src="<?php echo $dn; ?>/dist/lib/sib-chat/3rdparty/sib-oidc-client.js?v=<?php echo $v ?>"></script>
-
-    <!-- Web components -->
-    <link rel="import" href="<?php echo $dn; ?>/dist/lib/sib-core/sib-display.html?v=<?php echo $v ?>" />
-    <link rel="import" href="<?php echo $dn; ?>/dist/lib/sib-router/sib-router.html?v=<?php echo $v ?>" />
-    <link rel="import" href="<?php echo $dn; ?>/dist/lib/sib-chat/sib-chat.html">
-
diff --git a/src/html/dependencies-dev.pug b/src/html/dependencies-dev.pug
new file mode 100644
index 0000000000000000000000000000000000000000..595fd6be0b14a814371f6e4732261715c0ef3b01
--- /dev/null
+++ b/src/html/dependencies-dev.pug
@@ -0,0 +1,16 @@
+// Stylesheets
+link(rel='stylesheet', href=`${dn}/node_modules/bootstrap/dist/css/bootstrap.min.css`)
+link(rel='stylesheet', href=`${dn}/node_modules/cropper/dist/cropper.min.css`)
+link(rel='stylesheet', href=`${dn}/node_modules/font-awesome/css/font-awesome.min.css`)
+link(rel='stylesheet', href=`${dn}/dist/css/hd-app.css?v=${v}`)
+// Javascript
+script(src=`${dn}/node_modules/jquery/dist/jquery.min.js`)
+script(src=`${dn}/node_modules/bootstrap/dist/js/bootstrap.min.js`)
+script(src=`${dn}/node_modules/cropper/dist/cropper.min.js`)
+script(src=`${dn}/dist/lib/webcomponentsjs/webcomponents-loader.js`)
+script(src=`${dn}/src/js/hd-app.js?v=${v}`)
+script(src=`${dn}/dist/lib/sib-chat/3rdparty/sib-oidc-client.js?v=${v}`)
+// Web components
+link(rel='import', href=`${dn}/dist/lib/sib-core/sib-display.html?v=${v}`)
+link(rel='import', href=`${dn}/dist/lib/sib-router/sib-router.html?v=${v}`)
+link(rel='import', href=`${dn}/dist/lib/sib-chat/sib-chat.html`)
diff --git a/src/html/dependencies-prod.php b/src/html/dependencies-prod.php
deleted file mode 100644
index d3d1db7d7543229172cab38227d7060515f53a34..0000000000000000000000000000000000000000
--- a/src/html/dependencies-prod.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<!-- Stylesheets -->
-<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">
-<link href="https://cdn.bootcss.com/cropper/4.0.0/cropper.min.css" rel="stylesheet">
-<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
-<link rel="stylesheet" href="<?php echo $dn; ?>/dist/css/hd-app.css?v=<?php echo $v ?>" />
-
-<!-- Javascript -->
-<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script>
-<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script>
-<script src="https://cdn.bootcss.com/cropper/4.0.0/cropper.min.js"></script>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.2.0/webcomponents-loader.js" integrity="sha256-fUVqCtpScUF69qkFkeuHmcShr2N2UleRQJhRG4etHds=" crossorigin="anonymous"></script>
-<script src="<?php echo $dn; ?>/src/js/hd-app.js?v=<?php echo $v ?>"></script>
-<script src="<?php echo $cdn; ?>/sib-chat/3rdparty/sib-oidc-client.js?v=<?php echo $v ?>"></script>
-
-<!-- Web components -->
-<link rel="import" href="<?php echo $cdn; ?>/sib-core/sib-display.html?v=<?php echo $v ?>" />
-<link rel="import" href="<?php echo $cdn; ?>/sib-router/sib-router.html?v=<?php echo $v ?>" />
-<link rel="import" href="<?php echo $cdn; ?>/sib-chat/sib-chat.html">
diff --git a/src/html/dependencies-prod.pug b/src/html/dependencies-prod.pug
new file mode 100644
index 0000000000000000000000000000000000000000..312ac4e997f0c1b0af5887e63d612b8ad37f0eef
--- /dev/null
+++ b/src/html/dependencies-prod.pug
@@ -0,0 +1,34 @@
+// Stylesheets
+link(rel='stylesheet', href='https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css', integrity='sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4', crossorigin='anonymous')
+link(href='https://cdn.bootcss.com/cropper/4.0.0/cropper.min.css', rel='stylesheet')
+link(rel='stylesheet', href='https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css')
+link(rel='stylesheet', href=`${dn}/dist/css/hd-app.css?v=${v}`)
+
+// Javascript
+script(
+  src='https://code.jquery.com/jquery-3.3.1.slim.min.js',
+  integrity='sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo',
+  crossorigin='anonymous')
+script(
+  src='https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js',
+  integrity='sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ',
+  crossorigin='anonymous')
+script(
+  src='https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js',
+  integrity='sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm',
+  crossorigin='anonymous')
+script(
+  src='https://cdn.bootcss.com/cropper/4.0.0/cropper.min.js')
+script(
+  src='https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.2.0/webcomponents-loader.js',
+  integrity='sha256-fUVqCtpScUF69qkFkeuHmcShr2N2UleRQJhRG4etHds=',
+  crossorigin='anonymous')
+script(
+  src=`${dn} ?>/src/js/hd-app.js?v=${v}`)
+script(
+  src=`${cdn} ?>/sib-chat/3rdparty/sib-oidc-client.js?v=${v}`)
+
+// Web components
+link(rel='import', href=`${cdn} ?>/sib-core/sib-display.html?v=${v}`)
+link(rel='import', href=`${cdn} ?>/sib-router/sib-router.html?v=${v}`)
+link(rel='import', href=`${cdn} ?>/sib-chat/sib-chat.html`)
diff --git a/src/html/drive.html b/src/html/drive.html
deleted file mode 100644
index efcbb4bad66753bed69d04ac6c807008e193a8db..0000000000000000000000000000000000000000
--- a/src/html/drive.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<div id="drive" style="display: none">
-  <h1 class="page-title">Drive</h1>
-</div>
diff --git a/src/html/drive.pug b/src/html/drive.pug
new file mode 100644
index 0000000000000000000000000000000000000000..7c123259be4c34009b1abeb814fe4ab226d774b1
--- /dev/null
+++ b/src/html/drive.pug
@@ -0,0 +1,2 @@
+#drive(style='display: none')
+  h1.page-title Drive
diff --git a/src/html/member-chat.html b/src/html/member-chat.html
deleted file mode 100644
index 177f1ebb1d584feda9938791499a6561e728f4dd..0000000000000000000000000000000000000000
--- a/src/html/member-chat.html
+++ /dev/null
@@ -1 +0,0 @@
-<div id="member-chat" class="chat-view" style="display: none" bind-resources></div>
diff --git a/src/html/member-chat.pug b/src/html/member-chat.pug
new file mode 100644
index 0000000000000000000000000000000000000000..52afa4488a4ab91cd85253cf76f3b7062ce91fcf
--- /dev/null
+++ b/src/html/member-chat.pug
@@ -0,0 +1 @@
+#member-chat.chat-view(style='display: none', bind-resources='')
diff --git a/src/html/member-edit.html b/src/html/member-edit.pug
similarity index 52%
rename from src/html/member-edit.html
rename to src/html/member-edit.pug
index b4847081aaaa7799d97828272cd40b30bc36fbb7..83b1c5fe11afad19bab503ab18a1615245c79cd0 100644
--- a/src/html/member-edit.html
+++ b/src/html/member-edit.pug
@@ -1,51 +1,41 @@
-<script>
-  //class LDPFormImgUpload extends SIBWidget {
-  //  get template() {
-  //    return `<label for="${this.name}"><img id="${this.name}-preview" src="${this.value}"/></label>
-  //      <input id="${this.name}" type="file" name="${this.name}" value="${this.value}" />`;
-  //  }
-
-  //  render() {
-  //    store.get(this.value).then( (value) => {
-  //      this._value = value;
-  //      this.innerHTML = this.template;
-  //    });
-  //  }
-  //}
-  //customElements.define("ldp-form-img-upload", LDPFormImgUpload);
-  //widget-avatar="ldp-form-img-upload"
-</script>
-
-<div id="member-edit" style="display: none">
-  <label for="avatar-input" class="d-none">
-    <img id="avatar-preview" src="" style="width: 100%;"/>
-  </label>
-  <input class="d-none" type="file" accept="image/*" id="avatar-input" name="avatar" value="" />
-
-  <sib-form 
-    class="edit-form"
-    data-fields="user, avatar, bio, cell, jabberID, number, pseudo, skills, website"
-    widget-user="hdapp-usereditinfo"
-    range-cell="<?php echo $sdn; ?>/cells/"
-    widget-skills="sib-form-multiple-dropdown"
-    range-skills="<?php echo $sdn; ?>/skills/"
-    bind-resources
-  ></sib-form>
-</div>
-
-<div id="crop-modal">
-  <div class="crop-wrapper">
-    <img id="crop-preview" src="" />
-  </div>
-
-  <div class="control-bar">
-    <button id="cancel-img-cropping" class="btn btn-link">Annuler</button>
-    <i id="rotate-img" class="fa fa-undo" aria-hidden="true"></i>
-    <button id="crop-img" class="btn btn-link">Valider</button>
-  </div>
-</div>
+// script.
+  class LDPFormImgUpload extends SIBWidget {
+    get template() {
+      return `<label for="${this.name}"><img id="${this.name}-preview" src="${this.value}"/></label>
+        <input id="${this.name}" type="file" name="${this.name}" value="${this.value}" />`;
+    }
 
-<script>
+    render() {
+      store.get(this.value).then( (value) => {
+        this._value = value;
+        this.innerHTML = this.template;
+      });
+    }
+  }
+  customElements.define("ldp-form-img-upload", LDPFormImgUpload);
+  widget-avatar="ldp-form-img-upload"
+
+#member-edit(style='display: none')
+  label.d-none(for='avatar-input')
+    img#avatar-preview(src='', style='width: 100%;')
+  input#avatar-input.d-none(accept='image/*', name='avatar', value='', type='file')
+  sib-form.edit-form(
+    data-fields='user, avatar, bio, cell, jabberID, number, pseudo, skills, website',
+    widget-user='hdapp-usereditinfo',
+    range-cell=`${sdn}/cells/`, widget-skills='sib-form-multiple-dropdown',
+    range-skills=`${sdn}/skills/`,
+    bind-resources=''
+  )
+#crop-modal
+  .crop-wrapper
+    img#crop-preview(src='')
+  .control-bar
+    button#cancel-img-cropping.btn.btn-link Annuler
+    i#rotate-img.fa.fa-undo(aria-hidden='true')
+    button#crop-img.btn.btn-link Valider
+
+
+script.
   // Constant declaration
   const avatarPreview = document.querySelector("#avatar-preview");
   const avatarInput   = document.querySelector("#avatar-input");
@@ -105,4 +95,3 @@
     avatarPreview.src = $cropPreview.cropper("getCroppedCanvas").toDataURL()
     closeCropping();
   });
-</script>
diff --git a/src/html/member-profile.html b/src/html/member-profile.html
deleted file mode 100644
index 6e97f4cd5694c32af401725050ffb83f73a5b96b..0000000000000000000000000000000000000000
--- a/src/html/member-profile.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<div id="member-profile" style="display: none">
-  <sib-display 
-    id="member-info" 
-    data-fields="avatar, user, before-pseudo, pseudo, bio, cell, number, roles, website, skills"
-    widget-avatar="sib-display-img"
-    widget-user="hdapp-userinfo"
-    widget-cell="hdapp-usercell"
-    widget-number="sib-display-tel"
-    widget-roles="sib-display-lookuplist"
-    widget-skills="sib-display-lookuplist"
-    bind-resources
-  ></sib-display>
-</div>
diff --git a/src/html/member-profile.pug b/src/html/member-profile.pug
new file mode 100644
index 0000000000000000000000000000000000000000..11057ab9012f33a2590c29127d240fa98e3e2cac
--- /dev/null
+++ b/src/html/member-profile.pug
@@ -0,0 +1,11 @@
+#member-profile(style='display: none')
+  sib-display#member-info(
+    data-fields='avatar, user, before-pseudo, pseudo, bio, cell, number, roles, website, skills',
+    widget-avatar='sib-display-img',
+    widget-user='hdapp-userinfo',
+    widget-cell='hdapp-usercell',
+    widget-number='sib-display-tel',
+    widget-roles='sib-display-lookuplist',
+    widget-skills='sib-display-lookuplist',
+    bind-resources=''
+  )
diff --git a/src/html/member.php b/src/html/member.php
deleted file mode 100644
index b25db2b4fd671ead2d48028292332a60ab02b404..0000000000000000000000000000000000000000
--- a/src/html/member.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<div id="member" style="display: none">
-  <sib-router id="member-router" default-route="member-profile">
-    <sib-route name="member-chat">
-      <button>Chat</button>
-    </sib-route>
-    <sib-route name="member-profile">
-      <button>Voir</button>
-    </sib-route>
-    <sib-route name="member-edit">
-      <button>Éditer</button>
-    </sib-route>
-  </sib-router>
-
-  <div id="member-views-container">
-    <?php require_once('member-chat.html'); ?>
-    <?php require_once('member-profile.html'); ?>
-    <?php require_once('member-edit.html'); ?>
-  </div>
-</div>
diff --git a/src/html/member.pug b/src/html/member.pug
new file mode 100644
index 0000000000000000000000000000000000000000..8b1d68c90f3109b01ec9f81c82a6847530cdca70
--- /dev/null
+++ b/src/html/member.pug
@@ -0,0 +1,12 @@
+#member(style='display: none')
+  sib-router#member-router(default-route='member-profile')
+    sib-route(name='member-chat')
+      button Chat
+    sib-route(name='member-profile')
+      button Voir
+    sib-route(name='member-edit')
+      button Éditer
+  #member-views-container
+    include member-chat.pug
+    include member-profile.pug
+    include member-edit.pug
diff --git a/src/html/members.html b/src/html/members.pug
similarity index 76%
rename from src/html/members.html
rename to src/html/members.pug
index 553e833f07f16e888e024b642fe7a4707223d898..2ccdd30c0000d0b2da53381cfaf81c9e52dfac88 100644
--- a/src/html/members.html
+++ b/src/html/members.pug
@@ -1,4 +1,4 @@
-<script>
+script.
   document.addEventListener("WebComponentsReady", function(event) { 
     class HDAppUserInfo extends SIBDisplayLookupList {
       get parentElement() {return "div"}
@@ -50,22 +50,20 @@
     }
     customElements.define("hdapp-usercell", HDAppCell);
   });
-</script>
 
-<div id="members" class="view" style="display: none">
-  <sib-display 
-    id="profiles-list" 
-    data-src="<?php echo $sdn; ?>/members/" 
-    data-fields="avatar, user, before-pseudo, pseudo, bio, cell, skills"
-    value-before-pseudo="@"
-    widget-avatar="sib-display-img"
-    widget-user="hdapp-userinfo"
-    widget-cell="hdapp-usercell"
-    widget-skills="sib-display-lookuplist"
-    set-searchset="user.first_name, user.last_name"
-    search-fields="searchset"
-    next="member"
-  ></sib-display>
-</div>
+#members.view(style='display: none')
+  sib-display#profiles-list(
+    data-src=`${sdn}/members/`,
+    data-fields='avatar, user, before-pseudo, pseudo, bio, cell, skills',
+    value-before-pseudo='@',
+    widget-avatar='sib-display-img',
+    widget-user='hdapp-userinfo',
+    widget-cell='hdapp-usercell',
+    widget-skills='sib-display-lookuplist',
+    set-searchset='user.first_name, user.last_name',
+    search-fields='searchset',
+    next='member'
+  )
+
 
 
diff --git a/src/html/menu.html b/src/html/menu.html
deleted file mode 100644
index b4f45f45f1fdbd65d9749cef7d994fedbb7de3e1..0000000000000000000000000000000000000000
--- a/src/html/menu.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<nav class="navbar bg-white fixed-top border-bottom pb-0 d-md-flex" id="navbar">
-
-  <sib-router id="navbar-router" class="navbar-nav" default-route="members">
-    <sib-route id="menu-title" class="nav-item" name="dashboard">
-      HAPPY DEV
-    </sib-route>
-
-    <div id="menu-items" class="col-7 col-md-7">
-      <sib-route class="nav-item pb-2 active align-self-stretch text-center text-md-left" name="members">
-        <i class="fa fa-users" aria-hidden="true"></i>
-        <span class="d-none d-md-inline">Membres</span>
-      </sib-route>
-      <sib-route class="d-none" name="member" id-prefix="<?php echo $sdn; ?>/members/"></sib-route>
-
-      <sib-route class="nav-item pb-2 align-self-stretch text-center text-md-left" name="projects">
-        <i class="fa fa-tasks" aria-hidden="true"></i>
-        <span class="d-none d-md-inline"> Projets</span>
-      </sib-route>
-      <sib-route class="d-none" name="project" id-prefix="<?php echo $sdn; ?>/projects/"></sib-route>
-      <sib-route name="client-create">New client</sib-route>
-
-      <sib-route class="nav-item pb-2 align-self-stretch text-center text-md-left" name="channels">
-        <i class="fa fa-comments" aria-hidden="true"></i>
-        <span class="d-none d-md-inline"> Network</span>
-      </sib-route>
-      <sib-route class="d-none" name="channel" id-prefix="<?php echo $sdn; ?>/channels/"></sib-route>
-    </div>
-
-    <div class="col-2 col-md-1"></div>
-  </sib-router>
-
-  <div id="search-bar">
-    <input id="search-input" class="form-control" type="search" placeholder="ctrl + k"/>
-    <i id="search-icon" class="fa fa-search" aria-hidden="true"></i>
-    <i id="close-search-icon" class="fa fa-times" aria-hidden="true"></i>
-  </div>
-</nav>
diff --git a/src/html/menu.pug b/src/html/menu.pug
new file mode 100644
index 0000000000000000000000000000000000000000..a374d7293559b45edc647120de186a99d5dd0ccd
--- /dev/null
+++ b/src/html/menu.pug
@@ -0,0 +1,23 @@
+nav#navbar.navbar.bg-white.fixed-top.border-bottom.pb-0.d-md-flex
+  sib-router#navbar-router.navbar-nav(default-route='members')
+    sib-route#menu-title.nav-item(name='dashboard')
+      | HAPPY DEV
+    #menu-items.col-7.col-md-7
+      sib-route.nav-item.pb-2.active.align-self-stretch.text-center.text-md-left(name='members')
+        i.fa.fa-users(aria-hidden='true')
+        span.d-none.d-md-inline Membres
+      sib-route.d-none(name='member', id-prefix=`${sdn}/members/`)
+      sib-route.nav-item.pb-2.align-self-stretch.text-center.text-md-left(name='projects')
+        i.fa.fa-tasks(aria-hidden='true')
+        span.d-none.d-md-inline  Projets
+      sib-route.d-none(name='project', id-prefix=`${sdn}/projects/`)
+      sib-route(name='client-create') New client
+      sib-route.nav-item.pb-2.align-self-stretch.text-center.text-md-left(name='channels')
+        i.fa.fa-comments(aria-hidden='true')
+        span.d-none.d-md-inline  Network
+      sib-route.d-none(name='channel', id-prefix=`${sdn}/channels/`)
+    .col-2.col-md-1
+  #search-bar
+    input#search-input.form-control(placeholder='ctrl + k', type='search')
+    i#search-icon.fa.fa-search(aria-hidden='true')
+    i#close-search-icon.fa.fa-times(aria-hidden='true')
diff --git a/src/html/project-chat.html b/src/html/project-chat.html
deleted file mode 100644
index 08318133732c6d78aeea2f330f6c1eb0121fa4ea..0000000000000000000000000000000000000000
--- a/src/html/project-chat.html
+++ /dev/null
@@ -1 +0,0 @@
-<div id="project-chat" class="chat-view" style="display: none" bind-resources></div>
diff --git a/src/html/project-chat.pug b/src/html/project-chat.pug
new file mode 100644
index 0000000000000000000000000000000000000000..5d59065e7b30cc5f89477168fdc524f755d50e0c
--- /dev/null
+++ b/src/html/project-chat.pug
@@ -0,0 +1 @@
+#project-chat.chat-view(style='display: none', bind-resources='')
diff --git a/src/html/project-create.html b/src/html/project-create.html
deleted file mode 100644
index 91396021c1abe31ae4d9b64f633401ef890833b4..0000000000000000000000000000000000000000
--- a/src/html/project-create.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<div id="project-create" style="display: none">
-  <sib-form 
-    data-src="<?php echo $sdn; ?>/projects/" 
-    range-client="<?php echo $sdn; ?>/clients/"
-    widget-team="sib-form-multiple-dropdown"
-    range-team="<?php echo $sdn; ?>/members/"
-  ></sib-form>
-</div>
diff --git a/src/html/project-create.pug b/src/html/project-create.pug
new file mode 100644
index 0000000000000000000000000000000000000000..69a960746665b75b278ee937bf953b556070bb3a
--- /dev/null
+++ b/src/html/project-create.pug
@@ -0,0 +1,7 @@
+#project-create(style='display: none')
+  sib-form(
+    data-src=`${sdn}/projects/`,
+    range-client=`${sdn}/clients/`,
+    widget-team='sib-form-multiple-dropdown',
+    range-team=`${sdn}/members/`
+  )
diff --git a/src/html/project-edit.html b/src/html/project-edit.html
deleted file mode 100644
index c2471fc34a1ec4427d204a2a7896466d9137d514..0000000000000000000000000000000000000000
--- a/src/html/project-edit.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<div id="project-edit" style="display: none">
-  <sib-form 
-    range-client="<?php echo $sdn; ?>/clients/"
-    widget-team="sib-form-multiple-dropdown"
-    range-team="<?php echo $sdn; ?>/members/"
-    bind-resources
-  ></sib-form>
-</div>
-
diff --git a/src/html/project-edit.pug b/src/html/project-edit.pug
new file mode 100644
index 0000000000000000000000000000000000000000..dd6c9026ad639fce6f4104f42c900a8cfcfca79e
--- /dev/null
+++ b/src/html/project-edit.pug
@@ -0,0 +1,7 @@
+#project-edit(style='display: none')
+  sib-form(
+    range-client=`${sdn}/clients/`,
+    widget-team='sib-form-multiple-dropdown',
+    range-team=`${sdn}/members/`,
+    bind-resources=''
+  )
diff --git a/src/html/project-profile.html b/src/html/project-profile.html
deleted file mode 100644
index 0d2ad8b1e2ed4c95644e943080cf9623a1e332ab..0000000000000000000000000000000000000000
--- a/src/html/project-profile.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<div id="project-profile" style="display: none">
-  <sib-display 
-    data-fields="name, number, client" 
-    widget-client="hdapp-client"
-    bind-resources
-  ></sib-display>
-
-  <h2>Team</h2>
-  <sib-display 
-    class="members-list-condensed"
-    id-suffix="team"
-    data-fields="avatar, user"
-    widget-avatar="sib-display-img"
-    widget-user="hdapp-userinfo"
-    next="member"
-    bind-resources
-  ></sib-display>
-</div>
-
diff --git a/src/html/project-profile.pug b/src/html/project-profile.pug
new file mode 100644
index 0000000000000000000000000000000000000000..6db2091085de5d3bf89b1d4fb7b664f6f7321fb1
--- /dev/null
+++ b/src/html/project-profile.pug
@@ -0,0 +1,15 @@
+#project-profile(style='display: none')
+  sib-display(
+    data-fields='name, number, client',
+    widget-client='hdapp-client',
+    bind-resources=''
+  )
+  h2 Team
+  sib-display.members-list-condensed(
+    id-suffix='team',
+    data-fields='avatar, user',
+    widget-avatar='sib-display-img',
+    widget-user='hdapp-userinfo',
+    next='member',
+    bind-resources=''
+  )
diff --git a/src/html/project.php b/src/html/project.php
deleted file mode 100644
index 68ccc9489c7690cc866247497c121c5f8c6a069e..0000000000000000000000000000000000000000
--- a/src/html/project.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<div id="project" style="display: none">
-  <sib-router id="project-router" default-route="project-profile">
-    <sib-route name="project-chat">
-      <button>Chat</button>
-    </sib-route>
-    <sib-route name="project-profile">
-      <button>Voir</button>
-    </sib-route>
-    <sib-route name="project-edit">
-      <button>Éditer</button>
-    </sib-route>
-    <sib-route name="project-create">
-      <button>Nouveau</button>
-    </sib-route>
-  </sib-router>
-
-  <div id="project-views-container">
-    <?php require_once('project-chat.html'); ?>
-    <?php require_once('project-profile.html'); ?>
-    <?php require_once('project-edit.html'); ?>
-    <?php require_once('project-create.html'); ?>
-  </div>
-</div>
diff --git a/src/html/project.pug b/src/html/project.pug
new file mode 100644
index 0000000000000000000000000000000000000000..c027c2669d26694c8ce043cd54ea8acbaa3852fa
--- /dev/null
+++ b/src/html/project.pug
@@ -0,0 +1,15 @@
+#project(style='display: none')
+  sib-router#project-router(default-route='project-profile')
+    sib-route(name='project-chat')
+      button Chat
+    sib-route(name='project-profile')
+      button Voir
+    sib-route(name='project-edit')
+      button Éditer
+    sib-route(name='project-create')
+      button Nouveau
+  #project-views-container
+    include project-chat.pug
+    include project-profile.pug
+    include project-edit.pug
+    include project-create.pug
diff --git a/src/html/projects.html b/src/html/projects.pug
similarity index 61%
rename from src/html/projects.html
rename to src/html/projects.pug
index 75089b52c6393f274e2ff184d2bc02156b9b1958..942bf1fc6b4f674fd99e3029fb33c39a837c0539 100644
--- a/src/html/projects.html
+++ b/src/html/projects.pug
@@ -1,4 +1,4 @@
-<script>
+script.
   document.addEventListener("WebComponentsReady", function(event) { 
     class HDAppClient extends SIBWidget {
       get template() {
@@ -14,15 +14,12 @@
     }
     customElements.define("hdapp-client", HDAppClient);
   });
-</script>
 
-<div id="projects" style="display: none">
-  <sib-display 
-    data-src="<?php echo $sdn; ?>/projects/"
-    data-fields="number, client, name" 
-    widget-client="hdapp-client"
-    search-fields="number, name"
-    next="project"
-  ></sib-display>
-</div>
-  
+#projects(style='display: none')
+  sib-display(
+    data-src=`${sdn}/projects/`,
+    data-fields='number, client, name',
+    widget-client='hdapp-client',
+    search-fields='number, name',
+    next='project'
+  )
diff --git a/src/html/search.html b/src/html/search.html
deleted file mode 100644
index b3f5969cf7936ba8cb18cf3fff01a10c263a006c..0000000000000000000000000000000000000000
--- a/src/html/search.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<div id="search-view">
-  <div class="content container-fluid">
-    <ldp-display 
-      id="search-results-members" 
-      class="list-condensed"
-      data-src="<?php echo $sdn; ?>/members/" 
-      set-name="firstname, name-separator, lastname"
-      value-name-separator="&nbsp;"
-      data-fields="avatar, name"
-      widget-avatar="ldp-display-img"
-      search-fields="firstname, lastname"
-      next="member"
-    ></ldp-display>
-
-    <ldp-display 
-      id="search-results-projects" 
-      class="list-condensed"
-      data-src="<?php echo $sdn; ?>/projects/"
-      set-title="number, after-num-separator, name"
-      value-after-num-separator="&nbsp;-&nbsp;"
-      data-fields="client, title" 
-      widget-client="ldp-display-client"
-      search-fields="number, name"
-      next="project"
-    ></ldp-display>
-
-    <ldp-display 
-      id="search-results-channels" 
-      data-src="<?php echo $sdn; ?>/channels/" 
-      data-fields="name" 
-      search-fields="name"
-      next="channel"
-    ></ldp-display>
-  </div>
-</div>
diff --git a/src/html/search.pug b/src/html/search.pug
new file mode 100644
index 0000000000000000000000000000000000000000..8d809aad84852ff00c663fab6ecdddd70a1085f2
--- /dev/null
+++ b/src/html/search.pug
@@ -0,0 +1,26 @@
+#search-view
+  .content.container-fluid
+    ldp-display#search-results-members.list-condensed(
+      data-src=`${sdn}/members/`,
+      set-name='firstname, name-separator, lastname',
+      value-name-separator=' ',
+      data-fields='avatar, name',
+      widget-avatar='ldp-display-img',
+      search-fields='firstname, lastname',
+      next='member'
+    )
+    ldp-display#search-results-projects.list-condensed(
+      data-src=`${sdn}/projects/`,
+      set-title='number, after-num-separator, name',
+      value-after-num-separator=' - ',
+      data-fields='client, title',
+      widget-client='ldp-display-client',
+      search-fields='number, name',
+      next='project'
+    )
+    ldp-display#search-results-channels(
+      data-src=`${sdn}/channels/`,
+      data-fields='name',
+      search-fields='name',
+      next='channel'
+    )