# Project export: StudyHubby

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: CruzHacks 2025
- Tagline: Not Just an Assistant, Your Study Soulmate.
- Devpost: https://devpost.com/software/studyhubby
- GitHub: https://github.com/StudyHubby/front_end
- Demo: https://github.com/StudyHubby/back-end/tree/main
- Team: 2 GitHub contributor(s) — KYUTI3 (18 commits), Buyantogtokh Khurelbaatar (2 commits)

## Devpost submission (written by the team)

### Inspiration

: Oftentimes, we find studying for course content hard to follow and wish we always had some extra assistance when it came to studying. Lot's of AI tools existed but they were all over the place and we just wanted to make the one stop shop for studying. And that is why we made Study Hubby.

### What it does

: It takes in a transcript from your video lectures and then allow the user to have conversations with the chatbot to help students learn much better. It provides options to the user such as a helpful lecture chatbot, summarize key points in the lecture, and also provides a quiz system to further the users understanding of the topic. We also implemented a test system where the user has to explain the complex topic to a 5 year old in order to really gauge their understanding.

### How we built it

: We created our backend using a mix of fastapi and Python and also utilized the Gemini API service in order to create the AI generated content that will accelerate the student's learning. We created the frontend in NextJS and Tailwind CSS.

### Challenges we ran into

: Building the backend was quite difficult because we had to use fastapi and we never used it before and the learning curve was quite steep. Another challenge was the fact that we couldn't implement all the features that we wanted due to time constraints. We also learned that to use the caching function of Gemini, we needed a longer text transcript which was a challenge because not all course content will be long enough to fill it up so we decided not to use caching.

### Accomplishments we're proud of

: The fact that the basic AI functions were able to work and even the small parts of our code like the quiz parser, we are proud of because we put a lot of effort into it.

### What we learned

: We learned a bit about fastapi and how to implement it into our own apps to have a python based backend solution. We also learned the limits of AI generated content and how to make it more relevant to education.

### What's next

: We have a lot in the tank. For starters, we want it to be the center of all learning the user will engage in as we want to add multi user support and multi course support so the user does not need keep adding their lecture transcripts every time.

## README (from the GitHub repository)

No README available.

## Detected evidence (automated analysis)

Indexed codebase: 96 recognized source files, 224 KB.
- CSS (language) — detected in the code
- Next.js (technology) — detected in the code
- React (technology) — detected in the code
- Tailwind CSS (technology) — detected in the code
- TypeScript (language) — detected in the code
- FastAPI (technology) — claimed on Devpost, not found in the code
- Google Gemini (technology) — claimed on Devpost, not found in the code
- Python (language) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (103 of 103)

```
.gitignore
app/.DS_Store
app/assignments/page.tsx
app/courses/page.tsx
app/dashboard/page.tsx
app/globals.css
app/help-centre/page.tsx
app/inbox/page.tsx
app/landing/page.tsx
app/layout.tsx
app/live-classes/page.tsx
app/logout/page.tsx
app/page.tsx
app/practice-zone/page.tsx
app/settings/page.tsx
app/study-assistant/page.tsx
components.json
components/achievements.tsx
components/advanced-chat-bot.tsx
components/badges-received.tsx
components/chat-bot.tsx
components/courses-enrolled.tsx
components/dashboard.tsx
components/friends-panel.tsx
components/header.tsx
components/hours-spent.tsx
components/leaderboard.tsx
components/learning-buddy.tsx
components/learning-challenges.tsx
components/level-tracker.tsx
components/multiplayer-challenges.tsx
components/pending-work.tsx
components/points-display.tsx
components/progress-metrics.tsx
components/quiz-section.tsx
components/sidebar.tsx
components/story-section.tsx
components/theme-provider.tsx
components/ui/accordion.tsx
components/ui/alert-dialog.tsx
components/ui/alert.tsx
components/ui/aspect-ratio.tsx
components/ui/avatar.tsx
components/ui/badge.tsx
components/ui/breadcrumb.tsx
components/ui/button.tsx
components/ui/calendar.tsx
components/ui/card.tsx
components/ui/carousel.tsx
components/ui/chart.tsx
components/ui/checkbox.tsx
components/ui/collapsible.tsx
components/ui/command.tsx
components/ui/context-menu.tsx
components/ui/dialog.tsx
components/ui/drawer.tsx
components/ui/dropdown-menu.tsx
components/ui/footer.tsx
components/ui/form.tsx
components/ui/hero.tsx
components/ui/hover-card.tsx
components/ui/input-otp.tsx
components/ui/input.tsx
components/ui/label.tsx
components/ui/menubar.tsx
components/ui/Navbar.tsx
components/ui/navigation-menu.tsx
components/ui/pagination.tsx
components/ui/popover.tsx
components/ui/progress.tsx
components/ui/radio-group.tsx
components/ui/resizable.tsx
components/ui/scroll-area.tsx
components/ui/select.tsx
components/ui/separator.tsx
components/ui/sheet.tsx
components/ui/sidebar.tsx
components/ui/skeleton.tsx
components/ui/slider.tsx
components/ui/sonner.tsx
components/ui/switch.tsx
components/ui/table.tsx
components/ui/tabs.tsx
components/ui/textarea.tsx
components/ui/toast.tsx
components/ui/toaster.tsx
components/ui/toggle-group.tsx
components/ui/toggle.tsx
components/ui/tooltip.tsx
components/ui/use-mobile.tsx
components/ui/use-toast.ts
components/weekly-streaks.tsx
hooks/use-mobile.tsx
hooks/use-toast.ts
lib/utils.ts
next-env.d.ts
next.config.mjs
package.json
postcss.config.mjs
public/models/Diamond.obj
styles/globals.css
tailwind.config.ts
tsconfig.json
```

