husseinelsaadi Claude Opus 4.8 commited on
Commit
b5d621a
Β·
1 Parent(s): 889b393

Premium UI redesign, repo cleanup, and restored LUNA media

Browse files

- Add theme.css design system (brand tokens, Inter/Space Grotesk, glass
navbar, gradient buttons, premium cards) linked across all pages
- Cinematic dark hero + animated "How it works" pipeline on the landing page
- Rebrand the interview screen as "Interview with LUNA": her real photo as the
avatar, speaking equalizer, brand-colored bubbles/buttons (no JS changes)
- Polished closing score card and multi-column footer
- Restore the real LUNA.png + demo video (were broken Git-LFS stubs) and stop
tracking png/mp4 via LFS so the Space always has the real binaries
- Ignore the local archive/ folder; drop the unused data/merged_dataset.json
- Add docs/social-video-guide.md (LUNA explainer-video production guide)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

.gitattributes CHANGED
@@ -1,3 +1,5 @@
 
 
 
1
  *.png filter=lfs diff=lfs merge=lfs -text
2
- backend/static/images/LUNA.png filter=lfs diff=lfs merge=lfs -text
3
  *.mp4 filter=lfs diff=lfs merge=lfs -text
 
1
+ # LUNA.png (~2.4MB) and the demo .mp4 (~0.9MB) are small enough to commit directly.
2
+ # They are intentionally NOT tracked by Git LFS so the deployed Space always has the
3
+ # real binaries (an un-pushed LFS object would otherwise show a broken image).
4
  *.png filter=lfs diff=lfs merge=lfs -text
 
5
  *.mp4 filter=lfs diff=lfs merge=lfs -text
.gitignore CHANGED
@@ -1,5 +1,5 @@
1
- # Local-only archive of old laptop files (never deploy this)
2
- everything-old-in-my-laptop/
3
 
4
  # Claude / editor working dirs
5
  .claude/
 
1
+ # Local-only archive: old laptop snapshot, presentation & documentation (never deploy this)
2
+ archive/
3
 
4
  # Claude / editor working dirs
5
  .claude/
