tr]:last:border-b-0",
- className
- )}
- {...props}
- />
- )
-}
-
-function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
- return (
-
- )
-}
-
-function TableHead({ className, ...props }: React.ComponentProps<"th">) {
- return (
- [role=checkbox]]:translate-y-[2px]",
- className
- )}
- {...props}
- />
- )
-}
-
-function TableCell({ className, ...props }: React.ComponentProps<"td">) {
- return (
- | [role=checkbox]]:translate-y-[2px]",
- className
- )}
- {...props}
- />
- )
-}
-
-function TableCaption({
- className,
- ...props
-}: React.ComponentProps<"caption">) {
- return (
-
- )
-}
-
-export {
- Table,
- TableHeader,
- TableBody,
- TableFooter,
- TableHead,
- TableRow,
- TableCell,
- TableCaption,
-}
diff --git a/frontend/src/components/ui/tabs.tsx b/frontend/src/components/ui/tabs.tsx
deleted file mode 100644
index 3d6f3acf86..0000000000
--- a/frontend/src/components/ui/tabs.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import * as React from "react"
-import * as TabsPrimitive from "@radix-ui/react-tabs"
-
-import { cn } from "@/lib/utils"
-
-function Tabs({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function TabsList({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function TabsTrigger({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function TabsContent({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-export { Tabs, TabsList, TabsTrigger, TabsContent }
diff --git a/frontend/src/components/ui/tooltip.tsx b/frontend/src/components/ui/tooltip.tsx
deleted file mode 100644
index 715bf76d6b..0000000000
--- a/frontend/src/components/ui/tooltip.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import * as React from "react"
-import * as TooltipPrimitive from "@radix-ui/react-tooltip"
-
-import { cn } from "@/lib/utils"
-
-function TooltipProvider({
- delayDuration = 0,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function Tooltip({
- ...props
-}: React.ComponentProps) {
- return (
-
-
-
- )
-}
-
-function TooltipTrigger({
- ...props
-}: React.ComponentProps) {
- return
-}
-
-function TooltipContent({
- className,
- sideOffset = 0,
- children,
- ...props
-}: React.ComponentProps) {
- return (
-
-
- {children}
-
-
-
- )
-}
-
-export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
diff --git a/frontend/src/hooks/useAuth.ts b/frontend/src/hooks/useAuth.ts
deleted file mode 100644
index 7ccc795c48..0000000000
--- a/frontend/src/hooks/useAuth.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"
-import { useNavigate } from "@tanstack/react-router"
-
-import {
- type Body_login_login_access_token as AccessToken,
- LoginService,
- type UserPublic,
- type UserRegister,
- UsersService,
-} from "@/client"
-import { handleError } from "@/utils"
-import useCustomToast from "./useCustomToast"
-
-const isLoggedIn = () => {
- return localStorage.getItem("access_token") !== null
-}
-
-const useAuth = () => {
- const navigate = useNavigate()
- const queryClient = useQueryClient()
- const { showErrorToast } = useCustomToast()
-
- const { data: user } = useQuery({
- queryKey: ["currentUser"],
- queryFn: UsersService.readUserMe,
- enabled: isLoggedIn(),
- })
-
- const signUpMutation = useMutation({
- mutationFn: (data: UserRegister) =>
- UsersService.registerUser({ requestBody: data }),
- onSuccess: () => {
- navigate({ to: "/login" })
- },
- onError: handleError.bind(showErrorToast),
- onSettled: () => {
- queryClient.invalidateQueries({ queryKey: ["users"] })
- },
- })
-
- const login = async (data: AccessToken) => {
- const response = await LoginService.loginAccessToken({
- formData: data,
- })
- localStorage.setItem("access_token", response.access_token)
- }
-
- const loginMutation = useMutation({
- mutationFn: login,
- onSuccess: () => {
- navigate({ to: "/" })
- },
- onError: handleError.bind(showErrorToast),
- })
-
- const logout = () => {
- localStorage.removeItem("access_token")
- navigate({ to: "/login" })
- }
-
- return {
- signUpMutation,
- loginMutation,
- logout,
- user,
- }
-}
-
-export { isLoggedIn }
-export default useAuth
diff --git a/frontend/src/hooks/useCopyToClipboard.ts b/frontend/src/hooks/useCopyToClipboard.ts
deleted file mode 100644
index 8a4a841c72..0000000000
--- a/frontend/src/hooks/useCopyToClipboard.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-// source: https://usehooks-ts.com/react-hook/use-copy-to-clipboard
-import { useCallback, useState } from "react"
-
-type CopiedValue = string | null
-
-type CopyFn = (text: string) => Promise
-
-export function useCopyToClipboard(): [CopiedValue, CopyFn] {
- const [copiedText, setCopiedText] = useState(null)
-
- const copy: CopyFn = useCallback(async (text) => {
- if (!navigator?.clipboard) {
- console.warn("Clipboard not supported")
- return false
- }
-
- try {
- await navigator.clipboard.writeText(text)
- setCopiedText(text)
-
- setTimeout(() => setCopiedText(null), 2000)
-
- return true
- } catch (error) {
- console.warn("Copy failed", error)
- setCopiedText(null)
- return false
- }
- }, [])
-
- return [copiedText, copy]
-}
diff --git a/frontend/src/hooks/useCustomToast.ts b/frontend/src/hooks/useCustomToast.ts
deleted file mode 100644
index ab03265bd8..0000000000
--- a/frontend/src/hooks/useCustomToast.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { toast } from "sonner"
-
-const useCustomToast = () => {
- const showSuccessToast = (description: string) => {
- toast.success("Success!", {
- description,
- })
- }
-
- const showErrorToast = (description: string) => {
- toast.error("Something went wrong!", {
- description,
- })
- }
-
- return { showSuccessToast, showErrorToast }
-}
-
-export default useCustomToast
diff --git a/frontend/src/hooks/useMobile.ts b/frontend/src/hooks/useMobile.ts
deleted file mode 100644
index 2b0fe1dfef..0000000000
--- a/frontend/src/hooks/useMobile.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as React from "react"
-
-const MOBILE_BREAKPOINT = 768
-
-export function useIsMobile() {
- const [isMobile, setIsMobile] = React.useState(undefined)
-
- React.useEffect(() => {
- const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
- const onChange = () => {
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
- }
- mql.addEventListener("change", onChange)
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
- return () => mql.removeEventListener("change", onChange)
- }, [])
-
- return !!isMobile
-}
diff --git a/frontend/src/index.css b/frontend/src/index.css
deleted file mode 100644
index 47e56960ad..0000000000
--- a/frontend/src/index.css
+++ /dev/null
@@ -1,124 +0,0 @@
-@import "tailwindcss";
-@import "tw-animate-css";
-
-@custom-variant dark (&:is(.dark *));
-
-@theme inline {
- --radius-sm: calc(var(--radius) - 4px);
- --radius-md: calc(var(--radius) - 2px);
- --radius-lg: var(--radius);
- --radius-xl: calc(var(--radius) + 4px);
- --color-background: var(--background);
- --color-foreground: var(--foreground);
- --color-card: var(--card);
- --color-card-foreground: var(--card-foreground);
- --color-popover: var(--popover);
- --color-popover-foreground: var(--popover-foreground);
- --color-primary: var(--primary);
- --color-primary-foreground: var(--primary-foreground);
- --color-secondary: var(--secondary);
- --color-secondary-foreground: var(--secondary-foreground);
- --color-muted: var(--muted);
- --color-muted-foreground: var(--muted-foreground);
- --color-accent: var(--accent);
- --color-accent-foreground: var(--accent-foreground);
- --color-destructive: var(--destructive);
- --color-border: var(--border);
- --color-input: var(--input);
- --color-ring: var(--ring);
- --color-chart-1: var(--chart-1);
- --color-chart-2: var(--chart-2);
- --color-chart-3: var(--chart-3);
- --color-chart-4: var(--chart-4);
- --color-chart-5: var(--chart-5);
- --color-sidebar: var(--sidebar);
- --color-sidebar-foreground: var(--sidebar-foreground);
- --color-sidebar-primary: var(--sidebar-primary);
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
- --color-sidebar-accent: var(--sidebar-accent);
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
- --color-sidebar-border: var(--sidebar-border);
- --color-sidebar-ring: var(--sidebar-ring);
-}
-
-:root {
- --radius: 0.625rem;
- --background: oklch(1 0 0);
- --foreground: oklch(0.145 0 0);
- --card: oklch(1 0 0);
- --card-foreground: oklch(0.145 0 0);
- --popover: oklch(1 0 0);
- --popover-foreground: oklch(0.145 0 0);
- --primary: oklch(0.5982 0.10687 182.4689);
- --primary-foreground: oklch(0.985 0 0);
- --secondary: oklch(0.97 0 0);
- --secondary-foreground: oklch(0.205 0 0);
- --muted: oklch(0.97 0 0);
- --muted-foreground: oklch(0.556 0 0);
- --accent: oklch(0.97 0 0);
- --accent-foreground: oklch(0.205 0 0);
- --destructive: oklch(0.577 0.245 27.325);
- --border: oklch(0.922 0 0);
- --input: oklch(0.922 0 0);
- --ring: oklch(0.708 0 0);
- --chart-1: oklch(0.646 0.222 41.116);
- --chart-2: oklch(0.6 0.118 184.704);
- --chart-3: oklch(0.398 0.07 227.392);
- --chart-4: oklch(0.828 0.189 84.429);
- --chart-5: oklch(0.769 0.188 70.08);
- --sidebar: oklch(0.985 0 0);
- --sidebar-foreground: oklch(0.145 0 0);
- --sidebar-primary: oklch(0.5982 0.10687 182.4689);
- --sidebar-primary-foreground: oklch(0.985 0 0);
- --sidebar-accent: oklch(0.97 0 0);
- --sidebar-accent-foreground: oklch(0.205 0 0);
- --sidebar-border: oklch(0.922 0 0);
- --sidebar-ring: oklch(0.708 0 0);
-}
-
-.dark {
- --background: oklch(0.145 0 0);
- --foreground: oklch(0.985 0 0);
- --card: oklch(0.205 0 0);
- --card-foreground: oklch(0.985 0 0);
- --popover: oklch(0.205 0 0);
- --popover-foreground: oklch(0.985 0 0);
- --primary: oklch(0.65 0.10687 182.4689);
- --primary-foreground: oklch(0.985 0 0);
- --secondary: oklch(0.269 0 0);
- --secondary-foreground: oklch(0.985 0 0);
- --muted: oklch(0.269 0 0);
- --muted-foreground: oklch(0.708 0 0);
- --accent: oklch(0.269 0 0);
- --accent-foreground: oklch(0.985 0 0);
- --destructive: oklch(0.704 0.191 22.216);
- --border: oklch(1 0 0 / 10%);
- --input: oklch(1 0 0 / 15%);
- --ring: oklch(0.556 0 0);
- --chart-1: oklch(0.488 0.243 264.376);
- --chart-2: oklch(0.696 0.17 162.48);
- --chart-3: oklch(0.769 0.188 70.08);
- --chart-4: oklch(0.627 0.265 303.9);
- --chart-5: oklch(0.645 0.246 16.439);
- --sidebar: oklch(0.205 0 0);
- --sidebar-foreground: oklch(0.985 0 0);
- --sidebar-primary: oklch(0.65 0.10687 182.4689);
- --sidebar-primary-foreground: oklch(0.985 0 0);
- --sidebar-accent: oklch(0.269 0 0);
- --sidebar-accent-foreground: oklch(0.985 0 0);
- --sidebar-border: oklch(1 0 0 / 10%);
- --sidebar-ring: oklch(0.556 0 0);
-}
-
-@layer base {
- * {
- @apply border-border outline-ring/50;
- }
- body {
- @apply bg-background text-foreground;
- }
- button,
- [role="button"] {
- cursor: pointer;
- }
-}
diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts
deleted file mode 100644
index d084ccade0..0000000000
--- a/frontend/src/lib/utils.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { type ClassValue, clsx } from "clsx"
-import { twMerge } from "tailwind-merge"
-
-export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs))
-}
diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx
deleted file mode 100644
index 8afe946cb5..0000000000
--- a/frontend/src/main.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import {
- MutationCache,
- QueryCache,
- QueryClient,
- QueryClientProvider,
-} from "@tanstack/react-query"
-import { createRouter, RouterProvider } from "@tanstack/react-router"
-import { StrictMode } from "react"
-import ReactDOM from "react-dom/client"
-import { ApiError, OpenAPI } from "./client"
-import { ThemeProvider } from "./components/theme-provider"
-import { Toaster } from "./components/ui/sonner"
-import "./index.css"
-import { routeTree } from "./routeTree.gen"
-
-OpenAPI.BASE = import.meta.env.VITE_API_URL
-OpenAPI.TOKEN = async () => {
- return localStorage.getItem("access_token") || ""
-}
-
-const handleApiError = (error: Error) => {
- if (error instanceof ApiError && [401, 403].includes(error.status)) {
- localStorage.removeItem("access_token")
- window.location.href = "/login"
- }
-}
-const queryClient = new QueryClient({
- queryCache: new QueryCache({
- onError: handleApiError,
- }),
- mutationCache: new MutationCache({
- onError: handleApiError,
- }),
-})
-
-const router = createRouter({ routeTree })
-declare module "@tanstack/react-router" {
- interface Register {
- router: typeof router
- }
-}
-
-ReactDOM.createRoot(document.getElementById("root")!).render(
-
-
-
-
-
-
-
- ,
-)
diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts
deleted file mode 100644
index 8849130b4c..0000000000
--- a/frontend/src/routeTree.gen.ts
+++ /dev/null
@@ -1,235 +0,0 @@
-/* eslint-disable */
-
-// @ts-nocheck
-
-// noinspection JSUnusedGlobalSymbols
-
-// This file was automatically generated by TanStack Router.
-// You should NOT make any changes in this file as it will be overwritten.
-// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
-
-import { Route as rootRouteImport } from './routes/__root'
-import { Route as SignupRouteImport } from './routes/signup'
-import { Route as ResetPasswordRouteImport } from './routes/reset-password'
-import { Route as RecoverPasswordRouteImport } from './routes/recover-password'
-import { Route as LoginRouteImport } from './routes/login'
-import { Route as LayoutRouteImport } from './routes/_layout'
-import { Route as LayoutIndexRouteImport } from './routes/_layout/index'
-import { Route as LayoutSettingsRouteImport } from './routes/_layout/settings'
-import { Route as LayoutItemsRouteImport } from './routes/_layout/items'
-import { Route as LayoutAdminRouteImport } from './routes/_layout/admin'
-
-const SignupRoute = SignupRouteImport.update({
- id: '/signup',
- path: '/signup',
- getParentRoute: () => rootRouteImport,
-} as any)
-const ResetPasswordRoute = ResetPasswordRouteImport.update({
- id: '/reset-password',
- path: '/reset-password',
- getParentRoute: () => rootRouteImport,
-} as any)
-const RecoverPasswordRoute = RecoverPasswordRouteImport.update({
- id: '/recover-password',
- path: '/recover-password',
- getParentRoute: () => rootRouteImport,
-} as any)
-const LoginRoute = LoginRouteImport.update({
- id: '/login',
- path: '/login',
- getParentRoute: () => rootRouteImport,
-} as any)
-const LayoutRoute = LayoutRouteImport.update({
- id: '/_layout',
- getParentRoute: () => rootRouteImport,
-} as any)
-const LayoutIndexRoute = LayoutIndexRouteImport.update({
- id: '/',
- path: '/',
- getParentRoute: () => LayoutRoute,
-} as any)
-const LayoutSettingsRoute = LayoutSettingsRouteImport.update({
- id: '/settings',
- path: '/settings',
- getParentRoute: () => LayoutRoute,
-} as any)
-const LayoutItemsRoute = LayoutItemsRouteImport.update({
- id: '/items',
- path: '/items',
- getParentRoute: () => LayoutRoute,
-} as any)
-const LayoutAdminRoute = LayoutAdminRouteImport.update({
- id: '/admin',
- path: '/admin',
- getParentRoute: () => LayoutRoute,
-} as any)
-
-export interface FileRoutesByFullPath {
- '/login': typeof LoginRoute
- '/recover-password': typeof RecoverPasswordRoute
- '/reset-password': typeof ResetPasswordRoute
- '/signup': typeof SignupRoute
- '/admin': typeof LayoutAdminRoute
- '/items': typeof LayoutItemsRoute
- '/settings': typeof LayoutSettingsRoute
- '/': typeof LayoutIndexRoute
-}
-export interface FileRoutesByTo {
- '/login': typeof LoginRoute
- '/recover-password': typeof RecoverPasswordRoute
- '/reset-password': typeof ResetPasswordRoute
- '/signup': typeof SignupRoute
- '/admin': typeof LayoutAdminRoute
- '/items': typeof LayoutItemsRoute
- '/settings': typeof LayoutSettingsRoute
- '/': typeof LayoutIndexRoute
-}
-export interface FileRoutesById {
- __root__: typeof rootRouteImport
- '/_layout': typeof LayoutRouteWithChildren
- '/login': typeof LoginRoute
- '/recover-password': typeof RecoverPasswordRoute
- '/reset-password': typeof ResetPasswordRoute
- '/signup': typeof SignupRoute
- '/_layout/admin': typeof LayoutAdminRoute
- '/_layout/items': typeof LayoutItemsRoute
- '/_layout/settings': typeof LayoutSettingsRoute
- '/_layout/': typeof LayoutIndexRoute
-}
-export interface FileRouteTypes {
- fileRoutesByFullPath: FileRoutesByFullPath
- fullPaths:
- | '/login'
- | '/recover-password'
- | '/reset-password'
- | '/signup'
- | '/admin'
- | '/items'
- | '/settings'
- | '/'
- fileRoutesByTo: FileRoutesByTo
- to:
- | '/login'
- | '/recover-password'
- | '/reset-password'
- | '/signup'
- | '/admin'
- | '/items'
- | '/settings'
- | '/'
- id:
- | '__root__'
- | '/_layout'
- | '/login'
- | '/recover-password'
- | '/reset-password'
- | '/signup'
- | '/_layout/admin'
- | '/_layout/items'
- | '/_layout/settings'
- | '/_layout/'
- fileRoutesById: FileRoutesById
-}
-export interface RootRouteChildren {
- LayoutRoute: typeof LayoutRouteWithChildren
- LoginRoute: typeof LoginRoute
- RecoverPasswordRoute: typeof RecoverPasswordRoute
- ResetPasswordRoute: typeof ResetPasswordRoute
- SignupRoute: typeof SignupRoute
-}
-
-declare module '@tanstack/react-router' {
- interface FileRoutesByPath {
- '/signup': {
- id: '/signup'
- path: '/signup'
- fullPath: '/signup'
- preLoaderRoute: typeof SignupRouteImport
- parentRoute: typeof rootRouteImport
- }
- '/reset-password': {
- id: '/reset-password'
- path: '/reset-password'
- fullPath: '/reset-password'
- preLoaderRoute: typeof ResetPasswordRouteImport
- parentRoute: typeof rootRouteImport
- }
- '/recover-password': {
- id: '/recover-password'
- path: '/recover-password'
- fullPath: '/recover-password'
- preLoaderRoute: typeof RecoverPasswordRouteImport
- parentRoute: typeof rootRouteImport
- }
- '/login': {
- id: '/login'
- path: '/login'
- fullPath: '/login'
- preLoaderRoute: typeof LoginRouteImport
- parentRoute: typeof rootRouteImport
- }
- '/_layout': {
- id: '/_layout'
- path: ''
- fullPath: ''
- preLoaderRoute: typeof LayoutRouteImport
- parentRoute: typeof rootRouteImport
- }
- '/_layout/': {
- id: '/_layout/'
- path: '/'
- fullPath: '/'
- preLoaderRoute: typeof LayoutIndexRouteImport
- parentRoute: typeof LayoutRoute
- }
- '/_layout/settings': {
- id: '/_layout/settings'
- path: '/settings'
- fullPath: '/settings'
- preLoaderRoute: typeof LayoutSettingsRouteImport
- parentRoute: typeof LayoutRoute
- }
- '/_layout/items': {
- id: '/_layout/items'
- path: '/items'
- fullPath: '/items'
- preLoaderRoute: typeof LayoutItemsRouteImport
- parentRoute: typeof LayoutRoute
- }
- '/_layout/admin': {
- id: '/_layout/admin'
- path: '/admin'
- fullPath: '/admin'
- preLoaderRoute: typeof LayoutAdminRouteImport
- parentRoute: typeof LayoutRoute
- }
- }
-}
-
-interface LayoutRouteChildren {
- LayoutAdminRoute: typeof LayoutAdminRoute
- LayoutItemsRoute: typeof LayoutItemsRoute
- LayoutSettingsRoute: typeof LayoutSettingsRoute
- LayoutIndexRoute: typeof LayoutIndexRoute
-}
-
-const LayoutRouteChildren: LayoutRouteChildren = {
- LayoutAdminRoute: LayoutAdminRoute,
- LayoutItemsRoute: LayoutItemsRoute,
- LayoutSettingsRoute: LayoutSettingsRoute,
- LayoutIndexRoute: LayoutIndexRoute,
-}
-
-const LayoutRouteWithChildren =
- LayoutRoute._addFileChildren(LayoutRouteChildren)
-
-const rootRouteChildren: RootRouteChildren = {
- LayoutRoute: LayoutRouteWithChildren,
- LoginRoute: LoginRoute,
- RecoverPasswordRoute: RecoverPasswordRoute,
- ResetPasswordRoute: ResetPasswordRoute,
- SignupRoute: SignupRoute,
-}
-export const routeTree = rootRouteImport
- ._addFileChildren(rootRouteChildren)
- ._addFileTypes()
diff --git a/frontend/src/routes/__root.tsx b/frontend/src/routes/__root.tsx
deleted file mode 100644
index 8644b83d05..0000000000
--- a/frontend/src/routes/__root.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { ReactQueryDevtools } from "@tanstack/react-query-devtools"
-import { createRootRoute, HeadContent, Outlet } from "@tanstack/react-router"
-import { TanStackRouterDevtools } from "@tanstack/react-router-devtools"
-import ErrorComponent from "@/components/Common/ErrorComponent"
-import NotFound from "@/components/Common/NotFound"
-
-export const Route = createRootRoute({
- component: () => (
- <>
-
-
-
-
- >
- ),
- notFoundComponent: () => ,
- errorComponent: () => ,
-})
diff --git a/frontend/src/routes/_layout.tsx b/frontend/src/routes/_layout.tsx
deleted file mode 100644
index 169730546e..0000000000
--- a/frontend/src/routes/_layout.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import { createFileRoute, Outlet, redirect } from "@tanstack/react-router"
-
-import { Footer } from "@/components/Common/Footer"
-import AppSidebar from "@/components/Sidebar/AppSidebar"
-import {
- SidebarInset,
- SidebarProvider,
- SidebarTrigger,
-} from "@/components/ui/sidebar"
-import { isLoggedIn } from "@/hooks/useAuth"
-
-export const Route = createFileRoute("/_layout")({
- component: Layout,
- beforeLoad: async () => {
- if (!isLoggedIn()) {
- throw redirect({
- to: "/login",
- })
- }
- },
-})
-
-function Layout() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default Layout
diff --git a/frontend/src/routes/_layout/admin.tsx b/frontend/src/routes/_layout/admin.tsx
deleted file mode 100644
index a53ff2c4e9..0000000000
--- a/frontend/src/routes/_layout/admin.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import { useSuspenseQuery } from "@tanstack/react-query"
-import { createFileRoute, redirect } from "@tanstack/react-router"
-import { Suspense } from "react"
-
-import { type UserPublic, UsersService } from "@/client"
-import AddUser from "@/components/Admin/AddUser"
-import { columns, type UserTableData } from "@/components/Admin/columns"
-import { DataTable } from "@/components/Common/DataTable"
-import PendingUsers from "@/components/Pending/PendingUsers"
-import useAuth from "@/hooks/useAuth"
-
-function getUsersQueryOptions() {
- return {
- queryFn: () => UsersService.readUsers({ skip: 0, limit: 100 }),
- queryKey: ["users"],
- }
-}
-
-export const Route = createFileRoute("/_layout/admin")({
- component: Admin,
- beforeLoad: async () => {
- const user = await UsersService.readUserMe()
- if (!user.is_superuser) {
- throw redirect({
- to: "/",
- })
- }
- },
- head: () => ({
- meta: [
- {
- title: "Admin - FastAPI Template",
- },
- ],
- }),
-})
-
-function UsersTableContent() {
- const { user: currentUser } = useAuth()
- const { data: users } = useSuspenseQuery(getUsersQueryOptions())
-
- const tableData: UserTableData[] = users.data.map((user: UserPublic) => ({
- ...user,
- isCurrentUser: currentUser?.id === user.id,
- }))
-
- return
-}
-
-function UsersTable() {
- return (
- }>
-
-
- )
-}
-
-function Admin() {
- return (
-
-
-
- Users
-
- Manage user accounts and permissions
-
-
-
-
-
-
- )
-}
diff --git a/frontend/src/routes/_layout/index.tsx b/frontend/src/routes/_layout/index.tsx
deleted file mode 100644
index 3e640cbbb8..0000000000
--- a/frontend/src/routes/_layout/index.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { createFileRoute } from "@tanstack/react-router"
-
-import useAuth from "@/hooks/useAuth"
-
-export const Route = createFileRoute("/_layout/")({
- component: Dashboard,
- head: () => ({
- meta: [
- {
- title: "Dashboard - FastAPI Template",
- },
- ],
- }),
-})
-
-function Dashboard() {
- const { user: currentUser } = useAuth()
-
- return (
-
-
-
- Hi, {currentUser?.full_name || currentUser?.email} π
-
-
- Welcome back, nice to see you again!!!
-
-
-
- )
-}
diff --git a/frontend/src/routes/_layout/items.tsx b/frontend/src/routes/_layout/items.tsx
deleted file mode 100644
index a4df200023..0000000000
--- a/frontend/src/routes/_layout/items.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import { useSuspenseQuery } from "@tanstack/react-query"
-import { createFileRoute } from "@tanstack/react-router"
-import { Search } from "lucide-react"
-import { Suspense } from "react"
-
-import { ItemsService } from "@/client"
-import { DataTable } from "@/components/Common/DataTable"
-import AddItem from "@/components/Items/AddItem"
-import { columns } from "@/components/Items/columns"
-import PendingItems from "@/components/Pending/PendingItems"
-
-function getItemsQueryOptions() {
- return {
- queryFn: () => ItemsService.readItems({ skip: 0, limit: 100 }),
- queryKey: ["items"],
- }
-}
-
-export const Route = createFileRoute("/_layout/items")({
- component: Items,
- head: () => ({
- meta: [
- {
- title: "Items - FastAPI Template",
- },
- ],
- }),
-})
-
-function ItemsTableContent() {
- const { data: items } = useSuspenseQuery(getItemsQueryOptions())
-
- if (items.data.length === 0) {
- return (
-
-
-
-
- You don't have any items yet
- Add a new item to get started
-
- )
- }
-
- return
-}
-
-function ItemsTable() {
- return (
- }>
-
-
- )
-}
-
-function Items() {
- return (
-
-
-
- Items
- Create and manage your items
-
-
-
-
-
- )
-}
diff --git a/frontend/src/routes/_layout/settings.tsx b/frontend/src/routes/_layout/settings.tsx
deleted file mode 100644
index e109b5ae81..0000000000
--- a/frontend/src/routes/_layout/settings.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import { createFileRoute } from "@tanstack/react-router"
-
-import ChangePassword from "@/components/UserSettings/ChangePassword"
-import DeleteAccount from "@/components/UserSettings/DeleteAccount"
-import UserInformation from "@/components/UserSettings/UserInformation"
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
-import useAuth from "@/hooks/useAuth"
-
-const tabsConfig = [
- { value: "my-profile", title: "My profile", component: UserInformation },
- { value: "password", title: "Password", component: ChangePassword },
- { value: "danger-zone", title: "Danger zone", component: DeleteAccount },
-]
-
-export const Route = createFileRoute("/_layout/settings")({
- component: UserSettings,
- head: () => ({
- meta: [
- {
- title: "Settings - FastAPI Template",
- },
- ],
- }),
-})
-
-function UserSettings() {
- const { user: currentUser } = useAuth()
- const finalTabs = currentUser?.is_superuser
- ? tabsConfig.slice(0, 3)
- : tabsConfig
-
- if (!currentUser) {
- return null
- }
-
- return (
-
-
- User Settings
-
- Manage your account settings and preferences
-
-
-
-
-
- {finalTabs.map((tab) => (
-
- {tab.title}
-
- ))}
-
- {finalTabs.map((tab) => (
-
-
-
- ))}
-
-
- )
-}
diff --git a/frontend/src/routes/login.tsx b/frontend/src/routes/login.tsx
deleted file mode 100644
index a1f83d7e5a..0000000000
--- a/frontend/src/routes/login.tsx
+++ /dev/null
@@ -1,142 +0,0 @@
-import { zodResolver } from "@hookform/resolvers/zod"
-import {
- createFileRoute,
- Link as RouterLink,
- redirect,
-} from "@tanstack/react-router"
-import { useForm } from "react-hook-form"
-import { z } from "zod"
-
-import type { Body_login_login_access_token as AccessToken } from "@/client"
-import { AuthLayout } from "@/components/Common/AuthLayout"
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@/components/ui/form"
-import { Input } from "@/components/ui/input"
-import { LoadingButton } from "@/components/ui/loading-button"
-import { PasswordInput } from "@/components/ui/password-input"
-import useAuth, { isLoggedIn } from "@/hooks/useAuth"
-
-const formSchema = z.object({
- username: z.email(),
- password: z
- .string()
- .min(1, { message: "Password is required" })
- .min(8, { message: "Password must be at least 8 characters" }),
-}) satisfies z.ZodType
-
-type FormData = z.infer
-
-export const Route = createFileRoute("/login")({
- component: Login,
- beforeLoad: async () => {
- if (isLoggedIn()) {
- throw redirect({
- to: "/",
- })
- }
- },
- head: () => ({
- meta: [
- {
- title: "Log In - FastAPI Template",
- },
- ],
- }),
-})
-
-function Login() {
- const { loginMutation } = useAuth()
- const form = useForm({
- resolver: zodResolver(formSchema),
- mode: "onBlur",
- criteriaMode: "all",
- defaultValues: {
- username: "",
- password: "",
- },
- })
-
- const onSubmit = (data: FormData) => {
- if (loginMutation.isPending) return
- loginMutation.mutate(data)
- }
-
- return (
-
-
-
-
- )
-}
diff --git a/frontend/src/routes/recover-password.tsx b/frontend/src/routes/recover-password.tsx
deleted file mode 100644
index 89ad59faff..0000000000
--- a/frontend/src/routes/recover-password.tsx
+++ /dev/null
@@ -1,130 +0,0 @@
-import { zodResolver } from "@hookform/resolvers/zod"
-import { useMutation } from "@tanstack/react-query"
-import {
- createFileRoute,
- Link as RouterLink,
- redirect,
-} from "@tanstack/react-router"
-import { useForm } from "react-hook-form"
-import { z } from "zod"
-
-import { LoginService } from "@/client"
-import { AuthLayout } from "@/components/Common/AuthLayout"
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@/components/ui/form"
-import { Input } from "@/components/ui/input"
-import { LoadingButton } from "@/components/ui/loading-button"
-import { isLoggedIn } from "@/hooks/useAuth"
-import useCustomToast from "@/hooks/useCustomToast"
-import { handleError } from "@/utils"
-
-const formSchema = z.object({
- email: z.email(),
-})
-
-type FormData = z.infer
-
-export const Route = createFileRoute("/recover-password")({
- component: RecoverPassword,
- beforeLoad: async () => {
- if (isLoggedIn()) {
- throw redirect({
- to: "/",
- })
- }
- },
- head: () => ({
- meta: [
- {
- title: "Recover Password - FastAPI Template",
- },
- ],
- }),
-})
-
-function RecoverPassword() {
- const form = useForm({
- resolver: zodResolver(formSchema),
- defaultValues: {
- email: "",
- },
- })
- const { showSuccessToast, showErrorToast } = useCustomToast()
-
- const recoverPassword = async (data: FormData) => {
- await LoginService.recoverPassword({
- email: data.email,
- })
- }
-
- const mutation = useMutation({
- mutationFn: recoverPassword,
- onSuccess: () => {
- showSuccessToast("Password recovery email sent successfully")
- form.reset()
- },
- onError: handleError.bind(showErrorToast),
- })
-
- const onSubmit = async (data: FormData) => {
- if (mutation.isPending) return
- mutation.mutate(data)
- }
-
- return (
-
-
-
-
- )
-}
diff --git a/frontend/src/routes/reset-password.tsx b/frontend/src/routes/reset-password.tsx
deleted file mode 100644
index b9d5562ad2..0000000000
--- a/frontend/src/routes/reset-password.tsx
+++ /dev/null
@@ -1,166 +0,0 @@
-import { zodResolver } from "@hookform/resolvers/zod"
-import { useMutation } from "@tanstack/react-query"
-import {
- createFileRoute,
- Link as RouterLink,
- redirect,
- useNavigate,
-} from "@tanstack/react-router"
-import { useForm } from "react-hook-form"
-import { z } from "zod"
-
-import { LoginService } from "@/client"
-import { AuthLayout } from "@/components/Common/AuthLayout"
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@/components/ui/form"
-import { LoadingButton } from "@/components/ui/loading-button"
-import { PasswordInput } from "@/components/ui/password-input"
-import { isLoggedIn } from "@/hooks/useAuth"
-import useCustomToast from "@/hooks/useCustomToast"
-import { handleError } from "@/utils"
-
-const searchSchema = z.object({
- token: z.string().catch(""),
-})
-
-const formSchema = z
- .object({
- new_password: z
- .string()
- .min(1, { message: "Password is required" })
- .min(8, { message: "Password must be at least 8 characters" }),
- confirm_password: z
- .string()
- .min(1, { message: "Password confirmation is required" }),
- })
- .refine((data) => data.new_password === data.confirm_password, {
- message: "The passwords don't match",
- path: ["confirm_password"],
- })
-
-type FormData = z.infer
-
-export const Route = createFileRoute("/reset-password")({
- component: ResetPassword,
- validateSearch: searchSchema,
- beforeLoad: async ({ search }) => {
- if (isLoggedIn()) {
- throw redirect({ to: "/" })
- }
- if (!search.token) {
- throw redirect({ to: "/login" })
- }
- },
- head: () => ({
- meta: [
- {
- title: "Reset Password - FastAPI Template",
- },
- ],
- }),
-})
-
-function ResetPassword() {
- const { token } = Route.useSearch()
- const { showSuccessToast, showErrorToast } = useCustomToast()
- const navigate = useNavigate()
-
- const form = useForm({
- resolver: zodResolver(formSchema),
- mode: "onBlur",
- criteriaMode: "all",
- defaultValues: {
- new_password: "",
- confirm_password: "",
- },
- })
-
- const mutation = useMutation({
- mutationFn: (data: { new_password: string; token: string }) =>
- LoginService.resetPassword({ requestBody: data }),
- onSuccess: () => {
- showSuccessToast("Password updated successfully")
- form.reset()
- navigate({ to: "/login" })
- },
- onError: handleError.bind(showErrorToast),
- })
-
- const onSubmit = (data: FormData) => {
- mutation.mutate({ new_password: data.new_password, token })
- }
-
- return (
-
-
-
-
- )
-}
diff --git a/frontend/src/routes/signup.tsx b/frontend/src/routes/signup.tsx
deleted file mode 100644
index 88c652c5b5..0000000000
--- a/frontend/src/routes/signup.tsx
+++ /dev/null
@@ -1,189 +0,0 @@
-import { zodResolver } from "@hookform/resolvers/zod"
-import {
- createFileRoute,
- Link as RouterLink,
- redirect,
-} from "@tanstack/react-router"
-import { useForm } from "react-hook-form"
-import { z } from "zod"
-import { AuthLayout } from "@/components/Common/AuthLayout"
-import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@/components/ui/form"
-import { Input } from "@/components/ui/input"
-import { LoadingButton } from "@/components/ui/loading-button"
-import { PasswordInput } from "@/components/ui/password-input"
-import useAuth, { isLoggedIn } from "@/hooks/useAuth"
-
-const formSchema = z
- .object({
- email: z.email(),
- full_name: z.string().min(1, { message: "Full Name is required" }),
- password: z
- .string()
- .min(1, { message: "Password is required" })
- .min(8, { message: "Password must be at least 8 characters" }),
- confirm_password: z
- .string()
- .min(1, { message: "Password confirmation is required" }),
- })
- .refine((data) => data.password === data.confirm_password, {
- message: "The passwords don't match",
- path: ["confirm_password"],
- })
-
-type FormData = z.infer
-
-export const Route = createFileRoute("/signup")({
- component: SignUp,
- beforeLoad: async () => {
- if (isLoggedIn()) {
- throw redirect({
- to: "/",
- })
- }
- },
- head: () => ({
- meta: [
- {
- title: "Sign Up - FastAPI Template",
- },
- ],
- }),
-})
-
-function SignUp() {
- const { signUpMutation } = useAuth()
- const form = useForm({
- resolver: zodResolver(formSchema),
- mode: "onBlur",
- criteriaMode: "all",
- defaultValues: {
- email: "",
- full_name: "",
- password: "",
- confirm_password: "",
- },
- })
-
- const onSubmit = (data: FormData) => {
- if (signUpMutation.isPending) return
-
- // exclude confirm_password from submission data
- const { confirm_password: _confirm_password, ...submitData } = data
- signUpMutation.mutate(submitData)
- }
-
- return (
-
-
-
-
- )
-}
-
-export default SignUp
diff --git a/frontend/src/utils.ts b/frontend/src/utils.ts
deleted file mode 100644
index fa491eb2f4..0000000000
--- a/frontend/src/utils.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { AxiosError } from "axios"
-import type { ApiError } from "./client"
-
-function extractErrorMessage(err: ApiError): string {
- if (err instanceof AxiosError) {
- return err.message
- }
-
- const errDetail = (err.body as any)?.detail
- if (Array.isArray(errDetail) && errDetail.length > 0) {
- return errDetail[0].msg
- }
- return errDetail || "Something went wrong."
-}
-
-export const handleError = function (
- this: (msg: string) => void,
- err: ApiError,
-) {
- const errorMessage = extractErrorMessage(err)
- this(errorMessage)
-}
-
-export const getInitials = (name: string): string => {
- return name
- .split(" ")
- .slice(0, 2)
- .map((word) => word[0])
- .join("")
- .toUpperCase()
-}
diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts
deleted file mode 100644
index b54b4c9828..0000000000
--- a/frontend/src/vite-env.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-///
-
-interface ImportMetaEnv {
- readonly VITE_API_URL: string
-}
-
-interface ImportMeta {
- readonly env: ImportMetaEnv
-}
diff --git a/frontend/tests/admin.spec.ts b/frontend/tests/admin.spec.ts
deleted file mode 100644
index cd73dbad5c..0000000000
--- a/frontend/tests/admin.spec.ts
+++ /dev/null
@@ -1,205 +0,0 @@
-import { expect, test } from "@playwright/test"
-import { firstSuperuser, firstSuperuserPassword } from "./config.ts"
-import { createUser } from "./utils/privateApi"
-import { randomEmail, randomPassword } from "./utils/random"
-import { logInUser } from "./utils/user"
-
-test("Admin page is accessible and shows correct title", async ({ page }) => {
- await page.goto("/admin")
- await expect(page.getByRole("heading", { name: "Users" })).toBeVisible()
- await expect(
- page.getByText("Manage user accounts and permissions"),
- ).toBeVisible()
-})
-
-test("Add User button is visible", async ({ page }) => {
- await page.goto("/admin")
- await expect(page.getByRole("button", { name: "Add User" })).toBeVisible()
-})
-
-test.describe("Admin user management", () => {
- test("Create a new user successfully", async ({ page }) => {
- await page.goto("/admin")
-
- const email = randomEmail()
- const password = randomPassword()
- const fullName = "Test User Admin"
-
- await page.getByRole("button", { name: "Add User" }).click()
-
- await page.getByPlaceholder("Email").fill(email)
- await page.getByPlaceholder("Full name").fill(fullName)
- await page.getByPlaceholder("Password").first().fill(password)
- await page.getByPlaceholder("Password").last().fill(password)
-
- await page.getByRole("button", { name: "Save" }).click()
-
- await expect(page.getByText("User created successfully")).toBeVisible()
-
- await expect(page.getByRole("dialog")).not.toBeVisible()
-
- const userRow = page.getByRole("row").filter({ hasText: email })
- await expect(userRow).toBeVisible()
- })
-
- test("Create a superuser", async ({ page }) => {
- await page.goto("/admin")
-
- const email = randomEmail()
- const password = randomPassword()
-
- await page.getByRole("button", { name: "Add User" }).click()
-
- await page.getByPlaceholder("Email").fill(email)
- await page.getByPlaceholder("Password").first().fill(password)
- await page.getByPlaceholder("Password").last().fill(password)
- await page.getByLabel("Is superuser?").check()
- await page.getByLabel("Is active?").check()
-
- await page.getByRole("button", { name: "Save" }).click()
-
- await expect(page.getByText("User created successfully")).toBeVisible()
-
- await expect(page.getByRole("dialog")).not.toBeVisible()
-
- const userRow = page.getByRole("row").filter({ hasText: email })
- await expect(userRow.getByText("Superuser")).toBeVisible()
- })
-
- test("Edit a user successfully", async ({ page }) => {
- await page.goto("/admin")
-
- const email = randomEmail()
- const password = randomPassword()
- const originalName = "Original Name"
- const updatedName = "Updated Name"
-
- await page.getByRole("button", { name: "Add User" }).click()
- await page.getByPlaceholder("Email").fill(email)
- await page.getByPlaceholder("Full name").fill(originalName)
- await page.getByPlaceholder("Password").first().fill(password)
- await page.getByPlaceholder("Password").last().fill(password)
- await page.getByRole("button", { name: "Save" }).click()
-
- await expect(page.getByText("User created successfully")).toBeVisible()
- await expect(page.getByRole("dialog")).not.toBeVisible()
-
- const userRow = page.getByRole("row").filter({ hasText: email })
- await userRow.getByRole("button").click()
-
- await page.getByRole("menuitem", { name: "Edit User" }).click()
-
- await page.getByPlaceholder("Full name").fill(updatedName)
- await page.getByRole("button", { name: "Save" }).click()
-
- await expect(page.getByText("User updated successfully")).toBeVisible()
- await expect(page.getByText(updatedName)).toBeVisible()
- })
-
- test("Delete a user successfully", async ({ page }) => {
- await page.goto("/admin")
-
- const email = randomEmail()
- const password = randomPassword()
-
- await page.getByRole("button", { name: "Add User" }).click()
- await page.getByPlaceholder("Email").fill(email)
- await page.getByPlaceholder("Password").first().fill(password)
- await page.getByPlaceholder("Password").last().fill(password)
- await page.getByRole("button", { name: "Save" }).click()
-
- await expect(page.getByText("User created successfully")).toBeVisible()
-
- await expect(page.getByRole("dialog")).not.toBeVisible()
-
- const userRow = page.getByRole("row").filter({ hasText: email })
- await userRow.getByRole("button").click()
-
- await page.getByRole("menuitem", { name: "Delete User" }).click()
-
- await page.getByRole("button", { name: "Delete" }).click()
-
- await expect(
- page.getByText("The user was deleted successfully"),
- ).toBeVisible()
-
- await expect(
- page.getByRole("row").filter({ hasText: email }),
- ).not.toBeVisible()
- })
-
- test("Cancel user creation", async ({ page }) => {
- await page.goto("/admin")
-
- await page.getByRole("button", { name: "Add User" }).click()
- await page.getByPlaceholder("Email").fill("test@example.com")
-
- await page.getByRole("button", { name: "Cancel" }).click()
-
- await expect(page.getByRole("dialog")).not.toBeVisible()
- })
-
- test("Email is required and must be valid", async ({ page }) => {
- await page.goto("/admin")
-
- await page.getByRole("button", { name: "Add User" }).click()
-
- await page.getByPlaceholder("Email").fill("invalid-email")
- await page.getByPlaceholder("Email").blur()
-
- await expect(page.getByText("Invalid email address")).toBeVisible()
- })
-
- test("Password must be at least 8 characters", async ({ page }) => {
- await page.goto("/admin")
-
- await page.getByRole("button", { name: "Add User" }).click()
-
- await page.getByPlaceholder("Email").fill(randomEmail())
- await page.getByPlaceholder("Password").first().fill("short")
- await page.getByPlaceholder("Password").last().fill("short")
- await page.getByRole("button", { name: "Save" }).click()
-
- await expect(
- page.getByText("Password must be at least 8 characters"),
- ).toBeVisible()
- })
-
- test("Passwords must match", async ({ page }) => {
- await page.goto("/admin")
-
- await page.getByRole("button", { name: "Add User" }).click()
-
- await page.getByPlaceholder("Email").fill(randomEmail())
- await page.getByPlaceholder("Password").first().fill(randomPassword())
- await page.getByPlaceholder("Password").last().fill("different12345")
- await page.getByPlaceholder("Password").last().blur()
-
- await expect(page.getByText("The passwords don't match")).toBeVisible()
- })
-})
-
-test.describe("Admin page access control", () => {
- test.use({ storageState: { cookies: [], origins: [] } })
-
- test("Non-superuser cannot access admin page", async ({ page }) => {
- const email = randomEmail()
- const password = randomPassword()
-
- await createUser({ email, password })
- await logInUser(page, email, password)
-
- await page.goto("/admin")
-
- await expect(page.getByRole("heading", { name: "Users" })).not.toBeVisible()
- await expect(page).not.toHaveURL(/\/admin/)
- })
-
- test("Superuser can access admin page", async ({ page }) => {
- await logInUser(page, firstSuperuser, firstSuperuserPassword)
-
- await page.goto("/admin")
-
- await expect(page.getByRole("heading", { name: "Users" })).toBeVisible()
- })
-})
diff --git a/frontend/tests/auth.setup.ts b/frontend/tests/auth.setup.ts
deleted file mode 100644
index ba948af252..0000000000
--- a/frontend/tests/auth.setup.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { test as setup } from "@playwright/test"
-import { firstSuperuser, firstSuperuserPassword } from "./config.ts"
-
-const authFile = "playwright/.auth/user.json"
-
-setup("authenticate", async ({ page }) => {
- await page.goto("/login")
- await page.getByTestId("email-input").fill(firstSuperuser)
- await page.getByTestId("password-input").fill(firstSuperuserPassword)
- await page.getByRole("button", { name: "Log In" }).click()
- await page.waitForURL("/")
- await page.context().storageState({ path: authFile })
-})
diff --git a/frontend/tests/config.ts b/frontend/tests/config.ts
deleted file mode 100644
index 572dec9545..0000000000
--- a/frontend/tests/config.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import path from "node:path"
-import { fileURLToPath } from "node:url"
-import dotenv from "dotenv"
-
-const __filename = fileURLToPath(import.meta.url)
-const __dirname = path.dirname(__filename)
-
-dotenv.config({ path: path.join(__dirname, "../../.env") })
-
-function getEnvVar(name: string): string {
- const value = process.env[name]
- if (!value) {
- throw new Error(`Environment variable ${name} is undefined`)
- }
- return value
-}
-
-export const firstSuperuser = getEnvVar("FIRST_SUPERUSER")
-export const firstSuperuserPassword = getEnvVar("FIRST_SUPERUSER_PASSWORD")
diff --git a/frontend/tests/items.spec.ts b/frontend/tests/items.spec.ts
deleted file mode 100644
index 5a437314db..0000000000
--- a/frontend/tests/items.spec.ts
+++ /dev/null
@@ -1,132 +0,0 @@
-import { expect, test } from "@playwright/test"
-import { createUser } from "./utils/privateApi"
-import {
- randomEmail,
- randomItemDescription,
- randomItemTitle,
- randomPassword,
-} from "./utils/random"
-import { logInUser } from "./utils/user"
-
-test("Items page is accessible and shows correct title", async ({ page }) => {
- await page.goto("/items")
- await expect(page.getByRole("heading", { name: "Items" })).toBeVisible()
- await expect(page.getByText("Create and manage your items")).toBeVisible()
-})
-
-test("Add Item button is visible", async ({ page }) => {
- await page.goto("/items")
- await expect(page.getByRole("button", { name: "Add Item" })).toBeVisible()
-})
-
-test.describe("Items management", () => {
- test.use({ storageState: { cookies: [], origins: [] } })
- let email: string
- const password = randomPassword()
-
- test.beforeAll(async () => {
- email = randomEmail()
- await createUser({ email, password })
- })
-
- test.beforeEach(async ({ page }) => {
- await logInUser(page, email, password)
- await page.goto("/items")
- })
-
- test("Create a new item successfully", async ({ page }) => {
- const title = randomItemTitle()
- const description = randomItemDescription()
-
- await page.getByRole("button", { name: "Add Item" }).click()
- await page.getByLabel("Title").fill(title)
- await page.getByLabel("Description").fill(description)
- await page.getByRole("button", { name: "Save" }).click()
-
- await expect(page.getByText("Item created successfully")).toBeVisible()
- await expect(page.getByText(title)).toBeVisible()
- })
-
- test("Create item with only required fields", async ({ page }) => {
- const title = randomItemTitle()
-
- await page.getByRole("button", { name: "Add Item" }).click()
- await page.getByLabel("Title").fill(title)
- await page.getByRole("button", { name: "Save" }).click()
-
- await expect(page.getByText("Item created successfully")).toBeVisible()
- await expect(page.getByText(title)).toBeVisible()
- })
-
- test("Cancel item creation", async ({ page }) => {
- await page.getByRole("button", { name: "Add Item" }).click()
- await page.getByLabel("Title").fill("Test Item")
- await page.getByRole("button", { name: "Cancel" }).click()
-
- await expect(page.getByRole("dialog")).not.toBeVisible()
- })
-
- test("Title is required", async ({ page }) => {
- await page.getByRole("button", { name: "Add Item" }).click()
- await page.getByLabel("Title").fill("")
- await page.getByLabel("Title").blur()
-
- await expect(page.getByText("Title is required")).toBeVisible()
- })
-
- test.describe("Edit and Delete", () => {
- let itemTitle: string
-
- test.beforeEach(async ({ page }) => {
- itemTitle = randomItemTitle()
-
- await page.getByRole("button", { name: "Add Item" }).click()
- await page.getByLabel("Title").fill(itemTitle)
- await page.getByRole("button", { name: "Save" }).click()
- await expect(page.getByText("Item created successfully")).toBeVisible()
- await expect(page.getByRole("dialog")).not.toBeVisible()
- })
-
- test("Edit an item successfully", async ({ page }) => {
- const itemRow = page.getByRole("row").filter({ hasText: itemTitle })
- await itemRow.getByRole("button").last().click()
- await page.getByRole("menuitem", { name: "Edit Item" }).click()
-
- const updatedTitle = randomItemTitle()
- await page.getByLabel("Title").fill(updatedTitle)
- await page.getByRole("button", { name: "Save" }).click()
-
- await expect(page.getByText("Item updated successfully")).toBeVisible()
- await expect(page.getByText(updatedTitle)).toBeVisible()
- })
-
- test("Delete an item successfully", async ({ page }) => {
- const itemRow = page.getByRole("row").filter({ hasText: itemTitle })
- await itemRow.getByRole("button").last().click()
- await page.getByRole("menuitem", { name: "Delete Item" }).click()
-
- await page.getByRole("button", { name: "Delete" }).click()
-
- await expect(
- page.getByText("The item was deleted successfully"),
- ).toBeVisible()
- await expect(page.getByText(itemTitle)).not.toBeVisible()
- })
- })
-})
-
-test.describe("Items empty state", () => {
- test.use({ storageState: { cookies: [], origins: [] } })
-
- test("Shows empty state message when no items exist", async ({ page }) => {
- const email = randomEmail()
- const password = randomPassword()
- await createUser({ email, password })
- await logInUser(page, email, password)
-
- await page.goto("/items")
-
- await expect(page.getByText("You don't have any items yet")).toBeVisible()
- await expect(page.getByText("Add a new item to get started")).toBeVisible()
- })
-})
diff --git a/frontend/tests/login.spec.ts b/frontend/tests/login.spec.ts
deleted file mode 100644
index 8072ddc1fa..0000000000
--- a/frontend/tests/login.spec.ts
+++ /dev/null
@@ -1,117 +0,0 @@
-import { expect, type Page, test } from "@playwright/test"
-import { firstSuperuser, firstSuperuserPassword } from "./config.ts"
-import { randomPassword } from "./utils/random.ts"
-
-test.use({ storageState: { cookies: [], origins: [] } })
-
-const fillForm = async (page: Page, email: string, password: string) => {
- await page.getByTestId("email-input").fill(email)
- await page.getByTestId("password-input").fill(password)
-}
-
-const verifyInput = async (page: Page, testId: string) => {
- const input = page.getByTestId(testId)
- await expect(input).toBeVisible()
- await expect(input).toHaveText("")
- await expect(input).toBeEditable()
-}
-
-test("Inputs are visible, empty and editable", async ({ page }) => {
- await page.goto("/login")
-
- await verifyInput(page, "email-input")
- await verifyInput(page, "password-input")
-})
-
-test("Log In button is visible", async ({ page }) => {
- await page.goto("/login")
-
- await expect(page.getByRole("button", { name: "Log In" })).toBeVisible()
-})
-
-test("Forgot Password link is visible", async ({ page }) => {
- await page.goto("/login")
-
- await expect(
- page.getByRole("link", { name: "Forgot your password?" }),
- ).toBeVisible()
-})
-
-test("Log in with valid email and password ", async ({ page }) => {
- await page.goto("/login")
-
- await fillForm(page, firstSuperuser, firstSuperuserPassword)
- await page.getByRole("button", { name: "Log In" }).click()
-
- await page.waitForURL("/")
-
- await expect(
- page.getByText("Welcome back, nice to see you again!"),
- ).toBeVisible()
-})
-
-test("Log in with invalid email", async ({ page }) => {
- await page.goto("/login")
-
- await fillForm(page, "invalidemail", firstSuperuserPassword)
- await page.getByRole("button", { name: "Log In" }).click()
-
- await expect(page.getByText("Invalid email address")).toBeVisible()
-})
-
-test("Log in with invalid password", async ({ page }) => {
- const password = randomPassword()
-
- await page.goto("/login")
- await fillForm(page, firstSuperuser, password)
- await page.getByRole("button", { name: "Log In" }).click()
-
- await expect(page.getByText("Incorrect email or password")).toBeVisible()
-})
-
-test("Successful log out", async ({ page }) => {
- await page.goto("/login")
-
- await fillForm(page, firstSuperuser, firstSuperuserPassword)
- await page.getByRole("button", { name: "Log In" }).click()
-
- await page.waitForURL("/")
-
- await expect(
- page.getByText("Welcome back, nice to see you again!"),
- ).toBeVisible()
-
- await page.getByTestId("user-menu").click()
- await page.getByRole("menuitem", { name: "Log out" }).click()
- await page.waitForURL("/login")
-})
-
-test("Logged-out user cannot access protected routes", async ({ page }) => {
- await page.goto("/login")
-
- await fillForm(page, firstSuperuser, firstSuperuserPassword)
- await page.getByRole("button", { name: "Log In" }).click()
-
- await page.waitForURL("/")
-
- await expect(
- page.getByText("Welcome back, nice to see you again!"),
- ).toBeVisible()
-
- await page.getByTestId("user-menu").click()
- await page.getByRole("menuitem", { name: "Log out" }).click()
- await page.waitForURL("/login")
-
- await page.goto("/settings")
- await page.waitForURL("/login")
-})
-
-test("Redirects to /login when token is wrong", async ({ page }) => {
- await page.goto("/settings")
- await page.evaluate(() => {
- localStorage.setItem("access_token", "invalid_token")
- })
- await page.goto("/settings")
- await page.waitForURL("/login")
- await expect(page).toHaveURL("/login")
-})
diff --git a/frontend/tests/reset-password.spec.ts b/frontend/tests/reset-password.spec.ts
deleted file mode 100644
index 88a2fc277c..0000000000
--- a/frontend/tests/reset-password.spec.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-import { expect, test } from "@playwright/test"
-import { findLastEmail } from "./utils/mailcatcher"
-import { randomEmail, randomPassword } from "./utils/random"
-import { logInUser, signUpNewUser } from "./utils/user"
-
-test.use({ storageState: { cookies: [], origins: [] } })
-
-test("Password Recovery title is visible", async ({ page }) => {
- await page.goto("/recover-password")
-
- await expect(
- page.getByRole("heading", { name: "Password Recovery" }),
- ).toBeVisible()
-})
-
-test("Input is visible, empty and editable", async ({ page }) => {
- await page.goto("/recover-password")
-
- await expect(page.getByTestId("email-input")).toBeVisible()
- await expect(page.getByTestId("email-input")).toHaveText("")
- await expect(page.getByTestId("email-input")).toBeEditable()
-})
-
-test("Continue button is visible", async ({ page }) => {
- await page.goto("/recover-password")
-
- await expect(page.getByRole("button", { name: "Continue" })).toBeVisible()
-})
-
-test("User can reset password successfully using the link", async ({
- page,
- request,
-}) => {
- const fullName = "Test User"
- const email = randomEmail()
- const password = randomPassword()
- const newPassword = randomPassword()
-
- // Sign up a new user
- await signUpNewUser(page, fullName, email, password)
-
- await page.goto("/recover-password")
- await page.getByTestId("email-input").fill(email)
-
- await page.getByRole("button", { name: "Continue" }).click()
-
- const emailData = await findLastEmail({
- request,
- filter: (e) => e.recipients.includes(`<${email}>`),
- timeout: 5000,
- })
-
- await page.goto(
- `${process.env.MAILCATCHER_HOST}/messages/${emailData.id}.html`,
- )
-
- const selector = 'a[href*="/reset-password?token="]'
-
- let url = await page.getAttribute(selector, "href")
-
- // TODO: update var instead of doing a replace
- url = url!.replace("http://localhost/", "http://localhost:5173/")
-
- // Set the new password and confirm it
- await page.goto(url)
-
- await page.getByTestId("new-password-input").fill(newPassword)
- await page.getByTestId("confirm-password-input").fill(newPassword)
- await page.getByRole("button", { name: "Reset Password" }).click()
- await expect(page.getByText("Password updated successfully")).toBeVisible()
-
- // Check if the user is able to login with the new password
- await logInUser(page, email, newPassword)
-})
-
-test("Expired or invalid reset link", async ({ page }) => {
- const password = randomPassword()
- const invalidUrl = "/reset-password?token=invalidtoken"
-
- await page.goto(invalidUrl)
-
- await page.getByTestId("new-password-input").fill(password)
- await page.getByTestId("confirm-password-input").fill(password)
- await page.getByRole("button", { name: "Reset Password" }).click()
-
- await expect(page.getByText("Invalid token")).toBeVisible()
-})
-
-test("Weak new password validation", async ({ page, request }) => {
- const fullName = "Test User"
- const email = randomEmail()
- const password = randomPassword()
- const weakPassword = "123"
-
- // Sign up a new user
- await signUpNewUser(page, fullName, email, password)
-
- await page.goto("/recover-password")
- await page.getByTestId("email-input").fill(email)
- await page.getByRole("button", { name: "Continue" }).click()
-
- const emailData = await findLastEmail({
- request,
- filter: (e) => e.recipients.includes(`<${email}>`),
- timeout: 5000,
- })
-
- await page.goto(
- `${process.env.MAILCATCHER_HOST}/messages/${emailData.id}.html`,
- )
-
- const selector = 'a[href*="/reset-password?token="]'
- let url = await page.getAttribute(selector, "href")
- url = url!.replace("http://localhost/", "http://localhost:5173/")
-
- // Set a weak new password
- await page.goto(url)
- await page.getByTestId("new-password-input").fill(weakPassword)
- await page.getByTestId("confirm-password-input").fill(weakPassword)
- await page.getByRole("button", { name: "Reset Password" }).click()
-
- await expect(
- page.getByText("Password must be at least 8 characters"),
- ).toBeVisible()
-})
diff --git a/frontend/tests/sign-up.spec.ts b/frontend/tests/sign-up.spec.ts
deleted file mode 100644
index 2a09e7c935..0000000000
--- a/frontend/tests/sign-up.spec.ts
+++ /dev/null
@@ -1,159 +0,0 @@
-import { expect, type Page, test } from "@playwright/test"
-
-import { randomEmail, randomPassword } from "./utils/random"
-
-test.use({ storageState: { cookies: [], origins: [] } })
-
-const fillForm = async (
- page: Page,
- full_name: string,
- email: string,
- password: string,
- confirm_password: string,
-) => {
- await page.getByTestId("full-name-input").fill(full_name)
- await page.getByTestId("email-input").fill(email)
- await page.getByTestId("password-input").fill(password)
- await page.getByTestId("confirm-password-input").fill(confirm_password)
-}
-
-const verifyInput = async (page: Page, testId: string) => {
- const input = page.getByTestId(testId)
- await expect(input).toBeVisible()
- await expect(input).toHaveText("")
- await expect(input).toBeEditable()
-}
-
-test("Inputs are visible, empty and editable", async ({ page }) => {
- await page.goto("/signup")
-
- await verifyInput(page, "full-name-input")
- await verifyInput(page, "email-input")
- await verifyInput(page, "password-input")
- await verifyInput(page, "confirm-password-input")
-})
-
-test("Sign Up button is visible", async ({ page }) => {
- await page.goto("/signup")
-
- await expect(page.getByRole("button", { name: "Sign Up" })).toBeVisible()
-})
-
-test("Log In link is visible", async ({ page }) => {
- await page.goto("/signup")
-
- await expect(page.getByRole("link", { name: "Log In" })).toBeVisible()
-})
-
-test("Sign up with valid name, email, and password", async ({ page }) => {
- const full_name = "Test User"
- const email = randomEmail()
- const password = randomPassword()
-
- await page.goto("/signup")
- await fillForm(page, full_name, email, password, password)
- await page.getByRole("button", { name: "Sign Up" }).click()
-})
-
-test("Sign up with invalid email", async ({ page }) => {
- await page.goto("/signup")
-
- await fillForm(
- page,
- "Playwright Test",
- "invalid-email",
- "changethis",
- "changethis",
- )
- await page.getByRole("button", { name: "Sign Up" }).click()
-
- await expect(page.getByText("Invalid email address")).toBeVisible()
-})
-
-test("Sign up with existing email", async ({ page }) => {
- const fullName = "Test User"
- const email = randomEmail()
- const password = randomPassword()
-
- await page.goto("/signup")
-
- await fillForm(page, fullName, email, password, password)
- await page.getByRole("button", { name: "Sign Up" }).click()
-
- await page.goto("/signup")
-
- await fillForm(page, fullName, email, password, password)
- await page.getByRole("button", { name: "Sign Up" }).click()
-
- await page
- .getByText("The user with this email already exists in the system")
- .click()
-})
-
-test("Sign up with weak password", async ({ page }) => {
- const fullName = "Test User"
- const email = randomEmail()
- const password = "weak"
-
- await page.goto("/signup")
-
- await fillForm(page, fullName, email, password, password)
- await page.getByRole("button", { name: "Sign Up" }).click()
-
- await expect(
- page.getByText("Password must be at least 8 characters"),
- ).toBeVisible()
-})
-
-test("Sign up with mismatched passwords", async ({ page }) => {
- const fullName = "Test User"
- const email = randomEmail()
- const password = randomPassword()
- const password2 = randomPassword()
-
- await page.goto("/signup")
-
- await fillForm(page, fullName, email, password, password2)
- await page.getByRole("button", { name: "Sign Up" }).click()
-
- await expect(page.getByText("The passwords don't match")).toBeVisible()
-})
-
-test("Sign up with missing full name", async ({ page }) => {
- const fullName = ""
- const email = randomEmail()
- const password = randomPassword()
-
- await page.goto("/signup")
-
- await fillForm(page, fullName, email, password, password)
- await page.getByRole("button", { name: "Sign Up" }).click()
-
- await expect(page.getByText("Full Name is required")).toBeVisible()
-})
-
-test("Sign up with missing email", async ({ page }) => {
- const fullName = "Test User"
- const email = ""
- const password = randomPassword()
-
- await page.goto("/signup")
-
- await fillForm(page, fullName, email, password, password)
- await page.getByRole("button", { name: "Sign Up" }).click()
-
- await expect(page.getByText("Invalid email address")).toBeVisible()
-})
-
-test("Sign up with missing password", async ({ page }) => {
- const fullName = ""
- const email = randomEmail()
- const password = ""
-
- await page.goto("/signup")
-
- await fillForm(page, fullName, email, password, password)
- await page.getByRole("button", { name: "Sign Up" }).click()
-
- await expect(page.getByText("Password is required")).toBeVisible()
-})
diff --git a/frontend/tests/user-settings.spec.ts b/frontend/tests/user-settings.spec.ts
deleted file mode 100644
index 533ebb6207..0000000000
--- a/frontend/tests/user-settings.spec.ts
+++ /dev/null
@@ -1,256 +0,0 @@
-import { expect, test } from "@playwright/test"
-import { firstSuperuser, firstSuperuserPassword } from "./config.ts"
-import { createUser } from "./utils/privateApi.ts"
-import { randomEmail, randomPassword } from "./utils/random"
-import { logInUser, logOutUser } from "./utils/user"
-
-const tabs = ["My profile", "Password", "Danger zone"]
-
-test("My profile tab is active by default", async ({ page }) => {
- await page.goto("/settings")
- await expect(page.getByRole("tab", { name: "My profile" })).toHaveAttribute(
- "aria-selected",
- "true",
- )
-})
-
-test("All tabs are visible", async ({ page }) => {
- await page.goto("/settings")
- for (const tab of tabs) {
- await expect(page.getByRole("tab", { name: tab })).toBeVisible()
- }
-})
-
-test.describe("Edit user profile", () => {
- test.use({ storageState: { cookies: [], origins: [] } })
- let email: string
- let password: string
-
- test.beforeAll(async () => {
- email = randomEmail()
- password = randomPassword()
- await createUser({ email, password })
- })
-
- test.beforeEach(async ({ page }) => {
- await logInUser(page, email, password)
- await page.goto("/settings")
- await page.getByRole("tab", { name: "My profile" }).click()
- })
-
- test("Edit user name with a valid name", async ({ page }) => {
- const updatedName = "Test User 2"
-
- await page.getByRole("button", { name: "Edit" }).click()
- await page.getByLabel("Full name").fill(updatedName)
- await page.getByRole("button", { name: "Save" }).click()
-
- await expect(page.getByText("User updated successfully")).toBeVisible()
- await expect(
- page.locator("form").getByText(updatedName, { exact: true }),
- ).toBeVisible()
- })
-
- test("Edit user email with an invalid email shows error", async ({
- page,
- }) => {
- await page.getByRole("button", { name: "Edit" }).click()
- await page.getByLabel("Email").fill("")
- await page.locator("body").click()
-
- await expect(page.getByText("Invalid email address")).toBeVisible()
- })
-})
-
-test.describe("Edit user email", () => {
- test.use({ storageState: { cookies: [], origins: [] } })
-
- test("Edit user email with a valid email", async ({ page }) => {
- const email = randomEmail()
- const password = randomPassword()
- const updatedEmail = randomEmail()
-
- await createUser({ email, password })
- await logInUser(page, email, password)
- await page.goto("/settings")
- await page.getByRole("tab", { name: "My profile" }).click()
-
- await page.getByRole("button", { name: "Edit" }).click()
- await page.getByLabel("Email").fill(updatedEmail)
- await page.getByRole("button", { name: "Save" }).click()
-
- await expect(page.getByText("User updated successfully")).toBeVisible()
- await expect(
- page.locator("form").getByText(updatedEmail, { exact: true }),
- ).toBeVisible()
- })
-})
-
-test.describe("Cancel edit actions", () => {
- test.use({ storageState: { cookies: [], origins: [] } })
-
- test("Cancel edit action restores original name", async ({ page }) => {
- const email = randomEmail()
- const password = randomPassword()
- const user = await createUser({ email, password })
-
- await logInUser(page, email, password)
- await page.goto("/settings")
- await page.getByRole("tab", { name: "My profile" }).click()
- await page.getByRole("button", { name: "Edit" }).click()
- await page.getByLabel("Full name").fill("Test User")
- await page.getByRole("button", { name: "Cancel" }).first().click()
-
- await expect(
- page.locator("form").getByText(user.full_name as string, { exact: true }),
- ).toBeVisible()
- })
-
- test("Cancel edit action restores original email", async ({ page }) => {
- const email = randomEmail()
- const password = randomPassword()
- await createUser({ email, password })
-
- await logInUser(page, email, password)
- await page.goto("/settings")
- await page.getByRole("tab", { name: "My profile" }).click()
- await page.getByRole("button", { name: "Edit" }).click()
- await page.getByLabel("Email").fill(randomEmail())
- await page.getByRole("button", { name: "Cancel" }).first().click()
-
- await expect(
- page.locator("form").getByText(email, { exact: true }),
- ).toBeVisible()
- })
-})
-
-test.describe("Change password", () => {
- test.use({ storageState: { cookies: [], origins: [] } })
-
- test("Update password successfully", async ({ page }) => {
- const email = randomEmail()
- const password = randomPassword()
- const newPassword = randomPassword()
-
- await createUser({ email, password })
- await logInUser(page, email, password)
-
- await page.goto("/settings")
- await page.getByRole("tab", { name: "Password" }).click()
- await page.getByTestId("current-password-input").fill(password)
- await page.getByTestId("new-password-input").fill(newPassword)
- await page.getByTestId("confirm-password-input").fill(newPassword)
- await page.getByRole("button", { name: "Update Password" }).click()
-
- await expect(page.getByText("Password updated successfully")).toBeVisible()
-
- await logOutUser(page)
- await logInUser(page, email, newPassword)
- })
-})
-
-test.describe("Change password validation", () => {
- test.use({ storageState: { cookies: [], origins: [] } })
- let email: string
- let password: string
-
- test.beforeAll(async () => {
- email = randomEmail()
- password = randomPassword()
- await createUser({ email, password })
- })
-
- test.beforeEach(async ({ page }) => {
- await logInUser(page, email, password)
- await page.goto("/settings")
- await page.getByRole("tab", { name: "Password" }).click()
- })
-
- test("Update password with weak passwords", async ({ page }) => {
- const weakPassword = "weak"
-
- await page.getByTestId("current-password-input").fill(password)
- await page.getByTestId("new-password-input").fill(weakPassword)
- await page.getByTestId("confirm-password-input").fill(weakPassword)
- await page.getByRole("button", { name: "Update Password" }).click()
-
- await expect(
- page.getByText("Password must be at least 8 characters"),
- ).toBeVisible()
- })
-
- test("New password and confirmation password do not match", async ({
- page,
- }) => {
- await page.getByTestId("current-password-input").fill(password)
- await page.getByTestId("new-password-input").fill(randomPassword())
- await page.getByTestId("confirm-password-input").fill(randomPassword())
- await page.getByRole("button", { name: "Update Password" }).click()
-
- await expect(page.getByText("The passwords don't match")).toBeVisible()
- })
-
- test("Current password and new password are the same", async ({ page }) => {
- await page.getByTestId("current-password-input").fill(password)
- await page.getByTestId("new-password-input").fill(password)
- await page.getByTestId("confirm-password-input").fill(password)
- await page.getByRole("button", { name: "Update Password" }).click()
-
- await expect(
- page.getByText("New password cannot be the same as the current one"),
- ).toBeVisible()
- })
-})
-
-test("Appearance button is visible in sidebar", async ({ page }) => {
- await page.goto("/settings")
- await expect(page.getByTestId("theme-button")).toBeVisible()
-})
-
-test("User can switch between theme modes", async ({ page }) => {
- await page.goto("/settings")
-
- await page.getByTestId("theme-button").click()
- await page.getByTestId("dark-mode").click()
- await expect(page.locator("html")).toHaveClass(/dark/)
-
- await expect(page.getByTestId("dark-mode")).not.toBeVisible()
-
- await page.getByTestId("theme-button").click()
- await page.getByTestId("light-mode").click()
- await expect(page.locator("html")).toHaveClass(/light/)
-})
-
-test("Selected mode is preserved across sessions", async ({ page }) => {
- await page.goto("/settings")
-
- await page.getByTestId("theme-button").click()
- if (
- await page.evaluate(() =>
- document.documentElement.classList.contains("dark"),
- )
- ) {
- await page.getByTestId("light-mode").click()
- await page.getByTestId("theme-button").click()
- }
-
- const isLightMode = await page.evaluate(() =>
- document.documentElement.classList.contains("light"),
- )
- expect(isLightMode).toBe(true)
-
- await page.getByTestId("theme-button").click()
- await page.getByTestId("dark-mode").click()
- let isDarkMode = await page.evaluate(() =>
- document.documentElement.classList.contains("dark"),
- )
- expect(isDarkMode).toBe(true)
-
- await logOutUser(page)
- await logInUser(page, firstSuperuser, firstSuperuserPassword)
-
- isDarkMode = await page.evaluate(() =>
- document.documentElement.classList.contains("dark"),
- )
- expect(isDarkMode).toBe(true)
-})
diff --git a/frontend/tests/utils/mailcatcher.ts b/frontend/tests/utils/mailcatcher.ts
deleted file mode 100644
index 8e6f78b2c8..0000000000
--- a/frontend/tests/utils/mailcatcher.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import type { APIRequestContext } from "@playwright/test"
-
-type Email = {
- id: number
- recipients: string[]
- subject: string
-}
-
-async function findEmail({
- request,
- filter,
-}: {
- request: APIRequestContext
- filter?: (email: Email) => boolean
-}) {
- const response = await request.get(`${process.env.MAILCATCHER_HOST}/messages`)
-
- let emails = await response.json()
-
- if (filter) {
- emails = emails.filter(filter)
- }
-
- const email = emails[emails.length - 1]
-
- if (email) {
- return email as Email
- }
-
- return null
-}
-
-export function findLastEmail({
- request,
- filter,
- timeout = 5000,
-}: {
- request: APIRequestContext
- filter?: (email: Email) => boolean
- timeout?: number
-}) {
- const timeoutPromise = new Promise((_, reject) =>
- setTimeout(
- () => reject(new Error("Timeout while trying to get latest email")),
- timeout,
- ),
- )
-
- const checkEmails = async () => {
- while (true) {
- const emailData = await findEmail({ request, filter })
-
- if (emailData) {
- return emailData
- }
- // Wait for 100ms before checking again
- await new Promise((resolve) => setTimeout(resolve, 100))
- }
- }
-
- return Promise.race([timeoutPromise, checkEmails()])
-}
diff --git a/frontend/tests/utils/privateApi.ts b/frontend/tests/utils/privateApi.ts
deleted file mode 100644
index b6fa0afe67..0000000000
--- a/frontend/tests/utils/privateApi.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-// Note: the `PrivateService` is only available when generating the client
-// for local environments
-import { OpenAPI, PrivateService } from "../../src/client"
-
-OpenAPI.BASE = `${process.env.VITE_API_URL}`
-
-export const createUser = async ({
- email,
- password,
-}: {
- email: string
- password: string
-}) => {
- return await PrivateService.createUser({
- requestBody: {
- email,
- password,
- is_verified: true,
- full_name: "Test User",
- },
- })
-}
diff --git a/frontend/tests/utils/random.ts b/frontend/tests/utils/random.ts
deleted file mode 100644
index 8e9cc11749..0000000000
--- a/frontend/tests/utils/random.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-export const randomEmail = () =>
- `test_${Math.random().toString(36).substring(7)}@example.com`
-
-export const randomTeamName = () =>
- `Team ${Math.random().toString(36).substring(7)}`
-
-export const randomPassword = () => `${Math.random().toString(36).substring(2)}`
-
-export const slugify = (text: string) =>
- text
- .toLowerCase()
- .replace(/\s+/g, "-")
- .replace(/[^\w-]+/g, "")
-
-export const randomItemTitle = () =>
- `Item ${Math.random().toString(36).substring(7)}`
-
-export const randomItemDescription = () =>
- `Description ${Math.random().toString(36).substring(7)}`
diff --git a/frontend/tests/utils/user.ts b/frontend/tests/utils/user.ts
deleted file mode 100644
index 33f86e3255..0000000000
--- a/frontend/tests/utils/user.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { expect, type Page } from "@playwright/test"
-
-export async function signUpNewUser(
- page: Page,
- name: string,
- email: string,
- password: string,
-) {
- await page.goto("/signup")
-
- await page.getByTestId("full-name-input").fill(name)
- await page.getByTestId("email-input").fill(email)
- await page.getByTestId("password-input").fill(password)
- await page.getByTestId("confirm-password-input").fill(password)
- await page.getByRole("button", { name: "Sign Up" }).click()
- await page.goto("/login")
-}
-
-export async function logInUser(page: Page, email: string, password: string) {
- await page.goto("/login")
-
- await page.getByTestId("email-input").fill(email)
- await page.getByTestId("password-input").fill(password)
- await page.getByRole("button", { name: "Log In" }).click()
- await page.waitForURL("/")
- await expect(
- page.getByText("Welcome back, nice to see you again!"),
- ).toBeVisible()
-}
-
-export async function logOutUser(page: Page) {
- await page.getByTestId("user-menu").click()
- await page.getByRole("menuitem", { name: "Log out" }).click()
- await page.goto("/login")
-}
diff --git a/frontend/tsconfig.build.json b/frontend/tsconfig.build.json
deleted file mode 100644
index 13bd2efc21..0000000000
--- a/frontend/tsconfig.build.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "extends": "./tsconfig.json",
- "exclude": ["tests/**/*.ts"]
-}
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
deleted file mode 100644
index 00d9148b30..0000000000
--- a/frontend/tsconfig.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "compilerOptions": {
- "target": "ES2020",
- "useDefineForClassFields": true,
- "lib": ["ES2020", "DOM", "DOM.Iterable"],
- "module": "ESNext",
- "skipLibCheck": true,
- /* Bundler mode */
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": true,
- "resolveJsonModule": true,
- "isolatedModules": true,
- "noEmit": true,
- "jsx": "react-jsx",
- /* Linting */
- "strict": true,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "noFallthroughCasesInSwitch": true,
- "baseUrl": ".",
- "paths": {
- "@/*": ["./src/*"]
- }
- },
- "include": ["src", "tests", "playwright.config.ts"],
- "references": [
- {
- "path": "./tsconfig.node.json"
- }
- ]
-}
diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json
deleted file mode 100644
index 42872c59f5..0000000000
--- a/frontend/tsconfig.node.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "compilerOptions": {
- "composite": true,
- "skipLibCheck": true,
- "module": "ESNext",
- "moduleResolution": "bundler",
- "allowSyntheticDefaultImports": true
- },
- "include": ["vite.config.ts"]
-}
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
deleted file mode 100644
index 874db9071f..0000000000
--- a/frontend/vite.config.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import path from "node:path"
-import tailwindcss from "@tailwindcss/vite"
-import { tanstackRouter } from "@tanstack/router-plugin/vite"
-import react from "@vitejs/plugin-react-swc"
-import { defineConfig } from "vite"
-
-// https://vitejs.dev/config/
-export default defineConfig({
- resolve: {
- alias: {
- "@": path.resolve(__dirname, "./src"),
- },
- },
- plugins: [
- tanstackRouter({
- target: "react",
- autoCodeSplitting: true,
- }),
- react(),
- tailwindcss(),
- ],
-})
diff --git a/hooks/post_gen_project.py b/hooks/post_gen_project.py
deleted file mode 100644
index 2ca5260dac..0000000000
--- a/hooks/post_gen_project.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from pathlib import Path
-
-
-path: Path
-for path in Path(".").glob("**/*.sh"):
- data = path.read_bytes()
- lf_data = data.replace(b"\r\n", b"\n")
- path.write_bytes(lf_data)
diff --git a/img/dashboard-dark.png b/img/dashboard-dark.png
deleted file mode 100644
index 4b540689ff..0000000000
Binary files a/img/dashboard-dark.png and /dev/null differ
diff --git a/img/dashboard-items.png b/img/dashboard-items.png
deleted file mode 100644
index 0147851bd7..0000000000
Binary files a/img/dashboard-items.png and /dev/null differ
diff --git a/img/dashboard.png b/img/dashboard.png
deleted file mode 100644
index 9d3c1b2eef..0000000000
Binary files a/img/dashboard.png and /dev/null differ
diff --git a/img/docs.png b/img/docs.png
deleted file mode 100644
index d61c2071c7..0000000000
Binary files a/img/docs.png and /dev/null differ
diff --git a/img/github-social-preview.png b/img/github-social-preview.png
deleted file mode 100644
index f1dc5959fb..0000000000
Binary files a/img/github-social-preview.png and /dev/null differ
diff --git a/img/github-social-preview.svg b/img/github-social-preview.svg
deleted file mode 100644
index 4b7a75760e..0000000000
--- a/img/github-social-preview.svg
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
diff --git a/img/login.png b/img/login.png
deleted file mode 100644
index d74203352a..0000000000
Binary files a/img/login.png and /dev/null differ
diff --git a/package.json b/package.json
deleted file mode 100644
index ab558ed403..0000000000
--- a/package.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "name": "fastapi-full-stack-template",
- "private": true,
- "workspaces": [
- "frontend"
- ],
- "scripts": {
- "dev": "bun run --filter frontend dev",
- "lint": "bun run --filter frontend lint",
- "test": "bun run --filter frontend test",
- "test:ui": "bun run --filter frontend test:ui"
- }
-}
diff --git a/release-notes.md b/release-notes.md
deleted file mode 100644
index 3d22a8fc05..0000000000
--- a/release-notes.md
+++ /dev/null
@@ -1,869 +0,0 @@
-# Release Notes
-
-## Latest Changes
-
-### Refactors
-
-* π§ Add FastAPI VS Code extension to recommended extensions. PR [#2206](https://github.com/fastapi/full-stack-fastapi-template/pull/2206) by [@tiangolo](https://github.com/tiangolo).
-* β»οΈ Update meta titles. PR [#2179](https://github.com/fastapi/full-stack-fastapi-template/pull/2179) by [@alejsdev](https://github.com/alejsdev).
-
-### Upgrades
-
-* β¬οΈ Upgrade Sentry and FastAPI. PR [#2181](https://github.com/fastapi/full-stack-fastapi-template/pull/2181) by [@patrick91](https://github.com/patrick91).
-
-### Docs
-
-* π Update security policy. PR [#2297](https://github.com/fastapi/full-stack-fastapi-template/pull/2297) by [@tiangolo](https://github.com/tiangolo).
-* π Add `CONTRIBUTING.md`. PR [#2159](https://github.com/fastapi/full-stack-fastapi-template/pull/2159) by [@alejsdev](https://github.com/alejsdev).
-
-### Internal
-
-* π· Configure Dependabot to group updates and update weekly. PR [#2293](https://github.com/fastapi/full-stack-fastapi-template/pull/2293) by [@YuriiMotov](https://github.com/YuriiMotov).
-* π₯ Remove config files now in central GitHub repo. PR [#2300](https://github.com/fastapi/full-stack-fastapi-template/pull/2300) by [@tiangolo](https://github.com/tiangolo).
-* β¬ Bump actions/add-to-project from 1.0.2 to 2.0.0. PR [#2273](https://github.com/fastapi/full-stack-fastapi-template/pull/2273) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump python-multipart from 0.0.21 to 0.0.27. PR [#2277](https://github.com/fastapi/full-stack-fastapi-template/pull/2277) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump idna from 3.11 to 3.15. PR [#2294](https://github.com/fastapi/full-stack-fastapi-template/pull/2294) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* ποΈ Only allow team members to modify dependencies. PR [#2292](https://github.com/fastapi/full-stack-fastapi-template/pull/2292) by [@svlandeg](https://github.com/svlandeg).
-* β¬ Bump urllib3 from 2.6.3 to 2.7.0. PR [#2282](https://github.com/fastapi/full-stack-fastapi-template/pull/2282) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* ποΈ Add zizmor and fix audit findings. PR [#2260](https://github.com/fastapi/full-stack-fastapi-template/pull/2260) by [@YuriiMotov](https://github.com/YuriiMotov).
-* π Pin GitHub actions by commit SHA. PR [#2246](https://github.com/fastapi/full-stack-fastapi-template/pull/2246) by [@YuriiMotov](https://github.com/YuriiMotov).
-* π¨ Add pre-commit hook to ensure latest release header has date. PR [#2205](https://github.com/fastapi/full-stack-fastapi-template/pull/2205) by [@YuriiMotov](https://github.com/YuriiMotov).
-* π· Add `ty` to precommit. PR [#2227](https://github.com/fastapi/full-stack-fastapi-template/pull/2227) by [@svlandeg](https://github.com/svlandeg).
-* β¬ Bump dorny/paths-filter from 3 to 4. PR [#2230](https://github.com/fastapi/full-stack-fastapi-template/pull/2230) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump pyjwt from 2.10.1 to 2.12.0. PR [#2231](https://github.com/fastapi/full-stack-fastapi-template/pull/2231) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/node from 25.3.2 to 25.5.0. PR [#2233](https://github.com/fastapi/full-stack-fastapi-template/pull/2233) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-devtools from 1.159.10 to 1.166.7. PR [#2234](https://github.com/fastapi/full-stack-fastapi-template/pull/2234) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump tailwindcss from 4.2.0 to 4.2.1. PR [#2226](https://github.com/fastapi/full-stack-fastapi-template/pull/2226) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/download-artifact from 7 to 8. PR [#2208](https://github.com/fastapi/full-stack-fastapi-template/pull/2208) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/upload-artifact from 6 to 7. PR [#2207](https://github.com/fastapi/full-stack-fastapi-template/pull/2207) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-router from 1.157.3 to 1.163.3. PR [#2215](https://github.com/fastapi/full-stack-fastapi-template/pull/2215) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-router-devtools from 1.159.10 to 1.163.3. PR [#2212](https://github.com/fastapi/full-stack-fastapi-template/pull/2212) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query from 5.90.20 to 5.90.21. PR [#2213](https://github.com/fastapi/full-stack-fastapi-template/pull/2213) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/node from 25.1.0 to 25.3.2. PR [#2214](https://github.com/fastapi/full-stack-fastapi-template/pull/2214) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump tailwindcss from 4.1.18 to 4.2.0. PR [#2198](https://github.com/fastapi/full-stack-fastapi-template/pull/2198) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump axios from 1.13.4 to 1.13.5. PR [#2199](https://github.com/fastapi/full-stack-fastapi-template/pull/2199) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @vitejs/plugin-react-swc from 4.2.2 to 4.2.3. PR [#2200](https://github.com/fastapi/full-stack-fastapi-template/pull/2200) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump dotenv from 17.2.3 to 17.3.1. PR [#2185](https://github.com/fastapi/full-stack-fastapi-template/pull/2185) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-devtools from 1.157.17 to 1.159.10. PR [#2186](https://github.com/fastapi/full-stack-fastapi-template/pull/2186) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-router-devtools from 1.157.17 to 1.159.10. PR [#2188](https://github.com/fastapi/full-stack-fastapi-template/pull/2188) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬οΈ Bump biome schema version from 2.3.12 to 2.3.14. PR [#2178](https://github.com/fastapi/full-stack-fastapi-template/pull/2178) by [@alejsdev](https://github.com/alejsdev).
-* β¬ Bump @biomejs/biome from 2.3.12 to 2.3.14. PR [#2177](https://github.com/fastapi/full-stack-fastapi-template/pull/2177) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump lucide-react from 0.562.0 to 0.563.0. PR [#2176](https://github.com/fastapi/full-stack-fastapi-template/pull/2176) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query from 5.90.19 to 5.90.20. PR [#2174](https://github.com/fastapi/full-stack-fastapi-template/pull/2174) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump playwright from v1.58.0-noble to v1.58.2-noble in /frontend. PR [#2175](https://github.com/fastapi/full-stack-fastapi-template/pull/2175) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π· Run mypy by pre-commit. PR [#2169](https://github.com/fastapi/full-stack-fastapi-template/pull/2169) by [@YuriiMotov](https://github.com/YuriiMotov).
-* β¬ Bump @tanstack/router-devtools from 1.153.2 to 1.157.17. PR [#2166](https://github.com/fastapi/full-stack-fastapi-template/pull/2166) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/node from 25.0.10 to 25.1.0. PR [#2168](https://github.com/fastapi/full-stack-fastapi-template/pull/2168) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump axios from 1.13.2 to 1.13.4. PR [#2164](https://github.com/fastapi/full-stack-fastapi-template/pull/2164) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬οΈ Bump biome schema version to 2.3.12 in biome.json. PR [#2154](https://github.com/fastapi/full-stack-fastapi-template/pull/2154) by [@alejsdev](https://github.com/alejsdev).
-* β¬ Bump @biomejs/biome from 2.3.11 to 2.3.12. PR [#2153](https://github.com/fastapi/full-stack-fastapi-template/pull/2153) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump playwright from v1.57.0-noble to v1.58.0-noble in /frontend. PR [#2150](https://github.com/fastapi/full-stack-fastapi-template/pull/2150) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-router from 1.153.2 to 1.156.0. PR [#2152](https://github.com/fastapi/full-stack-fastapi-template/pull/2152) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump zod from 4.3.5 to 4.3.6. PR [#2151](https://github.com/fastapi/full-stack-fastapi-template/pull/2151) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/node from 25.0.9 to 25.0.10. PR [#2149](https://github.com/fastapi/full-stack-fastapi-template/pull/2149) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-router-devtools from 1.153.2 to 1.156.0. PR [#2147](https://github.com/fastapi/full-stack-fastapi-template/pull/2147) by [@dependabot[bot]](https://github.com/apps/dependabot).
-
-## 0.10.0 (2026-01-23)
-
-### Features
-
-* β
Add items and admin tests, and refactor existing ones. PR [#2146](https://github.com/fastapi/full-stack-fastapi-template/pull/2146) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add created_at field to User and Item models and update endpoints. PR [#2144](https://github.com/fastapi/full-stack-fastapi-template/pull/2144) by [@alejsdev](https://github.com/alejsdev).
-* π§ Migrate from npm to Bun. PR [#2097](https://github.com/fastapi/full-stack-fastapi-template/pull/2097) by [@alejsdev](https://github.com/alejsdev).
-* π§ Set up node monorepo. PR [#2095](https://github.com/fastapi/full-stack-fastapi-template/pull/2095) by [@alejsdev](https://github.com/alejsdev).
-* π§βπ» Implement uv workspaces. PR [#2090](https://github.com/fastapi/full-stack-fastapi-template/pull/2090) by [@alejsdev](https://github.com/alejsdev).
-* π§ Add recommended VS Code extensions. PR [#1386](https://github.com/fastapi/full-stack-fastapi-template/pull/1386) by [@tobiase](https://github.com/tobiase).
-* β¨ Use pwdlib with Argon2 by default, adding logic (and tests) to autoupdate old passwords using Bcrypt. PR [#2104](https://github.com/fastapi/full-stack-fastapi-template/pull/2104) by [@tiangolo](https://github.com/tiangolo).
-* π¨ Generate frontend SDK on pre-commit, remove custom workflow. PR [#2111](https://github.com/fastapi/full-stack-fastapi-template/pull/2111) by [@tiangolo](https://github.com/tiangolo).
-
-### Fixes
-
-* π Add user authentication check in admin route to restrict access for non-superusers. PR [#2145](https://github.com/fastapi/full-stack-fastapi-template/pull/2145) by [@alejsdev](https://github.com/alejsdev).
-* π Handle non-existing user IDs in `read_user_by_id`. PR [#1396](https://github.com/fastapi/full-stack-fastapi-template/pull/1396) by [@saltie2193](https://github.com/saltie2193).
-
-### Refactors
-
-* π₯ Remove debugpy from recommended extensions, it's included by the Python extension. PR [#2143](https://github.com/fastapi/full-stack-fastapi-template/pull/2143) by [@tiangolo](https://github.com/tiangolo).
-* π§ Update the frontend build context for prod with the new top level setup. PR [#2108](https://github.com/fastapi/full-stack-fastapi-template/pull/2108) by [@tiangolo](https://github.com/tiangolo).
-* π Rename Docker Compose files to new names, `compose.yml`. PR [#2106](https://github.com/fastapi/full-stack-fastapi-template/pull/2106) by [@tiangolo](https://github.com/tiangolo).
-* ποΈ Ensure authentication takes constant time, to avoid enumeration attacks. PR [#2105](https://github.com/fastapi/full-stack-fastapi-template/pull/2105) by [@tiangolo](https://github.com/tiangolo).
-* β
Fix incorrect mocking in unit tests (issue #1780). PR [#1781](https://github.com/fastapi/full-stack-fastapi-template/pull/1781) by [@vicaya](https://github.com/vicaya).
-* πUpdate `items.py` to return status code `403` in case of insufficient permissions. PR [#1543](https://github.com/fastapi/full-stack-fastapi-template/pull/1543) by [@jpizquierdo](https://github.com/jpizquierdo).
-* β
Use proper `is_active` field in `test_user.py`. PR [#1479](https://github.com/fastapi/full-stack-fastapi-template/pull/1479) by [@nauanbek](https://github.com/nauanbek).
-* β»οΈ Simplify reset password logic by removing duplicate code. PR [#1440](https://github.com/fastapi/full-stack-fastapi-template/pull/1440) by [@youneshenniwrites](https://github.com/youneshenniwrites).
-
-### Upgrades
-
-* β¬ Bump postgres from 17 to 18. PR [#1910](https://github.com/fastapi/full-stack-fastapi-template/pull/1910) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump traefik from 3.0 to 3.6. PR [#1973](https://github.com/fastapi/full-stack-fastapi-template/pull/1973) by [@dependabot[bot]](https://github.com/apps/dependabot).
-
-### Docs
-
-* π Update deployment docs. PR [#2109](https://github.com/fastapi/full-stack-fastapi-template/pull/2109) by [@tiangolo](https://github.com/tiangolo).
-
-### Internal
-
-* π¨ Format Python scripts tests. PR [#2112](https://github.com/fastapi/full-stack-fastapi-template/pull/2112) by [@tiangolo](https://github.com/tiangolo).
-* π¨ Update generate-client.sh and docs. PR [#2110](https://github.com/fastapi/full-stack-fastapi-template/pull/2110) by [@tiangolo](https://github.com/tiangolo).
-* π₯ Remove old unused scripts. PR [#2107](https://github.com/fastapi/full-stack-fastapi-template/pull/2107) by [@tiangolo](https://github.com/tiangolo).
-* π· Add `maybe-ai` for issue manager. PR [#2103](https://github.com/fastapi/full-stack-fastapi-template/pull/2103) by [@tiangolo](https://github.com/tiangolo).
-* β¬οΈ Bump uv to 0.9.26 in Dockerfile. PR [#2102](https://github.com/fastapi/full-stack-fastapi-template/pull/2102) by [@alejsdev](https://github.com/alejsdev).
-* β¬ Bump lucide-react from 0.556.0 to 0.562.0. PR [#2101](https://github.com/fastapi/full-stack-fastapi-template/pull/2101) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π§ Update dependabot configuration for package ecosystems. PR [#2100](https://github.com/fastapi/full-stack-fastapi-template/pull/2100) by [@alejsdev](https://github.com/alejsdev).
-* π§ Update Biome schema version to 2.3.11. PR [#2099](https://github.com/fastapi/full-stack-fastapi-template/pull/2099) by [@alejsdev](https://github.com/alejsdev).
-* π§ Add tests scripts in `package.json`. PR [#2098](https://github.com/fastapi/full-stack-fastapi-template/pull/2098) by [@alejsdev](https://github.com/alejsdev).
-* π¨ Apply pre-commit fixes. PR [#2055](https://github.com/fastapi/full-stack-fastapi-template/pull/2055) by [@GniLudio](https://github.com/GniLudio).
-* π· Update pre-commit workflow. PR [#2096](https://github.com/fastapi/full-stack-fastapi-template/pull/2096) by [@alejsdev](https://github.com/alejsdev).
-* π§ Update biome.json schema version. PR [#2092](https://github.com/fastapi/full-stack-fastapi-template/pull/2092) by [@alejsdev](https://github.com/alejsdev).
-* Revert "π§ Update pre-commit-config.yaml ruff format to use --check". PR [#2091](https://github.com/fastapi/full-stack-fastapi-template/pull/2091) by [@alejsdev](https://github.com/alejsdev).
-* π§ Update pre-commit-config.yaml ruff format to use --check. PR [#2077](https://github.com/fastapi/full-stack-fastapi-template/pull/2077) by [@ryansydnor](https://github.com/ryansydnor).
-* β¬ Bump actions/checkout from 5 to 6. PR [#2074](https://github.com/fastapi/full-stack-fastapi-template/pull/2074) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π· Add pre-commit workflow. PR [#2056](https://github.com/fastapi/full-stack-fastapi-template/pull/2056) by [@YuriiMotov](https://github.com/YuriiMotov).
-* β¬ Bump @tanstack/router-devtools from 1.140.0 to 1.142.8 in /frontend. PR [#2060](https://github.com/fastapi/full-stack-fastapi-template/pull/2060) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-router from 1.141.2 to 1.142.8 in /frontend. PR [#2062](https://github.com/fastapi/full-stack-fastapi-template/pull/2062) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @biomejs/biome from 2.3.8 to 2.3.10 in /frontend. PR [#2061](https://github.com/fastapi/full-stack-fastapi-template/pull/2061) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-router-devtools from 1.139.12 to 1.142.8 in /frontend. PR [#2063](https://github.com/fastapi/full-stack-fastapi-template/pull/2063) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump zod from 4.1.13 to 4.2.1 in /frontend. PR [#2064](https://github.com/fastapi/full-stack-fastapi-template/pull/2064) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π· Configure coverage, error on main tests, don't wait for Smokeshow. PR [#2054](https://github.com/fastapi/full-stack-fastapi-template/pull/2054) by [@YuriiMotov](https://github.com/YuriiMotov).
-* π· Run Smokeshow always, even on test failures. PR [#2053](https://github.com/fastapi/full-stack-fastapi-template/pull/2053) by [@YuriiMotov](https://github.com/YuriiMotov).
-* β¬ Bump @tanstack/react-router from 1.140.0 to 1.141.2 in /frontend. PR [#2045](https://github.com/fastapi/full-stack-fastapi-template/pull/2045) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/download-artifact from 6 to 7. PR [#2051](https://github.com/fastapi/full-stack-fastapi-template/pull/2051) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/upload-artifact from 5 to 6. PR [#2050](https://github.com/fastapi/full-stack-fastapi-template/pull/2050) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/node from 24.10.1 to 25.0.2 in /frontend. PR [#2048](https://github.com/fastapi/full-stack-fastapi-template/pull/2048) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tailwindcss/vite from 4.1.17 to 4.1.18 in /frontend. PR [#2049](https://github.com/fastapi/full-stack-fastapi-template/pull/2049) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump vite from 7.2.7 to 7.3.0 in /frontend. PR [#2047](https://github.com/fastapi/full-stack-fastapi-template/pull/2047) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump react-dom from 19.2.1 to 19.2.3 in /frontend. PR [#2046](https://github.com/fastapi/full-stack-fastapi-template/pull/2046) by [@dependabot[bot]](https://github.com/apps/dependabot).
-
-## 0.9.0 (2025-12-08)
-
-### Features
-
-* β¨ Add meta title support to all pages. PR [#2039](https://github.com/fastapi/full-stack-fastapi-template/pull/2039) by [@alejsdev](https://github.com/alejsdev).
-* π Migrate frontend to Shadcn. PR [#2010](https://github.com/fastapi/full-stack-fastapi-template/pull/2010) by [@alejsdev](https://github.com/alejsdev).
-
-### Fixes
-
-* π Fix `EMAILS_FROM_NAME` type to be `str` instead of `EmailStr`. PR [#1940](https://github.com/fastapi/full-stack-fastapi-template/pull/1940) by [@martin0258](https://github.com/martin0258).
-* π Fix `parse_cors` function to be consistent for both empty string and empty list. PR [#1672](https://github.com/fastapi/full-stack-fastapi-template/pull/1672) by [@rolkotaki](https://github.com/rolkotaki).
-* π Close sidebar drawer on user selection. PR [#1515](https://github.com/fastapi/full-stack-fastapi-template/pull/1515) by [@dtellz](https://github.com/dtellz).
-* π Fix required password validation when editing user fields. PR [#1508](https://github.com/fastapi/full-stack-fastapi-template/pull/1508) by [@jpizquierdo](https://github.com/jpizquierdo).
-
-### Refactors
-
-* β»οΈ Update password max length. PR [#1447](https://github.com/fastapi/full-stack-fastapi-template/pull/1447) by [@michaelAlvarino](https://github.com/michaelAlvarino).
-* π Move backend tests outside the `app` directory. PR [#1862](https://github.com/fastapi/full-stack-fastapi-template/pull/1862) by [@YuriiMotov](https://github.com/YuriiMotov).
-* β¨ Add ImportMetaEnv and ImportMeta interfaces for Vite environment variables. PR [#1860](https://github.com/fastapi/full-stack-fastapi-template/pull/1860) by [@alejsdev](https://github.com/alejsdev).
-* π§ Update `tsconfig.json` and fix errors. PR [#1859](https://github.com/fastapi/full-stack-fastapi-template/pull/1859) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Remove disabled attribute from Save button in ChangePassword component. PR [#1844](https://github.com/fastapi/full-stack-fastapi-template/pull/1844) by [@alejsdev](https://github.com/alejsdev).
-* π·π»ββοΈ Update CI for client generation. PR [#1573](https://github.com/fastapi/full-stack-fastapi-template/pull/1573) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Remove redundant field in inherited class. PR [#1520](https://github.com/fastapi/full-stack-fastapi-template/pull/1520) by [@tzway](https://github.com/tzway).
-* π¨ Add minor UI tweaks in Skeletons and other components. PR [#1507](https://github.com/fastapi/full-stack-fastapi-template/pull/1507) by [@alejsdev](https://github.com/alejsdev).
-* π¨ Add minor UI tweaks. PR [#1506](https://github.com/fastapi/full-stack-fastapi-template/pull/1506) by [@alejsdev](https://github.com/alejsdev).
-
-### Upgrades
-
-* β¬ Bump @types/react from 19.1.12 to 19.1.13 in /frontend. PR [#1888](https://github.com/fastapi/full-stack-fastapi-template/pull/1888) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-plugin from 1.131.41 to 1.131.43 in /frontend. PR [#1887](https://github.com/fastapi/full-stack-fastapi-template/pull/1887) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump pydantic from 2.11.7 to 2.11.9 in /backend. PR [#1891](https://github.com/fastapi/full-stack-fastapi-template/pull/1891) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @chakra-ui/react from 3.26.0 to 3.27.0 in /frontend. PR [#1890](https://github.com/fastapi/full-stack-fastapi-template/pull/1890) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump axios from 1.12.0 to 1.12.2 in /frontend. PR [#1889](https://github.com/fastapi/full-stack-fastapi-template/pull/1889) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/node from 24.3.1 to 24.4.0 in /frontend. PR [#1886](https://github.com/fastapi/full-stack-fastapi-template/pull/1886) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-devtools from 1.131.41 to 1.131.42 in /frontend. PR [#1881](https://github.com/fastapi/full-stack-fastapi-template/pull/1881) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-plugin from 1.131.39 to 1.131.41 in /frontend. PR [#1879](https://github.com/fastapi/full-stack-fastapi-template/pull/1879) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query-devtools from 5.87.3 to 5.87.4 in /frontend. PR [#1876](https://github.com/fastapi/full-stack-fastapi-template/pull/1876) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump axios from 1.11.0 to 1.12.0 in /frontend. PR [#1878](https://github.com/fastapi/full-stack-fastapi-template/pull/1878) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-devtools from 1.131.40 to 1.131.41 in /frontend. PR [#1877](https://github.com/fastapi/full-stack-fastapi-template/pull/1877) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-router from 1.131.40 to 1.131.41 in /frontend. PR [#1875](https://github.com/fastapi/full-stack-fastapi-template/pull/1875) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-devtools from 1.131.36 to 1.131.37 in /frontend. PR [#1871](https://github.com/fastapi/full-stack-fastapi-template/pull/1871) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-plugin from 1.131.36 to 1.131.37 in /frontend. PR [#1870](https://github.com/fastapi/full-stack-fastapi-template/pull/1870) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query from 5.87.1 to 5.87.4 in /frontend. PR [#1868](https://github.com/fastapi/full-stack-fastapi-template/pull/1868) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @biomejs/biome from 2.2.3 to 2.2.4 in /frontend. PR [#1869](https://github.com/fastapi/full-stack-fastapi-template/pull/1869) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-router from 1.131.36 to 1.131.37 in /frontend. PR [#1872](https://github.com/fastapi/full-stack-fastapi-template/pull/1872) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬οΈ Upgrade Biome to the latest version. PR [#1861](https://github.com/fastapi/full-stack-fastapi-template/pull/1861) by [@alejsdev](https://github.com/alejsdev).
-* β¬οΈ Update TansTack Router dependencies. PR [#1853](https://github.com/fastapi/full-stack-fastapi-template/pull/1853) by [@alejsdev](https://github.com/alejsdev).
-* β¬οΈ Bump @tanstack/react-query from 5.28.14 to 5.87.1. PR [#1852](https://github.com/fastapi/full-stack-fastapi-template/pull/1852) by [@alejsdev](https://github.com/alejsdev).
-* β¬ Bump @chakra-ui/react from 3.8.0 to 3.26.0 in /frontend. PR [#1796](https://github.com/fastapi/full-stack-fastapi-template/pull/1796) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬οΈ Update @hey-api/openapi-ts dependency version and update dependabot config. PR [#1845](https://github.com/fastapi/full-stack-fastapi-template/pull/1845) by [@alejsdev](https://github.com/alejsdev).
-* β¬οΈ Update Playwright. PR [#1793](https://github.com/fastapi/full-stack-fastapi-template/pull/1793) by [@alejsdev](https://github.com/alejsdev).
-* β¬οΈ Upgrade React and related dependencies. PR [#1843](https://github.com/fastapi/full-stack-fastapi-template/pull/1843) by [@alejsdev](https://github.com/alejsdev).
-
-### Docs
-
-* π Add Mailcatcher setup instructions for local email testing. PR [#2038](https://github.com/fastapi/full-stack-fastapi-template/pull/2038) by [@alejsdev](https://github.com/alejsdev).
-* π Update `README` to include link for Vite. PR [#2037](https://github.com/fastapi/full-stack-fastapi-template/pull/2037) by [@alejsdev](https://github.com/alejsdev).
-* π Fix outdated workflow badge. PR [#2028](https://github.com/fastapi/full-stack-fastapi-template/pull/2028) by [@AymanAlSuleihi](https://github.com/AymanAlSuleihi).
-* π Update docs. PR [#2036](https://github.com/fastapi/full-stack-fastapi-template/pull/2036) by [@alejsdev](https://github.com/alejsdev).
-* βοΈ Fix small typo in `deployment.md`. PR [#1679](https://github.com/fastapi/full-stack-fastapi-template/pull/1679) by [@cassmtnr](https://github.com/cassmtnr).
-
-### Internal
-
-* π₯ Remove unused dependencies. PR [#2035](https://github.com/fastapi/full-stack-fastapi-template/pull/2035) by [@alejsdev](https://github.com/alejsdev).
-* β¬ Bump react-dom from 19.2.0 to 19.2.1 in /frontend. PR [#2032](https://github.com/fastapi/full-stack-fastapi-template/pull/2032) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump vite from 7.2.6 to 7.2.7 in /frontend. PR [#2033](https://github.com/fastapi/full-stack-fastapi-template/pull/2033) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-plugin from 1.139.12 to 1.140.0 in /frontend. PR [#2034](https://github.com/fastapi/full-stack-fastapi-template/pull/2034) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump lucide-react from 0.555.0 to 0.556.0 in /frontend. PR [#2031](https://github.com/fastapi/full-stack-fastapi-template/pull/2031) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π§ Add Tailwind CSS directives support in biome config. PR [#2029](https://github.com/fastapi/full-stack-fastapi-template/pull/2029) by [@alejsdev](https://github.com/alejsdev).
-* β¬ Bump react-hook-form from 7.66.1 to 7.67.0 in /frontend. PR [#2018](https://github.com/fastapi/full-stack-fastapi-template/pull/2018) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query from 5.90.10 to 5.90.11 in /frontend. PR [#2019](https://github.com/fastapi/full-stack-fastapi-template/pull/2019) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump axios from 1.12.2 to 1.13.2 in /frontend. PR [#2020](https://github.com/fastapi/full-stack-fastapi-template/pull/2020) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-devtools from 1.139.3 to 1.139.12 in /frontend. PR [#2021](https://github.com/fastapi/full-stack-fastapi-template/pull/2021) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump playwright from v1.56.1-noble to v1.57.0-noble in /frontend. PR [#2016](https://github.com/fastapi/full-stack-fastapi-template/pull/2016) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬οΈ Update schema version in `biome.json`. PR [#2017](https://github.com/fastapi/full-stack-fastapi-template/pull/2017) by [@alejsdev](https://github.com/alejsdev).
-* β¬ Bump vite from 7.2.2 to 7.2.6 in /frontend. PR [#2015](https://github.com/fastapi/full-stack-fastapi-template/pull/2015) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @biomejs/biome from 2.3.7 to 2.3.8 in /frontend. PR [#2014](https://github.com/fastapi/full-stack-fastapi-template/pull/2014) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query-devtools from 5.91.0 to 5.91.1 in /frontend. PR [#2013](https://github.com/fastapi/full-stack-fastapi-template/pull/2013) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-plugin from 1.133.15 to 1.139.12 in /frontend. PR [#2012](https://github.com/fastapi/full-stack-fastapi-template/pull/2012) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump form-data from 4.0.4 to 4.0.5 in /frontend. PR [#2011](https://github.com/fastapi/full-stack-fastapi-template/pull/2011) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/checkout from 5 to 6. PR [#2007](https://github.com/fastapi/full-stack-fastapi-template/pull/2007) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/react from 19.2.2 to 19.2.7 in /frontend. PR [#2003](https://github.com/fastapi/full-stack-fastapi-template/pull/2003) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-devtools from 1.131.42 to 1.139.3 in /frontend. PR [#2001](https://github.com/fastapi/full-stack-fastapi-template/pull/2001) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump typescript from 5.9.2 to 5.9.3 in /frontend. PR [#2002](https://github.com/fastapi/full-stack-fastapi-template/pull/2002) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/react-dom from 19.2.2 to 19.2.3 in /frontend. PR [#2004](https://github.com/fastapi/full-stack-fastapi-template/pull/2004) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/node from 24.10.0 to 24.10.1 in /frontend. PR [#2005](https://github.com/fastapi/full-stack-fastapi-template/pull/2005) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump pydantic-settings from 2.11.0 to 2.12.0 in /backend. PR [#2000](https://github.com/fastapi/full-stack-fastapi-template/pull/2000) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump alembic from 1.17.1 to 1.17.2 in /backend. PR [#1999](https://github.com/fastapi/full-stack-fastapi-template/pull/1999) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @biomejs/biome from 2.2.4 to 2.3.7 in /frontend. PR [#1998](https://github.com/fastapi/full-stack-fastapi-template/pull/1998) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump react-hook-form from 7.66.0 to 7.66.1 in /frontend. PR [#1997](https://github.com/fastapi/full-stack-fastapi-template/pull/1997) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @vitejs/plugin-react-swc from 4.2.1 to 4.2.2 in /frontend. PR [#1996](https://github.com/fastapi/full-stack-fastapi-template/pull/1996) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @chakra-ui/react from 3.29.0 to 3.30.0 in /frontend. PR [#1995](https://github.com/fastapi/full-stack-fastapi-template/pull/1995) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query-devtools from 5.90.2 to 5.91.0 in /frontend. PR [#1994](https://github.com/fastapi/full-stack-fastapi-template/pull/1994) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π§ Add labels to Dependabot updates. PR [#1992](https://github.com/fastapi/full-stack-fastapi-template/pull/1992) by [@alejsdev](https://github.com/alejsdev).
-* β¬ Bump dotenv from 17.2.2 to 17.2.3 in /frontend. PR [#1957](https://github.com/fastapi/full-stack-fastapi-template/pull/1957) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @chakra-ui/react from 3.27.0 to 3.29.0 in /frontend. PR [#1974](https://github.com/fastapi/full-stack-fastapi-template/pull/1974) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/react-dom from 19.2.1 to 19.2.2 in /frontend. PR [#1975](https://github.com/fastapi/full-stack-fastapi-template/pull/1975) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query from 5.90.2 to 5.90.7 in /frontend. PR [#1976](https://github.com/fastapi/full-stack-fastapi-template/pull/1976) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump vite from 7.1.11 to 7.2.2 in /frontend. PR [#1977](https://github.com/fastapi/full-stack-fastapi-template/pull/1977) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump pydantic from 2.12.3 to 2.12.4 in /backend. PR [#1978](https://github.com/fastapi/full-stack-fastapi-template/pull/1978) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump js-yaml from 4.1.0 to 4.1.1 in /frontend. PR [#1983](https://github.com/fastapi/full-stack-fastapi-template/pull/1983) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/checkout from 5 to 6. PR [#1988](https://github.com/fastapi/full-stack-fastapi-template/pull/1988) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π· Upgrade `latest-changes` GitHub Action and pin `actions/checkout@v5`. PR [#2006](https://github.com/fastapi/full-stack-fastapi-template/pull/2006) by [@svlandeg](https://github.com/svlandeg).
-* β¬ Bump @vitejs/plugin-react-swc from 4.1.0 to 4.2.0 in /frontend. PR [#1958](https://github.com/fastapi/full-stack-fastapi-template/pull/1958) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/download-artifact from 5 to 6. PR [#1959](https://github.com/fastapi/full-stack-fastapi-template/pull/1959) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/node from 24.5.2 to 24.9.1 in /frontend. PR [#1961](https://github.com/fastapi/full-stack-fastapi-template/pull/1961) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/upload-artifact from 4 to 5. PR [#1962](https://github.com/fastapi/full-stack-fastapi-template/pull/1962) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump react-hook-form from 7.62.0 to 7.65.0 in /frontend. PR [#1964](https://github.com/fastapi/full-stack-fastapi-template/pull/1964) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump alembic from 1.17.0 to 1.17.1 in /backend. PR [#1970](https://github.com/fastapi/full-stack-fastapi-template/pull/1970) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π§ Fix issue-manager config for reminder. PR [#1972](https://github.com/fastapi/full-stack-fastapi-template/pull/1972) by [@tiangolo](https://github.com/tiangolo).
-* β¬ Bump @vitejs/plugin-react-swc from 4.0.1 to 4.1.0 in /frontend. PR [#1897](https://github.com/fastapi/full-stack-fastapi-template/pull/1897) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump playwright from v1.55.0-noble to v1.56.1-noble in /frontend. PR [#1943](https://github.com/fastapi/full-stack-fastapi-template/pull/1943) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π§ Configure reminder for `waiting` label in `issue-manager`. PR [#1939](https://github.com/fastapi/full-stack-fastapi-template/pull/1939) by [@YuriiMotov](https://github.com/YuriiMotov).
-* β¬ Bump vite from 7.1.9 to 7.1.11 in /frontend. PR [#1949](https://github.com/fastapi/full-stack-fastapi-template/pull/1949) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump pydantic from 2.11.10 to 2.12.3 in /backend. PR [#1947](https://github.com/fastapi/full-stack-fastapi-template/pull/1947) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump react-dom and @types/react-dom in /frontend. PR [#1934](https://github.com/fastapi/full-stack-fastapi-template/pull/1934) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump alembic from 1.16.5 to 1.17.0 in /backend. PR [#1935](https://github.com/fastapi/full-stack-fastapi-template/pull/1935) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/setup-node from 5 to 6. PR [#1937](https://github.com/fastapi/full-stack-fastapi-template/pull/1937) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-plugin from 1.132.41 to 1.133.15 in /frontend. PR [#1946](https://github.com/fastapi/full-stack-fastapi-template/pull/1946) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump astral-sh/setup-uv from 6 to 7. PR [#1925](https://github.com/fastapi/full-stack-fastapi-template/pull/1925) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump vite from 7.1.7 to 7.1.9 in /frontend. PR [#1919](https://github.com/fastapi/full-stack-fastapi-template/pull/1919) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/router-plugin from 1.131.44 to 1.132.41 in /frontend. PR [#1920](https://github.com/fastapi/full-stack-fastapi-template/pull/1920) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query-devtools from 5.87.4 to 5.90.2 in /frontend. PR [#1921](https://github.com/fastapi/full-stack-fastapi-template/pull/1921) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump pydantic from 2.11.9 to 2.11.10 in /backend. PR [#1922](https://github.com/fastapi/full-stack-fastapi-template/pull/1922) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump tiangolo/issue-manager from 0.5.1 to 0.6.0. PR [#1912](https://github.com/fastapi/full-stack-fastapi-template/pull/1912) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/react from 19.1.13 to 19.1.15 in /frontend. PR [#1906](https://github.com/fastapi/full-stack-fastapi-template/pull/1906) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump pydantic-settings from 2.10.1 to 2.11.0 in /backend. PR [#1907](https://github.com/fastapi/full-stack-fastapi-template/pull/1907) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query from 5.90.1 to 5.90.2 in /frontend. PR [#1905](https://github.com/fastapi/full-stack-fastapi-template/pull/1905) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/node from 24.4.0 to 24.5.2 in /frontend. PR [#1903](https://github.com/fastapi/full-stack-fastapi-template/pull/1903) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump vite from 7.1.5 to 7.1.7 in /frontend. PR [#1893](https://github.com/fastapi/full-stack-fastapi-template/pull/1893) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query from 5.87.4 to 5.90.1 in /frontend. PR [#1896](https://github.com/fastapi/full-stack-fastapi-template/pull/1896) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-router from 1.131.44 to 1.131.50 in /frontend. PR [#1894](https://github.com/fastapi/full-stack-fastapi-template/pull/1894) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π§ Update dependabot intervals for uv and npm dependencies to weekly. PR [#1880](https://github.com/fastapi/full-stack-fastapi-template/pull/1880) by [@alejsdev](https://github.com/alejsdev).
-* β¬ Bump pydantic from 2.9.2 to 2.11.7 in /backend. PR [#1864](https://github.com/fastapi/full-stack-fastapi-template/pull/1864) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π§ Update coverage configuration and simplify test script. PR [#1867](https://github.com/fastapi/full-stack-fastapi-template/pull/1867) by [@alejsdev](https://github.com/alejsdev).
-* π§ Add T201 rule to ruff linting configuration to disallow print statements. PR [#1865](https://github.com/fastapi/full-stack-fastapi-template/pull/1865) by [@alejsdev](https://github.com/alejsdev).
-* β¬ Bump @tanstack/react-query-devtools from 5.87.1 to 5.87.3 in /frontend. PR [#1863](https://github.com/fastapi/full-stack-fastapi-template/pull/1863) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump vite from 6.3.4 to 7.1.5 in /frontend. PR [#1857](https://github.com/fastapi/full-stack-fastapi-template/pull/1857) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/node from 22.15.3 to 24.3.1 in /frontend. PR [#1854](https://github.com/fastapi/full-stack-fastapi-template/pull/1854) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @vitejs/plugin-react-swc from 3.9.0 to 4.0.1 in /frontend. PR [#1856](https://github.com/fastapi/full-stack-fastapi-template/pull/1856) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump axios from 1.9.0 to 1.11.0 in /frontend. PR [#1855](https://github.com/fastapi/full-stack-fastapi-template/pull/1855) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump alembic from 1.15.2 to 1.16.5 in /backend. PR [#1847](https://github.com/fastapi/full-stack-fastapi-template/pull/1847) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump email-validator from 2.2.0 to 2.3.0 in /backend. PR [#1850](https://github.com/fastapi/full-stack-fastapi-template/pull/1850) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump pydantic-settings from 2.9.1 to 2.10.1 in /backend. PR [#1851](https://github.com/fastapi/full-stack-fastapi-template/pull/1851) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump react-error-boundary from 5.0.0 to 6.0.0 in /frontend. PR [#1849](https://github.com/fastapi/full-stack-fastapi-template/pull/1849) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query-devtools from 5.74.9 to 5.87.1 in /frontend. PR [#1848](https://github.com/fastapi/full-stack-fastapi-template/pull/1848) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump dotenv from 16.4.5 to 17.2.2 in /frontend. PR [#1846](https://github.com/fastapi/full-stack-fastapi-template/pull/1846) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump node from 20 to 24 in /frontend. PR [#1621](https://github.com/fastapi/full-stack-fastapi-template/pull/1621) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/labeler from 5 to 6. PR [#1839](https://github.com/fastapi/full-stack-fastapi-template/pull/1839) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/setup-python from 5 to 6. PR [#1835](https://github.com/fastapi/full-stack-fastapi-template/pull/1835) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/setup-node from 4 to 5. PR [#1836](https://github.com/fastapi/full-stack-fastapi-template/pull/1836) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π· Detect and label merge conflicts on PRs automatically. PR [#1838](https://github.com/fastapi/full-stack-fastapi-template/pull/1838) by [@svlandeg](https://github.com/svlandeg).
-* π§ Add frontend linter pre-commit hook. PR [#1791](https://github.com/fastapi/full-stack-fastapi-template/pull/1791) by [@alexrockhill](https://github.com/alexrockhill).
-* β¬ Bump form-data from 4.0.2 to 4.0.4 in /frontend. PR [#1725](https://github.com/fastapi/full-stack-fastapi-template/pull/1725) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/checkout from 4 to 5. PR [#1768](https://github.com/fastapi/full-stack-fastapi-template/pull/1768) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/download-artifact from 4 to 5. PR [#1754](https://github.com/fastapi/full-stack-fastapi-template/pull/1754) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump tiangolo/latest-changes from 0.3.2 to 0.4.0. PR [#1744](https://github.com/fastapi/full-stack-fastapi-template/pull/1744) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump bcrypt from 4.0.1 to 4.3.0 in /backend. PR [#1601](https://github.com/fastapi/full-stack-fastapi-template/pull/1601) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump react-error-boundary from 4.0.13 to 5.0.0 in /frontend. PR [#1602](https://github.com/fastapi/full-stack-fastapi-template/pull/1602) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump vite from 6.3.3 to 6.3.4 in /frontend. PR [#1608](https://github.com/fastapi/full-stack-fastapi-template/pull/1608) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @playwright/test from 1.45.2 to 1.52.0 in /frontend. PR [#1586](https://github.com/fastapi/full-stack-fastapi-template/pull/1586) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump pydantic-settings from 2.5.2 to 2.9.1 in /backend. PR [#1589](https://github.com/fastapi/full-stack-fastapi-template/pull/1589) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump next-themes from 0.4.4 to 0.4.6 in /frontend. PR [#1598](https://github.com/fastapi/full-stack-fastapi-template/pull/1598) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @types/node from 20.10.5 to 22.15.3 in /frontend. PR [#1599](https://github.com/fastapi/full-stack-fastapi-template/pull/1599) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @tanstack/react-query-devtools from 5.28.14 to 5.74.9 in /frontend. PR [#1597](https://github.com/fastapi/full-stack-fastapi-template/pull/1597) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump sqlmodel from 0.0.22 to 0.0.24 in /backend. PR [#1596](https://github.com/fastapi/full-stack-fastapi-template/pull/1596) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump python-multipart from 0.0.10 to 0.0.20 in /backend. PR [#1595](https://github.com/fastapi/full-stack-fastapi-template/pull/1595) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump alembic from 1.13.2 to 1.15.2 in /backend. PR [#1594](https://github.com/fastapi/full-stack-fastapi-template/pull/1594) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump postgres from 12 to 17. PR [#1580](https://github.com/fastapi/full-stack-fastapi-template/pull/1580) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump axios from 1.8.2 to 1.9.0 in /frontend. PR [#1592](https://github.com/fastapi/full-stack-fastapi-template/pull/1592) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump react-icons from 5.4.0 to 5.5.0 in /frontend. PR [#1581](https://github.com/fastapi/full-stack-fastapi-template/pull/1581) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump jinja2 from 3.1.4 to 3.1.6 in /backend. PR [#1591](https://github.com/fastapi/full-stack-fastapi-template/pull/1591) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump pyjwt from 2.9.0 to 2.10.1 in /backend. PR [#1588](https://github.com/fastapi/full-stack-fastapi-template/pull/1588) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump httpx from 0.27.2 to 0.28.1 in /backend. PR [#1587](https://github.com/fastapi/full-stack-fastapi-template/pull/1587) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump form-data from 4.0.0 to 4.0.2 in /frontend. PR [#1578](https://github.com/fastapi/full-stack-fastapi-template/pull/1578) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump @biomejs/biome from 1.6.1 to 1.9.4 in /frontend. PR [#1582](https://github.com/fastapi/full-stack-fastapi-template/pull/1582) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬οΈ Update Dependabot configuration to target the backend directory for Python uv updates. PR [#1577](https://github.com/fastapi/full-stack-fastapi-template/pull/1577) by [@alejsdev](https://github.com/alejsdev).
-* π§ Update Dependabot config. PR [#1576](https://github.com/fastapi/full-stack-fastapi-template/pull/1576) by [@alejsdev](https://github.com/alejsdev).
-* Bump @babel/runtime from 7.23.9 to 7.27.0 in /frontend. PR [#1570](https://github.com/fastapi/full-stack-fastapi-template/pull/1570) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* Bump esbuild, @vitejs/plugin-react-swc and vite in /frontend. PR [#1571](https://github.com/fastapi/full-stack-fastapi-template/pull/1571) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* Bump axios from 1.7.4 to 1.8.2 in /frontend. PR [#1568](https://github.com/fastapi/full-stack-fastapi-template/pull/1568) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump astral-sh/setup-uv from 5 to 6. PR [#1566](https://github.com/fastapi/full-stack-fastapi-template/pull/1566) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π§ Add npm and docker package ecosystems to Dependabot configuration. PR [#1535](https://github.com/fastapi/full-stack-fastapi-template/pull/1535) by [@alejsdev](https://github.com/alejsdev).
-
-## 0.8.0 (2025-02-19)
-
-### Features
-
-* π Migrate to Chakra UI v3 . PR [#1496](https://github.com/fastapi/full-stack-fastapi-template/pull/1496) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add private, local only, API for usage in E2E tests. PR [#1429](https://github.com/fastapi/full-stack-fastapi-template/pull/1429) by [@patrick91](https://github.com/patrick91).
-* β¨ Migrate to latest openapi-ts. PR [#1430](https://github.com/fastapi/full-stack-fastapi-template/pull/1430) by [@patrick91](https://github.com/patrick91).
-
-### Fixes
-
-* π§βπ§ Replace correct value for 'htmlFor'. PR [#1456](https://github.com/fastapi/full-stack-fastapi-template/pull/1456) by [@wesenbergg](https://github.com/wesenbergg).
-
-### Refactors
-
-* β»οΈ Redirect the user to `login` if we get 401/403. PR [#1501](https://github.com/fastapi/full-stack-fastapi-template/pull/1501) by [@alejsdev](https://github.com/alejsdev).
-* π Refactor reset password test to create normal user instead of using super user. PR [#1499](https://github.com/fastapi/full-stack-fastapi-template/pull/1499) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Replace email types from `str` to `EmailStr` in `config.py`. PR [#1492](https://github.com/fastapi/full-stack-fastapi-template/pull/1492) by [@jpizquierdo](https://github.com/jpizquierdo).
-* π§ Remove unused context from router creation. PR [#1498](https://github.com/fastapi/full-stack-fastapi-template/pull/1498) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Remove redundant item deletion code leveraging cascade delete. PR [#1481](https://github.com/fastapi/full-stack-fastapi-template/pull/1481) by [@nauanbek](https://github.com/nauanbek).
-* βοΈ Fix a couple of spelling mistakes. PR [#1485](https://github.com/fastapi/full-stack-fastapi-template/pull/1485) by [@rjmunro](https://github.com/rjmunro).
-* π¨ Move `prefix` and `tags` to routers. PR [#1439](https://github.com/fastapi/full-stack-fastapi-template/pull/1439) by [@patrick91](https://github.com/patrick91).
-* β»οΈ Remove modify id script in favor of openapi-ts config. PR [#1434](https://github.com/fastapi/full-stack-fastapi-template/pull/1434) by [@patrick91](https://github.com/patrick91).
-* π· Improve Playwright CI speed: sharding (parallel runs), run in Docker to use cache, use env vars. PR [#1405](https://github.com/fastapi/full-stack-fastapi-template/pull/1405) by [@tiangolo](https://github.com/tiangolo).
-* β»οΈ Add PaginationFooter component. PR [#1381](https://github.com/fastapi/full-stack-fastapi-template/pull/1381) by [@saltie2193](https://github.com/saltie2193).
-* β»οΈ Refactored code to use encryption algorithm name from settings for consistency. PR [#1160](https://github.com/fastapi/full-stack-fastapi-template/pull/1160) by [@sameeramin](https://github.com/sameeramin).
-* π Enable logging for email utils by default. PR [#1374](https://github.com/fastapi/full-stack-fastapi-template/pull/1374) by [@ihmily](https://github.com/ihmily).
-* π§ Add `ENV PYTHONUNBUFFERED=1` to log output directly to Docker. PR [#1378](https://github.com/fastapi/full-stack-fastapi-template/pull/1378) by [@tiangolo](https://github.com/tiangolo).
-* π‘ Remove unnecessary comment. PR [#1260](https://github.com/fastapi/full-stack-fastapi-template/pull/1260) by [@sebhani](https://github.com/sebhani).
-
-### Upgrades
-
-* β¬οΈ Update Dockerfile to use uv version 0.5.11. PR [#1454](https://github.com/fastapi/full-stack-fastapi-template/pull/1454) by [@alejsdev](https://github.com/alejsdev).
-
-### Docs
-
-* π Removing deprecated manual client SDK step. PR [#1494](https://github.com/fastapi/full-stack-fastapi-template/pull/1494) by [@chandy](https://github.com/chandy).
-* π Update Frontend README.md. PR [#1462](https://github.com/fastapi/full-stack-fastapi-template/pull/1462) by [@getmarkus](https://github.com/getmarkus).
-* π Update `frontend/README.md` to also remove Playwright when removing Frontend. PR [#1452](https://github.com/fastapi/full-stack-fastapi-template/pull/1452) by [@youben11](https://github.com/youben11).
-* π Update `deployment.md`, instructions to install GitHub Runner in non-root VMs. PR [#1412](https://github.com/fastapi/full-stack-fastapi-template/pull/1412) by [@tiangolo](https://github.com/tiangolo).
-* π Add MailCatcher to `development.md`. PR [#1387](https://github.com/fastapi/full-stack-fastapi-template/pull/1387) by [@tobiase](https://github.com/tobiase).
-
-### Internal
-
-* π§ Configure path alias for cleaner imports. PR [#1497](https://github.com/fastapi/full-stack-fastapi-template/pull/1497) by [@alejsdev](https://github.com/alejsdev).
-* Bump vite from 5.0.13 to 5.4.14 in /frontend. PR [#1469](https://github.com/fastapi/full-stack-fastapi-template/pull/1469) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump astral-sh/setup-uv from 4 to 5. PR [#1453](https://github.com/fastapi/full-stack-fastapi-template/pull/1453) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump astral-sh/setup-uv from 3 to 4. PR [#1433](https://github.com/fastapi/full-stack-fastapi-template/pull/1433) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump tiangolo/latest-changes from 0.3.1 to 0.3.2. PR [#1418](https://github.com/fastapi/full-stack-fastapi-template/pull/1418) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π· Update issue manager workflow. PR [#1398](https://github.com/fastapi/full-stack-fastapi-template/pull/1398) by [@alejsdev](https://github.com/alejsdev).
-* π· Fix smokeshow, checkout files on CI. PR [#1395](https://github.com/fastapi/full-stack-fastapi-template/pull/1395) by [@tiangolo](https://github.com/tiangolo).
-* π· Update `labeler.yml`. PR [#1388](https://github.com/fastapi/full-stack-fastapi-template/pull/1388) by [@tiangolo](https://github.com/tiangolo).
-* π§ Add .auth playwright folder to `.gitignore`. PR [#1383](https://github.com/fastapi/full-stack-fastapi-template/pull/1383) by [@justin-p](https://github.com/justin-p).
-* β¬οΈ Bump rollup from 4.6.1 to 4.22.5 in /frontend. PR [#1379](https://github.com/fastapi/full-stack-fastapi-template/pull/1379) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump astral-sh/setup-uv from 2 to 3. PR [#1364](https://github.com/fastapi/full-stack-fastapi-template/pull/1364) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π· Update pre-commit end-of-file-fixer hook to exclude email-templates. PR [#1296](https://github.com/fastapi/full-stack-fastapi-template/pull/1296) by [@goabonga](https://github.com/goabonga).
-* β¬ Bump tiangolo/issue-manager from 0.5.0 to 0.5.1. PR [#1332](https://github.com/fastapi/full-stack-fastapi-template/pull/1332) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π§ Run task by the same Python environment used to run Copier. PR [#1157](https://github.com/fastapi/full-stack-fastapi-template/pull/1157) by [@waketzheng](https://github.com/waketzheng).
-* π· Tweak generate client to error out if there are errors. PR [#1377](https://github.com/fastapi/full-stack-fastapi-template/pull/1377) by [@tiangolo](https://github.com/tiangolo).
-* π· Generate and commit client only on same repo PRs, on forks, show the error. PR [#1376](https://github.com/fastapi/full-stack-fastapi-template/pull/1376) by [@tiangolo](https://github.com/tiangolo).
-
-## 0.7.1 (2024-09-27)
-
-### Highlights
-
-* Migrate from Poetry to [`uv`](https://github.com/astral-sh/uv).
-* Simplifications and improvements for Docker Compose files, Traefik Dockerfiles.
-* Make the API use its own domain `api.example.com` and the frontend use `dashboard.example.com`. This would make it easier to deploy them separately if you needed that.
-* The backend and frontend on Docker Compose now listen on the same port as the local development servers, this way you can stop the Docker Compose services and run the local development servers without changing the frontend configuration.
-
-### Features
-
-* π©Ί Add DB healthcheck. PR [#1342](https://github.com/fastapi/full-stack-fastapi-template/pull/1342) by [@tiangolo](https://github.com/tiangolo).
-
-### Refactors
-
-* β»οΈ Update settings to use top level `.env` file. PR [#1359](https://github.com/fastapi/full-stack-fastapi-template/pull/1359) by [@tiangolo](https://github.com/tiangolo).
-* β¬οΈ Migrate from Poetry to uv. PR [#1356](https://github.com/fastapi/full-stack-fastapi-template/pull/1356) by [@tiangolo](https://github.com/tiangolo).
-* π₯ Remove logic for development dependencies and Jupyter, it was never documented, and I no longer use that trick. PR [#1355](https://github.com/fastapi/full-stack-fastapi-template/pull/1355) by [@tiangolo](https://github.com/tiangolo).
-* β»οΈ Use Docker Compose `watch`. PR [#1354](https://github.com/fastapi/full-stack-fastapi-template/pull/1354) by [@tiangolo](https://github.com/tiangolo).
-* π§ Use plain base official Python Docker image. PR [#1351](https://github.com/fastapi/full-stack-fastapi-template/pull/1351) by [@tiangolo](https://github.com/tiangolo).
-* π Move location of scripts to simplify file structure. PR [#1352](https://github.com/fastapi/full-stack-fastapi-template/pull/1352) by [@tiangolo](https://github.com/tiangolo).
-* β»οΈ Refactor prestart (migrations), move that to its own container. PR [#1350](https://github.com/fastapi/full-stack-fastapi-template/pull/1350) by [@tiangolo](https://github.com/tiangolo).
-* β»οΈ Include `FRONTEND_HOST` in CORS origins by default. PR [#1348](https://github.com/fastapi/full-stack-fastapi-template/pull/1348) by [@tiangolo](https://github.com/tiangolo).
-* β»οΈ Simplify domains with `api.example.com` for API and `dashboard.example.com` for frontend, improve local development with `localhost`. PR [#1344](https://github.com/fastapi/full-stack-fastapi-template/pull/1344) by [@tiangolo](https://github.com/tiangolo).
-* π₯ Simplify Traefik, remove www-redirects that add complexity. PR [#1343](https://github.com/fastapi/full-stack-fastapi-template/pull/1343) by [@tiangolo](https://github.com/tiangolo).
-* π₯ Enable support for Arm Docker images in Mac, remove old patch. PR [#1341](https://github.com/fastapi/full-stack-fastapi-template/pull/1341) by [@tiangolo](https://github.com/tiangolo).
-* β»οΈ Remove duplicate information in the ItemCreate model. PR [#1287](https://github.com/fastapi/full-stack-fastapi-template/pull/1287) by [@jjaakko](https://github.com/jjaakko).
-
-### Upgrades
-
-* β¬οΈ Upgrade FastAPI. PR [#1349](https://github.com/fastapi/full-stack-fastapi-template/pull/1349) by [@tiangolo](https://github.com/tiangolo).
-
-### Docs
-
-* π‘ Add comments to Dockerfile with uv references. PR [#1357](https://github.com/fastapi/full-stack-fastapi-template/pull/1357) by [@tiangolo](https://github.com/tiangolo).
-* π Add Email Templates to `backend/README.md`. PR [#1311](https://github.com/fastapi/full-stack-fastapi-template/pull/1311) by [@alejsdev](https://github.com/alejsdev).
-
-### Internal
-
-* π· Do not sync labels as it overrides manually added labels. PR [#1307](https://github.com/fastapi/full-stack-fastapi-template/pull/1307) by [@tiangolo](https://github.com/tiangolo).
-* π· Use uv cache on GitHub Actions. PR [#1366](https://github.com/fastapi/full-stack-fastapi-template/pull/1366) by [@tiangolo](https://github.com/tiangolo).
-* π· Update GitHub Actions format. PR [#1363](https://github.com/fastapi/full-stack-fastapi-template/pull/1363) by [@tiangolo](https://github.com/tiangolo).
-* π· Use `uv` for Python env to generate client. PR [#1362](https://github.com/fastapi/full-stack-fastapi-template/pull/1362) by [@tiangolo](https://github.com/tiangolo).
-* π· Run tests from Python environment (with `uv`), not from Docker container. PR [#1361](https://github.com/fastapi/full-stack-fastapi-template/pull/1361) by [@tiangolo](https://github.com/tiangolo).
-* π¨ Update `generate-client.sh` script, make it fail on errors, fix generation. PR [#1360](https://github.com/fastapi/full-stack-fastapi-template/pull/1360) by [@tiangolo](https://github.com/tiangolo).
-* π· Add GitHub Actions workflow to lint backend apart from tests. PR [#1358](https://github.com/fastapi/full-stack-fastapi-template/pull/1358) by [@tiangolo](https://github.com/tiangolo).
-* π· Improve playwright CI job. PR [#1335](https://github.com/fastapi/full-stack-fastapi-template/pull/1335) by [@patrick91](https://github.com/patrick91).
-* π· Update `issue-manager.yml`. PR [#1329](https://github.com/fastapi/full-stack-fastapi-template/pull/1329) by [@tiangolo](https://github.com/tiangolo).
-* π Set `include-hidden-files` to `True` when using the `upload-artifact` GH action. PR [#1327](https://github.com/fastapi/full-stack-fastapi-template/pull/1327) by [@svlandeg](https://github.com/svlandeg).
-* π·π» Auto-generate frontend client . PR [#1320](https://github.com/fastapi/full-stack-fastapi-template/pull/1320) by [@alejsdev](https://github.com/alejsdev).
-* π Fix in `.github/labeler.yml`. PR [#1322](https://github.com/fastapi/full-stack-fastapi-template/pull/1322) by [@alejsdev](https://github.com/alejsdev).
-* π· Update `.github/labeler.yml`. PR [#1321](https://github.com/fastapi/full-stack-fastapi-template/pull/1321) by [@alejsdev](https://github.com/alejsdev).
-* π· Update `latest-changes` GitHub Action. PR [#1315](https://github.com/fastapi/full-stack-fastapi-template/pull/1315) by [@tiangolo](https://github.com/tiangolo).
-* π· Update configs for labeler. PR [#1308](https://github.com/fastapi/full-stack-fastapi-template/pull/1308) by [@tiangolo](https://github.com/tiangolo).
-* π· Update GitHub Action labeler to add only one label. PR [#1304](https://github.com/fastapi/full-stack-fastapi-template/pull/1304) by [@tiangolo](https://github.com/tiangolo).
-* β¬οΈ Bump axios from 1.6.2 to 1.7.4 in /frontend. PR [#1301](https://github.com/fastapi/full-stack-fastapi-template/pull/1301) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π· Update GitHub Action labeler dependencies. PR [#1302](https://github.com/fastapi/full-stack-fastapi-template/pull/1302) by [@tiangolo](https://github.com/tiangolo).
-* π· Update GitHub Action labeler permissions. PR [#1300](https://github.com/fastapi/full-stack-fastapi-template/pull/1300) by [@tiangolo](https://github.com/tiangolo).
-* π· Add GitHub Action label-checker. PR [#1299](https://github.com/fastapi/full-stack-fastapi-template/pull/1299) by [@tiangolo](https://github.com/tiangolo).
-* π· Add GitHub Action labeler. PR [#1298](https://github.com/fastapi/full-stack-fastapi-template/pull/1298) by [@tiangolo](https://github.com/tiangolo).
-* π· Add GitHub Action add-to-project. PR [#1297](https://github.com/fastapi/full-stack-fastapi-template/pull/1297) by [@tiangolo](https://github.com/tiangolo).
-* π· Update issue-manager. PR [#1288](https://github.com/fastapi/full-stack-fastapi-template/pull/1288) by [@tiangolo](https://github.com/tiangolo).
-
-## 0.7.0 (2024-08-02)
-
-Lots of new things! π
-
-* E2E tests with Playwright.
-* Mailcatcher configuration, to develop and test email handling.
-* Pagination.
-* UUIDs for database keys.
-* New user sign up.
-* Support for deploying to multiple environments (staging, prod).
-* Many refactors and improvements.
-* Several dependency upgrades.
-
-### Features
-
-* β¨ Add User Settings e2e tests. PR [#1271](https://github.com/tiangolo/full-stack-fastapi-template/pull/1271) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add Reset Password e2e tests. PR [#1270](https://github.com/tiangolo/full-stack-fastapi-template/pull/1270) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add Sign Up e2e tests. PR [#1268](https://github.com/tiangolo/full-stack-fastapi-template/pull/1268) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add Sign Up and make `OPEN_USER_REGISTRATION=True` by default. PR [#1265](https://github.com/tiangolo/full-stack-fastapi-template/pull/1265) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add Login e2e tests. PR [#1264](https://github.com/tiangolo/full-stack-fastapi-template/pull/1264) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add initial setup for frontend / end-to-end tests with Playwright. PR [#1261](https://github.com/tiangolo/full-stack-fastapi-template/pull/1261) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add mailcatcher configuration. PR [#1244](https://github.com/tiangolo/full-stack-fastapi-template/pull/1244) by [@patrick91](https://github.com/patrick91).
-* β¨ Introduce pagination in items. PR [#1239](https://github.com/tiangolo/full-stack-fastapi-template/pull/1239) by [@patrick91](https://github.com/patrick91).
-* ποΈ Add max_length validation for database models and input data. PR [#1233](https://github.com/tiangolo/full-stack-fastapi-template/pull/1233) by [@estebanx64](https://github.com/estebanx64).
-* β¨ Add TanStack React Query devtools in dev build. PR [#1217](https://github.com/tiangolo/full-stack-fastapi-template/pull/1217) by [@tomerb](https://github.com/tomerb).
-* β¨ Add support for deploying multiple environments (staging, production) to the same server. PR [#1128](https://github.com/tiangolo/full-stack-fastapi-template/pull/1128) by [@tiangolo](https://github.com/tiangolo).
-* π· Update CI GitHub Actions to allow running in private repos. PR [#1125](https://github.com/tiangolo/full-stack-fastapi-template/pull/1125) by [@tiangolo](https://github.com/tiangolo).
-
-### Fixes
-
-* π Fix welcome page to show logged-in user. PR [#1218](https://github.com/tiangolo/full-stack-fastapi-template/pull/1218) by [@tomerb](https://github.com/tomerb).
-* π Fix local Traefik proxy network config to fix Gateway Timeouts. PR [#1184](https://github.com/tiangolo/full-stack-fastapi-template/pull/1184) by [@JoelGotsch](https://github.com/JoelGotsch).
-* β»οΈ Fix tests when first superuser password is changed in .env. PR [#1165](https://github.com/tiangolo/full-stack-fastapi-template/pull/1165) by [@billzhong](https://github.com/billzhong).
-* π Fix bug when resetting password. PR [#1171](https://github.com/tiangolo/full-stack-fastapi-template/pull/1171) by [@alejsdev](https://github.com/alejsdev).
-* π Fix 403 when the frontend has a directory without an index.html. PR [#1094](https://github.com/tiangolo/full-stack-fastapi-template/pull/1094) by [@tiangolo](https://github.com/tiangolo).
-
-### Refactors
-
-* π¨ Fix Docker build warning. PR [#1283](https://github.com/tiangolo/full-stack-fastapi-template/pull/1283) by [@erip](https://github.com/erip).
-* β»οΈ Regenerate client to use UUID instead of id integers and update frontend. PR [#1281](https://github.com/tiangolo/full-stack-fastapi-template/pull/1281) by [@rehanabdul](https://github.com/rehanabdul).
-* β»οΈ Tweaks in frontend. PR [#1273](https://github.com/tiangolo/full-stack-fastapi-template/pull/1273) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Add random password util and refactor tests. PR [#1277](https://github.com/tiangolo/full-stack-fastapi-template/pull/1277) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Refactor models to use cascade delete relationships . PR [#1276](https://github.com/tiangolo/full-stack-fastapi-template/pull/1276) by [@alejsdev](https://github.com/alejsdev).
-* π₯ Remove `USERS_OPEN_REGISTRATION` config, make registration enabled by default. PR [#1274](https://github.com/tiangolo/full-stack-fastapi-template/pull/1274) by [@alejsdev](https://github.com/alejsdev).
-* π§ Reuse database url from config in alembic setup. PR [#1229](https://github.com/tiangolo/full-stack-fastapi-template/pull/1229) by [@patrick91](https://github.com/patrick91).
-* π§ Update Playwright config and tests to use env variables. PR [#1266](https://github.com/tiangolo/full-stack-fastapi-template/pull/1266) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Edit refactor db models to use UUID's instead of integer ID's. PR [#1259](https://github.com/tiangolo/full-stack-fastapi-template/pull/1259) by [@estebanx64](https://github.com/estebanx64).
-* β»οΈ Update form inputs width. PR [#1263](https://github.com/tiangolo/full-stack-fastapi-template/pull/1263) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Replace deprecated utcnow() with now(timezone.utc) in utils module. PR [#1247](https://github.com/tiangolo/full-stack-fastapi-template/pull/1247) by [@jalvarezz13](https://github.com/jalvarezz13).
-* π¨ Format frontend. PR [#1262](https://github.com/tiangolo/full-stack-fastapi-template/pull/1262) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Abstraction of specific AddModal component out of the Navbar. PR [#1246](https://github.com/tiangolo/full-stack-fastapi-template/pull/1246) by [@ajbloureiro](https://github.com/ajbloureiro).
-* β»οΈ Update `login.tsx` to prevent error if username or password are empty. PR [#1257](https://github.com/tiangolo/full-stack-fastapi-template/pull/1257) by [@jmondaud](https://github.com/jmondaud).
-* β»οΈ Refactor recover password. PR [#1242](https://github.com/tiangolo/full-stack-fastapi-template/pull/1242) by [@alejsdev](https://github.com/alejsdev).
-* π¨ Format and lint . PR [#1243](https://github.com/tiangolo/full-stack-fastapi-template/pull/1243) by [@alejsdev](https://github.com/alejsdev).
-* π¨ Run biome after OpenAPI client generation. PR [#1226](https://github.com/tiangolo/full-stack-fastapi-template/pull/1226) by [@tomerb](https://github.com/tomerb).
-* β»οΈ Update DeleteConfirmation component to use new service. PR [#1224](https://github.com/tiangolo/full-stack-fastapi-template/pull/1224) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Update client services. PR [#1223](https://github.com/tiangolo/full-stack-fastapi-template/pull/1223) by [@alejsdev](https://github.com/alejsdev).
-* βοΈ Add minor frontend tweaks. PR [#1210](https://github.com/tiangolo/full-stack-fastapi-template/pull/1210) by [@alejsdev](https://github.com/alejsdev).
-* π Move assets to public folder. PR [#1206](https://github.com/tiangolo/full-stack-fastapi-template/pull/1206) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Refactor redirect labels to simplify removing the frontend. PR [#1208](https://github.com/tiangolo/full-stack-fastapi-template/pull/1208) by [@tiangolo](https://github.com/tiangolo).
-* ποΈ Refactor migrate from python-jose to PyJWT. PR [#1203](https://github.com/tiangolo/full-stack-fastapi-template/pull/1203) by [@estebanx64](https://github.com/estebanx64).
-* π₯ Remove duplicated code. PR [#1185](https://github.com/tiangolo/full-stack-fastapi-template/pull/1185) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Add delete_user_me endpoint and corresponding test cases. PR [#1179](https://github.com/tiangolo/full-stack-fastapi-template/pull/1179) by [@alejsdev](https://github.com/alejsdev).
-* β
Update test to add verification database records. PR [#1178](https://github.com/tiangolo/full-stack-fastapi-template/pull/1178) by [@estebanx64](https://github.com/estebanx64).
-* πΈ Use `useSuspenseQuery` to fetch members and show skeleton. PR [#1174](https://github.com/tiangolo/full-stack-fastapi-template/pull/1174) by [@patrick91](https://github.com/patrick91).
-* π¨ Format Utils. PR [#1173](https://github.com/tiangolo/full-stack-fastapi-template/pull/1173) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Use suspense for items page. PR [#1167](https://github.com/tiangolo/full-stack-fastapi-template/pull/1167) by [@patrick91](https://github.com/patrick91).
-* πΈ Mark login field as required. PR [#1166](https://github.com/tiangolo/full-stack-fastapi-template/pull/1166) by [@patrick91](https://github.com/patrick91).
-* πΈ Improve login. PR [#1163](https://github.com/tiangolo/full-stack-fastapi-template/pull/1163) by [@patrick91](https://github.com/patrick91).
-* π₯
Handle AxiosErrors in Login page. PR [#1162](https://github.com/tiangolo/full-stack-fastapi-template/pull/1162) by [@patrick91](https://github.com/patrick91).
-* π¨ Format frontend. PR [#1161](https://github.com/tiangolo/full-stack-fastapi-template/pull/1161) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Regenerate frontend client. PR [#1156](https://github.com/tiangolo/full-stack-fastapi-template/pull/1156) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Refactor rename ModelsOut to ModelsPublic. PR [#1154](https://github.com/tiangolo/full-stack-fastapi-template/pull/1154) by [@estebanx64](https://github.com/estebanx64).
-* β»οΈ Migrate frontend client generation from `openapi-typescript-codegen` to `@hey-api/openapi-ts`. PR [#1151](https://github.com/tiangolo/full-stack-fastapi-template/pull/1151) by [@alejsdev](https://github.com/alejsdev).
-* π₯ Remove unused exports and update dependencies. PR [#1146](https://github.com/tiangolo/full-stack-fastapi-template/pull/1146) by [@alejsdev](https://github.com/alejsdev).
-* π§ Update sentry dns initialization following the environment settings. PR [#1145](https://github.com/tiangolo/full-stack-fastapi-template/pull/1145) by [@estebanx64](https://github.com/estebanx64).
-* β»οΈ Refactor and tweaks, rename `UserCreateOpen` to `UserRegister` and others. PR [#1143](https://github.com/tiangolo/full-stack-fastapi-template/pull/1143) by [@alejsdev](https://github.com/alejsdev).
-* π¨ Format imports. PR [#1140](https://github.com/tiangolo/full-stack-fastapi-template/pull/1140) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Refactor and remove `React.FC`. PR [#1139](https://github.com/tiangolo/full-stack-fastapi-template/pull/1139) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Add email pattern and refactor in frontend. PR [#1138](https://github.com/tiangolo/full-stack-fastapi-template/pull/1138) by [@alejsdev](https://github.com/alejsdev).
-* π₯
Set up Sentry for FastAPI applications. PR [#1136](https://github.com/tiangolo/full-stack-fastapi-template/pull/1136) by [@estebanx64](https://github.com/estebanx64).
-* π₯ Remove deprecated Docker Compose version key. PR [#1129](https://github.com/tiangolo/full-stack-fastapi-template/pull/1129) by [@tiangolo](https://github.com/tiangolo).
-* π¨ Format with Biome . PR [#1097](https://github.com/tiangolo/full-stack-fastapi-template/pull/1097) by [@alejsdev](https://github.com/alejsdev).
-* π¨ Update quote style in biome formatter. PR [#1095](https://github.com/tiangolo/full-stack-fastapi-template/pull/1095) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Replace ESLint and Prettier with Biome to format and lint frontend. PR [#719](https://github.com/tiangolo/full-stack-fastapi-template/pull/719) by [@santigandolfo](https://github.com/santigandolfo).
-* π¨ Replace buttons styling for variants for consistency. PR [#722](https://github.com/tiangolo/full-stack-fastapi-template/pull/722) by [@alejsdev](https://github.com/alejsdev).
-* π οΈ Improve `modify-openapi-operationids.js`. PR [#720](https://github.com/tiangolo/full-stack-fastapi-template/pull/720) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Replace pytest-mock with unittest.mock and remove pytest-cov. PR [#717](https://github.com/tiangolo/full-stack-fastapi-template/pull/717) by [@estebanx64](https://github.com/estebanx64).
-* π οΈ Minor changes in frontend. PR [#715](https://github.com/tiangolo/full-stack-fastapi-template/pull/715) by [@alejsdev](https://github.com/alejsdev).
-* β» Update Docker image to prevent errors in M1 Macs. PR [#710](https://github.com/tiangolo/full-stack-fastapi-template/pull/710) by [@dudil](https://github.com/dudil).
-* β Fix typo in variable names in `backend/app/api/routes/items.py` and `backend/app/api/routes/users.py`. PR [#711](https://github.com/tiangolo/full-stack-fastapi-template/pull/711) by [@disrupted](https://github.com/disrupted).
-
-### Upgrades
-
-* β¬οΈ Update SQLModel to version `>=0.0.21`. PR [#1275](https://github.com/tiangolo/full-stack-fastapi-template/pull/1275) by [@alejsdev](https://github.com/alejsdev).
-* β¬οΈ Upgrade Traefik. PR [#1241](https://github.com/tiangolo/full-stack-fastapi-template/pull/1241) by [@tiangolo](https://github.com/tiangolo).
-* β¬οΈ Bump requests from 2.31.0 to 2.32.0 in /backend. PR [#1211](https://github.com/tiangolo/full-stack-fastapi-template/pull/1211) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬οΈ Bump jinja2 from 3.1.3 to 3.1.4 in /backend. PR [#1196](https://github.com/tiangolo/full-stack-fastapi-template/pull/1196) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* Bump gunicorn from 21.2.0 to 22.0.0 in /backend. PR [#1176](https://github.com/tiangolo/full-stack-fastapi-template/pull/1176) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* Bump idna from 3.6 to 3.7 in /backend. PR [#1168](https://github.com/tiangolo/full-stack-fastapi-template/pull/1168) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π Update React Query to TanStack Query. PR [#1153](https://github.com/tiangolo/full-stack-fastapi-template/pull/1153) by [@patrick91](https://github.com/patrick91).
-* Bump vite from 5.0.12 to 5.0.13 in /frontend. PR [#1149](https://github.com/tiangolo/full-stack-fastapi-template/pull/1149) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* Bump follow-redirects from 1.15.5 to 1.15.6 in /frontend. PR [#734](https://github.com/tiangolo/full-stack-fastapi-template/pull/734) by [@dependabot[bot]](https://github.com/apps/dependabot).
-
-### Docs
-
-* π Update links from tiangolo repo to fastapi org repo. PR [#1285](https://github.com/fastapi/full-stack-fastapi-template/pull/1285) by [@tiangolo](https://github.com/tiangolo).
-* π Add End-to-End Testing with Playwright to frontend `README.md`. PR [#1279](https://github.com/tiangolo/full-stack-fastapi-template/pull/1279) by [@alejsdev](https://github.com/alejsdev).
-* π Update release-notes.md. PR [#1220](https://github.com/tiangolo/full-stack-fastapi-template/pull/1220) by [@alejsdev](https://github.com/alejsdev).
-* βοΈ Update `README.md`. PR [#1205](https://github.com/tiangolo/full-stack-fastapi-template/pull/1205) by [@Craz1k0ek](https://github.com/Craz1k0ek).
-* βοΈ Fix Adminer URL in `deployment.md`. PR [#1194](https://github.com/tiangolo/full-stack-fastapi-template/pull/1194) by [@PhilippWu](https://github.com/PhilippWu).
-* π Add `Enabling Open User Registration` to backend docs. PR [#1191](https://github.com/tiangolo/full-stack-fastapi-template/pull/1191) by [@alejsdev](https://github.com/alejsdev).
-* π Update release-notes.md. PR [#1164](https://github.com/tiangolo/full-stack-fastapi-template/pull/1164) by [@alejsdev](https://github.com/alejsdev).
-* π Update `README.md`. PR [#716](https://github.com/tiangolo/full-stack-fastapi-template/pull/716) by [@alejsdev](https://github.com/alejsdev).
-* π Update instructions to clone for a private repo, including updates. PR [#1127](https://github.com/tiangolo/full-stack-fastapi-template/pull/1127) by [@tiangolo](https://github.com/tiangolo).
-* π Add docs about CI keys, LATEST_CHANGES and SMOKESHOW_AUTH_KEY. PR [#1126](https://github.com/tiangolo/full-stack-fastapi-template/pull/1126) by [@tiangolo](https://github.com/tiangolo).
-* βοΈ Fix file path in `backend/README.md` when not wanting to use migrations. PR [#1116](https://github.com/tiangolo/full-stack-fastapi-template/pull/1116) by [@leonlowitzki](https://github.com/leonlowitzki).
-* π Add documentation for pre-commit and code linting. PR [#718](https://github.com/tiangolo/full-stack-fastapi-template/pull/718) by [@estebanx64](https://github.com/estebanx64).
-* π Fix localhost URLs in `development.md`. PR [#1099](https://github.com/tiangolo/full-stack-fastapi-template/pull/1099) by [@efonte](https://github.com/efonte).
-* β Update header titles for consistency. PR [#708](https://github.com/tiangolo/full-stack-fastapi-template/pull/708) by [@codesmith-emmy](https://github.com/codesmith-emmy).
-* π Update `README.md`, dark mode screenshot position. PR [#706](https://github.com/tiangolo/full-stack-fastapi-template/pull/706) by [@alejsdev](https://github.com/alejsdev).
-
-### Internal
-
-* π§ Update deploy workflows to exclude the main repository. PR [#1284](https://github.com/tiangolo/full-stack-fastapi-template/pull/1284) by [@alejsdev](https://github.com/alejsdev).
-* π· Update issue-manager.yml GitHub Action permissions. PR [#1278](https://github.com/tiangolo/full-stack-fastapi-template/pull/1278) by [@tiangolo](https://github.com/tiangolo).
-* β¬οΈ Bump setuptools from 69.1.1 to 70.0.0 in /backend. PR [#1255](https://github.com/tiangolo/full-stack-fastapi-template/pull/1255) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬οΈ Bump certifi from 2024.2.2 to 2024.7.4 in /backend. PR [#1250](https://github.com/tiangolo/full-stack-fastapi-template/pull/1250) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬οΈ Bump urllib3 from 2.2.1 to 2.2.2 in /backend. PR [#1235](https://github.com/tiangolo/full-stack-fastapi-template/pull/1235) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π§ Ignore `src/routeTree.gen.ts` in biome. PR [#1175](https://github.com/tiangolo/full-stack-fastapi-template/pull/1175) by [@patrick91](https://github.com/patrick91).
-* π· Update Smokeshow download artifact GitHub Action. PR [#1198](https://github.com/tiangolo/full-stack-fastapi-template/pull/1198) by [@tiangolo](https://github.com/tiangolo).
-* π§ Update Node.js version in `.nvmrc`. PR [#1192](https://github.com/tiangolo/full-stack-fastapi-template/pull/1192) by [@alejsdev](https://github.com/alejsdev).
-* π₯ Remove ESLint and Prettier from pre-commit config. PR [#1096](https://github.com/tiangolo/full-stack-fastapi-template/pull/1096) by [@alejsdev](https://github.com/alejsdev).
-* π§ Update mypy config to ignore .venv directories. PR [#1155](https://github.com/tiangolo/full-stack-fastapi-template/pull/1155) by [@tiangolo](https://github.com/tiangolo).
-* π¨ Enable `ARG001` to prevent unused arguments. PR [#1152](https://github.com/tiangolo/full-stack-fastapi-template/pull/1152) by [@patrick91](https://github.com/patrick91).
-* π₯ Remove isort configuration, since we use Ruff now. PR [#1144](https://github.com/tiangolo/full-stack-fastapi-template/pull/1144) by [@patrick91](https://github.com/patrick91).
-* π§ Update pre-commit config to exclude generated client folder. PR [#1150](https://github.com/tiangolo/full-stack-fastapi-template/pull/1150) by [@alejsdev](https://github.com/alejsdev).
-* π§ Change `.nvmrc` format. PR [#1148](https://github.com/tiangolo/full-stack-fastapi-template/pull/1148) by [@patrick91](https://github.com/patrick91).
-* π¨ Ignore alembic from ruff lint and format. PR [#1131](https://github.com/tiangolo/full-stack-fastapi-template/pull/1131) by [@estebanx64](https://github.com/estebanx64).
-* π§ Add GitHub templates for discussions and issues, and security policy. PR [#1105](https://github.com/tiangolo/full-stack-fastapi-template/pull/1105) by [@alejsdev](https://github.com/alejsdev).
-* β¬ Bump dawidd6/action-download-artifact from 3.1.2 to 3.1.4. PR [#1103](https://github.com/tiangolo/full-stack-fastapi-template/pull/1103) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π§ Add Biome to pre-commit config. PR [#1098](https://github.com/tiangolo/full-stack-fastapi-template/pull/1098) by [@alejsdev](https://github.com/alejsdev).
-* π₯ Delete leftover celery file. PR [#727](https://github.com/tiangolo/full-stack-fastapi-template/pull/727) by [@dr-neptune](https://github.com/dr-neptune).
-* βοΈ Update pre-commit config with Prettier and ESLint. PR [#714](https://github.com/tiangolo/full-stack-fastapi-template/pull/714) by [@alejsdev](https://github.com/alejsdev).
-
-## 0.6.0 (2024-03-12)
-
-Latest FastAPI, Pydantic, SQLModel π
-
-Brand new frontend with React, TS, Vite, Chakra UI, TanStack Query/Router, generated client/SDK π¨
-
-CI/CD - GitHub Actions π€
-
-Test cov > 90% β
-
-### Features
-
-* β¨ Adopt SQLModel, create models, start using it. PR [#559](https://github.com/tiangolo/full-stack-fastapi-template/pull/559) by [@tiangolo](https://github.com/tiangolo).
-* β¨ Upgrade items router with new SQLModel models, simplified logic, and new FastAPI Annotated dependencies. PR [#560](https://github.com/tiangolo/full-stack-fastapi-template/pull/560) by [@tiangolo](https://github.com/tiangolo).
-* β¨ Migrate from pgAdmin to Adminer. PR [#692](https://github.com/tiangolo/full-stack-fastapi-template/pull/692) by [@tiangolo](https://github.com/tiangolo).
-* β¨ Add support for setting `POSTGRES_PORT`. PR [#333](https://github.com/tiangolo/full-stack-fastapi-template/pull/333) by [@uepoch](https://github.com/uepoch).
-* β¬ Upgrade Flower version and command. PR [#447](https://github.com/tiangolo/full-stack-fastapi-template/pull/447) by [@maurob](https://github.com/maurob).
-* π¨ Improve styles. PR [#673](https://github.com/tiangolo/full-stack-fastapi-template/pull/673) by [@alejsdev](https://github.com/alejsdev).
-* π¨ Update theme. PR [#666](https://github.com/tiangolo/full-stack-fastapi-template/pull/666) by [@alejsdev](https://github.com/alejsdev).
-* π· Add continuous deployment and refactors needed for it. PR [#667](https://github.com/tiangolo/full-stack-fastapi-template/pull/667) by [@tiangolo](https://github.com/tiangolo).
-* β¨ Create endpoint to show password recovery email content and update email template. PR [#664](https://github.com/tiangolo/full-stack-fastapi-template/pull/664) by [@alejsdev](https://github.com/alejsdev).
-* π¨ Format with Prettier. PR [#646](https://github.com/tiangolo/full-stack-fastapi-template/pull/646) by [@alejsdev](https://github.com/alejsdev).
-* β
Add tests to raise coverage to at least 90% and fix recover password logic. PR [#632](https://github.com/tiangolo/full-stack-fastapi-template/pull/632) by [@estebanx64](https://github.com/estebanx64).
-* βοΈ Add Prettier and ESLint config with pre-commit. PR [#640](https://github.com/tiangolo/full-stack-fastapi-template/pull/640) by [@alejsdev](https://github.com/alejsdev).
-* π· Add coverage with Smokeshow to CI and badge. PR [#638](https://github.com/tiangolo/full-stack-fastapi-template/pull/638) by [@estebanx64](https://github.com/estebanx64).
-* β¨ Migrate to TanStack Query (React Query) and TanStack Router. PR [#637](https://github.com/tiangolo/full-stack-fastapi-template/pull/637) by [@alejsdev](https://github.com/alejsdev).
-* β
Add setup and teardown database for tests. PR [#626](https://github.com/tiangolo/full-stack-fastapi-template/pull/626) by [@estebanx64](https://github.com/estebanx64).
-* β¨ Update new-frontend client. PR [#625](https://github.com/tiangolo/full-stack-fastapi-template/pull/625) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add password reset functionality. PR [#624](https://github.com/tiangolo/full-stack-fastapi-template/pull/624) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add private/public routing. PR [#621](https://github.com/tiangolo/full-stack-fastapi-template/pull/621) by [@alejsdev](https://github.com/alejsdev).
-* π§ Add VS Code debug configs. PR [#620](https://github.com/tiangolo/full-stack-fastapi-template/pull/620) by [@tiangolo](https://github.com/tiangolo).
-* β¨ Add `Not Found` page. PR [#595](https://github.com/tiangolo/full-stack-fastapi-template/pull/595) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add new pages, components, panels, modals, and theme; refactor and improvements in existing components. PR [#593](https://github.com/tiangolo/full-stack-fastapi-template/pull/593) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Support delete own account and other tweaks. PR [#614](https://github.com/tiangolo/full-stack-fastapi-template/pull/614) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Restructure folders, allow editing of users/items, and implement other refactors and improvements. PR [#603](https://github.com/tiangolo/full-stack-fastapi-template/pull/603) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add Copier, migrate from Cookiecutter, in a way that supports using the project as is, forking or cloning it. PR [#612](https://github.com/tiangolo/full-stack-fastapi-template/pull/612) by [@tiangolo](https://github.com/tiangolo).
-* β Replace black, isort, flake8, autoflake with ruff and upgrade mypy. PR [#610](https://github.com/tiangolo/full-stack-fastapi-template/pull/610) by [@tiangolo](https://github.com/tiangolo).
-* β» Refactor items and services endpoints to return count and data, and add CI tests. PR [#599](https://github.com/tiangolo/full-stack-fastapi-template/pull/599) by [@estebanx64](https://github.com/estebanx64).
-* β¨ Add support for updating items and upgrade SQLModel to 0.0.16 (which supports model object updates). PR [#601](https://github.com/tiangolo/full-stack-fastapi-template/pull/601) by [@tiangolo](https://github.com/tiangolo).
-* β¨ Add dark mode to new-frontend and conditional sidebar items. PR [#600](https://github.com/tiangolo/full-stack-fastapi-template/pull/600) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Migrate to RouterProvider and other refactors . PR [#598](https://github.com/tiangolo/full-stack-fastapi-template/pull/598) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add delete_user; refactor delete_item. PR [#594](https://github.com/tiangolo/full-stack-fastapi-template/pull/594) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add state store to new frontend. PR [#592](https://github.com/tiangolo/full-stack-fastapi-template/pull/592) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add form validation to Admin, Items and Login. PR [#616](https://github.com/tiangolo/full-stack-fastapi-template/pull/616) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add Sidebar to new frontend. PR [#587](https://github.com/tiangolo/full-stack-fastapi-template/pull/587) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add Login to new frontend. PR [#585](https://github.com/tiangolo/full-stack-fastapi-template/pull/585) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Include schemas in generated frontend client. PR [#584](https://github.com/tiangolo/full-stack-fastapi-template/pull/584) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Regenerate frontend client with recent changes. PR [#575](https://github.com/tiangolo/full-stack-fastapi-template/pull/575) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Refactor API in `utils.py`. PR [#573](https://github.com/tiangolo/full-stack-fastapi-template/pull/573) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Update code for login API. PR [#571](https://github.com/tiangolo/full-stack-fastapi-template/pull/571) by [@tiangolo](https://github.com/tiangolo).
-* β¨ Add client in frontend and client generation. PR [#569](https://github.com/tiangolo/full-stack-fastapi-template/pull/569) by [@alejsdev](https://github.com/alejsdev).
-* π³ Set up Docker config for new-frontend. PR [#564](https://github.com/tiangolo/full-stack-fastapi-template/pull/564) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Set up new frontend with Vite, TypeScript and React. PR [#563](https://github.com/tiangolo/full-stack-fastapi-template/pull/563) by [@alejsdev](https://github.com/alejsdev).
-* π Add NodeJS version management and instructions. PR [#551](https://github.com/tiangolo/full-stack-fastapi-template/pull/551) by [@alejsdev](https://github.com/alejsdev).
-* Add consistent errors for env vars not set. PR [#200](https://github.com/tiangolo/full-stack-fastapi-template/pull/200).
-* Upgrade Traefik to version 2, keeping in sync with DockerSwarm.rocks. PR [#199](https://github.com/tiangolo/full-stack-fastapi-template/pull/199).
-* Run tests with `TestClient`. PR [#160](https://github.com/tiangolo/full-stack-fastapi-template/pull/160).
-
-### Fixes
-
-* π Fix copier to handle string vars with spaces in quotes. PR [#631](https://github.com/tiangolo/full-stack-fastapi-template/pull/631) by [@estebanx64](https://github.com/estebanx64).
-* π Fix allowing a user to update the email to the same email they already have. PR [#696](https://github.com/tiangolo/full-stack-fastapi-template/pull/696) by [@alejsdev](https://github.com/alejsdev).
-* π Set up Sentry only when used. PR [#671](https://github.com/tiangolo/full-stack-fastapi-template/pull/671) by [@tiangolo](https://github.com/tiangolo).
-* π₯ Remove unnecessary validation. PR [#662](https://github.com/tiangolo/full-stack-fastapi-template/pull/662) by [@alejsdev](https://github.com/alejsdev).
-* π Fix bug when editing own user. PR [#651](https://github.com/tiangolo/full-stack-fastapi-template/pull/651) by [@alejsdev](https://github.com/alejsdev).
-* π Add `onClose` to `SidebarItems`. PR [#589](https://github.com/tiangolo/full-stack-fastapi-template/pull/589) by [@alejsdev](https://github.com/alejsdev).
-* π Fix positional argument bug in `init_db.py`. PR [#562](https://github.com/tiangolo/full-stack-fastapi-template/pull/562) by [@alejsdev](https://github.com/alejsdev).
-* π Fix flower Docker image, pin version. PR [#396](https://github.com/tiangolo/full-stack-fastapi-template/pull/396) by [@sanggusti](https://github.com/sanggusti).
-* π Fix Celery worker command. PR [#443](https://github.com/tiangolo/full-stack-fastapi-template/pull/443) by [@bechtold](https://github.com/bechtold).
-* π Fix Poetry installation in Dockerfile and upgrade Python version and packages to fix Docker build. PR [#480](https://github.com/tiangolo/full-stack-fastapi-template/pull/480) by [@little7Li](https://github.com/little7Li).
-
-### Refactors
-
-* π§ Add missing dotenv variables. PR [#554](https://github.com/tiangolo/full-stack-fastapi-template/pull/554) by [@tiangolo](https://github.com/tiangolo).
-* βͺ Revert "βοΈ Add Prettier and ESLint config with pre-commit". PR [#644](https://github.com/tiangolo/full-stack-fastapi-template/pull/644) by [@alejsdev](https://github.com/alejsdev).
-* π Add .prettierignore and include client folder. PR [#648](https://github.com/tiangolo/full-stack-fastapi-template/pull/648) by [@alejsdev](https://github.com/alejsdev).
-* π·οΈ Add mypy to the GitHub Action for tests and fixed types in the whole project. PR [#655](https://github.com/tiangolo/full-stack-fastapi-template/pull/655) by [@estebanx64](https://github.com/estebanx64).
-* ποΈ Ensure the default values of "changethis" are not deployed. PR [#698](https://github.com/tiangolo/full-stack-fastapi-template/pull/698) by [@tiangolo](https://github.com/tiangolo).
-* β Revert "πΈ Rename Dashboard to Home and update screenshots". PR [#697](https://github.com/tiangolo/full-stack-fastapi-template/pull/697) by [@alejsdev](https://github.com/alejsdev).
-* πΈ Rename Dashboard to Home and update screenshots. PR [#693](https://github.com/tiangolo/full-stack-fastapi-template/pull/693) by [@alejsdev](https://github.com/alejsdev).
-* π Fixed items count when retrieving data for all items by user. PR [#695](https://github.com/tiangolo/full-stack-fastapi-template/pull/695) by [@estebanx64](https://github.com/estebanx64).
-* π₯ Remove Celery and Flower, they are currently not used nor recommended. PR [#694](https://github.com/tiangolo/full-stack-fastapi-template/pull/694) by [@tiangolo](https://github.com/tiangolo).
-* β
Add test for deleting user without privileges. PR [#690](https://github.com/tiangolo/full-stack-fastapi-template/pull/690) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Refactor user update. PR [#689](https://github.com/tiangolo/full-stack-fastapi-template/pull/689) by [@alejsdev](https://github.com/alejsdev).
-* π Add Poetry lock to git. PR [#685](https://github.com/tiangolo/full-stack-fastapi-template/pull/685) by [@tiangolo](https://github.com/tiangolo).
-* π¨ Adjust color and spacing. PR [#684](https://github.com/tiangolo/full-stack-fastapi-template/pull/684) by [@alejsdev](https://github.com/alejsdev).
-* π· Avoid creating unnecessary *.pyc files with PYTHONDONTWRITEBYTECODE=1. PR [#677](https://github.com/tiangolo/full-stack-fastapi-template/pull/677) by [@estebanx64](https://github.com/estebanx64).
-* π§ Add `SMTP_SSL` option for older SMTP servers. PR [#365](https://github.com/tiangolo/full-stack-fastapi-template/pull/365) by [@Metrea](https://github.com/Metrea).
-* β»οΈ Refactor logic to allow running pytest tests locally. PR [#683](https://github.com/tiangolo/full-stack-fastapi-template/pull/683) by [@tiangolo](https://github.com/tiangolo).
-* β» Update error messages. PR [#417](https://github.com/tiangolo/full-stack-fastapi-template/pull/417) by [@qu3vipon](https://github.com/qu3vipon).
-* π§ Add a default Flower password. PR [#682](https://github.com/tiangolo/full-stack-fastapi-template/pull/682) by [@tiangolo](https://github.com/tiangolo).
-* π§ Update VS Code debug config. PR [#676](https://github.com/tiangolo/full-stack-fastapi-template/pull/676) by [@tiangolo](https://github.com/tiangolo).
-* β»οΈ Refactor code structure for tests. PR [#674](https://github.com/tiangolo/full-stack-fastapi-template/pull/674) by [@tiangolo](https://github.com/tiangolo).
-* π§ Set TanStack Router devtools only in dev mode. PR [#668](https://github.com/tiangolo/full-stack-fastapi-template/pull/668) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Refactor email logic to allow re-using util functions for testing and development. PR [#663](https://github.com/tiangolo/full-stack-fastapi-template/pull/663) by [@tiangolo](https://github.com/tiangolo).
-* π¬ Improve Delete Account description and confirmation. PR [#661](https://github.com/tiangolo/full-stack-fastapi-template/pull/661) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Refactor email templates. PR [#659](https://github.com/tiangolo/full-stack-fastapi-template/pull/659) by [@alejsdev](https://github.com/alejsdev).
-* π Update deployment files and docs. PR [#660](https://github.com/tiangolo/full-stack-fastapi-template/pull/660) by [@tiangolo](https://github.com/tiangolo).
-* π₯ Remove unused schemas. PR [#656](https://github.com/tiangolo/full-stack-fastapi-template/pull/656) by [@alejsdev](https://github.com/alejsdev).
-* π₯ Remove old frontend. PR [#649](https://github.com/tiangolo/full-stack-fastapi-template/pull/649) by [@tiangolo](https://github.com/tiangolo).
-* β» Move project source files to top level from src, update Sentry dependency. PR [#630](https://github.com/tiangolo/full-stack-fastapi-template/pull/630) by [@estebanx64](https://github.com/estebanx64).
-* β» Refactor Python folder tree. PR [#629](https://github.com/tiangolo/full-stack-fastapi-template/pull/629) by [@estebanx64](https://github.com/estebanx64).
-* β»οΈ Refactor old CRUD utils and tests. PR [#622](https://github.com/tiangolo/full-stack-fastapi-template/pull/622) by [@alejsdev](https://github.com/alejsdev).
-* π§ Update .env to allow local debug for the backend. PR [#618](https://github.com/tiangolo/full-stack-fastapi-template/pull/618) by [@tiangolo](https://github.com/tiangolo).
-* β»οΈ Refactor and update CORS, remove trailing slash from new Pydantic v2. PR [#617](https://github.com/tiangolo/full-stack-fastapi-template/pull/617) by [@tiangolo](https://github.com/tiangolo).
-* π¨ Format files with pre-commit and Ruff. PR [#611](https://github.com/tiangolo/full-stack-fastapi-template/pull/611) by [@tiangolo](https://github.com/tiangolo).
-* π Refactor and simplify backend file structure. PR [#609](https://github.com/tiangolo/full-stack-fastapi-template/pull/609) by [@tiangolo](https://github.com/tiangolo).
-* π₯ Clean up old files no longer relevant. PR [#608](https://github.com/tiangolo/full-stack-fastapi-template/pull/608) by [@tiangolo](https://github.com/tiangolo).
-* β» Re-structure Docker Compose files, discard Docker Swarm specific logic. PR [#607](https://github.com/tiangolo/full-stack-fastapi-template/pull/607) by [@tiangolo](https://github.com/tiangolo).
-* β»οΈ Refactor update endpoints and regenerate client for new-frontend. PR [#602](https://github.com/tiangolo/full-stack-fastapi-template/pull/602) by [@alejsdev](https://github.com/alejsdev).
-* β¨ Add Layout to App. PR [#588](https://github.com/tiangolo/full-stack-fastapi-template/pull/588) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Re-enable user update path operations for frontend client generation. PR [#574](https://github.com/tiangolo/full-stack-fastapi-template/pull/574) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Remove type ignores and add `response_model`. PR [#572](https://github.com/tiangolo/full-stack-fastapi-template/pull/572) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Refactor Users API and dependencies. PR [#561](https://github.com/tiangolo/full-stack-fastapi-template/pull/561) by [@alejsdev](https://github.com/alejsdev).
-* β»οΈ Refactor frontend Docker build setup, use plain NodeJS, use custom Nginx config, fix build for old Vue. PR [#555](https://github.com/tiangolo/full-stack-fastapi-template/pull/555) by [@tiangolo](https://github.com/tiangolo).
-* β»οΈ Refactor project generation, discard cookiecutter, use plain git/clone/fork. PR [#553](https://github.com/tiangolo/full-stack-fastapi-template/pull/553) by [@tiangolo](https://github.com/tiangolo).
-* Refactor backend:
- * Simplify configs for tools and format to better support editor integration.
- * Add mypy configurations and plugins.
- * Add types to all the codebase.
- * Update types for SQLAlchemy models with plugin.
- * Update and refactor CRUD utils.
- * Refactor DB sessions to use dependencies with `yield`.
- * Refactor dependencies, security, CRUD, models, schemas, etc. To simplify code and improve autocompletion.
- * Change from PyJWT to Python-JOSE as it supports additional use cases.
- * Fix JWT tokens using user email/ID as the subject in `sub`.
- * PR [#158](https://github.com/tiangolo/full-stack-fastapi-template/pull/158).
-* Simplify `docker-compose.*.yml` files, refactor deployment to reduce config files. PR [#153](https://github.com/tiangolo/full-stack-fastapi-template/pull/153).
-* Simplify env var files, merge to a single `.env` file. PR [#151](https://github.com/tiangolo/full-stack-fastapi-template/pull/151).
-
-### Upgrades
-
-* π Upgrade Poetry lock dependencies. PR [#702](https://github.com/tiangolo/full-stack-fastapi-template/pull/702) by [@tiangolo](https://github.com/tiangolo).
-* β¬οΈ Upgrade Python version and dependencies. PR [#558](https://github.com/tiangolo/full-stack-fastapi-template/pull/558) by [@tiangolo](https://github.com/tiangolo).
-* β¬ Bump tiangolo/issue-manager from 0.2.0 to 0.5.0. PR [#591](https://github.com/tiangolo/full-stack-fastapi-template/pull/591) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* Bump follow-redirects from 1.15.3 to 1.15.5 in /frontend. PR [#654](https://github.com/tiangolo/full-stack-fastapi-template/pull/654) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* Bump vite from 5.0.4 to 5.0.12 in /frontend. PR [#653](https://github.com/tiangolo/full-stack-fastapi-template/pull/653) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* Bump fastapi from 0.104.1 to 0.109.1 in /backend. PR [#687](https://github.com/tiangolo/full-stack-fastapi-template/pull/687) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* Bump python-multipart from 0.0.6 to 0.0.7 in /backend. PR [#686](https://github.com/tiangolo/full-stack-fastapi-template/pull/686) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Add `uvicorn[standard]` to include `watchgod` and `uvloop`. PR [#438](https://github.com/tiangolo/full-stack-fastapi-template/pull/438) by [@alonme](https://github.com/alonme).
-* β¬ Upgrade code to support pydantic V2. PR [#615](https://github.com/tiangolo/full-stack-fastapi-template/pull/615) by [@estebanx64](https://github.com/estebanx64).
-
-### Docs
-
-* π¦ Add dark mode to `README.md`. PR [#703](https://github.com/tiangolo/full-stack-fastapi-template/pull/703) by [@alejsdev](https://github.com/alejsdev).
-* π± Update GitHub image. PR [#701](https://github.com/tiangolo/full-stack-fastapi-template/pull/701) by [@tiangolo](https://github.com/tiangolo).
-* π± Add GitHub image. PR [#700](https://github.com/tiangolo/full-stack-fastapi-template/pull/700) by [@tiangolo](https://github.com/tiangolo).
-* π Rename project to Full Stack FastAPI Template. PR [#699](https://github.com/tiangolo/full-stack-fastapi-template/pull/699) by [@tiangolo](https://github.com/tiangolo).
-* π Update `README.md`. PR [#691](https://github.com/tiangolo/full-stack-fastapi-template/pull/691) by [@alejsdev](https://github.com/alejsdev).
-* β Fix typo in `development.md`. PR [#309](https://github.com/tiangolo/full-stack-fastapi-template/pull/309) by [@graue70](https://github.com/graue70).
-* π Add docs for wildcard domains. PR [#681](https://github.com/tiangolo/full-stack-fastapi-template/pull/681) by [@tiangolo](https://github.com/tiangolo).
-* π Add the required GitHub Actions secrets to docs. PR [#679](https://github.com/tiangolo/full-stack-fastapi-template/pull/679) by [@tiangolo](https://github.com/tiangolo).
-* π Update `README.md` and `deployment.md`. PR [#678](https://github.com/tiangolo/full-stack-fastapi-template/pull/678) by [@alejsdev](https://github.com/alejsdev).
-* π Update frontend `README.md`. PR [#675](https://github.com/tiangolo/full-stack-fastapi-template/pull/675) by [@alejsdev](https://github.com/alejsdev).
-* π Update deployment docs to use a different directory for traefik-public. PR [#670](https://github.com/tiangolo/full-stack-fastapi-template/pull/670) by [@tiangolo](https://github.com/tiangolo).
-* πΈ Add new screenshots . PR [#657](https://github.com/tiangolo/full-stack-fastapi-template/pull/657) by [@alejsdev](https://github.com/alejsdev).
-* π Refactor README into separate README.md files for backend, frontend, deployment, development. PR [#639](https://github.com/tiangolo/full-stack-fastapi-template/pull/639) by [@tiangolo](https://github.com/tiangolo).
-* π Update README. PR [#628](https://github.com/tiangolo/full-stack-fastapi-template/pull/628) by [@tiangolo](https://github.com/tiangolo).
-* π· Update GitHub Action latest-changes and move release notes to independent file. PR [#619](https://github.com/tiangolo/full-stack-fastapi-template/pull/619) by [@tiangolo](https://github.com/tiangolo).
-* π Update internal README and referred files. PR [#613](https://github.com/tiangolo/full-stack-fastapi-template/pull/613) by [@tiangolo](https://github.com/tiangolo).
-* π Update README with in construction notice. PR [#552](https://github.com/tiangolo/full-stack-fastapi-template/pull/552) by [@tiangolo](https://github.com/tiangolo).
-* Add docs about reporting test coverage in HTML. PR [#161](https://github.com/tiangolo/full-stack-fastapi-template/pull/161).
-* Add docs about removing the frontend, for an API-only app. PR [#156](https://github.com/tiangolo/full-stack-fastapi-template/pull/156).
-
-### Internal
-
-* π· Add Lint to GitHub Actions outside of tests. PR [#688](https://github.com/tiangolo/full-stack-fastapi-template/pull/688) by [@tiangolo](https://github.com/tiangolo).
-* β¬ Bump dawidd6/action-download-artifact from 2.28.0 to 3.1.2. PR [#643](https://github.com/tiangolo/full-stack-fastapi-template/pull/643) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/upload-artifact from 3 to 4. PR [#642](https://github.com/tiangolo/full-stack-fastapi-template/pull/642) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* β¬ Bump actions/setup-python from 4 to 5. PR [#641](https://github.com/tiangolo/full-stack-fastapi-template/pull/641) by [@dependabot[bot]](https://github.com/apps/dependabot).
-* π· Tweak test GitHub Action names. PR [#672](https://github.com/tiangolo/full-stack-fastapi-template/pull/672) by [@tiangolo](https://github.com/tiangolo).
-* π§ Add `.gitattributes` file to ensure LF endings for `.sh` files. PR [#658](https://github.com/tiangolo/full-stack-fastapi-template/pull/658) by [@estebanx64](https://github.com/estebanx64).
-* π Move new-frontend to frontend. PR [#652](https://github.com/tiangolo/full-stack-fastapi-template/pull/652) by [@alejsdev](https://github.com/alejsdev).
-* π§ Add script for ESLint. PR [#650](https://github.com/tiangolo/full-stack-fastapi-template/pull/650) by [@alejsdev](https://github.com/alejsdev).
-* βοΈ Add Prettier config. PR [#647](https://github.com/tiangolo/full-stack-fastapi-template/pull/647) by [@alejsdev](https://github.com/alejsdev).
-* π§ Update pre-commit config. PR [#645](https://github.com/tiangolo/full-stack-fastapi-template/pull/645) by [@alejsdev](https://github.com/alejsdev).
-* π· Add dependabot. PR [#547](https://github.com/tiangolo/full-stack-fastapi-template/pull/547) by [@tiangolo](https://github.com/tiangolo).
-* π· Fix latest-changes GitHub Action token, strike 2. PR [#546](https://github.com/tiangolo/full-stack-fastapi-template/pull/546) by [@tiangolo](https://github.com/tiangolo).
-* π· Fix latest-changes GitHub Action token config. PR [#545](https://github.com/tiangolo/full-stack-fastapi-template/pull/545) by [@tiangolo](https://github.com/tiangolo).
-* π· Add latest-changes GitHub Action. PR [#544](https://github.com/tiangolo/full-stack-fastapi-template/pull/544) by [@tiangolo](https://github.com/tiangolo).
-* Update issue-manager. PR [#211](https://github.com/tiangolo/full-stack-fastapi-template/pull/211).
-* Add [GitHub Sponsors](https://github.com/sponsors/tiangolo) button. PR [#201](https://github.com/tiangolo/full-stack-fastapi-template/pull/201).
-* Simplify scripts and development, update docs and configs. PR [#155](https://github.com/tiangolo/full-stack-fastapi-template/pull/155).
-
-## 0.5.0 (2020-04-19)
-
-* Make the Traefik public network a fixed default of `traefik-public` as done in DockerSwarm.rocks, to simplify development and iteration of the project generator. PR [#150](https://github.com/tiangolo/full-stack-fastapi-template/pull/150).
-* Update to PostgreSQL 12. PR [#148](https://github.com/tiangolo/full-stack-fastapi-template/pull/148). by [@RCheese](https://github.com/RCheese).
-* Use Poetry for package management. Initial PR [#144](https://github.com/tiangolo/full-stack-fastapi-template/pull/144) by [@RCheese](https://github.com/RCheese).
-* Fix Windows line endings for shell scripts after project generation with Cookiecutter hooks. PR [#149](https://github.com/tiangolo/full-stack-fastapi-template/pull/149).
-* Upgrade Vue CLI to version 4. PR [#120](https://github.com/tiangolo/full-stack-fastapi-template/pull/120) by [@br3ndonland](https://github.com/br3ndonland).
-* Remove duplicate `login` tag. PR [#135](https://github.com/tiangolo/full-stack-fastapi-template/pull/135) by [@Nonameentered](https://github.com/Nonameentered).
-* Fix showing email in dashboard when there's no user's full name. PR [#129](https://github.com/tiangolo/full-stack-fastapi-template/pull/129) by [@rlonka](https://github.com/rlonka).
-* Format code with Black and Flake8. PR [#121](https://github.com/tiangolo/full-stack-fastapi-template/pull/121) by [@br3ndonland](https://github.com/br3ndonland).
-* Simplify SQLAlchemy Base class. PR [#117](https://github.com/tiangolo/full-stack-fastapi-template/pull/117) by [@airibarne](https://github.com/airibarne).
-* Update CRUD utils for users, handling password hashing. PR [#106](https://github.com/tiangolo/full-stack-fastapi-template/pull/106) by [@mocsar](https://github.com/mocsar).
-* Use `.` instead of `source` for interoperability. PR [#98](https://github.com/tiangolo/full-stack-fastapi-template/pull/98) by [@gucharbon](https://github.com/gucharbon).
-* Use Pydantic's `BaseSettings` for settings/configs and env vars. PR [#87](https://github.com/tiangolo/full-stack-fastapi-template/pull/87) by [@StephenBrown2](https://github.com/StephenBrown2).
-* Remove `package-lock.json` to let everyone lock their own versions (depending on OS, etc).
-* Simplify Traefik service labels PR [#139](https://github.com/tiangolo/full-stack-fastapi-template/pull/139).
-* Add email validation. PR [#40](https://github.com/tiangolo/full-stack-fastapi-template/pull/40) by [@kedod](https://github.com/kedod).
-* Fix typo in README. PR [#83](https://github.com/tiangolo/full-stack-fastapi-template/pull/83) by [@ashears](https://github.com/ashears).
-* Fix typo in README. PR [#80](https://github.com/tiangolo/full-stack-fastapi-template/pull/80) by [@abjoker](https://github.com/abjoker).
-* Fix function name `read_item` and response code. PR [#74](https://github.com/tiangolo/full-stack-fastapi-template/pull/74) by [@jcaguirre89](https://github.com/jcaguirre89).
-* Fix typo in comment. PR [#70](https://github.com/tiangolo/full-stack-fastapi-template/pull/70) by [@daniel-butler](https://github.com/daniel-butler).
-* Fix Flower Docker configuration. PR [#37](https://github.com/tiangolo/full-stack-fastapi-template/pull/37) by [@dmontagu](https://github.com/dmontagu).
-* Add new CRUD utils based on DB and Pydantic models. Initial PR [#23](https://github.com/tiangolo/full-stack-fastapi-template/pull/23) by [@ebreton](https://github.com/ebreton).
-* Add normal user testing Pytest fixture. PR [#20](https://github.com/tiangolo/full-stack-fastapi-template/pull/20) by [@ebreton](https://github.com/ebreton).
-
-## 0.4.0 (2019-05-29)
-
-* Fix security on resetting a password. Receive token as body, not query. PR [#34](https://github.com/tiangolo/full-stack-fastapi-template/pull/34).
-
-* Fix security on resetting a password. Receive it as body, not query. PR [#33](https://github.com/tiangolo/full-stack-fastapi-template/pull/33) by [@dmontagu](https://github.com/dmontagu).
-
-* Fix SQLAlchemy class lookup on initialization. PR [#29](https://github.com/tiangolo/full-stack-fastapi-template/pull/29) by [@ebreton](https://github.com/ebreton).
-
-* Fix SQLAlchemy operation errors on database restart. PR [#32](https://github.com/tiangolo/full-stack-fastapi-template/pull/32) by [@ebreton](https://github.com/ebreton).
-
-* Fix locations of scripts in generated README. PR [#19](https://github.com/tiangolo/full-stack-fastapi-template/pull/19) by [@ebreton](https://github.com/ebreton).
-
-* Forward arguments from script to `pytest` inside container. PR [#17](https://github.com/tiangolo/full-stack-fastapi-template/pull/17) by [@ebreton](https://github.com/ebreton).
-
-* Update development scripts.
-
-* Read Alembic configs from env vars. PR #9 by @ebreton.
-
-* Create DB Item objects from all Pydantic model's fields.
-
-* Update Jupyter Lab installation and util script/environment variable for local development.
-
-## 0.3.0 (2019-04-19)
-
-* PR #14:
- * Update CRUD utils to use types better.
- * Simplify Pydantic model names, from `UserInCreate` to `UserCreate`, etc.
- * Upgrade packages.
- * Add new generic "Items" models, crud utils, endpoints, and tests. To facilitate re-using them to create new functionality. As they are simple and generic (not like Users), it's easier to copy-paste and adapt them to each use case.
- * Update endpoints/*path operations* to simplify code and use new utilities, prefix and tags in `include_router`.
- * Update testing utils.
- * Update linting rules, relax vulture to reduce false positives.
- * Update migrations to include new Items.
- * Update project README.md with tips about how to start with backend.
-
-* Upgrade Python to 3.7 as Celery is now compatible too. PR #10 by @ebreton.
-
-## 0.2.2 (2019-04-11)
-
-* Fix frontend hijacking /docs in development. Using latest https://github.com/tiangolo/node-frontend with custom Nginx configs in frontend. PR #6.
-
-## 0.2.1 (2019-03-29)
-
-* Fix documentation for *path operation* to get user by ID. PR #4 by @mpclarkson in FastAPI.
-
-* Set `/start-reload.sh` as a command override for development by default.
-
-* Update generated README.
-
-## 0.2.0 (2019-03-11)
-
-**PR #2**:
-
-* Simplify and update backend `Dockerfile`s.
-* Refactor and simplify backend code, improve naming, imports, modules and "namespaces".
-* Improve and simplify Vuex integration with TypeScript accessors.
-* Standardize frontend components layout, buttons order, etc.
-* Add local development scripts (to develop this project generator itself).
-* Add logs to startup modules to detect errors early.
-* Improve FastAPI dependency utilities, to simplify and reduce code (to require a superuser).
-
-## 0.1.2
-
-* Fix path operation to update self-user, set parameters as body payload.
-
-## 0.1.1
-
-Several bug fixes since initial publication, including:
-
-* Order of path operations for users.
-* Frontend sending login data in the correct format.
-* Add https://localhost variants to CORS.
diff --git a/scripts/add_latest_release_date.py b/scripts/add_latest_release_date.py
deleted file mode 100644
index 2e5e42001c..0000000000
--- a/scripts/add_latest_release_date.py
+++ /dev/null
@@ -1,40 +0,0 @@
-"""Check release-notes.md and add today's date to the latest release header if missing."""
-
-import re
-import sys
-from datetime import date
-
-RELEASE_NOTES_FILE = "release-notes.md"
-RELEASE_HEADER_PATTERN = re.compile(r"^## (\d+\.\d+\.\d+)\s*(\(.*\))?\s*$")
-
-
-def main() -> None:
- with open(RELEASE_NOTES_FILE) as f:
- lines = f.readlines()
-
- for i, line in enumerate(lines):
- match = RELEASE_HEADER_PATTERN.match(line)
- if not match:
- continue
-
- version = match.group(1)
- date_part = match.group(2)
-
- if date_part:
- print(f"Latest release {version} already has a date: {date_part}")
- sys.exit(0)
-
- today = date.today().isoformat()
- lines[i] = f"## {version} ({today})\n"
- print(f"Added date: {version} ({today})")
-
- with open(RELEASE_NOTES_FILE, "w") as f:
- f.writelines(lines)
- sys.exit(0)
-
- print("No release header found")
- sys.exit(1)
-
-
-if __name__ == "__main__":
- main()
diff --git a/scripts/generate-client.sh b/scripts/generate-client.sh
deleted file mode 100644
index dc7640bcb4..0000000000
--- a/scripts/generate-client.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#! /usr/bin/env bash
-
-set -e
-set -x
-
-cd backend
-uv run python -c "import app.main; import json; print(json.dumps(app.main.app.openapi()))" > ../openapi.json
-cd ..
-mv openapi.json frontend/
-bun run --filter frontend generate-client
-bun run lint
diff --git a/scripts/test-local.sh b/scripts/test-local.sh
deleted file mode 100644
index 7f2fa9fbce..0000000000
--- a/scripts/test-local.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#! /usr/bin/env bash
-
-# Exit in case of error
-set -e
-
-docker-compose down -v --remove-orphans # Remove possibly previous broken stacks left hanging after an error
-
-if [ $(uname -s) = "Linux" ]; then
- echo "Remove __pycache__ files"
- sudo find . -type d -name __pycache__ -exec rm -r {} \+
-fi
-
-docker-compose build
-docker-compose up -d
-docker-compose exec -T backend bash scripts/tests-start.sh "$@"
diff --git a/scripts/test.sh b/scripts/test.sh
deleted file mode 100644
index 6dabef7471..0000000000
--- a/scripts/test.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#! /usr/bin/env sh
-
-# Exit in case of error
-set -e
-set -x
-
-docker compose build
-docker compose down -v --remove-orphans # Remove possibly previous broken stacks left hanging after an error
-docker compose up -d
-docker compose exec -T backend bash scripts/tests-start.sh "$@"
-docker compose down -v --remove-orphans
|