akshit7093 commited on
Commit
e4d9b49
·
1 Parent(s): f4552a1
Joyal_CV.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f426356195d6258f38880d8f151dd3c1b3ee3c12561d5bccfcd47f209d55da45
3
+ size 133267
Nikita_Bansal.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6aa258b56889c3cc673f8fc99a3a50b7b1c94bc66b88f94d1af2d8fd5cea8e84
3
+ size 139526
Vineet_Goyal_Resume (4).pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d4a00d860cc55d529c20e0f5423e285fd7e509b2b124a54296b52b1f7eee44bb
3
+ size 110750
__pycache__/dashboard_analyzer.cpython-311.pyc CHANGED
Binary files a/__pycache__/dashboard_analyzer.cpython-311.pyc and b/__pycache__/dashboard_analyzer.cpython-311.pyc differ
 
agg.py CHANGED
@@ -31,10 +31,26 @@ STUDENTS_TO_FETCH = [
31
  "github_user": "akshit7093",
32
  "codeforces_user": "akshit7093",
33
  "resume_path": "resume.pdf" # REQUIRED FIELD
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  }
 
35
  # Add more student dictionaries here
36
  ]
37
 
 
38
  OUTPUT_FILE = 'final_cleaned_student_data.json'
39
 
40
  # --- Advanced Cleaning and Filtering Functions ---
@@ -263,16 +279,41 @@ def main():
263
  ipu_scraper = StudentScraper(encryption_key="Qm9sRG9OYVphcmEK")
264
  all_student_data = {}
265
 
266
- logger.info(f"Starting data aggregation for {len(STUDENTS_TO_FETCH)} student(s)...")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
267
 
268
- for student in STUDENTS_TO_FETCH:
269
  enrollment_no = student.get("enrollment_no")
270
  if not enrollment_no:
271
  logger.warning("Skipping entry due to missing enrollment number.")
272
  continue
273
 
274
  logger.info(f"\nProcessing data for Enrollment No: {enrollment_no}")
275
-
276
  student_record = {
277
  "name": None,
278
  "enrollment_no": enrollment_no,
@@ -282,7 +323,7 @@ def main():
282
  "github": None,
283
  "codeforces": None,
284
  },
285
- "resume": None, # NEW FIELD
286
  "errors": {}
287
  }
288
 
@@ -312,7 +353,7 @@ def main():
312
  except Exception as e:
313
  student_record["errors"]["leetcode"] = str(e)
314
  logger.error(f" > LeetCode processing FAILED: {e}")
315
-
316
  if student.get("github_user"):
317
  try:
318
  logger.info(f" - Processing GitHub data for '{student['github_user']}'...")
@@ -338,31 +379,30 @@ def main():
338
  except Exception as e:
339
  student_record["errors"]["codeforces"] = str(e)
340
  logger.error(f" > Codeforces processing FAILED: {e}")
341
-
342
  # Process resume data
343
  if student.get("resume_path"):
344
  try:
345
  logger.info(f" - Processing resume from '{student['resume_path']}'...")
346
-
347
- # Check if file exists
348
  if not os.path.exists(student["resume_path"]):
349
  raise FileNotFoundError(f"Resume file not found at {student['resume_path']}")
350
-
351
  raw_resume_data = parse_resume(student["resume_path"])
352
  student_record["resume"] = clean_resume_data(raw_resume_data)
353
  logger.info(" > Resume data processed successfully.")
354
  except Exception as e:
355
  student_record["errors"]["resume"] = str(e)
356
  logger.error(f" > Resume processing FAILED: {e}")
357
-
358
  all_student_data[enrollment_no] = student_record
359
- time.sleep(1) # Respectful delay between requests
360
 
361
- # Save the final cleaned & aggregated data
362
  try:
363
  with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
364
  json.dump(all_student_data, f, indent=4, ensure_ascii=False)
365
- logger.info(f"\n✅ Final cleaning complete. Data saved to '{OUTPUT_FILE}'.")
366
  except Exception as e:
367
  logger.error(f"\n❌ Error saving final JSON file: {e}")
368
 
 
31
  "github_user": "akshit7093",
32
  "codeforces_user": "akshit7093",
33
  "resume_path": "resume.pdf" # REQUIRED FIELD
34
+ },
35
+ {
36
+ "enrollment_no": "35314811922",
37
+ "leetcode_user": "Nikita_06211",
38
+ "github_user": "Nikita06211",
39
+ "codeforces_user": "Nikita06211",
40
+ "resume_path": "Nikita_Bansal.pdf"
41
+ },
42
+ {
43
+ "enrollment_no": "05414811922",
44
+ "leetcode_user": "Vineet_Goyal10",
45
+ "github_user": "Vineetg2003",
46
+ "codeforces_user": "Nikita06211",
47
+ "resume_path": "Vineet_Goyal_Resume (4).pdf"
48
  }
49
+
50
  # Add more student dictionaries here
51
  ]
52
 
53
+
54
  OUTPUT_FILE = 'final_cleaned_student_data.json'
55
 
56
  # --- Advanced Cleaning and Filtering Functions ---
 
279
  ipu_scraper = StudentScraper(encryption_key="Qm9sRG9OYVphcmEK")
280
  all_student_data = {}
281
 
282
+ # Load existing data if output file exists
283
+ if os.path.exists(OUTPUT_FILE):
284
+ try:
285
+ with open(OUTPUT_FILE, 'r', encoding='utf-8') as f:
286
+ all_student_data = json.load(f)
287
+ logger.info(f"Loaded existing data for {len(all_student_data)} student(s) from '{OUTPUT_FILE}'.")
288
+ except Exception as e:
289
+ logger.warning(f"Could not load existing data: {e}. Starting fresh.")
290
+ all_student_data = {}
291
+ else:
292
+ logger.info(f"No existing output file found. Starting fresh.")
293
+
294
+ # Get set of already processed enrollment numbers
295
+ existing_enrollments = set(all_student_data.keys())
296
+
297
+ # Filter STUDENTS_TO_FETCH to only include unprocessed enrollments
298
+ students_to_process = [
299
+ student for student in STUDENTS_TO_FETCH
300
+ if student.get("enrollment_no") not in existing_enrollments
301
+ ]
302
+
303
+ if not students_to_process:
304
+ logger.info("✅ No new students to process. All enrollments already exist.")
305
+ return
306
+
307
+ logger.info(f"Starting data aggregation for {len(students_to_process)} new student(s)...")
308
 
309
+ for student in students_to_process:
310
  enrollment_no = student.get("enrollment_no")
311
  if not enrollment_no:
312
  logger.warning("Skipping entry due to missing enrollment number.")
313
  continue
314
 
315
  logger.info(f"\nProcessing data for Enrollment No: {enrollment_no}")
316
+
317
  student_record = {
318
  "name": None,
319
  "enrollment_no": enrollment_no,
 
323
  "github": None,
324
  "codeforces": None,
325
  },
326
+ "resume": None,
327
  "errors": {}
328
  }
329
 
 
353
  except Exception as e:
354
  student_record["errors"]["leetcode"] = str(e)
355
  logger.error(f" > LeetCode processing FAILED: {e}")
356
+
357
  if student.get("github_user"):
358
  try:
359
  logger.info(f" - Processing GitHub data for '{student['github_user']}'...")
 
379
  except Exception as e:
380
  student_record["errors"]["codeforces"] = str(e)
381
  logger.error(f" > Codeforces processing FAILED: {e}")
382
+
383
  # Process resume data
384
  if student.get("resume_path"):
385
  try:
386
  logger.info(f" - Processing resume from '{student['resume_path']}'...")
387
+
 
388
  if not os.path.exists(student["resume_path"]):
389
  raise FileNotFoundError(f"Resume file not found at {student['resume_path']}")
390
+
391
  raw_resume_data = parse_resume(student["resume_path"])
392
  student_record["resume"] = clean_resume_data(raw_resume_data)
393
  logger.info(" > Resume data processed successfully.")
394
  except Exception as e:
395
  student_record["errors"]["resume"] = str(e)
396
  logger.error(f" > Resume processing FAILED: {e}")
397
+
398
  all_student_data[enrollment_no] = student_record
399
+ time.sleep(1) # Respectful delay
400
 
401
+ # Save merged data (existing + new)
402
  try:
403
  with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
404
  json.dump(all_student_data, f, indent=4, ensure_ascii=False)
405
+ logger.info(f"\n✅ Final data saved to '{OUTPUT_FILE}' ({len(all_student_data)} total students).")
406
  except Exception as e:
407
  logger.error(f"\n❌ Error saving final JSON file: {e}")
408
 
anshul santoshi final resume.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:64e4cfb67315d599e1162b19d90a757ab681ed2aca31e9f7b2be14a230bdaa8c
3
+ size 454596
app_copy.py CHANGED
@@ -43,11 +43,39 @@ def test_frontend():
43
  return render_template('final.html') # Make sure index.html exists in templates/
44
 
45
  # --- Example route for students (adjust as needed) ---
 
 
 
46
  @app.route('/api/students', methods=['GET'])
47
  def get_students_list():
48
- # Dummy implementation or integrate with your student data
49
- # This is just an example, replace with actual logic
50
- return jsonify([{"enrollment_no": "35214811922", "name": "Akshit Sharma"}])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
 
52
  # --- Job Analysis Route (Corrected) ---
53
  @app.route('/api/job-analysis', methods=['POST'])
@@ -193,7 +221,7 @@ def get_student_report(enrollment_no: str):
193
  return jsonify(report_data), 404 # Or appropriate error code
194
  return jsonify(report_data)
195
  except Exception as e:
196
- logger.error(f"Error generating report for {enrollment_no}: {e}", exc_info=True)
197
  return jsonify({'error': 'Failed to generate report.'}), 500
198
 
199
 
 
43
  return render_template('final.html') # Make sure index.html exists in templates/
44
 
45
  # --- Example route for students (adjust as needed) ---
46
+ import json
47
+ import os
48
+
49
  @app.route('/api/students', methods=['GET'])
50
  def get_students_list():
51
+ enrollment_no = request.args.get('enrollment_no') # Optional query param
52
+
53
+ # Path to your JSON file
54
+ json_path = 'final_cleaned_student_data.json'
55
+
56
+ if not os.path.exists(json_path):
57
+ logger.error("Student data file not found.")
58
+ return jsonify({'error': 'Student data file not found.'}), 404
59
+
60
+ try:
61
+ with open(json_path, 'r', encoding='utf-8') as f:
62
+ all_students = json.load(f)
63
+
64
+ if enrollment_no:
65
+ # Return specific student if enrollment_no is provided
66
+ student = all_students.get(enrollment_no)
67
+ if not student:
68
+ logger.warning(f"Student with enrollment {enrollment_no} not found.")
69
+ return jsonify({'error': 'Student not found.'}), 404
70
+ return jsonify(student)
71
+ else:
72
+ # Return all students (values only, not keys)
73
+ print(all_students.values())
74
+ return jsonify(list(all_students.values()))
75
+
76
+ except Exception as e:
77
+ logger.error(f"Error reading student data: {e}", exc_info=True)
78
+ return jsonify({'error': 'Failed to load student data.'}), 500
79
 
