# Project export: ganc

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: Club management doesn’t have to be chaotic. Our all-in-one platform helps you glide through attendance tracking.
- Devpost: https://devpost.com/software/ganc
- GitHub: https://github.com/nathanyu8th/CruzHacks2025
- Demo: https://drive.google.com/file/d/11zIz7Ev-HvOaKI_66jYNfS_AwPvhDS0F/view?usp=sharing
- Team: 3 GitHub contributor(s) — nathanyu8th (27 commits), gurnoor (19 commits), Christina Chan (2 commits)

## Devpost submission (written by the team)

### Inspiration

Endless scrolling, messy spreadsheets, and the overwhelming task of planning events while managing membership rosters. Many student organizations depend on accurate membership data for grants and funding, making it crucial for organizations to succeed. But tracking attendance across numerous meetings can be confusing with so many Google Sheets and forms to juggle. That’s how we thought of ganc, a one stop solution for organizing events and managing membership data. As curious learners, we decided to make our own solution.

### What it does

ganc is a platform that streamlines event planning and membership management for university organizations and individuals at UCSC. With features like event creation, RSVPs, and attendance tracking, our goal is to save student leaders time so they can focus on creating meaningful experiences for their communities.

### How we built it

We built ganc using Firebase for backend services and React for the frontend. Utilizing Firebase, we were able to implement a database and authentication system, handling generating user IDs and managing privacy restrictions. Firestore, the database component of Firebase, allowed us to customize and retrieve event details to benefit users and their experience. We used Figma during the planning stage to design the user experience and interface.

### Challenges we ran into

One of our biggest challenges was the steep learning curve. We chose tools that were new to us and took this as an opportunity to grow. From learning database management to understanding new programming languages and collaborating on a larger project for the first time, every step was a challenge but one we were excited to take on.

### Accomplishments we're proud of

We are incredibly proud of how much we learned and how far we came as a team. Beyond the technical skills, we formed new friendships and proved to ourselves that we could step outside our comfort zones to learn something new. We're also excited to have completed our first hackathon!

### What we learned

We learned how to create and deploy a web application, how to collaborate with a new team under time constraints, and how to communicate our ideas effectively. This experience taught us the value of collaboration and curiosity.

### What's next

Future plans for ganc include Separate accounts for organizations and individual community members -Analytics dashboards to help organizations understand member engagement and plan better events -Expanded features to help clubs track attendance, collect feedback, and stay organized -Make the stats compatible with the school’s reimbursement system, Cruzfly

## README (from the GitHub repository)

# CruzHacks2025

# Project: **ganc**
## Run Your Club Like a Slug
Club management doesn’t have to be chaotic. Our all-in-one platform helps you glide through attendance tracking, events, and engagement, so you can focus on what matters. Purposeful, easy, and just the right amount of slime.

## Inspiration
Frustration of tracking attendance with spreadsheets, managing messy data, and making endless RSVP forms.

## What it does
Streamlining event planning and membership management for university organizations and individuals at UCSC. 

## How we built it
Firebase, React.
Figma for planning.

## Challenges we ran into
One of our biggest challenges was the steep learning curve. Many of us had never worked with the tools or technologies we used in this project. From learning database management to understanding new languages and collaborating on a larger project as first-timers, every step was a challenge, but one we were eager to take on.

## Accomplishments that we're proud of
We’re incredibly proud of how much we learned and how far we came as a team. Not only did we gain technical skills, but we also formed new friendships and proved to ourselves that we could step outside our comfort zones to learn something new.

## What we learned
How to create a website.

## What's next for ganc
Future plans for ganc include:
- Separate accounts for organizations and individual community members
* Analytics dashboards to help organizations understand member engagement and plan better events
+ Expanded features to help clubs track attendance, collect feedback, and stay organized


## Detected evidence (automated analysis)

Indexed codebase: 35 recognized source files, 90 KB.
- CSS (language) — detected in the code
- Firebase (technology) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- React (technology) — detected in the code
- Tailwind CSS (technology) — detected in the code
- TypeScript (language) — detected in the code

## Codebase structure (from repository index)

### Files (39 of 39)

