# Project export: SlugQuest

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: A fun way to do future academic planning at UCSC!
- Devpost: https://devpost.com/software/slugquest
- GitHub: https://github.com/Brightonca/SlugQuest
- Team: 4 GitHub contributor(s) — duashmita (11 commits), Brighton Alcantara (9 commits), kdelmo1 (2 commits), nisergdesai (2 commits)

## Devpost submission (written by the team)

### Inspiration

As a new quarter approaches, many students have to look through several websites to decide which classes they want to take, starting from UCSC Class search, Catalogue, Rate My Professor, My Scheduler (and sometimes even Reddit!). SlugQuest provides a platform for such students to understand their course requirements, plan their quarters, and get the best fully online advice available.

### What it does

SlugQuest requires an input of your most recent unofficial transcript, through which it analyzes which course you can take next quarter, according to prerequisites, scheduling, and professor rating. This output is put into words by our very one "Samuel the Advisor", and visually represented by an interactive flowchart on our website.

### How we built it

To build this Web app, we used the following data Data Obtaining We webscraped several websites, including Rate My Professor, Class Search, and the schedule for the next few quarters, using Beautiful Soup and Selenium Python libraries. We ask the user to upload their transcript to gain better insights into the courses they have completed, how many credits they have earned, and more personalised insights into their academic journey. ### Data processing Using the transcript, we understand which courses the user has taken, through which we determine the future courses the user has met the prerequisites for. The courses that the user is eligible to take are then filtered based on whether they are available next quarter or not. Then the code looks at the professors teaching the courses next quarter using the data obtained by scraping the UCSC Course Schedule. The list of professors obtained is then used to scrape their Rate My Professor rating. ### LLM Processing Then all of this data is sent to Gemini using an API Call to give it 'large context' on the conversation and role that's about to play for the user.

### Challenges we ran into

RMP WebScraping: Beautiful Soup was not able to scrape the RMP data, and even after switching to the Selenium Python library, it took a while to get the code going. Requirements Database: UCSC does not have a real requirements or classes database, so we had to manually type in the requirements for each class.

### Accomplishments we're proud of

The UI Graphics: We are very proud of how our graphics for SlugQuest came out, representing a mix of Stardew Valley and Minecraft RMP WebScrapper: Rate My Professor has a complex HTML and JS interface, so it was a challenge to webscrape the website. Developing a fully operational LLM Chatbot that reads documents: "Samuel the Advisor" understands your academic standing and advises you ahead.

### What we learned

Through this project, we learnt many skills, including: Better Web scraping skills Making proper API Calls Giving a Larger context through an API call Understanding which data would be relevant and controlling the data that goes to Gemini

### What's next

The following are some of the features we would have loved to implement if we had more time: 4-year planner with drag-and-drop with credits chart Database for faster scraping Make it for more majors GE Tracker Interest-based 4-year plan developer A more robust LLM Model that helps edit the schedule GPA Calculator More graphics to gamify it better: Progress bars, characters, interactive blocks for classes Making the website mobile-friendly

## README (from the GitHub repository)

# SlugQuest

To run this code, install django and run `python3 manage.py runserver`


## Detected evidence (automated analysis)

Indexed codebase: 53 recognized source files, 105 KB.
- CSS (language) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- Python (language) — detected in the code
- React (technology) — detected in the code
- Tailwind CSS (technology) — detected in the code
- Django (technology) — claimed on Devpost, not found in the code
- Google Gemini (technology) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (70 of 70)

```
__MACOSX/slug_quest/._.DS_Store
__MACOSX/slug_quest/templates/._slug_quest
.gitignore
backend/SlugBot/creatingState.py
backend/SlugBot/GeminiBootCalls.py
backend/SlugBot/state.py
backend/SlugBot/webscraping/class_search.py
backend/SlugBot/webscraping/rmp.py
backend/SlugBot/webscraping/schedule.py
backend/test.txt
classes.json
courses_2025_Fall25.json
CRUZHACKS2025/__init__.py
CRUZHACKS2025/.env
CRUZHACKS2025/asgi.py
CRUZHACKS2025/settings.py
CRUZHACKS2025/urls.py
CRUZHACKS2025/wsgi.py
db.sqlite3
frontend/map.html
frontend/test.txt
LICENSE
manage.py
README.md
slug_quest/__init__.py
slug_quest/.DS_Store
slug_quest/.env
slug_quest/admin.py
slug_quest/apps.py
slug_quest/db.sqlite3
slug_quest/forms.py
slug_quest/manage.py
slug_quest/migrations/__init__.py
slug_quest/migrations/0001_initial.py
slug_quest/migrations/0002_professor.py
slug_quest/models.py
slug_quest/rmp.py
slug_quest/templates/slug_quest/dashboard.html
slug_quest/templates/slug_quest/home.html
slug_quest/templates/slug_quest/login.html
slug_quest/templates/slug_quest/main.html
slug_quest/templates/slug_quest/upload_pdf.html
slug_quest/templates/slug_quest/upload_success.html
slug_quest/tests.py
slug_quest/urls.py
slug_quest/utils/models.py
slug_quest/utils/professors.py
slug_quest/utils/rmp.py
slug_quest/views.py
slug_quest/webscraping/class_search.py
slug_quest/webscraping/rmp.py
slug_quest/webscraping/schedule.py
slugquest-react/.gitignore
slugquest-react/package.json
slugquest-react/public/index.html
slugquest-react/public/manifest.json
slugquest-react/public/robots.txt
slugquest-react/README.md
slugquest-react/src/App.css
slugquest-react/src/App.js
slugquest-react/src/App.test.js
slugquest-react/src/courseMap.js
slugquest-react/src/index.css
slugquest-react/src/index.js
slugquest-react/src/login.js
slugquest-react/src/map.html
slugquest-react/src/reportWebVitals.js
slugquest-react/src/setupTests.js
slugquest-react/src/upload.js
slugquest-react/tailwind.config.js
```

