A fullstack client request management dashboard built with Next.js, TypeScript, Tailwind CSS, Prisma, PostgreSQL, Zod, Sonner, and Recharts.
The app allows public users to submit project requests, while an authenticated admin can view, search, filter, update, delete, and analyze submissions from a protected dashboard.
Add your deployed link here:
https://full-stack-dashboard-gilt.vercel.app/Will add screenshots here after deployment:
- Public homepage
- Client project request form
- Form fields for name, email, request type, budget, title, and project details
- Frontend validation with Zod
- Backend validation with Zod
- Toast notifications for success and error feedback
- Clean loading state on form submission
-
Admin registration for first admin account
-
Admin login
-
HTTP-only cookie authentication
-
Protected dashboard route
-
Auth-aware navbar
-
Logout functionality
-
View all project submissions
-
Search submissions by title, message, name, email, request type, budget, and status
-
Filter submissions by status
-
Update submission status
-
Delete submissions with custom confirmation modal
-
Pagination with rows-per-page control
-
Dashboard summary cards
-
Recharts analytics for:
- Status breakdown
- Request type breakdown
- Submissions over time
- Next.js App Router
- React
- TypeScript
- Tailwind CSS
- Prisma ORM
- PostgreSQL
- Supabase PostgreSQL
- Zod
- Sonner
- Recharts
- bcryptjs
- jose
- Vercel
fullstack-dashboard/
├── app/
│ ├── api/
│ │ ├── auth/
│ │ │ ├── login/
│ │ │ ├── logout/
│ │ │ ├── me/
│ │ │ └── register/
│ │ └── submissions/
│ ├── dashboard/
│ ├── login/
│ ├── register/
│ ├── submit/
│ ├── globals.css
│ ├── layout.tsx
│ └── page.tsx
│
├── components/
│ ├── auth/
│ ├── dashboard/
│ └── forms/
│
├── lib/
│ ├── validations/
│ ├── auth.ts
│ ├── current-user.ts
│ └── prisma.ts
│
├── prisma/
│ └── schema.prisma
│
├── middleware.ts
├── package.json
└── README.mdThe app uses two main models:
model User {
id Int @id @default(autoincrement())
name String
email String @unique
password String
role String @default("client")
}
model Submission {
id Int @id @default(autoincrement())
name String
email String
requestType String
budget String?
title String
message String
status String @default("pending")
createdAt DateTime @default(now())
}Create a .env file in the root of your project:
DATABASE_URL="your-postgresql-connection-string"
AUTH_SECRET="your-long-random-auth-secret"Example for local PostgreSQL:
DATABASE_URL="postgresql://demo_user:demo_password@localhost:5432/demo_dashboard?schema=public"
AUTH_SECRET="your-long-random-auth-secret"Example for Supabase:
DATABASE_URL="postgresql://postgres.projectref:password@aws-0-region.pooler.supabase.com:5432/postgres?schema=public"
AUTH_SECRET="your-long-random-auth-secret"Do not commit .env to GitHub.
Clone the repository:
git clone https://github.com/your-username/fullstack-dashboard.gitMove into the project folder:
cd fullstack-dashboardInstall dependencies:
npm installGenerate Prisma client:
npx prisma generatePush the database schema during development:
npx prisma db pushRun the development server:
npm run devOpen the app:
http://localhost:3000The app uses custom authentication.
- Passwords are hashed with
bcryptjs - JWT tokens are created with
jose - Auth token is stored in an HTTP-only cookie
/dashboardis protected with middleware- Admin-only API actions are protected on the backend
The first admin can be created from:
/registerAfter the first admin is created, the backend blocks additional admin registrations.
POST /api/submissionsAllows public users to submit project requests.
GET /api/submissions
PATCH /api/submissions
DELETE /api/submissionsThese require an authenticated admin.
POST /api/auth/register
POST /api/auth/login
POST /api/auth/logout
GET /api/auth/meThe dashboard includes:
- Total submissions card
- Pending submissions card
- In-progress submissions card
- Completed submissions card
- Status breakdown chart
- Request type breakdown chart
- Submissions over time chart
- Search bar
- Status filters
- Pagination
- Status update buttons
- Delete confirmation modal
The app uses a shared Zod schema for frontend and backend validation.
Validation covers:
- Full name
- Email address
- Request type
- Project title
- Project details
- Optional budget field
This prevents invalid data from entering the database, even if frontend validation is bypassed.
The app can be deployed on Vercel.
Before deploying:
- Push your code to GitHub.
- Create a hosted PostgreSQL database using Supabase, Neon, Railway, or another provider.
- Add the production
DATABASE_URLto Vercel environment variables. - Add
AUTH_SECRETto Vercel environment variables. - Make sure the build script includes Prisma generation.
Recommended build script:
"build": "prisma generate && next build"After deployment, create the first admin account from:
https://your-domain.com/registerThen login from:
https://your-domain.com/loginThis project demonstrates practical fullstack development skills, including:
- Building fullstack features with Next.js App Router
- Creating API route handlers
- Connecting a Next.js app to PostgreSQL through Prisma
- Managing database models and schema updates
- Handling authentication with cookies and JWT
- Protecting admin routes
- Validating data on both frontend and backend
- Building reusable form components
- Creating dashboards with search, filters, pagination, and charts
- Preparing a project for deployment
Possible improvements include:
- Add email notifications for new submissions
- Add admin profile settings
- Add password reset flow
- Add role-based team members
- Add server-side pagination for large datasets
- Add export to CSV
- Add dark mode
- Add dashboard activity logs
- Add file upload for project briefs
- Add better register flow after first admin exists
Built by Tobyemerald as a fullstack portfolio project.
GitHub:
https://github.com/tobyemeraldPortfolio:
https://tobys-port.vercel.app/This project is open-source and available under the MIT License.