```
README.md
vite-project/.gitignore
vite-project/index.html
vite-project/package.json
vite-project/public/firebase-messaging-sw.js
vite-project/src/App.css
vite-project/src/App.tsx
vite-project/src/ClubLanding.css
vite-project/src/ClubLanding.tsx
vite-project/src/CreateEvent.tsx
vite-project/src/CreateNewEvent.css
vite-project/src/CreateNewEvent.tsx
vite-project/src/Dashboard.tsx
vite-project/src/EditProfile.tsx
vite-project/src/EventDashboard.css
vite-project/src/EventDashboard.tsx
vite-project/src/firebase/firebase.tsx
vite-project/src/Home.tsx
vite-project/src/index.css
vite-project/src/JoinPrivate.tsx
vite-project/src/Login.tsx
vite-project/src/LoginPage.css
vite-project/src/LoginPage.tsx
vite-project/src/main.tsx
vite-project/src/MyRSVPEvents.css
vite-project/src/MyRSVPEvents.tsx
vite-project/src/PageWrapper.tsx
vite-project/src/RSVPEvents.tsx
vite-project/src/SignUpForm.css
vite-project/src/SignUpForm.tsx
vite-project/src/SignUpPage.css
vite-project/src/SignUpPage.tsx
vite-project/src/UserProfile.tsx
vite-project/src/vite-env.d.ts
vite-project/src/YourEvents.css
vite-project/src/YourEvents.tsx
vite-project/tsconfig.json
vite-project/tsconfig.node.json
vite-project/vite.config.ts
```

### Dependencies

- vite-project/package.json: @types/react@^18.0.27, @types/react-dom@^18.0.10, @vitejs/plugin-react@^3.1.0, autoprefixer@^10.4.21, firebase@^11.6.0, postcss@^8.5.3, react@^18.2.0, react-dom@^18.2.0, react-router-dom@^7.5.0, tailwindcss@^4.1.3, typescript@^4.9.3, vite@^4.1.0

### Recent commits (newest first)

- Update README.md
- Merge branch 'main' of https://github.com/nathanyu8th/CruzHacks2025
- last push, final cuts
- Update README.md
- Updated README.md
- Merge branch 'main' of https://github.com/nathanyu8th/CruzHacks2025
- CSS Animations for Profile Page
- Added home button navbar
- Merge branch 'main' of https://github.com/nathanyu8th/CruzHacks2025
- Added profile page
- CSS Animations
- CSS animation
- Minor ui fixes
- Fixed merge conflict
- Fixed merge errors no info button
- Coded a lot of pages
- last push
- Merge branch 'main' of https://github.com/nathanyu8th/CruzHacks2025
- search bar
- Merge branch 'main' of https://github.com/nathanyu8th/CruzHacks2025

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

### vite-project/package.json

```
{
  "name": "vite-project",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "firebase": "^11.6.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-router-dom": "^7.5.0"
  },
  "devDependencies": {
    "@types/react": "^18.0.27",
    "@types/react-dom": "^18.0.10",
    "@vitejs/plugin-react": "^3.1.0",
    "autoprefixer": "^10.4.21",
    "postcss": "^8.5.3",
    "tailwindcss": "^4.1.3",
    "typescript": "^4.9.3",
    "vite": "^4.1.0"
  }
}

```

### vite-project/src/main.tsx

```typescript
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
import './index.css'

ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
)

```

### vite-project/src/App.tsx