### Dependencies

- slugquest-react/package.json: @testing-library/dom@^10.4.0, @testing-library/jest-dom@^6.6.3, @testing-library/react@^16.3.0, @testing-library/user-event@^13.5.0, react@^19.1.0, react-dom@^19.1.0, react-router-dom@^7.5.0, react-scripts@^5.0.1, tailwindcss@^3.4.17, web-vitals@^2.1.4

### Recent commits (newest first)

- add kyle's django server files and finish hackathon project
- add forest paths to forest jpeg
- Merge branch 'main' of https://github.com/Brightonca/SlugQuest
- make map and arranged levels in the map
- middle name + new api hopefully
- api unpublic
- Convo LLM
- Add new web scraping functionality for course schedules and professor information, along with JSON data files for courses and transcripts. Remove outdated class search and RMP scripts. Update .gitignore to exclude unnecessary files.
- Merge branch 'main' of https://github.com/Brightonca/CSSlugHandbook
- add hovering syncing functionality
- Eligible Courses
- Merge branch 'main' of https://github.com/Brightonca/SlugQuest
- fix tailwind styling
- Add .gitignore, remove slugbot.py, add PDF transcript, and enhance user progress tracking
- Merge branch 'main' of https://github.com/Brightonca/CSSlugHandbook
- rename react code folder
- pushing niserg's graphics and map code
- Finished web scraping
- Added webscraping for class search and RMP
- Merge branch 'main' of https://github.com/Brightonca/CSSlugHandbook

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

### slugquest-react/package.json

```
{
  "name": "slugquest",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/dom": "^10.4.0",
    "@testing-library/jest-dom": "^6.6.3",
    "@testing-library/react": "^16.3.0",
    "@testing-library/user-event": "^13.5.0",
    "react": "^19.1.0",
    "react-dom": "^19.1.0",
    "react-router-dom": "^7.5.0",
    "react-scripts": "^5.0.1",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "tailwindcss": "^3.4.17"
  }
}

```

### slugquest-react/src/App.js

```javascript
import React, { useState } from 'react';
import Login from './login';
import Upload from './upload';
import CourseMap from './courseMap';

const App = () => {
  const [loggedIn, setLoggedIn] = useState(true);
  const [uploaded, setUploaded] = useState(true);

  if (!loggedIn) {
    return <Login onLogin={() => setLoggedIn(true)} />;
  }

  if (!uploaded) {
    return <Upload onUpload={() => setUploaded(true)} />;
  }

  return <>
    <div className="topnav">
      <CourseMap />
    </div>
  </>;
};

export default App;

```

### slugquest-react/src/index.js

```javascript
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

```

### manage.py

```python
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'CRUZHACKS2025.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

```

### slug_quest/tests.py

```python
from django.test import TestCase

# Create your tests here.

```

### slug_quest/forms.py

```python
# forms.py
from django import forms

class PDFUploadForm(forms.Form):
    file = forms.FileField()

```

### slug_quest/admin.py

```python
from django.contrib import admin

# Register your models here.
from .models import UploadedPDF

admin.site.register(UploadedPDF)
```

### slug_quest/apps.py

```python
from django.apps import AppConfig


class SlugQuestConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'slug_quest'

```

### slugquest-react/tailwind.config.js

```javascript
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["./src/**/*.{js,jsx,ts,tsx}"],
  theme: {
    extend: {},
  },
  plugins: [],
}


```

### slug_quest/urls.py

```python
from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('login/', views.login_page, name='login'),
    path("sign-in-callback", views.sign_in_callback, name="sign_in_callback"),
    path("dashboard/", views.dashboard, name="dashboard"),
    path('upload/', views.upload_pdf, name='upload_pdf'),
    path('main/', views.main, name='main')
]
```

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