backend/static/css/theme.css ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* =====================================================================
2
+ Codingo β€” Premium design system (theme.css)
3
+ Single source of truth for the new look. Linked AFTER the legacy inline
4
+ <style> in base.html so these rules win and cascade across every page.
5
+ Direction: premium light product + cinematic dark hero/navbar/footer.
6
+ ===================================================================== */
7
+
8
+ :root {
9
+ /* Brand */
10
+ --brand-1: #6366f1; /* indigo */
11
+ --brand-2: #8b5cf6; /* violet */
12
+ --spark: #22d3ee; /* cyan accent */
13
+ --grad: linear-gradient(135deg, var(--brand-1), var(--brand-2));
14
+ --grad-soft: linear-gradient(135deg, rgba(99,102,241,.12), rgba(139,92,246,.12));
15
+
16
+ /* Neutrals (light product surface) */
17
+ --bg: #f5f6fb;
18
+ --surface: #ffffff;
19
+ --ink: #0b1020;
20
+ --muted: #5b6478;
21
+ --line: #e7e9f2;
22
+
23
+ /* Night (hero / navbar / footer) */
24
+ --night: #0b1020;
25
+ --night-2: #141a2e;
26
+
27
+ /* Radius + shadow + spacing scale */
28
+ --r-sm: 12px;
29
+ --r: 18px;
30
+ --r-lg: 26px;
31
+ --shadow-sm: 0 2px 8px rgba(13, 20, 40, .06);
32
+ --shadow: 0 12px 30px rgba(13, 20, 40, .08);
33
+ --shadow-lg: 0 24px 60px rgba(13, 20, 40, .14);
34
+
35
+ /* Legacy variable names remapped so existing rules adopt the new palette */
36
+ --primary: #6366f1;
37
+ --secondary: #8b5cf6;
38
+ --accent: #22d3ee;
39
+ --light: #f5f6fb;
40
+ --dark: #0b1020;
41
+ }
42
+
43
+ /* ---- Typography ---------------------------------------------------- */
44
+ * { font-family: 'Inter', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
45
+ h1, h2, h3, .logo, .section-title h2, .hero h1, .cta h2 {
46
+ font-family: 'Space Grotesk', 'Inter', sans-serif;
47
+ letter-spacing: -0.02em;
48
+ }
49
+ body {
50
+ background: var(--bg);
51
+ color: var(--ink);
52
+ -webkit-font-smoothing: antialiased;
53
+ text-rendering: optimizeLegibility;
54
+ }
55
+
56
+ /* ---- Glass navbar (dark, keeps white nav buttons working) --------- */
57
+ header {
58
+ background: rgba(11, 16, 32, .72) !important;
59
+ -webkit-backdrop-filter: saturate(160%) blur(14px);
60
+ backdrop-filter: saturate(160%) blur(14px);
61
+ border-bottom: 1px solid rgba(255, 255, 255, .08);
62
+ box-shadow: 0 8px 30px rgba(0, 0, 0, .25) !important;
63
+ padding: .85rem 1rem !important;
64
+ }
65
+ .logo { font-weight: 700; }
66
+ .logo-part2 { color: var(--spark); font-style: normal; animation: none; text-shadow: 0 0 18px rgba(34, 211, 238, .55); }
67
+ .logo-part3 { color: #c4b5fd; }
68
+ .welcome-message { background: rgba(255, 255, 255, .08); border-radius: 999px; }
69
+
70
+ /* ---- Buttons ------------------------------------------------------- */
71
+ .btn {
72
+ border-radius: 999px !important;
73
+ font-weight: 600;
74
+ letter-spacing: .01em;
75
+ padding: .6rem 1.4rem !important;
76
+ }
77
+ .btn-primary {
78
+ background: var(--grad) !important;
79
+ color: #fff !important;
80
+ box-shadow: 0 10px 24px rgba(99, 102, 241, .35) !important;
81
+ }
82
+ .btn-primary:hover { box-shadow: 0 14px 30px rgba(99, 102, 241, .45) !important; }
83
+ .btn-outline {
84
+ background: rgba(255, 255, 255, .04) !important;
85
+ border: 1.5px solid rgba(255, 255, 255, .28) !important;
86
+ color: #fff !important;
87
+ }
88
+ .btn-outline:hover { background: rgba(255, 255, 255, .12) !important; }
89
+ .btn-logout {
90
+ border: 1.5px solid rgba(34, 211, 238, .6) !important;
91
+ color: var(--spark) !important;
92
+ border-radius: 999px !important;
93
+ }
94
+ .btn-logout:hover { background: var(--spark) !important; color: var(--night) !important; }
95
+
96
+ /* ---- Cinematic dark hero ------------------------------------------ */
97
+ .hero {
98
+ background:
99
+ radial-gradient(900px 500px at 15% 10%, rgba(99, 102, 241, .35), transparent 60%),
100
+ radial-gradient(800px 500px at 85% 20%, rgba(139, 92, 246, .30), transparent 60%),
101
+ radial-gradient(700px 500px at 50% 110%, rgba(34, 211, 238, .20), transparent 60%),
102
+ linear-gradient(180deg, var(--night), var(--night-2)) !important;
103
+ color: #fff !important;
104
+ padding: 5.5rem 1rem 6rem !important;
105
+ border-bottom: 1px solid rgba(255, 255, 255, .06);
106
+ }
107
+ .hero::before { opacity: .5; }
108
+ .hero h1 { font-size: clamp(2.1rem, 5vw, 3.4rem) !important; font-weight: 700; }
109
+ .hero p { color: rgba(255, 255, 255, .82) !important; font-size: 1.15rem !important; }
110
+
111
+ /* LUNA avatar glow refined to brand */
112
+ .luna-avatar { border: 3px solid rgba(255, 255, 255, .85) !important;
113
+ box-shadow: 0 18px 50px rgba(0, 0, 0, .45), 0 0 50px rgba(139, 92, 246, .55) !important; }
114
+ .luna-glow { background: radial-gradient(circle, rgba(139, 92, 246, .85) 0%, rgba(34, 211, 238, 0) 70%) !important; }
115
+
116
+ /* Pills used in hero/eyebrow */
117
+ .eyebrow {
118
+ display: inline-flex; align-items: center; gap: .5rem;
119
+ padding: .4rem 1rem; margin-bottom: 1.25rem;
120
+ border-radius: 999px; font-size: .85rem; font-weight: 600;
121
+ color: #e9e9ff; background: rgba(255, 255, 255, .08);
122
+ border: 1px solid rgba(255, 255, 255, .16);
123
+ }
124
+ .eyebrow .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--spark);
125
+ box-shadow: 0 0 10px var(--spark); animation: pulse 2s ease-in-out infinite alternate; }
126
+
127
+ /* ---- Sections / titles -------------------------------------------- */
128
+ .content-section, .features { background: var(--bg) !important; }
129
+ .section-title h2 { color: var(--ink) !important; font-size: 2.3rem !important; }
130
+ .section-title h2::after { background: var(--grad) !important; height: 4px !important; border-radius: 4px; }
131
+ .section-title p { color: var(--muted) !important; font-size: 1.05rem; }
132
+
133
+ /* ---- Cards (premium light) ---------------------------------------- */
134
+ .feature-card, .card, .job-card {
135
+ background: var(--surface) !important;
136
+ border: 1px solid var(--line) !important;
137
+ border-radius: var(--r) !important;
138
+ box-shadow: var(--shadow-sm) !important;
139
+ transition: transform .35s ease, box-shadow .35s ease, border-color .35s ease !important;
140
+ }
141
+ .feature-card:hover, .card:hover, .job-card:hover {
142
+ transform: translateY(-8px) !important;
143
+ box-shadow: var(--shadow-lg) !important;
144
+ border-color: rgba(99, 102, 241, .35) !important;
145
+ }
146
+ .feature-icon {
147
+ background: var(--grad-soft) !important;
148
+ font-size: 2.2rem !important;
149
+ color: var(--brand-1) !important;
150
+ }
151
+ .feature-content h3 { color: var(--ink) !important; }
152
+ .feature-content h3::after { background: var(--grad) !important; }
153
+
154
+ /* Job card headers adopt the brand gradient */
155
+ .job-header, .card-header { background: var(--grad) !important; }
156
+
157
+ /* ---- CTA band ------------------------------------------------------ */
158
+ .cta {
159
+ background:
160
+ radial-gradient(700px 400px at 20% 0%, rgba(34, 211, 238, .25), transparent 60%),
161
+ linear-gradient(135deg, var(--brand-2), var(--brand-1)) !important;
162
+ }
163
+
164
+ /* ---- Footer (night) ----------------------------------------------- */
165
+ footer { background: var(--night) !important; border-top: 1px solid rgba(255, 255, 255, .06); }
166
+ .footer-col h3 { color: #fff !important; }
167
+ .footer-col h3::after { background: var(--grad) !important; }
168
+ .social-links a:hover { background: var(--grad) !important; color: #fff !important; }
169
+
170
+ /* ---- Floating chatbot button -------------------------------------- */
171
+ #chatbot-nav { background: var(--grad) !important; box-shadow: 0 10px 26px rgba(99, 102, 241, .5) !important; }
172
+ #chatbot-nav:hover { transform: scale(1.08) !important; }
173
+ #chat-messages .user-bubble { background: var(--grad) !important; }
174
+
175
+ /* =====================================================================
176
+ "How it works" animated pipeline (used on the landing page)
177
+ Pure CSS reveal β€” auto-plays on load, films beautifully.
178
+ ===================================================================== */
179
+ .pipeline { background: linear-gradient(180deg, #fff, var(--bg)); padding: 5rem 1rem; }
180
+ .pipe-track {
181
+ display: grid;
182
+ grid-template-columns: repeat(5, 1fr);
183
+ gap: 1rem;
184
+ max-width: 1100px;
185
+ margin: 0 auto;
186
+ position: relative;
187
+ }
188
+ .pipe-track::before {
189
+ content: ''; position: absolute; top: 46px; left: 8%; right: 8%; height: 3px;
190
+ background: linear-gradient(90deg, rgba(99,102,241,.15), rgba(139,92,246,.5), rgba(34,211,238,.15));
191
+ border-radius: 3px; z-index: 0;
192
+ }
193
+ .pipe-step {
194
+ position: relative; z-index: 1; text-align: center; padding: 0 .5rem;
195
+ opacity: 0; transform: translateY(18px);
196
+ animation: pipeReveal .7s ease forwards;
197
+ }
198
+ .pipe-step:nth-child(1) { animation-delay: .15s; }
199
+ .pipe-step:nth-child(2) { animation-delay: .40s; }
200
+ .pipe-step:nth-child(3) { animation-delay: .65s; }
201
+ .pipe-step:nth-child(4) { animation-delay: .90s; }
202
+ .pipe-step:nth-child(5) { animation-delay: 1.15s; }
203
+ .pipe-node {
204
+ width: 92px; height: 92px; margin: 0 auto 1.1rem; border-radius: 24px;
205
+ display: grid; place-items: center; font-size: 2.1rem;
206
+ color: #fff; background: var(--grad);
207
+ box-shadow: 0 14px 30px rgba(99, 102, 241, .35);
208
+ position: relative;
209
+ }
210
+ .pipe-node::after {
211
+ content: ''; position: absolute; inset: -6px; border-radius: 28px;
212
+ border: 2px solid rgba(139, 92, 246, .4);
213
+ animation: pipeHalo 2.4s ease-in-out infinite;
214
+ }
215
+ .pipe-step:nth-child(even) .pipe-node::after { animation-delay: 1.2s; }
216
+ .pipe-step h4 { font-family: 'Space Grotesk', sans-serif; color: var(--ink); margin-bottom: .4rem; font-size: 1.05rem; }
217
+ .pipe-step p { color: var(--muted); font-size: .92rem; line-height: 1.45; }
218
+ .pipe-num {
219
+ display: inline-block; font-size: .75rem; font-weight: 700; color: var(--brand-1);
220
+ background: var(--grad-soft); border-radius: 999px; padding: .15rem .7rem; margin-bottom: .8rem;
221
+ }
222
+
223
+ @keyframes pipeReveal { to { opacity: 1; transform: translateY(0); } }
224
+ @keyframes pipeHalo {
225
+ 0%, 100% { transform: scale(1); opacity: .5; }
226
+ 50% { transform: scale(1.08); opacity: 0; }
227
+ }
228
+
229
+ @media (max-width: 860px) {
230
+ .pipe-track { grid-template-columns: 1fr 1fr; }
231
+ .pipe-track::before { display: none; }
232
+ }
233
+ @media (max-width: 480px) {
234
+ .pipe-track { grid-template-columns: 1fr; }
235
+ }
backend/templates/base.html CHANGED
@@ -833,6 +833,11 @@
833
  outline: none;
834
  }
835
  </style>
 
 
 
 
 
836
  </head>
837
  <body>
838
  <header>
@@ -899,16 +904,26 @@
899
  <div class="footer-grid">
900
  <div class="footer-col">
901
  <h3>Codingo</h3>
902
- <p>AI-powered recruitment platform that revolutionizes how companies hire technical talent.</p>
903
  <div class="social-links">
904
  <a href="#"><span>f</span></a>
905
  <a href="#"><span>t</span></a>
906
  <a href="#"><span>in</span></a>
907
  </div>
908
  </div>
 
 
 
 
 
 
 
 
 
 
909
  </div>
910
  <div class="copyright">
911
- <p>&copy; 2025 Codingo. All rights reserved.</p>
912
  </div>
913
  </div>
914
  </footer>
 
833
  outline: none;
834
  }
835
  </style>
836
+ <!-- Premium design system (loads after the legacy styles so it wins) -->
837
+ <link rel="preconnect" href="https://fonts.googleapis.com">
838
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
839
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@500;600;700&display=swap" rel="stylesheet">
840
+ <link rel="stylesheet" href="{{ url_for('static', filename='css/theme.css') }}">
841
  </head>
842
  <body>
843
  <header>
 
904
  <div class="footer-grid">
905
  <div class="footer-col">
906
  <h3>Codingo</h3>
907
+ <p>AI-powered recruitment platform that revolutionizes how companies hire technical talent β€” powered by LUNA, your AI recruiter.</p>
908
  <div class="social-links">
909
  <a href="#"><span>f</span></a>
910
  <a href="#"><span>t</span></a>
911
  <a href="#"><span>in</span></a>
912
  </div>
913
  </div>
914
+ <div class="footer-col">
915
+ <h3>Platform</h3>
916
+ <p><a href="{{ url_for('jobs') }}" style="color:#cfd3e6;text-decoration:none;">Browse Jobs</a></p>
917
+ <p><a href="{{ url_for('index') }}#how" style="color:#cfd3e6;text-decoration:none;">How it works</a></p>
918
+ <p><a href="{{ url_for('index') }}#features" style="color:#cfd3e6;text-decoration:none;">Features</a></p>
919
+ </div>
920
+ <div class="footer-col">
921
+ <h3>Meet LUNA</h3>
922
+ <p style="color:#cfd3e6;">An AI recruiter that screens CVs, runs voice interviews, and scores answers against a real question database β€” fairly and at scale.</p>
923
+ </div>
924
  </div>
925
  <div class="copyright">
926
+ <p>&copy; 2026 Codingo. All rights reserved.</p>
927
  </div>
928
  </div>
929
  </footer>
backend/templates/closing.html CHANGED
@@ -13,12 +13,40 @@
13
  <img src="{{ url_for('static', filename='images/LUNA.png') }}" alt="LUNA AI Assistant">
14
  </div>
15
  </div>
16
- <h2 style="margin-top: 1rem;">Thank you for your time,<br>we will get back to you if shortlisted.</h2>
17
- <p style="margin-top: 0.5rem; font-size: 1rem;">
18
- Overall performance: {{ score }} ({{ feedback_summary }})
19
- </p>
 
 
 
 
20
  </div>
21
  </div>
22
  </section>
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  {% endblock %}
 
13
  <img src="{{ url_for('static', filename='images/LUNA.png') }}" alt="LUNA AI Assistant">
14
  </div>
15
  </div>
16
+ <span class="eyebrow"><span class="dot"></span> Interview Complete</span>
17
+ <h2 style="margin-top: 1rem;">Thank you for your time,<br>we'll get back to you if shortlisted.</h2>
18
+ <div class="score-card">
19
+ <span class="score-label">Overall performance</span>
20
+ <span class="score-value">{{ score }}</span>
21
+ <span class="score-summary">{{ feedback_summary }}</span>
22
+ </div>
23
+ <a href="{{ url_for('jobs') }}" class="btn btn-outline" style="margin-top:1.75rem;">Back to Jobs</a>
24
  </div>
25
  </div>
26
  </section>
27
 
28
+ <style>
29
+ .score-card {
30
+ margin-top: 1.5rem;
31
+ display: inline-flex;
32
+ flex-direction: column;
33
+ align-items: center;
34
+ gap: .35rem;
35
+ padding: 1.5rem 2.5rem;
36
+ border-radius: var(--r, 18px);
37
+ background: rgba(255, 255, 255, .07);
38
+ border: 1px solid rgba(255, 255, 255, .16);
39
+ -webkit-backdrop-filter: blur(10px);
40
+ backdrop-filter: blur(10px);
41
+ box-shadow: 0 18px 50px rgba(0, 0, 0, .35);
42
+ }
43
+ .score-label { color: rgba(255, 255, 255, .7); font-size: .85rem; text-transform: uppercase; letter-spacing: .08em; }
44
+ .score-value {
45
+ font-family: 'Space Grotesk', sans-serif; font-size: 2.4rem; font-weight: 700; line-height: 1.1;
46
+ background: linear-gradient(135deg, #c4b5fd, #22d3ee);
47
+ -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent;
48
+ }
49
+ .score-summary { color: rgba(255, 255, 255, .82); font-size: 1rem; max-width: 420px; }
50
+ </style>
51
+
52
  {% endblock %}
backend/templates/index.html CHANGED
@@ -12,9 +12,10 @@
12
  <img src="{{ url_for('static', filename='images/LUNA.png') }}" alt="LUNA AI Assistant">
13
  </div>
14
  </div>
15
- <h1>Meet LUNA, Your AI Recruitment Assistant</h1>
16
- <p>Revolutionize your hiring process with AI-powered candidate screening, automated interviews, and
17
- intelligent skill matching to find your perfect technical talent.</p>
 
18
  <div class="hero-buttons">
19
  <a href="{{ url_for('jobs') }}" class="btn btn-primary">Find Jobs</a>
20
  <a href="https://www.youtube.com/watch?v=P6HG27fsJgU" class="btn btn-outline">Watch Demo</a>
@@ -64,6 +65,45 @@
64
  </div>
65
  </section>
66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  <section class="cta">
68
  <div class="container">
69
  <h2>Ready to Transform Your Technical Hiring?</h2>
 
12
  <img src="{{ url_for('static', filename='images/LUNA.png') }}" alt="LUNA AI Assistant">
13
  </div>
14
  </div>
15
+ <span class="eyebrow"><span class="dot"></span> AI-Powered Recruitment</span>
16
+ <h1>Meet LUNA, Your AI Recruiter</h1>
17
+ <p>Screen CVs, run real voice interviews, and score every answer against a live question
18
+ database β€” so you find the right technical talent faster, and fairer.</p>
19
  <div class="hero-buttons">
20
  <a href="{{ url_for('jobs') }}" class="btn btn-primary">Find Jobs</a>
21
  <a href="https://www.youtube.com/watch?v=P6HG27fsJgU" class="btn btn-outline">Watch Demo</a>
 
65
  </div>
66
  </section>
67
 
68
+ <section class="pipeline" id="how">
69
+ <div class="section-title">
70
+ <h2>How Codingo Works</h2>
71
+ <p>From job post to ranked shortlist β€” one intelligent, automated pipeline powered by LUNA.</p>
72
+ </div>
73
+ <div class="pipe-track">
74
+ <div class="pipe-step">
75
+ <div class="pipe-node">πŸ“</div>
76
+ <span class="pipe-num">Step 1</span>
77
+ <h4>Post a Job</h4>
78
+ <p>Recruiters define the role, skills, and how many questions the interview should cover.</p>
79
+ </div>
80
+ <div class="pipe-step">
81
+ <div class="pipe-node">πŸ“„</div>
82
+ <span class="pipe-num">Step 2</span>
83
+ <h4>Apply &amp; Parse CV</h4>
84
+ <p>Candidates upload a resume β€” Codingo auto-extracts skills, education, and experience.</p>
85
+ </div>
86
+ <div class="pipe-step">
87
+ <div class="pipe-node">πŸŽ™οΈ</div>
88
+ <span class="pipe-num">Step 3</span>
89
+ <h4>LUNA Interviews</h4>
90
+ <p>LUNA conducts a real voice interview, asking role-specific questions and follow-ups.</p>
91
+ </div>
92
+ <div class="pipe-step">
93
+ <div class="pipe-node">🧠</div>
94
+ <span class="pipe-num">Step 4</span>
95
+ <h4>Score from the Database</h4>
96
+ <p>Every answer is evaluated against a live question bank of thousands of Q&amp;A pairs.</p>
97
+ </div>
98
+ <div class="pipe-step">
99
+ <div class="pipe-node">πŸ†</div>
100
+ <span class="pipe-num">Step 5</span>
101
+ <h4>Rank Candidates</h4>
102
+ <p>The recruiter dashboard ranks applicants by skill match and interview performance.</p>
103
+ </div>
104
+ </div>
105
+ </section>
106
+
107
  <section class="cta">
108
  <div class="container">
109
  <h2>Ready to Transform Your Technical Hiring?</h2>
backend/templates/interview.html CHANGED
@@ -423,6 +423,78 @@
423
  display: none;
424
  }
425
  </style>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
426
  </head>
427
 
428
  <body>
@@ -431,8 +503,11 @@
431
  <div class="question-counter">
432
  Question <span id="currentQuestionNum">1</span> of <span id="totalQuestions">{{ job.num_questions }}</span>
433
  </div>
434
- <h1>πŸ€– AI Interview Assistant</h1>
435
- <p>Answer thoughtfully and take your time</p>
 
 
 
436
  </div>
437
 
438
  <div class="chat-area" id="chatArea">
 
423
  display: none;
424
  }
425
  </style>
426
+
427
+ <!-- Premium theme: fonts + design tokens, plus interview-specific overrides -->
428
+ <link rel="preconnect" href="https://fonts.googleapis.com">
429
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
430
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@500;600;700&display=swap" rel="stylesheet">
431
+ <link rel="stylesheet" href="{{ url_for('static', filename='css/theme.css') }}">
432
+ <style>
433
+ /* ---- Interview screen β€” premium "Interview with LUNA" look ---- */
434
+ body {
435
+ font-family: 'Inter', 'Segoe UI', sans-serif;
436
+ background:
437
+ radial-gradient(800px 500px at 12% 8%, rgba(99, 102, 241, .45), transparent 60%),
438
+ radial-gradient(700px 500px at 88% 12%, rgba(139, 92, 246, .40), transparent 60%),
439
+ radial-gradient(700px 500px at 50% 110%, rgba(34, 211, 238, .25), transparent 60%),
440
+ linear-gradient(180deg, #0b1020, #141a2e) !important;
441
+ }
442
+
443
+ .interview-container {
444
+ border-radius: 24px;
445
+ border: 1px solid rgba(255, 255, 255, .6);
446
+ box-shadow: 0 30px 80px rgba(0, 0, 0, .45);
447
+ }
448
+
449
+ .header {
450
+ background: linear-gradient(135deg, #6366f1, #8b5cf6) !important;
451
+ padding: 22px 20px 26px;
452
+ }
453
+ .header h1 { font-family: 'Space Grotesk', sans-serif; font-weight: 700; }
454
+ .question-counter {
455
+ background: rgba(255, 255, 255, .18);
456
+ border: 1px solid rgba(255, 255, 255, .25);
457
+ font-weight: 600;
458
+ }
459
+
460
+ /* LUNA's real face replaces the "AI" text in every avatar bubble */
461
+ .ai-avatar {
462
+ background-image: url("{{ url_for('static', filename='images/LUNA.png') }}") !important;
463
+ background-size: cover !important;
464
+ background-position: center top !important;
465
+ color: transparent !important;
466
+ font-size: 0 !important;
467
+ border: 2px solid rgba(139, 92, 246, .6);
468
+ box-shadow: 0 6px 18px rgba(99, 102, 241, .35);
469
+ }
470
+ .ai-avatar.talking::before { background: rgba(139, 92, 246, .35); }
471
+
472
+ /* Speaking equalizer shown under the title while LUNA talks */
473
+ .voice-wave { display: flex; align-items: flex-end; justify-content: center; gap: 4px; height: 22px; margin-top: 10px; }
474
+ .voice-wave span {
475
+ width: 4px; height: 6px; border-radius: 4px; background: rgba(255, 255, 255, .85);
476
+ animation: eq 1.1s ease-in-out infinite;
477
+ }
478
+ .voice-wave span:nth-child(2) { animation-delay: .15s; }
479
+ .voice-wave span:nth-child(3) { animation-delay: .30s; }
480
+ .voice-wave span:nth-child(4) { animation-delay: .45s; }
481
+ .voice-wave span:nth-child(5) { animation-delay: .60s; }
482
+ .voice-wave span:nth-child(6) { animation-delay: .75s; }
483
+ .voice-wave span:nth-child(7) { animation-delay: .90s; }
484
+ @keyframes eq { 0%, 100% { height: 6px; } 50% { height: 20px; } }
485
+
486
+ /* User answer bubbles + primary button adopt the brand gradient */
487
+ .user-bubble { background: linear-gradient(135deg, #6366f1, #8b5cf6) !important; }
488
+ .user-bubble::before { border-left-color: #6366f1 !important; }
489
+ .btn-primary { background: linear-gradient(135deg, #6366f1, #8b5cf6) !important; border-radius: 999px !important; }
490
+ .btn-secondary { border-radius: 999px !important; }
491
+ .btn { border-radius: 999px; }
492
+
493
+ .transcript-area:focus { border-color: #8b5cf6 !important; }
494
+ .summary-item { border-left-color: #8b5cf6 !important; }
495
+ .evaluation-score { background: linear-gradient(135deg, #6366f1, #8b5cf6) !important; }
496
+ .summary-panel { border: 1px solid rgba(255, 255, 255, .6); }
497
+ </style>
498
  </head>
499
 
500
  <body>
 
503
  <div class="question-counter">
504
  Question <span id="currentQuestionNum">1</span> of <span id="totalQuestions">{{ job.num_questions }}</span>
505
  </div>
506
+ <h1>πŸŒ™ Interview with LUNA</h1>
507
+ <p>Your AI recruiter β€” answer thoughtfully and take your time</p>
508
+ <div class="voice-wave" aria-hidden="true">
509
+ <span></span><span></span><span></span><span></span><span></span><span></span><span></span>
510
+ </div>
511
  </div>
512
 
513
  <div class="chat-area" id="chatArea">
data/merged_dataset.json DELETED
The diff for this file is too large to render. See raw diff
 
docs/social-video-guide.md ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Codingo β€” LUNA Explainer Video: Production Guide
2
+
3
+ A complete, do-it-yourself plan for a short social-media video that shows off Codingo for your
4
+ final-year project. Your AI recruiter **LUNA** narrates and explains the recruitment pipeline, with
5
+ screen recordings of the (now polished) real app.
6
+
7
+ > You generate the actual video β€” this guide gives you the script, storyboard, exact tools, and
8
+ > settings. Nothing here needs code.
9
+
10
+ ---
11
+
12
+ ## 1. Format & scope
13
+
14
+ | Setting | Recommendation |
15
+ |---|---|
16
+ | Aspect ratio | **9:16 vertical** (Reels / TikTok / LinkedIn / Shorts). Also export a 16:9 version for YouTube if you want. |
17
+ | Length | **45–60 seconds** (attention drops fast on social). Optionally also cut a **15–20s teaser**. |
18
+ | Resolution | 1080Γ—1920, 30fps |
19
+ | Vibe | Clean, premium, confident β€” "a real AI product." Calm tech music, captions on. |
20
+ | Structure | Hook β†’ Meet LUNA β†’ The 5-step pipeline β†’ Proof (real app) β†’ Call to action |
21
+
22
+ ---
23
+
24
+ ## 2. Which tool does what (read this first)
25
+
26
+ There's confusion about "Veo vs talking avatar" β€” here's the truth, because they do different jobs:
27
+
28
+ | Job in your video | Right tool | Why |
29
+ |---|---|---|
30
+ | **LUNA's face talking** (her exact photo, lip-synced to your script) | **D-ID** or **HeyGen** (photo/avatar mode) | These are built to make *one specific face* speak a script. Upload `LUNA.png`, paste the script, pick a voice β†’ you get LUNA talking. |
31
+ | **Cinematic b-roll** (abstract "AI" shots, neural-network visuals, a modern office) | **Google Veo 3** (via Google Flow / Gemini) or **Runway / Pika** | Generative text-to-video. Great for 2–4s mood shots **between** sections. **Do not** expect Veo to make LUNA's exact face reliably speak your lines β€” that's not what it's for. |
32
+ | **The product itself** (the hero, the pipeline animation, a live interview, the dashboard) | **Screen recording** of your polished app | This is the backbone and the proof. Most of the video should be this. |
33
+ | **Voice** (if not using HeyGen's built-in) | **ElevenLabs** (most natural) | Or match the app's own voice, Microsoft `en-US-AriaNeural`. |
34
+ | **Edit / captions / music** | **CapCut** (free, fastest for social) or Premiere/DaVinci | Auto-captions, beat-synced cuts, export presets for each platform. |
35
+
36
+ **Recommended minimal stack:** HeyGen (talking LUNA) + your screen recordings + CapCut (edit). Add Veo
37
+ shots only if you want extra polish.
38
+
39
+ `LUNA.png` lives at `backend/static/images/LUNA.png` β€” that's the file you upload to the avatar tool.
40
+
41
+ ---
42
+
43
+ ## 3. The narration script (LUNA, first person β€” ~130 words, ~55s)
44
+
45
+ > Tone: warm, confident, professional. Pauses marked with "β€”".
46
+
47
+ **[Hook]**
48
+ "Hiring technical talent is slow, biased, and exhausting. β€” I'm LUNA, and I fix that."
49
+
50
+ **[Meet LUNA]**
51
+ "I'm an AI recruiter built into Codingo β€” and I run the entire hiring pipeline."
52
+
53
+ **[Pipeline β€” one line per step]**
54
+ "It starts when a recruiter posts a job. β€”
55
+ A candidate applies, and I instantly parse their CV β€” skills, education, experience. β€”
56
+ Then I run a real voice interview, asking role-specific questions and follow-ups. β€”
57
+ Every answer is scored against a live database of thousands of interview questions. β€”
58
+ And finally, I rank every candidate on the recruiter's dashboard β€” by skill match and performance."
59
+
60
+ **[Proof / CTA]**
61
+ "Faster. Fairer. Fully automated. β€” This is Codingo. The future of recruitment β€” and it's already here."
62
+
63
+ *(Need 30s? Keep Hook + the 5 pipeline lines + the last sentence.)*
64
+
65
+ ---
66
+
67
+ ## 4. Shot-by-shot storyboard
68
+
69
+ | # | Time | Script line | What's on screen | Source |
70
+ |---|------|-------------|------------------|--------|
71
+ | 1 | 0–4s | "Hiring … I fix that." | LUNA talking, centered, with a soft gradient background | HeyGen/D-ID (LUNA.png) |
72
+ | 2 | 4–8s | "I'm an AI recruiter … entire hiring pipeline." | Cut to the **landing hero** (dark, glowing LUNA), slow zoom-in | Screen recording |
73
+ | 3 | 8–12s | "It starts when a recruiter posts a job." | The **Post Job** form being filled / submitted | Screen recording |
74
+ | 4 | 12–17s | "A candidate applies, and I instantly parse their CV…" | **Apply** page β†’ click "Parse Resume" β†’ fields auto-fill | Screen recording |
75
+ | 5 | 17–26s | "Then I run a real voice interview…" | **Interview with LUNA** screen β€” LUNA avatar talking, waveform, a question appears, mic records | Screen recording (the star shot) |
76
+ | 6 | 26–34s | "Every answer is scored against a live database…" | The animated **"How it works"** pipeline section scrolling/playing; optionally overlay a Veo "data/AI" b-roll | App + optional Veo |
77
+ | 7 | 34–42s | "I rank every candidate on the dashboard…" | **Dashboard** with ranked candidates, scores highlighted | Screen recording |
78
+ | 8 | 42–55s | "Faster. Fairer… it's already here." | Back to LUNA talking; end card with "Codingo" logo + your name/uni | HeyGen + CapCut title |
79
+
80
+ **Pro tip:** record each app screen at high resolution on desktop, then reframe/crop to vertical in
81
+ CapCut with a slow Ken-Burns zoom so static screens feel alive.
82
+
83
+ ---
84
+
85
+ ## 5. Screen-recording shot list (capture these from the live app)
86
+
87
+ Record on the deployed Space (or locally) with a clean browser (no bookmarks bar, incognito):
88
+ 1. **Hero** β€” load the homepage, let LUNA's glow animation breathe (3–4s).
89
+ 2. **How it works** β€” scroll slowly so the 5 steps animate in.
90
+ 3. **Post Job** β€” fill role/skills, hit submit (speed up 2Γ— in edit).
91
+ 4. **Apply + CV parse** β€” upload a resume, click parse, show fields filling.
92
+ 5. **Interview** β€” start an interview; capture LUNA speaking (waveform active), a question, and the mic recording state. This is your money shot.
93
+ 6. **Closing** β€” the score card with the glowing result.
94
+ 7. **Dashboard** β€” the ranked candidate list.
95
+
96
+ macOS screen record: **Cmd+Shift+5**. Record system audio off (you'll add LUNA's voice + music in edit).
97
+
98
+ ---
99
+
100
+ ## 6. Music, captions, export
101
+
102
+ - **Music:** calm, modern, "tech product" β€” search CapCut/Epidemic Sound for "ambient tech / corporate inspire." Keep it low under LUNA's voice (-18 dB).
103
+ - **Captions:** auto-generate in CapCut, then fix LUNA/Codingo spelling. Big, bold, centered, one line at a time β€” most people watch muted.
104
+ - **Brand:** end card with the Codingo wordmark colors (indigo `#6366F1` β†’ violet `#8B5CF6`, cyan spark `#22D3EE`) and "Final Year Project β€” <your name>, <university>".
105
+ - **Export:** 1080Γ—1920, H.264, 30fps. Make a 16:9 1920Γ—1080 version too for YouTube/LinkedIn landscape.
106
+
107
+ ---
108
+
109
+ ## 7. Tools & pricing (quick reference)
110
+
111
+ | Tool | Use | Cost |
112
+ |---|---|---|
113
+ | **HeyGen** | Talking LUNA (photo avatar + voice) | Free trial (watermarked, short); ~$24/mo Creator removes watermark |
114
+ | **D-ID** | Talking LUNA alternative | Free trial; ~$5.9/mo+ |
115
+ | **ElevenLabs** | Premium natural voice | Free tier (limited chars); ~$5/mo Starter |
116
+ | **Google Veo 3** (Flow/Gemini) | Cinematic b-roll only | Via Google AI / Gemini Advanced subscription |
117
+ | **Runway / Pika** | B-roll alternative | Free tier + paid |
118
+ | **CapCut** | Edit, captions, export | Free (Pro optional) |
119
+
120
+ **Cheapest path that still looks pro:** HeyGen free trial for 2–3 short LUNA clips + screen recordings
121
+ + CapCut. If the watermark bothers you for the final post, one month of HeyGen Creator (~$24) covers it.
122
+
123
+ ---
124
+
125
+ ## 8. 60-minute production checklist
126
+
127
+ 1. ☐ Generate LUNA's talking clips in HeyGen (paste script section by section; pick a warm female voice).
128
+ 2. ☐ Screen-record the 7 app shots above.
129
+ 3. ☐ Drop everything into CapCut on a 9:16 timeline; lay LUNA's voice as the spine.
130
+ 4. ☐ Place talking-LUNA at the start/end, app recordings in the middle (follow the storyboard table).
131
+ 5. ☐ Add music (low), auto-captions (fix names), and the end card.
132
+ 6. ☐ Export 1080Γ—1920; watch once muted to confirm captions tell the whole story.
133
+ 7. ☐ Post. 🎬