80
  # --- Job Analysis Route (Corrected) ---
81
  @app.route('/api/job-analysis', methods=['POST'])
 
221
  return jsonify(report_data), 404 # Or appropriate error code
222
  return jsonify(report_data)
223
  except Exception as e:
224
+ logger.error(f"Error generating report for {enrollment_no}: {e}",exc_info=True)
225
  return jsonify({'error': 'Failed to generate report.'}), 500
226
 
227
 
dashboard_analyzer.py CHANGED
@@ -172,13 +172,29 @@ def _analyze_github(github_data: dict) -> dict:
172
  elif activity_level in ["Very Active", "Active"] or stats.get('public_repos', 0) > 10: rating = "Good Profile"
173
  return {"rating": rating, "activity_level": activity_level, "top_languages": top_languages, "stats": stats}
174
 
175
- def _extract_skills(student_data: dict) -> list:
176
- """Extracts, combines, and cleans a list of key skills."""
 
 
 
 
177
  resume_skills = student_data.get("resume", {}).get("key_skills", [])
178
- leetcode_skills = [item.get("skill") for item in student_data.get("coding_profiles", {}).get("leetcode", {}).get("topSkillsSummary", [])]
 
 
 
 
179
  normalized_resume = [s.strip().title() for s in resume_skills]
180
  normalized_leetcode = [s.strip().title() for s in leetcode_skills]
181
- return list(dict.fromkeys(normalized_resume + normalized_leetcode))
 
 
 
 
 
 
 
 
182
 
183
  def _calculate_profile_completeness(student_data: dict) -> dict:
184
  """Scores the profile based on the presence of key data points."""
 
172
  elif activity_level in ["Very Active", "Active"] or stats.get('public_repos', 0) > 10: rating = "Good Profile"
173
  return {"rating": rating, "activity_level": activity_level, "top_languages": top_languages, "stats": stats}
174
 
175
+ def _extract_skills(student_data: dict) -> dict: # MODIFIED to return a dict
176
+ """
177
+ Extracts, combines, cleans, and COUNTS key skills for chart display.
178
+ """
179
+ from collections import Counter
180
+
181
  resume_skills = student_data.get("resume", {}).get("key_skills", [])
182
+ leetcode_skills = [
183
+ item.get("skill") for item in student_data.get("coding_profiles", {}).get("leetcode", {}).get("topSkillsSummary", [])
184
+ ]
185
+
186
+ # Normalize skills to title case for consistency
187
  normalized_resume = [s.strip().title() for s in resume_skills]
188
  normalized_leetcode = [s.strip().title() for s in leetcode_skills]
189
+
190
+ # Combine and count occurrences (though here they are unique, this is a robust way to handle it)
191
+ all_skills = normalized_resume + normalized_leetcode
192
+
193
+ # Using Counter will give a dict like {'Python': 2, 'Java': 1}, perfect for charts
194
+ # In this case, since we combine unique lists, counts will be 1 or 2, but it provides the right structure.
195
+ skill_counts = dict(Counter(all_skills))
196
+
197
+ return skill_counts
198
 
199
  def _calculate_profile_completeness(student_data: dict) -> dict:
200
  """Scores the profile based on the presence of key data points."""
