IssueFlow is a responsive MERN issue and task management application with JWT authentication, issue CRUD, search and filtering, assignees, dashboard statistics and MongoDB persistence.
| Login | Dashboard |
|---|---|
![]() |
![]() |
| Issues | Mobile |
|---|---|
![]() |
![]() |
- Register and log in with JWT authentication (stored in an HTTP-only cookie)
- Create, view, edit and delete issues (deleting asks for confirmation)
- Issue fields: title, description, status, priority, assignee, due date
- Assign an issue to a registered user with a searchable assignee field
- Case-insensitive partial search on title and description, plus status and priority filters, sorting and pagination
- Dashboard with issue statistics
- Validation on the API and in the form: title is required (max 120 characters), description max 2000 characters
- Responsive layout for mobile and desktop
- Frontend: React, Vite
- Backend: Node.js 20+, Express.js, Zod (request validation)
- Database: MongoDB with Mongoose
- Authentication: JWT in HTTP-only cookies
- Tooling: ESLint, Vitest
- Install Node.js 20+ and MongoDB, and start the MongoDB service.
- From the repository root, install dependencies:
npm install && npm install --prefix backend && npm install --prefix frontend - Copy
backend/.env.exampletobackend/.envandfrontend/.env.exampletofrontend/.env. - Set a strong random
JWT_SECRETinbackend/.env(for example, runopenssl rand -hex 32). Keep the default localMONGODB_URIunless MongoDB runs elsewhere.
Start the API and the client together:
npm run devThe API runs on http://localhost:5001 and the Vite client on http://localhost:5173.
Never commit .env files or real credentials.
npm run lint
npm run test
npm run buildBackend tests cover the health check, issue search (partial match, case insensitivity, special characters) and length validation. The frontend currently has only a minimal smoke test.
Authentication endpoints: /api/v1/auth/register, /api/v1/auth/login,
/api/v1/auth/logout and /api/v1/auth/me. Authenticated clients can manage issues
through /api/v1/issues, read statistics from /api/v1/dashboard/stats, and search
assignable users through /api/v1/users. The session JWT is stored in an HTTP-only
cookie, so browser clients must send credentials with requests.
Issue list requests support search, status, priority, sort, order, page and limit.
In production, use a long random JWT secret, HTTPS, a specific client origin and a managed
MongoDB deployment.
Tool used: Code0 (CodeZero) VS Code extension, with the GitHub Copilot CLI as the AI agent.
I used Code0's plan-first workflow: the agent first produced a plan with no code changes, I reviewed and approved it, and then it implemented one task at a time. I reviewed each generated diff and tested the features manually in the browser.
- Project scaffolding: planned the architecture, then generated the frontend and backend structure.
- API creation: JWT auth, protected routes, issue CRUD, dashboard statistics, filtering and search.
- React components: pages and a shared
IssueFormused for both creating and editing issues. - Debugging: fixed JSX parsing errors in
IssuesPage.jsxand the Express error handler (it must have 4 arguments to be treated as an error handler). - Dependencies and verification: replaced a vulnerable
concurrentlypackage with a small Node dev runner, upgraded Vite and Vitest, and moved the API from port 5000 to 5001 because macOS uses 5000.
| Problem | Fix |
|---|---|
| No way to edit an existing issue | Added an edit route and Edit button, reusing IssueForm |
| Assignee field missing from the form | Added a searchable assignee field with request cancellation |
| Delete happened without confirmation | Added a confirmation step |
| Search matched only whole words | Replaced text search with an escaped, case-insensitive regex, and added tests |
| No length limits on title and description | Added limits in the Zod schema, the Mongoose model and the form, with tests |
| Long descriptions and narrow screens hurt the mobile layout | CSS polish, with descriptions clamped to 3 lines |
Code0 could not find an AI provider at first, and its tool connection failed with Codex. I installed the Copilot CLI, logged in and switched the agent to Copilot.
- Search uses a regex, which is fine for small data. A text index or Atlas Search would suit larger data.
- Frontend test coverage is minimal.
- The app is not deployed.



