Mehran APP is a production-ready, mobile-first academic SaaS platform built with Next.js App Router, TypeScript, Supabase, and Tailwind CSS.
- Next.js (App Router)
- TypeScript
- Supabase (Database, Auth, Storage)
- Tailwind CSS v4
- Landing page with institutional branding and clean UX
- Past papers search with server-side filtering and debounced filter inputs
- Achievements directory with polished cards and filters
- Loading skeletons, empty states, and error boundaries
- Sticky responsive header with mobile navigation
- Public paper upload page
- SEO metadata and favicon support
app/
achievements/
error.tsx
loading.tsx
page.tsx
admin/
upload/
page.tsx
login/
page.tsx
past-papers/
error.tsx
loading.tsx
page.tsx
globals.css
layout.tsx
page.tsx
components/
achievements/
admin/
home/
layout/
past-papers/
ui/
lib/
supabase/
constants.ts
queries.ts
utils.ts
supabase/
schema.sql
seed.sql
types/
database.ts
filters.ts
proxy.ts
- Create a Supabase project.
- In SQL Editor, run
supabase/schema.sql. - Run
supabase/seed.sqlfor sample data. - Create a public storage bucket named
papers. - Configure public insert/upload policies for your use case.
Copy .env.example to .env.local and fill values:
cp .env.example .env.localNEXT_PUBLIC_SITE_URL=https://mehranapp.vercel.app
NEXT_PUBLIC_SUPABASE_URL=https://YOUR_PROJECT_REF.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_PUBLIC_KEY
NEXT_PUBLIC_SUPER_ADMIN_EMAIL=you@example.com
SUPER_ADMIN_EMAIL=you@example.comInstall dependencies and run:
npm install
npm run devOpen http://localhost:3000.
id(uuid)teacher_namedepartmentsemestercourseyearfile_urlcreated_at
Indexes included:
teacher_namedepartmentsemestercourse
id(uuid)student_namedepartmentachievement_titledescriptiongithub_linklinkedin_linkphoto_urlcreated_at
id(referencesauth.users.id)role(admin|student)created_at
- Push repository to GitHub.
- Import project in Vercel.
- Set environment variables from
.env.localin Vercel Project Settings. - Deploy.
- Re-deploy after future environment changes.
Recommended checks:
npm run lintnpm run build
- Filtering is server-side using Supabase queries.
- Debounce is applied in client filter panels for instant-feel UX.
app/admin/uploadis publicly accessible.