diff --git a/server/index.js b/server/index.js
index c07cb55bcd97e902b911571c1802708a0010a648..70c1aa05ee2b48a3136897fbcf29bf0d4333577c 100644
--- a/server/index.js
+++ b/server/index.js
@@ -1,76 +1,35 @@
-const fetch = require('node-fetch');
+const http = require('http');
+const fs = require('fs');
 const path = require('path');
+const socketIO = require('socket.io');
+const { port } = require('./config');
+const socket = require('./socket');
 
-const {
-  uuid, fontSize, rowHeight, port, api,
-} = require('./config');
+const indexPath = path.resolve(__dirname, '../front/build/index.html');
 
-const io = require('socket.io')(port || 3000);
-const { createSignedJWT, interval } = require('./utils');
-
-const { spawn } = require('child_process');
-
-const dummyResponse = require('./dummyResponse.json');
-
-const useDummy = false;
-
-let version;
-
-const checkVersion = (newVersion) => {
-  console.log(version !== newVersion ? 'Update code' : '');
-  if (version && version !== newVersion) {
-    const updateServer = spawn(path.resolve(__dirname, '../scripts/update_server.sh'));
-    updateServer.stdout.on('data', (data) => {
-      process.stdout.write(data);
-    });
-  }
-  version = newVersion;
-};
-
-const doScreenApiRequest = (socket, userid = null) => {
-  const query = userid ? `?userid=${userid}` : '';
-  return fetch(`${api.url}/${api.version}/screen/${uuid}${query}`, {
-    headers: {
-      Autorization: `Bearer ${createSignedJWT()}`,
-    },
-  })
-    .then(rawRes => rawRes.json())
-    .then((res) => {
-      checkVersion(res.version);
-      socket.emit('panel_data', res);
-      return res.ttl;
-    })
-    .catch(console.log);
-};
-
-const setChrono = (socket) => {
-  if (useDummy) {
-    return interval(() => socket.emit('panel_data', dummyResponse), 10000);
+const server = (req, res) => {
+  let url = req.url.replace(/(^\/|\/$)/g, '').trim();
+  if (url === '') {
+    url = 'index.html';
   }
-  return interval(() => doScreenApiRequest(socket), 10000);
-};
-
-io.of('/').on('connection', (socket) => {
-  socket.emit('config', { fontSize, rowHeight });
-
-  const chrono = setChrono(socket);
-  chrono.startNow();
-
-  // Respond to date message with the date
-  socket.on('date', () => {
-    socket.emit('date', { date: Date.now() });
-  });
-
-  socket.on('disconnect', () => {
-    chrono.stop();
+  console.log(url);
+  const askedPath = path.resolve(__dirname, `../front/build/${url}`);
+  const filePath = fs.existsSync(askedPath) ? askedPath : indexPath;
+  fs.readFile(filePath, (err, data) => {
+    if (err) {
+      res.writeHead(500);
+      res.end('Error loading index.html');
+      return;
+    }
+
+    res.writeHead(200);
+    res.end(data);
   });
+};
 
-  const badgeChild = spawn(path.resolve(__dirname, '../scripts/nfc-poll-wrapper.sh'));
+const app = http.createServer(server);
+app.listen(port || 3000);
 
-  badgeChild.stdout.on('data', (data0) => {
-    const userid = data0.toString().trim();
-    console.log(`child stdout: ${userid}`);
+const io = socketIO(app);
 
-    doScreenApiRequest(socket, userid).then(ttl => chrono.restart(ttl));
-  });
-});
+io.of('/').on('connection', socket);
diff --git a/server/socket.js b/server/socket.js
new file mode 100644
index 0000000000000000000000000000000000000000..b9da6466b124993b0719a761e43a1c5915a8164c
--- /dev/null
+++ b/server/socket.js
@@ -0,0 +1,75 @@
+const fetch = require('node-fetch');
+const path = require('path');
+
+const {
+  uuid, fontSize, rowHeight, api,
+} = require('./config');
+
+const { spawn } = require('child_process');
+
+const dummyResponse = require('./dummyResponse.json');
+
+const { createSignedJWT, interval } = require('./utils');
+
+const useDummy = false;
+
+let version;
+
+const checkVersion = (newVersion) => {
+  console.log(version !== newVersion ? 'Update code' : '');
+  if (version && version !== newVersion) {
+    const updateServer = spawn(path.resolve(__dirname, '../scripts/update_server.sh'));
+    updateServer.stdout.on('data', (data) => {
+      process.stdout.write(data);
+    });
+  }
+  version = newVersion;
+};
+
+const doScreenApiRequest = (socket, userid = null) => {
+  const query = userid ? `?userid=${userid}` : '';
+  return fetch(`${api.url}/${api.version}/screen/${uuid}${query}`, {
+    headers: {
+      Autorization: `Bearer ${createSignedJWT()}`,
+    },
+  })
+    .then(rawRes => rawRes.json())
+    .then(async (res) => {
+      await checkVersion(res.version);
+      socket.emit('panel_data', res);
+      return res.ttl;
+    })
+    .catch(console.log);
+};
+
+const setChrono = (socket) => {
+  if (useDummy) {
+    return interval(() => socket.emit('panel_data', dummyResponse), 10000);
+  }
+  return interval(() => doScreenApiRequest(socket), 10000);
+};
+
+module.exports = (socket) => {
+  socket.emit('config', { fontSize, rowHeight });
+
+  const chrono = setChrono(socket);
+  chrono.startNow();
+
+  // Respond to date message with the date
+  socket.on('date', () => {
+    socket.emit('date', { date: Date.now() });
+  });
+
+  socket.on('disconnect', () => {
+    chrono.stop();
+  });
+
+  const badgeChild = spawn(path.resolve(__dirname, '../scripts/nfc-poll-wrapper.sh'));
+
+  badgeChild.stdout.on('data', (data0) => {
+    const userid = data0.toString().trim();
+    console.log(`child stdout: ${userid}`);
+
+    doScreenApiRequest(socket, userid).then(ttl => chrono.restart(ttl));
+  });
+};