A production-ready, full-stack Team Task Manager with role-based access, real-time dashboards, and a premium UI β built and deployed in under 48 hours.
π Live Demo Β· π GitHub Repo Β· βοΈ API Health
Premium SaaS-style landing with animated particles, live activity feed, and scroll-reveal sections
Clean sign-in and registration flow with warm gradient aesthetic
| Sign In | Create Account |
|---|---|
![]() |
![]() |
Animated stat cards, bar chart, donut completion ring, overdue alerts, and filterable task list
All your projects at a glance β with member count, task count, and role badges
- JWT Authentication β Secure signup/login with bcrypt password hashing and 7-day token expiry
- Project Management β Create, update, and delete projects with name and description
- Team Management β Add team members by email, assign roles (Admin / Member)
- Task System β Create tasks, assign to members, set due dates, and track status (Pending β In Progress β Completed)
- Dashboard β Real-time overview of all tasks across all projects, status breakdown, and overdue detection
- Role-Based Access Control β Admins have full control; Members can only update status of their own tasks
- Overdue Detection β Automatically flags tasks past due date that aren't completed
- Cross-Project Dashboard β Aggregates tasks from all projects into one view
- Member Safety Guards β Prevents removing the last admin from a project
- Cascading Deletes β Deleting a project removes all its tasks and memberships cleanly
- Single-Command Dev β Frontend + backend start together with one
npm run devfrom root
- Animated Landing Page β Canvas particle system, floating orbs, grain overlay, scroll-reveal sections
- Count-Up Stat Cards β Numbers animate from 0 on page load
- Donut Completion Chart β Visual completion percentage with animated progress bars
- 3D Card Tilt β Feature cards respond to mouse movement with perspective tilt
- Live Activity Feed β Simulated real-time team activity on the landing page
- Filter Tabs β Filter recent tasks by status directly on the dashboard
- Skeleton Loading β Smooth loading states instead of blank screens
- Auto Browser Launch β
npm run devopens the browser automatically
| Layer | Technology | Purpose |
|---|---|---|
| Frontend | React 18 + Vite | UI framework + lightning-fast dev server |
| Styling | Tailwind CSS | Utility-first styling |
| Charts | Recharts | Bar chart + Donut/Pie chart on dashboard |
| Routing | React Router v6 | Client-side navigation + protected routes |
| HTTP Client | Axios | API calls with JWT interceptor + auto-logout |
| Backend | Node.js + Express | REST API server |
| ORM | Prisma | Type-safe database access + migrations |
| Database | PostgreSQL (Railway) / SQLite (dev) | Relational data storage |
| Auth | JWT + bcryptjs | Stateless authentication |
| Dev Tools | Nodemon + Concurrently | Hot reload + unified dev command |
| Deployment | Railway | Full-stack cloud deployment |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLIENT (Browser) β
β React + Vite (port 5173) β
β Landing β Auth β Dashboard β Projects β ProjectDetail β
ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β HTTP (Axios + JWT)
β /api/*
ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββ
β BACKEND (Express) β
β Node.js (port 5000) β
β β
β /api/auth β AuthController (register, login) β
β /api/projects β ProjectController (CRUD) β
β /api/tasks β TaskController (CRUD + dashboard) β
β /api/members β MemberController (add/remove/roles) β
β β
β Middleware: JWT verification β Role guard β
ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β Prisma ORM
ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββ
β DATABASE β
β PostgreSQL (Railway prod) / SQLite (dev) β
β β
β Users ββ< ProjectMembers >ββ Projects β
β βββ< Tasks β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- User logs in β JWT issued β stored in
localStorage - Every API request β Axios attaches JWT in
Authorization: Bearerheader - Express middleware verifies JWT β attaches
req.user - Role middleware checks
ProjectMember.rolebefore sensitive operations - Prisma executes DB queries β returns typed data
- Frontend renders with React state
orbit/
βββ package.json β Root: runs both frontend + backend
β
βββ backend/
β βββ prisma/
β β βββ schema.prisma β DB models (User, Project, Task, Member)
β βββ src/
β β βββ controllers/
β β β βββ auth.controller.js
β β β βββ project.controller.js
β β β βββ task.controller.js
β β β βββ member.controller.js
β β βββ middleware/
β β β βββ auth.middleware.js β JWT verification
β β β βββ role.middleware.js β Admin/Member guard
β β βββ routes/
β β β βββ auth.routes.js
β β β βββ project.routes.js
β β β βββ task.routes.js
β β β βββ member.routes.js
β β βββ lib/
β β β βββ prisma.js β Prisma client singleton
β β βββ index.js β Express entry point
β βββ .env
β βββ railway.toml β Railway deployment config
β βββ package.json
β
βββ frontend/
βββ src/
β βββ api/
β β βββ client.js β Axios instance + interceptors
β βββ components/
β β βββ Layout.jsx β Sidebar navigation
β β βββ Modal.jsx β Reusable modal
β β βββ TaskCard.jsx β Task display card
β βββ context/
β β βββ AuthContext.jsx β Global auth state
β βββ pages/
β β βββ Landing.jsx β Public landing page
β β βββ Login.jsx
β β βββ Register.jsx
β β βββ Dashboard.jsx β Stats + charts + tasks
β β βββ Projects.jsx β Projects list
β β βββ ProjectDetail.jsx β Tasks + members management
β βββ App.jsx β Routes + auth guards
β βββ main.jsx
βββ index.html
βββ vite.config.js
βββ package.json
- Node.js v18+
- npm v8+
- Git
# 1. Clone the repository
git clone https://github.com/SamridhiiiGupta/Orbit.git
cd Orbit
# 2. Install all dependencies (frontend + backend)
npm run install:all
# 3. Set up environment variables
cp backend/.env.example backend/.env
# Edit backend/.env with your values (see Environment Variables below)
# 4. Initialize the database
cd backend
npx prisma db push
cd ..
# 5. Start the full app (one command)
npm run devThe app will open automatically at http://localhost:5173
npm run devThis uses concurrently to:
- Start the Express backend on
http://localhost:5000 - Start the Vite frontend on
http://localhost:5173 - Auto-opens the browser
# Backend only
cd backend && npm run dev
# Frontend only
cd frontend && npm run dev# Database
DATABASE_URL="file:./dev.db" # SQLite for local dev
# DATABASE_URL="postgresql://..." # PostgreSQL for production
# Auth
JWT_SECRET="your-secret-key-here" # Used to sign/verify JWT tokens
# Server
PORT=5000 # Express server port
# CORS
CLIENT_URL="http://localhost:5173" # Frontend URL (exact match required)# Only needed for production deployment
# In local dev, Vite proxy handles /api β localhost:5000
VITE_API_URL="https://your-backend.railway.app"- Push code to GitHub
- Go to railway.app β New Project β Deploy from GitHub
- Set Root Directory β
backend - Add PostgreSQL plugin (Railway auto-sets
DATABASE_URL) - Update
prisma/schema.prisma:provider = "sqlite"βprovider = "postgresql" - Set environment variables:
JWT_SECRET=your-secret CLIENT_URL=https://your-frontend.railway.app PORT=5000 - Railway runs:
prisma generate && prisma db push && node src/index.js
- New Railway service β same repo β Root Directory:
frontend - Build command:
npm run build - Start command:
npx serve dist -l $PORT - Set variable:
VITE_API_URL=https://your-backend.railway.app
| Mistake | Fix |
|---|---|
prisma: Permission denied |
Remove node_modules from git, add to .gitignore |
| CORS error | CLIENT_URL must exactly match frontend URL with https:// |
| Blank frontend | Check VITE_API_URL is set correctly |
| DB connection error | Add DATABASE_URL as a Railway reference, not manual text |
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| POST | /api/auth/register |
β | Create account |
| POST | /api/auth/login |
β | Login, returns JWT |
| GET | /api/auth/me |
β | Get current user |
| Method | Endpoint | Role | Description |
|---|---|---|---|
| GET | /api/projects |
Any | List user's projects |
| POST | /api/projects |
Any | Create project |
| GET | /api/projects/:id |
Member | Get project details |
| PATCH | /api/projects/:id |
Admin | Update project |
| DELETE | /api/projects/:id |
Admin | Delete project |
| Method | Endpoint | Role | Description |
|---|---|---|---|
| GET | /api/tasks/dashboard |
Any | Cross-project dashboard data |
| GET | /api/tasks/project/:id |
Member | List project tasks |
| POST | /api/tasks/project/:id |
Member | Create task |
| PATCH | /api/tasks/:id |
Member* | Update task |
| DELETE | /api/tasks/:id |
Admin | Delete task |
*Members can only update status of tasks assigned to them.
| Method | Endpoint | Role | Description |
|---|---|---|---|
| GET | /api/members/:projectId |
Member | List members |
| POST | /api/members/:projectId |
Admin | Add member by email |
| PATCH | /api/members/:projectId/:userId |
Admin | Change role |
| DELETE | /api/members/:projectId/:userId |
Admin | Remove member |
- Prisma WAL mode β SQLite uses Write-Ahead Logging for better concurrent read performance
- JWT stateless auth β No server-side sessions; scales horizontally
- Vite proxy β In dev,
/apirequests proxy to backend avoiding CORS entirely - Cascading deletes β Single DB operation cleans up all related records
- Prisma singleton β Single PrismaClient instance reused across all requests
- React lazy state β Dashboard data fetched once per mount, no polling
- Email notifications β Notify assignees when tasks are created or updated
- File attachments β Upload files to tasks (S3/Cloudinary)
- Activity log β Full audit trail per project
- Kanban view β Drag-and-drop board alongside list view
- Task comments β Threaded discussion per task
- Due date reminders β Scheduled emails for upcoming deadlines
- OAuth β Login with Google / GitHub
- Mobile app β React Native client
β Orbit β Built for teams that move fast.




