Skip to content

Commit 067f7cb

Browse files
committed
Add: sponsor button, new brand name, social links, new model param
Fix: Brand name Update: Brand name Update: Brand name Update: Brand name Added back social links Fix: Tag error Update generative model to 'gemini-2.5-flash-lite' Update generative model to gemini-2.5-flash-lite Update toast msg display Revise README for project name and formatting Updated project name and improved formatting in README.md. Refine README content and formatting Updated README to improve clarity and fix formatting issues. Fix image link formatting in README.md Update README.md Fix: Prompt for outputting feedback values Fix: PYQ Creation Time
1 parent 26eaa62 commit 067f7cb

File tree

9 files changed

+67
-69
lines changed

9 files changed

+67
-69
lines changed

.github/FUNDING.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# These are supported funding model platforms
2+
3+
github: Soumilgit
4+
buy_me_a_coffee: SoumilnpM
5+
custom: https://github.com/sponsors/Soumilgit/

README.md

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
1-
# AI-Powered Interview SaaS Platform
1+
# SimulateRecruitAI - AI Interview Mocker
22

3-
An end-to-end interview preparation platform powered by **Next.js**, **Gemini AI**, **Drizzle + NeonDB**, and **Clerk** for authentication. Designed to streamline and simulate real-world interviews with dynamic question generation, feedback mechanisms and recording features.
3+
An end-to-end interview preparation platform powered by **Next.js**, **Gemini AI**, **Drizzle + NeonDB** and **Clerk** for authentication. Designed to streamline & simulate real-world interviews with dynamic question generation, feedback mechanisms & recording features.
44

55
---
66

7-
# SAAS Cloud Architecture
7+
# Architecture
88

