A modern Kanban board built with Angular 21, signals, and Tailwind CSS — drag, drop, deliver.
- About
- Features
- Screenshots
- Tech Stack
- Architecture
- Project Structure
- Getting Started
- Available Scripts
- Key Concepts Demonstrated
- Roadmap
- Contributing
- License
- Author
Task Flow Manager is a lightweight, opinionated Kanban application designed to help individuals and small teams visualize and move work across the classic To Do → In Progress → Done pipeline. It focuses on the essentials — adding, editing, prioritizing, and dragging tasks — without the noise of feature-heavy enterprise tools.
The project was built as a showcase of modern Angular patterns: standalone components, the new control flow syntax, signals-based state management, and zoneless change detection. It is intentionally small in scope but production-grade in architecture, making it a strong reference for interview portfolios and learning materials.
Everything lives in the browser. Tasks and user preferences (including the dark mode toggle) are persisted to localStorage via a dedicated service, so no backend is required to run, demo, or extend the app.
- 🗂️ Three-column Kanban board — To Do, In Progress, Done.
- 🖱️ Drag & drop between columns and within a column, powered by
@angular/cdk/drag-drop. - ➕ Create, edit and delete tasks through a modal form built with Reactive Forms.
- 🎯 Priority levels (low / medium / high) with color-coded badges and rings.
- 🏷️ Custom categories — tag tasks with any label you need.
- ⏰ Optional deadlines with overdue highlighting.
- 🔎 Search by title with a 300ms RxJS debounce.
- 🧹 Filter by priority and category via
signal+computedreactivity. - 📊 Stats view showing tasks per column, priority distribution and overall completion %.
- 🌗 Dark mode toggle, persisted in
localStorageand respecting system preference on first load. - 💾 Automatic persistence — every change is mirrored to
localStorage. - 📱 Responsive layout — stacked on mobile, three columns on desktop.
- ♻️ Reusable confirm dialog for destructive actions.
| Technology | Purpose | Version |
|---|---|---|
| Angular | Application framework (standalone APIs, signals, control flow) | 21.x |
| TypeScript | Strict, typed application code | 5.9.x |
| Tailwind CSS | Utility-first styling and dark-mode variants | 4.x |
| @angular/cdk/drag-drop | Drag & drop interactions between Kanban columns | 21.x |
| Reactive Forms | Modal task editor with validation | bundled |
| RxJS | Debounced search input pipeline | 7.8.x |
| Vite / esbuild (via @angular/build) | Production builds | bundled |
The app follows a service-driven, signal-first architecture. Components are thin and declarative — all mutation logic lives inside services, which expose signals and computeds for the UI to consume.
┌──────────────────────────────────────────────────────────────┐
│ Components │
│ Header · Board · Column · TaskCard · TaskForm · Stats │
│ (standalone, OnPush, signals) │
└──────────▲────────────────────────────────────────▲──────────┘
│ reads computed() / calls actions │
│ │
┌──────────┴─────────────┐ ┌─────────┴──────────┐
│ TaskService │ │ ThemeService │
│ tasks: signal<Task[]> │ │ theme: signal │
│ filteredTasks (comp.) │ │ isDark (comp.) │
│ stats (comp.) │ │ │
└──────────▲─────────────┘ └─────────▲──────────┘
│ │
└────────────────┬───────────────────────┘
▼
┌───────────────────┐
│ StorageService │
│ read / write / │
│ remove (LS) │
└───────────────────┘
TaskServiceowns the canonicaltaskssignal, derivesfilteredTasks,categories, andstatsviacomputed(), debounces the search input through an RxJSSubject, and persists every change via aneffect().ThemeServiceexposes the current theme as a signal, mirrors it to the<html>class list, and persists the user choice.StorageServiceis the only place that toucheslocalStorage— a thin, typed wrapper that gracefully degrades in non-browser environments.- Components are all
standalone, useChangeDetectionStrategy.OnPush, and rely on the new@if/@forcontrol flow syntax.
task-flow-manager/
├── src/
│ ├── app/
│ │ ├── components/
│ │ │ ├── board/ # Main Kanban view, filters, modals
│ │ │ ├── column/ # Single column with cdk drop-list
│ │ │ ├── confirm-dialog/ # Reusable confirmation modal
│ │ │ ├── header/ # Top nav, theme toggle, routing
│ │ │ ├── stats/ # Statistics dashboard
│ │ │ ├── task-card/ # Single draggable task card
│ │ │ └── task-form/ # Modal create/edit form
│ │ ├── models/
│ │ │ └── task.model.ts # Task, Priority, ColumnId, stats
│ │ ├── services/
│ │ │ ├── storage.service.ts # localStorage wrapper
│ │ │ ├── task.service.ts # Tasks + filters + computed stats
│ │ │ └── theme.service.ts # Dark / light mode
│ │ ├── shared/
│ │ │ └── priority-styles.ts # Tailwind class lookup per priority
│ │ ├── app.config.ts # Providers, router, zoneless CD
│ │ ├── app.routes.ts # /board and /stats routes
│ │ └── app.ts # Root shell component
│ ├── index.html
│ ├── main.ts
│ └── styles.css # Tailwind + global tweaks
├── angular.json
├── package.json
├── tsconfig.json # strict: true
├── LICENSE
└── README.md
- Node.js 18.19+ (LTS recommended)
- npm 9+ (bundled with Node)
- Angular CLI 21+ — install globally with:
npm install -g @angular/cligit clone https://github.com/giblecdg/task-flow-manager.git
cd task-flow-manager
npm installng serveThen open http://localhost:4200 in your browser. The app supports hot module replacement out of the box.
ng buildThe optimized bundle will be emitted to dist/task-flow-manager/.
| Command | Description |
|---|---|
npm start |
Alias for ng serve — starts the dev server on :4200. |
npm run build |
Production build into dist/. |
npm run watch |
Development build in watch mode. |
npm test |
Runs the unit test suite via the Angular test runner. |
ng serve |
Starts the dev server. |
ng build |
One-shot production build. |
ng generate |
Scaffold components, services, etc. |
This project intentionally exercises a curated set of modern Angular features — useful as a portfolio talking-point during interviews:
- Standalone components (no
NgModule). - Signals (
signal,computed,effect) for reactive state management. - Zoneless change detection (
provideZonelessChangeDetection). - New control flow syntax —
@if,@for(withtrack),@empty,@switch. input()/output()functions for typed component IO.- Reactive Forms with
FormBuilder, validators and typed value access. - RxJS interop —
Subject+debounceTime+takeUntilDestroyedfor search. - Dependency injection with the
inject()function. - Lazy-loaded routes using
loadComponent. - Angular CDK drag & drop between connected
cdkDropLists. - Tailwind CSS v4 with the
@custom-variant darkstrategy. - TypeScript
strictmode end-to-end, noanyin app code.
- ✅ MVP: board, filters, stats, dark mode, localStorage
- ⬜ Unit tests for
TaskServiceand components - ⬜ End-to-end tests (Playwright or Cypress)
- ⬜ REST / GraphQL backend integration
- ⬜ Real-time collaboration (WebSocket sync)
- ⬜ Progressive Web App (offline-first, installable)
- ⬜ Multi-user accounts and authentication
- ⬜ Task labels, subtasks and comments
- ⬜ Internationalization (i18n)
- ⬜ Drag-and-drop file attachments
Contributions, ideas, and bug reports are very welcome! For anything non-trivial, please open an issue first to discuss what you would like to change.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'feat: add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
See CONTRIBUTING.md for the full guidelines (placeholder — add a contributing guide before publishing the repo).
Distributed under the MIT License. See LICENSE for more information.
If this project helped you, consider giving it a ⭐ on GitHub — it makes a real difference!