diff --git a/README.md b/README.md
index 024ebd4..9a54afd 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ The full project description and specification are in [docs/Specifications for p
## Link to VM
-http://it2810-03.idi.ntnu.no/project2
+http://it2810-03.idi.ntnu.no/project2/
## Core features
@@ -20,6 +20,19 @@ http://it2810-03.idi.ntnu.no/project2
- **Profile:** Your preferences and saved plants in one place.
- **Language and theme:** The app is available in English and Norwegian, and has a light and a dark theme.
+## Accessibility
+
+The app includes the following accessibility features:
+
+- **Page structure:** Semantic `header`, `nav`, `main` and `article` elements organise the content. Sidebar navigation has an accessible name, and the current page is marked with `aria-current="page"`.
+- **Keyboard controls:** Navigation uses links, and actions use native buttons. Sidebar links, pagination, sorting controls and avatar options have explicit focus styles. Plant Match instructions are also shown when their control receives focus.
+- **Forms and images:** Search, filters and profile inputs have associated labels. Plant images use the plant name as alternative text, and profile and avatar images also include alternative text.
+- **Control states:** The sort menu exposes its expanded state, and sort and avatar choices expose their selected state with ARIA attributes. Pagination announces page changes through an `aria-live="polite"` region.
+- **Plant cards:** The inactive side of a flipped card is hidden from assistive technology with `aria-hidden`, and its information button is removed from the keyboard tab order.
+- **Reduced motion:** The card flip and My Matches hover transitions are disabled when the user requests reduced motion.
+
+The deployed production version received an Accessibility score of **100 in Lighthouse** in our latest reported run. Automated component tests also check selected accessible names, navigation state and sorting states. This does not establish full WCAG compliance; a complete manual keyboard and screen reader audit has not been verified here.
+
## Tech stack
| Part | Technology |
diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md
index 741e068..d42ead8 100644
--- a/docs/ARCHITECTURE.md
+++ b/docs/ARCHITECTURE.md
@@ -22,7 +22,7 @@ The sections below describe each part in more detail.
The frontend is built with React and TypeScript (Vite).
-- **Routing:** Routes are defined in `AppRoutes.tsx` with React Router, and the app is served under the base path `/project2`.
+- **Routing:** Routes are defined in `AppRoutes.tsx` with React Router, and the app is served under the base path `/project2/`. Vite defines this base in `frontend/vite.config.ts`; `BrowserRouter` uses the same value through `import.meta.env.BASE_URL`, including the trailing slash for home links.
- **Reusable logic in hooks:** Logic without UI is kept in hooks. `useDebounce` delays updates while the user is typing, and `useSessionState` stores state in `sessionStorage`.
- **Internationalisation:** Text is stored in translation files for Norwegian and English (i18next).
- **Shared types and helpers:** `Plant` and `Preference` are defined in `types/`, and helper functions such as `isPreferenceMatch` in `utils/`.
diff --git a/frontend/public/plant-placeholder.png b/frontend/public/plant-placeholder.png
index a6fceef..c9a0f74 100644
Binary files a/frontend/public/plant-placeholder.png and b/frontend/public/plant-placeholder.png differ
diff --git a/frontend/src/AppRoutes.tsx b/frontend/src/AppRoutes.tsx
index fcc3320..3059f2b 100644
--- a/frontend/src/AppRoutes.tsx
+++ b/frontend/src/AppRoutes.tsx
@@ -1,8 +1,12 @@
+import { lazy, Suspense } from "react";
import { Route, Routes } from "react-router-dom";
import PlantMatchPage from "./pages/plantMatch/PlantMatchPage.tsx";
-import ExplorePlants from "./pages/explorePlants/ExplorePlants.tsx";
-import MyMatchesPage from "./pages/myMatches/MyMatchesPage.tsx";
-import Profile from "./pages/profile/Profile.tsx";
+
+const ExplorePlants = lazy(
+ () => import("./pages/explorePlants/ExplorePlants.tsx"),
+);
+const MyMatchesPage = lazy(() => import("./pages/myMatches/MyMatchesPage.tsx"));
+const Profile = lazy(() => import("./pages/profile/Profile.tsx"));
// eslint-disable-next-line react-refresh/only-export-components
export const ROUTES = {
@@ -14,12 +18,14 @@ export const ROUTES = {
function AppRoutes() {
return (
-