A full-stack internal tooling application for managing operational workflow requests with role-based access control.
Live Demo: https://opsflow-client.onrender.com
Note: The server runs on Render's free tier and may take 30-60 seconds to wake up on first request.
- User authentication with JWT and bcrypt password hashing
- Role-based access control (Admin, Manager, Requester)
- Create and track workflow requests
- Automated approval routing — requests auto-assigned based on approver workload
- Status updates with role-based permissions (Admin/Manager only)
- Audit log with full history tracking on every request
- In-app notification system with bell icon, unread badge, and dropdown panel
- Analytics dashboard with KPI cards, charts, and request trends (Admin/Manager only)
- CSV export of all workflow requests
- Requesters only see their own submissions
- Persistent data with PostgreSQL via Supabase
Frontend
- React + TypeScript
- Tailwind CSS
- React Router
- Axios
Backend
- Node.js + Express
- TypeScript
- Prisma ORM
- PostgreSQL (Supabase)
- JWT Authentication
- bcryptjs
Deployment
- Render (server + static site)
- Supabase (managed PostgreSQL)
- Node.js 18+
- A Supabase account and project
- Clone the repo
git clone https://github.com/himynameismoose/opsflow.git
cd opsflow- Set up the server
cd server
npm install- Create
server/.env:
DATABASE_URL=your_supabase_pooler_url?pgbouncer=true
DIRECT_URL=your_supabase_direct_url
JWT_SECRET=your_jwt_secret
PORT=8080
CLIENT_URL=http://localhost:5173
- Run database migrations
npx prisma migrate dev- Start the server
npm run dev- Set up the client
cd ../client
npm install- Create
client/.env:
VITE_API_URL=http://localhost:8080
- Start the client
npm run dev- Open
http://localhost:5173
To run the entire stack locally with Docker:
docker-compose up --buildThis starts three containers:
- db — PostgreSQL on port 5433
- server — Express API on port 8080
- client — React app served by nginx on port 80
Then run migrations against the Docker database:
cd server
DATABASE_URL=postgresql://postgres:postgres@localhost:5433/opsflow npx prisma migrate devOpen http://localhost in your browser.
To stop all containers:
docker-compose down| Role | Password | |
|---|---|---|
| Admin | admin@opsflow.com | password123 |
| Requester | test@opsflow.com | password123 |
opsflow/
├── client/ # React + TypeScript frontend
│ └── src/
│ ├── components/ # NotificationBell and shared components
│ ├── context/ # Auth context
│ ├── lib/ # Axios instance, CSV export utility
│ └── pages/ # Login, Register, Dashboard, Analytics
└── server/ # Node.js + Express backend
└── src/
├── controllers/ # Auth, workflow, analytics, notifications
├── middleware/ # JWT auth middleware
├── routes/ # Route definitions
└── lib/ # Prisma client, audit log, notifications, approval router