Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
8b21472
Explore ranking: widen candidate pool, smooth time decay, org diversi…
rohanmatta11 Aug 21, 2026
f61da83
minor comment fixes
rohanmatta11 Aug 21, 2026
7430f6c
ranking description edits
rohanmatta11 Aug 21, 2026
7e6cdcf
Error states, consistent search, and handle sparse ingested events
prishaakapasi Aug 25, 2026
a7559d8
Two-column feed, card polish, and search race fixes
prishaakapasi Aug 25, 2026
1bbedac
Ranking window updates, pagination fixes, updated ranking description
rohanmatta11 Aug 25, 2026
b53816b
Merge TIG-246 review fixes into TIG-247
prishaakapasi Aug 26, 2026
ccae5b9
Merge branch 'staging' into TIG-257-stabilize-explore-feed-ranking
rohanmatta11 Aug 28, 2026
800b4ee
fixed org cap vs soon event minimum conflict
rohanmatta11 Aug 28, 2026
e6f79b0
Merge pull request #43 from prishaakapasi/TIG-247-error-states-search…
angelina-ji Sep 5, 2026
6fc78b5
ci: remove broken listserv scrape and pipeline-poll workflows
DIodide Sep 28, 2026
1728706
chore: ignore tokens, cookies, and tsbuildinfo; untrack tsconfig.tsbu…
DIodide Sep 28, 2026
9ef0c68
Merge PR #38 (TIG-257-stabilize-explore-feed-ranking) into release/da…
DIodide Sep 28, 2026
7a86144
fix(database): refuse to seed production or non-local databases
DIodide Sep 28, 2026
0fab5f6
chore: remove apps/mpu-scraper
DIodide Sep 28, 2026
716f47d
chore: pin typescript 5.9 as a root devDependency
DIodide Sep 28, 2026
0a39792
Render all event dates and times in America/New_York
DIodide Sep 28, 2026
d274b44
Say friends are going instead of claiming a calendar add
DIodide Sep 28, 2026
0ed6f8a
Explore friends rail: 'is going to' instead of 'added to their calendar'
DIodide Sep 28, 2026
36a8062
Fix Explore ranking from PR #38: one stable order, then paginate
DIodide Sep 28, 2026
321645e
Add shared profile options with dynamic class years
DIodide Sep 28, 2026
3022e6f
Settings: real data only, persist interests and regions
DIodide Sep 28, 2026
98e097e
Redirect /profile to /settings
DIodide Sep 28, 2026
899a49a
feat(web): add Princeton CAS protocol helpers with bun tests
DIodide Sep 28, 2026
8697421
feat(web)!: replace Microsoft Entra ID with Princeton CAS login
DIodide Sep 28, 2026
9bc6af4
refactor(web): rename middleware.ts to proxy.ts for Next 16
DIodide Sep 28, 2026
3a15604
docs: update for Next 16 and Princeton CAS; drop Entra and mpu-scrape…
DIodide Sep 28, 2026
5ba21ff
Enforce event visibility (drafts/private) everywhere events are shown
DIodide Sep 28, 2026
f303d71
Onboarding: save what's editable, show login identity read-only
DIodide Sep 28, 2026
a0545f3
ci: add CI workflow (biome, tsc, bun test, web build) without secrets
DIodide Sep 28, 2026
1c5b828
Event forms: real date/time inputs, explicit location, working preview
DIodide Sep 28, 2026
c4fe9d6
Map: make 'Friends Going' filter work, drop the dead attending pill
DIodide Sep 28, 2026
b83103a
Harden uploads and add an in-memory rate limiter
DIodide Sep 28, 2026
c40d549
Validate event actions with zod; let org officers edit events
DIodide Sep 28, 2026
872fb08
App shell: account menu with Log out, h-dvh, labelled controls
DIodide Sep 28, 2026
b98649c
Harden social, org and profile actions; batch getOrgs
DIodide Sep 28, 2026
0903228
Notifications: drop fake 'View older', add Mark all as read
DIodide Sep 28, 2026
ae58f91
Create org: use checked upload helper, toast failures
DIodide Sep 28, 2026
38bc52d
Add query indexes (migration 0003_add_query_indexes)
DIodide Sep 28, 2026
7c67207
Add metadata, OG/Twitter images, icon, robots, sitemap, error/loading…
DIodide Sep 28, 2026
3555668
Add public Privacy and Terms pages
DIodide Sep 28, 2026
d440f1d
Let the notification visibility check use the events primary key
DIodide Sep 28, 2026
e11306c
Landing: replace mockup placeholders with real product previews
DIodide Sep 28, 2026
1852715
Merge pull request #48 from TigerAppsOrg/release/data-layer
DIodide Sep 28, 2026
8258a4b
ci: skip workspace install scripts (FastAPI's uv sync) in CI
DIodide Sep 28, 2026
9413e70
Simplify the app shell: compact header, no decorative background
DIodide Sep 28, 2026
4ae0cd5
Settings: one short form in a narrow column
DIodide Sep 28, 2026
3ab79a3
Merge pull request #49 from TigerAppsOrg/release/cas-auth-hygiene
DIodide Sep 28, 2026
93a1fd1
Add dense event rows and compact shared primitives
DIodide Sep 28, 2026
9f0ff1a
Explore: search-first dense list
DIodide Sep 28, 2026
07670bd
My Events: compact tabs with counts and event rows
DIodide Sep 28, 2026
e70dc73
Orgs list: dense rows instead of banner cards
DIodide Sep 28, 2026
bf01fbd
Friends: search-first compact list, drop the dead 'Find' tab
DIodide Sep 28, 2026
6f3ae0e
Event detail: compact layout with rollback on failed actions
DIodide Sep 28, 2026
3b10062
Event forms: narrow single column, drop the section timeline
DIodide Sep 28, 2026
ca2f21c
Notifications dropdown: compact list
DIodide Sep 28, 2026
a90776d
Search: 40px field with a '/' keyboard shortcut
DIodide Sep 28, 2026
e92f702
Adopt InboxEngine: MyPrincetonU orgs, campus venues and events; retir…
DIodide Sep 28, 2026
233c1dd
Bump inbox-engine: campus-time date parsing, location tidy-ups
DIodide Sep 28, 2026
e17a536
Event forms: fold preset covers away, regular-size buttons; nav fix
DIodide Sep 28, 2026
0330a78
Event rows on phones: two-line titles, fewer icons
DIodide Sep 28, 2026
9448ca0
Loading skeleton matches the compact heading + search layout
DIodide Sep 28, 2026
e19010f
sync: full-pass event sync with recurring-series window; skip unchang…
DIodide Sep 28, 2026
086d771
Merge origin/staging into release/ui-polish
DIodide Sep 28, 2026
98a5578
Event forms: accept only https links, matching server validation
DIodide Sep 28, 2026
85140c2
Merge pull request #50 from TigerAppsOrg/release/ui-polish
DIodide Sep 28, 2026
22ce9f7
Merge staging (#50 UI) into release/inbox-engine
DIodide Sep 28, 2026
07c627c
Merge pull request #51 from TigerAppsOrg/release/inbox-engine
DIodide Sep 28, 2026
0c17aa5
Feed events carry the org logo and room detail
DIodide Sep 28, 2026
c0df44f
Bring back the floating sidebar (Figma) with keyboard navigation
DIodide Sep 28, 2026
e20db29
Event card, search and chips follow the Figma, built for real data
DIodide Sep 28, 2026
b5d6e61
Home: Figma greeting, card grid with a remembered List option
DIodide Sep 28, 2026
7c1e110
My Events: Cards/List toggle; cards carry owner controls and calendar
DIodide Sep 28, 2026
6df5d51
Deploy: standalone builds, SSM releases to forumdev/forum, InboxEngin…
DIodide Sep 28, 2026
bd77410
Orgs, friends and lists adopt the softer Figma surfaces
DIodide Sep 28, 2026
68f05eb
Org profile: restyle only, structure unchanged
DIodide Sep 28, 2026
f459ef2
Event detail: white card, org logo, real photos only
DIodide Sep 28, 2026
bc6dff4
Merge pull request #52 from TigerAppsOrg/release/deploy
DIodide Sep 28, 2026
923ed2c
Phone tab bar says 'Orgs'; hide MyPrincetonU's placeholder tagline
DIodide Sep 28, 2026
2b36b63
deploy: make release directories traversable by the service user
DIodide Sep 28, 2026
a0fa28c
Merge pull request #54 from TigerAppsOrg/release/deploy-fix
DIodide Sep 28, 2026
f750fb7
Merge pull request #53 from TigerAppsOrg/release/figma-shell
DIodide Sep 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .cursor/rules/project-conventions.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ bun run format # format only
### Monorepo structure

```
apps/web — Next.js 15 (App Router) → @the-forum/web
apps/web — Next.js 16 (App Router) → @the-forum/web
apps/database — Drizzle ORM → @the-forum/database
backends/fastapi — FastAPI Python → @the-forum/fastapi
```
Expand Down
35 changes: 14 additions & 21 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -12,36 +12,29 @@ POSTGRES_PORT=5434
# ----- Database URL (used by Drizzle & Next.js) -----
DATABASE_URL=postgresql://forum:forum_password@localhost:5434/the_forum

# ----- Auth.js (Microsoft Entra ID) -----
# ----- Auth.js + Princeton CAS -----
# Generate with: openssl rand -base64 32
AUTH_SECRET=your-auth-secret-here
AUTH_AZURE_AD_CLIENT_ID=your-client-id
AUTH_AZURE_AD_CLIENT_SECRET=your-client-secret
AUTH_AZURE_AD_TENANT_ID=YOUR_TENANT_ID_HERE
# Canonical public URL of the app. Required in production (pins the CAS service
# URL and Auth.js callbacks to this origin). Optional locally.
# AUTH_URL=https://forum.example.edu
# Trust X-Forwarded-Host/Proto from your reverse proxy (not needed on Vercel or when AUTH_URL is set).
# AUTH_TRUST_HOST=true
# Princeton CAS server (default shown).
# CAS_BASE_URL=https://fed.princeton.edu/cas/

# ----- AWS S3 (image uploads) -----
# AWS_S3_BUCKET=the-forum-uploads
# AWS_REGION=us-east-1

# ----- Next.js public vars (prefix with NEXT_PUBLIC_) -----
# NEXT_PUBLIC_API_URL=http://localhost:8000
# Public origin for metadata / Open Graph / sitemap (defaults to https://forum.tigerapps.org)
# NEXT_PUBLIC_SITE_URL=https://forum.tigerapps.org
NEXT_PUBLIC_MAPBOX_TOKEN=YOUR_CAMPUS_MAPBOX_TOKEN_HERE
NEXT_PUBLIC_CAMPUS_MAP_TOKEN=YOUR_CAMPUS_MAP_TOKEN_HERE
NEXT_PUBLIC_CAMPUS_MAP_STYLE=YOUR_CAMPUS_MAP_STYLE_HERE

# ----- FastAPI -----
# FASTAPI_SECRET_KEY=changeme
# ----- InboxEngine (org/venue/event sync, apps/database) -----
# INBOX_ENGINE_URL=https://inbox-engine.tigerapps.org
# INBOX_ENGINE_TOKEN=ask-a-tigerapps-admin

# ----- Pipeline (Phase 7) -----
# Gmail API — OAuth2 credentials JSON (from Google Cloud Console)
# GMAIL_CREDENTIALS_JSON={"installed":{"client_id":"...","client_secret":"...",...}}
# GMAIL_TOKEN_PATH=./gmail_token.json

# OpenRouter API key for LLM extraction (Gemini 3.1 Flash Lite)
# OPENROUTER_API_KEY=sk-or-...

# Admin API key for pipeline management endpoints
# ADMIN_API_KEY=your-secret-admin-key

# ----- Listserv Scraper -----
LISTSERV_EMAIL=tigerapp@princeton.edu
LISTSERV_PASSWORD=YOUR_LISTSERV_PASSWORD_HERE
53 changes: 53 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: CI

on:
pull_request:
push:
branches: [staging, main]
workflow_call: {}

permissions:
contents: read

concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
web:
name: lint / typecheck / test / build
runs-on: ubuntu-latest
timeout-minutes: 20
env:
# No secrets needed: env validation is skipped and every value is a dummy.
SKIP_ENV_VALIDATION: "1"
AUTH_SECRET: ci-dummy-auth-secret
DATABASE_URL: postgresql://ci:ci@localhost:5432/ci
NEXT_PUBLIC_MAPBOX_TOKEN: pk.ci-dummy
NEXT_PUBLIC_CAMPUS_MAP_TOKEN: pk.ci-dummy
NEXT_PUBLIC_CAMPUS_MAP_STYLE: mapbox://styles/ci/dummy
NEXT_TELEMETRY_DISABLED: "1"
TURBO_TELEMETRY_DISABLED: "1"
steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
# bun.lock uses configVersion (Bun >= 1.3).
bun-version: 1.3.5

- name: Install dependencies
run: bun install --frozen-lockfile --ignore-scripts

- name: Lint (Biome)
run: bun run lint

- name: Typecheck (apps/web)
run: bunx tsc --noEmit -p apps/web

- name: Unit tests (apps/web)
working-directory: apps/web
run: bun test

- name: Build (apps/web)
run: bun run build --filter=@the-forum/web
115 changes: 115 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
name: Deploy

# staging → forumdev.tigerapps.org, main → forum.tigerapps.org, after the CI checks pass.
on:
push:
branches: [staging, main]
workflow_dispatch:
inputs:
environment:
description: Environment to deploy from this ref
type: choice
options: [staging, production]

permissions:
contents: read
id-token: write

jobs:
ci:
uses: ./.github/workflows/ci.yml

deploy:
needs: ci
runs-on: ubuntu-latest
timeout-minutes: 30
concurrency:
group: theforum-deploy-${{ github.ref_name }}
cancel-in-progress: false
env:
AWS_REGION: us-east-1
BUCKET: theforum-deploy-104733724423-us-east-1
INSTANCE_ID: i-00a811982e8784203
SHA: ${{ github.sha }}
BRANCH: ${{ github.ref_name }}
steps:
- name: Choose environment
run: |
if [ "${{ github.event_name }}" = workflow_dispatch ]; then target="${{ inputs.environment }}";
elif [ "$BRANCH" = main ]; then target=production; else target=staging; fi
if [ "$target" = production ]; then site=https://forum.tigerapps.org; else site=https://forumdev.tigerapps.org; fi
echo "TARGET=$target" >> "$GITHUB_ENV"
echo "NEXT_PUBLIC_SITE_URL=$site" >> "$GITHUB_ENV"
echo "Deploying $SHA ($BRANCH) to $target"

- uses: actions/checkout@v4
with:
ref: ${{ env.SHA }}

- name: Fetch the InboxEngine submodule (private)
env:
KEY: ${{ secrets.INBOX_ENGINE_DEPLOY_KEY }}
run: |
install -m 700 -d ~/.ssh
printf '%s\n' "$KEY" > ~/.ssh/inbox_engine && chmod 600 ~/.ssh/inbox_engine
ssh-keyscan -t ed25519 github.com >> ~/.ssh/known_hosts 2>/dev/null
git -c url."git@github.com:TigerAppsOrg/InboxEngine".insteadOf="https://github.com/TigerAppsOrg/InboxEngine" \
-c core.sshCommand="ssh -i ~/.ssh/inbox_engine -o IdentitiesOnly=yes" \
submodule update --init --depth 1
rm -f ~/.ssh/inbox_engine

- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.5

- run: bun install --frozen-lockfile --ignore-scripts

- name: Build
env:
SKIP_ENV_VALIDATION: "1"
# Placeholders for build-time module evaluation; nothing connects during the build.
DATABASE_URL: postgresql://build:build@localhost:5432/build
AUTH_SECRET: build-time-placeholder
NEXT_TELEMETRY_DISABLED: "1"
TURBO_TELEMETRY_DISABLED: "1"
NEXT_PUBLIC_MAPBOX_TOKEN: ${{ vars.NEXT_PUBLIC_MAPBOX_TOKEN }}
NEXT_PUBLIC_CAMPUS_MAP_TOKEN: ${{ vars.NEXT_PUBLIC_CAMPUS_MAP_TOKEN }}
NEXT_PUBLIC_CAMPUS_MAP_STYLE: ${{ vars.NEXT_PUBLIC_CAMPUS_MAP_STYLE }}
run: |
bun run build --filter=@the-forum/web
deploy/build-release.sh /tmp/release.tar.gz
echo "DIGEST=$(sha256sum /tmp/release.tar.gz | cut -d' ' -f1)" >> "$GITHUB_ENV"

- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::104733724423:role/TheForumGitHubDeployRole
aws-region: ${{ env.AWS_REGION }}

- name: Upload release
run: aws s3 cp /tmp/release.tar.gz "s3://$BUCKET/releases/theforum/$TARGET/$SHA.tar.gz" --only-show-errors

- name: Deploy through SSM
run: |
set -euo pipefail
params=$(jq -n --arg e "$TARGET" --arg r "$SHA" --arg c "$DIGEST" '{Environment:[$e],Release:[$r],Checksum:[$c]}')
id=$(aws ssm send-command --instance-ids "$INSTANCE_ID" --document-name TheForumDeploy --parameters "$params" --query Command.CommandId --output text)
echo "SSM command $id"
for _ in $(seq 1 100); do
status=$(aws ssm get-command-invocation --command-id "$id" --instance-id "$INSTANCE_ID" --query Status --output text 2>/dev/null || echo Pending)
case "$status" in
Success) aws ssm get-command-invocation --command-id "$id" --instance-id "$INSTANCE_ID" --query StandardOutputContent --output text | tail -8; exit 0 ;;
Failed|Cancelled|TimedOut|Cancelling)
aws ssm get-command-invocation --command-id "$id" --instance-id "$INSTANCE_ID" --query '{out:StandardOutputContent,err:StandardErrorContent}'; exit 1 ;;
esac
sleep 10
done
echo 'Deployment did not finish in time'; exit 1

