frontend/src
src/
├─ app/
│  ├─ (auth)/         # /login /register /forgot-password /reset-password /verify-otp
│  ├─ (dashboard)/    # /dashboard + settings sub-pages
│  ├─ admin/          # /admin user management
│  ├─ auth/verify-otp/ # OTP entry page (email + Google sign-in)
│  ├─ auth/callback/  # legacy OAuth landing page
│  ├─ (marketing)/    # landing pages (Navbar shown)
│  └─ (docs)/docs/    # this documentation portal
├─ components/       # ui/ primitives, layout, docs/, providers/
├─ context/          # LanguageContext (en|mm in localStorage)
├─ store/            # Redux Toolkit: store/index.ts + store/api/*
└─ lib/              # translations, utils, docs data

frontend/next.config.ts (verbatim)
async rewrites() {
  const apiBase = process.env.NEXT_PUBLIC_API_URL || "http://localhost:5000";
  return [{ source: "/api/v1/:path*", destination: `${apiBase}/:path*` }];
}

store/api/baseApi.ts (verbatim)
const baseQuery = fetchBaseQuery({
  baseUrl: "/api/v1",
  credentials: "include",
  prepareHeaders: (headers) => {
    headers.set("Content-Type", "application/json");
    return headers;
  },
});

export const baseApi = createApi({
  reducerPath: "api",
  baseQuery,
  tagTypes: ["User", "Auth", "Admin", "Token"],
  endpoints: () => ({}),
});

import { baseApi } from "@/store/api/baseApi";
import { createApi } from "@reduxjs/toolkit/query/react";

export const authApi = createApi({
  reducerPath: "authApi",
  baseQuery: baseQuery, // reuse the shared baseQuery
  endpoints: (builder) => ({
    login: builder.mutation<AuthResponse, LoginRequest>({
      query: (credentials) => ({ url: "/auth/login", method: "POST", body: credentials }),
    }),
  },
});