Repository navigation
Expand file tree
/
Copy pathwork.html
More file actions
494 lines (446 loc) · 22.4 KB
/
Copy pathwork.html
File metadata and controls
494 lines (446 loc) · 22.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Selected Work — Lakshya Agarwal</title>
<meta name="description" content="Four projects examined end to end: the problem, what was built, the stack, what was learned, and the limitation each one still carries.">
<meta name="theme-color" content="#070b12">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' fill='%23070b12'/%3E%3Crect x='11' y='11' width='10' height='10' fill='%2338bdf8' transform='rotate(45 16 16)'/%3E%3C/svg%3E">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;600&family=Newsreader:opsz,wght@6..72,300;6..72,400;6..72,500&display=swap">
<script>document.documentElement.classList.add("js");</script>
<link rel="stylesheet" href="./assets/css/site.css">
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<header class="nav">
<div class="nav-inner">
<a class="brand" href="./index.html">
<span class="mark" aria-hidden="true"></span>
Lakshya Agarwal
</a>
<button class="nav-toggle" type="button" aria-expanded="false" aria-controls="nav-links">Menu</button>
<nav class="nav-links" id="nav-links" aria-label="Primary">
<a href="./index.html">Home</a>
<a href="./work.html" aria-current="page">Work</a>
<a href="./journal.html">Journal</a>
<a href="./about.html">About</a>
<a href="./resume.html">Resume</a>
</nav>
</div>
</header>
<nav class="rail" aria-label="Case index">
<a href="#rinky"><span class="dot" aria-hidden="true"></span>01</a>
<a href="#attendance"><span class="dot" aria-hidden="true"></span>02</a>
<a href="#adityanet"><span class="dot" aria-hidden="true"></span>03</a>
<a href="#astra"><span class="dot" aria-hidden="true"></span>04</a>
<a href="#stack"><span class="dot" aria-hidden="true"></span>05</a>
</nav>
<main id="main">
<section class="hero short">
<div class="hero-inner shell">
<div class="kicker" data-reveal="line">
<span class="num">SELECTED WORK</span>
<span class="rule" aria-hidden="true"></span>
</div>
<h1 class="display" data-reveal="line" style="--reveal-delay:80ms">The evidence.</h1>
<p class="lede mt-md" data-reveal="line" style="--reveal-delay:160ms">
Four projects, read the way a reviewer would read them — the problem, what I actually
built, the stack, what it taught me, and the limitation it still carries. One of them is
live and serving a real business. Nothing is described as more finished than it is.
</p>
<div class="hero-meta" data-reveal="line" style="--reveal-delay:240ms">
<span><b>4</b> cases</span>
<span><b>1</b> in production</span>
<span><b>2</b> solo builds</span>
<span><b>2</b> open-source contributions</span>
</div>
</div>
</section>
<!-- ======================================================== CASE 01 -->
<div class="case-bar">
<nav class="shell case-bar-inner" aria-label="Case index">
<a href="#rinky"><b>01</b> Rinky Commerce</a>
<a href="#attendance"><b>02</b> Facial Attendance</a>
<a href="#adityanet"><b>03</b> AdityaNet</a>
<a href="#astra"><b>04</b> ASTRA</a>
<a href="#stack"><b>05</b> Tooling</a>
</nav>
</div>
<section class="section no-rule">
<div class="shell">
<article class="case" id="rinky" data-reveal>
<div class="case-head">
<div>
<div class="case-index">CASE <b>01</b> / 04</div>
<h2 class="h2 case-title">Rinky Commerce Engine</h2>
<p class="case-outcome">
Designed, built and deployed a live commerce platform for a jewellery business in
Kanpur — backend, database, auth and frontend.
</p>
</div>
<div class="chips">
<span class="chip chip-status">In production</span>
<span class="chip">Solo build</span>
<span class="chip">Full-stack</span>
</div>
</div>
<div class="case-block">
<span class="case-label">Problem</span>
<p>
Rinky Jewellers had no digital storefront and no way to manage a catalogue without
editing files by hand. They needed a real shop customers could browse, and an admin
surface the owner could use without a developer sitting next to them — running
cheaply enough to be worth keeping online.
</p>
</div>
<div class="case-block">
<span class="case-label">What I built</span>
<ul class="tick">
<li>A REST API on Node.js and Express, with routes split by concern — auth, products, wishlist, contact, admin — and authorisation applied at the router level rather than per handler.</li>
<li>Session-based authentication with bcrypt hashing at 12 salt rounds, HTTP-only SameSite cookies, and sessions persisted in MongoDB through connect-mongo so they survive a restart and can be invalidated centrally.</li>
<li>Mongoose schemas for users, products, orders and contact messages on MongoDB Atlas, including jewellery-specific fields such as BIS hallmark metadata.</li>
<li>Role-based admin APIs for product CRUD, featured-product management, user administration, contact messages and platform stats.</li>
<li>Email verification and password recovery through the Brevo transactional email API, with links built from a configured production base URL.</li>
<li>Helmet and IP-based rate limiting on credential endpoints, plus a <code>/healthz</code> check that returns 503 when MongoDB is unreachable.</li>
<li>A responsive storefront in plain HTML, CSS and vanilla JavaScript — no framework and no build step — with shared behaviour factored into reusable modules.</li>
<li>Production deployment on Render with proxy-aware Express config, secure cookies, and secrets kept in the environment rather than the repository.</li>
</ul>
</div>
<div class="case-block">
<span class="case-label">Stack</span>
<div class="chips">
<span class="chip">Node.js 18+</span>
<span class="chip">Express 4</span>
<span class="chip">MongoDB Atlas</span>
<span class="chip">Mongoose 8</span>
<span class="chip">express-session</span>
<span class="chip">connect-mongo</span>
<span class="chip">bcryptjs</span>
<span class="chip">Helmet</span>
<span class="chip">express-rate-limit</span>
<span class="chip">Brevo API</span>
<span class="chip">Render</span>
<span class="chip">Vanilla JS</span>
</div>
</div>
<div class="case-block">
<span class="case-label">Decisions</span>
<ul class="tick">
<li><strong>Server-side sessions over JWTs</strong> — session state stays centrally managed and can be invalidated without handing an auth token to client-side JavaScript.</li>
<li><strong>No frontend framework</strong> — a catalogue site does not need a build pipeline, and skipping one kept the client light and the deployment simple.</li>
<li><strong>MongoDB</strong> — a document model fits a catalogue whose products carry uneven, category-specific attributes.</li>
</ul>
</div>
<div class="case-block">
<span class="case-label">What I learned</span>
<p>
What changes when the thing is actually live: environment-based configuration,
proxy-aware cookie settings, health checks that tell you which dependency died, and
the difference between code that passes on my machine and code someone else's
business depends on.
</p>
</div>
<div class="case-block limitation">
<span class="case-label">Limitation</span>
<p>
Cart, checkout and payment processing are <strong>not implemented</strong>. The
<code>Order</code> model and the Razorpay dependency in the manifest are planned
infrastructure, not working features, and should not be read as production
functionality. Content Security Policy is currently disabled because the frontend
still relies on inline scripts and styles — tightening that means moving them to
approved external assets or nonce-based execution first.
</p>
</div>
<div class="case-foot">
<a class="xlink" href="https://www.rinkyjewellers.in/" target="_blank" rel="noopener noreferrer">Live site ↗</a>
<span class="micro">Source is private — happy to walk through it on request</span>
</div>
</article>
<article class="case" id="attendance" data-reveal>
<div class="case-head">
<div>
<div class="case-index">CASE <b>02</b> / 04</div>
<h2 class="h2 case-title">Facial Attendance System</h2>
<p class="case-outcome">
Built a local face-recognition check-in logger using OpenCV and scikit-learn.
</p>
</div>
<div class="chips">
<span class="chip chip-status">Solo build</span>
<span class="chip">Python & ML</span>
</div>
</div>
<div class="case-block">
<span class="case-label">Problem</span>
<p>
Logging student check-ins by hand is slow and easy to get wrong. This project explores
whether a local webcam feed can recognise faces and write the attendance log itself —
entirely on-device, with no service to sign up for.
</p>
</div>
<div class="case-block">
<span class="case-label">What I built</span>
<ul class="tick">
<li>Face detection with OpenCV Haar Cascade classifiers, cropping face bounds out of a live video stream and normalising them to a fixed 50×50 resolution.</li>
<li>A local K-Nearest Neighbors classifier in scikit-learn, trained on pre-captured face vectors to identify a known user from the stream.</li>
<li>A CSV logger that records the recognised name and the check-in timestamp using Python's built-in CSV writer.</li>
<li>A Streamlit dashboard that reads the log and displays classroom check-ins in real time.</li>
</ul>
</div>
<div class="case-block">
<span class="case-label">Stack</span>
<div class="chips">
<span class="chip">Python</span>
<span class="chip">OpenCV</span>
<span class="chip">Scikit-learn</span>
<span class="chip">Streamlit</span>
<span class="chip">Pickle</span>
<span class="chip">CSV</span>
</div>
</div>
<div class="case-block">
<span class="case-label">What I learned</span>
<p>
The fundamentals underneath a classifier, in order: camera frame capture, image
preprocessing, feature extraction, and training a simple classification algorithm on
the result. Also that most of the work in an ML project is not the model.
</p>
</div>
<div class="case-block limitation">
<span class="case-label">Limitation</span>
<p>
The system classifies faces from a webcam stream against pickle-serialised training
data. It has no depth check or 3D liveness detection, which means a flat photograph
will defeat it. Privacy and consent safeguards would be required before any real
deployment — this is built for learning and local demonstration.
</p>
</div>
<div class="case-foot">
<a class="xlink" href="https://github.com/Lakshya172/Attendence-System" target="_blank" rel="noopener noreferrer">Repository ↗</a>
</div>
</article>
<!-- ====================================================== CASE 03 -->
<article class="case" id="adityanet" data-reveal>
<div class="case-head">
<div>
<div class="case-index">CASE <b>03</b> / 04</div>
<h2 class="h2 case-title">AdityaNet</h2>
<p class="case-outcome">
Contributor to an open, verifiable solar-flare research platform for Aditya-L1
satellite data.
</p>
</div>
<div class="chips">
<span class="chip chip-status">Open source</span>
<span class="chip chip-note">Contributor</span>
<span class="chip">Research</span>
</div>
</div>
<div class="case-block">
<span class="case-label">Problem</span>
<p>
Solar-flare detection benchmarks and Level-1 dataset derivation for the Aditya-L1
satellite's SoLEXS and HEL1OS instruments needed an open, reproducible, verifiable
engineering platform — one where published dataset outputs can be inspected and
rebuilt rather than taken on trust.
</p>
</div>
<div class="case-block">
<span class="case-label">What I contributed</span>
<ul class="tick">
<li>Code contributions to the research verification platform and its Astro web interfaces.</li>
<li>Helped configure automated verification check budgets, type-safety testing under Astro, and responsive UI components.</li>
<li>Collaborated on documenting reproducibility protocols for Level-1 solar data ingestion and byte-identical local rebuild checks.</li>
</ul>
</div>
<div class="case-block">
<span class="case-label">Stack</span>
<div class="chips">
<span class="chip">Python</span>
<span class="chip">Astro</span>
<span class="chip">Three.js</span>
<span class="chip">React</span>
<span class="chip">Tailwind CSS</span>
<span class="chip">TypeScript</span>
<span class="chip">Vitest</span>
</div>
</div>
<div class="case-block">
<span class="case-label">What I learned</span>
<p>
Build-time budget enforcement, what structured scientific reproducibility protocols
actually require of a codebase, and collaborative git development on an open-science
project with other contributors.
</p>
</div>
<div class="case-block limitation">
<span class="case-label">Scope of contribution</span>
<p>
This is a collaborative open-source research platform, not my project. My contributions
were to parts of the codebase, the verification setup, and the documentation — not to
the principal solar-flare research or its algorithms.
</p>
</div>
<div class="case-foot">
<a class="xlink" href="https://github.com/Lakshya172" target="_blank" rel="noopener noreferrer">Repository ↗</a>
</div>
</article>
<!-- ====================================================== CASE 04 -->
<article class="case" id="astra" data-reveal>
<div class="case-head">
<div>
<div class="case-index">CASE <b>04</b> / 04</div>
<h2 class="h2 case-title">ASTRA</h2>
<p class="case-outcome">
Contributor to an automated stellar transient recognition and classification platform.
</p>
</div>
<div class="chips">
<span class="chip chip-status">Open source</span>
<span class="chip chip-note">Contributor</span>
<span class="chip">Research</span>
</div>
</div>
<div class="case-block">
<span class="case-label">Problem</span>
<p>
Stellar transient classification needs open, reproducible computation benchmarks —
server-side model inference that can be re-run, and time-series visualisations dense
enough to show what the classifier is actually reacting to.
</p>
</div>
<div class="case-block">
<span class="case-label">What I contributed</span>
<ul class="tick">
<li>Helped configure server-side model inference with ONNX Runtime Node inside the transient recognition app.</li>
<li>Built parts of the interactive 3D WebGL space-mapping visualisations using Three.js and React Three Fiber.</li>
<li>Collaborated on dense time-series astronomical chart components with Recharts.</li>
</ul>
</div>
<div class="case-block">
<span class="case-label">Stack</span>
<div class="chips">
<span class="chip">Next.js</span>
<span class="chip">React</span>
<span class="chip">Three.js</span>
<span class="chip">ONNX Runtime Node</span>
<span class="chip">TypeScript</span>
<span class="chip">Recharts</span>
<span class="chip">Lenis</span>
</div>
</div>
<div class="case-block">
<span class="case-label">What I learned</span>
<p>
Server-side model loading, 3D WebGL camera setup, dynamic chart scaling for data that
varies by orders of magnitude, and working inside someone else's architecture without
breaking it.
</p>
</div>
<div class="case-block limitation">
<span class="case-label">Scope of contribution</span>
<p>
A collaborative research platform. My work was on the front-end space visualisations,
the server-side inference configuration, and the charting UI — not the core transient
classification algorithm design.
</p>
</div>
<div class="case-foot">
<a class="xlink" href="https://github.com/Lakshya172" target="_blank" rel="noopener noreferrer">Repository ↗</a>
</div>
</article>
</div>
</section>
<!-- ============================================================= STACK -->
<section class="section" id="stack">
<div class="shell">
<div class="section-head" data-reveal>
<div class="kicker">
<span class="num">05 / TOOLING</span>
<span class="rule" aria-hidden="true"></span>
</div>
<h2 class="h1">Everything below has been used inside one of those four.</h2>
<p class="lede">No aspirational entries. If it is on this list, it shipped in a project above.</p>
</div>
<div class="grid grid-3" data-reveal-group="80">
<article class="skill-group" data-reveal>
<h3 class="h3">Languages</h3>
<div class="chips">
<span class="chip">Python</span>
<span class="chip">TypeScript</span>
<span class="chip">JavaScript</span>
<span class="chip">HTML/CSS</span>
<span class="chip">SQL</span>
</div>
</article>
<article class="skill-group" data-reveal>
<h3 class="h3">Backend & data</h3>
<div class="chips">
<span class="chip">Node.js</span>
<span class="chip">Express</span>
<span class="chip">REST APIs</span>
<span class="chip">MongoDB Atlas</span>
<span class="chip">Mongoose</span>
<span class="chip">Session auth</span>
<span class="chip">bcrypt</span>
<span class="chip">Helmet</span>
<span class="chip">Rate limiting</span>
<span class="chip">SQL</span>
</div>
</article>
<article class="skill-group" data-reveal>
<h3 class="h3">Libraries & frameworks</h3>
<div class="chips">
<span class="chip">Next.js</span>
<span class="chip">React</span>
<span class="chip">Astro</span>
<span class="chip">Three.js</span>
<span class="chip">ONNX Runtime</span>
<span class="chip">Streamlit</span>
<span class="chip">Scikit-learn</span>
<span class="chip">OpenCV</span>
<span class="chip">Recharts</span>
</div>
</article>
<article class="skill-group" data-reveal>
<h3 class="h3">Tools & environments</h3>
<div class="chips">
<span class="chip">Git & GitHub</span>
<span class="chip">Render</span>
<span class="chip">Vitest</span>
<span class="chip">Tailwind CSS</span>
<span class="chip">npm / pnpm</span>
<span class="chip">Linux CLI</span>
</div>
</article>
</div>
<div class="actions" data-reveal>
<a class="btn btn-primary" href="./resume.html">
Full resume <span class="arrow" aria-hidden="true">→</span>
</a>
<a class="btn" href="./journal.html">
Learning journal <span class="arrow" aria-hidden="true">→</span>
</a>
</div>
</div>
</section>
</main>
<footer class="footer">
<div class="shell footer-inner">
<span class="build-stamp">
<span class="mark" aria-hidden="true"></span>
© <span data-year>2026</span> Lakshya Agarwal · Factual & transparent
</span>
<div class="footer-links">
<a class="xlink" href="https://github.com/Lakshya172" target="_blank" rel="noopener noreferrer">GitHub ↗</a>
<a class="xlink" href="https://www.linkedin.com/in/lakshyaagarwal17/" target="_blank" rel="noopener noreferrer">LinkedIn ↗</a>
<a class="xlink" href="mailto:agarwallakshya172@gmail.com">Email ↗</a>
</div>
</div>
</footer>
<script src="./assets/js/site.js" defer></script>
</body>
</html>