final_cleaned_student_data copy.json ADDED
@@ -0,0 +1,882 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "35214811922": {
3
+ "name": "AKSHIT SHARMA",
4
+ "enrollment_no": "35214811922",
5
+ "academic_profile": {
6
+ "institute": "MAHARAJA AGRASEN INSTITUTE OF TECHNOLOGY",
7
+ "degree": "Bachelor of Technology",
8
+ "branch": "Artificial Intelligence and Data Science",
9
+ "overall_cgpa": 8.45,
10
+ "overall_percentage": 82.06,
11
+ "semester_performance": [
12
+ {
13
+ "semester": 1,
14
+ "sgpa": 7.72,
15
+ "percentage": 73.7,
16
+ "subjects": [
17
+ {
18
+ "subject": "ENVIRONMENTAL STUDIES LAB",
19
+ "grade": "O",
20
+ "marks": 92
21
+ },
22
+ {
23
+ "subject": "ENGINEERING GRAPHICS-I",
24
+ "grade": "O",
25
+ "marks": 95
26
+ },
27
+ {
28
+ "subject": "PROGRAMMING IN 'C' LAB",
29
+ "grade": "O",
30
+ "marks": 97
31
+ },
32
+ {
33
+ "subject": "PHYSICS - I LAB",
34
+ "grade": "A+",
35
+ "marks": 80
36
+ },
37
+ {
38
+ "subject": "MANUFACTURING PROCESS",
39
+ "grade": "A",
40
+ "marks": 70
41
+ },
42
+ {
43
+ "subject": "COMMUNICATIONS SKILLS",
44
+ "grade": "B+",
45
+ "marks": 59
46
+ },
47
+ {
48
+ "subject": "APPLIED MATHEMATICS - I",
49
+ "grade": "B+",
50
+ "marks": 57
51
+ },
52
+ {
53
+ "subject": "ENVIRONMENTAL STUDIES",
54
+ "grade": "A",
55
+ "marks": 73
56
+ },
57
+ {
58
+ "subject": "APPLIED PHYSICS - I",
59
+ "grade": "C",
60
+ "marks": 45
61
+ },
62
+ {
63
+ "subject": "PROGRAMMING IN 'C'",
64
+ "grade": "A",
65
+ "marks": 69
66
+ }
67
+ ]
68
+ },
69
+ {
70
+ "semester": 2,
71
+ "sgpa": 6.8,
72
+ "percentage": 71.08,
73
+ "subjects": [
74
+ {
75
+ "subject": "WORKSHOP PRACTICE",
76
+ "grade": "A+",
77
+ "marks": 85
78
+ },
79
+ {
80
+ "subject": "ELECTRICAL SCIENCE LAB",
81
+ "grade": "A+",
82
+ "marks": 78
83
+ },
84
+ {
85
+ "subject": "ENGINEERING GRAPHICS - II",
86
+ "grade": "A+",
87
+ "marks": 87
88
+ },
89
+ {
90
+ "subject": "APPLIED CHEMISTRY",
91
+ "grade": "A+",
92
+ "marks": 88
93
+ },
94
+ {
95
+ "subject": "PHYSICS-II LAB",
96
+ "grade": "O",
97
+ "marks": 94
98
+ },
99
+ {
100
+ "subject": "HUMAN VALUES AND ETHICS",
101
+ "grade": "A+",
102
+ "marks": 88
103
+ },
104
+ {
105
+ "subject": "INDIAN CONSTITUTION",
106
+ "grade": "A+",
107
+ "marks": 80
108
+ },
109
+ {
110
+ "subject": "ENGINEERING MECHANICS",
111
+ "grade": "B",
112
+ "marks": 52
113
+ },
114
+ {
115
+ "subject": "APPLIED MATHEMATICS -II",
116
+ "grade": "P",
117
+ "marks": 43
118
+ },
119
+ {
120
+ "subject": "ELECTRICAL SCIENCE",
121
+ "grade": "B",
122
+ "marks": 54
123
+ },
124
+ {
125
+ "subject": "APPLIED PHYSICS - II",
126
+ "grade": "B",
127
+ "marks": 51
128
+ },
129
+ {
130
+ "subject": "APPLIED CHEMISTRY",
131
+ "grade": "B",
132
+ "marks": 53
133
+ }
134
+ ]
135
+ },
136
+ {
137
+ "semester": 3,
138
+ "sgpa": 8.96,
139
+ "percentage": 83.85,
140
+ "subjects": [
141
+ {
142
+ "subject": "WEB PROGRAMMING LAB",
143
+ "grade": "A+",
144
+ "marks": 87
145
+ },
146
+ {
147
+ "subject": "PRINCIPLES OF ARTIFICIAL INTELLIGENCE LAB",
148
+ "grade": "O",
149
+ "marks": 90
150
+ },
151
+ {
152
+ "subject": "DIGITAL LOGIC DESIGN LAB",
153
+ "grade": "O",
154
+ "marks": 90
155
+ },
156
+ {
157
+ "subject": "FOUNDATIONS OF DATA SCIENCE LAB",
158
+ "grade": "O",
159
+ "marks": 96
160
+ },
161
+ {
162
+ "subject": "DATA STRUCTURES LAB",
163
+ "grade": "O",
164
+ "marks": 92
165
+ },
166
+ {
167
+ "subject": "SELECTED READING",
168
+ "grade": "O",
169
+ "marks": 94
170
+ },
171
+ {
172
+ "subject": "CRITICAL REASONING AND SYSTEMS THINKING",
173
+ "grade": "A+",
174
+ "marks": 81
175
+ },
176
+ {
177
+ "subject": "UNIVERSAL HUMAN VALUES - II",
178
+ "grade": "A+",
179
+ "marks": 77
180
+ },
181
+ {
182
+ "subject": "PROBABILITY, STATISTICS AND LINEAR ALGEBRA",
183
+ "grade": "A+",
184
+ "marks": 75
185
+ },
186
+ {
187
+ "subject": "PRINCIPLES OF ARTIFICIAL INTELLIGENCE",
188
+ "grade": "A",
189
+ "marks": 66
190
+ },
191
+ {
192
+ "subject": "DIGITAL LOGIC DESIGN",
193
+ "grade": "A+",
194
+ "marks": 86
195
+ },
196
+ {
197
+ "subject": "FOUNDATIONS OF DATA SCIENCE",
198
+ "grade": "A+",
199
+ "marks": 87
200
+ },
201
+ {
202
+ "subject": "DATA STRUCTURES",
203
+ "grade": "A",
204
+ "marks": 69
205
+ }
206
+ ]
207
+ },
208
+ {
209
+ "semester": 4,
210
+ "sgpa": 8.68,
211
+ "percentage": 85.69,
212
+ "subjects": [
213
+ {
214
+ "subject": "OBJECT ORIENTED PROGRAMMING",
215
+ "grade": "A",
216
+ "marks": 72
217
+ },
218
+ {
219
+ "subject": "DATABASE MANAGEMENT SYSTEMS",
220
+ "grade": "A+",
221
+ "marks": 87
222
+ },
223
+ {
224
+ "subject": "SOFTWARE ENGINEERING",
225
+ "grade": "A",
226
+ "marks": 74
227
+ },
228
+ {
229
+ "subject": "COMPUTER NETWORKS AND INTERNET PROTOCOL",
230
+ "grade": "A+",
231
+ "marks": 75
232
+ },
233
+ {
234
+ "subject": "FUNDAMENTALS OF MACHINE LEARNING",
235
+ "grade": "A+",
236
+ "marks": 78
237
+ },
238
+ {
239
+ "subject": "COMPUTATIONAL METHODS",
240
+ "grade": "B",
241
+ "marks": 51
242
+ },
243
+ {
244
+ "subject": "EFFECTIVE TECHNICAL WRITING",
245
+ "grade": "O",
246
+ "marks": 99
247
+ },
248
+ {
249
+ "subject": "EMERGING TRENDS IN TECHNOLOGICAL INDUSTRIES",
250
+ "grade": "O",
251
+ "marks": 98
252
+ },
253
+ {
254
+ "subject": "OBJECT ORIENTED PROGRAMMING LAB",
255
+ "grade": "O",
256
+ "marks": 95
257
+ },
258
+ {
259
+ "subject": "DATABASE MANAGEMENT SYSTEMS LAB",
260
+ "grade": "O",
261
+ "marks": 94
262
+ },
263
+ {
264
+ "subject": "COMPUTER NETWORKS AND INTERNET PROTOCOL LAB",
265
+ "grade": "O",
266
+ "marks": 98
267
+ },
268
+ {
269
+ "subject": "FUNDAMENTALS OF MACHINE LERNING LAB",
270
+ "grade": "O",
271
+ "marks": 95
272
+ },
273
+ {
274
+ "subject": "PRACTICUM (INTEGERATED PROJECT)",
275
+ "grade": "O",
276
+ "marks": 98
277
+ }
278
+ ]
279
+ },
280
+ {
281
+ "semester": 5,
282
+ "sgpa": 9.08,
283
+ "percentage": 88.17,
284
+ "subjects": [
285
+ {
286
+ "subject": "OPERATING SYSTEMS",
287
+ "grade": "A+",
288
+ "marks": 75
289
+ },
290
+ {
291
+ "subject": "DESIGN AND ANALYSIS OF ALGORITHMS",
292
+ "grade": "A",
293
+ "marks": 66
294
+ },
295
+ {
296
+ "subject": "DATA MINING",
297
+ "grade": "A+",
298
+ "marks": 82
299
+ },
300
+ {
301
+ "subject": "COMPUTER ORGANIZATION AND ARCHITECTURE",
302
+ "grade": "A+",
303
+ "marks": 88
304
+ },
305
+ {
306
+ "subject": "INTRODUCTION TO INTERNET OF THINGS",
307
+ "grade": "A+",
308
+ "marks": 81
309
+ },
310
+ {
311
+ "subject": "PRINCIPLES OF ENTREPRENEURSHIP MINDSET",
312
+ "grade": "A+",
313
+ "marks": 80
314
+ },
315
+ {
316
+ "subject": "OPERATING SYSTEMS LAB",
317
+ "grade": "O",
318
+ "marks": 99
319
+ },
320
+ {
321
+ "subject": "DESIGN AND ANALYSIS OF ALGORITHMS LAB",
322
+ "grade": "O",
323
+ "marks": 96
324
+ },
325
+ {
326
+ "subject": "DATA MINING LAB",
327
+ "grade": "O",
328
+ "marks": 93
329
+ },
330
+ {
331
+ "subject": "INTRODUCTION TO INTERNET OF THINGS LAB",
332
+ "grade": "O",
333
+ "marks": 98
334
+ },
335
+ {
336
+ "subject": "SUMMER TRAINING REPORT-1",
337
+ "grade": "O",
338
+ "marks": 100
339
+ },
340
+ {
341
+ "subject": "SEMINAR ON CASE STUDY OF EMERGING AREAS OF TECHNOLOGY",
342
+ "grade": "O",
343
+ "marks": 100
344
+ }
345
+ ]
346
+ },
347
+ {
348
+ "semester": 6,
349
+ "sgpa": 9.38,
350
+ "percentage": 88.55,
351
+ "subjects": [
352
+ {
353
+ "subject": "DIGITAL IMAGE PROCESSING",
354
+ "grade": "A",
355
+ "marks": 73
356
+ },
357
+ {
358
+ "subject": "BLOCKCHAIN TECHNOLOGY LAB",
359
+ "grade": "O",
360
+ "marks": 98
361
+ },
362
+ {
363
+ "subject": "BLOCKCHAIN TECHNOLOGY",
364
+ "grade": "A+",
365
+ "marks": 76
366
+ },
367
+ {
368
+ "subject": "FUNDAMENTALS OF DEEP LEARNING LAB",
369
+ "grade": "O",
370
+ "marks": 96
371
+ },
372
+ {
373
+ "subject": "FUNDAMENTALS OF DEEP LEARNING",
374
+ "grade": "A+",
375
+ "marks": 84
376
+ },
377
+ {
378
+ "subject": "BIG DATA ANALYTICS LAB",
379
+ "grade": "O",
380
+ "marks": 95
381
+ },
382
+ {
383
+ "subject": "BIG DATA ANALYTICS",
384
+ "grade": "O",
385
+ "marks": 93
386
+ },
387
+ {
388
+ "subject": "CRYPTOGRAPHY AND NETWORK SECURITY",
389
+ "grade": "A+",
390
+ "marks": 84
391
+ },
392
+ {
393
+ "subject": "AI AND SUSTAINABLE COMPUTING",
394
+ "grade": "O",
395
+ "marks": 91
396
+ },
397
+ {
398
+ "subject": "NSS/ NCC/ CULTURAL CLUBS/ TECHNICAL SOCIETY/ TECHNICAL CLUB",
399
+ "grade": "O",
400
+ "marks": 92
401
+ },
402
+ {
403
+ "subject": "DIGITAL IMAGE PROCESSING LAB",
404
+ "grade": "O",
405
+ "marks": 92
406
+ }
407
+ ]
408
+ }
409
+ ]
410
+ },
411
+ "coding_profiles": {
412
+ "leetcode": {
413
+ "username": "akshitsharma7093",
414
+ "ranking": 2479447,
415
+ "totalSolved": 40,
416
+ "acceptanceRate": 64.08,
417
+ "problemsByDifficulty": {
418
+ "Easy": "25/905",
419
+ "Medium": "11/1927",
420
+ "Hard": "4/874"
421
+ },
422
+ "primaryLanguage": {
423
+ "languageName": "C++",
424
+ "problemsSolved": 40
425
+ },
426
+ "topSkillsSummary": [
427
+ {
428
+ "skill": "Array",
429
+ "solved": 22
430
+ },
431
+ {
432
+ "skill": "String",
433
+ "solved": 10
434
+ },
435
+ {
436
+ "skill": "Hash Table",
437
+ "solved": 8
438
+ },
439
+ {
440
+ "skill": "Dynamic Programming",
441
+ "solved": 7
442
+ },
443
+ {
444
+ "skill": "Binary Search",
445
+ "solved": 6
446
+ },
447
+ {
448
+ "skill": "Math",
449
+ "solved": 6
450
+ },
451
+ {
452
+ "skill": "Recursion",
453
+ "solved": 5
454
+ },
455
+ {
456
+ "skill": "Two Pointers",
457
+ "solved": 5
458
+ },
459
+ {
460
+ "skill": "Tree",
461
+ "solved": 4
462
+ },
463
+ {
464
+ "skill": "Depth-First Search",
465
+ "solved": 4
466
+ },
467
+ {
468
+ "skill": "Stack",
469
+ "solved": 4
470
+ },
471
+ {
472
+ "skill": "Segment Tree",
473
+ "solved": 3
474
+ },
475
+ {
476
+ "skill": "Binary Tree",
477
+ "solved": 3
478
+ },
479
+ {
480
+ "skill": "Sliding Window",
481
+ "solved": 3
482
+ },
483
+ {
484
+ "skill": "Linked List",
485
+ "solved": 3
486
+ }
487
+ ],
488
+ "activity": {
489
+ "currentStreak": 8,
490
+ "totalActiveDays": 31
491
+ },
492
+ "recentSubmissions": [
493
+ {
494
+ "title": "Binary Tree Inorder Traversal",
495
+ "timestamp": "2025-09-19"
496
+ },
497
+ {
498
+ "title": "Binary Tree Preorder Traversal",
499
+ "timestamp": "2025-09-16"
500
+ },
501
+ {
502
+ "title": "Power of Four",
503
+ "timestamp": "2025-08-15"
504
+ },
505
+ {
506
+ "title": "Largest 3-Same-Digit Number in String",
507
+ "timestamp": "2025-08-15"
508
+ },
509
+ {
510
+ "title": "Power of Three",
511
+ "timestamp": "2025-08-13"
512
+ },
513
+ {
514
+ "title": "Fruits Into Baskets III",
515
+ "timestamp": "2025-08-06"
516
+ },
517
+ {
518
+ "title": "Fruits Into Baskets II",
519
+ "timestamp": "2025-08-05"
520
+ },
521
+ {
522
+ "title": "Fruit Into Baskets",
523
+ "timestamp": "2025-08-04"
524
+ },
525
+ {
526
+ "title": "Maximum Fruits Harvested After at Most K Steps",
527
+ "timestamp": "2025-08-03"
528
+ },
529
+ {
530
+ "title": "Pascal's Triangle",
531
+ "timestamp": "2025-08-01"
532
+ },
533
+ {
534
+ "title": "Count Hills and Valleys in an Array",
535
+ "timestamp": "2025-07-28"
536
+ },
537
+ {
538
+ "title": "Maximize Subarrays After Removing One Conflicting Pair",
539
+ "timestamp": "2025-07-26"
540
+ },
541
+ {
542
+ "title": "Maximum Unique Subarray Sum After Deletion",
543
+ "timestamp": "2025-07-25"
544
+ },
545
+ {
546
+ "title": "Minimum Score After Removals on a Tree",
547
+ "timestamp": "2025-07-24"
548
+ },
549
+ {
550
+ "title": "Maximum Score From Removing Substrings",
551
+ "timestamp": "2025-07-23"
552
+ },
553
+ {
554
+ "title": "Maximum Erasure Value",
555
+ "timestamp": "2025-07-22"
556
+ },
557
+ {
558
+ "title": "Delete Characters to Make Fancy String",
559
+ "timestamp": "2025-07-22"
560
+ },
561
+ {
562
+ "title": "Valid Palindrome",
563
+ "timestamp": "2025-07-20"
564
+ },
565
+ {
566
+ "title": "Convert Binary Number in a Linked List to Integer",
567
+ "timestamp": "2025-07-19"
568
+ },
569
+ {
570
+ "title": "Pow(x, n)",
571
+ "timestamp": "2025-06-28"
572
+ }
573
+ ]
574
+ },
575
+ "github": {
576
+ "username": "akshit7093",
577
+ "name": "Akshit Sharma",
578
+ "bio": "Bachelor of Technology in Artificial Intelligence and Data Science\r\nExperienced Full-Stack Web Developer\r\nCurrently studying Machine Learning, with a focus on D",
579
+ "stats": {
580
+ "public_repos": 35,
581
+ "followers": 6,
582
+ "following": 3
583
+ },
584
+ "cleaned_profile_readme": "# 💫 About Me \nI’m a passionate **AI & Data Science undergraduate** building intelligent systems powered by Machine Learning and Generative AI. My work focuses on NLP, Computer Vision, Cloud Computing, and deploying ML models at scale.\n---\n## 🔗 Let's Connect\n[](https://www.linkedin.com/in/akshit-sharma-475a94271/) \n[](https://x.com/Akshit_7093)\n---\n## 💻 Skills \n### Languages:\n### ML & AI: \n### Web & Cloud: \n### Tools & Platforms: \n---\n## 📂 Featured Projects \n### 🎬 Movie Genre Classifier\nBuilt using scikit-learn and Flask. Achieved 92% accuracy on a dataset of 10,000 movies. \n🔗 GitHub Repo \n### 💳 Credit Card Fraud Detection\nReduced false positives by 15% using XGBoost and feature engineering on 1 million transactions. \n🔗 GitHub Repo \n### 🗣️ SMS Spam Detection\nNLP-based model with 95% accuracy deployed using Flask. \n🔗 GitHub Repo \n### ☁️ OpenStack Cloud Manager with Gemini\nNatural language interface to manage OpenStack resources using Google Gemini. \n🔗 GitHub Repo \n### 🤖 Universal Website Chatbot\nLlama 3.1 based chatbot with voice assistant via Google TTS. \n🔗 GitHub Repo \n### 🧏 SignEase - Real-Time Sign Language Translator\nVideo calling app with TensorFlow + WebRTC achieving >89% accuracy. \n🔗 GitHub Repo \n---\n## 📊 GitHub Stats\n## 🏆 GitHub Trophies",
585
+ "pinned_repositories": [
586
+ {
587
+ "name": "SheShield1",
588
+ "language": "Java",
589
+ "stars": 1,
590
+ "forks": 0
591
+ },
592
+ {
593
+ "name": "SheShield",
594
+ "language": "Python",
595
+ "stars": 0,
596
+ "forks": 0
597
+ },
598
+ {
599
+ "name": "WeCare",
600
+ "language": "CSS",
601
+ "stars": 0,
602
+ "forks": 0
603
+ },
604
+ {
605
+ "name": "practice",
606
+ "stars": 0,
607
+ "forks": 0
608
+ },
609
+ {
610
+ "name": "vd",
611
+ "language": "CSS",
612
+ "stars": 0,
613
+ "forks": 0
614
+ }
615
+ ],
616
+ "top_repositories": [
617
+ {
618
+ "name": "SheShield1",
619
+ "language": "Java",
620
+ "stars": 1,
621
+ "forks": 0,
622
+ "last_pushed": "2023-04-25"
623
+ },
624
+ {
625
+ "name": "speech-translator-using-vosk",
626
+ "language": "HTML",
627
+ "stars": 0,
628
+ "forks": 0,
629
+ "last_pushed": "2025-09-24"
630
+ },
631
+ {
632
+ "name": "SHL-Assessment-Recommendation-System",
633
+ "language": "Python",
634
+ "stars": 0,
635
+ "forks": 0,
636
+ "last_pushed": "2025-09-05"
637
+ },
638
+ {
639
+ "name": "VM_manager_AgenticAi",
640
+ "language": "Python",
641
+ "stars": 0,
642
+ "forks": 1,
643
+ "last_pushed": "2025-08-24"
644
+ },
645
+ {
646
+ "name": "Ayna_assignment_shape_color_ML",
647
+ "language": "Jupyter Notebook",
648
+ "stars": 0,
649
+ "forks": 0,
650
+ "last_pushed": "2025-08-06"
651
+ },
652
+ {
653
+ "name": "Sign-language-translator",
654
+ "language": "Jupyter Notebook",
655
+ "stars": 0,
656
+ "forks": 0,
657
+ "last_pushed": "2025-08-05"
658
+ },
659
+ {
660
+ "name": "AI-polling-system",
661
+ "stars": 0,
662
+ "forks": 0,
663
+ "last_pushed": "2025-08-01"
664
+ },
665
+ {
666
+ "name": "Educopilot",
667
+ "language": "Python",
668
+ "stars": 0,
669
+ "forks": 0,
670
+ "last_pushed": "2025-07-29"
671
+ },
672
+ {
673
+ "name": "akshit7093",
674
+ "description": "Config files for my GitHub profile.",
675
+ "stars": 0,
676
+ "forks": 0,
677
+ "last_pushed": "2025-07-14"
678
+ },
679
+ {
680
+ "name": "walmarts-supplier-nexus-70",
681
+ "language": "TypeScript",
682
+ "stars": 0,
683
+ "forks": 0,
684
+ "last_pushed": "2025-07-07"
685
+ }
686
+ ]
687
+ },
688
+ "codeforces": {
689
+ "username": "akshit7093",
690
+ "rating": 853,
691
+ "maxRating": 853,
692
+ "rank": "newbie",
693
+ "maxRank": "newbie",
694
+ "contest_history": [
695
+ {
696
+ "contestName": "Codeforces Round 1035 (Div. 2)",
697
+ "rank": 585,
698
+ "oldRating": 0,
699
+ "newRating": 670,
700
+ "ratingChange": 670
701
+ },
702
+ {
703
+ "contestName": "EPIC Institute of Technology Round Summer 2025 (Codeforces Round 1036, Div. 1 + Div. 2)",
704
+ "rank": 10736,
705
+ "oldRating": 670,
706
+ "newRating": 853,
707
+ "ratingChange": 183
708
+ }
709
+ ],
710
+ "problem_solving_stats": {
711
+ "solved_problems": 3,
712
+ "total_attempts": 10,
713
+ "top_tags": {
714
+ "math": 3,
715
+ "greedy": 2,
716
+ "combinatorics": 1,
717
+ "dp": 1,
718
+ "geometry": 1,
719
+ "bitmasks": 1
720
+ },
721
+ "verdicts": {
722
+ "OK": 3
723
+ }
724
+ },
725
+ "submissions": [
726
+ {
727
+ "problem_name": "Minimise Sum",
728
+ "problem_tags": [
729
+ "greedy"
730
+ ],
731
+ "problem_rating": 1000,
732
+ "language": "C++23 (GCC 14-64, msys2)",
733
+ "verdict": "WRONG_ANSWER"
734
+ },
735
+ {
736
+ "problem_name": "Deranged Deletions",
737
+ "problem_tags": [
738
+ "greedy",
739
+ "sortings"
740
+ ],
741
+ "problem_rating": 800,
742
+ "language": "Python 3",
743
+ "verdict": "TIME_LIMIT_EXCEEDED"
744
+ },
745
+ {
746
+ "problem_name": "Minimise Sum",
747
+ "problem_tags": [
748
+ "greedy"
749
+ ],
750
+ "problem_rating": 1000,
751
+ "language": "C++23 (GCC 14-64, msys2)",
752
+ "verdict": "WRONG_ANSWER"
753
+ },
754
+ {
755
+ "problem_name": "And Constraint",
756
+ "problem_tags": [
757
+ "bitmasks",
758
+ "dp",
759
+ "greedy"
760
+ ],
761
+ "problem_rating": 2600,
762
+ "language": "C++23 (GCC 14-64, msys2)",
763
+ "verdict": "WRONG_ANSWER"
764
+ },
765
+ {
766
+ "problem_name": "Volcanic Eruptions",
767
+ "problem_tags": [
768
+ "dfs and similar",
769
+ "dp",
770
+ "greedy",
771
+ "shortest paths",
772
+ "trees"
773
+ ],
774
+ "problem_rating": 3300,
775
+ "language": "C++23 (GCC 14-64, msys2)",
776
+ "verdict": "TIME_LIMIT_EXCEEDED"
777
+ },
778
+ {
779
+ "problem_name": "Token Removing",
780
+ "problem_tags": [
781
+ "combinatorics",
782
+ "dp",
783
+ "math"
784
+ ],
785
+ "problem_rating": 2100,
786
+ "language": "C++23 (GCC 14-64, msys2)",
787
+ "verdict": "OK"
788
+ },
789
+ {
790
+ "problem_name": "A Good Problem",
791
+ "problem_tags": [
792
+ "bitmasks",
793
+ "constructive algorithms",
794
+ "math"
795
+ ],
796
+ "problem_rating": 1300,
797
+ "language": "C++23 (GCC 14-64, msys2)",
798
+ "verdict": "TIME_LIMIT_EXCEEDED"
799
+ },
800
+ {
801
+ "problem_name": "Line Segments",
802
+ "problem_tags": [
803
+ "geometry",
804
+ "greedy",
805
+ "math"
806
+ ],
807
+ "problem_rating": 1200,
808
+ "language": "C++23 (GCC 14-64, msys2)",
809
+ "verdict": "OK"
810
+ },
811
+ {
812
+ "problem_name": "Add or XOR",
813
+ "problem_tags": [
814
+ "bitmasks",
815
+ "greedy",
816
+ "math"
817
+ ],
818
+ "problem_rating": 800,
819
+ "language": "C++23 (GCC 14-64, msys2)",
820
+ "verdict": "OK"
821
+ },
822
+ {
823
+ "problem_name": "Add or XOR",
824
+ "problem_tags": [
825
+ "bitmasks",
826
+ "greedy",
827
+ "math"
828
+ ],
829
+ "problem_rating": 800,
830
+ "language": "GNU C11",
831
+ "verdict": "COMPILATION_ERROR"
832
+ }
833
+ ]
834
+ }
835
+ },
836
+ "resume": {
837
+ "full_text": "Akshit Sharma \nFinal‑Year B.Tech (AI & Data Science) | Backend & AI/ML Engineer | Cloud‑Native Systems \nakshitsharma7096@gmail.com/ +91 8810248097/Github / Linkedin / LeetCode / CodeForces \nSKILLS\n \n●​\nProgramming Languages: Python, Java, C/C++, JavaScript, SQL, React, Node.js, TypeScript, Flask, FastAPI \n●​\nDatabases & Tools: Pandas, NumPy, Matplotlib, MongoDB, Postgre \n●​\nML/AI & Frameworks: TensorFlow, PyTorch, NLP, Computer Vision, Transformers, RAG, LangChain \n●​\nCloud & DevOps: AWS, Google Cloud Platform, OpenStack SDK, Docker, Kubernetes \n●​\nSystems & Fundamentals: Unix/Linux, TCP/IP Networking, Git, Data Structures & Algorithms, Computer Networks \nEXPERIENCE\n \nResearch Intern | Directorate of Research, Government of Arunachal Pradesh​\n​\n \n(August 2025 – Present) \n●​\nDeveloped a low-resource speech-to-speech translation pipeline using Wav2Vec 2.0 for ASR, MarianMT for NMT, and Tacotron 2 \nfor TTS, focusing on endangered languages with context-dependent meanings. \n●​\nOptimised system architecture to reduce translation latency to under 2 seconds, enabling real time deployment for field use. \nDeep Learning Intern | Akanila Technologies ​ ​\n https://github.com/akshit7093/Chatbot-for-websites \n(July 2024 – December 2024) \n●​\nDeveloped a universal chatbot platform by fine‑tuning Llama3.1 LLM using LoRA and integrating RAG with FAISS for \ndomain‑specific retrieval, boosting query accuracy to 90 % and improving response relevance by 25 %. \n●​\nDesigned a flexible Python backend with modular components in FastAPI increasing code reusability to 65% . \n●​\nImplemented automated deployments on AWS EC2, leveraging Docker for containerization and Kubernetes for container \norchestration. \nMachine Learning Intern | CodSoft ​\n https://github.com/akshit7093/CODSOFT \n(August 2024 – September 2024) \n●​\nDeveloped a credit card fraud detection system using XGBoost, analyzing 1 million transaction records. \n●​\nEngineered 20+ features from behavioral and time-series data then trained an XGBoost model on SageMaker to drop false \npositives from 20% to 5% while keeping recall over 90%. \n●​\nBuilt an NLP model for SMS spam detection using Python and scikit-learn, achieving 95% accuracy on test data. \nPROJECT\n \nOpenStack Cloud Management System with Natural Language Interface https://github.com/akshit7093/VM_manager_AgenticAi \n●​\nBuilt a cloud management system interfacing with OpenStack infrastructure APIs. \n●​\nEnabled users to issue natural language prompts (e.g., \"create a server\" or \"delete a volume\"), which an AI agent created using \nLangChain and Google's Gemini-2.5 pro model translated into precise OpenStack API calls. \n●​\nBuilt an interactive CLI and a web app for remote management, featuring resource analytics and container monitoring per VM. \n●​\nDesigned RESTful backend with Fastapi and containerized the application using Docker. \n●​\nTechnologies: Python, OpenStack SDK, Gemini, Fastapi, Docker, LangChain \nSignEase -Video calling platform for individuals with disabilities​ https://github.com/akshit7093/Sign-language-translator.git \n●​\nCreated a video chat application using React and Node.js to enable video communication with ASL translation. \n●​\nImplemented American Sign Language (ASL) detection using MediaPipe for landmarks and an LSTM network in TensorFlow, \nreaching 89% accuracy on a small dataset of 20 videos. \n●​\nReduced latency from 500ms to 180ms using model quantization (TensorFlow Lite) and frame-rate optimization. \n●​\nTechnologies: Python, TensorFlow, WebRTC, React, Node.js, MediaPipe. \nEDUCATION \n \nMaharaja Agrasen Institute of Technology​\n​\n​\n​\n​\n​\n​\n(June 2022 - June 2026) \n●​\nB.Tech. in Computer Science with a specialization in Artificial Intelligence and Data Science \n●​\nCGPA:8.96/10 ​\n​\n​\n​\n​\n​\n​\n​\n \n●​\nRelevant Coursework: Machine Learning, Data Mining, Image Processing, Data Structures and Algorithms, Computer Networks \nCERTIFICATIONS \n \n●​\nData Science (Pwskills) \n●​\nMachine Learning and Deep Learning Specialization (Coursera) \n●​\nAWS Solutions Architect Virtual Experience Program (Forage)  \n●​\nIntroduction to Generative AI (Google) \n●​\nDevelop GenAI Apps with Gemini and Streamlit (Google) \n●​\nPrompt Design in Vertex AI (Google) \nACHIEVEMENTS \n \n●​\nWinner – AceCloud X RTDS Hackathon ‘25",
838
+ "full_text_preview": "Akshit Sharma \nFinal‑Year B.Tech (AI & Data Science) | Backend & AI/ML Engineer | Cloud‑Native Systems \nakshitsharma7096@gmail.com/ +91 8810248097/Github / Linkedin / LeetCode / CodeForces \nSKILLS\n \n●​\nProgramming Languages: Python, Java, C/C++, JavaScript, SQL, React, Node.js, TypeScript, Flask, FastAPI \n●​\nDatabases & Tools: Pandas, NumPy, Matplotlib, MongoDB, Postgre \n●​\nML/AI & Frameworks: TensorFlow, PyTorch, NLP, Computer Vision, Transformers, RAG, LangChain \n●​\nCloud & DevOps: AWS, Google...",
839
+ "professional_links": [
840
+ "mailto:akshitsharma7096@gmail.com",
841
+ "https://github.com/akshit7093",
842
+ "https://www.linkedin.com/in/akshit-sharma-475a94271/",
843
+ "https://leetcode.com/u/akshitsharma7093/",
844
+ "https://codeforces.com/profile/akshit7093",
845
+ "https://github.com/akshit7093/Chatbot-for-websites",
846
+ "https://github.com/akshit7093/CODSOFT",
847
+ "https://github.com/akshit7093/VM_manager_AgenticAi",
848
+ "https://github.com/akshit7093/Sign-language-translator.git",
849
+ "https://www.cloudskillsboost.google/public_profiles/1b626606-8403-4450-9b1a-dbba876587d7/badges/9194948",
850
+ "https://www.cloudskillsboost.google/public_profiles/1b626606-8403-4450-9b1a-dbba876587d7/badges/9194066",
851
+ "https://www.cloudskillsboost.google/public_profiles/1b626606-8403-4450-9b1a-dbba876587d7/badges/9140322",
852
+ "https://drive.google.com/file/d/1OeO7jFd7le1gg_6I0oBGjmsBIfA50p73/view?usp=sharing"
853
+ ],
854
+ "skills_summary": "Akshit Sharma FinalYear B.Tech (AI Data Science) Backend AIML Engineer CloudNative Systems akshitsharma7096gmail.com 91 8810248097Github Linkedin LeetCode CodeForces SKILLS Programming Languages: Python, Java, CC, JavaScript, SQL, React, Node.js, TypeScript, Flask, FastAPI Databases Tools: Pandas, NumPy, Matplotlib, MongoDB, Postgre MLAI Frameworks: TensorFlow, PyTorch, NLP, Computer Vision, Transformers, RAG, LangChain Cloud DevOps: AWS, Google Cloud Platform, OpenStack SDK, Docker, Kubernetes Systems Fundamentals: UnixLinux, TCPIP Networking, Git, Data Structures Algorithms, Computer Networks EXPERIENCE Research Intern Directorate of Research, Government of Arunachal Pradesh (August 2025 Present) Developed a low-resource speech-to-speech translation pipeline using Wav2Vec 2.0 for ASR, MarianMT for NMT, and Tacotron 2 for TTS, focusing on endangered languages with context-dependent meanings. Optimised system architecture to reduce translation latency to under 2 seconds, enabling real time deployment for field use. Deep Learning Intern Akanila Technologies https:github.comakshit7093Chatbot-for-websites (July 2024 December 2024) Developed a universal chatbot platform by finetuning Llama3.1 LLM using LoRA and integrating RAG with FAISS for domainspecific retrieval, boosting query accuracy to 90 and improving response relevance by 25 . Designed a flexible Python...",
855
+ "key_skills": [
856
+ "Python",
857
+ "Java",
858
+ "Javascript",
859
+ "React",
860
+ "Node",
861
+ "Sql",
862
+ "Mongodb",
863
+ "Aws",
864
+ "Docker",
865
+ "Kubernetes",
866
+ "Git",
867
+ "C++",
868
+ "Typescript",
869
+ "Flask",
870
+ "Tensorflow",
871
+ "Pytorch",
872
+ "Data structures",
873
+ "Algorithms",
874
+ "Backend"
875
+ ],
876
+ "total_hyperlinks": 13,
877
+ "professional_link_count": 13,
878
+ "missing_elements": []
879
+ },
880
+ "errors": {}
881
+ }
882
+ }
final_cleaned_student_data.json CHANGED
The diff for this file is too large to render. See raw diff
 
