|
| 1 | +# Club project: DS@GT website |
| 2 | + |
| 3 | +This is the member-facing overview of **query**, the live public website and member portal for [Data Science at Georgia Tech](https://datasciencegt.org) (DS@GT / DSGT). <!-- pragma: allowlist secret --> |
| 4 | + |
| 5 | +It is not a setup manual. Local install is [Getting started](./getting-started.md). Pull requests and review rules are [Contributing](./contributing.md). Architecture, packages, and operations stay in the rest of [`docs/`](./README.md). |
| 6 | + |
| 7 | +Aamogh Sawant ([@aamoghS](https://github.com/aamoghS)), club President, owns and ships this repo. There is no separate website lead. |
| 8 | + |
| 9 | +## What this is |
| 10 | + |
| 11 | +The public website visitors see, and the signed-in portal members use to join the club, pay dues, check in at events, follow bootcamp, apply to club projects, and handle Hacklytics interest and registration. |
| 12 | + |
| 13 | +The public pages and the portal are one Next.js app (`sites/mainweb`). Signing in does not take you to a different hostname. |
| 14 | + |
| 15 | +## Live URLs |
| 16 | + |
| 17 | +| Surface | URL | |
| 18 | +| -------------------- | ------------------------------------------------------------------------------------------------------------ | |
| 19 | +| Public site + portal | [https://datasciencegt.org](https://datasciencegt.org) <!-- pragma: allowlist secret --> | |
| 20 | +| Sign in | [https://datasciencegt.org/login](https://datasciencegt.org/login) <!-- pragma: allowlist secret --> | |
| 21 | +| Member home | [https://datasciencegt.org/dashboard](https://datasciencegt.org/dashboard) <!-- pragma: allowlist secret --> | |
| 22 | + |
| 23 | +`member.datasciencegt.org` does **not** resolve. Do not send people there, and do not put it in copy or onboarding. |
| 24 | + |
| 25 | +Locally, the same app is [http://localhost:3001](http://localhost:3001). See [Getting started](./getting-started.md). |
| 26 | + |
| 27 | +## What members use it for |
| 28 | + |
| 29 | +After sign-in (Google, GitHub if configured, or email code): |
| 30 | + |
| 31 | +| Need | Where | |
| 32 | +| ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | |
| 33 | +| Join / pay dues | Portal membership — Stripe **$25** annual membership, **$10** bootcamp add-on (on top of membership, not instead of it) | |
| 34 | +| Club events and check-in | Portal events / club pass | |
| 35 | +| Bootcamp (term-gated add-on) | `/club/bootcamp` and the public `/bootcamp` page | |
| 36 | +| Club projects (pitch + optional resume) | `/initiatives` | |
| 37 | +| Staff tools | `/admin` (appointed roles only; there is no public admin signup) | |
| 38 | +| Hacklytics interest and registration | Portal `/hacklytics` (the marketing site links here after login) | |
| 39 | + |
| 40 | +Hacklytics participation is open to non-members. A paid membership is not required to register for the hackathon. |
| 41 | + |
| 42 | +Public pages (no login): |
| 43 | + |
| 44 | +| Path | Page | |
| 45 | +| ----------- | ------------------ | |
| 46 | +| `/` | Home | |
| 47 | +| `/team` | Executive board | |
| 48 | +| `/events` | Public events | |
| 49 | +| `/projects` | Projects | |
| 50 | +| `/history` | Club history | |
| 51 | +| `/bootcamp` | Bootcamp marketing | |
| 52 | + |
| 53 | +Route-level detail: [Main website](./sites/mainweb.md). Club vs hackathon vocabulary: [Glossary](./glossary.md). |
| 54 | + |
| 55 | +## Club projects (the roster on the site) |
| 56 | + |
| 57 | +`/` and `/projects` read the roster from the `club_project` table, not from a hardcoded array. Editing a card is a row edit, which is why the old list sat five years stale. |
| 58 | + |
| 59 | +| Column | What it does | |
| 60 | +| --------------- | ----------------------------------------------------------------------------------------- | |
| 61 | +| `status` | `active`, `revived`, `needs_lead`, or `past`. Only `past` drops out of the current roster | |
| 62 | +| `lead_name` | Free text, so a lead can be named before they ever sign in | |
| 63 | +| `initiative_id` | The portal initiative members apply to, when there is one | |
| 64 | +| `join_url` | External destination for projects that recruit elsewhere (ARC) | |
| 65 | +| `is_published` | Pull a card off the site without deleting it | |
| 66 | + |
| 67 | +Applying happens in the portal. A card with an `initiative_id` links to `/initiatives`, where a signed-in member says why they want to join and may attach a PDF resume; the leader reads both and accepts or declines from `/lead`. A card with no initiative falls back to `join_url`, then to the shared interest form. |
| 68 | + |
| 69 | +To reset the roster to the checked-in Fall 2026 list: |
| 70 | + |
| 71 | +```bash |
| 72 | +pnpm --filter @query/db db:seed:club-projects |
| 73 | +``` |
| 74 | + |
| 75 | +The seed upserts on `slug` and never deletes, so re-running it republishes the roster without duplicating cards. Removing a project from the site is `is_published = false`, not a deleted row. |
| 76 | + |
| 77 | +## Current status (Fall 2026) |
| 78 | + |
| 79 | +This is **live production infrastructure**, not a greenfield student app and not a class project waiting for a first deploy. |
| 80 | + |
| 81 | +- Serving real members at [datasciencegt.org](https://datasciencegt.org) <!-- pragma: allowlist secret --> |
| 82 | +- Hosted on Firebase App Hosting / Cloud Run |
| 83 | +- GCP project: `dsgt-website` |
| 84 | +- Database: Neon (Postgres) |
| 85 | +- Last `main` activity: late August 2026 |
| 86 | + |
| 87 | +Treat production as production. A broken PR can take down dues, login, or event check-in. |
| 88 | + |
| 89 | +## How the repo is laid out |
| 90 | + |
| 91 | +High level only. Details live in the linked docs. |
| 92 | + |
| 93 | +| Path | What it is | |
| 94 | +| ---------------------- | ---------------------------------------------------- | |
| 95 | +| `sites/mainweb` | Public club site **and** the authenticated portal | |
| 96 | +| `sites/hacklytics2027` | Hacklytics 2027 marketing site (static; no database) | |
| 97 | +| `packages/api` | tRPC, pricing, server logic | |
| 98 | +| `packages/auth` | Sign-in (NextAuth) | |
| 99 | +| `packages/db` | Schema and membership rules | |
| 100 | +| `packages/ui` | Shared React components | |
| 101 | + |
| 102 | +Club operations (membership, club events, bootcamp, club projects) and hackathon editions share one database but are modeled as separate domains. Do not hang club tables off a hackathon row. |
| 103 | + |
| 104 | +Setup, env, and first-admin bootstrap: [Getting started](./getting-started.md). How the pieces connect: [Architecture](./architecture.md). Index of the rest: [Documentation](./README.md). |
| 105 | + |
| 106 | +## Older repos (do not revive) |
| 107 | + |
| 108 | +These are predecessors. The live product is **this** repo (`DataScience-GT/query`). Do not open feature work there, do not migrate traffic back, and do not treat them as the current stack. |
| 109 | + |
| 110 | +| Repo | What it was | |
| 111 | +| ----------------------------------------------------------------------------------------------------- | -------------------------------------------------- | |
| 112 | +| [DataScience-GT/datascience-gt.github.io](https://github.com/DataScience-GT/datascience-gt.github.io) | Earlier website / portal repo | |
| 113 | +| [DataScience-GT/dsgt-member-portal](https://github.com/DataScience-GT/dsgt-member-portal) | Earlier member portal (membership, Stripe, events) | |
| 114 | + |
| 115 | +## How to help |
| 116 | + |
| 117 | +Safe first work — useful, visible, and hard to take production down with: |
| 118 | + |
| 119 | +1. **Public content accuracy** — `/team`, `/projects`, `/events` (and related copy) matching the current board and programs |
| 120 | +2. **Onboarding and docs** — this folder, especially anything that helps a new contributor run the app without guessing |
| 121 | +3. **Small UI bugs** — layout, dead links, copy, accessibility on pages you can exercise locally |
| 122 | +4. **Tests** — fill gaps in existing Vitest suites; see [Testing](./operations/testing.md) |
| 123 | + |
| 124 | +Label anything that touches **payments**, **auth**, or **production deploy** as **needs-exec-review**. Do not merge that class of change on a student PR alone. That includes Stripe amounts and webhooks, NextAuth / OAuth / email-code login, secrets, `apphosting.yaml`, Firebase Hosting, and anything that writes production schema. |
| 125 | + |
| 126 | +Club events and working time are after **6:30 PM ET**. Questions: [hello@datasciencegt.org](mailto:hello@datasciencegt.org) or Aamogh. |
| 127 | + |
| 128 | +## How to join / contribute |
| 129 | + |
| 130 | +1. Read [Contributing](./contributing.md) and [Getting started](./getting-started.md). |
| 131 | +2. Branch from `dev` (that is the integration branch). `main` is production. |
| 132 | +3. Open the pull request against **this** repo (`DataScience-GT/query`). Feature branches are reviewed into `dev`; `dev` is what ships to `main`. |
| 133 | +4. Never commit secrets (`.env`, Stripe keys, OAuth client secrets, SMTP passwords, production `DATABASE_URL`). If a secret was pasted into a PR, say so immediately — do not “fix” it by committing a deletion and moving on. |
| 134 | + |
| 135 | +Code owners: `@aamoghS`. |
0 commit comments