99
![image](https://github.com/user-attachments/assets/e3cb2ee2-f0d0-430f-af16-17900b5a21cb)
1010

1111
---
1212

1313
## Features
1414

15-
- **Authentication** with [Clerk.dev](https://clerk.dev)
15+
- **Authentication** with Clerk
1616
- **AI-Driven** Interview Generation & Feedback (via Gemini AI)
1717
- **Custom Questions** and Interview Creation
1818
- **Interview Simulation**: Question + Record Answer + AI Feedback
1919
- **Dashboard** to Manage Interviews, Questions & Progress
20-
- **Stripe Payments** (USD Supported)
20+
- **Stripe Payments** Payment Gateway
2121
- **Fully Dockerized** for Deployment
2222
- Built with **React**, **TailwindCSS** and **Next.js App Router**
2323

@@ -28,9 +28,9 @@ An end-to-end interview preparation platform powered by **Next.js**, **Gemini AI
2828
| Purpose | Tech |
2929
|----------------------|---------------------------|
3030
| Frontend Framework | Next.js+React (App Router)|
31-
| Styling | TailwindCSS |
31+
| Styling | TailWindCSS |
3232
| Component System | Custom + ShadCN UI |
33-
| Authentication | Clerk.dev |
33+
| Authentication | Clerk |
3434
| Database | Neon (Postgres) + Drizzle |
3535
| AI Integration | Gemini AI (Google) |
3636
| Payments | Stripe (USD only) |
@@ -64,15 +64,15 @@ root
6464
## Admin Panel, DB & Backend Logs
6565

6666
**1.Clerk**
67-
![Clerk admin dashboard](https://github.com/user-attachments/assets/46354ade-e40d-46a7-9352-45d4e906b0e3)
6867

69-
**2.NeonDB(all 4 tables)**
70-
<br>Note: As this is a demo so far, all entries currently reflect activity from my own testing accounts.</br>
68+
![Clerk admin dashboard](https://github.com/user-attachments/assets/f1e1ed25-d118-4c6b-9331-9c8a811addbe)
7169

72-
![Mock Interview](https://github.com/user-attachments/assets/990ae306-4128-41d2-a235-af8e4c52276b)
73-
![Newsletter](https://github.com/user-attachments/assets/9cd03593-3d30-4403-b23b-e5373e252c8a)
74-
![Question](https://github.com/user-attachments/assets/f286e3ba-e19f-4139-8e8e-1c055e5de8c9)
75-
![User Answer](https://github.com/user-attachments/assets/5d4ea303-7c44-4c9c-8a44-1476212beb07)
70+
**2.NeonDB (all 4 tables)**
71+
72+
![Mock Interview](https://github.com/user-attachments/assets/2b04bff8-caae-4858-9131-49d9e6a52836)
73+
![Newsletter](https://github.com/user-attachments/assets/6b8b59e1-7f47-4c1c-b9bd-049780010f1e)
74+
![Question](https://github.com/user-attachments/assets/7bfdb30f-141c-47f3-9721-c295e10ad104)
75+
![User Answer](https://github.com/user-attachments/assets/1ee420ae-e489-4903-9de2-195aab059251)
7676

7777
---
7878

@@ -91,7 +91,7 @@ npm install
9191
```
9292

9393
**2. Configure Environment Variables**
94-
Create a .env.local file:
94+
Create a `.env.local` file:
9595
```bash
9696
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=
9797
CLERK_SECRET_KEY=
@@ -118,26 +118,24 @@ docker compose up --build
118118
---
119119

120120
## Production Deployment
121-
Use platforms like **Vercel**, **Render**, **Railway**, or **Docker-based VPS**
121+
Use platforms like **Vercel**, **Render**, **Railway** or **Docker-based VPS** .
122122

123-
Ensure all env variables are securely added to the production environment
123+
Securely add `.env.local` variables & `drizzle.config.js` to production environment
124124

125125
---
126126

127-
## Future Enhancements, currently omitted due to UX considerations
127+
## Future Scope
128128
🎯 Full-screen Interview Mode
129129

130130
🚫 Tab-Switch Detection & Blocking
131131

132132
🎧 Real-Time Proctoring Tools
133133

134-
🌍 Multi-currency Stripe Support
135-
136134
📈 Analytics Dashboard for Admins & Users
137135

138136
🧑‍💻 Coding Interview support
139137

140-
## How to Contribute
138+
## How To Contribute
141139

142140
1. Fork this repo & clone your fork locally.
143141
2. Create a new branch: `git checkout -b your-feature-name`

app/(auth)/sign-in/[[...sign-in]]/page.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export default function Page() {
2929

3030
<div className="mt-6 bg-black p-6 rounded-lg">
3131
<h2 className="text-2xl font-bold text-white sm:text-3xl md:text-4xl">
32-
Welcome to InterviewAI
32+
Welcome to SimulateRecruitAI
3333
</h2>
3434

3535
<p className="mt-4 leading-relaxed text-white">

app/dashboard/_components/AddQuestions.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
DialogDescription,
77
DialogHeader,
88
DialogTitle,
9-
DialogTrigger,
109
} from "@/components/ui/dialog";
1110
import { Button } from "@/components/ui/button";
1211
import { Input } from "@/components/ui/input";
@@ -82,6 +81,7 @@ const AddQuestions = () => {
8281
typeQuestion: formData.typeQuestion,
8382
company: formData.company,
8483
createdBy: user?.primaryEmailAddress?.emailAddress,
84+
createdAt: moment().format("YYYY-MM-DD"),
8585
})
8686
.returning({ mockId: Question.mockId });
8787

app/dashboard/interview/[interviewId]/start/_components/RecordAnswerSection.jsx

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ const RecordAnswerSection = ({
7070
const transcribeAudio = async (audioBlob) => {
7171
try {
7272
setLoading(true);
73-
const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" });
73+
const model = genAI.getGenerativeModel({ model: "gemini-2.5-flash-lite" });
7474

7575
// Convert audio blob to base64
7676
const reader = new FileReader();
@@ -98,13 +98,17 @@ const RecordAnswerSection = ({
9898
try {
9999
setLoading(true);
100100
const feedbackPrompt =
101-
"Question:" +
102-
mockInterviewQuestion[activeQuestionIndex]?.Question +
103-
", User Answer:" +
104-
userAnswer +
105-
" , Depends on question and user answer for given interview question" +
106-
" please give us rating for answer and feedback as area of improvement if any " +
107-
"in just 3 to 5 lines to improve it in JSON format with rating field and feedback field";
101+
"You are an expert interview evaluator. " +
102+
"Evaluate the user's answer strictly on a numeric scale from 1 to 10 (integers only). " +
103+
"Each question carries 2 points toward the overall interview score, so rate accordingly. " +
104+
"Return output in pure JSON only, with exactly two fields: " +
105+
'{"rating": <integer between 1 and 10>, "feedback": "<short constructive feedback in 3-5 lines>"} ' +
106+
"Do not use words like Good, Fair, or Poor for rating. " +
107+
"Keep feedback short, specific, and actionable. " +
108+
"Question: " + mockInterviewQuestion[activeQuestionIndex]?.Question +
109+
" , User Answer: " + userAnswer +
110+
" , Correct Answer: " + mockInterviewQuestion[activeQuestionIndex]?.Answer;
111+
108112

109113
const result = await chatSession.sendMessage(feedbackPrompt);
110114

@@ -132,7 +136,7 @@ const RecordAnswerSection = ({
132136
});
133137

134138
if (resp) {
135-
toast("User Answer recorded successfully");
139+
toast("Answer & feedback saved ✅");
136140
}
137141
setUserAnswer("");
138142
setLoading(false);

app/dashboard/page.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const Dashboard = () => {
99
<div className="flex justify-between items-center mb-8">
1010
<div>
1111
<h2 className="font-bold text-3xl bg-gradient-to-r from-primary to-blue-600 bg-clip-text text-transparent">
12-
InterviewAI
12+
SimulateRecruitAI
1313
</h2>
1414
<h2 className="text-muted-foreground">
1515
Create and start your AI Mock Interview
@@ -27,4 +27,4 @@ const Dashboard = () => {
2727
);
2828
};
2929

30-
export default Dashboard;
30+
export default Dashboard;

app/layout.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import Script from "next/script"
88
const inter = Inter({ subsets: ["latin"] })
99

1010
export const metadata = {
11-
title: "InterviewAI - Ace Your Next Interview",
11+
title: "SimulateRecruitAI - Ace Your Next Interview",
1212
description: "Practice with AI-powered mock interviews and get personalized feedback",
1313
}
1414

app/page.js

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import { useEffect } from "react"
33
import Head from "next/head"
44
import Contect from "./_components/Contect"
5-
import { FaGithub, FaLinkedin, FaTwitter, FaInstagram } from 'react-icons/fa';
5+
import { FaGithub, FaLinkedin, FaTwitter, FaInstagram } from "react-icons/fa"
66
import { ModeToggle } from "@/components/ModeToggle"
77
import { ArrowDown, ArrowRight, CheckCircle, Code, Cpu, MessageSquare, Sparkles, Star, Users } from "lucide-react"
88

@@ -39,7 +39,7 @@ const page = () => {
3939
return (
4040
<div className="min-h-screen bg-background relative animated-bg">
4141
<Head>
42-
<title>InterviewAI</title>
42+
<title>SimulateRecruitAI</title>
4343
<meta name="description" content="Ace your next interview with AI-powered mock interviews" />
4444
<link rel="icon" href="/favicon.ico" />
4545
</Head>
@@ -52,41 +52,32 @@ const page = () => {
5252
<div className="relative">
5353
<div className="absolute -inset-1 bg-gradient-to-r from-primary to-secondary rounded-lg blur opacity-30 group-hover:opacity-100 transition duration-1000 group-hover:duration-200"></div>
5454
<h1 className="relative text-3xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-primary to-secondary">
55-
InterviewAI
55+
SimulateRecruitAI
5656
</h1>
5757
</div>
5858
</div>
5959
<nav className="flex flex-col sm:flex-row flex-wrap items-center justify-between mt-4 md:mt-0 space-y-4 sm:space-y-0 sm:space-x-6">
6060
<div className="flex items-center space-x-4">
61-
<div className="relative group">
62-
<a
63-
target="_blank"
64-
rel="noopener noreferrer"
65-
href="https://github.com/sponsors/Soumilgit"
66-
className="absolute inset-0 z-10"
67-
aria-label="Sponsor Soumil on GitHub"
68-
></a>
69-
<iframe
70-
src="https://github.com/sponsors/Soumilgit/button"
71-
title="Sponsor Soumil on GitHub"
72-
height="32"
73-
width="114"
74-
className="border-0 rounded-lg relative"
75-
></iframe>
76-
</div>
61+
<iframe
62+
src="https://github.com/sponsors/Soumilgit/button"
63+
title="Sponsor Soumil on GitHub"
64+
height="32"
65+
width="114"
66+
className="border-0 rounded-lg"
67+
></iframe>
7768

78-
<a
79-
target="_blank"
80-
rel="noopener noreferrer"
81-
href="https://github.com/Soumilgit"
82-
className="inline-block relative group"
83-
>
84-
<div className="absolute -inset-1 bg-gradient-to-r from-primary to-secondary rounded-full blur opacity-0 group-hover:opacity-30 transition duration-300"></div>
85-
<FaGithub className="relative text-foreground hover:text-primary transition-colors w-7 h-7" />
86-
</a>
69+
<a
70+
target="_blank"
71+
rel="noopener noreferrer"
72+
href="https://github.com/Soumilgit"
73+
className="inline-block relative group"
74+
>
75+
<div className="absolute -inset-1 bg-gradient-to-r from-primary to-secondary rounded-full blur opacity-0 group-hover:opacity-30 transition duration-300"></div>
76+
<FaGithub className="relative text-foreground hover:text-primary transition-colors w-7 h-7" />
77+
</a>
8778

88-
<ModeToggle />
89-
</div>
79+
<ModeToggle />
80+
</div>
9081

9182
<div className="flex flex-col sm:flex-row items-center space-y-2 sm:space-y-0">
9283
<a
@@ -351,7 +342,7 @@ const page = () => {
351342
<div className="container mx-auto px-6">
352343
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 mb-8">
353344
<div className="text-left">
354-
<h3 className="text-xl font-bold mb-4">InterviewAI</h3>
345+
<h3 className="text-xl font-bold mb-4">SimulateRecruitAI</h3>
355346
<p className="text-white/80">
356347
Ace your next interview with AI-powered mock interviews and personalized feedback.
357348
</p>
@@ -387,7 +378,7 @@ const page = () => {
387378
>
388379
<FaGithub className="w-6 h-6" />
389380
</a>
390-
<a
381+
<a
391382
href="https://www.linkedin.com/in/soumilm30/"
392383
target="_blank"
393384
rel="noopener noreferrer"
@@ -415,7 +406,7 @@ const page = () => {
415406
</div>
416407
</div>
417408
<div className="pt-8 border-t border-white/20">
418-
<p className="text-white/80">© {new Date().getFullYear()} InterviewAI. All rights reserved.</p>
409+
<p className="text-white/80">© {new Date().getFullYear()} SimulateRecruitAI. All rights reserved.</p>
419410
</div>
420411
</div>
421412
</footer>

utils/GeminiAIModal.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const apiKey = process.env.NEXT_PUBLIC_GEMINI_API_KEY;
99
const genAI = new GoogleGenerativeAI(apiKey);
1010

1111
const model = genAI.getGenerativeModel({
12-
model: "gemini-1.5-flash",
12+
model: "gemini-2.5-flash-lite",
1313
});
1414

1515
const generationConfig = {

0 commit comments

Comments
 (0)