diff --git a/.lazydev/memory/global_repo_structure.md b/.lazydev/memory/global_repo_structure.md
new file mode 100644
index 0000000..3ea5863
--- /dev/null
+++ b/.lazydev/memory/global_repo_structure.md
@@ -0,0 +1,17 @@
+
+
+This is a **Next.js (App Router) + TypeScript** full-stack web application, styled with **Tailwind CSS** and **shadcn/ui** components. It uses **MongoDB** (via `lib/mongodb.ts`) as its database and is managed with **pnpm**.
+
+The project centers on a **question-bank / exam-management** platform. Its main functional areas are:
+
+- **Public-facing UI** (`app/page.tsx`, `components/home/`, `components/question-card.tsx`, `components/exam-type-selector.tsx`): browse questions, submit new questions through a modal, and select exam types.
+- **Admin area** (`app/admin/page.tsx`, `components/admin/`): view question list and manage pending approvals.
+- **API routes** (`app/api/`): handle exam-type retrieval, question submission, individual question updates, and data seeding/migration.
+- **Authentication** (`components/auth-provider.tsx`, `app/login/page.tsx`): supports login/authentication (likely session-based via provider).
+- **Scripts** (`scripts/`): TypeScript utilities for seeding exam types and updating existing questions.
+
+**Business logic** resides primarily in the **API route handlers** (`app/api/**`) and **database utility** (`lib/mongodb.ts`), with type definitions in `lib/types.ts`. Scripts contain one-off data operations. UI logic lives inside components and hooks.
+
+**Tests**: No test files or test directories are present.
+
+**Tech stack summary**: Next.js (App Router), React, TypeScript, Tailwind CSS, shadcn/ui, MongoDB, pnpm, Prettier, PostCSS.
diff --git a/.serena/.gitignore b/.serena/.gitignore
new file mode 100644
index 0000000..2e510af
--- /dev/null
+++ b/.serena/.gitignore
@@ -0,0 +1,2 @@
+/cache
+/project.local.yml
diff --git a/.serena/project.yml b/.serena/project.yml
new file mode 100644
index 0000000..66a7b9c
--- /dev/null
+++ b/.serena/project.yml
@@ -0,0 +1,169 @@
+# the name by which the project can be referenced within Serena/when chatting with the LLM.
+project_name: "mcp-3eb240a7-2a6d-42b3-8732-736fc1163050"
+
+# list of language servers to start when using the LSP backend; choose from:
+# ada al angular ansible bash
+# bsl clojure cpp cpp_ccls crystal
+# csharp csharp_omnisharp cue dart deno
+# elixir elm erlang fortran fsharp
+# gdscript gleam go groovy haskell
+# haxe hlsl html java json
+# julia kotlin latex lean4 lua
+# luau markdown matlab msl nextflow
+# nix ocaml pascal perl php
+# php_phpactor php_phpantom powershell python python_basedpyright
+# python_jedi python_pyrefly python_ty qml r
+# rego ruby ruby_solargraph rust scala
+# scss solidity svelte swift systemverilog
+# terraform toml typescript typescript_vts vue
+# wolfram yaml zig
+# (This list may be outdated; generated with scripts/print_language_list.py;
+# For the current list, see values of the LanguageServerId enum here:
+# https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py)
+# For some languages, there are several alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.)
+# Note:
+# - For C, use cpp
+# - For JavaScript, use typescript
+# - For Angular projects, use angular (subsumes typescript+html; requires `npm install` in the project root)
+# - For Svelte projects, use svelte (subsumes typescript/javascript for .svelte projects; requires npm)
+# - For Deno projects, use deno (serves the same .ts/.js files as typescript; requires the deno CLI on PATH)
+# - For SCSS / Sass / plain CSS, use scss (some-sass-language-server handles all three)
+# - For Free Pascal/Lazarus, use pascal
+# Special requirements:
+# Some language servers require additional setup/installations.
+# See here for details: https://oraios.github.io/serena/01-about/020_programming-languages.html#language-servers
+# When using multiple language servers, the first language server that supports a given file will be used for that file.
+# The first language server is the default language and the respective language server will be used as a fallback.
+# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored.
+language_servers:
+- typescript
+
+# the encoding used by text files in the project
+# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings
+encoding: "utf-8"
+
+# optional shell command to run before the language backend (LSP or JetBrains) is initialised.
+# the command runs in the project root directory and is only executed if the project is trusted
+# (see trusted_project_path_patterns in the global configuration).
+# serena waits for the command to exit: a non-zero exit code is logged as an error but does not
+# abort activation. a per-project timeout (activation_command_timeout, default 180s) is the safety
+# backstop for non-terminating commands; on expiry the process is killed and activation continues.
+# example: activation_command: "npx nx run-many -t build"
+activation_command:
+
+# maximum time in seconds to wait for activation_command to complete before killing it (default 180s).
+# must be a positive number.
+activation_command_timeout: 180.0
+
+# line ending convention to use when writing source files.
+# Possible values: unset (use global setting), "lf", "crlf", or "native" (platform default)
+# This does not affect Serena's own files (e.g. memories and configuration files), which always use native line endings.
+line_ending:
+
+# The language backend to use for this project.
+# If not set, the global setting from serena_config.yml is used.
+# Valid values: LSP, JetBrains
+# Note: the backend is fixed at startup. If a project with a different backend
+# is activated post-init, an error will be returned.
+language_backend:
+
+# whether to use project's .gitignore files to ignore files
+ignore_all_files_in_gitignore: true
+
+# advanced configuration option allowing to configure language server-specific options.
+# Maps the language key to the options.
+# The settings are considered only if the project is trusted (see global configuration to define trusted projects).
+# See https://oraios.github.io/serena/02-usage/050_configuration.html#language-server-specific-settings
+ls_specific_settings: {}
+
+# list of workspace folder paths (LSP backend only).
+# These folders will be used to build up Serena's symbol index.
+# Paths must be within the project root and should thus be relative to the project root.
+# Furthermore, the paths should not be filtered by ignore settings.
+# Default setting: The entire project root folder (".") is considered.
+# In (large) monorepos, this can be used to index only subfolders of the project root, e.g.
+# ls_workspace_folders:
+# - "./subproject1"
+# - "./subproject2"
+ls_workspace_folders:
+- "."
+
+# list of additional workspace folder paths for cross-package reference support.
+# Paths can be absolute or relative to the project root.
+# Each folder is registered as an LSP workspace folder, enabling language servers to discover
+# symbols and references across package boundaries, but these folders are not indexed by Serena,
+# i.e. the respective symbols will not be found using Serena's symbol search tools.
+# Example:
+# additional_workspace_folders:
+# - ../sibling-package
+# - ../shared-lib
+ls_additional_workspace_folders: []
+
+# list of additional paths to ignore in this project.
+# Same syntax as gitignore, so you can use * and **.
+# Important: quote patterns that start with `*`, otherwise YAML treats them as aliases.
+# Example:
+# ignored_paths:
+# - "examples/**"
+# - ".worktrees/**"
+# - "**/bin/**"
+# - "**/obj/**"
+# Note: global ignored_paths from serena_config.yml are also applied additively.
+ignored_paths: []
+
+# whether the project is in read-only mode
+# If set to true, all editing tools will be disabled and attempts to use them will result in an error
+# Added on 2025-04-18
+read_only: false
+
+# list of tool names to exclude.
+# This extends the existing exclusions (e.g. from the global configuration)
+# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html
+excluded_tools: []
+
+# list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default).
+# This extends the existing inclusions (e.g. from the global configuration).
+# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html
+included_optional_tools: []
+
+# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools.
+# This cannot be combined with non-empty excluded_tools or included_optional_tools.
+# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html
+fixed_tools: []
+
+# list of mode names that are to be activated by default, overriding the setting in the global configuration.
+# The full set of modes to be activated is base_modes (from global config) + default_modes + added_modes.
+# If the setting is undefined/empty, the default_modes from the global configuration (serena_config.yml) apply.
+# Otherwise, this overrides the setting from the global configuration (serena_config.yml).
+# Therefore, you can set this to [] if you do not want the default modes defined in the global config to apply
+# for this project.
+# This setting can, in turn, be overridden by CLI parameters (--mode).
+# See https://oraios.github.io/serena/02-usage/050_configuration.html#modes
+default_modes:
+
+# list of mode names to be activated additionally for this project, e.g. ["query-projects"]
+# The full set of modes to be activated is base_modes (from global config) + default_modes + added_modes.
+# See https://oraios.github.io/serena/02-usage/050_configuration.html#modes
+added_modes:
+
+# initial prompt for the project. It will always be given to the LLM upon activating the project
+# (contrary to the memories, which are loaded on demand).
+initial_prompt: ""
+
+# time budget (seconds) per tool call for the retrieval of additional symbol information
+# such as docstrings or parameter information.
+# This overrides the corresponding setting in the global configuration; see the documentation there.
+# If null or missing, use the setting from the global configuration.
+symbol_info_budget:
+
+# list of regex patterns which, when matched, mark a memory entry as read‑only.
+# Extends the list from the global configuration, merging the two lists.
+read_only_memory_patterns: []
+
+# list of regex patterns for memories to completely ignore.
+# Matching memories will not appear in list_memories or activate_project output
+# and cannot be accessed via read_memory or write_memory.
+# To access ignored memory files, use the read_file tool on the raw file path.
+# Extends the list from the global configuration, merging the two lists.
+# Example: ["_archive/.*", "_episodes/.*"]
+ignored_memory_patterns: []
diff --git a/src/data/sampleLatestQuestions.ts b/src/data/sampleLatestQuestions.ts
new file mode 100644
index 0000000..875f454
--- /dev/null
+++ b/src/data/sampleLatestQuestions.ts
@@ -0,0 +1,59 @@
+export interface SampleAnswer {
+ id: string;
+ author: string;
+ content: string;
+}
+
+export interface SampleQuestion {
+ id: string;
+ title: string;
+ body: string;
+ author: string;
+ createdAt: string;
+ answers: SampleAnswer[];
+}
+
+export const sampleLatestQuestions: SampleQuestion[] = [
+ {
+ id: 'sample-1',
+ title: 'How do I set up authentication in React?',
+ body: 'I am new to React and want to add login/signup to my app. What is the recommended approach?',
+ author: 'new_developer',
+ createdAt: '2025-01-04T10:00:00Z',
+ answers: [
+ {
+ id: 'sample-1-answer-1',
+ author: 'auth_expert',
+ content: 'Start with an AuthContext and protect routes using a route guard component.',
+ },
+ ],
+ },
+ {
+ id: 'sample-2',
+ title: 'Best way to fetch latest questions from an API?',
+ body: 'I need to display the most recent questions on a page. Should I fetch on mount or use a library?',
+ author: 'curious_coder',
+ createdAt: '2025-01-04T09:30:00Z',
+ answers: [
+ {
+ id: 'sample-2-answer-1',
+ author: 'api_guru',
+ content: 'Fetch on mount with useEffect and handle loading/error states for the best user experience.',
+ },
+ ],
+ },
+ {
+ id: 'sample-3',
+ title: 'How should I structure a Q&A app router?',
+ body: 'What is a clean way to organize routes and route guards in React Router?',
+ author: 'app_builder',
+ createdAt: '2025-01-04T08:45:00Z',
+ answers: [
+ {
+ id: 'sample-3-answer-1',
+ author: 'router_pro',
+ content: 'Use a dedicated routes file and compose route guards around protected routes.',
+ },
+ ],
+ },
+];
\ No newline at end of file
diff --git a/src/pages/OnboardingPage.tsx b/src/pages/OnboardingPage.tsx
new file mode 100644
index 0000000..d5513dd
--- /dev/null
+++ b/src/pages/OnboardingPage.tsx
@@ -0,0 +1,35 @@
+import { Link } from 'react-router-dom';
+import { sampleLatestQuestions } from '../data/sampleLatestQuestions';
+
+export function OnboardingPage() {
+ return (
+
+
+
Welcome to Q&A Hub
+
Join the community to ask questions, share answers, and connect with other developers.
+
+ Sign in
+ Create an account
+
+
+
+
+
Latest questions
+ {sampleLatestQuestions.map((question) => (
+
+
{question.title}
+
{question.body}
+
+ {question.answers.map((answer) => (
+
+ {answer.author}
+
{answer.content}
+
+ ))}
+
+
+ ))}
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/routes/RouteGuard.tsx b/src/routes/RouteGuard.tsx
new file mode 100644
index 0000000..a1c4723
--- /dev/null
+++ b/src/routes/RouteGuard.tsx
@@ -0,0 +1,22 @@
+import { Navigate, Outlet, useLocation } from 'react-router-dom';
+import { useAuth } from '../context/AuthContext';
+
+export function RouteGuard() {
+ const { user, loading } = useAuth();
+ const location = useLocation();
+ const isOnboarding = location.pathname === '/onboarding';
+
+ if (loading) {
+ return null;
+ }
+
+ if (!user && !isOnboarding) {
+ return ;
+ }
+
+ if (user && isOnboarding) {
+ return ;
+ }
+
+ return ;
+}
\ No newline at end of file