A full-stack team collaboration platform — teams, projects, a Kanban task board, comments, notifications, and analytics, built on a two-tier authorization model with a background job queue.
August 2026 · Solo Project · ~4 weeks, part-time
Dev-Collab is a GitHub/Linear-style team collaboration app built on a pnpm monorepo — an Express + MongoDB backend, a Vue 3 frontend, and a shared Zod schema package consumed by both, so the same validation rules run on the client and the server. It covers teams, projects, a Kanban/list task board, threaded comments, a per-task activity timeline, in-app notifications backed by a real background job queue, a team-scoped analytics dashboard built on MongoDB aggregation pipelines, and a separate platform-wide admin panel.
Team collaboration tools bundle a lot of subtle authorization logic — a user's platform-wide role and their role inside any one team are genuinely independent, and getting that wrong is a real security bug, not just a UX inconsistency. The goal was to build that correctly from the ground up, including finding and closing an actual privilege-escalation path along the way, rather than bolt permissions on after the fact.
Frontend
Backend
Solution
Added a narrower, assignment/delete-only permission check (team-admin OR project-owner, no assignee branch) while deliberately keeping edit assignee-inclusive, since editing a task you're assigned to is legitimate.
Result
Closed the escalation path without breaking the legitimate workflow, verified with a dedicated regression test.









A memory-only access token means every hard page reload relies entirely on the refresh cookie — worth single-flighting the refresh call from day one, not after the first race-condition bug report
CSS Grid's implicit tracks default to content-based sizing, not clamped to the container — an explicit grid-cols-1 is a one-line fix, but only once you've actually rendered the page in a real browser to see it happen
Two permission concepts that sound similar (a user's platform role vs. their role inside one team) need to be enforced as genuinely separate checks, or you end up with a real escalation path instead of just confusing code