rohanmaincv.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c9368773767bb6a002c9bf6af8576b33ab1a59282409104bd5841a703b8d6335
3
+ size 166820
static/final.css CHANGED
@@ -8,6 +8,9 @@
8
  --text-color-muted: #8A8A8A; /* Dimmer text for labels/placeholders */
9
  --accent-color: #00E5FF; /* Vibrant cyan/teal for highlights */
10
  --accent-color-hover: #00B8CC;
 
 
 
11
  --font-family: 'Inter', sans-serif;
12
  }
13
 
@@ -39,6 +42,9 @@ h3 {
39
  font-size: 1.1rem;
40
  margin-bottom: 12px;
41
  color: var(--text-color);
 
 
 
42
  }
43
 
44
  a {
@@ -204,30 +210,20 @@ input[type="text"]::placeholder {
204
  color: var(--text-color-muted);
205
  }
206
 
207
-
208
  /* --- Content Sections & Cards --- */
209
  .content-section.hidden {
210
  display: none;
211
  }
212
 
213
  .card {
214
- background: rgba(26, 26, 26, 0.7); /* The semi-transparent panel color for the gloss effect */
215
- backdrop-filter: blur(10px); /* The "frosted glass" effect */
216
  border: 1px solid var(--border-color);
217
  border-radius: 16px;
218
  padding: 24px;
219
  }
220
 
221
- .chart-placeholder {
222
- display: flex;
223
- align-items: center;
224
- justify-content: center;
225
- height: 100%;
226
- color: var(--text-color-muted);
227
- font-size: 1.2rem;
228
- }
229
-
230
- /* --- Dashboard --- */
231
  .dashboard-grid {
232
  display: grid;
233
  grid-template-columns: repeat(3, 1fr);
@@ -253,6 +249,26 @@ input[type="text"]::placeholder {
253
  color: var(--accent-color);
254
  }
255
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
 
257
  /* --- Report & Job Analysis Grids --- */
258
  .report-grid, .job-analysis-grid {
@@ -273,11 +289,158 @@ input[type="text"]::placeholder {
273
  font-size: 0.85rem;
274
  }
275
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
276
  /* --- Chat Interface --- */
277
  .chat-container {
278
  display: flex;
279
  flex-direction: column;
280
- height: 70vh; /* Adjust height as needed */
281
  padding: 0;
282
  }
283
 
@@ -328,7 +491,6 @@ input[type="text"]::placeholder {
328
  white-space: pre-wrap;
329
  }
330
 
331
-
332
  /* --- Loading Spinner --- */
333
  .loading-overlay {
334
  position: fixed;
@@ -366,84 +528,139 @@ input[type="text"]::placeholder {
366
  .hidden {
367
  display: none !important;
368
  }
369
- /* Add these rules to your existing final.css */
370
 
371
- /* Ensure the chart containers have a defined size */
372
- .chart-container {
373
- /* You can adjust these values as needed */
374
- min-height: 300px; /* Set a minimum height */
375
- /* Optional: Set a max-height if needed */
376
- /* max-height: 400px; */
377
- /* Ensure the canvas fills the container */
378
- display: flex;
379
- flex-direction: column; /* Stack chart title and canvas vertically */
380
- justify-content: center; /* Center the chart vertically if needed */
381
- align-items: center; /* Center the chart horizontally */
382
- position: relative; /* Needed for Chart.js responsiveness */
383
  }
384
 
385
- /* Ensure the canvas elements themselves have a defined size */
386
- .chart-container canvas {
387
- width: 100% !important; /* Override any inline styles Chart.js might add */
388
- height: 100% !important; /* Override any inline styles Chart.js might add */
389
- max-width: 100%; /* Prevent overflow */
390
- max-height: 100%; /* Prevent overflow */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
391
  }
392
 
393
- /* Optional: Style the placeholder text if no data is shown */
394
- .chart-placeholder {
395
- display: flex;
396
- align-items: center;
397
- justify-content: center;
 
 
 
 
 
 
 
 
398
  width: 100%;
399
- height: 100%;
400
- color: var(--gray); /* Use your defined CSS variable */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
401
  font-style: italic;
402
  }
403
 
404
- /* Adjust the grid layout if necessary */
405
- .dashboard-grid {
406
- display: grid;
407
- grid-template-columns: 1fr; /* Default to single column */
408
- gap: 20px;
409
- margin-top: 20px;
410
  }
411
 
412
- .metric-cards-grid {
413
- display: grid;
414
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); /* Adjust minmax width as needed */
415
- gap: 20px;
416
- margin-bottom: 20px; /* Space below the metric row */
417
  }
418
 
419
- /* Responsive grid for dashboard sections */
420
- @media (min-width: 992px) {
421
- .dashboard-grid {
422
- grid-template-columns: 1fr 1fr; /* Two columns for most dashboard items */
423
- }
424
- .metric-cards-grid {
425
- grid-column: span 2; /* Metrics span full width */
426
- }
427
- .large-card {
428
- grid-column: span 2; /* Large card spans 2 columns */
429
- }
430
- .chart-row {
431
- grid-column: span 2; /* Chart row spans 2 columns */
432
- display: grid;
433
- grid-template-columns: 1fr 1fr; /* Two charts side-by-side within the row */
434
- gap: 20px;
435
- }
436
- .chart-container {
437
- /* Remove min-height from individual containers if using chart-row */
438
- min-height: auto;
439
- }
440
  }
441
 
442
- /* Fallback for smaller screens */
443
- @media (max-width: 991px) {
444
- .chart-row {
445
- display: grid;
446
- grid-template-columns: 1fr; /* Charts stack vertically on smaller screens */
447
- gap: 20px;
448
- }
449
- }
 
8
  --text-color-muted: #8A8A8A; /* Dimmer text for labels/placeholders */
9
  --accent-color: #00E5FF; /* Vibrant cyan/teal for highlights */
10
  --accent-color-hover: #00B8CC;
11
+ --success-color: #4ade80; /* Green for positive elements */
12
+ --warning-color: #facc15; /* Amber for warnings */
13
+ --danger-color: #f87171; /* Red for errors */
14
  --font-family: 'Inter', sans-serif;
15
  }
16
 
 
42
  font-size: 1.1rem;
43
  margin-bottom: 12px;
44
  color: var(--text-color);
45
+ /* Ensure title stays above the absolutely positioned canvas */
46
+ position: relative;
47
+ z-index: 2;
48
  }
49
 
50
  a {
 
210
  color: var(--text-color-muted);
211
  }
212
 
 
213
  /* --- Content Sections & Cards --- */
214
  .content-section.hidden {
215
  display: none;
216
  }
217
 
218
  .card {
219
+ background: rgba(26, 26, 26, 0.7);
220
+ backdrop-filter: blur(10px);
221
  border: 1px solid var(--border-color);
222
  border-radius: 16px;
223
  padding: 24px;
224
  }
225
 
226
+ /* --- Dashboard & Chart Fix --- */
 
 
 
 
 
 
 
 
 
227
  .dashboard-grid {
228
  display: grid;
229
  grid-template-columns: repeat(3, 1fr);
 
249
  color: var(--accent-color);
250
  }
251
 
252
+ .chart-row {
253
+ grid-column: 1 / -1; /* Span full width of the grid */
254
+ display: grid;
255
+ grid-template-columns: repeat(2, 1fr);
256
+ gap: 24px;
257
+ }
258
+
259
+ /* CORRECTED CHART CONTAINER STYLES */
260
+ .chart-container {
261
+ position: relative; /* This is the key: creates a positioning context for the canvas */
262
+ min-height: 350px; /* Give the container a minimum height */
263
+ }
264
+
265
+ .chart-container canvas {
266
+ position: absolute; /* Takes the canvas out of the layout flow */
267
+ top: 60px; /* Leave space for the h3 title */
268
+ left: 24px; /* Align with the card's left padding */
269
+ width: calc(100% - 48px) !important; /* Fill container width, respecting padding */
270
+ height: calc(100% - 84px) !important; /* Fill container height, respecting title space and padding */
271
+ }
272
 
273
  /* --- Report & Job Analysis Grids --- */
274
  .report-grid, .job-analysis-grid {
 
289
  font-size: 0.85rem;
290
  }
291
 
292
+ /* --- Job Listings Page Specific Styles --- */
293
+ .job-listings-container {
294
+ display: flex;
295
+ flex-direction: column;
296
+ gap: 20px;
297
+ margin-top: 20px;
298
+ }
299
+
300
+ .info-panel {
301
+ background: rgba(26, 26, 26, 0.7);
302
+ backdrop-filter: blur(10px);
303
+ border: 1px solid var(--border-color);
304
+ border-radius: 16px;
305
+ padding: 20px;
306
+ transition: var(--transition);
307
+ }
308
+
309
+ .info-panel h3 {
310
+ color: var(--accent-color);
311
+ margin-bottom: 10px;
312
+ font-size: 1.2rem;
313
+ }
314
+
315
+ .info-panel p {
316
+ margin-bottom: 8px;
317
+ color: var(--text-color);
318
+ line-height: 1.5;
319
+ }
320
+
321
+ .job-listings-tabs {
322
+ display: flex;
323
+ gap: 10px;
324
+ margin-bottom: 15px;
325
+ }
326
+
327
+ .tab-btn {
328
+ padding: 12px 24px;
329
+ border-radius: 12px 12px 0 0;
330
+ font-weight: 600;
331
+ color: var(--text-color-muted);
332
+ background: var(--input-bg);
333
+ border: 1px solid var(--border-color);
334
+ border-bottom: none;
335
+ cursor: pointer;
336
+ transition: var(--transition);
337
+ flex-grow: 1;
338
+ text-align: center;
339
+ font-size: 0.95rem;
340
+ }
341
+
342
+ .tab-btn:hover {
343
+ background: var(--panel-color);
344
+ }
345
+
346
+ .tab-btn.active {
347
+ color: var(--text-color);
348
+ background: var(--panel-color);
349
+ border-color: var(--accent-color);
350
+ border-bottom: 2px solid var(--accent-color);
351
+ }
352
+
353
+ .job-category-section {
354
+ display: flex;
355
+ flex-direction: column;
356
+ gap: 20px;
357
+ background: var(--panel-color);
358
+ border: 1px solid var(--border-color);
359
+ border-radius: 0 12px 12px 12px; /* Rounded top removed to connect with tabs */
360
+ padding: 20px;
361
+ }
362
+
363
+ .job-category-section h3 {
364
+ font-size: 1.2rem;
365
+ margin-bottom: 10px;
366
+ color: var(--accent-color);
367
+ padding-bottom: 8px;
368
+ border-bottom: 1px solid var(--border-color);
369
+ }
370
+
371
+ .job-listings-grid {
372
+ display: grid;
373
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
374
+ gap: 20px;
375
+ margin-bottom: 20px;
376
+ }
377
+
378
+ .job-card {
379
+ background: rgba(44, 44, 44, 0.5); /* Slightly lighter than panel */
380
+ border: 1px solid var(--border-color);
381
+ border-radius: 12px;
382
+ padding: 20px;
383
+ transition: var(--transition);
384
+ display: flex;
385
+ flex-direction: column;
386
+ height: 100%; /* Ensure cards in a row are the same height */
387
+ }
388
+
389
+ .job-card:hover {
390
+ transform: translateY(-5px);
391
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
392
+ border-color: var(--accent-color);
393
+ }
394
+
395
+ .job-card h4 {
396
+ margin: 0 0 10px 0;
397
+ color: var(--text-color);
398
+ font-size: 1.1rem;
399
+ }
400
+
401
+ .job-card .company {
402
+ font-weight: 600;
403
+ color: var(--accent-color);
404
+ margin: 0 0 5px 0;
405
+ font-size: 1rem;
406
+ }
407
+
408
+ .job-card .location,
409
+ .job-card .type {
410
+ font-size: 0.9rem;
411
+ color: var(--text-color-muted);
412
+ margin: 3px 0;
413
+ }
414
+
415
+ .job-card .aligns-with {
416
+ color: var(--success-color);
417
+ font-size: 0.85rem;
418
+ font-style: italic;
419
+ margin: 8px 0;
420
+ font-weight: 500;
421
+ }
422
+
423
+ .job-card .mismatch {
424
+ color: var(--danger-color);
425
+ font-size: 0.85rem;
426
+ font-style: italic;
427
+ margin: 8px 0;
428
+ font-weight: 500;
429
+ }
430
+
431
+ .apply-btn {
432
+ margin-top: auto; /* Push button to the bottom */
433
+ align-self: flex-start; /* Align button to the left */
434
+ margin-top: 15px;
435
+ padding: 8px 16px; /* Slightly smaller padding for consistency */
436
+ font-size: 0.9rem;
437
+ }
438
+
439
  /* --- Chat Interface --- */
440
  .chat-container {
441
  display: flex;
442
  flex-direction: column;
443
+ height: 70vh;
444
  padding: 0;
445
  }
446
 
 
491
  white-space: pre-wrap;
492
  }
493
 
 
494
  /* --- Loading Spinner --- */
495
  .loading-overlay {
496
  position: fixed;
 
528
  .hidden {
529
  display: none !important;
530
  }
 
531
 
532
+ /* --- Responsive Adjustments --- */
533
+ @media (max-width: 1200px) {
534
+ .app-container {
535
+ grid-template-columns: 200px 1fr; /* Slimmer sidebar */
536
+ }
537
+ .main-content {
538
+ padding: 24px;
539
+ }
 
 
 
 
540
  }
541
 
542
+ @media (max-width: 992px) {
543
+ .app-container {
544
+ grid-template-columns: 1fr; /* Stack sidebar and content */
545
+ }
546
+ .sidebar {
547
+ /* This example hides the sidebar, but you could make it a toggleable menu */
548
+ display: none;
549
+ }
550
+ .dashboard-grid, .chart-row, .report-grid, .job-analysis-grid, .job-listings-grid {
551
+ grid-template-columns: 1fr; /* Single column layout for cards */
552
+ }
553
+ .large-card {
554
+ grid-column: 1 / -1; /* Ensure it spans the single column */
555
+ grid-row: auto;
556
+ }
557
+ .metric-cards-grid {
558
+ grid-column: 1 / -1;
559
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
560
+ }
561
+ .top-bar {
562
+ flex-direction: column;
563
+ align-items: stretch;
564
+ }
565
+ .job-listings-grid {
566
+ grid-template-columns: 1fr; /* Single column for job cards on smaller screens */
567
+ }
568
+ .job-category-section {
569
+ border-radius: 12px; /* Restore full border radius when tabs are above */
570
+ }
571
+ .job-listings-tabs {
572
+ flex-wrap: wrap; /* Allow tabs to wrap if needed */
573
+ }
574
+ }
575
+ /* --- Students Section --- */
576
+ .students-container {
577
+ margin-top: 20px;
578
  }
579
 
580
+ .students-container .card {
581
+ padding: 0; /* Remove default card padding for full table width */
582
+ overflow: hidden; /* Contain shadows/borders */
583
+ }
584
+
585
+ .students-container h3 {
586
+ padding: 24px 24px 12px 24px; /* Match card padding */
587
+ margin: 0;
588
+ border-bottom: 1px solid var(--border-color);
589
+ }
590
+
591
+ .table-responsive {
592
+ overflow-x: auto;
593
  width: 100%;
594
+ }
595
+
596
+ .students-table {
597
+ width: 100%;
598
+ border-collapse: collapse;
599
+ margin: 0;
600
+ }
601
+
602
+ .students-table thead {
603
+ background-color: var(--input-bg);
604
+ }
605
+
606
+ .students-table th,
607
+ .students-table td {
608
+ padding: 16px 24px;
609
+ text-align: left;
610
+ border-bottom: 1px solid var(--border-color);
611
+ }
612
+
613
+ .students-table th {
614
+ font-weight: 600;
615
+ color: var(--text-color);
616
+ font-size: 0.9rem;
617
+ text-transform: uppercase;
618
+ letter-spacing: 0.5px;
619
+ }
620
+
621
+ .students-table tbody tr:last-child td {
622
+ border-bottom: none;
623
+ }
624
+
625
+ .students-table tbody tr:hover {
626
+ background-color: rgba(255, 255, 255, 0.05);
627
+ }
628
+
629
+ .students-table td {
630
+ color: var(--text-color);
631
+ font-size: 1rem;
632
+ }
633
+
634
+ .select-student-btn {
635
+ padding: 6px 12px;
636
+ font-size: 0.85rem;
637
+ }
638
+
639
+ /* --- Messages within Students Section --- */
640
+ #students-loading-message,
641
+ #students-error-message {
642
+ padding: 24px;
643
+ text-align: center;
644
  font-style: italic;
645
  }
646
 
647
+ #students-loading-message {
648
+ color: var(--text-color-muted);
 
 
 
 
649
  }
