-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
338 lines (328 loc) · 32.2 KB
/
Copy pathindex.html
File metadata and controls
338 lines (328 loc) · 32.2 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
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Pulkit Chawla</title>
<meta name="description" content="Pulkit Chawla, AI and platform engineer in Eindhoven, Netherlands. Six years on cloud data platforms at Oracle and Qubole, MSc Data Science and AI at TU Eindhoven, five systems he built and runs himself.">
<meta name="author" content="Pulkit Chawla">
<meta name="theme-color" content="#0f1210">
<link rel="canonical" href="https://pulkitchawla.me/">
<meta property="og:type" content="website">
<meta property="og:title" content="Pulkit Chawla">
<meta property="og:description" content="AI and platform engineer in Eindhoven. I build AI systems that run in production: the agents, the platform under them, and the tests that keep them honest.">
<meta property="og:url" content="https://pulkitchawla.me/">
<meta property="og:site_name" content="Pulkit Chawla">
<meta property="og:image" content="https://pulkitchawla.me/assets/og.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Pulkit Chawla, AI and platform engineer, Eindhoven">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Pulkit Chawla">
<meta name="twitter:description" content="AI and platform engineer in Eindhoven. I build AI systems that run in production: the agents, the platform under them, and the tests that keep them honest.">
<meta name="twitter:image" content="https://pulkitchawla.me/assets/og.jpg">
<link rel="icon" href="/assets/favicon.svg" type="image/svg+xml">
<script>try{var t=localStorage.getItem("theme");if(t==="light"){document.documentElement.setAttribute("data-theme","light")}}catch(e){}document.documentElement.className="js"</script>
<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=Bebas+Neue&family=Instrument+Serif:ital@0;1&family=Inter:wght@400;500;600&display=swap">
<link rel="stylesheet" href="/assets/style.css">
<link rel="stylesheet" href="/assets/film.css">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Person","name":"Pulkit Chawla","jobTitle":"AI and platform engineer","url":"https://pulkitchawla.me/","email":"mailto:pulkitchawl@gmail.com","sameAs":["https://github.com/thispc","https://linkedin.com/in/pulkitchawla11"],"address":{"@type":"PostalAddress","addressLocality":"Eindhoven","addressCountry":"NL"},"alumniOf":[{"@type":"CollegeOrUniversity","name":"Eindhoven University of Technology"},{"@type":"CollegeOrUniversity","name":"Birla Institute of Technology, Mesra"}]}</script>
</head>
<body>
<svg hidden aria-hidden="true" focusable="false" style="display:none">
<symbol id="i-gh" viewBox="0 0 24 24">
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422
18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835
2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405
1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91
1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286
0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/>
</symbol>
<symbol id="i-in" viewBox="0 0 24 24">
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267
5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925
2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771
24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
</symbol>
</svg>
<a class="skip" href="#main">Skip to content</a>
<header class="top">
<div class="wrap">
<a class="brand" href="#top" aria-label="Pulkit Chawla, home">
<svg class="mark" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<rect x="0.5" y="0.5" width="31" height="31" rx="7"/>
<path class="brk" d="M10.5 8.5H7.5v15h3M21.5 8.5h3v15h-3" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path class="chk" d="M11.5 16.5l3.5 3.5 6-8" fill="none" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>Pulkit Chawla</span>
</a>
<nav class="nav" aria-label="Sections">
<a href="#now">Now showing</a>
<a href="#projects">Scenes</a>
<a href="#work">Credits</a>
<a href="#skills">Cast</a>
<a href="#education">Education</a>
<a href="#contact">Post-credits</a>
</nav>
<button class="theme" id="theme" type="button" aria-label="Switch to light theme">
<svg class="sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></svg>
<svg class="moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>
</button>
</div>
</header>
<main id="main">
<section class="hero film-hero" id="top">
<div class="letterbox" aria-hidden="true"></div>
<div class="wrap">
<div class="title-card">
<p class="eyebrow"><span class="dot" aria-hidden="true"></span>A production of one engineer · Eindhoven, Netherlands · 2026</p>
<h1 class="poster">Pulkit Chawla</h1>
<p class="tagline">Builds AI systems that run in production, <em>and the tests that keep them honest.</em></p>
<p class="sub">Six years running cloud data platforms at Oracle and Qubole. An MSc in Data Science and AI at TU Eindhoven. Five systems of my own built this year and still running; each one is a scene below, including the part that nearly broke it.</p>
<p class="now-showing"><span class="marquee-label">Now showing</span> available immediately · no notice period · no work permit needed</p>
<div class="actions">
<a class="btn primary" href="https://github.com/thispc/thispc/raw/main/cv/Pulkit_Chawla_Resume.pdf">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M12 3v12M6 11l6 6 6-6M4 21h16"/></svg>
Download CV
</a>
<a class="btn" href="https://github.com/thispc">
<svg fill="currentColor" aria-hidden="true" focusable="false"><use href="#i-gh"/></svg>
GitHub
</a>
<a class="quiet" href="mailto:pulkitchawl@gmail.com">pulkitchawl@gmail.com</a>
</div>
</div>
<div class="strip-wrap" aria-hidden="true">
<ul class="strip"><li><img src="/assets/img/devteam-team-canvas.jpg" alt="devteam" loading="lazy" decoding="async"><span>SC 01</span></li><li><img src="/assets/img/devteam-app-run.jpg" alt="devteam, the app it shipped" loading="lazy" decoding="async"><span>SC 01b</span></li><li><img src="/assets/img/trader-assets.jpg" alt="trader-automata" loading="lazy" decoding="async"><span>SC 05</span></li><li><img src="/assets/img/jobhunt-overview.jpg" alt="jobhunt" loading="lazy" decoding="async"><span>SC 04</span></li><li><img src="/assets/img/devteam-team-canvas.jpg" alt="devteam" loading="lazy" decoding="async"><span>SC 01</span></li><li><img src="/assets/img/devteam-app-run.jpg" alt="devteam, the app it shipped" loading="lazy" decoding="async"><span>SC 01b</span></li><li><img src="/assets/img/trader-assets.jpg" alt="trader-automata" loading="lazy" decoding="async"><span>SC 05</span></li><li><img src="/assets/img/jobhunt-overview.jpg" alt="jobhunt" loading="lazy" decoding="async"><span>SC 04</span></li></ul>
</div>
</div>
<div class="letterbox bottom" aria-hidden="true"></div>
</section>
<section class="section" id="now">
<div class="wrap reveal">
<div class="section-head"><span class="num">SC 01</span><h2>Now showing</h2></div>
<p class="intro">I'm in Eindhoven, working freelance on agent systems, and looking for a full-time engineering role in the Netherlands.</p>
<dl class="facts">
<div><dt>Availability</dt><dd class="ok">Immediate, no notice period</dd></div>
<div><dt>Based in</dt><dd>Eindhoven, Netherlands</dd></div>
<div><dt>Work authorisation</dt><dd>Full access to the Dutch labour market, no work permit needed</dd></div>
<div><dt>Relocation</dt><dd>Open to anywhere in the Netherlands, hybrid preferred</dd></div>
<div><dt>Looking for</dt><dd>AI engineer, ML platform or backend roles where I own the service end to end</dd></div>
<div><dt>Languages</dt><dd>English (fluent), Hindi (native), Dutch (learning)</dd></div>
</dl>
</div>
</section>
<section class="section" id="projects">
<div class="wrap reveal">
<div class="section-head"><span class="num">SC 02</span><h2>Scenes</h2></div>
<p class="intro">Five scenes from this year. Each is a system I built and still run. The frame shows it working; the text says what it does and where it nearly broke.</p>
<ul class="projects">
<li class="card">
<figure class="fig fig-shot"><span class="frame-no" aria-hidden="true">SC 01 · TAKE 1</span><img src="/assets/img/devteam-app-run.jpg" alt="A weather app built by the AI team, running: each pipeline piece (parse-place, geocode, forecast, respond) shown with its output and whether it was cached or fetched" width="1600" height="913" loading="lazy" decoding="async"></figure>
<div class="card-head">
<div>
<h3><a href="https://github.com/thispc/devteam">devteam</a></h3>
<p class="kicker">AI agents write the software; a separate checker decides if it is good enough</p>
</div>
<a class="repo" href="https://github.com/thispc/devteam" aria-label="devteam on GitHub"><svg fill="currentColor" aria-hidden="true" focusable="false"><use href="#i-gh"/></svg><span class="repo-name">thispc/devteam</span></a>
</div>
<p>Each module is defined by a contract: the functions it must expose and what they take and return. An agent writes the code, the code is built in a container with no network, twice, and it is judged by tests the agent never saw. Only then does it ship.</p>
<p class="hard"><b>The twist:</b> once an agent has read the tests it is graded by, those tests stop telling you anything. The hidden ones caught real bugs the visible suite had passed.</p>
<p class="stat">Ran end to end with no human intervention: an AI manager derived the contracts, delegated the work and shipped every module through the checker. A content-addressed cache turns a repeat build into a 45 ms hit instead of a 6.3 s rebuild.</p>
<p class="shot-on" aria-hidden="true">Shot on</p><ul class="tags"><li>Node.js</li><li>TypeScript</li><li>Docker</li><li>Claude Agent SDK</li></ul>
</li>
<li class="card">
<figure class="figNone"><span class="frame-no" aria-hidden="true">SC 02 · TAKE 1</span><svg class="diagram" viewBox="0 0 520 190" role="img" aria-label="The model reads the screen through the accessibility tree and drives the real cursor; secrets stay in the Keychain" font-family="var(--mono)"><defs><marker id="ah" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0 0L10 5L0 10z" fill="var(--muted)"/></marker></defs><rect x="16" y="40" width="120" height="44" rx="7" fill="var(--bg-3)" stroke="var(--line-2)" stroke-width="1.2"/><text x="76.0" y="60.0" text-anchor="middle" font-size="12" fill="var(--fg)">Model</text><text x="76.0" y="74.0" text-anchor="middle" font-size="10.5" fill="var(--muted)">decides the next step</text><line x1="136" y1="62" x2="184" y2="62" stroke="var(--muted)" stroke-width="1.2" marker-end="url(#ah)"/><rect x="184" y="40" width="156" height="44" rx="7" fill="var(--accent-soft)" stroke="var(--accent)" stroke-width="1.2"/><text x="262.0" y="60.0" text-anchor="middle" font-size="12" fill="var(--fg)">Accessibility tree</text><text x="262.0" y="74.0" text-anchor="middle" font-size="10.5" fill="var(--muted)">reads the screen, no screenshots</text><line x1="340" y1="62" x2="388" y2="62" stroke="var(--muted)" stroke-width="1.2" marker-end="url(#ah)"/><rect x="388" y="40" width="116" height="44" rx="7" fill="var(--bg-3)" stroke="var(--line-2)" stroke-width="1.2"/><text x="446.0" y="60.0" text-anchor="middle" font-size="12" fill="var(--fg)">Real cursor</text><text x="446.0" y="74.0" text-anchor="middle" font-size="10.5" fill="var(--muted)">human-speed input</text><line x1="446" y1="84" x2="446" y2="122" stroke="var(--muted)" stroke-width="1.2" marker-end="url(#ah)"/><rect x="388" y="122" width="116" height="36" rx="7" fill="var(--bg-3)" stroke="var(--line-2)" stroke-width="1.2"/><text x="446.0" y="144.0" text-anchor="middle" font-size="12" fill="var(--fg)">The app</text><rect x="16" y="122" width="120" height="36" rx="7" fill="var(--bg-3)" stroke="var(--line-2)" stroke-width="1.2"/><text x="76.0" y="144.0" text-anchor="middle" font-size="12" fill="var(--fg)">Keychain</text><line x1="136" y1="140" x2="184" y2="140" stroke="var(--muted)" stroke-width="1.2" stroke-dasharray="4 3" marker-end="url(#ah)"/><rect x="184" y="122" width="156" height="36" rx="7" fill="var(--bg-3)" stroke="var(--line-2)" stroke-width="1.2"/><text x="262.0" y="144.0" text-anchor="middle" font-size="12" fill="var(--fg)">placeholders only</text><text x="262" y="178" text-anchor="middle" font-size="10.5" fill="var(--muted)">the model never sees a real password</text></svg></figure>
<div class="card-head">
<div>
<h3><a href="https://github.com/thispc/humanhands">HumanHands</a></h3>
<p class="kicker">An assistant that operates a Mac the way a person does</p>
</div>
<a class="repo" href="https://github.com/thispc/humanhands" aria-label="HumanHands on GitHub"><svg fill="currentColor" aria-hidden="true" focusable="false"><use href="#i-gh"/></svg><span class="repo-name">thispc/humanhands</span></a>
</div>
<p>It reads the screen through the macOS accessibility tree instead of screenshots, so the coordinates are exact and no image of your screen leaves the machine. Then it moves the real cursor along a human path and types at human speed, in any application.</p>
<p class="hard"><b>The twist:</b> keeping passwords away from the model without making it useless. They stay in the Keychain and reach the model only as placeholders, filled in at the last instant after the site has been checked.</p>
<p class="stat">Native Swift across 10 SwiftPM targets. 135 tests, run off-device.</p>
<p class="shot-on" aria-hidden="true">Shot on</p><ul class="tags"><li>Swift</li><li>SwiftUI</li><li>Accessibility API</li><li>CoreGraphics</li><li>Keychain</li><li>Claude</li></ul>
</li>
<li class="card">
<figure class="figNone"><span class="frame-no" aria-hidden="true">SC 03 · TAKE 1</span><svg class="diagram" viewBox="0 0 520 190" role="img" aria-label="The part that reads mail has no tools; the part with tools only sees a cleaned summary; sending needs one human tap" font-family="var(--mono)"><defs><marker id="ah" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0 0L10 5L0 10z" fill="var(--muted)"/></marker></defs><rect x="16" y="70" width="88" height="44" rx="7" fill="var(--bg-3)" stroke="var(--line-2)" stroke-width="1.2"/><text x="60.0" y="96.0" text-anchor="middle" font-size="12" fill="var(--fg)">Mail in</text><line x1="104" y1="92" x2="140" y2="92" stroke="var(--muted)" stroke-width="1.2" marker-end="url(#ah)"/><rect x="140" y="70" width="118" height="44" rx="7" fill="var(--accent-soft)" stroke="var(--accent)" stroke-width="1.2"/><text x="199.0" y="90.0" text-anchor="middle" font-size="12" fill="var(--fg)">Reader</text><text x="199.0" y="104.0" text-anchor="middle" font-size="10.5" fill="var(--muted)">no tools at all</text><line x1="258" y1="92" x2="294" y2="92" stroke="var(--muted)" stroke-width="1.2" marker-end="url(#ah)"/><text x="276.0" y="132" text-anchor="middle" font-size="10.5" fill="var(--muted)">clean summary</text><rect x="294" y="70" width="118" height="44" rx="7" fill="var(--bg-3)" stroke="var(--line-2)" stroke-width="1.2"/><text x="353.0" y="90.0" text-anchor="middle" font-size="12" fill="var(--fg)">Actor</text><text x="353.0" y="104.0" text-anchor="middle" font-size="10.5" fill="var(--muted)">has tools, never raw mail</text><line x1="412" y1="92" x2="448" y2="92" stroke="var(--muted)" stroke-width="1.2" marker-end="url(#ah)"/><rect x="448" y="70" width="60" height="44" rx="7" fill="var(--bg-3)" stroke="var(--line-2)" stroke-width="1.2"/><text x="478.0" y="96.0" text-anchor="middle" font-size="12" fill="var(--fg)">Draft</text><line x1="478" y1="114" x2="478" y2="150" stroke="var(--muted)" stroke-width="1.2" marker-end="url(#ah)"/><rect x="408" y="150" width="100" height="30" rx="7" fill="var(--bg-3)" stroke="var(--line-2)" stroke-width="1.2"/><text x="458.0" y="169.0" text-anchor="middle" font-size="12" fill="var(--fg)">one tap: send</text><text x="199" y="164" text-anchor="middle" font-size="10.5" fill="var(--muted)">a message cannot talk its way into an action</text></svg></figure>
<div class="card-head">
<div>
<h3><a href="https://github.com/thispc/nanoclaw">Personal email agent</a></h3>
<p class="kicker">Reads my mail and messages, drafts replies, sends nothing without my tap</p>
</div>
<a class="repo" href="https://github.com/thispc/nanoclaw" aria-label="Personal email agent on GitHub"><svg fill="currentColor" aria-hidden="true" focusable="false"><use href="#i-gh"/></svg><span class="repo-name">thispc/nanoclaw</span></a>
</div>
<p>Built on the open-source NanoClaw runtime, small enough to audit in an evening. It answers from my phone over iMessage, keeps what it knows about me in plain files I can read and correct, and runs as three background services on my own hardware.</p>
<p class="hard"><b>The twist:</b> anyone who emails me can try to talk the agent into something. So the part that reads mail has no tools, the part with tools never sees raw mail, and every outgoing message stops at a one-tap approval that sends exactly the draft I saw.</p>
<p class="stat">Three daemons, running 24/7. iMessage channel and plain-file knowledge base added to the upstream runtime.</p>
<p class="shot-on" aria-hidden="true">Shot on</p><ul class="tags"><li>TypeScript</li><li>Node.js</li><li>Claude Agent SDK</li><li>Docker</li><li>SQLite</li></ul>
</li>
<li class="card">
<figure class="fig fig-shot"><span class="frame-no" aria-hidden="true">SC 04 · TAKE 1</span><img src="/assets/img/trader-assets.jpg" alt="trader-automata: the Assets and Strategies screen, one strategy per instrument with quantity, limit and an on/off switch" width="1600" height="792" loading="lazy" decoding="async"></figure>
<div class="card-head">
<div>
<h3><a href="https://github.com/thispc/trader-automata">trader-automata</a></h3>
<p class="kicker">One trade decision, mirrored across many brokerage accounts</p>
</div>
<a class="repo" href="https://github.com/thispc/trader-automata" aria-label="trader-automata on GitHub"><svg fill="currentColor" aria-hidden="true" focusable="false"><use href="#i-gh"/></svg><span class="repo-name">thispc/trader-automata</span></a>
</div>
<p>What the copy-trading desks in India run: one signal fanned out to many accounts at once. It turned out to be a distributed-systems and compliance problem rather than a trading one. What matters is that every order is traceable and the thing stays up.</p>
<p class="hard"><b>The twist:</b> partial failure is normal. One account rejecting an order must never undo another account's fill, so every child order carries an idempotency key and every step is appended to a ledger, never overwritten.</p>
<p class="stat">Paper, connect and live stages. Deployed behind HTTPS on a static IP with a live Angel One account. 33 tests.</p>
<p class="shot-on" aria-hidden="true">Shot on</p><ul class="tags"><li>Python</li><li>FastAPI</li><li>SQLAlchemy</li><li>Next.js</li><li>TypeScript</li><li>Docker</li></ul>
</li>
<li class="card">
<figure class="fig fig-shot"><span class="frame-no" aria-hidden="true">SC 05 · TAKE 1</span><img src="/assets/img/jobhunt-overview.jpg" alt="jobhunt dashboard: countries scanned, days to target and to permit expiry, applications by stage, last scan" width="1600" height="830" loading="lazy" decoding="async"></figure>
<div class="card-head">
<div>
<h3>jobhunt</h3>
<p class="kicker">The system running my own job search</p>
</div>
<span class="repo" aria-label="private repository"><span class="repo-name">private repo</span></span>
</div>
<p>It scans postings from nine applicant-tracking APIs and the job boards, reconciles employers against the 12,900-entry Dutch sponsor register, tailors the CV to each posting, fills the application forms and tracks every reply and follow-up in one dashboard.</p>
<p class="hard"><b>The twist:</b> keeping it honest. Every line a tailored CV makes must trace back to a verified fact in one profile file, so the system cannot invent a number to match a posting.</p>
<p class="stat">Python, FastAPI and SQLite, 250 tests. Playwright drives the forms; a linter blocks generic phrasing before anything is sent.</p>
<p class="shot-on" aria-hidden="true">Shot on</p><ul class="tags"><li>Python</li><li>FastAPI</li><li>Playwright</li><li>SQLite</li><li>Claude Code</li></ul>
</li>
</ul>
</div>
</section>
<section class="section" id="work">
<div class="wrap reveal">
<div class="section-head"><span class="num">SC 03</span><h2>Credits</h2></div>
<ol class="timeline">
<li class="tl-item now">
<div class="tl-when"><b>Jan 2026</b> to now</div>
<div class="tl-body">
<h3>Independent AI and software engineer</h3>
<p class="tl-org">Freelance and personal projects, Eindhoven</p>
<ul>
<li>Designed and shipped five systems of my own, each a scene above, alongside client work.</li>
<li>Built a WhatsApp AI assistant for an Eindhoven student food-catering business (Twilio, Gemini and Gemma, FastAPI on DigitalOcean). It handles orders, meal selection, leave days and billing questions.</li>
<li>Built an Instagram reel fact-checker: a FastAPI and RAG backend on a Meta business account. A user forwards a reel and checks its claims in the same thread.</li>
</ul>
</div>
</li>
<li class="tl-item">
<div class="tl-when"><b>Jan 2025</b> to Nov 2025</div>
<div class="tl-body">
<h3>Graduate AI Researcher (MSc thesis), MLOps and Computer Vision</h3>
<p class="tl-org">Eindhoven University of Technology, IMAGEN Programme</p>
<ul>
<li>Built the MLOps platform behind IMAGEN, a Dutch government-funded animal-welfare research programme run by TU/e, Wageningen University and Hendrix Genetics.</li>
<li>Combined ClearML experiment tracking, SLURM scheduling and PiCaS task distribution into one workflow, with reproducible runs in Singularity containers.</li>
<li>Wrote a FAIR data pipeline that converts heterogeneous farm video into HDF5 with embedded metadata. Training throughput nearly doubled, from 112.3 to 217.4 images per second with eight data-loading workers, because the GPU stopped waiting for data.</li>
<li>Exposed the pipeline through a web UI and REST API so researchers could fine-tune detection models without logging into the HPC cluster. Per-animal bounding boxes fed behavioural analysis such as feeding-order dominance.</li>
</ul>
</div>
</li>
<li class="tl-item">
<div class="tl-when"><b>Dec 2023</b> to Dec 2024</div>
<div class="tl-body">
<h3>Software Developer (part-time), Digital Twin Team</h3>
<p class="tl-org">Eindhoven AI Systems Institute (EAISI), TU/e</p>
<ul>
<li>Built the FastAPI backend and Nuxt.js frontend of a digital twin of the TU/e campus, streaming live sensor data (temperature, humidity, occupancy) into a Unity 3D replica.</li>
<li>Modelled the campus as a graph database (building, room, sensor, readings) for room-level analytics and scenarios such as virtual fire-evacuation drills.</li>
</ul>
</div>
</li>
<li class="tl-item">
<div class="tl-when"><b>Jan 2021</b> to Aug 2023</div>
<div class="tl-body">
<h3>Member of Technical Staff, Big Data Service</h3>
<p class="tl-org">Oracle Cloud Infrastructure, Bangalore</p>
<ul>
<li>Sole owner of the customer-facing console of OCI Big Data Service in a team of about 30 engineers. Built, tested, released and operated the Node.js UI used to manage Hadoop clusters, and trained other engineers to take it over before leaving.</li>
<li>Owned the Hive and HBase distributions: forked upstream, set up TeamCity pipelines that built and deployed every PR to staging, and back-ported upstream CVE fixes. Enterprise customers leaving Cloudera required patched builds.</li>
<li>Built control-plane features in Java Spring that exposed a per-cluster Ambari UI to customers over secure networking, replacing Cloudera Manager for migrating customers.</li>
<li>Served in the production on-call rotation, resolving P0 and P1 incidents with the US-based support and architecture teams.</li>
</ul>
</div>
</li>
<li class="tl-item">
<div class="tl-when"><b>Jan 2018</b> to Dec 2020</div>
<div class="tl-body">
<h3>Software Engineer, then Software Engineer II, Cluster Orchestration</h3>
<p class="tl-org">Qubole (acquired by Idera), Bangalore</p>
<ul>
<li>One of three engineers owning the cluster-orchestration backend of Qubole's big-data platform: Hadoop, Spark, Presto and Hive clusters inside customer accounts on AWS, Azure and OCI.</li>
<li>Built secure tunnels between Qubole's control plane and clusters in customers' own cloud accounts, so customers could operate their clusters directly from the UI.</li>
<li>Added Datadog monitoring for cluster metrics and Jenkins QA pipelines that gated every release on client-specific integration tests across staging and production.</li>
<li>After the Idera acquisition, built StarPortal single-handedly (Moleculer.js, TypeScript, Node.js): an internal support portal with Splunk log ingestion and time-scoped Elasticsearch links. Support and sales could diagnose customer issues without waiting for a backend engineer.</li>
</ul>
</div>
</li>
</ol>
</div>
</section>
<section class="section" id="skills">
<div class="wrap reveal">
<div class="section-head"><span class="num">SC 04</span><h2>Cast and crew</h2></div>
<div class="skills">
<div class="skill">
<h3>Languages</h3>
<p class="shot-on" aria-hidden="true">Shot on</p><ul class="tags"><li>Python</li><li>TypeScript / JavaScript</li><li>Java</li><li>Swift</li><li>SQL</li><li>Bash</li></ul>
</div>
<div class="skill">
<h3>AI and ML</h3>
<p class="shot-on" aria-hidden="true">Shot on</p><ul class="tags"><li>LLM agents (Claude Agent SDK)</li><li>RAG and vector search (FAISS)</li><li>LangChain</li><li>PyTorch</li><li>Computer vision (detection, tracking)</li><li>Fine-tuning</li><li>Model serving and inference services</li><li>ClearML</li><li>Prompt-injection defences</li></ul>
</div>
<div class="skill">
<h3>Big data and cloud</h3>
<p class="shot-on" aria-hidden="true">Shot on</p><ul class="tags"><li>Hadoop</li><li>Spark</li><li>Presto</li><li>Hive</li><li>HBase</li><li>AWS</li><li>Azure</li><li>OCI</li><li>Docker</li><li>Kubernetes</li></ul>
</div>
<div class="skill">
<h3>Backend and tooling</h3>
<p class="shot-on" aria-hidden="true">Shot on</p><ul class="tags"><li>FastAPI</li><li>Spring</li><li>Node.js</li><li>Next.js / Nuxt.js</li><li>REST APIs</li><li>SQLAlchemy</li><li>Jenkins</li><li>TeamCity</li><li>GitHub Actions</li><li>CI/CD</li><li>SLURM</li><li>Singularity</li><li>Datadog</li><li>Splunk</li><li>Elasticsearch</li><li>Playwright</li></ul>
</div>
</div>
</div>
</section>
<section class="section" id="education">
<div class="wrap reveal">
<div class="section-head"><span class="num">SC 05</span><h2>Education</h2></div>
<ul class="edu">
<li>
<h3>MSc Data Science and Artificial Intelligence</h3>
<p class="school">Eindhoven University of Technology, 2023 to 2025</p>
<p>Thesis: an MLOps and computer-vision pipeline for precision livestock farming in the IMAGEN programme.</p>
<p>Summer research 2024: retrieval-augmented question answering over academic documents with LangChain, the OpenAI API and FAISS, benchmarked against BM25 and TF-IDF baselines.</p>
</li>
<li>
<h3>BE Information Technology</h3>
<p class="school">Birla Institute of Technology, Mesra, 2014 to 2018</p>
<p class="grade">CGPA 8.37, First Class with Distinction</p>
<p>Summer 2017: real-time pedestrian detection at Illinois Institute of Technology, Chicago. Fine-tuned a Single Shot MultiBox Detector (VGG-16 backbone) on the Caltech Pedestrian dataset.</p>
</li>
</ul>
</div>
</section>
<section class="section contact" id="contact">
<div class="wrap reveal">
<div class="section-head"><span class="num">SC 06</span><h2>Post-credits scene</h2></div>
<p class="big">Stay for this bit. Email is the fastest way to reach me: <a href="mailto:pulkitchawl@gmail.com">pulkitchawl@gmail.com</a></p>
<ul class="links">
<li><a href="https://linkedin.com/in/pulkitchawla11"><svg fill="currentColor" aria-hidden="true" focusable="false"><use href="#i-in"/></svg>linkedin.com/in/pulkitchawla11</a></li>
<li><a href="https://github.com/thispc"><svg fill="currentColor" aria-hidden="true" focusable="false"><use href="#i-gh"/></svg>github.com/thispc</a></li>
<li><a href="https://github.com/thispc/thispc/raw/main/cv/Pulkit_Chawla_Resume.pdf"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M12 3v12M6 11l6 6 6-6M4 21h16"/></svg>CV (PDF)</a></li>
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" style="width:16px;height:16px;vertical-align:-3px;margin-right:7px"><path d="M12 21s-7-6.2-7-11a7 7 0 0 1 14 0c0 4.8-7 11-7 11z"/><circle cx="12" cy="10" r="2.5"/></svg>Eindhoven, Netherlands</li>
</ul>
</div>
</section>
</main>
<footer>
<div class="wrap">
<span>Pulkit Chawla, Eindhoven</span>
<span>Hand-written HTML and CSS. No build step, no tracking, no cookies. <a href="https://github.com/thispc/thispc.github.io">Source</a></span>
</div>
</footer>
<script src="/assets/main.js" defer></script>
<div class="grain" aria-hidden="true"></div>
</body>
</html>