You do not always know what you are signing up for until it is too late. grades-unt makes UNT grade distributions easier to browse by course and instructor.
Live site: untgrades.app
The public website reads from encrypted static data stored with the deployed site, not live Postgres queries.
- Course and instructor data is generated from CSV exports during the data-prep workflow.
- The generated files live under
unt-grade-distribution/public/encrypted/. - The browser downloads
manifest.jsonand only the encrypted blob needed for the selected course or instructor. - Client-side WebCrypto decrypts the blob with
NEXT_PUBLIC_DATA_KEY. - Prisma/Postgres still exists for import, validation, migrations, and backend/API compatibility work, but it is not the primary user-facing read path.
- React 19.2.3
- Next.js 16.1.6 App Router
- TypeScript
- Tailwind CSS v4
- Recharts 3.7.0 for grade distribution charts
- jsPDF + jspdf-autotable for PDF export
- Vercel Analytics + Vercel Speed Insights for real-user monitoring
- Static encrypted blobs generated at build/data-prep time from CSV exports
- Manifest-driven search in the browser
- Client-side WebCrypto decryption for course and instructor pages
- CDN-backed reads through Vercel static assets
- No Prisma/Postgres runtime dependency for normal website browsing
- Prisma 7.4.2 with PostgreSQL/Postgres remains in the repo for seeding, migrations, validation, and backend API routes.
- Backend API routes use explicit Prisma
selectclauses and indexes for faster query paths when those routes are used. DATABASE_URLshould point at the pooled Postgres in production-like serverless environments.DIRECT_URLshould point at the direct Postgres host for local development and bulk operations.
.
├── README.md
├── DOCUMENTATION.md
└── unt-grade-distribution/
├── README.md
├── DOCUMENTATION.md
├── ENCRYPT_README.md
├── PERF_VALIDATION_RUNBOOK.md
├── prisma/
├── public/encrypted/
├── src/
└── tools/
The Next.js app lives in unt-grade-distribution/. Root-level docs provide repo-wide context; app-level docs provide implementation details.
Keep the existing branch/PR/review model:
- Start from an up-to-date
main. - Create a separate branch for each change, for example
feat/...,fix/...,perf/..., ordocs/.... - Commit with a conventional message.
- Push the branch and open a PR into
main. - Wait for automated checks and review before merging.
- Do not push directly to
mainunless the maintainers intentionally choose to bypass the normal review path.
cd unt-grade-distribution
npm install
npm test
npx tsc --noEmit
DATABASE_URL="postgresql://user:***@host:5432/db" DIRECT_URL="postgresql://user:***@host:5432/db" npm run build- SPOT Evaluations — integrate Student Perceptions of Teaching data for instructors.
- More historical coverage — expand beyond the currently imported semesters as additional source exports become available.
- Smarter client aggregates — keep compare-page aggregation fast by precomputing or indexing more summary data in the encrypted manifest layer without reintroducing a live database dependency for public reads.