Current status: POC in progress
A production-style serverless web application built with React, AWS CDK, and AWS managed services to track job applications and application status.
This project demonstrates a production-style serverless architecture using AWS CDK and managed services. It is designed to:
- Showcase infrastructure-as-code (IaC) practices
- Demonstrate authentication via JWT (Cognito)
- Model real-world CRUD patterns with DynamoDB
- Separate development and stable release branches
flowchart LR
User[User / Browser]
CF[CloudFront]
S3[S3 Bucket - React Static Site]
Cognito[Cognito User Pool - JWT Tokens]
APIG[API Gateway - JWT Authorizer]
Lambda[Lambda - Node.js Backend]
DDB[DynamoDB]
User --> CF
CF --> S3
User --> Cognito
Cognito --> User
User --> APIG
APIG --> Lambda
Lambda --> DDB
- Frontend: React + TypeScript
- Infrastructure: AWS CDK (TypeScript)
- Hosting: S3 + CloudFront
- Authentication: Cognito User Pools (JWT)
- API: API Gateway (HTTP API)
- Compute: AWS Lambda (Node.js)
- Database: DynamoDB
cd backend
npm install
npm run devRuns on: http://localhost:3001
cd frontend
npm install
npm run devRuns on: http://localhost:5173
- CDK project initialized
- API Gateway + Lambda deployed
- DynamoDB table created
- React app scaffolded
- Frontend connected to backend
- Cognito authentication integrated
- Deployed to CloudFront
appliedDateis only checked as a string; consider validating/parsing it (e.g., ISO date) to avoid inconsistent formats.- Replace
DEMO_USER_IDwith an authenticated user id when integrating auth. - Use a validation library (zod/joi) or request DTOs for clearer and more maintainable input validation.
- If the store becomes async (real DB), make handlers async and await persistence; also consider returning a
Locationheader for the new resource. - Consider an environment variable for the port (e.g.,
process.env.PORT ?? 3001), tighten CORS for production, add request-logging and error-handling middleware, and implement graceful shutdown for the server. - Add reserved concurrency to Applications Lambda to cap cost
- Add caching strategy notes (CloudFront for frontend; API caching not needed yet) You can bridge that by adding one small AI feature:
- “Given a job description, extract keywords + generate tailored bullet points” (calls an LLM)
- Save results per application