diff --git a/README.md b/README.md
deleted file mode 100644
index 29685b1..0000000
--- a/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# App per la traçabilitat del COVID-19 a la FME
-De moment, les tasques bàsiques a realitzar (a part de fer l'app en sí):
-
-~~1.- Primer de tot, el que voldrem és "mapejar" les aules de la FME perquè sigui més fàcil indicar on està un assegut. Idees: per la forma de l'aula hi ha això: https://fme.upc.edu/ca/fme/edifici/plafo-fme-a4.pdf, pels llocs ho haurem de fer manual.~~ A la majoria d'aules hi ha número+lletra, és molt més fàcil introduïr això a l'app que geolocalitzar-te.
-
-2.- També, volem els horaris de les assignatures per endevinar què està cursant l'usuari cada hora. Idees: parsejar això https://fme.upc.edu/ca/arxius/curs-actual/horaris/20-21/horari-gm_fme2020-2021_q1_provisional-1.pdf
-
-3.- Per últim, volem les aules en les que es cursen les assignatures segons l'hora. Idees: fer scrapping d'això ~~https://fme.upc.edu/ca/la-facultat/edifici/ocupacio-despais~~ Aules Teoria: https://fme-intranet.upc.edu/appsext/mrbs/web/day.php?year=2020&month=9&day=17&area=2 Aules PC: https://fme-intranet.upc.edu/appsext/mrbs/web/day.php?year=2020&month=9&day=17&area=6
-
-Recordeu que estem intentant millorar això: https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform
-
-Vinga va.
diff --git a/css/bulma-ajustments.css b/css/bulma-ajustments.css
new file mode 100644
index 0000000..8931934
--- /dev/null
+++ b/css/bulma-ajustments.css
@@ -0,0 +1,49 @@
+.buttons.grid {
+    display: flex;
+    flex-direction: row;
+    flex-wrap: wrap;
+    
+    justify-content: center;
+    align-items : center;
+}
+
+.buttons.grid .button {
+    flex: 1 0 20%;
+    margin: 10px;
+    padding: 40px 20px;
+    line-height: 0px;
+}
+
+.buttons.grid .complex-button {
+    flex: 1 0 34%;
+    margin: 15px 10px;
+}
+
+.section {
+    padding-top: 1rem;
+}
+
+#dev-mode {
+  background: #d23f31;
+  border: 1px solid #3e2723;
+  box-shadow: 0 0 4px rgba(0,0,0,.14), 0 2px 4px rgba(0,0,0,.28);
+  color: #fff;
+  font-size: 10px;
+  font-weight: 700;
+  right: 20px;
+  line-height: 18px;
+  margin: -9px -50px;
+  opacity: .87;
+  position: absolute;
+  text-align: center;
+  text-shadow: 1px 1px 0 #4e342e;
+  top: 20px;
+  transform: rotate(45deg);
+  width: 100px;
+  z-index: 99;
+  cursor: pointer;
+}
+
+#dev-mode.hidden {
+  display: none;
+}
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..37445d2
--- /dev/null
+++ b/index.html
@@ -0,0 +1,350 @@
+<!DOCTYPE html>
+
+<html lang="ca">
+    <head>
+        <meta charset="utf-8">
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
+        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.0/css/bulma.min.css">
+        <link rel="stylesheet" href="./css/bulma-adjustments.css">
+    </head>
+    <body>
+        <script>
+            var elements = document.getElementsByClassName("button");
+            Array.from(elements).forEach(function(element) {
+                element.addEventListener('click', clickButton);
+                element.parent = element.parentNode.id;
+            });
+            var elements = document.getElementsByClassName("complex-button");
+            Array.from(elements).forEach(function(element) {
+                element.addEventListener('click', clickButton);
+                element.parent = element.parentNode.id;
+            });
+
+            var final_JSON = {
+                "class": null,
+                "number": "",
+                "letter": ""
+            };
+
+            function fillInSummary() {
+              var begins = new Date(parseInt(final_JSON.class.begins)*1000);
+              var ends = new Date(parseInt(final_JSON.class.ends)*1000);
+
+              document.getElementById('subject-final').textContent = final_JSON.class.friendly_name;
+              document.getElementById('classroom-final').textContent = final_JSON.class.room;
+              document.getElementById('date-final').textContent = begins.toLocaleDateString();
+              document.getElementById('time-final').textContent = formatDate(begins) + ' - ' + formatDate(ends);
+              document.getElementById('letter-final').textContent = final_JSON.letter;
+              document.getElementById('number-final').textContent = final_JSON.number;
+            }
+
+            function clickButton(element) {
+                var btn = element.currentTarget;
+                var parent = btn.parent;
+
+                if (parent == "subject-container") {
+                    // Canvi de background del button
+                    var selectedClass = JSON.parse(btn.getAttribute('data-class'));
+                    $("#subject-container .complex-button").removeClass("is-link")
+                    btn.classList.add("is-link");
+                    // Canvi JSON
+                    final_JSON["class"] = selectedClass;
+                    // Anchor següent pregunta
+                    switchSection("section-2");
+                } else if (parent == "number-container") {
+                    // Canvi de background del button
+                    $("#number-container .button").removeClass("is-link is-light is-active")
+                    btn.classList.add("is-link", "is-light", "is-active");
+                    // Canvi JSON
+                    final_JSON["number"] = btn.getAttribute('data-number');
+                    // Introducció de totes les dades al resum final
+                    fillInSummary();
+                    // Anchor següent pregunta
+                    switchSection("section-send");
+                } else if (parent == "letter-container") {
+                    // Canvi de background del button
+                    $("#letter-container .button").removeClass("is-link is-light is-active")
+                    btn.classList.add("is-link", "is-light", "is-active");
+                    // Canvi JSON
+                    final_JSON["letter"] = btn.getAttribute('data-letter');
+                    // Anchor següent pregunta
+                    switchSection("section-3");
+                }
+            }
+            
+            function formatDate(d) {
+                var str = "";
+                if (d.getHours() < 10) str += "0";
+                str += d.getHours();
+                str += ":";
+                if (d.getMinutes() < 10) str += "0";
+                str += d.getMinutes();
+                return str;
+            }
+
+          var api_url;
+
+          window.addEventListener('load', _ => {
+            // Check if user is signed in
+            if (localStorage.getItem('devMode') == 'true') {
+              var banner = document.getElementById('dev-mode');
+              banner.addEventListener('click', _ => {
+                localStorage.devMode = 'false';
+                location.reload();
+              });
+              banner.classList.remove('hidden');
+              api_url = localStorage.getItem('apiUrl') || 'https://covid-tracability-backend-dev.sandbox.avm99963.com/api/v1/'
+            } else {
+              api_url = "https://covid-tracability-backend-prod.sandbox.avm99963.com/api/v1/";
+            }
+            fetch(api_url + "isSignedIn", {
+              "mode": "cors",
+              "credentials": "include"
+            })
+                .then(response => response.json())
+                .then(data => {
+                    if (!data.payload.signedIn) {
+                        console.log("Not signed in!");
+                        fetch(api_url + "getAuthUrl", {
+                          "mode": "cors",
+                          "credentials": "include"
+                        })
+                            .then(response => response.json())
+                            .then(data => {
+                                // TODO: redirect here
+                                // location.href = data.payload.url;
+                                console.warn('Log in here: ', data.payload.url);
+                            });
+                    }
+                });
+
+            fetch(api_url + "getCurrentClasses", {
+              "mode": "cors",
+              "credentials": "include"
+            })
+                .then(response => response.json())
+                .then(data => {
+                    for (var classe of data.payload.classes) {
+                        console.log(classe);
+
+                        var hora_inici = formatDate(new Date(parseInt(classe.begins)*1000));
+                        var hora_final = formatDate(new Date(parseInt(classe.ends)*1000));
+                        
+                        var classeDiv = document.createElement('div');
+                        classeDiv.classList.add('message', 'complex-button');
+                        classeDiv.id = 'subject-' + classe.subject_id + '-' + classe.room;
+                        classeDiv.setAttribute('data-class', JSON.stringify(classe));
+
+                        var header = document.createElement('div');
+                        header.classList.add('message-header');
+                        header.textContent = classe.friendly_name;
+
+                        var body = document.createElement('div');
+                        body.classList.add('message-body');
+
+                        var div1 = document.createElement('div');
+                        var span = document.createElement('span');
+                        span.textContent = classe.room;
+
+                        div1.textContent = 'Aula ';
+                        div1.appendChild(span);
+
+                        var div2 = document.createElement('div');
+                        div2.textContent = hora_inici + ' - ' + hora_final;
+
+                        body.appendChild(div1);
+                        body.appendChild(div2);
+
+                        classeDiv.appendChild(header);
+                        classeDiv.appendChild(body);
+
+                        document.getElementById("subject-container").appendChild(classeDiv);
+                    }
+
+                    var elements = document.getElementsByClassName("button");
+                    Array.from(elements).forEach(function(element) {
+                        element.addEventListener('click', clickButton);
+                        element.parent = element.parentNode.id;
+                    });
+                    var elements = document.getElementsByClassName("complex-button");
+                    Array.from(elements).forEach(function(element) {
+                        element.addEventListener('click', clickButton);
+                        element.parent = element.parentNode.id;
+                    });
+                });
+          });
+        </script>
+
+        <span id="dev-mode" class="hidden">Dev mode</span>
+        
+        <nav class="navbar is-link">
+            <div class="navbar-brand">
+                <div class="navbar-item has-text-weight-bold">Traçabilitat DAFME</div>
+            </div>
+        </nav>
+        
+        <section id="section-1" class="section">
+            <!--
+            <div class="field has-addons">
+                <p class="control">
+                    <button class="button">&lt;</button>
+                </p>
+                <p class="control">
+                    <input type="date" class="button">
+                </p>
+                <p class="control">
+                    <button class="button">&gt;</button>
+                </p>
+            </div>
+            <div class="field has-addons">
+                <p class="control">
+                    <button class="button">&lt;</button>
+                </p>
+                <p class="control">
+                    <input type="button" class="button" value="08:00 - 08:30">
+                </p>
+                <p class="control">
+                    <button class="button">&gt;</button>
+                </p>
+            </div><br>
+            -->
+            <div id="subject-container" class="grid buttons"></div><br>
+            
+        </section>
+
+        <section id="section-2" class="section" style="display: none;">
+            <button class="button is-link is-light" onclick="switchSection('section-1')">Torna enrere (Classe)</button>
+
+            <div id="letter-container" class="buttons grid">
+                <button class="button" id="letter-A" data-letter="A">A</button>
+                <button class="button" id="letter-B" data-letter="B">B</button>
+                <button class="button" id="letter-C" data-letter="C">C</button>
+                <button class="button" id="letter-D" data-letter="D">D</button>
+                <button class="button" id="letter-E" data-letter="E">E</button>
+                <button class="button" id="letter-F" data-letter="F">F</button>
+                <button class="button" id="letter-G" data-letter="G">G</button>
+                <button class="button" id="letter-H" data-letter="H">H</button>
+                <button class="button" id="letter-I" data-letter="I">I</button>
+                <button class="button" id="letter-J" data-letter="J">J</button>
+                <button class="button" id="letter-K" data-letter="K">K</button>
+                <button class="button" id="letter-L" data-letter="L">L</button>
+            </div>
+        </section>
+
+        <section id="section-3" class="section" style="display: none;">
+            <button class="button is-link is-light" onclick="switchSection('section-2')">Torna enrere (Lletra)</button>
+            
+            <div id="number-container" class="buttons grid">
+                <button class="button" id="number-1" data-number="1">1</button>
+                <button class="button" id="number-2" data-number="2">2</button>
+                <button class="button" id="number-3" data-number="3">3</button>
+                <button class="button" id="number-4" data-number="4">4</button>
+                <button class="button" id="number-5" data-number="5">5</button>
+                <button class="button" id="number-6" data-number="6">6</button>
+                <button class="button" id="number-7" data-number="7">7</button>
+                <button class="button" id="number-8" data-number="8">8</button>
+                <button class="button" id="number-9" data-number="9">9</button>
+                <button class="button" id="number-10" data-number="10">10</button>
+            </div>
+        </section>
+        <section id="section-send" class="section" style="display: none;">
+            <button class="button is-link is-light" onclick="switchSection('section-3')">Torna enrere (Número)</button>
+            <br/><br/>
+            <span class="has-text-weight-bold">Assignatura:</span>
+            <span id="subject-final">ASSIGNATURA ESCOLLIDA</span><br>
+            <span class="has-text-weight-bold">Aula:</span>
+            <span id="classroom-final">AULA ESCOLLIDA</span><br>
+            <span class="has-text-weight-bold">Data:</span>
+            <span id="date-final">DD/MM/YYYY</span><br>
+            <span class="has-text-weight-bold">Hora:</span>
+            <span id="time-final">HH:MM - HH:MM</span><br>
+            <span class="has-text-weight-bold">Posició:</span>
+            <span id="letter-final">A</span><span id="number-final">1</span><br><br>
+
+            <button id="send-button" class="button is-link is-large">Omple el formulari</button><br><br>
+            
+            Hi ha errors? <br /><a class="button is-link is-light" href="https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform">Completa el formulari manualment</a>
+        </section>
+        
+        <script>
+            var current_section = "section-1";
+
+            function toggleVisibility(id) {
+                var x = document.getElementById(id);
+                if (x.style.display === "none") {
+                    x.style.display = "block";
+                } else {
+                    x.style.display = "none";
+                }
+            }
+
+            function switchSection(s) {
+                setTimeout(function(){ 
+                    toggleVisibility(current_section);
+                    toggleVisibility(s);
+                    current_section = s;
+                }, 75);
+            }
+
+            const idsFormulari = {
+              room: "1063142948",
+              day: "2115504093",
+              begins: "1749141911",
+              ends: "1827359679",
+              rows: {
+                A: "208184485",
+                B: "1077148310",
+                C: "642851281",
+                D: "1686039024",
+                E: "697835787",
+                F: "1511799646",
+                G: "809853432",
+                H: "182597499",
+                I: "1890539481",
+                J: "529159478",
+                K: "1615241874",
+                L: "1334263875"
+              },
+              notes: "1600275159"
+            };
+            const formBaseUrl = "https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform";
+
+            function sendForm() {
+                // Add subject to user
+                fetch(api_url + "addUserSubject", {
+                  "method": "POST",
+                  "body": JSON.stringify({
+                            subject: final_JSON.class.subject_id
+                          }),
+                  "mode": "cors",
+                  "credentials": "include"
+                })
+                .then(res => res.json())
+                .then(json => {
+                  console.log("Subject added to user: ", json);
+
+                  var begins = new Date(parseInt(final_JSON.class.begins)*1000);
+                  var ends = new Date(parseInt(final_JSON.class.ends)*1000);
+
+                  var params = new URLSearchParams();
+                  params.append("entry." + idsFormulari.room, final_JSON.class.room); // class, number, letter
+                  params.append("entry." + idsFormulari.day, begins.getFullYear().toString() + '-' + (begins.getMonth() + 1).toString().padStart(2, "0") + '-' + begins.getDate().toString().padStart(2, "0"));
+                  params.append("entry." + idsFormulari.begins, formatDate(begins));
+                  params.append("entry." + idsFormulari.ends, formatDate(ends));
+                  params.append("entry." + idsFormulari.rows[final_JSON.letter], 'Columna ' + final_JSON.number);
+                  params.append("entry." + idsFormulari.notes, '[Autogenerat per delefme/covid-tracability -- Assignatura seleccionada: ' + final_JSON.class.friendly_name + ']');
+
+                  var formulari_link = formBaseUrl + '?' + params.toString();
+                  window.location.href = formulari_link;
+                });
+             }
+             
+             document.getElementById("send-button").addEventListener('click', function (el) {              
+                document.getElementById('send-button').classList.add('is-loading');
+
+                sendForm();
+             });
+        </script>
+    </body>
+</html>
diff --git a/main.html b/main.html
deleted file mode 100644
index 0d4b680..0000000
--- a/main.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<html>
-    <head>
-    </head>
-    <body>
-        <h1>App de traçabilitat DAFME</h1>
-        <h2>Estructures Algebràiques</h2>
-        <h3>Aula S03</h3>
-        <a href="#">No és així? Canvia-ho.</a>
-        
-        <h2 id="hora">
-            <span id="inici"></span> -
-            <span id="fi"></span>
-        </h2>
-        <h3 id="data"></h3>
-        <a href="#">No és així? Canvia-ho.</a>
-        
-        <script>
-            var hora_actual = new Date();
-            var minuts;
-            
-            // Hora d'inici
-            hora_actual.setMinutes(0, 0, 0); // Arrodonir per baix els minuts
-            minuts = hora_actual.getMinutes() < 10 ? hora_actual.getMinutes().toString() + '0' : hora_actual.getMinutes().toString();
-            document.getElementById("inici").innerHTML = hora_actual.getHours().toString() + ":" + minuts;
-            
-            // Hora de fi
-            hora_actual.setHours(hora_actual.getHours() + 1); // Sumar una hora
-            minuts = hora_actual.getMinutes() < 10 ? hora_actual.getMinutes().toString() + '0' : hora_actual.getMinutes().toString();
-            document.getElementById("fi").innerHTML = hora_actual.getHours().toString() + ":" + minuts;
-            
-            // Data
-            var dia = hora_actual.getDate();
-            var mes = hora_actual.getMonth() + 1;
-            var any = hora_actual.getFullYear();
-            var data = dia.toString() + '/' + mes.toString() + '/' + any.toString();
-            document.getElementById("data").innerHTML = data;
-        </script>
-    </body>
-</html>
diff --git a/table-parser.js b/table-parser.js
deleted file mode 100644
index 2a4460c..0000000
--- a/table-parser.js
+++ /dev/null
@@ -1,30 +0,0 @@
-let hores = [], newhour;
-for (let h = 8; h < 22; ++h) {
-    newhour = "";
-    if (h < 10) newhour += "0";
-    newhour += h.toString();
-    
-    hores.push(newhour + ":00");
-    hores.push(newhour + ":30");
-}
-
-hores.forEach(hora => {
-    let column = 1;
-    let td = $("td:contains(" + hora + ")").next();
-
-    while (td.text().indexOf(hora) == -1) {
-        
-        if (td.text().indexOf("CDATA") == -1) {
-            let aula = $("#day_main th")[column].textContent.trim();
-            let durada = parseInt(td.attr("rowspan"))*30;
-            
-            console.log(td.text()
-                + ", " + hora
-                + ", " + durada + "mins"
-                + ", " + aula);
-        }
-        
-        td = td.next();
-        ++column;
-    }
-});
