A modern, privacy-first kanban board task management system built with Next.js, TypeScript, and Tailwind CSS. Features a clean, accessible interface with advanced typography and responsive design.
Version 3.0.1 includes major internal refactoring for improved code quality and maintainability while maintaining 100% backward compatibility.
- Multi-Board Management: Create and manage multiple kanban boards
- Task Organization: Drag-and-drop tasks between columns (Todo, In Progress, Done)
- Board Customization: Custom colors and descriptions for each board
- Data Persistence: Stored locally with IndexedDB with export/import capabilities
- Archive System: Archive completed tasks and boards
- Theme Support: Light and dark mode with system preference detection
- Responsive Design: Optimized for desktop and mobile devices
- Accessibility: WCAG compliant with keyboard navigation support
- Modern Typography: Professional typography system with Inter and JetBrains Mono fonts
- Clean Interface: Minimalist design focused on productivity
- User Guide: Built-in help system and user guidance
- Privacy-First: All data stored locally, no external tracking
- Performance Optimized: Fast loading with Next.js App Router
- Type Safety: Full TypeScript implementation
- Component Library: Built with shadcn/ui components
- State Management: Zustand for efficient state handling
- Prerequisites: Node.js 20+ and npm 10+.
- Install dependencies:
npm install - Start dev server:
npm run devthen openhttp://localhost:3000 - Build for production:
npm run build - Run production build:
npm start
- Framework: Next.js 15 (App Router), React 19
- Language: TypeScript
- Styling: Tailwind CSS v4
- UI: shadcn/ui, Lucide icons
- State: Zustand stores
- Persistence: IndexedDB via
taskDBwith JSON export/import - Theme:
next-themesfor dark/light mode - Testing: Vitest + Testing Library (jsdom), Playwright for E2E
- Tooling: ESLint (Next.js config), TypeScript, Dockerfile for containerization
- Build the Docker image:
docker build -t kanban-todos:latest .- Run the container:
docker run -p 3000:3000 --name kanban-todos kanban-todos:latest- Access the app at http://localhost:3000
- Tag the image (example for Docker Hub):
docker tag kanban-todos:latest <your-username>/kanban-todos:latest- Push the image:
docker push <your-username>/kanban-todos:latest- Create a Kubernetes deployment manifest referencing your pushed image.
- Expose the deployment via a Service (NodePort, LoadBalancer, or Ingress).
- Example minimal deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kanban-todos
spec:
replicas: 1
selector:
matchLabels:
app: kanban-todos
template:
metadata:
labels:
app: kanban-todos
spec:
containers:
- name: kanban-todos
image: <your-repo>/kanban-todos:latest
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: kanban-todos
spec:
type: NodePort
ports:
- port: 3000
targetPort: 3000
nodePort: 32000
selector:
app: kanban-todos- Apply with:
kubectl apply -f <manifest.yaml>src/
βββ app/ # Next.js App Router
β βββ globals.css # Global styles and typography system
β βββ layout.tsx # Root layout with font configuration
β βββ page.tsx # Main application page
βββ components/ # React components
β βββ ui/ # shadcn/ui base components
β βββ kanban/ # Kanban-specific components
β βββ board/ # Board management components
β βββ sidebar/ # Sidebar components
β βββ accessibility/ # WCAG-compliant components
β βββ ... # Feature components and dialogs
βββ lib/ # Utilities and stores
βββ stores/ # Zustand state stores (modular architecture)
β βββ taskStore.ts # Main task store (composition layer)
β βββ taskStoreActions.ts # CRUD operations
β βββ taskStoreFilters.ts # Filter and search operations
β βββ taskStoreSearch.ts # Search navigation
β βββ taskStoreImportExport.ts # Import/export operations
β βββ taskStoreValidation.ts # Validation and error handling
β βββ taskStoreHelpers.ts # Helper functions
β βββ boardStore.ts # Board management
β βββ settingsStore.ts # Application settings
βββ types/ # TypeScript type definitions
βββ utils/ # Utility modules
β βββ database.ts # IndexedDB wrapper
β βββ exportImport.ts # Export/import logic
β βββ exportImportHelpers.ts # Import/export helpers
β βββ validation.ts # Data validation
β βββ security.ts # Input sanitization
β βββ taskFiltering.ts # Task filtering utilities
β βββ ... # Other utilities
βββ utils.ts # Base helpers (e.g., cn)
Version 3.0 introduces a modular store architecture for improved maintainability and code organization:
-
Rendering: Next.js App Router in
src/apprenders the shell (layout.tsx) and the board UI (page.tsx). UI is composed fromsrc/componentswith Tailwind CSS and shadcn/ui primitives. Drag-and-drop uses@dnd-kit. -
State Management: Modular Zustand stores in
src/lib/stores:- Main
taskStore.tsacts as a composition layer (190 lines, down from 879) - Separated concerns into focused modules:
- Actions: CRUD operations for tasks
- Filters: Search and filtering logic with caching
- Search: Navigation and search preferences
- Import/Export: Bulk data operations
- Validation: Error handling and data integrity
- Helpers: Shared utility functions
- Components subscribe via selectors and dispatch store actions
- Main
-
Persistence:
src/lib/utils/database.tswraps IndexedDB for tasks, boards, settings, and archive. Stores calltaskDBto read/write; settings persist across sessions. Export/import uses modular helpers inexportImport.tsandexportImportHelpers.ts. -
Types & Utilities: Shared types in
src/lib/types, utilities insrc/lib/utilsorganized by concern (keyboard, validation, notifications, security, filtering, memory optimization). -
Testing: Unit tests (Vitest + Testing Library, jsdom) live next to code or under
__tests__; E2E tests (Playwright) live ine2e/. Global test setup issrc/test/setup.ts. -
Data Flow: User action β component event β store action β optional
taskDBmutation β store state update β subscribed components re-render. Import/export and archive operations follow the same pattern through store APIs.
The codebase follows strict quality guidelines:
- Functions kept under 30 lines for readability
- Single Responsibility Principle applied throughout
- YAGNI (You Aren't Gonna Need It) - unused code removed
- DRY (Don't Repeat Yourself) - common patterns extracted
- Comprehensive TypeScript types for safety
- Click the "+" button next to "Boards" in the sidebar
- Enter board name, description, and choose a color
- Click "Create Board" to add it to your workspace
- Select a board from the sidebar
- Click "Add Task" in any column to create new tasks
- Drag and drop tasks between columns to update their status
- Click on tasks to edit details, add descriptions, or archive them
- Export: Use "Export Data" to download your boards and tasks as JSON
- Import: Use "Import Data" to restore from a previously exported file
- Archive: Archive completed tasks to keep your boards clean
The typography system can be customized in src/app/globals.css:
- Heading styles and hierarchy
- Font feature settings
- Line heights and spacing
- Text wrapping behavior
Colors and design tokens are defined in the CSS custom properties within globals.css for both light and dark themes.
- Chrome/Chromium 90+
- Firefox 88+
- Safari 14+
- Edge 90+
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with Next.js
- UI components from shadcn/ui
- Icons by Lucide
- Typography powered by Geist and Geist Mono
- Development assistance from Claude Code