A full-stack reminder application built with Next.js, DynamoDB, and S3, deployed using Docker Compose with LocalStack for local AWS service emulation.
- Todo Management: Create, update, complete, and delete reminders
- Image Attachments: Upload images to todos using S3 storage
- Categories: Organize todos with customizable categories and colors
- Calendar View: Visualize todos by due date in an interactive calendar
- Filters: Filter todos by completion status and category
- Local Development: Fully containerized with LocalStack for AWS services
- Frontend: Next.js 15 with App Router, TypeScript, Tailwind CSS
- Backend: Next.js API Routes
- Database: DynamoDB (via LocalStack)
- Storage: S3 (via LocalStack)
- Infrastructure: Docker Compose
- Additional Libraries:
- AWS SDK v3
- React Big Calendar
- Zod for validation
- date-fns for date formatting
- Docker and Docker Compose
- Node.js 20+ (for local development without Docker)
-
Clone the repository
cd claudeTest -
Start the application
docker-compose up --build
This will:
- Start LocalStack with DynamoDB and S3
- Initialize database tables and S3 bucket
- Start the Next.js application
-
Access the application
- Frontend: http://localhost:3000
- LocalStack: http://localhost:4566
-
Install dependencies
cd frontend npm install -
Set up environment variables
cp .env.example .env
-
Start LocalStack separately
docker-compose up localstack
-
Run the development server
npm run dev
claudeTest/
├── docker-compose.yml # Docker Compose configuration
├── localstack/
│ └── init-aws.sh # LocalStack initialization script
├── frontend/
│ ├── app/
│ │ ├── api/ # API routes
│ │ │ ├── users/
│ │ │ ├── categories/
│ │ │ └── todos/
│ │ ├── calendar/ # Calendar page
│ │ ├── categories/ # Categories page
│ │ └── page.tsx # Main todos page
│ ├── components/ # React components
│ ├── lib/
│ │ ├── aws/ # AWS SDK clients
│ │ ├── db/ # Database operations
│ │ └── types.ts # TypeScript types
│ ├── .env.example # Environment variables template
│ └── Dockerfile # Frontend container
└── README.md
-
reminder-users
- Partition Key:
userId(String) - Attributes: email, name, createdAt, updatedAt
- Partition Key:
-
reminder-todos
- Partition Key:
todoId(String) - GSI: UserIdIndex (userId, createdAt)
- Attributes: title, description, completed, categoryId, dueDate, imageKey, createdAt, updatedAt
- Partition Key:
-
reminder-categories
- Partition Key:
categoryId(String) - GSI: UserIdIndex (userId, name)
- Attributes: name, color, createdAt, updatedAt
- Partition Key:
- reminder-images: Stores todo images with keys:
{userId}/{todoId}/{timestamp}-{filename}
GET /api/users- Get all usersPOST /api/users- Create a new user
GET /api/categories?userId={userId}- Get user's categoriesPOST /api/categories- Create a categoryGET /api/categories/{id}- Get a categoryPATCH /api/categories/{id}- Update a categoryDELETE /api/categories/{id}- Delete a category
GET /api/todos?userId={userId}- Get user's todosPOST /api/todos- Create a todoGET /api/todos/{id}- Get a todoPATCH /api/todos/{id}- Update a todoDELETE /api/todos/{id}- Delete a todoPOST /api/todos/{id}/image- Get presigned upload URLGET /api/todos/{id}/image- Get image URL
See .env.example in the frontend directory for all required environment variables:
- AWS credentials (for LocalStack)
- DynamoDB and S3 endpoints
- Table and bucket names
- Application settings
-
Check LocalStack health
curl http://localhost:4566/_localstack/health
-
List DynamoDB tables
aws --endpoint-url=http://localhost:4566 dynamodb list-tables
-
List S3 buckets
aws --endpoint-url=http://localhost:4566 s3 ls
- Navigate to http://localhost:3000
- Fill in the todo form:
- Enter a title (required)
- Add an optional description
- Select a category (create one first in Categories page)
- Set a due date
- Upload an image
- Click "Add Todo"
- Navigate to http://localhost:3000/categories
- Create categories with custom names and colors
- Edit or delete existing categories
- Navigate to http://localhost:3000/calendar
- View todos by due date
- Click on events to see todo details
- Use calendar navigation to browse different months
The application uses a demo user with ID demo-user-123 for development purposes. In a production environment, you would integrate proper authentication.
- Ensure Docker is running
- Check Docker logs:
docker-compose logs localstack - Verify port 4566 is not in use
- Check that services are healthy:
docker-compose ps - Verify environment variables in
.env - Ensure LocalStack is fully initialized before starting frontend
- Check S3 bucket CORS configuration
- Verify S3_PUBLIC_ENDPOINT in
.env - Check browser console for CORS errors
For production deployment:
- Replace LocalStack with real AWS services (DynamoDB, S3)
- Update environment variables with production AWS credentials
- Implement proper authentication (e.g., NextAuth.js)
- Add user registration and login flows
- Update the hardcoded DEMO_USER_ID with real user sessions
- Enable HTTPS and proper CORS configuration
- Add environment-specific secrets via CI/CD
- User authentication and authorization
- Recurring reminders
- Google Calendar integration
- Push notifications for due dates
- Real-time sync with WebSockets
- Mobile app with React Native
- Search and advanced filtering
- Todo sharing and collaboration
MIT
Contributions are welcome! Please open an issue or submit a pull request.