```typescript

import LoginPage from './LoginPage';
import SignUpPage from './SignUpPage'
import EventDashboard from './EventDashboard';
import RSVPEvents from './RSVPEvents';
import CreateNewEvent from './CreateNewEvent';
import { useState } from "react";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import ClubLanding from "./ClubLanding";
import SignUpForm from "./SignUpForm";
import Login from "./Login";
import Dashboard from "./Dashboard";
import UserProfile from "./UserProfile";
import EditProfile from "./EditProfile";
import CreateEvent from "./CreateEvent";
import PageWrapper from "./PageWrapper";
import MyRSVPEvents from "./MyRSVPEvents";
import JoinPrivate from "./JoinPrivate";
import YourEvents from './YourEvents';


function App() {
    const [events, setEvents] = useState<any[]>([]);


  return (
    <BrowserRouter>
      <Routes>
        <Route
          path="/"
          element={
            <PageWrapper bgGradient="linear-gradient(to bottom, #ffffdf 30%, #9bcbe3 60%)">
              <ClubLanding />
            </PageWrapper>
          }
        />
        <Route
          path="/signup"
          element={
            <PageWrapper bgGradient="linear-gradient(to right, #fbc2eb, #a6c1ee)">
              <SignUpPage />
            </PageWrapper>
          }
        />
        <Route
          path="/login"
          element={
            <PageWrapper bgGradient="linear-gradient(to right, #fdfbfb, #ebedee)">
              <LoginPage />
            </PageWrapper>
          }
        />
        <Route
          path="/dashboard"
          element={
            <PageWrapper bgGradient="linear-gradient(to bottom, #dfe9f3, #ffffff)">
              <EventDashboard />
            </PageWrapper>
          }
        />
        <Route
          path="/profile"
          element={
            <PageWrapper bgGradient="linear-gradient(to left, #ffecd2, #fcb69f)">
              <YourEvents />
            </PageWrapper>
          }
        />
        <Route
          path="/editProfile"
          element={
            <PageWrapper bgGradient="linear-gradient(to top, #a1c4fd, #c2e9fb)">
              <EditProfile />
            </PageWrapper>
          }
        />
        <Route
          path="/myrsvps"
          element={
            <PageWrapper bgGradient="linear-gradient(to top, #a1c4fd, #c2e9fb)">
              <RSVPEvents />
            </PageWrapper>
          }
        />
        <Route
          path="/private"
          element={
            <PageWrapper bgGradient="linear-gradient(to top, #a1c4fd, #c2e9fb)">
              <JoinPrivate />
            </PageWrapper>
          }
        />
        <Route
          path="/create"
          element={
            <PageWrapper bgGradient="linear-gradient(to top right, #fddb92, #d1fdff)">
              {/*<CreateEvent events={events} setEvents={setEvents} />*/}
              <CreateNewEvent />
            </PageWrapper>
          }
        />
      </Routes>
    </BrowserRouter>
  );
}

export default App;

```

### vite-project/vite.config.ts

```typescript
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
})

```

### vite-project/index.html

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>GANC</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.tsx"></script>
  </body>
</html>

```

### vite-project/src/vite-env.d.ts

```typescript
/// <reference types="vite/client" />

```

### vite-project/src/EditProfile.tsx

```typescript
import React from 'react'

const EditProfile = () => {
  return (
    <div>EditProfile</div>
  )
}

export default EditProfile
```

### vite-project/src/PageWrapper.tsx

```typescript
import React, { ReactNode } from 'react';

type Props = {
  children: ReactNode;
  bgGradient: string;
};

const PageWrapper = ({ children, bgGradient }: Props) => {
  return (
    <div
      style={{
        backgroundImage: bgGradient,
        minHeight: '100vh',
        backgroundSize: 'cover',
        backgroundRepeat: 'no-repeat',
        display: 'flex',
        justifyContent: 'center',
        alignItems: 'center',
      }}
    >
      {children}
    </div>
  );
};

export default PageWrapper;
```

### vite-project/src/App.css

```css
#root {
  max-width: 1280px;
  margin: 0 auto;
  padding: 2rem;
  text-align: center;
}

.logo {
  height: 6em;
  padding: 1.5em;
  will-change: filter;
  transition: filter 300ms;
}
.logo:hover {
  filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.react:hover {
  filter: drop-shadow(0 0 2em #61dafbaa);
}

@keyframes logo-spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

@media (prefers-reduced-motion: no-preference) {
  a:nth-of-type(2) .logo {
    animation: logo-spin infinite 20s linear;
  }
}

.card {
  padding: 2em;
}

.read-the-docs {
  color: #888;
}

```

### vite-project/src/Home.tsx

```typescript
import React from 'react'
import { useNavigate } from 'react-router-dom';
import { onAuthStateChanged } from 'firebase/auth';
import { auth } from './firebase/firebase';

const Home = () => {
    const navigate = useNavigate();

    const handleLoginClick = () => {
        const user = auth.currentUser;
        if (user) {
          navigate('/dashboard');
        } else {
          navigate('/signup');
        }
    };
      


  return (
    <div className='home-container'>
        <h1 className="heading">Home</h1>
        <button onClick={handleLoginClick}>Log In</button>
    </div>
  )
}

export default Home
```

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