A flexible kanban board application with multiple boards support, drag-and-drop functionality, and arbitrary column configuration, built for Val Town using React frontend and SQLite backend.
-
Core Kanban Features:
- Multiple kanban boards with custom names
- Arbitrary number of columns per board with custom names
- Create, edit, delete boards and columns
- Create, edit, delete tasks
- Drag and drop tasks between columns
- Task priorities (Low, Medium, High)
- Task descriptions and due dates
-
UI/UX:
- Clean, responsive design using DaisyUI components
- Theme switching with DaisyUI themes
- Real-time updates when tasks are moved
- Simple, intuitive interface following KISS principles [[memory:4516396]]
├── kanban-backend/
│ ├── database/
│ │ ├── migrations.ts # SQLite schema setup
│ │ └── queries.ts # Database query functions
│ ├── routes/
│ │ ├── boards.ts # Board CRUD operations
│ │ ├── columns.ts # Column CRUD operations
│ │ ├── tasks.ts # Task CRUD operations
│ │ └── static.ts # Static file serving
│ └── index.ts # Main Hono app entry point
├── kanban-frontend/
│ ├── components/
│ │ ├── App.tsx # Main app component
│ │ ├── BoardList.tsx # List of all boards
│ │ ├── BoardView.tsx # Single board view
│ │ ├── KanbanBoard.tsx # Board container with columns
│ │ ├── KanbanColumn.tsx # Individual columns
│ │ ├── TaskCard.tsx # Task card component
│ │ ├── TaskForm.tsx # Create/edit task form
│ │ ├── BoardForm.tsx # Create/edit board form
│ │ └── ColumnForm.tsx # Create/edit column form
│ ├── index.html # Main HTML template
│ ├── index.tsx # React entry point
│ └── style.css # Custom styles (if needed)
├── shared/
│ └── types.ts # Shared TypeScript interfaces
└── README.md
Table Name Constants:
// In migrations.ts - configurable table names
const BOARDS_TABLE = 'kanban_boards_v1';
const COLUMNS_TABLE = 'kanban_columns_v1';
const TASKS_TABLE = 'kanban_tasks_v1';
Boards Table:
CREATE TABLE IF NOT EXISTS ${BOARDS_TABLE} ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, description TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP );
Columns Table:
CREATE TABLE IF NOT EXISTS ${COLUMNS_TABLE} ( id INTEGER PRIMARY KEY AUTOINCREMENT, board_id INTEGER NOT NULL, name TEXT NOT NULL, position INTEGER NOT NULL DEFAULT 0, color TEXT DEFAULT '#6b7280', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (board_id) REFERENCES ${BOARDS_TABLE}(id) ON DELETE CASCADE );
Tasks Table:
CREATE TABLE IF NOT EXISTS ${TASKS_TABLE} ( id INTEGER PRIMARY KEY AUTOINCREMENT, column_id INTEGER NOT NULL, title TEXT NOT NULL, description TEXT, priority TEXT NOT NULL DEFAULT 'medium', due_date TEXT, position INTEGER NOT NULL DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (column_id) REFERENCES ${COLUMNS_TABLE}(id) ON DELETE CASCADE );
Schema Details:
Boards:
id
: Unique board identifiername
: Board name (required)description
: Optional board descriptioncreated_at
,updated_at
: Timestamps
Columns:
id
: Unique column identifierboard_id
: Reference to parent boardname
: Column name (required)position
: For ordering columns within boardcolor
: Optional column color for themingcreated_at
,updated_at
: Timestamps
Tasks:
id
: Unique task identifiercolumn_id
: Reference to parent columntitle
: Task title (required)description
: Optional task descriptionpriority
: 'low', 'medium', 'high'due_date
: ISO date string (optional)position
: For ordering within columnscreated_at
,updated_at
: Timestamps
Boards API:
GET /api/boards
- Get all boardsGET /api/boards/:id
- Get single board with columns and tasksPOST /api/boards
- Create new boardPUT /api/boards/:id
- Update boardDELETE /api/boards/:id
- Delete board (cascades to columns and tasks)
Columns API:
GET /api/boards/:boardId/columns
- Get columns for a boardPOST /api/boards/:boardId/columns
- Create new columnPUT /api/columns/:id
- Update columnDELETE /api/columns/:id
- Delete column (cascades to tasks)PATCH /api/columns/:id/move
- Reorder column position
Tasks API:
GET /api/columns/:columnId/tasks
- Get tasks for a columnPOST /api/columns/:columnId/tasks
- Create new taskPUT /api/tasks/:id
- Update taskDELETE /api/tasks/:id
- Delete taskPATCH /api/tasks/:id/move
- Move task (update column/position)
Static Files:
GET /
- Serve main HTML with initial data injectionGET /kanban-frontend/*
- Serve frontend assetsGET /shared/*
- Serve shared utilities
App.tsx - Main application container
- DaisyUI theme management
- Global state management
- Error boundaries
- Routing between board list and board view
BoardList.tsx - List of all boards
- Grid/list view of boards
- Create new board button
- Board search/filtering
- Quick board actions
BoardView.tsx - Single board view
- Board header with name and actions
- Navigation back to board list
- Board settings and column management
KanbanBoard.tsx - Board layout with columns
- Dynamic column rendering based on board configuration
- Drag and drop context
- Add new column functionality
- Column reordering
KanbanColumn.tsx - Individual columns
- Column header with task count and actions
- Drop zone for tasks
- Add task button
- Column editing (name, color)
- Column deletion
TaskCard.tsx - Individual task representation
- Draggable task card with DaisyUI styling
- Priority indicators with badges
- Due date display
- Quick actions (edit, delete)
TaskForm.tsx - Task creation/editing
- DaisyUI modal or drawer
- Form validation
- Priority selection
- Date picker for due dates
BoardForm.tsx - Board creation/editing
- DaisyUI modal for board details
- Board name and description
- Default columns setup
ColumnForm.tsx - Column creation/editing
- DaisyUI modal for column details
- Column name and color picker
- Position management
Frontend:
- React 18.2.0 (pinned version)
- DaisyUI for component styling and themes
- TailwindCSS (included with DaisyUI)
- React DnD or HTML5 drag/drop for task and column movement
- Date-fns for date handling
Backend:
- Hono framework for API routes
- SQLite for data persistence with configurable table names
- Val Town standard utilities
Shared:
- TypeScript interfaces for type safety
- Utility functions for data validation
- Set up Hono app with error handling
- Create SQLite schema with configurable table names
- Implement boards, columns, and tasks CRUD API endpoints
- Add static file serving for kanban-frontend
- Set up React app with DaisyUI and proper imports
- Create board list and basic navigation
- Implement board view with dynamic columns
- Add basic task display and interactions
- Implement board creation and editing
- Add dynamic column creation and management
- Column reordering and customization
- Board navigation and routing
- Implement task drag and drop between columns
- Add column reordering functionality
- Position management for tasks and columns
- Smooth animations with DaisyUI transitions
- Add DaisyUI theme switching
- Implement task priorities and due dates
- Add form validation and error handling
- Responsive design with DaisyUI utilities
Val Town Specific:
- Use
https://esm.sh
for all imports - Pin React version to 18.2.0
- Use proper JSX import source
- Implement proper error boundaries
- Use Val Town utilities for file serving
- Prefix folders with
kanban-
for multi-app project structure
Performance:
- Minimize API calls with efficient state management
- Use optimistic updates for better UX
- Implement proper loading states
- Efficient querying with proper foreign key relationships
User Experience:
- Follow DRY, KISS, YANGI principles [[memory:4516396]]
- Intuitive drag and drop interactions for tasks and columns
- Clear visual feedback for all actions
- DaisyUI components for consistent, accessible design
- Multiple theme support with DaisyUI
Data Integrity:
- Configurable table names for schema flexibility
- Proper task and column positioning logic
- Atomic operations for moves and reordering
- Cascade deletes for data consistency
- Input validation on both frontend and backend
Multi-Board Architecture:
- Flexible board creation with custom column configurations
- Efficient data structure for arbitrary column counts
- Board-specific settings and customizations
- Scalable design for multiple board types
- Board templates for quick setup
- Task assignments and collaboration
- Task comments and history
- Advanced search and filtering across boards
- Export/import functionality
- Real-time collaboration with WebSockets
- Board sharing and permissions
- Custom task fields and metadata
This plan provides a flexible, scalable foundation for a multi-board kanban app while maintaining simplicity and following Val Town best practices. The architecture supports arbitrary board and column configurations while keeping the codebase organized for future multi-app development.