- name: Smoke test through Cloudflare
run: |
if [ "$TARGET" = production ]; then url=https://forum.tigerapps.org; else url=https://forumdev.tigerapps.org; fi
for _ in $(seq 1 10); do
code=$(curl -s -o /dev/null -w '%{http_code}' "$url/") && [ "$code" = 200 ] && { echo "$url is up"; exit 0; }
sleep 6
done
echo "$url did not return 200"; exit 1
16 changes: 0 additions & 16 deletions .github/workflows/pipeline-poll.yml

This file was deleted.

41 changes: 0 additions & 41 deletions .github/workflows/scrape_listserv.yml

This file was deleted.

5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,8 @@ Thumbs.db
*.ntvs*
*.njsproj
*.sln

# ---- Secrets / local artifacts ----
gmail_token.json
**/cookies.json
*.tsbuildinfo
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "packages/inbox-engine"]
path = packages/inbox-engine
url = https://github.com/TigerAppsOrg/InboxEngine.git
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
## Project Overview

Turborepo monorepo with:
- `apps/web` — Next.js 15 (App Router, Turbopack, Tailwind v4, shadcn/ui)
- `apps/web` — Next.js 16 (App Router, Turbopack, Tailwind v4, shadcn/ui), Auth.js v5 + Princeton CAS login
- `apps/database` — Drizzle ORM + PostgreSQL
- `backends/fastapi` — FastAPI (Python 3.12, uv)
- `packages/inbox-engine` — git submodule (TigerAppsOrg/InboxEngine): shared org/venue/event source of truth; sync with `bun run db:sync-engine`. Don't edit it here — change InboxEngine and bump the submodule.

---

Expand Down
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
## Project Overview

Turborepo monorepo with:
- `apps/web` — Next.js 15 (App Router, Turbopack, Tailwind v4, shadcn/ui)
- `apps/web` — Next.js 16 (App Router, Turbopack, Tailwind v4, shadcn/ui), Auth.js v5 + Princeton CAS login
- `apps/database` — Drizzle ORM + PostgreSQL
- `backends/fastapi` — FastAPI (Python 3.12, uv)
- `packages/inbox-engine` — git submodule (TigerAppsOrg/InboxEngine): shared org/venue/event source of truth; sync with `bun run db:sync-engine`. Don't edit it here — change InboxEngine and bump the submodule.

---

Expand Down
Loading
Loading