### Dependencies

- package.json: @hookform/resolvers@^3.9.1, @radix-ui/react-accordion@^1.2.2, @radix-ui/react-alert-dialog@^1.1.4, @radix-ui/react-aspect-ratio@^1.1.1, @radix-ui/react-avatar@^1.1.2, @radix-ui/react-checkbox@^1.1.3, @radix-ui/react-collapsible@^1.1.2, @radix-ui/react-context-menu@^2.2.4, @radix-ui/react-dialog@^1.1.4, @radix-ui/react-dropdown-menu@^2.1.4, @radix-ui/react-hover-card@^1.1.4, @radix-ui/react-label@^2.1.1, @radix-ui/react-menubar@^1.1.4, @radix-ui/react-navigation-menu@^1.2.3, @radix-ui/react-popover@^1.1.4, @radix-ui/react-progress@^1.1.1, @radix-ui/react-radio-group@^1.2.2, @radix-ui/react-scroll-area@^1.2.2, @radix-ui/react-select@^2.1.4, @radix-ui/react-separator@^1.1.1, @radix-ui/react-slider@^1.2.2, @radix-ui/react-slot@^1.1.1, @radix-ui/react-switch@^1.1.2, @radix-ui/react-tabs@^1.1.2, @radix-ui/react-toast@^1.2.4, @radix-ui/react-toggle@^1.1.1, @radix-ui/react-toggle-group@^1.1.1, @radix-ui/react-tooltip@^1.1.6, @types/node@^22, @types/react@^19, @types/react-dom@^19, autoprefixer@^10.4.20, axios@^1.8.4, class-variance-authority@^0.7.1, clsx@^2.1.1, cmdk@1.0.4, date-fns@4.1.0, embla-carousel-react@8.5.1, input-otp@1.4.1, lucide-react@^0.454.0, next@15.2.4, next-themes@^0.4.4, postcss@^8, react@^19, react-day-picker@8.10.1, react-dom@^19, react-hook-form@^7.54.1, react-resizable-panels@^2.1.7, recharts@2.15.0, sonner@^1.7.1, tailwind-merge@^2.5.5, tailwindcss@^3.4.17, tailwindcss-animate@^1.0.7, typescript@^5, vaul@^0.9.6, zod@^3.24.1

### Recent commits (newest first)

- front-end ready to accept back-end
- added access to file functionality - dashboard
- rm a-frame
- (almost) ready for back-end interaction
- fixed protuding gray border
- header fixed
- dashboard being fixed
- landing page (75% complete)
- mandatory progress
- updated hero
- landing page minor updates
- navbar implmentation
- navbar for landing
- landing page 0.5
- tweaks for landing ui
- progress
- small ui additions
- small update
- Remove node_modules from git tracking
- initial

## Key source files (fetched from GitHub, selected and truncated for size)

### package.json

