This is the member-facing overview of query, the live public website and member portal for Data Science at Georgia Tech (DS@GT / DSGT).
It is not a setup manual. Local install is Getting started. Pull requests and review rules are Contributing. Architecture, packages, and operations stay in the rest of docs/.
Aamogh Sawant (@aamoghS), club President, owns and ships this repo. There is no separate website lead.
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.
The public pages and the portal are one Next.js app (sites/mainweb). Signing in does not take you to a different hostname.
| Surface | URL |
|---|---|
| Public site + portal | https://datasciencegt.org |
| Sign in | https://datasciencegt.org/login |
| Member home | https://datasciencegt.org/dashboard |
member.datasciencegt.org does not resolve. Do not send people there, and do not put it in copy or onboarding.
Locally, the same app is http://localhost:3001. See Getting started.
After sign-in (Google, GitHub if configured, or email code):
| Need | Where |
|---|---|
| Join / pay dues | Portal membership — Stripe $25 annual membership, $10 bootcamp add-on (on top of membership, not instead of it) |
| Club events and check-in | Portal events / club pass |
| Bootcamp (term-gated add-on) | /club/bootcamp and the public /bootcamp page |
| Club projects (pitch + optional resume) | /initiatives |
| Staff tools | /admin (appointed roles only; there is no public admin signup) |
| Hacklytics interest and registration | Portal /hacklytics (the marketing site links here after login) |
Hacklytics participation is open to non-members. A paid membership is not required to register for the hackathon.
Public pages (no login):
| Path | Page |
|---|---|
/ |
Home |
/team |
Executive board |
/events |
Public events |
/projects |
Projects |
/history |
Club history |
/bootcamp |
Bootcamp marketing |
Route-level detail: Main website. Club vs hackathon vocabulary: Glossary.
/ 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.
| Column | What it does |
|---|---|
status |
active, revived, needs_lead, or past. Only past drops out of the current roster |
lead_name |
Free text, so a lead can be named before they ever sign in |
initiative_id |
The portal initiative members apply to, when there is one |
join_url |
External destination for projects that recruit elsewhere (ARC) |
is_published |
Pull a card off the site without deleting it |
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.
To reset the roster to the checked-in Fall 2026 list:
pnpm --filter @query/db db:seed:club-projectsThe 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.
This is live production infrastructure, not a greenfield student app and not a class project waiting for a first deploy.
- Serving real members at datasciencegt.org
- Hosted on Firebase App Hosting / Cloud Run
- GCP project:
dsgt-website - Database: Neon (Postgres)
- Last
mainactivity: late August 2026
Treat production as production. A broken PR can take down dues, login, or event check-in.
High level only. Details live in the linked docs.
| Path | What it is |
|---|---|
sites/mainweb |
Public club site and the authenticated portal |
sites/hacklytics2027 |
Hacklytics 2027 marketing site (static; no database) |
packages/api |
tRPC, pricing, server logic |
packages/auth |
Sign-in (NextAuth) |
packages/db |
Schema and membership rules |
packages/ui |
Shared React components |
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.
Setup, env, and first-admin bootstrap: Getting started. How the pieces connect: Architecture. Index of the rest: Documentation.
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.
| Repo | What it was |
|---|---|
| DataScience-GT/datascience-gt.github.io | Earlier website / portal repo |
| DataScience-GT/dsgt-member-portal | Earlier member portal (membership, Stripe, events) |
Safe first work — useful, visible, and hard to take production down with:
- Public content accuracy —
/team,/projects,/events(and related copy) matching the current board and programs - Onboarding and docs — this folder, especially anything that helps a new contributor run the app without guessing
- Small UI bugs — layout, dead links, copy, accessibility on pages you can exercise locally
- Tests — fill gaps in existing Vitest suites; see Testing
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.
Club events and working time are after 6:30 PM ET. Questions: hello@datasciencegt.org or Aamogh.
- Read Contributing and Getting started.
- Branch from
dev(that is the integration branch).mainis production. - Open the pull request against this repo (
DataScience-GT/query). Feature branches are reviewed intodev;devis what ships tomain. - Never commit secrets (
.env, Stripe keys, OAuth client secrets, SMTP passwords, productionDATABASE_URL). If a secret was pasted into a PR, say so immediately — do not “fix” it by committing a deletion and moving on.
Code owners: @aamoghS.