diff -wurN mobilizon-3.0.3.orig/js/src/components/Home/UnloggedIntroduction.vue mobilizon-3.0.3/js/src/components/Home/UnloggedIntroduction.vue
--- mobilizon-3.0.3.orig/js/src/components/Home/UnloggedIntroduction.vue	2023-01-19 20:29:06.134317078 +0100
+++ mobilizon-3.0.3/js/src/components/Home/UnloggedIntroduction.vue	2023-01-19 20:34:01.344317113 +0100
@@ -18,12 +18,16 @@
               {{ t("This instance isn't opened to registrations, but you can register on other instances.") }}
           </p>-->
     <div class="flex flex-wrap gap-2 items-center">
-      <o-button
-        variant="primary"
-        tag="router-link"
-        :to="{ name: RouteName.REGISTER }"
-        v-if="config.registrationsOpen"
-        >{{ t("Create an account") }}</o-button
+      <a
+        href="https://rexistro.fedi.gal"
+        class="o-btn btn o-btn--primary btn-primary"
+        ><span
+          class="o-btn__wrapper"
+          ><span
+            class="o-btn__label"
+            >{{ t("Create an account") }}</span
+          ></span
+        ></a
       >
       <!-- We don't invite to find other instances yet -->
       <!-- <o-button v-else variant="link" tag="a" href="https://joinmastodon.org">{{ t('Find an instance') }}</o-button> -->
diff -wurN mobilizon-3.0.3.orig/js/src/components/NavBar.vue mobilizon-3.0.3/js/src/components/NavBar.vue
--- mobilizon-3.0.3.orig/js/src/components/NavBar.vue	2023-01-19 20:29:06.054317078 +0100
+++ mobilizon-3.0.3/js/src/components/NavBar.vue	2023-01-19 20:44:09.254317185 +0100
@@ -179,17 +179,17 @@
             >
           </li>
           <li v-if="!currentActor?.id">
-            <router-link
-              :to="{ name: RouteName.LOGIN }"
+            <a
+              href="/auth/keycloak"
               class="block py-2 pr-4 pl-3 text-zinc-700 border-b border-gray-100 hover:bg-zinc-50 md:hover:bg-transparent md:border-0 md:hover:text-mbz-purple-700 md:p-0 dark:text-zinc-400 md:dark:hover:text-white dark:hover:bg-zinc-700 dark:hover:text-white md:dark:hover:bg-transparent dark:border-gray-700"
-              >{{ t("Login") }}</router-link
+              >{{ t("Login") }}</a
             >
           </li>
           <li v-if="!currentActor?.id && canRegister">
-            <router-link
-              :to="{ name: RouteName.REGISTER }"
+            <a
+              href="https://rexistro.fedi.gal"
               class="block py-2 pr-4 pl-3 text-zinc-700 border-b border-gray-100 hover:bg-zinc-50 md:hover:bg-transparent md:border-0 md:hover:text-mbz-purple-700 md:p-0 dark:text-zinc-400 md:dark:hover:text-white dark:hover:bg-zinc-700 dark:hover:text-white md:dark:hover:bg-transparent dark:border-gray-700"
-              >{{ t("Register") }}</router-link
+              >{{ t("Register") }}</a
             >
           </li>
         </ul>
diff -wurN mobilizon-3.0.3.orig/js/src/components/Utils/RedirectWithAccount.vue mobilizon-3.0.3/js/src/components/Utils/RedirectWithAccount.vue
--- mobilizon-3.0.3.orig/js/src/components/Utils/RedirectWithAccount.vue	2023-01-19 20:29:06.184317078 +0100
+++ mobilizon-3.0.3/js/src/components/Utils/RedirectWithAccount.vue	2023-01-19 20:47:53.314317212 +0100
@@ -12,19 +12,16 @@
             <code>@{{ host }}</code>
           </template>
         </i18n-t>