```
{
  "name": "my-v0-project",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
  "dependencies": {
    "@hookform/resolvers": "^3.9.1",
    "@radix-ui/react-accordion": "^1.2.2",
    "@radix-ui/react-alert-dialog": "^1.1.4",
    "@radix-ui/react-aspect-ratio": "^1.1.1",
    "@radix-ui/react-avatar": "^1.1.2",
    "@radix-ui/react-checkbox": "^1.1.3",
    "@radix-ui/react-collapsible": "^1.1.2",
    "@radix-ui/react-context-menu": "^2.2.4",
    "@radix-ui/react-dialog": "^1.1.4",
    "@radix-ui/react-dropdown-menu": "^2.1.4",
    "@radix-ui/react-hover-card": "^1.1.4",
    "@radix-ui/react-label": "^2.1.1",
    "@radix-ui/react-menubar": "^1.1.4",
    "@radix-ui/react-navigation-menu": "^1.2.3",
    "@radix-ui/react-popover": "^1.1.4",
    "@radix-ui/react-progress": "^1.1.1",
    "@radix-ui/react-radio-group": "^1.2.2",
    "@radix-ui/react-scroll-area": "^1.2.2",
    "@radix-ui/react-select": "^2.1.4",
    "@radix-ui/react-separator": "^1.1.1",
    "@radix-ui/react-slider": "^1.2.2",
    "@radix-ui/react-slot": "^1.1.1",
    "@radix-ui/react-switch": "^1.1.2",
    "@radix-ui/react-tabs": "^1.1.2",
    "@radix-ui/react-toast": "^1.2.4",
    "@radix-ui/react-toggle": "^1.1.1",
    "@radix-ui/react-toggle-group": "^1.1.1",
    "@radix-ui/react-tooltip": "^1.1.6",
    "autoprefixer": "^10.4.20",
    "axios": "^1.8.4",
    "class-variance-authority": "^0.7.1",
    "clsx": "^2.1.1",
    "cmdk": "1.0.4",
    "date-fns": "4.1.0",
    "embla-carousel-react": "8.5.1",
    "input-otp": "1.4.1",
    "lucide-react": "^0.454.0",
    "next": "15.2.4",
    "next-themes": "^0.4.4",
    "react": "^19",
    "react-day-picker": "8.10.1",
    "react-dom": "^19",
    "react-hook-form": "^7.54.1",
    "react-resizable-panels": "^2.1.7",
    "recharts": "2.15.0",
    "sonner": "^1.7.1",
    "tailwind-merge": "^2.5.5",
    "tailwindcss-animate": "^1.0.7",
    "vaul": "^0.9.6",
    "zod": "^3.24.1"
  },
  "devDependencies": {
    "@types/node": "^22",
    "@types/react": "^19",
    "@types/react-dom": "^19",
    "postcss": "^8",
    "tailwindcss": "^3.4.17",
    "typescript": "^5"
  }
}

```

### app/page.tsx

```typescript
import { redirect } from "next/navigation"

export default function Home() {
  redirect("/landing")
}

```

### app/layout.tsx

```typescript
import type React from "react"
import type { Metadata } from "next"
import { Inter } from "next/font/google"
import "./globals.css"


const inter = Inter({ subsets: ["latin"] })

export const metadata: Metadata = {
  title: "StudyHubby",
  description: "Learning Amplified!",
    generator: 'v0.dev'
}

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode
}>) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <div className="flex min-h-screen w-full">
          
         {children} 
        </div>
      </body>
    </html>
  )
}


```

### app/study-assistant/page.tsx

```typescript
import { AdvancedChatBot } from "@/components/advanced-chat-bot"

export default function StudyAssistantPage() {
  return (
    <div className="max-w-3xl mx-auto py-8">
      <div className="h-[700px]">
        <AdvancedChatBot />
      </div>
    </div>
  )
}

```

### app/inbox/page.tsx

```typescript
import { Header } from "@/components/header"

export default function InboxPage() {
  return (
    <div className="max-w-7xl mx-auto">
      <Header />

      <div className="mt-10 text-center">
        <h1 className="text-2xl font-bold">Inbox</h1>
        <p className="mt-4 text-gray-600">Your messages and notifications will appear here.</p>
      </div>
    </div>
  )
}

```

### app/settings/page.tsx

```typescript
import { Header } from "@/components/header"

export default function SettingsPage() {
  return (
    <div className="max-w-7xl mx-auto">
      <Header />

      <div className="mt-10 text-center">
        <h1 className="text-2xl font-bold">Settings</h1>
        <p className="mt-4 text-gray-600">Manage your account settings and preferences.</p>
      </div>
    </div>
  )
}

```

### app/help-centre/page.tsx

```typescript
import { Header } from "@/components/header"

export default function HelpCentrePage() {
  return (
    <div className="max-w-7xl mx-auto">
      <Header />

      <div className="mt-10 text-center">
        <h1 className="text-2xl font-bold">Help Centre</h1>
        <p className="mt-4 text-gray-600">Find answers to your questions and get support.</p>
      </div>
    </div>
  )
}

```

### app/live-classes/page.tsx

```typescript
import { Header } from "@/components/header"

export default function LiveClassesPage() {
  return (
    <div className="max-w-7xl mx-auto">
      <Header />

      <div className="mt-10 text-center">
        <h1 className="text-2xl font-bold">Live Classes</h1>
        <p className="mt-4 text-gray-600">Your scheduled live classes will appear here.</p>
      </div>
    </div>
  )
}

```

### app/practice-zone/page.tsx

```typescript
import { Header } from "@/components/header"

export default function PracticeZonePage() {
  return (
    <div className="max-w-7xl mx-auto">
      <Header />

      <div className="mt-10 text-center">
        <h1 className="text-2xl font-bold">Practice Zone</h1>
        <p className="mt-4 text-gray-600">Practice exercises and challenges will appear here.</p>
      </div>
    </div>
  )
}

```

### app/assignments/page.tsx

```typescript
import { Header } from "@/components/header"

export default function AssignmentsPage() {
  return (
    <div className="max-w-7xl mx-auto">
      <Header />

      <div className="mt-10 text-center">
        <h1 className="text-2xl font-bold">Assignments</h1>
        <p className="mt-4 text-gray-600">Your pending and completed assignments will appear here.</p>
      </div>
    </div>
  )
}

```

[86 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]