Building JobLens: A Job Search Intelligence Platform on AWS and Vercel
I built a job search intelligence platform using Amazon Aurora PostgreSQL, AWS Bedrock and Vercel, here is why I chose Aurora over DynamoDB, how the AI layer works, and what I learned along the way.
I created this content for the purposes of entering the Vercel x AWS Hackathon. #H0Hackathon
Why I Built This
Every year, professionals make career decisions worth tens of thousands of dollars — negotiating salaries, signing offer letters, preparing for interviews — with no real tooling to help them.
I wanted to fix that. JobLens is a job search OS that tracks every application, decodes every offer letter, and surfaces the patterns in your search that you would never notice on your own.
The AWS Services That Power It
Amazon Aurora PostgreSQL on Serverless v2
Aurora is the heart of the application. Everything lives in a 12 table relational schema inside a VPC private subnet — applications, offer clauses, interview questions, confidence scores, follow-ups, all of it.
I chose Aurora over DynamoDB because every meaningful insight in this app is a join. A dashboard showing interview conversion rate needs applications grouped by status and joined to interview rounds. An offer comparison needs offer letters joined to clauses joined to applications. Relational depth is the product, not a nice to have.
Aurora Serverless v2 means I get full PostgreSQL with no instances to manage. It scales to zero when idle and the connection pool stays small — max 3 connections per serverless function instance — so we never hit Aurora's connection limit from Vercel.
AWS Cognito
Authentication is handled entirely by Cognito with OAuth 2.0 and PKCE. Users sign in through the Cognito Hosted UI, get a JWT token, and NextAuth v4 manages the session on the application side. On first login, a callback automatically creates the user's row in Aurora. No manual user management needed.
Every API route in the app verifies the session before touching the database. Data is fully isolated per user.
AWS Bedrock with Amazon Nova Pro
All AI features run on Amazon Nova Pro through the Bedrock SDK. We could have used Claude or other stronger models. Nova was chosen because it is free within the hackathon tier and handles every use case we needed without issues.
IAM credentials scoped specifically to Bedrock are injected as environment variables. The application can invoke Bedrock models and nothing else.
Nova powers seven features across the app. JD fit scoring and skill extraction. Offer clause analysis with risk ratings and redline suggestions. Interview answer rating from 1 to 10 with written feedback. Round confidence scoring. Cold outreach email and LinkedIn DM drafting. Follow-up email generation. War Room negotiation playbook.
The pattern is the same across all of them. Structured prompt in, structured JSON out, saved to Aurora.
IAM
Credentials are scoped to Bedrock only. Least privilege — nothing more than what the application actually needs.
The Application Layer
The frontend and backend both live in a single Next.js 16 App Router project deployed on Vercel. API routes become serverless functions automatically. The only infrastructure configuration needed was bumping the function timeout to 30 seconds to handle Aurora cold starts and AI inference latency.
Drizzle ORM handles all database access. The schema is defined in TypeScript, migrations are run via Drizzle Kit, and the query builder maps cleanly to the relational structure.
Key Decisions
Why not DynamoDB? Every insight is a join. The relational schema is the product — funnel analysis, offer benchmarking, interview pattern detection all require SQL across multiple tables. DynamoDB would have meant rewriting every query as a scan across denormalized documents.
Why Aurora Serverless v2? Full PostgreSQL, zero instance management, scales to zero. The right choice for a project that does not know its traffic yet.
Why Nova over Claude? Nova was free within the hackathon tier. The structured JSON prompting pattern works reliably with Nova for every use case in the app.
Why Vercel? Zero deployment config, instant serverless functions from Next.js API routes, and global CDN for the frontend. The entire infrastructure configuration is one small JSON file.
What I Learned
Aurora cold starts on Serverless v2 can hit 5 to 10 seconds after the database scales to zero. The 30 second Vercel timeout exists specifically for this. In production you would keep it warm with a scheduled ping.
Keep connection pools small on serverless. Each Vercel function instance runs independently and a large pool per instance will exhaust Aurora's connection limit fast.
Structured prompts are more reliable than conversational ones when you need parseable output from an LLM. Every Nova call specifies the exact JSON shape and ends with return only valid JSON. It makes the AI layer consistent and easy to reason about.
Enjoyed reading this content? Let the author know!
Your likes, comments, shares, and saves help creators reach more builders.
Loading recommendations
Loading article