diff --git a/index.js b/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..12cb830e931db54f43350194a0a01f23895efb34
--- /dev/null
+++ b/index.js
@@ -0,0 +1,63 @@
+const express = require('express');
+const session = require('express-session');
+const bodyParser = require('body-parser');
+const User = require('./models/user');
+const mongoose = require('mongoose');
+const bcrypt = require('bcrypt');
+
+const config = require('./config.json');
+
+// Configuration
+const app = express();
+app.set('view engine', 'pug');
+app.use(session({
+  secret: config.secret,
+  resave: false,
+  saveUninitialized: false
+}));
+
+// Middlewares
+app.use(bodyParser.urlencoded({
+  extended: false,
+}));
+app.use((req, res, next) => {
+  if (!req.session.user && !['/', '/signup'].includes(req.url)) {
+    return res.redirect('/signup');
+  } else {
+    return next();
+  }
+});
+
+app.get('/', (req, res) => {
+  return res.render('home');
+});
+app.get('/signup', (req, res) => {
+  return res.render('signup');
+});
+app.post('/signup', (req, res) => {
+  bcrypt.hash(req.body.password, config.cryptRounds).then((hash, err) => {
+    User.create(req.body).then(user => {
+      req.session.user = user;
+      return res.redirect('/');
+    });
+  });
+});
+app.post('/login', (req, res) => {
+  User.findOne({ username: req.body.username }).then(user => {
+    bcrypt.compare(req.body.password, user.passwordHash).then((err, same) => {
+      if (same) {
+        req.session.user = user;
+        return res.redirect(req.query.nextUrl);
+      } else {
+        return res.redirect('/signup');
+      }
+    });
+  });
+});
+
+mongoose.connect('mongodb://localhost/rolegame', err => {
+  console.log('Server connected to Mongo database');
+  app.listen(config.port, () => {
+    console.log(`Server listening on http://localhost:${config.port}`);
+  });
+});
diff --git a/models/user.js b/models/user.js
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fdb9dc2587a5453ea56b85e9a19e301f93f3c045 100644
--- a/models/user.js
+++ b/models/user.js
@@ -0,0 +1,25 @@
+const mongoose = require('mongoose');
+
+const User = new mongoose.Schema({
+  firstName: {
+    type: String,
+    required: true,
+  },
+  lastName: {
+    type: String,
+  },
+  username: {
+    unique: true,
+    type: String,
+    lowercase: true
+  },
+  email: {
+    type: String,
+    required: true,
+  },
+  passwordHash: {
+    type: String,
+  },
+});
+
+module.exports = mongoose.model('User', User);
\ No newline at end of file
diff --git a/views/base.pug b/views/base.pug
new file mode 100644
index 0000000000000000000000000000000000000000..7c6b4cd09b15d8e794e9167b4125516f768c509a
--- /dev/null
+++ b/views/base.pug
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+html(lang="en")
+  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")
+    link(rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css" integrity="sha256-9mbkOfVho3ZPXfM7W8sV2SndrGDuh7wuyLjtsWeTI1Q=" crossorigin="anonymous")
+    title RoleGame
+  body
+    block navbar
+    .ui.container
+      block main
+    block script
+      script(src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E=" crossorigin="anonymous")
+      script(src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js" integrity="sha256-t8GepnyPmw9t+foMh3mKNvcorqNHamSKtKRxxpUEgFI=" crossorigin="anonymous")
\ No newline at end of file
diff --git a/views/home.pug b/views/home.pug
new file mode 100644
index 0000000000000000000000000000000000000000..c227ddd8f33b019c79860ce241c0298e9b527bbe
--- /dev/null
+++ b/views/home.pug
@@ -0,0 +1,4 @@
+extends base.pug
+
+block main
+  h1.ui.header Bienvenue sur RoleGame
diff --git a/views/signup.pug b/views/signup.pug
new file mode 100644
index 0000000000000000000000000000000000000000..afcd9076e903308f8f223e5feeec21b0c4b8e80c
--- /dev/null
+++ b/views/signup.pug
@@ -0,0 +1,22 @@
+extends base.pug
+
+block main
+  form.ui.form(action="/signup" method="post")
+    .two.fields
+      .field
+        label(for="firstName") Prénom
+        input#firstName(type="text", name="firstName")
+      .field
+        label(for="lastName") Nom de famille
+        input#lastName(type="text", name="lastName")
+    .field
+      label(for="email") Email
+      input#email(type="email", name="email")
+    .field
+      label(for="username") Nom d'utilisateur
+      input#username(type="text", name="username")
+    .field
+      label(for="password") Mot de passe
+      input#password(type="password", name="password")
+    .field
+      input.ui.button(type="submit", value="S'inscrire")
\ No newline at end of file