Your AI-powered career evolution.
Ravexa AI is an AI career copilot for university students, fresh graduates, junior developers, and job seekers. It combines resume analysis, skill gap mapping, personalized learning roadmaps, mock interviews, and career coaching into a single product, so a job seeker always knows exactly what to do next instead of guessing.
This repository currently contains Step 1: the marketing landing page, built on the architecture the full product will use. Steps 2–4 (auth, dashboard, AI modules) plug into the same foundation — see What's Next below.
| Layer | Choice |
|---|---|
| Framework | Next.js 14 (App Router) + React 18 + TypeScript |
| Styling | Tailwind CSS 3.4, hand-built shadcn-style primitives (no CLI scaffolding) |
| Animation | Framer Motion |
| Fonts | Space Grotesk (display), Inter (body), JetBrains Mono (data/labels) — self-hosted via @fontsource, no Google Fonts CDN dependency at runtime or build time |
| Database (planned, Step 3) | PostgreSQL + Prisma ORM |
| Auth (planned, Step 2) | Auth.js / NextAuth with the Prisma adapter |
| AI (planned, Step 4) | Provider-agnostic service layer, structured JSON output validated with Zod |
npm install
npm run devThen open http://localhost:3000.
Other useful scripts:
npm run build # production build
npm run start # run the production build
npm run lint # ESLint
npm run typecheck # tsc --noEmitThis build has been verified end-to-end in CI-equivalent conditions: clean tsc --noEmit, clean next lint, and a successful next build producing a static landing page (~143 kB first-load JS).
prisma/
schema.prisma # Full target schema for the whole product (see below)
src/
app/
layout.tsx # Root layout: fonts, metadata, <html> shell
page.tsx # Composes the landing page from feature sections
globals.css # Tailwind layers + base styles + font CSS variables
(auth)/
layout.tsx # Shared chrome for login/signup/onboarding
login/page.tsx
signup/page.tsx
onboarding/page.tsx # 3-step wizard: level → goal/field → review
(app)/
dashboard/page.tsx # Placeholder — real dashboard arrives in Step 3
components/
ui/ # Reusable primitives: button, badge, card, reveal, section-heading, form-field
layout/ # navbar, footer
features/
landing/components/ # Landing-page-specific sections (hero, problem, solution, etc.)
services/
ai/ # resumeAnalyzer.ts, interviewCoach.ts, roadmapGenerator.ts
# — typed stubs today; real implementations land in Step 4.
# UI code will only ever import from here, never call an LLM directly.
hooks/ # use-active-section.ts (navbar scroll-spy)
types/ # Shared TypeScript types, mirroring the Prisma schema
lib/ # utils.ts (cn() helper); db.ts and auth.ts arrive in Steps 2–3
The app is split into three layers on purpose, so the codebase scales cleanly as Steps 2–4 are added:
- UI layer (
components/,features/) — renders props and calls functions. It never knows how an AI response is generated or how a database query is built. - Service layer (
services/ai/*) — owns all AI logic: building prompts, calling the model, validating the JSON shape that comes back. This is the only place that talks to an LLM provider. - Data layer (
lib/db.ts+ Prisma, arriving in Step 3) — the only place that touches the database.
API routes stay thin: check the session, call a service, persist with Prisma, return JSON. Once auth lands, the App Router will split into route groups — (marketing) for the public site, (auth) for /login /signup /onboarding, and (app) for everything behind the dashboard.
The visual language was chosen deliberately to avoid generic "AI startup" defaults (no cream-and-terracotta, no single neon-on-black gradient, no stock broadsheet layout).
- Color —
obsidian(#0A0B0D, background),graphite(#14161B, surface),paper(#F4F5F7, text), with two signature accents:signal(#6E5BFF, violet — represents the user's current state) andevolve(#2FD9C4, teal — represents the growth state). The violet→teal gradient is reserved for CTAs and the signature graphic, not used as a background wash. - Typography — Space Grotesk for headlines, Inter for body copy, JetBrains Mono for data points, labels, and eyebrow text — three distinct voices instead of one font doing everything.
- Signature motif — an animated "Career Trajectory" line graph (violet → teal stroke, four nodes: Today → Skills mapped → Interview-ready → Offer), used as the hero's centerpiece and echoed as a smaller connector line in the How It Works section. Built with Framer Motion's
pathLengthanimation and respectsprefers-reduced-motionthroughout. - Honesty over polish — the testimonials section is an honest "coming soon" skeleton state rather than fabricated quotes, since the product is pre-launch.
- Full marketing landing page: hero, problem framing, solution/feature showcase, how-it-works, testimonials (honest placeholder state), pricing (Free / Pro / Campus), final CTA, navbar with scroll-spy, footer.
- Authentication UI:
/login,/signup, and a 3-step/onboardingwizard (career level → goal & target field → review), all built undersrc/app/(auth)/with shared chrome inlayout.tsx. Forms have real client-side validation (required fields, email format, password length and match, terms checkbox) and a polished submit/loading state. - A
/dashboardplaceholder undersrc/app/(app)/so the signup → onboarding → dashboard flow has somewhere real to land, rather than a 404, while Step 3 builds the real dashboard. - Complete design system as reusable Tailwind tokens and UI primitives, including a new
FormFieldprimitive (components/ui/form-field.tsx) shared by every auth form. - Self-hosted fonts (no external font CDN call at runtime).
- The target Prisma schema for the entire product, so later steps build against a stable data model from day one.
- Typed service-layer stubs for the three AI features, so the import paths and function signatures the UI will eventually call are already locked in.
Important — the auth pages are UI only. Submitting login or signup does not create or check a real account; it validates the form, then simulates a short delay and navigates to the next page in the flow (signup → onboarding → dashboard, login → dashboard directly). Nothing is persisted yet — that's exactly what Step 3 wires up.
- Step 3 — Real auth + dashboard: wire
lib/auth.ts(Auth.js with the Prisma adapter) andlib/db.ts(Prisma client) for real, so signup/login actually create and checkUserrows, protect(app)routes with middleware, and replace the/dashboardplaceholder with the real career score, recommended actions, and progress-over-time view. - Step 4 — AI modules: implement
resumeAnalyzer.ts,interviewCoach.ts, androadmapGenerator.tsagainst a real LLM provider with Zod-validated structured output, plus the resume upload flow, roadmap UI, and mock interview UI.
The schema (prisma/schema.prisma) is written for the full product up front, even though only a fraction of it is wired to a UI yet. A few choices worth flagging:
CareerScoreSnapshotis a one-to-many table, not a single mutable field onUser— it's what powers the "progress over time" chart on the dashboard.InterviewSessionandInterviewQuestionare separate models so a session can be evaluated question-by-question, not just with one final score.UserSkillis a join table betweenUserandSkillwith aproficiencyscore and asourcefield, so the system can later distinguish a skill detected from a resume vs. one added manually vs. one earned by completing a roadmap milestone.