A Kanban board application with TODO, DOING, and DONE columns. Create cards, drag them between columns, and delete them. Authenticated via Cognito.
- Product — Features, API, and backlog
- Tech — Stack, project structure, data model, key decisions
- Deployment — AWS resources, deploy commands, environment setup
- Frontend: React + Vite + shadcn/ui (v4) + @dnd-kit + amazon-cognito-identity-js
- Backend: AWS Lambda + API Gateway + DynamoDB + Cognito (CDK)
- Local dev: Express server with in-memory store
# Install dependencies
cd backend && npm install
cd ../frontend && npm install
# Terminal 1 — Start backend (port 3001, in-memory store)
cd backend && npm run dev
# Terminal 2 — Start frontend (port 5173)
cd frontend && npm run devNote: Local dev uses in-memory store and skips Cognito auth. Set VITE_USER_POOL_ID and VITE_CLIENT_ID in frontend/.env to test auth locally against a deployed Cognito pool.
cd backend && npm testRequires AWS CLI configured with clouddog-dev profile.
# Build frontend
cd frontend && npm run build
# Deploy everything
cd ../backend && npx cdk deploy --profile clouddog-devOutputs: CloudFront URL, API URL, UserPoolId, UserPoolClientId.
After first deploy, update frontend/.env with the Cognito IDs from the CDK output, rebuild, and sync to S3:
aws s3 sync frontend/dist s3://BUCKET_NAME --delete --profile clouddog-dev
aws cloudfront create-invalidation --distribution-id DIST_ID --paths "/*" --profile clouddog-dev| Method | Path | Auth | Body | Description |
|---|---|---|---|---|
| GET | /cards | JWT | — | List all cards |
| POST | /cards | JWT | {text, column?} |
Create card (defaults to TODO) |
| PATCH | /cards/{id} | JWT | {column} |
Move card |
| DELETE | /cards/{id} | JWT | — | Delete card |