{"id":48577575,"url":"https://github.com/cedricrobitaille/project-tracker-kanban-lite","last_synced_at":"2026-04-08T16:02:01.740Z","repository":{"id":320619449,"uuid":"1082673271","full_name":"CedricRobitaille/Project-Tracker-Kanban-Lite","owner":"CedricRobitaille","description":"A lightweight Kanban-style project and task tracker for small teams.","archived":false,"fork":false,"pushed_at":"2025-10-24T21:20:32.000Z","size":22,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-24T21:21:04.101Z","etag":null,"topics":["ejs","express","kanban-board-application","men-stack","mongodb","mongoose","node"],"latest_commit_sha":null,"homepage":"https://cedricrobitaille.ca","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CedricRobitaille.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-24T15:34:53.000Z","updated_at":"2025-10-24T21:20:36.000Z","dependencies_parsed_at":"2025-10-24T21:21:09.054Z","dependency_job_id":"47d47ad9-240a-479a-9492-f269a5d6bea2","html_url":"https://github.com/CedricRobitaille/Project-Tracker-Kanban-Lite","commit_stats":null,"previous_names":["cedricrobitaille/project-tracker-kanban-lite"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/CedricRobitaille/Project-Tracker-Kanban-Lite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CedricRobitaille%2FProject-Tracker-Kanban-Lite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CedricRobitaille%2FProject-Tracker-Kanban-Lite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CedricRobitaille%2FProject-Tracker-Kanban-Lite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CedricRobitaille%2FProject-Tracker-Kanban-Lite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CedricRobitaille","download_url":"https://codeload.github.com/CedricRobitaille/Project-Tracker-Kanban-Lite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CedricRobitaille%2FProject-Tracker-Kanban-Lite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31562697,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ejs","express","kanban-board-application","men-stack","mongodb","mongoose","node"],"created_at":"2026-04-08T16:02:00.827Z","updated_at":"2026-04-08T16:02:01.732Z","avatar_url":"https://github.com/CedricRobitaille.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Project Tracker (Kanban-Lite)\n\u003csmall\u003eTechnical Design Document\u003c/small\u003e\n\n**[Visit Live Site](http://18.221.96.129:3001/)**\n\n\u003e A compact, MEN (MongoDB + Express + Node + EJS) Project Tracker with Boards, Tasks, Attachments, and Session auth. Designed to be finishable as a 1–2 controller capstone but includes an authentication controller and Web API integration points for realistic hiring-relevant scope.\n\n\n\n\u003cbr\u003e\n\n## Table of Contents\n\n0. [Deployment Stages](#deployment-stages)\n1. [Project Overview](#project-overview)\n2. [Audience \u0026 Use Cases](#audience--use-cases)\n3. [High-Level Architecture](#high-level-architecture)\n4. [Controllers](#controllers)\n5. [Endpoints](#endpoints)\n6. [Data Model](#data-model)\n7. [Authentication](#authentication)\n8. [Roadmap](#roadmap)\n9. [Wireframes](#wireframes)\n10. [Demo](#demo)\n\n\n\n\u003cbr\u003e\n\n## 0. Deployment Stages\n\n#### Board Management\n- [x] Create New Boards\n- [x] Read Boards, display all boards\n- [x] Update Boards, change properties/people\n- [x] Delete Boards, remove from user object\n\n#### Task Management\n- [x] Create New Tasks, assign to people\n- [x] Read Tasks, display all tasks\n- [x] Update Tasks, change subtasks/states\n- [x] Delete Tasks, remove from the board object\n\n#### Level Ups\n- [x] Landing Page - A Landing Page for new users\n- [ ] API - Access board/task information from an API Call\n- [x] Authentication - Login + Register Pages, Restricted page access\n- [x] Account Administration - Manage team members, and assign people to tasks\n\n\u003cbr\u003e\n\n### MVP\n| Board Management                            |  | Task Management                               |\n|:--------------------------------------------|:-|:----------------------------------------------|\n| Create New Boards                           |  | Create New Tasks, assign to people            |\n| Read Boards, display all boards             |  | Read Tasks, display all tasks                 |\n| Update Boards, change properties/people     |  | Update Tasks, change subtasks/states          |\n| Delete Boards, remove from user object      |  | Delete Boards, remove from the board object   |\n\n\u003cbr\u003e\n\n### Level Ups\n| Level Ups              | Description                                       |\n|:-----------------------|:--------------------------------------------------|\n| Landing Page           | A Landing Page for new users                      |\n| API                    | Access board/task information from an API Call    |\n| Authentication         | Login + Register Pages, Restricted page access    |\n| Account Administration | Manage team members, and assign people to tasks   |\n\n\n\u003cbr\u003e\n\n## 1. Project Overview\n\nA lightweight **Kanban-style** project and task tracker for small teams. Users can create boards, add members, create tasks (with attachments), move tasks between columns. The backend is `Node` + `Express` + `MongoDB (Atlas)` with server-rendered `EJS` pages for the public board view and a `JSON API` for the dashboard.\n\nDemonstrates real-world backend skills (`REST API`s, `session auth`, Role-Based Access Control`RBAC`, `file uploads`).\n\n\n\n\u003cbr\u003e\n\n## 2. Audience \u0026 Use Cases\n\n**Primary users**\n- Small dev teams\n- Agencies (owner, member)\n\n**Core use cases**\n- Owner creates a board, invites members (Creates sub-users).\n- Members add tasks to columns, assign tasks, edit tasks, upload attachments.\n- Tasks moved between columns.\n- `API` used by `EJS` frontend.\n\n\n\n\u003cbr\u003e\n\n## 3. High Level Architecture\n\n```\n[Browser + EJS Views]\n        ↓\n[Express Router + Controllers]\n        ↓\n[Session Middleware (express-session)]\n        ↓\n[Mongoose Models → MongoDB Atlas]\n        ↓\n[File Storage (Local)]\n```\n\nKey components\n- `Express` app with routers.\n- `Controllers`: AuthController, BoardsController, TasksController.\n- `Mongoose models` for users, boards, tasks, attachments.\n- `Multer` for file handling; upload to cloud (Cloudinary or S3) in production.\n- `EJS` templating for server-rendered board view; all features accessible via JSON API.\n\n\n\n\u003cbr\u003e\n\n## 4. Controllers\n\n| Controllers          | Responsibility                                    |\n|:---------------------|:--------------------------------------------------|\n| `AuthController`     | Register, Login, Logout, and Session Verification |\n| `BoardsController`   | Board CRUD and member management                  |\n| `TasksController`    | Task CRUD, attachments                            |\n\n\n\n\u003cbr\u003e\n\n## 5. Endpoints\n\n#### AuthController\n| Method    | Path             | Purpose                                  | Render / Dedirect                 |\n| --------- | ---------------- | ---------------------------------------- | --------------------------------- |\n| `GET`     | `/auth/login`    | Render login page                        | res.render(\"/auth/login\")         |\n| `POST`    | `/auth/login`    | Validate credentials, create session     | res.redirect(\"/boards\")           |\n| `GET`     | `/auth/register` | Render registration form                 | res.render(\"/auth/register\")      |\n| `POST`    | `/auth/register` | Create user and auto-login               | res.redirect(\"/\")                 |\n| `POST`    | `/auth/logout`   | Destroy session and redirect             | res.redirect(\"/\")                 |\n| `GET`     | `/auth/:userId`  | Return session user info (for dashboard) | res.render(\"/\")                   |\n| `DELETE`  | `/auth/:userId`  | Delete user, and redirect                | res.redirect(\"/\")                 |\n\n\u003cbr\u003e\n\n#### BoardsController\n| Method   | Path                      | Purpose                          | Render / Dedirect                 |\n| -------- | ------------------------- | -------------------------------- | --------------------------------- |\n| `POST`   | `/boards`                 | Create new board (auth required) | res.redirect(\"/boards/:boardId\")  |\n| `GET`    | `/boards`                 | List user’s boards               | res.render(\"/boards\")             |\n| `GET`    | `/boards/:boardId`        | Retrieve board (with columns)    | res.render(\"/boards/:boardId\")    |\n| `PUT`    | `/boards/:boardId`        | Update board (title, columns)    | res.redirect(\"/boards\")           |\n| `DELETE` | `/boards/:boardId`        | Delete board                     | res.redirect(\"/boards\")           |\n| `POST`   | `/boards/:boardId/invite` | Add member to board              | res.redirect(\"/boards/:boardId\")  |\n\n\u003cbr\u003e\n\n#### TasksController\n| Method   | Path                        | Purpose                 | Render / Dedirect                        |\n| -------- | --------------------------- | ----------------------- | ---------------------------------------- |\n| `POST`   | `/boards/:boardId`          | Create new task         | res.redirect(\"/boards/:boardId/:taskId\") |\n| `GET`    | `/boards/:boardId/:taskId`  | Displays task details   | res.render(\"/boards/:boardId/:taskId\")   |\n| `PUT`    | `/boards/:boardId/:taskId`  | Edit or move task       | res.render(\"/boards/:boardId/:taskId\")   |\n| `DELETE` | `/boards/:boardId/:taskId`  | Delete task             | res.redirect(\"/boards/:boardId\")         |\n| `POST`   | `/boards/:boardId/:taskId`  | Save task details       | res.render(\"/boards/:boardId/:taskId\")   |\n\n\n\n\u003cbr\u003e\n\n## 6. Data Model (MongoDB)\n\n#### `User` (collection: `users`)\n```js\n{\n  _id: ObjectId,\n  name: String,\n  email: { type: String, unique: true, index: true },\n  passwordHash: String,\n  role: { type: String, enum: ['user','admin'], default: 'user' },\n  createdAt: Date\n}\n```\n\n\u003cbr\u003e\n\n#### `Board` (collection: `boards`)\n```js\n{\n  _id: ObjectId,\n  title: String,\n  ownerId: ObjectId, // ref users\n  members: [{ userId: ObjectId, role: 'member'|'editor' }],\n  columns: [{ _id: ObjectId, name: String, order: Number }],\n  createdAt: Date,\n  updatedAt: Date\n}\n```\nIndex suggestions: `{ ownerId: 1 }, { \"members.userId\": 1 }`\n\n\u003cbr\u003e\n\n#### `Task` (collection: `tasks`)\n```js\n{\n  _id: ObjectId,\n  boardId: ObjectId, // ref boards\n  columnId: ObjectId, // column in board\n  title: String,\n  description: String,\n  assigneeId: ObjectId,\n  order: Number,\n  attachments: [{ url, filename, size, uploadedAt }],\n  createdBy: ObjectId,\n  createdAt: Date,\n  updatedAt: Date\n}\n```\nIndex suggestions: `{ boardId: 1, columnId: 1, order: 1 }`, text `index` on title and `description` for search.\n\n\n\n\u003cbr\u003e\n\n## 7. Authentication\n\n#### Stack:\n- `express-session`: \n- `bcrrypt`: To Hash passwords\n- \n\n#### Auth Flow:\n- **Login**: Create `req.session.userID`\n- **Protected Routes**: Use `isAuthenticated` to check session\n- **Logout**: `req.sessiom.destroy()` to clear cookie\n- **Session Expiry**: After 1 week\n\n#### Middleware Example:\n```js\n// Adds session cookie to user\napp.use(\n  session({\n    secret: process.env.SESSION_SECRET,\n    resave: false,\n    saveUninitialized: true,\n  })\n);\n```\n\n```js\nreq.session.user = {\n  username: userInDatabase.username,\n  res.redirect(\"/\");\n};\n```\n\n```js\n// Adds session authentication to `boardsController`\napp.use(\n  \"/boards\",\n  (req, res, next) =\u003e {\n    if (req.session.user) {\n      res.locals.user = req.session.user; // Store user info for use in the next function\n      next(); // Proceed to the next middleware or controller\n    } else {\n      res.redirect(\"/login\"); // Redirect unauthenticated users\n    }\n  },\n  boardsController // The controller handling the '/boards' route\n);\n```\n\n\n\n\u003cbr\u003e\n\n## 8. Roadmap\n\n| Day | Task                                        |\n| --- | ------------------------------------------- |\n| 1   | Setup project, Mongo connection, user model |\n| 1   | Session-based auth \u0026 routes                 |\n| 2   | BoardsController                            |\n| 3   | TasksController                             |\n| 4   | File uploads                                |\n| 5   | Testing setup                               |\n| 5   | Deploy + polish README                      |\n\n\n\n\n\u003cbr\u003e\n\n## 9. Wireframes\n\n#### Landing Page\n\u003cimg src=\"https://i.imgur.com/CUDfMwT.png\" width=\"1920\"\u003e\n\n#### Auth Page\n\u003cimg src=\"https://i.imgur.com/MtJbVzD.png\" width=\"1920\"\u003e\n\n#### Dashboard\n\u003cimg src=\"https://i.imgur.com/TiGkpOd.png\" width=\"1920\"\u003e\n\n#### New Project Form\n\u003cimg src=\"https://i.imgur.com/26NSgaI.png\" width=\"1920\"\u003e\n\n#### Kanban Board\n\u003cimg src=\"https://i.imgur.com/lh6Mp3W.png\" width=\"1920\"\u003e\n\n#### Edit Task\n\u003cimg src=\"https://i.imgur.com/8i4YXuf.png\" width=\"1920\"\u003e\n\n#### Timeline\n\u003cimg src=\"https://i.imgur.com/h1bFJ3p.png\" width=\"1920\"\u003e\n\n#### Account Form\n\u003cimg src=\"https://i.imgur.com/BfQpgSw.png\" width=\"1920\"\u003e\n\n\n\n\u003cbr\u003e\n\n## 10. Demo\n\n1. Login/Register: Demonstrate session-based login and cookie creation.\n2. Create Board: Show /api/boards route and redirect to board view.\n3. Add Tasks: Create and move tasks between columns.\n4. Upload Attachment: Upload file to a task.\n5. Logout: Session destroyed, user redirected to /login.\n\n---\n\n\u003e Created by [Cedric Robitaille](https://cedricrobitaille.ca)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcedricrobitaille%2Fproject-tracker-kanban-lite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcedricrobitaille%2Fproject-tracker-kanban-lite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcedricrobitaille%2Fproject-tracker-kanban-lite/lists"}