-        <o-button
-          variant="primary"
-          size="medium"
-          tag="router-link"
-          class="mt-4"
-          :to="{
-            name: RouteName.LOGIN,
-            query: {
-              code: LoginErrorCode.NEED_TO_LOGIN,
-              redirect: pathAfterLogin,
-            },
-          }"
-          >{{ t("Login on {instance}", { instance: host }) }}</o-button
+        <a
+          href="/auth/keycloak"
+          class="o-btn btn o-btn--primary btn-primary mt-4"
+          ><span
+            class="o-btn__wrapper"
+            ><span
+              class="o-btn__label"
+              >{{ t("Login on {instance}", { instance: host }) }}</span
+            ></span
+          ></a
         >
       </div>
       <div class="sm:border-l-4 px-2 sm:px-4 flex-1">
diff -wurN mobilizon-3.0.3.orig/js/src/graphql/auth.ts mobilizon-3.0.3/js/src/graphql/auth.ts
--- mobilizon-3.0.3.orig/js/src/graphql/auth.ts	2023-01-19 20:29:06.194317078 +0100
+++ mobilizon-3.0.3/js/src/graphql/auth.ts	2023-01-19 20:52:03.584317242 +0100
@@ -14,30 +14,6 @@
   }
 `;
 
-export const SEND_RESET_PASSWORD = gql`
-  mutation SendResetPassword($email: String!) {
-    sendResetPassword(email: $email)
-  }
-`;
-
-export const RESET_PASSWORD = gql`
-  mutation ResetPassword($token: String!, $password: String!) {
-    resetPassword(token: $token, password: $password) {
-      accessToken
-      refreshToken
-      user {
-        id
-      }
-    }
-  }
-`;
-
-export const RESEND_CONFIRMATION_EMAIL = gql`
-  mutation ResendConfirmationEmail($email: String!) {
-    resendConfirmationEmail(email: $email)
-  }
-`;
-
 export const REFRESH_TOKEN = gql`
   mutation RefreshToken($refreshToken: String!) {
     refreshToken(refreshToken: $refreshToken) {
diff -wurN mobilizon-3.0.3.orig/js/src/router/user.ts mobilizon-3.0.3/js/src/router/user.ts
--- mobilizon-3.0.3.orig/js/src/router/user.ts	2023-01-19 20:42:16.274317172 +0100
+++ mobilizon-3.0.3/js/src/router/user.ts	2023-01-19 20:56:32.274317274 +0100
@@ -5,29 +5,13 @@
 const t = i18n.global.t;
 
 export enum UserRouteName {
-  REGISTER = "Register",
   REGISTER_PROFILE = "RegisterProfile",
-  RESEND_CONFIRMATION = "ResendConfirmation",
-  SEND_PASSWORD_RESET = "SendPasswordReset",
-  PASSWORD_RESET = "PasswordReset",
-  EMAIL_VALIDATE = "EMAIL_VALIDATE",
   VALIDATE = "Validate",
   LOGIN = "Login",
 }
 
 export const userRoutes: RouteRecordRaw[] = [
   {
-    path: "/register/user",
-    name: UserRouteName.REGISTER,
-    component: (): Promise<any> => import("@/views/User/RegisterView.vue"),
-    props: true,
-    meta: {
-      requiredAuth: false,
-      announcer: { message: (): string => t("Register") as string },
-    },
-    beforeEnter: beforeRegisterGuard,
-  },
-  {
     path: "/register/profile/:email/:userAlreadyActivated?",
     name: UserRouteName.REGISTER_PROFILE,
     component: (): Promise<any> => import("@/views/Account/RegisterView.vue"),
@@ -42,51 +25,6 @@
     },
   },
   {
-    path: "/resend-instructions",
-    name: UserRouteName.RESEND_CONFIRMATION,
-    component: (): Promise<any> =>
-      import("@/views/User/ResendConfirmation.vue"),
-    props: true,
-    meta: {
-      requiresAuth: false,
-      announcer: {
-        message: (): string => t("Resent confirmation email") as string,
-      },
-    },
-  },
-  {
-    path: "/password-reset/send",
-    name: UserRouteName.SEND_PASSWORD_RESET,
-    component: (): Promise<any> => import("@/views/User/SendPasswordReset.vue"),
-    props: true,
-    meta: {
-      requiresAuth: false,
-      announcer: {
-        message: (): string => t("Send password reset") as string,
-      },
-    },
-  },
-  {
-    path: "/password-reset/:token",
-    name: UserRouteName.PASSWORD_RESET,
-    component: (): Promise<any> => import("@/views/User/PasswordReset.vue"),
-    meta: {
-      requiresAuth: false,
-      announcer: { message: (): string => t("Password reset") as string },
-    },
-    props: true,
-  },
-  {
-    path: "/validate/email/:token",
-    name: UserRouteName.EMAIL_VALIDATE,
-    component: (): Promise<any> => import("@/views/User/EmailValidate.vue"),
-    props: true,
-    meta: {
-      requiresAuth: false,
-      announcer: { message: (): string => t("Email validate") as string },
-    },
-  },
-  {
     path: "/validate/:token",
     name: UserRouteName.VALIDATE,
     component: (): Promise<any> => import("@/views/User/ValidateUser.vue"),
diff -wurN mobilizon-3.0.3.orig/js/src/views/AboutView.vue mobilizon-3.0.3/js/src/views/AboutView.vue
--- mobilizon-3.0.3.orig/js/src/views/AboutView.vue	2023-01-19 20:29:06.364317078 +0100
+++ mobilizon-3.0.3/js/src/views/AboutView.vue	2023-01-19 20:35:36.164317124 +0100
@@ -81,11 +81,16 @@
             <h2 class="text-4xl text-violet-1 font-bold">
               {{ t("Register on this instance") }}
             </h2>
-            <o-button
-              tag="router-link"
-              class="bg-secondary text-lg text-black"
-              :to="{ name: RouteName.REGISTER }"
-              >{{ t("Create an account") }}</o-button
+            <a
+              href="https://rexistro.fedi.gal"
+              class="bg-secondary text-lg text-black o-btn btn"
+              ><span
+                class="o-btn__wrapper"
+                ><span
+                  class="o-btn__label"
+                  ></span
+                ></span
+              >{{ t("Create an account") }}</a
             >
           </div>
           <div class="flex-1">
diff -wurN mobilizon-3.0.3.orig/js/src/views/Account/children/EditIdentity.vue mobilizon-3.0.3/js/src/views/Account/children/EditIdentity.vue
--- mobilizon-3.0.3.orig/js/src/views/Account/children/EditIdentity.vue	2023-01-19 20:29:06.384317078 +0100
+++ mobilizon-3.0.3/js/src/views/Account/children/EditIdentity.vue	2023-01-19 20:49:32.134317224 +0100
@@ -493,7 +493,7 @@
 
 const handleErrors = (absintheErrors: AbsintheGraphQLErrors): void => {
   if (absintheErrors.some((error) => error.status_code === 401)) {
-    router.push({ name: RouteName.LOGIN });
+    router.push({ name: "/auth/keycloak" });
   }
 };
 
diff -wurN mobilizon-3.0.3.orig/js/src/views/User/RegisterView.vue mobilizon-3.0.3/js/src/views/User/RegisterView.vue
--- mobilizon-3.0.3.orig/js/src/views/User/RegisterView.vue	2023-01-19 20:29:06.424317078 +0100
+++ mobilizon-3.0.3/js/src/views/User/RegisterView.vue	1970-01-01 01:00:00.000000000 +0100
@@ -1,346 +0,0 @@
-<template>
-  <div class="container mx-auto py-6">
-    <section class="">
-      <h1>
-        {{
-          t("Register an account on {instanceName}!", {
-            instanceName: config?.name,
-          })
-        }}
-      </h1>
-      <i18n-t
-        tag="p"
-        keypath="{instanceName} is an instance of the {mobilizon} software."
-      >
-        <template #instanceName>
-          <b>{{ config?.name }}</b>
-        </template>
-        <template #mobilizon>
-          <a href="https://joinmobilizon.org" target="_blank" class="out">{{
-            t("Mobilizon")
-          }}</a>
-        </template>
-      </i18n-t>
-    </section>
-    <section class="flex flex-wrap gap-6">
-      <div class="">
-        <div class="my-4">
-          <h2 class="text-xl">{{ t("Why create an account?") }}</h2>
-          <div class="prose dark:prose-invert">
-            <ul>
-              <li>{{ t("To create and manage your events") }}</li>
-              <li>
-                {{
-                  t(
-                    "To create and manage multiples identities from a same account"
-                  )
-                }}
-              </li>
-              <li>
-                {{
-                  t(
-                    "To register for an event by choosing one of your identities"
-                  )
-                }}
-              </li>
-              <li v-if="config?.features.groups">
-                {{
-                  t(
-                    "To create or join an group and start organizing with other people"
-                  )
-                }}
-              </li>
-              <li v-if="config?.features.groups">
-                {{
-                  t("To follow groups and be informed of their latest events")
-                }}
-              </li>
-            </ul>
-          </div>
-        </div>
-        <router-link class="out block my-4" :to="{ name: RouteName.ABOUT }">{{
-          t("Learn more")
-        }}</router-link>
-        <hr role="presentation" />
-        <div class="my-4">
-          <h2 class="text-xl">
-            {{ t("About {instance}", { instance: config?.name }) }}
-          </h2>
-          <div
-            class="prose dark:prose-invert"
-            v-html="config?.description"
-          ></div>
-          <i18n-t
-            keypath="Please read the {fullRules} published by {instance}'s administrators."
-            tag="p"
-            ><template #fullRules>
-              <router-link class="out" :to="{ name: RouteName.RULES }">{{
-                t("full rules")
-              }}</router-link>
-            </template>
-            <template #instance>
-              <b>{{ config?.name }}</b>
-            </template>
-          </i18n-t>
-        </div>
-      </div>
-      <div class="">
-        <o-notification variant="warning" v-if="config?.registrationsAllowlist">
-          {{ t("Registrations are restricted by allowlisting.") }}
-        </o-notification>
-        <form @submit.prevent="submit">
-          <o-field
-            :label="t('Email')"
-            :variant="errorEmailType"
-            :message="errorEmailMessage"
-            label-for="email"
-          >
-            <o-input
-              aria-required="true"
-              required
-              id="email"
-              type="email"
-              v-model="credentials.email"
-              @blur="showGravatar = true"
-              @focus="showGravatar = false"
-            />
-          </o-field>
-
-          <o-field
-            :label="t('Password')"
-            :type="errorPasswordType"
-            :message="errorPasswordMessage"
-            label-for="password"
-          >
-            <o-input
-              aria-required="true"
-              required
-              id="password"
-              type="password"
-              password-reveal
-              minlength="6"
-              v-model="credentials.password"
-            />
-          </o-field>
-
-          <div class="flex items-start mb-6 mt-2">
-            <div class="flex items-center h-5">
-              <input
-                type="checkbox"
-                id="accept_rules_terms"
-                class="w-4 h-4 bg-gray-50 rounded border border-gray-300 focus:ring-3 focus:ring-blue-300 dark:bg-gray-700 dark:border-gray-600 dark:focus:ring-blue-600 dark:ring-offset-gray-800"
-                required
-              />
-            </div>
-
-            <label
-              for="accept_rules_terms"
-              class="ml-2 text-gray-900 dark:text-gray-300"
-            >
-              <i18n-t
-                tag="span"
-                keypath="I agree to the {instanceRules} and {termsOfService}"
-              >
-                <template #instanceRules>
-                  <router-link class="out" :to="{ name: RouteName.RULES }">{{
-                    t("instance rules")
-                  }}</router-link>
-                </template>
-                <template #termsOfService>
-                  <router-link class="out" :to="{ name: RouteName.TERMS }">{{
-                    t("terms of service")
-                  }}</router-link>
-                </template>
-              </i18n-t>
-            </label>
-          </div>
-
-          <p>
-            <o-button
-              variant="primary"
-              size="large"
-              :disabled="sendingForm"
-              native-type="submit"
-            >
-              {{ t("Create an account") }}
-            </o-button>
-          </p>
-
-          <p class="my-6">
-            <o-button
-              tag="router-link"
-              variant="text"
-              :to="{
-                name: RouteName.RESEND_CONFIRMATION,
-                params: { email: credentials.email },
-              }"
-              >{{ t("Didn't receive the instructions?") }}</o-button
-            >
-            <o-button
-              tag="router-link"
-              variant="text"
-              :to="{
-                name: RouteName.LOGIN,
-                params: {
-                  email: credentials.email,
-                  password: credentials.password,
-                },
-              }"
-              >{{ t("Login") }}</o-button
-            >
-          </p>
-
-          <hr role="presentation" />
-          <div
-            class="control"
-            v-if="config && config.auth.oauthProviders.length > 0"
-          >
-            <auth-providers :oauthProviders="config.auth.oauthProviders" />
-          </div>
-        </form>
-      </div>
-    </section>
-  </div>
-</template>
-
-<script setup lang="ts">
-import { CREATE_USER } from "../../graphql/user";
-import RouteName from "../../router/name";
-import { IConfig } from "../../types/config.model";
-import { CONFIG } from "../../graphql/config";
-import AuthProviders from "../../components/User/AuthProviders.vue";
-import { computed, reactive, ref, watch } from "vue";
-import { useMutation, useQuery } from "@vue/apollo-composable";
-import { useI18n } from "vue-i18n";
-import { useRouter } from "vue-router";
-import { useHead } from "@vueuse/head";
-import { AbsintheGraphQLErrors } from "@/types/errors.model";
-
-type errorType = "danger" | "warning";
-type errorMessage = { type: errorType; message: string };
-type credentialsType = { email: string; password: string; locale: string };
-
-const { t, locale } = useI18n({ useScope: "global" });
-const router = useRouter();
-
-const { result: configResult } = useQuery<{ config: IConfig }>(CONFIG);
-
-const config = computed(() => configResult.value?.config);
-
-const showGravatar = ref(false);
-
-const props = withDefaults(
-  defineProps<{
-    email?: string;
-    password?: string;
-  }>(),
-  { email: "", password: "" }
-);
-
-const credentials = reactive<credentialsType>({
-  email: props.email,
-  password: props.password,
-  locale: "en",
-});
-
-const emailErrors = ref<errorMessage[]>([]);
-const passwordErrors = ref<errorMessage[]>([]);
-
-const sendingForm = ref(false);
-
-const title = computed((): string => {
-  if (config.value) {
-    return t("Register an account on {instanceName}!", {
-      instanceName: config.value?.name,
-    });
-  }
-  return "";
-});
-
-useHead({
-  title: () => title.value,
-});
-
-const { onDone, onError, mutate } = useMutation(CREATE_USER);
-
-onDone(() => {
-  router.push({
-    name: RouteName.REGISTER_PROFILE,
-    params: { email: credentials.email },
-  });
-});
-
-onError((error) => {
-  (error.graphQLErrors as AbsintheGraphQLErrors).forEach(
-    ({ field, message }) => {
-      switch (field) {
-        case "email":
-          emailErrors.value.push({
-            type: "danger" as errorType,
-            message: message[0] as string,
-          });
-          break;
-        case "password":
-          passwordErrors.value.push({
-            type: "danger" as errorType,
-            message: message[0] as string,
-          });
-          break;
-        default:
-      }
-    }
-  );
-  sendingForm.value = false;
-});
-
-const submit = async (): Promise<void> => {
-  sendingForm.value = true;
-  credentials.locale = locale as unknown as string;
-  try {
-    emailErrors.value = [];
-    passwordErrors.value = [];
-
-    mutate(credentials);
-  } catch (error: any) {
-    console.error(error);
-
-    sendingForm.value = false;
-  }
-};
-
-watch(credentials, () => {
-  if (credentials.email !== credentials.email.toLowerCase()) {
-    const error = {
-      type: "warning" as errorType,
-      message: t(
-        "Emails usually don't contain capitals, make sure you haven't made a typo."
-      ),
-    };
-    emailErrors.value = [error];
-  }
-});
-
-const maxErrorType = (errors: errorMessage[]): errorType | undefined => {
-  if (!errors || errors.length === 0) return undefined;
-  return errors.reduce<errorType>((acc, error) => {
-    if (error.type === "danger" || acc === "danger") return "danger";
-    return "warning";
-  }, "warning");
-};
-
-const errorEmailType = computed((): errorType | undefined => {
-  return maxErrorType(emailErrors.value);
-});
-
-const errorPasswordType = computed((): errorType | undefined => {
-  return maxErrorType(passwordErrors.value);
-});
-
-const errorEmailMessage = computed((): string => {
-  return emailErrors.value.map(({ message }) => message).join(" ");
-});
-
-const errorPasswordMessage = computed((): string => {
-  return passwordErrors.value?.map(({ message }) => message).join(" ");
-});
-</script>
diff -wurN mobilizon-3.0.3.orig/js/src/views/User/ResendConfirmation.vue mobilizon-3.0.3/js/src/views/User/ResendConfirmation.vue
--- mobilizon-3.0.3.orig/js/src/views/User/ResendConfirmation.vue	2023-01-19 20:29:06.424317078 +0100
+++ mobilizon-3.0.3/js/src/views/User/ResendConfirmation.vue	1970-01-01 01:00:00.000000000 +0100
@@ -1,92 +0,0 @@
-<template>
-  <section class="container mx-auto pt-4 max-w-2xl">
-    <h1>
-      {{ $t("Resend confirmation email") }}
-    </h1>
-    <form v-if="!validationSent" @submit="resendConfirmationAction">
-      <o-field :label="$t('Email address')">
-        <o-input
-          aria-required="true"
-          required
-          type="email"
-          v-model="credentials.email"
-        />
-      </o-field>
-      <p class="flex flex-wrap gap-1">
-        <o-button variant="primary" native-type="submit">
-          {{ $t("Send the confirmation email again") }}
-        </o-button>
-        <o-button
-          variant="primary"
-          outlined
-          tag="router-link"
-          :to="{ name: RouteName.LOGIN }"
-          >{{ $t("Cancel") }}</o-button
-        >
-      </p>
-    </form>
-    <div v-else>
-      <o-notification variant="success" :closable="false" title="Success">
-        {{
-          $t(
-            "If an account with this email exists, we just sent another confirmation email to {email}",
-            { email: credentials.email }
-          )
-        }}
-      </o-notification>
-      <o-notification variant="info">
-        {{
-          $t("Please check your spam folder if you didn't receive the email.")
-        }}
-      </o-notification>
-    </div>
-  </section>
-</template>
-
-<script lang="ts" setup>
-import { RESEND_CONFIRMATION_EMAIL } from "@/graphql/auth";
-import RouteName from "@/router/name";
-import { reactive, ref, computed } from "vue";
-import { useMutation } from "@vue/apollo-composable";
-import { useI18n } from "vue-i18n";
-import { useHead } from "@vueuse/head";
-
-const { t } = useI18n({ useScope: "global" });
-useHead({
-  title: computed(() => t("Resend confirmation email")),
-  meta: [{ name: "robots", content: "noindex" }],
-});
-
-const props = withDefaults(defineProps<{ email: string }>(), { email: "" });
-
-const credentials = reactive({
-  email: props.email,
-});
-
-const validationSent = ref(false);
-const error = ref(false);
-
-const {
-  mutate: resendConfirmationEmail,
-  onDone: resentConfirmationEmail,
-  onError: resentConfirmationEmailError,
-} = useMutation(RESEND_CONFIRMATION_EMAIL);
-
-resentConfirmationEmail(() => {
-  validationSent.value = true;
-});
-
-resentConfirmationEmailError((err) => {
-  console.error(err);
-  error.value = true;
-});
-
-const resendConfirmationAction = async (e: Event): Promise<void> => {
-  e.preventDefault();
-  error.value = false;
-
-  resendConfirmationEmail({
-    email: credentials.email,
-  });
-};
-</script>
diff -wurN mobilizon-3.0.3.orig/js/src/views/User/SendPasswordReset.vue mobilizon-3.0.3/js/src/views/User/SendPasswordReset.vue
--- mobilizon-3.0.3.orig/js/src/views/User/SendPasswordReset.vue	2023-01-19 20:29:06.424317078 +0100
+++ mobilizon-3.0.3/js/src/views/User/SendPasswordReset.vue	1970-01-01 01:00:00.000000000 +0100
@@ -1,116 +0,0 @@
-<template>
-  <section class="container mx-auto">
-    <h1>
-      {{ t("Forgot your password?") }}
-    </h1>
-    <p>
-      {{
-        t(
-          "Enter your email address below, and we'll email you instructions on how to change your password."
-        )
-      }}
-    </p>
-    <o-notification
-      title="Error"
-      variant="danger"
-      v-for="error in errors"
-      :key="error"
-      @close="removeError(error)"
-    >
-      {{ error }}
-    </o-notification>
-    <form @submit="sendResetPasswordTokenAction" v-if="!validationSent">
-      <o-field :label="t('Email address')">
-        <o-input
-          aria-required="true"
-          required
-          type="email"
-          v-model="credentials.email"
-        />
-      </o-field>
-      <p class="control">
-        <o-button variant="primary" native-type="submit">
-          {{ t("Submit") }}
-        </o-button>
-        <router-link :to="{ name: RouteName.LOGIN }" class="button is-text">{{
-          t("Cancel")
-        }}</router-link>
-      </p>
-    </form>
-    <div v-else>
-      <o-notification variant="success" :closable="false" title="Success">
-        {{
-          t("We just sent an email to {email}", {
-            email: credentials.email,
-          })
-        }}
-      </o-notification>
-      <o-notification variant="info">
-        {{
-          t("Please check your spam folder if you didn't receive the email.")
-        }}
-      </o-notification>
-    </div>
-  </section>
-</template>
-
-<script lang="ts" setup>
-import { SEND_RESET_PASSWORD } from "../../graphql/auth";
-import RouteName from "../../router/name";
-import { computed, reactive, ref } from "vue";
-import { useMutation } from "@vue/apollo-composable";
-import { useHead } from "@vueuse/head";
-import { useI18n } from "vue-i18n";
-
-const { t } = useI18n({ useScope: "global" });
-useHead({
-  title: computed(() => t("Reset password")),
-});
-
-const props = withDefaults(
-  defineProps<{
-    email?: string;
-  }>(),
-  { email: "" }
-);
-
-const credentials = reactive<{ email: string }>({
-  email: props.email,
-});
-
-const validationSent = ref(false);
-
-const errors = ref<string[]>([]);
-
-const removeError = (message: string): void => {
-  errors.value.splice(errors.value.indexOf(message));
-};
-
-const {
-  mutate: sendResetPasswordMutation,
-  onDone: sendResetPasswordDone,
-  onError: sendResetPasswordError,
-} = useMutation(SEND_RESET_PASSWORD);
-
-sendResetPasswordDone(() => {
-  validationSent.value = true;
-});
-sendResetPasswordError((err) => {
-  console.error(err);
-  if (err.graphQLErrors) {
-    err.graphQLErrors.forEach(({ message }: { message: string }) => {
-      if (errors.value.indexOf(message) < 0) {
-        errors.value.push(message);
-      }
-    });
-  }
-});
-
-const sendResetPasswordTokenAction = async (e: Event): Promise<void> => {
-  e.preventDefault();
-
-  sendResetPasswordMutation({
-    email: credentials.email,
-  });
-};
-</script>
diff -wurN mobilizon-3.0.3.orig/js/tests/unit/specs/components/__snapshots__/navbar.spec.ts.snap mobilizon-3.0.3/js/tests/unit/specs/components/__snapshots__/navbar.spec.ts.snap
--- mobilizon-3.0.3.orig/js/tests/unit/specs/components/__snapshots__/navbar.spec.ts.snap	2023-01-19 20:29:06.454317078 +0100
+++ mobilizon-3.0.3/js/tests/unit/specs/components/__snapshots__/navbar.spec.ts.snap	2023-01-19 20:45:44.604317197 +0100
@@ -176,18 +176,18 @@
 
       <o-navbar-item v-else tag=\\"div\\">
         <div class=\\"buttons\\">
-          <router-link
+          <a
             class=\\"button is-primary\\"
             v-if=\\"config && config.registrationsOpen\\"
-            :to=\\"{ name: RouteName.REGISTER }\\"
+            href=\\"https://rexistro.fedi.gal\\"
           >
             <strong>{{ $t(\\"Sign up\\") }}</strong>
-          </router-link>
+          </a>
 
-          <router-link
+          <a
             class=\\"button is-light\\"
-            :to=\\"{ name: RouteName.LOGIN }\\"
-            >{{ $t(\\"Log in\\") }}</router-link
+            href=\\"/auth/keycloak\\"
+            >{{ $t(\\"Log in\\") }}</a
           >
         </div>
       </o-navbar-item>
diff -wurN mobilizon-3.0.3.orig/js/src/views/User/LoginView.vue mobilizon-3.0.3/js/src/views/User/LoginView.vue
--- mobilizon-3.0.3.orig/js/src/views/User/LoginView.vue	2023-01-19 23:11:13.674318237 +0100
+++ mobilizon-3.0.3/js/src/views/User/LoginView.vue	2023-01-20 10:24:26.064323052 +0100
@@ -81,40 +81,6 @@
       </p>
       <!-- <o-loading :is-full-page="false" v-model="submitted" /> -->
 
-      <div class="flex flex-wrap gap-2 mt-3">
-        <o-button
-          tag="router-link"
-          variant="text"
-          :to="{
-            name: RouteName.SEND_PASSWORD_RESET,
-            params: { email: credentials.email },
-          }"
-          >{{ t("Forgot your password?") }}</o-button
-        >
-        <o-button
-          tag="router-link"
-          variant="text"
-          :to="{
-            name: RouteName.RESEND_CONFIRMATION,
-            params: { email: credentials.email },
-          }"
-          >{{ t("Didn't receive the instructions?") }}</o-button
-        >
-        <p class="control" v-if="canRegister">
-          <o-button
-            tag="router-link"
-            variant="text"
-            :to="{
-              name: RouteName.REGISTER,
-              params: {
-                default_email: credentials.email,
-                default_password: credentials.password,
-              },
-            }"
-            >{{ t("Create an account") }}</o-button
-          >
-        </p>
-      </div>
     </form>
     <div v-if="config && config?.auth.oauthProviders.length > 0">
       <auth-providers :oauthProviders="config.auth.oauthProviders" />
