# Example: Simple Task Manager (No Auth) This is an example of planning docs generated for a simple public task manager web app (no user accounts). **User Request**: "I want to build a simple task manager where anyone can create, edit, and complete tasks. Just a public tool, no user accounts needed." --- ## IMPLEMENTATION_PHASES.md # Implementation Phases: Simple Task Manager **Project Type**: Public Web App (CRUD) **Stack**: Cloudflare Workers + Vite + React + Tailwind v4 + shadcn/ui + D1 **Estimated Total**: 12 hours (~12 minutes human time with AI assistance) **Created**: 2025-10-25 --- ## Phase 1: Project Setup **Type**: Infrastructure **Estimated**: 2-3 hours **Files**: `package.json`, `wrangler.jsonc`, `vite.config.ts`, `src/index.ts`, `src/index.css` ### Tasks - [ ] Scaffold Cloudflare Worker with Vite using `npm create cloudflare@latest` - [ ] Install dependencies: React, Tailwind v4, shadcn/ui, Hono - [ ] Configure `wrangler.jsonc` with D1 database binding - [ ] Setup Tailwind v4 with `@tailwindcss/vite` plugin - [ ] Initialize shadcn/ui with dark mode support - [ ] Create basic "Hello World" component - [ ] Test local dev server - [ ] Test deployment to Cloudflare ### Verification Criteria - [ ] `npm run dev` starts without errors - [ ] `localhost:5173` shows React app with Tailwind styling - [ ] Dark/light mode toggle works - [ ] `npm run build` succeeds - [ ] `npx wrangler deploy` deploys successfully - [ ] Deployed URL shows working app ### Exit Criteria Working development environment with successful test deployment. Can iterate on code locally and deploy to Cloudflare. --- ## Phase 2: Database Schema **Type**: Database **Estimated**: 2 hours **Files**: `migrations/0001_initial.sql`, `src/lib/db-types.ts` ### Tasks - [ ] Create D1 database using `npx wrangler d1 create task-manager-db` - [ ] Design `tasks` table schema - [ ] Write migration SQL file - [ ] Apply migration to local database - [ ] Create TypeScript types for database schema - [ ] Write test query in Worker to verify database connection ### Verification Criteria - [ ] Migration runs without errors - [ ] Can insert test task - [ ] Can query tasks from Worker - [ ] TypeScript types match database schema ### Exit Criteria Database schema deployed locally, can perform CRUD operations from Worker. --- ## Phase 3: Tasks API **Type**: API **Estimated**: 4 hours **Files**: `src/routes/tasks.ts`, `src/lib/schemas.ts`, `src/middleware/cors.ts` ### Tasks - [ ] Define Zod schema for task validation - [ ] Create CORS middleware - [ ] Implement GET /api/tasks (list all tasks) - [ ] Implement POST /api/tasks (create task) - [ ] Implement PATCH /api/tasks/:id (update task) - [ ] Implement DELETE /api/tasks/:id (delete task) - [ ] Add error handling middleware - [ ] Test all endpoints manually with curl ### Verification Criteria - [ ] GET /api/tasks returns empty array initially - [ ] POST /api/tasks with valid data returns 201 - [ ] POST /api/tasks with invalid data returns 400 - [ ] PATCH /api/tasks/:id updates task and returns 200 - [ ] DELETE /api/tasks/:id removes task and returns 204 - [ ] Invalid task ID returns 404 - [ ] CORS headers present in responses ### Exit Criteria All CRUD endpoints working, tested with curl, proper error handling. --- ## Phase 4: Task List UI **Type**: UI **Estimated**: 3-4 hours **Files**: `src/components/TaskList.tsx`, `src/components/TaskCard.tsx`, `src/lib/api.ts` ### Tasks - [ ] Setup TanStack Query for data fetching - [ ] Create API client functions (fetch tasks, create, update, delete) - [ ] Build `TaskList` component with loading/error states - [ ] Build `TaskCard` component to display individual tasks - [ ] Add "Mark complete" toggle functionality - [ ] Add delete button with confirmation - [ ] Style with Tailwind and shadcn/ui components ### Verification Criteria - [ ] Task list displays fetched tasks - [ ] Loading skeleton shows while fetching - [ ] Error message shows if API fails - [ ] Can toggle task completion (optimistic update) - [ ] Can delete task (shows confirmation dialog) - [ ] UI updates immediately after mutations ### Exit Criteria Task list displays correctly with all CRUD operations working from UI. --- ## Phase 5: Task Creation Form **Type**: UI **Estimated**: 2-3 hours **Files**: `src/components/TaskForm.tsx`, `src/components/CreateTaskDialog.tsx` ### Tasks - [ ] Install React Hook Form and Zod resolver - [ ] Create `TaskForm` component with title and description fields - [ ] Add client-side validation (Zod schema) - [ ] Build `CreateTaskDialog` modal wrapper - [ ] Implement form submission with TanStack Query mutation - [ ] Add loading state during submission - [ ] Show success/error feedback - [ ] Clear form and close dialog on success ### Verification Criteria - [ ] Form validates empty title (shows error) - [ ] Form validates title length (max 100 chars) - [ ] Successful submission creates task in database - [ ] Task appears in list immediately (optimistic update) - [ ] Form resets after successful submission - [ ] Dialog closes after successful submission - [ ] Error message shows if submission fails ### Exit Criteria Can create tasks via form, validation works, UX is smooth. --- ## Notes ### Testing Strategy Testing built into each phase via verification criteria. No separate testing phase needed for this simple project. ### Deployment Strategy Deploy after each phase to test in production environment: ```bash npm run build && npx wrangler deploy ``` ### Context Management Phases sized to complete in single session including implementation, verification, and expected debugging. --- ## DATABASE_SCHEMA.md # Database Schema: Simple Task Manager **Database**: Cloudflare D1 (SQLite) **Migrations**: `migrations/` directory **ORM**: None (raw SQL) --- ## Tables ### `tasks` **Purpose**: Store tasks (public, no user association) | Column | Type | Constraints | Default | Notes | |--------|------|-------------|---------|-------| | `id` | INTEGER | PRIMARY KEY | AUTO | Auto-increment | | `title` | TEXT | NOT NULL | - | Task title (max 100 chars) | | `description` | TEXT | NULL | - | Task description (optional) | | `completed` | INTEGER | NOT NULL | 0 | 0 = incomplete, 1 = complete | | `created_at` | INTEGER | NOT NULL | - | Unix timestamp | | `updated_at` | INTEGER | NOT NULL | - | Unix timestamp | **Indexes**: - `idx_tasks_created_at` on `created_at` (for sorting by date) - `idx_tasks_completed` on `completed` (for filtering complete/incomplete) --- ## Migrations ### Migration 0001: Initial Schema **File**: `migrations/0001_initial_schema.sql` **Purpose**: Create tasks table ```sql CREATE TABLE tasks ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, description TEXT, completed INTEGER NOT NULL DEFAULT 0, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ); CREATE INDEX idx_tasks_created_at ON tasks(created_at); CREATE INDEX idx_tasks_completed ON tasks(completed); ``` **Run**: ```bash npx wrangler d1 execute task-manager-db --local --file=migrations/0001_initial_schema.sql npx wrangler d1 execute task-manager-db --remote --file=migrations/0001_initial_schema.sql ``` --- ## Seed Data **File**: `migrations/seed.sql` ```sql INSERT INTO tasks (title, description, completed, created_at, updated_at) VALUES ('Build database schema', 'Create tasks table with migrations', 1, strftime('%s', 'now'), strftime('%s', 'now')), ('Create API endpoints', 'Implement CRUD operations for tasks', 1, strftime('%s', 'now'), strftime('%s', 'now')), ('Build UI components', 'Task list and creation form', 0, strftime('%s', 'now'), strftime('%s', 'now')); ``` --- ## API_ENDPOINTS.md # API Endpoints: Simple Task Manager **Base URL**: `/api` **Framework**: Hono **Auth**: None (public API) **Validation**: Zod schemas --- ## Tasks ### GET `/api/tasks` **Purpose**: List all tasks **Query Parameters**: - `completed` (optional): Filter by completion status (`true` or `false`) **Response 200**: ```json { "data": [ { "id": 1, "title": "Sample Task", "description": "Task description", "completed": false, "createdAt": 1234567890, "updatedAt": 1234567890 } ] } ``` --- ### POST `/api/tasks` **Purpose**: Create a new task **Request Body**: ```json { "title": "New Task", "description": "Optional description" } ``` **Validation**: ```typescript z.object({ title: z.string().min(1).max(100), description: z.string().optional() }) ``` **Response 201**: Created task object **Response 400**: Validation error --- ### PATCH `/api/tasks/:id` **Purpose**: Update a task **Request Body**: ```json { "title": "Updated title", "description": "Updated description", "completed": true } ``` **Response 200**: Updated task object **Response 404**: Task not found --- ### DELETE `/api/tasks/:id` **Purpose**: Delete a task **Response 204**: No content (success) **Response 404**: Task not found --- **Note**: This is a simplified example for a public task manager. For a production app with user accounts, see the `auth-web-app.md` example.