diff --git a/README.md b/README.md
index ce79db4986d52f57d61de1b262781f4c524437d4..25c42f380b78d999cd71d3e66e962d41c57cdb15 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@ cd cqi-qec2025
 
 # Installer les dépendances du frontend
 cd client
-npm install
+bun install
 
 # Installer les dépendances du backend
 cd ../server
diff --git a/client/src/binding/Participant.ts b/client/src/binding/Participant.ts
index 6016700c85cf3e93bc2175d6d78d21a32892c8c7..cf21abe4dc7e422eb8dd867adcf3b2b2414c587a 100644
--- a/client/src/binding/Participant.ts
+++ b/client/src/binding/Participant.ts
@@ -8,7 +8,7 @@ export type Participant = {
   email: string;
   first_name: string;
   last_name: string;
-  university_name: string | null;
+  university: string | null;
   medical_conditions: string | null;
   allergies: string | null;
   pronouns: string | null;
diff --git a/client/src/components/NewPasswordForm.tsx b/client/src/components/NewPasswordForm.tsx
deleted file mode 100644
index cf120d29b3571287ecb7b19b2e06872ec4e9363d..0000000000000000000000000000000000000000
--- a/client/src/components/NewPasswordForm.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { createForm } from "@modular-forms/solid"
-import { ChangePasswordPayload } from "../binding/ChangePasswordPayload"
-import { changePassword } from "../request/routes"
-import { TextInput } from "./forms/TextInput"
-
-export function NewPassword() {
-    const [_form, { Form, Field }] = createForm<ChangePasswordPayload>()
-
-    const onSubmit = async (data: ChangePasswordPayload) => {
-        await changePassword(data)
-    }
-    return (
-        <Form onSubmit={onSubmit} class="w-full">
-            <Field name="new_password">
-                {(field, props) => (
-                    <TextInput
-                        {...props}
-                        value={field.value}
-                        error={field.error}
-                        class="w-52"
-                        type="password"
-                        label="Nouveau mot de passe"
-                        placeholder="Nouveau mot de passe"
-                        required
-                    />
-                )}
-            </Field>
-        </Form>
-    )
-}
diff --git a/client/src/components/forms/Checkbox.tsx b/client/src/components/forms-component/Checkbox.tsx
similarity index 100%
rename from client/src/components/forms/Checkbox.tsx
rename to client/src/components/forms-component/Checkbox.tsx
diff --git a/client/src/components/forms/Expandable.tsx b/client/src/components/forms-component/Expandable.tsx
similarity index 100%
rename from client/src/components/forms/Expandable.tsx
rename to client/src/components/forms-component/Expandable.tsx
diff --git a/client/src/components/forms/FileInput.tsx b/client/src/components/forms-component/FileInput.tsx
similarity index 100%
rename from client/src/components/forms/FileInput.tsx
rename to client/src/components/forms-component/FileInput.tsx
diff --git a/client/src/components/forms/InputError.tsx b/client/src/components/forms-component/InputError.tsx
similarity index 100%
rename from client/src/components/forms/InputError.tsx
rename to client/src/components/forms-component/InputError.tsx
diff --git a/client/src/components/forms/InputLabel.tsx b/client/src/components/forms-component/InputLabel.tsx
similarity index 100%
rename from client/src/components/forms/InputLabel.tsx
rename to client/src/components/forms-component/InputLabel.tsx
diff --git a/client/src/components/forms/Select.tsx b/client/src/components/forms-component/Select.tsx
similarity index 100%
rename from client/src/components/forms/Select.tsx
rename to client/src/components/forms-component/Select.tsx
diff --git a/client/src/components/forms-component/SubmitError.tsx b/client/src/components/forms-component/SubmitError.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..3633386e8f5729495612c7f83cac8bdf13eed666
--- /dev/null
+++ b/client/src/components/forms-component/SubmitError.tsx
@@ -0,0 +1,15 @@
+import { Expandable } from "./Expandable"
+
+type Props = {
+    error: () => string | null
+}
+
+export function SubmitError(props: Props) {
+    return (
+        <Expandable expanded={!!props.error()}>
+            <div class="pt-4 text-sm text-red-500 dark:text-red-400 md:text-base lg:pt-5 lg:text-lg">
+                {props.error()}
+            </div>
+        </Expandable>
+    )
+}
diff --git a/client/src/components/forms/TextInput.tsx b/client/src/components/forms-component/TextInput.tsx
similarity index 100%
rename from client/src/components/forms/TextInput.tsx
rename to client/src/components/forms-component/TextInput.tsx
diff --git a/client/src/components/forms/AdditionnalInfoForm.tsx b/client/src/components/forms/AdditionnalInfoForm.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/client/src/components/LoginForm.tsx b/client/src/components/forms/LoginForm.tsx
similarity index 66%
rename from client/src/components/LoginForm.tsx
rename to client/src/components/forms/LoginForm.tsx
index ba50a2857d5c7ed4d4536c8f47a5b04303f19f9a..8e6198f0a8d3b2adf82dfdaabd1389cadde8099b 100644
--- a/client/src/components/LoginForm.tsx
+++ b/client/src/components/forms/LoginForm.tsx
@@ -1,37 +1,52 @@
 import {
     createForm,
+    email,
     minLength,
     required,
     SubmitHandler,
 } from "@modular-forms/solid"
 import { useNavigate } from "@solidjs/router"
-import { TextInput } from "../components/forms/TextInput"
-import { AuthPayload } from "../binding/AuthPayload"
-import { login } from "../request/routes"
+import { AuthPayload } from "../../binding/AuthPayload"
+import { login } from "../../request/routes"
+import { TextInput } from "../forms-component/TextInput"
+import { SubmitError } from "../forms-component/SubmitError"
+import { createSignal } from "solid-js"
+import { t } from "../../stores/locale"
 
 export default function LoginForm() {
     const [_loginForm, { Form, Field }] = createForm<AuthPayload>()
     const navigate = useNavigate()
 
+    const [error, setError] = createSignal<string | null>(null)
+
     const handleSubmit: SubmitHandler<AuthPayload> = async (values, event) => {
         event.preventDefault()
         const response = await login(values)
         if (!response.error) {
+            setError(null)
             localStorage.setItem("token", response.access_token)
             navigate("/dashboard")
+        } else {
+            setError(t("loginPage.badLogin"))
         }
     }
 
     return (
         <div class="mt-10 sm:mx-auto sm:w-full sm:max-w-sm">
             <Form class="space-y-6" onSubmit={handleSubmit}>
-                <Field name="email">
+                <Field
+                    name="email"
+                    validate={[
+                        required(t("loginPage.requiredEmail")),
+                        email(t("loginPage.invalidEmail")),
+                    ]}
+                >
                     {(field, props) => (
                         <TextInput
                             {...props}
                             value={field.value}
                             error={field.error}
-                            label="Email"
+                            label={t("loginPage.email")}
                             type="email"
                             placeholder="exemple@courriel.com"
                             required
@@ -42,7 +57,7 @@ export default function LoginForm() {
                 <Field
                     name="password"
                     validate={[
-                        required("Please enter your password."),
+                        required(t("loginPage.requiredPassword")),
                         minLength(
                             8,
                             "You password must have 8 characters or more.",
@@ -55,7 +70,7 @@ export default function LoginForm() {
                             value={field.value}
                             error={field.error}
                             type="password"
-                            label="Password"
+                            label={t("loginPage.password")}
                             placeholder="********"
                             required
                         />
@@ -65,10 +80,11 @@ export default function LoginForm() {
                 <div>
                     <button
                         type="submit"
-                        class="flex w-full justify-center rounded-md bg-light-highlight py-3 text-sm font-semibold text-white shadow-sm"
+                        class="flex w-full justify-center rounded-md bg-light-highlight py-3 font-semibold text-white shadow-sm"
                     >
-                        Sign in
+                        {t("loginPage.signIn")}
                     </button>
+                    <SubmitError error={error} />
                 </div>
             </Form>
         </div>
diff --git a/client/src/components/forms/NewPasswordForm.tsx b/client/src/components/forms/NewPasswordForm.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..e38a66cbf5dfd6f24a8a16cde9487412ed5ca9e8
--- /dev/null
+++ b/client/src/components/forms/NewPasswordForm.tsx
@@ -0,0 +1,42 @@
+import { createForm } from "@modular-forms/solid"
+import { ChangePasswordPayload } from "../../binding/ChangePasswordPayload"
+import { changePassword } from "../../request/routes"
+import { TextInput } from "../forms-component/TextInput"
+import { SubmitError } from "../forms-component/SubmitError"
+import { createSignal } from "solid-js"
+
+export function NewPassword() {
+    const [_form, { Form, Field }] = createForm<ChangePasswordPayload>()
+    const [error, setError] = createSignal<string | null>(null)
+
+    const onSubmit = async (data: ChangePasswordPayload) => {
+        await changePassword(data)
+    }
+    return (
+        <Form onSubmit={onSubmit} class="flex flex-col gap-8">
+            <Field name="new_password">
+                {(field, props) => (
+                    <TextInput
+                        {...props}
+                        value={field.value}
+                        error={field.error}
+                        class="w-96"
+                        type="password"
+                        label="Nouveau mot de passe"
+                        placeholder="Nouveau mot de passe"
+                        required
+                    />
+                )}
+            </Field>
+            <div>
+                <button
+                    type="submit"
+                    class="flex w-full justify-center rounded-md bg-light-highlight py-3 font-semibold text-white shadow-sm"
+                >
+                    Changer le mot de passe
+                </button>
+                <SubmitError error={error} />
+            </div>
+        </Form>
+    )
+}
diff --git a/client/src/components/ParticipantForm.tsx b/client/src/components/forms/ParticipantForm.tsx
similarity index 96%
rename from client/src/components/ParticipantForm.tsx
rename to client/src/components/forms/ParticipantForm.tsx
index 855f631fd02499769377300a074114ce96c508f1..7baa521aa99235cf945a9028ae533d0a585bed7c 100644
--- a/client/src/components/ParticipantForm.tsx
+++ b/client/src/components/forms/ParticipantForm.tsx
@@ -1,15 +1,15 @@
 import { Info, PlusCircle, Trash } from "phosphor-solid-js"
-import { MinimalParticipant } from "../binding/MinimalParticipant"
+import { MinimalParticipant } from "../../binding/MinimalParticipant"
 import { createResource, For } from "solid-js"
 import { createForm } from "@modular-forms/solid"
-import { Select } from "./forms/Select"
-import { TextInput } from "./forms/TextInput"
-import { ParticipantPreview } from "../binding/ParticipantPreview"
+import { Select } from "../forms-component/Select"
+import { TextInput } from "../forms-component/TextInput"
+import { ParticipantPreview } from "../../binding/ParticipantPreview"
 import {
     deleteParticipant,
     fetchParticipants,
     submitMinimalParticipant,
-} from "../request/routes"
+} from "../../request/routes"
 
 interface ParticipantRowProps {
     participant: ParticipantPreview
@@ -57,7 +57,7 @@ async function fetchWrapper() {
 
 export default function ParticipantForm() {
     const [user, { refetch }] = createResource(fetchWrapper)
-    const [form, { Form, Field }] = createForm<MinimalParticipant>()
+    const [_form, { Form, Field }] = createForm<MinimalParticipant>()
     const onSubmit = async (data: MinimalParticipant) => {
         console.log("submitting")
         await submitMinimalParticipant(data)
diff --git a/client/src/i18n/en.ts b/client/src/i18n/en.ts
index f438c7ee92565045566a90d65491a64c60293ccb..56780541709b39b90cea1246355346cb88b91035 100644
--- a/client/src/i18n/en.ts
+++ b/client/src/i18n/en.ts
@@ -7,69 +7,96 @@ const homePage = {
     cqi: "Québec Engineering Competition",
     edition: "40th edition",
     location: "16 to 19 January 2025, Polytechnique Montréal",
-    description: "The 40th edition of the QEC will be held in 2025 at Polytechnique Montréal. This engineering competition brings together 13 campuses from 11 different universities across Quebec so that hundreds of engineering students in the province can compete. The Quebec Engineering Competition is overseen by the CRÉIQ and allows engineering students to demonstrate their talents in theoretical and practical tests.",
-};
+    description:
+        "The 40th edition of the QEC will be held in 2025 at Polytechnique Montréal. This engineering competition brings together 13 campuses from 11 different universities across Quebec so that hundreds of engineering students in the province can compete. The Quebec Engineering Competition is overseen by the CRÉIQ and allows engineering students to demonstrate their talents in theoretical and practical tests.",
+}
 
 const aboutPage = {
     about: "About",
-    description1: "The 40th edition of the QEC will be held from 16 to 19 January 2025 at Polytechnique Montréal. This engineering competition brings together 13 campuses from 11 different universities across Quebec so that hundreds of engineering students in the province can compete.",
-    description2: "The Quebec Engineering Competition (QEC) is overseen by the Quebec Student Engineering Confederation (CRÉIQ) and allows engineering students to demonstrate their talents through theoretical and practical tests.",
-    description3: "The competition is organized by a committee of undergraduate and graduate students who are committed to student involvement.",
+    description1:
+        "The 40th edition of the QEC will be held from 16 to 19 January 2025 at Polytechnique Montréal. This engineering competition brings together 13 campuses from 11 different universities across Quebec so that hundreds of engineering students in the province can compete.",
+    description2:
+        "The Quebec Engineering Competition (QEC) is overseen by the Quebec Student Engineering Confederation (CRÉIQ) and allows engineering students to demonstrate their talents through theoretical and practical tests.",
+    description3:
+        "The competition is organized by a committee of undergraduate and graduate students who are committed to student involvement.",
     delegations: {
         title: "Delegations",
-        description: "The Quebec Engineering Competition gathers 14 delegations of 11 different universities. Each delegation is overseed by its student association.",
+        description:
+            "The Quebec Engineering Competition gathers 14 delegations of 11 different universities. Each delegation is overseed by its student association.",
     },
     thematic: {
         title: "Thematic",
-        description: "Traveling through time is an interesting theme because it leaves room for a world of memories or a world of futuristic ideas, whether it be the invention of the wheel or flying cars, anything is possible when traveling through different eras. For each discovery, the engineering profession has taken a central place to allow the realization of innovative ideas that seemed, at a certain moment in history, unrealistic.",
-    }
-};
+        description:
+            "Traveling through time is an interesting theme because it leaves room for a world of memories or a world of futuristic ideas, whether it be the invention of the wheel or flying cars, anything is possible when traveling through different eras. For each discovery, the engineering profession has taken a central place to allow the realization of innovative ideas that seemed, at a certain moment in history, unrealistic.",
+    },
+}
 
 const competitionsPage = {
     competitions: "Competitions",
-    description: "The Quebec Engineering Competition gathers 9 competitions targeting different skills related to engineering.",
+    description:
+        "The Quebec Engineering Competition gathers 9 competitions targeting different skills related to engineering.",
     senior: {
         title: "Senior design",
-        description: "The senior design is the cornerstone of the Quebec Engineering Competition. Teams of four person registred in this category have twelve hours to produce a prototype that can respond to a problem that was presented the day of the competition. At the end of this marathon, these teams show the relevance of their solution by completing, in front of a public, the task asked with the help of their prototype. This competition is typicaly reserved to the students that have a minimum of 60 credits completed in their bachelor's degree.",
+        description:
+            "The senior design is the cornerstone of the Quebec Engineering Competition. Teams of four person registred in this category have twelve hours to produce a prototype that can respond to a problem that was presented the day of the competition. At the end of this marathon, these teams show the relevance of their solution by completing, in front of a public, the task asked with the help of their prototype. This competition is typicaly reserved to the students that have a minimum of 60 credits completed in their bachelor's degree.",
     },
     junior: {
         title: "Junior design",
-        description: "The junior design is, in a way, the little sister of the senior competition. The competition's concept remains the same one as the senior's design. The principal difference is the level of difficulty of the problem, which is lower than its counterpart. In general, the teams of four have eight hours to make a prototype. This competition is reserved to students with less than 60 credits completed in their bachelor's degree."
+        description:
+            "The junior design is, in a way, the little sister of the senior competition. The competition's concept remains the same one as the senior's design. The principal difference is the level of difficulty of the problem, which is lower than its counterpart. In general, the teams of four have eight hours to make a prototype. This competition is reserved to students with less than 60 credits completed in their bachelor's degree.",
     },
     debate: {
         title: "Debate competition",
-        description: "One engineer cannot soly rely on their talents of manager and designer; He or she also needs to improve their communication skills as a way of efficiently develop in a world where we rely more and more on multidisciplinarity. The competition of debate competitions is based on this concept in order to place future engineers in the midst of oral clashes which will force them to show tact, eloquence and opinions. Here, the participants confront two by two by developing arguments on the go based on a position and a theme that are imposed to them.",
+        description:
+            "One engineer cannot soly rely on their talents of manager and designer; He or she also needs to improve their communication skills as a way of efficiently develop in a world where we rely more and more on multidisciplinarity. The competition of debate competitions is based on this concept in order to place future engineers in the midst of oral clashes which will force them to show tact, eloquence and opinions. Here, the participants confront two by two by developing arguments on the go based on a position and a theme that are imposed to them.",
     },
     reengineering: {
         title: "Re-Engineering",
-        description: "Re-Engineering technology is constantly refined over time and that, to a point where there is a need to take a step back to better grasp the other step of the evolutive chain of a product. More and more, engineers are called to better and optimised products that surround us and that seems mundane. The re-engineering competition aims to test the capacity of the participants, paired in teams of two, to enhance existant products in order to respond to new constraints. The teams present their solution in front of a jury, allowing them to not only demonstrate their imagination and their technical knowledge, but also their communication talent.",
+        description:
+            "Re-Engineering technology is constantly refined over time and that, to a point where there is a need to take a step back to better grasp the other step of the evolutive chain of a product. More and more, engineers are called to better and optimised products that surround us and that seems mundane. The re-engineering competition aims to test the capacity of the participants, paired in teams of two, to enhance existant products in order to respond to new constraints. The teams present their solution in front of a jury, allowing them to not only demonstrate their imagination and their technical knowledge, but also their communication talent.",
     },
     consulting: {
         title: "Consulting engineering",
-        description: "Consultation is one of the most popular discipline of engineering, the Quebec Engineering Competition makes a point to present, each year, the competition of consulting engineering. During this competition, the participants, paired in teams of four, have approximately six hours to propose a complete solution to a complex problem. Their solution then needs to be presented in front of a jury, thus leveraging their communication and persuasion talents.",
+        description:
+            "Consultation is one of the most popular discipline of engineering, the Quebec Engineering Competition makes a point to present, each year, the competition of consulting engineering. During this competition, the participants, paired in teams of four, have approximately six hours to propose a complete solution to a complex problem. Their solution then needs to be presented in front of a jury, thus leveraging their communication and persuasion talents.",
     },
     scientific: {
         title: "Scientific communication",
-        description: "Often complex, the exercice of the functions of an engineer forces them to appeal to abstract and intagible concepts. It is crucial for the engineer to know how to popularize his or hers art clearly and precisly to be able to communicate his or hers knowledge. The scientific communication competition allows the participants, alone or by teams of two, to showcase their control of this art by explaining, clearly, a complex engineering subject. The presentations are evaluated in front of a jury.",
+        description:
+            "Often complex, the exercice of the functions of an engineer forces them to appeal to abstract and intagible concepts. It is crucial for the engineer to know how to popularize his or hers art clearly and precisly to be able to communicate his or hers knowledge. The scientific communication competition allows the participants, alone or by teams of two, to showcase their control of this art by explaining, clearly, a complex engineering subject. The presentations are evaluated in front of a jury.",
     },
     programming: {
         title: "Programming",
-        description: "The programming competition tests various important skills in computer and software engineering such as software architecture, algorithmic thinking, and the ability to solve complex problems. The objective of this competition is to design a functional program that addresses a real-world case and present it to a jury.",
+        description:
+            "The programming competition tests various important skills in computer and software engineering such as software architecture, algorithmic thinking, and the ability to solve complex problems. The objective of this competition is to design a functional program that addresses a real-world case and present it to a jury.",
     },
     design: {
         title: "Innovative design",
-        description: "The Innovative Design Competition allows teams of up to six members to showcase their creativity and entrepreneurial spirit by designing a product, service, or marketable process that is not currently available. These products are presented to the public through stands set up by the participants, and the different concepts are evaluated by members of the jury."
+        description:
+            "The Innovative Design Competition allows teams of up to six members to showcase their creativity and entrepreneurial spirit by designing a product, service, or marketable process that is not currently available. These products are presented to the public through stands set up by the participants, and the different concepts are evaluated by members of the jury.",
     },
     superiorcycle: {
         title: "Research project in the superior cycle",
-        description: "In this competition, participants present their research projects for graduate studies at the master's or doctoral level. This competition takes the form of a scientific conference and consists of three parts: the writing of a short summary article, a public presentation, and an evaluation by peers (judges) in a closed-door meeting.",
-    }
-};
+        description:
+            "In this competition, participants present their research projects for graduate studies at the master's or doctoral level. This competition takes the form of a scientific conference and consists of three parts: the writing of a short summary article, a public presentation, and an evaluation by peers (judges) in a closed-door meeting.",
+    },
+}
 
 const documents = {
     documents: "Documents",
-    description: "The documents section is currently under construction. Please come back later.",
-};
+    description:
+        "The documents section is currently under construction. Please come back later.",
+}
+
+const loginPage = {
+    requiredEmail: "Please enter your email",
+    requiredPassword: "Please enter your password",
+    badLogin: "Wrong credentials",
+    invalidEmail: "Invalid email",
+    email: "Email",
+    password: "Password",
+    signIn: "Sign in",
+}
 
 export const dict = {
     cqi: "QEC",
@@ -81,5 +108,6 @@ export const dict = {
     partners: "Partners",
     documents: documents,
     login: "Login",
+    loginPage: loginPage,
     madeBy: "Made by",
-};
+}
diff --git a/client/src/i18n/fr.ts b/client/src/i18n/fr.ts
index 249815cef3b5db6e6d6a5484affe390f16bb9cc8..dff81fcfb3bbabdfa1071fa58f64d0a9a03e14ee 100644
--- a/client/src/i18n/fr.ts
+++ b/client/src/i18n/fr.ts
@@ -7,68 +7,95 @@ const homePage = {
     cqi: "Compétition Québécoise d'Ingénierie",
     edition: "40e édition",
     location: "16 au 19 janvier 2025, Polytechnique Montréal",
-    description: "La CQI est une compétition réunissant 11 universités de la province et des centaines de membres de la communauté étudiante en génie qui excellent et se démarquent dans le domaine. La CQI vise à faire rayonner le savoir-faire et le savoir-être des futur(e)s ingénieur(e)s par le biais d'épreuves techniques multidisciplinaires.",
-};
+    description:
+        "La CQI est une compétition réunissant 11 universités de la province et des centaines de membres de la communauté étudiante en génie qui excellent et se démarquent dans le domaine. La CQI vise à faire rayonner le savoir-faire et le savoir-être des futur(e)s ingénieur(e)s par le biais d'épreuves techniques multidisciplinaires.",
+}
 
 const aboutPage = {
     about: "À propos",
-    description1: "La 40e édition de la CQI se tiendra du 16 au 19 janvier 2025 à Polytechnique Montréal. Cette compétition d’ingénierie réunit 13 campus de 11 universités différentes partout au Québec pour que des centaines d’étudiants en génie de la province s’affronte.",
-    description2: "La Compétition Québécoise d’Ingénierie (CQI) est chapeautée par la Confédération pour le Rayonnement Étudiant en Ingénierie du Québec (CRÉIQ) et permet aux étudiants en génie de démontrer leurs talents par le biais d’épreuves théoriques et pratiques.",
-    description3: "La compétition est mise sur pied par un comité organisateur regroupant des étudiantes au 1er cycle ainsi qu’au 2e cycle qui ont à coeur l’implication étudiante.",
+    description1:
+        "La 40e édition de la CQI se tiendra du 16 au 19 janvier 2025 à Polytechnique Montréal. Cette compétition d’ingénierie réunit 13 campus de 11 universités différentes partout au Québec pour que des centaines d’étudiants en génie de la province s’affronte.",
+    description2:
+        "La Compétition Québécoise d’Ingénierie (CQI) est chapeautée par la Confédération pour le Rayonnement Étudiant en Ingénierie du Québec (CRÉIQ) et permet aux étudiants en génie de démontrer leurs talents par le biais d’épreuves théoriques et pratiques.",
+    description3:
+        "La compétition est mise sur pied par un comité organisateur regroupant des étudiantes au 1er cycle ainsi qu’au 2e cycle qui ont à coeur l’implication étudiante.",
     delegations: {
         title: "Les délégations",
-        description: "La Compétition Québécoise d’Ingénierie regroupe 14 délégations de 11 Universités différentes. Chaque délégation est chapeautée par son association étudiante.",
+        description:
+            "La Compétition Québécoise d’Ingénierie regroupe 14 délégations de 11 Universités différentes. Chaque délégation est chapeautée par son association étudiante.",
     },
     thematic: {
         title: "Thématique",
-        description: "Voyage dans le temps est une thématique intéressante puisqu’il laisse place à un monde de souvenirs ou bien un monde d’idées futuristes, que ce soit l’invention de la roue ou bien les voitures volantes, tout est possible lorsqu’on voyage dans les différentes époques. Pour chaque découverte, la profession d’ingénieur a pris une place centrale pour permettre la réalisation d’idées novatrices qui semblaient, à un certain moment dans l’histoire, irréalistes.",
-    }
-};
+        description:
+            "Voyage dans le temps est une thématique intéressante puisqu’il laisse place à un monde de souvenirs ou bien un monde d’idées futuristes, que ce soit l’invention de la roue ou bien les voitures volantes, tout est possible lorsqu’on voyage dans les différentes époques. Pour chaque découverte, la profession d’ingénieur a pris une place centrale pour permettre la réalisation d’idées novatrices qui semblaient, à un certain moment dans l’histoire, irréalistes.",
+    },
+}
 
 const competitionsPage = {
     competitions: "Compétitions",
-    description: "La Compétition Québécoise d’Ingénierie regroupe 9 compétitions visant différentes compétences reliées au génie.",
+    description:
+        "La Compétition Québécoise d’Ingénierie regroupe 9 compétitions visant différentes compétences reliées au génie.",
     senior: {
         title: "Conception senior",
-        description: "La conception senior consiste à fabriquer une solution robotique, qui devra répondre à la problématique imposée le jour de la compétition. Chaque équipe présentera l’ingéniosité de leur solution en complétant, devant un public et le jury, la tâche demandée.",
+        description:
+            "La conception senior consiste à fabriquer une solution robotique, qui devra répondre à la problématique imposée le jour de la compétition. Chaque équipe présentera l’ingéniosité de leur solution en complétant, devant un public et le jury, la tâche demandée.",
     },
     junior: {
         title: "Conception junior",
-        description: "La conception junior similaire à la conception senior, consiste à fabriquer une solution mécanique, qui devra répondre à la problématique imposée le jour de la compétition. Cette épreuve est réservée aux participants ayant complété moins de 60 crédits accumulés dans leur baccalauréat.",
+        description:
+            "La conception junior similaire à la conception senior, consiste à fabriquer une solution mécanique, qui devra répondre à la problématique imposée le jour de la compétition. Cette épreuve est réservée aux participants ayant complété moins de 60 crédits accumulés dans leur baccalauréat.",
     },
     debate: {
         title: "Débats oratoires",
-        description: "La compétition de débat oratoire permet de faire ressortir les talents en argumentation et en persuasion de la communauté étudiante en ingénierie. Grâce à leur éloquence et leur pensée critique, les participantes et participants doivent défendre une position dans un thème qui leur est imposée.",
+        description:
+            "La compétition de débat oratoire permet de faire ressortir les talents en argumentation et en persuasion de la communauté étudiante en ingénierie. Grâce à leur éloquence et leur pensée critique, les participantes et participants doivent défendre une position dans un thème qui leur est imposée.",
     },
     reengineering: {
         title: "Reingénierie",
-        description: "La compétition de réingénierie vise à tester les capacités des équipes à améliorer et à optimiser de produits existants placés dans de nouvelles contraintes. Les solutions sont présentées devant un jury permettant de faire valoir leurs compétences techniques, créativité et talents oratoires.",
+        description:
+            "La compétition de réingénierie vise à tester les capacités des équipes à améliorer et à optimiser de produits existants placés dans de nouvelles contraintes. Les solutions sont présentées devant un jury permettant de faire valoir leurs compétences techniques, créativité et talents oratoires.",
     },
     consulting: {
         title: "Génie-conseil",
-        description: "La consultation est une des disciplines les plus populaires du génie dans le monde. Chaque équipe doit proposer une solution complète ainsi que réaliste à un problème complexe et devra présenter cette solution devant un jury mettant à profit leur talent de communication.",
+        description:
+            "La consultation est une des disciplines les plus populaires du génie dans le monde. Chaque équipe doit proposer une solution complète ainsi que réaliste à un problème complexe et devra présenter cette solution devant un jury mettant à profit leur talent de communication.",
     },
     scientific: {
         title: "Communication scientifique",
-        description: "La compétition de communication scientifique permet aux équipes de démontrer leur capacité de vulgarisation en expliquant de la façon la plus claire possible un concept complexe relevant de l’ingénierie devant un jury.",
+        description:
+            "La compétition de communication scientifique permet aux équipes de démontrer leur capacité de vulgarisation en expliquant de la façon la plus claire possible un concept complexe relevant de l’ingénierie devant un jury.",
     },
     programming: {
         title: "Programmation",
-        description: "La compétition de programmation met à l’épreuve les équipes avec un défi regroupant plusieurs compétences du génie informatique et logiciel comme:  l’algorithmique, la résolution de problème, l’architecture logicielle, etc... La solution est évaluée sur son fonctionnement et son originalité.",
+        description:
+            "La compétition de programmation met à l’épreuve les équipes avec un défi regroupant plusieurs compétences du génie informatique et logiciel comme:  l’algorithmique, la résolution de problème, l’architecture logicielle, etc... La solution est évaluée sur son fonctionnement et son originalité.",
     },
     design: {
         title: "Conception innovatrice",
-        description: "La compétition de conception innovatrice permet aux équipes de faire valoir leur esprit entrepreneurial en concevant un produit, service ou procédé innovant. Les différents produits sont présentés à tous grâce à des kiosques. La créativité et l’innovation de la solution sont évalués par les membres du jury.",
+        description:
+            "La compétition de conception innovatrice permet aux équipes de faire valoir leur esprit entrepreneurial en concevant un produit, service ou procédé innovant. Les différents produits sont présentés à tous grâce à des kiosques. La créativité et l’innovation de la solution sont évalués par les membres du jury.",
     },
     superiorcycle: {
         title: "Projet de recherche au cycle supérieur",
-        description: "Cette compétition permet aux participants.es de présenter leur projet de recherche d’études aux cycles supérieurs. Elle se déroule sous trois volets : la rédaction d’un court article résumé, une présentation devant un public et une évaluation par les juges dans une rencontre à huis clos.",
-    }
-};
+        description:
+            "Cette compétition permet aux participants.es de présenter leur projet de recherche d’études aux cycles supérieurs. Elle se déroule sous trois volets : la rédaction d’un court article résumé, une présentation devant un public et une évaluation par les juges dans une rencontre à huis clos.",
+    },
+}
 
 const documents = {
-    documents : "Documents",
-    description: "Vous trouverez ici les documents importants pour la compétition.",
+    documents: "Documents",
+    description:
+        "Vous trouverez ici les documents importants pour la compétition.",
+}
+
+const loginPage = {
+    requiredEmail: "Entrez votre courriel",
+    requiredPassword: "Entrez votre mot de passe",
+    badLogin: "Mauvais identifiants",
+    invalidEmail: "Courriel invalide",
+    email: "Courriel",
+    password: "Mot de passe",
+    signIn: "Se connecter",
 }
 
 export const dict = {
@@ -82,4 +109,5 @@ export const dict = {
     documents: documents,
     login: "Connexion",
     madeBy: "Créé par",
-};
\ No newline at end of file
+    loginPage: loginPage,
+}
diff --git a/client/src/request/routes.ts b/client/src/request/routes.ts
index 9dc82b6ac35e00dacdad2a08a8e41c0fe58268aa..581276fb45afea74b85227882109c75b07992097 100644
--- a/client/src/request/routes.ts
+++ b/client/src/request/routes.ts
@@ -22,11 +22,11 @@ export async function fetchParticipants() {
 export async function submitMinimalParticipant(
     participant: MinimalParticipant,
 ) {
-    return fetch_post("/participant", participant)
+    return await fetch_post("/participant", participant)
 }
 
 export async function deleteParticipant(p: ParticipantPreview) {
-    return fetch_delete("/participant/" + p.id)
+    return await fetch_delete("/participant/" + p.id)
 }
 
 export async function login(auth: AuthPayload) {
@@ -35,7 +35,7 @@ export async function login(auth: AuthPayload) {
 }
 
 export async function changePassword(auth: ChangePasswordPayload) {
-    const request = await fetch_put("/change_password", auth)
+    const request = await fetch_put("/password", auth)
     if (!request) {
         return { error: "No token" }
     }
@@ -43,9 +43,9 @@ export async function changePassword(auth: ChangePasswordPayload) {
 }
 
 export async function testAuth() {
-    if (!localStorage.getItem("token")) {
+    const request = await fetch_get("/test")
+    if (!request) {
         return { error: "No token" }
     }
-    const request = await fetch_get("/test")
     return await request.json()
 }
diff --git a/client/src/routes/AdditionalForm.tsx b/client/src/routes/AdditionalForm.tsx
index b3fc323e3fd8ce56e9906243c6920824643caced..16c04e3e0a80a063c509da0fc2978dc7c48a4eac 100644
--- a/client/src/routes/AdditionalForm.tsx
+++ b/client/src/routes/AdditionalForm.tsx
@@ -1,8 +1,8 @@
 import { createForm, SubmitHandler } from "@modular-forms/solid"
-import { Participant } from "../model/participant"
 import FixedImage from "../components/FixedImage"
 import { useNavigate } from "@solidjs/router"
 import { ProtectedRoute } from "../components/ProtectedRoute"
+import { Participant } from "../binding/Participant"
 
 export default function AdditionalForm() {
     const navigate = useNavigate()
diff --git a/client/src/routes/ChangePassword.tsx b/client/src/routes/ChangePassword.tsx
index 033cb09e24cec78dddb83e7e54b98b21f3df2926..1c341afdd7b42fc6ba3991cf86b20b774cd0814a 100644
--- a/client/src/routes/ChangePassword.tsx
+++ b/client/src/routes/ChangePassword.tsx
@@ -2,7 +2,7 @@ import { useNavigate, useParams } from "@solidjs/router"
 import { createEffect } from "solid-js"
 import { testAuth } from "../request/routes"
 import FixedImage from "../components/FixedImage"
-import { NewPassword } from "../components/NewPasswordForm"
+import { NewPassword } from "../components/forms/NewPasswordForm"
 
 export default function ChangePassword() {
     const params = useParams()
diff --git a/client/src/routes/Dashboard.tsx b/client/src/routes/Dashboard.tsx
index 17a56f440dea5767b2edecd86130e00cea699d56..0816014efd080148712d7338d6d8af461311ee6d 100644
--- a/client/src/routes/Dashboard.tsx
+++ b/client/src/routes/Dashboard.tsx
@@ -1,26 +1,36 @@
+import { useNavigate } from "@solidjs/router"
 import FixedImage from "../components/FixedImage"
 import PrefetchLink from "../components/PrefetchLink"
 import { ProtectedRoute } from "../components/ProtectedRoute"
 
 interface Props {
     text: string
+    onClick?: () => void
 }
 
 function BigButton(props: Props) {
     return (
-        <button class="rounded bg-blue-500 px-6 py-3 text-2xl font-bold text-white hover:bg-blue-700">
+        <button
+            class="rounded bg-blue-500 px-6 py-3 text-2xl font-bold text-white hover:bg-blue-700"
+            onClick={props.onClick}
+        >
             {props.text}
         </button>
     )
 }
 
 export default function Dashboard() {
+    const navigate = useNavigate()
+    const logout = () => {
+        localStorage.removeItem("token")
+        navigate("/login")
+    }
     return (
         <ProtectedRoute>
             <div class="flex w-full flex-col items-center justify-center">
                 <FixedImage url="/banners/documents.svg" height="32rem">
                     <h1 class="text-center font-futur text-6xl text-white">
-                        {"Tableau de bord des chefs"}
+                        {"Tableau de bord"}
                     </h1>
                 </FixedImage>
                 <div class="-mt-32 flex h-full w-full flex-row items-center justify-center gap-4 p-4 font-futur text-xl font-bold">
@@ -30,6 +40,10 @@ export default function Dashboard() {
                     <PrefetchLink to="/list-participant" file="ListParticipant">
                         <BigButton text="Liste des participants" />
                     </PrefetchLink>
+                    <PrefetchLink to="/change-password" file="ChangePassword">
+                        <BigButton text="Changer le mot de passe" />
+                    </PrefetchLink>
+                    <BigButton text="Se déconnecter" onClick={logout} />
                 </div>
             </div>
         </ProtectedRoute>
diff --git a/client/src/routes/ListParticipant.tsx b/client/src/routes/ListParticipant.tsx
index 885a8f9806372f65a54df3180e441557c6b8cebf..963e97628200bce8508027d02c929f3d14fca99d 100644
--- a/client/src/routes/ListParticipant.tsx
+++ b/client/src/routes/ListParticipant.tsx
@@ -1,5 +1,5 @@
 import FixedImage from "../components/FixedImage"
-import ParticipantForm from "../components/ParticipantForm"
+import ParticipantForm from "../components/forms/ParticipantForm"
 import { ProtectedRoute } from "../components/ProtectedRoute"
 
 export default function ListParticipant() {
diff --git a/client/src/routes/Login.tsx b/client/src/routes/Login.tsx
index ab08e0b4a3dfddc1b62ae7d8bce89bae3c20eb15..7738613d919b69490b23f9285a10b000a5674776 100644
--- a/client/src/routes/Login.tsx
+++ b/client/src/routes/Login.tsx
@@ -1,8 +1,8 @@
 import { createEffect } from "solid-js"
 import FixedImage from "../components/FixedImage"
-import LoginForm from "../components/LoginForm"
 import { t } from "../stores/locale"
 import { useNavigate } from "@solidjs/router"
+import LoginForm from "../components/forms/LoginForm"
 
 export default function Login() {
     const navigate = useNavigate()
diff --git a/server/.sqlx/query-3d42dc47e040d86fd2c268dcf227b968d538b2a038c630214781e6233dfba717.json b/server/.sqlx/query-3d42dc47e040d86fd2c268dcf227b968d538b2a038c630214781e6233dfba717.json
new file mode 100644
index 0000000000000000000000000000000000000000..f11ab042f2ba3df6c4c8220c8bbcccd9e4ee2f93
--- /dev/null
+++ b/server/.sqlx/query-3d42dc47e040d86fd2c268dcf227b968d538b2a038c630214781e6233dfba717.json
@@ -0,0 +1,15 @@
+{
+  "db_name": "PostgreSQL",
+  "query": "UPDATE participants SET password_hash = $1 WHERE id = $2",
+  "describe": {
+    "columns": [],
+    "parameters": {
+      "Left": [
+        "Text",
+        "Uuid"
+      ]
+    },
+    "nullable": []
+  },
+  "hash": "3d42dc47e040d86fd2c268dcf227b968d538b2a038c630214781e6233dfba717"
+}
diff --git a/server/.sqlx/query-4043956ce48fb14f0409451e0291b91ad2924d0cf6aa20c56b15f960b0ede42b.json b/server/.sqlx/query-4043956ce48fb14f0409451e0291b91ad2924d0cf6aa20c56b15f960b0ede42b.json
new file mode 100644
index 0000000000000000000000000000000000000000..b4132b58181139ecacd8bc7bbc6a56bd2ef0d27d
--- /dev/null
+++ b/server/.sqlx/query-4043956ce48fb14f0409451e0291b91ad2924d0cf6aa20c56b15f960b0ede42b.json
@@ -0,0 +1,15 @@
+{
+  "db_name": "PostgreSQL",
+  "query": "DELETE FROM participants WHERE id = $1 AND university_name = $2",
+  "describe": {
+    "columns": [],
+    "parameters": {
+      "Left": [
+        "Uuid",
+        "Text"
+      ]
+    },
+    "nullable": []
+  },
+  "hash": "4043956ce48fb14f0409451e0291b91ad2924d0cf6aa20c56b15f960b0ede42b"
+}
diff --git a/server/Dockerfile b/server/Dockerfile
index c3425b8ab155f14748e4d63e2a98cc5dfc0dab39..625364e4975bbc70680729af69d034cc537ff15a 100644
--- a/server/Dockerfile
+++ b/server/Dockerfile
@@ -23,4 +23,4 @@ WORKDIR /app
 # Set any required env variables and
 EXPOSE 3000
 # Run the server
-CMD ["/app/aep-schedule-website"]
+CMD ["/app/backend_cqi"]
diff --git a/server/migrations/20241015182258_create_participants_table.sql b/server/migrations/20241015182258_create_participants_table.sql
index bbc3d0012d8d1ec5726875a70afb99573f711449..3c404ab8d14c6b99d50e370c123fba965eb4a737 100644
--- a/server/migrations/20241015182258_create_participants_table.sql
+++ b/server/migrations/20241015182258_create_participants_table.sql
@@ -10,14 +10,15 @@ CREATE TABLE participants (
     first_name TEXT NOT NULL,
     last_name TEXT NOT NULL,
     competition COMPETITION NOT NULL,
-    university_name TEXT,
+    university TEXT NOT NULL,
     medical_conditions TEXT,
     allergies TEXT,
+    supper TEXT,
     pronouns TEXT,
     phone_number TEXT,
     tshirt_size TEXT,
     comments TEXT,
-    emergency_contact TEXT ,
+    emergency_contact TEXT,
     has_monthly_opus_card BOOLEAN,
     reduced_mobility TEXT,
     study_proof BYTEA,
diff --git a/server/src/auth/claims.rs b/server/src/auth/claims.rs
index 8e3aa2bd6f6b5ec82c483bd2a2f76aa6abc7c874..d6cd920974a67872a7d653ca0aba957f6f0a1e0d 100644
--- a/server/src/auth/claims.rs
+++ b/server/src/auth/claims.rs
@@ -27,9 +27,31 @@ impl Claims {
     fn is_expired(&self) -> bool {
         self.exp < (Utc::now().timestamp() as usize)
     }
+    // For use only when sending a token for an email
+    pub async fn create_token_for_password_reset(email: String, db: &PgPool) -> Option<String> {
+        let exp = (Utc::now().naive_utc() + chrono::naive::Days::new(2))
+            .and_utc()
+            .timestamp() as usize;
+        let info = sqlx::query!(
+            r#"SELECT id, role AS "role: Role", university FROM participants WHERE email = $1"#,
+            email
+        )
+        .fetch_one(db)
+        .await
+        .ok()?;
+        let claims = Claims {
+            id: info.id,
+            role: info.role,
+            university: info.university,
+            exp,
+        };
+        let token =
+            jsonwebtoken::encode(&jsonwebtoken::Header::default(), &claims, &KEYS.encoding).ok()?;
+        Some(token)
+    }
     pub async fn new(email: String, password: String, db: &PgPool) -> Option<Self> {
         let user = sqlx::query!(
-            r#"SELECT id, role AS "role: Role", password_hash, university_name FROM participants WHERE email = $1"#,
+            r#"SELECT id, role AS "role: Role", password_hash, university FROM participants WHERE email = $1"#,
             email
         )
         .fetch_one(db)
@@ -48,7 +70,7 @@ impl Claims {
 
         let id = user.id;
         let role = user.role;
-        let university = user.university_name.unwrap_or("".to_string());
+        let university = user.university;
         let exp = (Utc::now().naive_utc() + chrono::naive::Days::new(1))
             .and_utc()
             .timestamp() as usize;
diff --git a/server/src/bin/create_admin.rs b/server/src/bin/create_admin.rs
index fb80e844d22a9da4635c8c8ad9173cb669a56cf0..26990898ec504a61bf1e8de1965f99c10714a39a 100644
--- a/server/src/bin/create_admin.rs
+++ b/server/src/bin/create_admin.rs
@@ -19,7 +19,9 @@ async fn main() -> Result<()> {
         competition: Competition::None,
         role: Role::Organizer,
     };
-    participant.write_to_database(&password, &db).await?;
+    participant
+        .write_to_database(&password, &db, "Polytechnique Montréal".to_string())
+        .await?;
     println!("Password: {}", password);
     Ok(())
 }
diff --git a/server/src/model/minimal_participant.rs b/server/src/model/minimal_participant.rs
index d6aac50ff528be0f466fb8b3e69d4687229f4fbe..1461713243f9c38fed1e34d15bf73f1a2d2e9e81 100644
--- a/server/src/model/minimal_participant.rs
+++ b/server/src/model/minimal_participant.rs
@@ -24,7 +24,12 @@ impl MinimalParticipant {
             .await
     }
 
-    pub async fn write_to_database(&self, password: &str, db: &PgPool) -> Result<(), sqlx::Error> {
+    pub async fn write_to_database(
+        &self,
+        password: &str,
+        db: &PgPool,
+        university: String,
+    ) -> Result<(), sqlx::Error> {
         let id = Uuid::new_v4();
         tracing::info!("Generated password: {}", password); // TODO: remove this debug line
         let salt = SaltString::generate(&mut OsRng);
@@ -34,7 +39,7 @@ impl MinimalParticipant {
             .unwrap()
             .to_string();
         sqlx::query!(
-            r#"INSERT INTO participants (id, role, email, password_hash, first_name, last_name, competition, university_name)
+            r#"INSERT INTO participants (id, role, email, password_hash, first_name, last_name, competition, university)
                 VALUES ($1, $2, $3, $4, $5, $6, $7, $8)"#,
             id,
             self.role as Role,
@@ -43,7 +48,7 @@ impl MinimalParticipant {
             self.first_name,
             self.last_name,
             self.competition as Competition,
-            "test"
+            university
         )
         .execute(db)
         .await?;
diff --git a/server/src/model/participant.rs b/server/src/model/participant.rs
index 44d52ca723525877f471ae9f1372717415d6431b..c6d9aa834ed359dfad1ab4a157b494371392364a 100644
--- a/server/src/model/participant.rs
+++ b/server/src/model/participant.rs
@@ -16,10 +16,11 @@ pub struct Participant {
     pub email: String,
     pub first_name: String,
     pub last_name: String,
-    pub university_name: Option<String>,
+    pub university: String,
     pub medical_conditions: Option<String>,
     pub allergies: Option<String>,
     pub pronouns: Option<String>,
+    pub supper: Option<String>,
     pub competition: Option<Competition>,
     pub phone_number: Option<String>,
     pub tshirt_size: Option<String>,
@@ -57,23 +58,23 @@ impl Participant {
 
     pub async fn write_to_database(&self, db: &PgPool) -> Result<(), sqlx::Error> {
         sqlx::query!(
-                r#"INSERT INTO participants (id, university_name, medical_conditions, allergies, pronouns, competition, phone_number, tshirt_size, study_proof, photo, cv, comments, emergency_contact, has_monthly_opus_card, reduced_mobility)
-                VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)"#,
-                self.id,
-                self.university_name,
+                r#"UPDATE participants SET (medical_conditions, allergies, supper, pronouns, competition, phone_number, tshirt_size, comments, emergency_contact, has_monthly_opus_card, reduced_mobility, study_proof, photo, cv)
+                = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14) WHERE id = $15"#,
                 self.medical_conditions,
                 self.allergies,
+                self.supper,
                 self.pronouns,
                 self.competition as Option<Competition>,
                 self.phone_number,
                 self.tshirt_size,
-                self.study_proof,
-                self.photo,
-                self.cv,
                 self.comments,
                 self.emergency_contact,
                 self.has_monthly_opus_card,
-                self.reduced_mobility
+                self.reduced_mobility,
+                self.study_proof,
+                self.photo,
+                self.cv,
+                self.id
             )
             .execute(db)
             .await?;
@@ -93,7 +94,7 @@ impl Participant {
         db: &PgPool,
     ) -> Result<(), sqlx::Error> {
         sqlx::query!(
-            r#"DELETE FROM participants WHERE id = $1 AND university_name = $2"#,
+            r#"DELETE FROM participants WHERE id = $1 AND university = $2"#,
             id,
             university
         )
diff --git a/server/src/routes/new_participant.rs b/server/src/routes/new_participant.rs
index 953aca92aca07539114da3f05ecc8be0cb63560b..a2e7531351be38a11b10017da224ec704ffef91f 100644
--- a/server/src/routes/new_participant.rs
+++ b/server/src/routes/new_participant.rs
@@ -48,7 +48,10 @@ https://cqi-qec.qc.ca/login
         return (StatusCode::BAD_REQUEST, e.to_string()).into_response();
     };
 
-    if let Err(e) = participant.write_to_database(&password, &state.db).await {
+    if let Err(e) = participant
+        .write_to_database(&password, &state.db, _claims.university)
+        .await
+    {
         return (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()).into_response();
     };