650
 
651
+ #students-error-message {
652
+ color: var(--danger-color);
 
 
 
653
  }
654
 
655
+ .hidden {
656
+ display: none !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
657
  }
658
 
659
+ /* Optional: Style the "Select" button if needed differently */
660
+ /* .select-student-btn.btn-secondary {
661
+ background-color: #444;
662
+ border-color: #555;
663
+ }
664
+ .select-student-btn.btn-secondary:hover:not(:disabled) {
665
+ background-color: #555;
666
+ } */
static/final.js CHANGED
@@ -681,7 +681,8 @@ document.addEventListener('DOMContentLoaded', () => {
681
 
682
  skillsChart = new Chart(skillsCtx, {
683
  type: 'bar', // or 'doughnut', 'pie', etc.
684
- {
 
685
  labels: labels,
686
  datasets: [{
687
  label: 'Skill Count',
@@ -728,7 +729,8 @@ document.addEventListener('DOMContentLoaded', () => {
728
  // For simplicity, let's use a bar chart here showing score out of 10
729
  dsaChart = new Chart(dsaCtx, {
730
  type: 'bar', // Could be 'radar', 'doughnut' for score
731
- {
 
732
  labels: ['DSA Score'],
733
  datasets: [{
734
  label: 'DSA Performance (0-10)',
@@ -801,7 +803,8 @@ document.addEventListener('DOMContentLoaded', () => {
801
  const messageP = document.createElement('p');
802
  // Apply markdown formatting if the flag is true (e.g., for AI responses)
803
  if (useMarkdown) {
804
- messageP.innerHTML = text; // Use innerHTML to render the formatted HTML
 
805
  } else {
806
  messageP.textContent = text; // Use textContent for plain text (e.g., user messages, loading)
807
  }
 
681
 
682
  skillsChart = new Chart(skillsCtx, {
683
  type: 'bar', // or 'doughnut', 'pie', etc.
684
+ // CORRECTED: Added the 'data' key for the chart data object
685
+ data: {
686
  labels: labels,
687
  datasets: [{
688
  label: 'Skill Count',
 
729
  // For simplicity, let's use a bar chart here showing score out of 10
730
  dsaChart = new Chart(dsaCtx, {
731
  type: 'bar', // Could be 'radar', 'doughnut' for score
732
+ // CORRECTED: Added the 'data' key for the chart data object
733
+ data: {
734
  labels: ['DSA Score'],
735
  datasets: [{
736
  label: 'DSA Performance (0-10)',
 
803
  const messageP = document.createElement('p');
804
  // Apply markdown formatting if the flag is true (e.g., for AI responses)
805
  if (useMarkdown) {
806
+ // CORRECTED: Call the conversion function to turn markdown into HTML
807
+ messageP.innerHTML = convertMarkdownToHTML(text);
808
  } else {
809
  messageP.textContent = text; // Use textContent for plain text (e.g., user messages, loading)
810
  }
static/job_listings.css ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* job_listings.css */
2
+
3
+ .job-listings-container {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: 20px;
7
+ margin-top: 20px;
8
+ }
9
+
10
+ .info-panel {
11
+ background: var(--bg-panel);
12
+ border-radius: var(--panel-radius);
13
+ padding: 15px 20px;
14
+ box-shadow: var(--panel-shadow);
15
+ border: 1px solid var(--border-panel);
16
+ transition: var(--transition);
17
+ }
18
+
19
+ .info-panel h3 {
20
+ color: var(--primary);
21
+ margin-bottom: 10px;
22
+ }
23
+
24
+ .info-panel p {
25
+ margin-bottom: 8px;
26
+ color: var(--text-secondary);
27
+ }
28
+
29
+ .job-listings-tabs {
30
+ display: flex;
31
+ gap: 10px;
32
+ margin-bottom: 15px;
33
+ }
34
+
35
+ .tab-btn {
36
+ padding: 10px 20px;
37
+ border-radius: 8px 8px 0 0;
38
+ font-weight: 600;
39
+ color: var(--gray);
40
+ background: var(--border-panel);
41
+ border: 1px solid var(--border-panel);
42
+ cursor: pointer;
43
+ transition: var(--transition);
44
+ flex-grow: 1;
45
+ text-align: center;
46
+ }
47
+
48
+ .tab-btn.active {
49
+ color: var(--primary);
50
+ background: var(--bg-panel);
51
+ border-bottom: 2px solid var(--primary);
52
+ }
53
+
54
+ .job-category-section {
55
+ display: flex;
56
+ flex-direction: column;
57
+ gap: 20px;
58
+ }
59
+
60
+ .job-listings-grid {
61
+ display: grid;
62
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
63
+ gap: 20px;
64
+ margin-bottom: 20px;
65
+ }
66
+
67
+ .job-card {
68
+ background: var(--bg-panel);
69
+ border-radius: var(--panel-radius);
70
+ padding: 15px;
71
+ box-shadow: var(--panel-shadow);
72
+ border: 1px solid var(--border-panel);
73
+ transition: var(--transition);
74
+ display: flex;
75
+ flex-direction: column;
76
+ }
77
+
78
+ .job-card:hover {
79
+ transform: translateY(-2px);
80
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
81
+ }
82
+
83
+ .job-card h4 {
84
+ margin: 0 0 10px 0;
85
+ color: var(--text-primary);
86
+ }
87
+
88
+ .job-card .company {
89
+ font-weight: 600;
90
+ color: var(--primary);
91
+ margin: 0;
92
+ }
93
+
94
+ .job-card .location,
95
+ .job-card .type {
96
+ font-size: 0.9rem;
97
+ color: var(--gray);
98
+ margin: 5px 0;
99
+ }
100
+
101
+ .job-card .aligns-with {
102
+ color: var(--success);
103
+ font-size: 0.85rem;
104
+ font-style: italic;
105
+ margin: 5px 0;
106
+ }
107
+
108
+ .job-card .mismatch {
109
+ color: var(--danger);
110
+ font-size: 0.85rem;
111
+ font-style: italic;
112
+ margin: 5px 0;
113
+ }
114
+
115
+ .apply-btn {
116
+ margin-top: auto; /* Push button to the bottom */
117
+ align-self: flex-start; /* Align button to the left */
118
+ margin-top: 10px;
119
+ }
static/job_listings.js ADDED
@@ -0,0 +1,241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // job_listings.js
2
+
3
+ document.addEventListener('DOMContentLoaded', () => {
4
+ // --- DOM Elements ---
5
+ const jobListingsSection = document.getElementById('job-listings');
6
+ const tabButtons = document.querySelectorAll('.tab-btn');
7
+ const jobCategorySections = document.querySelectorAll('.job-category-section');
8
+ const studentSelector = document.getElementById('student-selector');
9
+
10
+ // --- Sample Job Listings Data (Simulated) ---
11
+ const sampleJobs = [
12
+ // --- On-Campus Jobs ---
13
+ {
14
+ id: 1,
15
+ title: "Software Engineer Intern",
16
+ company: "TechCorp",
17
+ location: "New Delhi, India",
18
+ type: "On-Campus",
19
+ description: "Internship for software development.",
20
+ requiredSkills: ["Python", "React", "DSA", "JavaScript"]
21
+ },
22
+ {
23
+ id: 2,
24
+ title: "Data Analyst",
25
+ company: "DataInsights Inc.",
26
+ location: "Gurgaon, India",
27
+ type: "On-Campus",
28
+ description: "Role involving data analysis and visualization.",
29
+ requiredSkills: ["Python", "SQL", "Tableau", "Statistics"]
30
+ },
31
+ {
32
+ id: 3,
33
+ title: "Frontend Developer",
34
+ company: "WebSolutions",
35
+ location: "Mumbai, India",
36
+ type: "On-Campus",
37
+ description: "Build user interfaces using modern frameworks.",
38
+ requiredSkills: ["JavaScript", "React", "CSS", "HTML", "Vue.js"]
39
+ },
40
+ {
41
+ id: 4,
42
+ title: "QA Engineer",
43
+ company: "QualityFirst Ltd.",
44
+ location: "Pune, India",
45
+ type: "On-Campus",
46
+ description: "Ensure software quality through testing.",
47
+ requiredSkills: ["Manual Testing", "Automation Testing", "Selenium", "JIRA"]
48
+ },
49
+ {
50
+ id: 5,
51
+ title: "DevOps Associate",
52
+ company: "CloudBridge",
53
+ location: "Hyderabad, India",
54
+ type: "On-Campus",
55
+ description: "Support CI/CD pipelines and cloud infrastructure.",
56
+ requiredSkills: ["Linux", "Docker", "CI/CD", "AWS Basics"]
57
+ },
58
+
59
+ // --- Off-Campus Jobs ---
60
+ {
61
+ id: 6,
62
+ title: "Backend Developer",
63
+ company: "CloudStartups",
64
+ location: "Bangalore, India",
65
+ type: "Off-Campus",
66
+ description: "Develop and maintain server-side applications.",
67
+ requiredSkills: ["Node.js", "AWS", "SQL", "REST APIs", "MongoDB"]
68
+ },
69
+ {
70
+ id: 7,
71
+ title: "Machine Learning Engineer",
72
+ company: "AIFrontiers",
73
+ location: "Chennai, India",
74
+ type: "Off-Campus",
75
+ description: "Design and deploy ML models for real-world problems.",
76
+ requiredSkills: ["Python", "ML", "TensorFlow", "PyTorch", "Scikit-learn"]
77
+ },
78
+ {
79
+ id: 8,
80
+ title: "Full Stack Developer",
81
+ company: "AppVenture",
82
+ location: "Remote",
83
+ type: "Off-Campus",
84
+ description: "Work on both frontend and backend of web applications.",
85
+ requiredSkills: ["JavaScript", "React", "Node.js", "Express", "PostgreSQL", "Docker"]
86
+ },
87
+ {
88
+ id: 9,
89
+ title: "Cybersecurity Specialist",
90
+ company: "SecureNet",
91
+ location: "Kolkata, India",
92
+ type: "Off-Campus",
93
+ description: "Protect systems and networks from cyber threats.",
94
+ requiredSkills: ["Network Security", "Ethical Hacking", "SIEM Tools", "Incident Response"]
95
+ },
96
+ {
97
+ id: 10,
98
+ title: "Mobile App Developer",
99
+ company: "MobileMasters",
100
+ location: "Jaipur, India",
101
+ type: "Off-Campus",
102
+ description: "Develop cross-platform mobile applications.",
103
+ requiredSkills: ["Flutter", "Dart", "Firebase", "iOS", "Android"]
104
+ }
105
+ // Add more sample jobs here if needed
106
+ ];
107
+
108
+ // --- Sample Student Profile Data (Simulated) ---
109
+ // This should ideally come from the main application state or be fetched based on the selected student
110
+ // Example profile matching some jobs, missing others
111
+ const sampleStudentProfile = {
112
+ keySkills: ["Python", "JavaScript", "React", "Node.js", "SQL", "DSA", "Git", "HTML", "CSS"] // Example skills from resume
113
+ };
114
+
115
+ // --- Tab Switching Logic ---
116
+ tabButtons.forEach(button => {
117
+ button.addEventListener('click', () => {
118
+ const targetCategory = button.getAttribute('data-category');
119
+
120
+ // Update active tab button
121
+ tabButtons.forEach(btn => btn.classList.remove('active'));
122
+ button.classList.add('active');
123
+
124
+ // Show corresponding category section, hide others
125
+ jobCategorySections.forEach(section => {
126
+ if (section.getAttribute('data-category') === targetCategory) {
127
+ section.classList.remove('hidden');
128
+ } else {
129
+ section.classList.add('hidden');
130
+ }
131
+ });
132
+
133
+ // Load jobs for the active tab
134
+ loadJobsForCategory(targetCategory);
135
+ });
136
+ });
137
+
138
+ // --- Function to Load Jobs for a Category ---
139
+ function loadJobsForCategory(category) {
140
+ console.log(`Loading jobs for category: ${category}`);
141
+ // Clear existing listings
142
+ const recommendedContainer = document.getElementById(`${category}-recommended-listings`);
143
+ const nonRecommendedContainer = document.getElementById(`${category}-non-recommended-listings`);
144
+ if (recommendedContainer) recommendedContainer.innerHTML = '';
145
+ if (nonRecommendedContainer) nonRecommendedContainer.innerHTML = '';
146
+
147
+ // Filter jobs by category
148
+ const categoryJobs = sampleJobs.filter(job => job.type.toLowerCase().includes(category));
149
+
150
+ // Categorize jobs based on recommendation logic
151
+ const recommendedJobs = [];
152
+ const nonRecommendedJobs = [];
153
+
154
+ categoryJobs.forEach(job => {
155
+ if (isJobRecommended(job, sampleStudentProfile)) {
156
+ recommendedJobs.push(job);
157
+ } else {
158
+ nonRecommendedJobs.push(job);
159
+ }
160
+ });
161
+
162
+ // Populate the UI
163
+ if (recommendedContainer) {
164
+ recommendedJobs.forEach(job => {
165
+ recommendedContainer.appendChild(createJobCard(job, true));
166
+ });
167
+ }
168
+ if (nonRecommendedContainer) {
169
+ nonRecommendedJobs.forEach(job => {
170
+ nonRecommendedContainer.appendChild(createJobCard(job, false));
171
+ });
172
+ }
173
+ }
174
+
175
+ // --- Function to Determine if Job is Recommended ---
176
+ function isJobRecommended(job, studentProfile) {
177
+ // Simple logic: if at least 2 of the required skills are in the student's key skills, recommend it.
178
+ const requiredSkillsLower = job.requiredSkills.map(skill => skill.toLowerCase());
179
+ const studentSkillsLower = studentProfile.keySkills.map(skill => skill.toLowerCase());
180
+ const matchingSkills = requiredSkillsLower.filter(skill => studentSkillsLower.includes(skill));
181
+ return matchingSkills.length >= 2; // Adjust threshold as needed
182
+ }
183
+
184
+ // --- Function to Create a Job Card Element ---
185
+ function createJobCard(job, isRecommended) {
186
+ const card = document.createElement('div');
187
+ card.className = `job-card ${isRecommended ? 'recommended' : 'non-recommended'}`;
188
+
189
+ card.innerHTML = `
190
+ <h4>${job.title}</h4>
191
+ <p class="company">${job.company}</p>
192
+ <p class="location">${job.location}</p>
193
+ <p class="type">${job.type}</p>
194
+ <p class="${isRecommended ? 'aligns-with' : 'mismatch'}">
195
+ ${isRecommended
196
+ ? `Aligns with: ${job.requiredSkills.join(', ')}`
197
+ : `Requires: ${job.requiredSkills.join(', ')}`}
198
+ </p>
199
+ <button class="btn ${isRecommended ? 'btn-primary' : 'btn-secondary'} apply-btn">
200
+ ${isRecommended ? 'Apply Now' : 'Apply Anyway'}
201
+ </button>
202
+ `;
203
+
204
+ // Add event listener to the button
205
+ const applyButton = card.querySelector('.apply-btn');
206
+ applyButton.addEventListener('click', (e) => {
207
+ e.preventDefault(); // Prevent default button behavior if it's inside a form
208
+ handleApplyClick(job, isRecommended);
209
+ });
210
+
211
+ return card;
212
+ }
213
+
214
+ // --- Function to Handle Apply Button Click ---
215
+ function handleApplyClick(job, isRecommended) {
216
+ // Example: Log the action, show an alert, or open the job link in a new tab
217
+ console.log(`Apply button clicked for job: ${job.title} (Category: ${job.type}, Recommended: ${isRecommended})`);
218
+ alert(`You clicked 'Apply ${isRecommended ? 'Now' : 'Anyway'}' for ${job.title} at ${job.company}. This would typically redirect you to the application portal.`);
219
+ // window.open(job.applicationLink, '_blank'); // If you have an application link
220
+ }
221
+
222
+ // --- Initial Load ---
223
+ // Load jobs for the initially active tab (On-Campus)
224
+ if (jobListingsSection && jobListingsSection.classList.contains('active')) {
225
+ loadJobsForCategory('on-campus');
226
+ } else if (jobListingsSection) {
227
+ // If the section exists but isn't active, load for on-campus by default for initial display
228
+ loadJobsForCategory('on-campus');
229
+ }
230
+
231
+ // Optional: Listen for changes in the student selector if the recommendation logic depends on the selected student
232
+ // studentSelector.addEventListener('change', () => {
233
+ // const selectedEnrollment = studentSelector.value;
234
+ // if (selectedEnrollment) {
235
+ // // Fetch or update the student profile based on the selection
236
+ // // Then reload the job listings using the new profile
237
+ // // loadJobsForCategory(currentActiveCategory); // You'd need to track the current active category
238
+ // }
239
+ // });
240
+
241
+ });
templates/final.html CHANGED
@@ -5,6 +5,7 @@
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <title>AI Student Analyzer</title>
7
  <link rel="stylesheet" href="../static/final.css">
 
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
@@ -25,6 +26,7 @@
25
  <li><a href="#students" class="nav-link">Students</a></li>
26
  <li><a href="#reports" class="nav-link">Reports</a></li>
27
  <li><a href="#job-analysis" class="nav-link">Job Analysis</a></li>
 
28
  <li><a href="#chat" class="nav-link">Chat</a></li>
29
  </ul>
30
  </nav>
@@ -174,6 +176,55 @@
174
  </div>
175
  </section>
176
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177
  <!-- Chatbot Interface -->
178
  <section id="chat" class="content-section hidden">
179
  <h2>Student Q&A</h2>
@@ -189,5 +240,6 @@
189
  </div>
190
 
191
  <script src="../static/final.js"></script>
 
192
  </body>
193
  </html>
 
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <title>AI Student Analyzer</title>
7
  <link rel="stylesheet" href="../static/final.css">
8
+ <link rel="stylesheet" href="../static/job_listings.css"> <!-- New CSS file for job listings -->
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
 
26
  <li><a href="#students" class="nav-link">Students</a></li>
27
  <li><a href="#reports" class="nav-link">Reports</a></li>
28
  <li><a href="#job-analysis" class="nav-link">Job Analysis</a></li>
29
+ <li><a href="#job-listings" class="nav-link">Job Listings</a></li> <!-- New Link -->
30
  <li><a href="#chat" class="nav-link">Chat</a></li>
31
  </ul>
32
  </nav>
 
176
  </div>
177
  </section>
178
 
179
+ <!-- New Job Listings Page -->
180
+ <section id="job-listings" class="content-section hidden">
181
+ <h2>Job Listings</h2>
182
+ <div class="job-listings-container">
183
+ <!-- Info Panel -->
184
+ <div class="info-panel card">
185
+ <h3>About Job Recommendations</h3>
186
+ <p>
187
+ <strong>Recommended Jobs:</strong> These jobs are highly aligned with your current profile, skills, and experience. Applying to these positions is likely to result in a higher success rate.
188
+ </p>
189
+ <p>
190
+ <strong>Non-Recommended Jobs:</strong> These jobs may have requirements that differ significantly from your current profile. While you are free to apply, you might need to acquire additional skills or experience to be a strong candidate.
191
+ </p>
192
+ </div>
193
+
194
+ <!-- Tabs for On-Campus / Off-Campus -->
195
+ <div class="job-listings-tabs">
196
+ <button class="tab-btn active" data-category="on-campus">On-Campus</button>
197
+ <button class="tab-btn" data-category="off-campus">Off-Campus</button>
198
+ </div>
199
+
200
+ <!-- On-Campus Listings -->
201
+ <div class="job-category-section" data-category="on-campus">
202
+ <h3>Recommended</h3>
203
+ <div class="job-listings-grid" id="on-campus-recommended-listings">
204
+ <!-- Recommended jobs will be populated here by JS -->
205
+ </div>
206
+
207
+ <h3>Non-Recommended</h3>
208
+ <div class="job-listings-grid" id="on-campus-non-recommended-listings">
209
+ <!-- Non-recommended jobs will be populated here by JS -->
210
+ </div>
211
+ </div>
212
+
213
+ <!-- Off-Campus Listings (Initially Hidden) -->
214
+ <div class="job-category-section hidden" data-category="off-campus">
215
+ <h3>Recommended</h3>
216
+ <div class="job-listings-grid" id="off-campus-recommended-listings">
217
+ <!-- Recommended jobs will be populated here by JS -->
218
+ </div>
219
+
220
+ <h3>Non-Recommended</h3>
221
+ <div class="job-listings-grid" id="off-campus-non-recommended-listings">
222
+ <!-- Non-recommended jobs will be populated here by JS -->
223
+ </div>
224
+ </div>
225
+ </div>
226
+ </section>
227
+
228
  <!-- Chatbot Interface -->
229
  <section id="chat" class="content-section hidden">
230
  <h2>Student Q&A</h2>
 
240
  </div>
241
 
242
  <script src="../static/final.js"></script>
243
+ <script src="../static/job_listings.js"></script> <!-- New JS file for job listings -->
244
  </body>
245
  </html>