-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
567 lines (531 loc) · 25.9 KB
/
Copy pathindex.html
File metadata and controls
567 lines (531 loc) · 25.9 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
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>allocsys — Backend Developer</title>
<meta name="description" content="allocsys — backend developer portfolio: MCP server infrastructure, AI agent automation, and open-source contributions." />
<meta property="og:type" content="profile" />
<meta property="og:title" content="allocsys — Backend Developer" />
<meta property="og:description" content="Backend developer portfolio: MCP server infrastructure, AI agent automation, and open-source contributions." />
<meta property="og:image" content="https://raw.githubusercontent.com/allocsys/profile/main/github-metrics.svg" />
<meta property="og:url" content="https://allocsys.github.io/profile/" />
<meta property="og:site_name" content="allocsys" />
<link rel="canonical" href="https://allocsys.github.io/profile/" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="allocsys — Backend Developer" />
<meta name="twitter:description" content="Backend developer portfolio: MCP server infrastructure, AI agent automation, and open-source contributions." />
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='.9em' font-size='90'%3E%E2%9A%A1%3C/text%3E%3C/svg%3E">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
:root {
--bg: #0a0e14;
--bg-alt: #10151f;
--surface-2: #161c26;
--accent: #00e5a0;
--accent-2: #7c8cff;
--text: #d6e0e8;
--muted: #7a8899;
--border: #1f2733;
--font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
--font-sans: 'Inter', 'Segoe UI', system-ui, -apple-system, sans-serif;
}
@media (prefers-color-scheme: light) {
:root {
--bg: #f7f9fb;
--bg-alt: #ffffff;
--surface-2: #eef1f5;
--accent: #00a884;
--accent-2: #5a6bd6;
--text: #1b2430;
--muted: #5b6b7a;
--border: #e1e6ec;
}
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: var(--bg);
color: var(--text);
font-family: var(--font-sans);
line-height: 1.65;
font-size: 16px;
}
a { color: var(--accent); text-decoration: none; }
a:hover { text-decoration: underline; }
a:focus-visible, button:focus-visible, .flag:focus-visible {
outline: 2px solid var(--accent-2);
outline-offset: 3px;
border-radius: 3px;
}
.container { max-width: 760px; margin: 0 auto; padding: 64px 24px 100px; }
/* ---------- Terminal hero ---------- */
.terminal {
background: var(--bg-alt);
border: 1px solid var(--border);
border-radius: 10px;
overflow: hidden;
box-shadow: 0 20px 60px -20px rgba(0, 0, 0, 0.5);
margin-bottom: 56px;
}
.term-bar {
display: flex;
align-items: center;
gap: 8px;
padding: 12px 16px;
border-bottom: 1px solid var(--border);
background: var(--surface-2);
}
.term-bar .dot { width: 11px; height: 11px; border-radius: 50%; display: inline-block; }
.term-bar .dot.red { background: #ff5f56; }
.term-bar .dot.yellow { background: #ffbd2e; }
.term-bar .dot.green { background: #27c93f; }
.term-title {
margin-left: 8px;
font-family: var(--font-mono);
font-size: 12px;
color: var(--muted);
}
.term-body { padding: 28px 28px 32px; font-family: var(--font-mono); font-size: 15px; }
.term-body .line { color: var(--muted); margin-top: 16px; }
.term-body .line:first-child { margin-top: 0; }
.term-body .prompt { color: var(--accent); margin-right: 8px; }
.term-body .output { margin-top: 6px; padding-left: 20px; }
.term-body .name {
font-size: 26px;
font-weight: 700;
color: var(--text);
letter-spacing: -0.02em;
}
.term-body .role { color: var(--muted); font-size: 14px; }
.flags { display: flex; flex-wrap: wrap; gap: 10px 16px; padding-left: 20px; margin-top: 6px; }
.flag {
font-family: var(--font-mono);
font-size: 13px;
color: var(--accent-2);
border-bottom: 1px dashed transparent;
}
.flag:hover { border-bottom-color: var(--accent-2); text-decoration: none; }
.cursor {
display: inline-block;
color: var(--accent);
animation: blink 1.1s steps(1) infinite;
}
@media (prefers-reduced-motion: reduce) {
.cursor { animation: none; }
}
@keyframes blink { 50% { opacity: 0; } }
.tag {
display: inline-block;
font-family: var(--font-mono);
font-size: 12px;
letter-spacing: 0.05em;
color: var(--accent);
border: 1px solid var(--accent);
padding: 3px 10px;
border-radius: 20px;
margin-bottom: 18px;
}
/* ---------- Sections ---------- */
section { margin-bottom: 48px; }
section h2 {
font-family: var(--font-mono);
font-size: 14px;
font-weight: 600;
letter-spacing: 0.02em;
color: var(--text);
margin-bottom: 20px;
display: flex;
align-items: center;
gap: 12px;
}
section h2 .cmt { color: var(--muted); font-weight: 400; }
section h2::after {
content: "";
flex: 1;
height: 1px;
background: var(--border);
}
.card {
background: var(--bg-alt);
border: 1px solid var(--border);
border-left: 2px solid var(--border);
border-radius: 8px;
padding: 22px 24px;
margin-bottom: 14px;
transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.card:hover {
transform: translateY(-3px);
box-shadow: 0 14px 30px -12px rgba(0, 0, 0, 0.4);
border-color: var(--border);
border-left-color: var(--accent);
}
.card .role-row {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
gap: 8px;
}
.card h3 { font-size: 16px; color: var(--text); font-weight: 600; }
.card .company { color: var(--accent); font-size: 13px; font-family: var(--font-mono); margin-top: 2px; }
.card .dates { color: var(--muted); font-size: 12px; font-family: var(--font-mono); white-space: nowrap; }
.card ul { margin-top: 12px; padding-left: 0; list-style: none; color: var(--muted); font-size: 14px; }
.card ul li { margin-bottom: 8px; padding-left: 20px; position: relative; }
.card ul li::before {
content: "+";
position: absolute;
left: 0;
color: var(--accent);
font-family: var(--font-mono);
font-weight: 700;
}
.skills-grid { display: flex; flex-wrap: wrap; gap: 10px; }
.skill-pill {
background: var(--bg-alt);
border: 1px solid var(--border);
padding: 6px 14px;
border-radius: 20px;
font-size: 13px;
font-family: var(--font-mono);
color: var(--text);
}
.skill-pill::before { content: "▹ "; color: var(--accent); }
.skill-group { margin-bottom: 20px; }
.skill-group h4 {
font-family: var(--font-mono);
font-size: 11px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--muted);
margin-bottom: 10px;
}
.tag-row { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }
.tech-tag {
font-family: var(--font-mono);
font-size: 11px;
color: var(--accent-2);
border: 1px solid var(--border);
padding: 3px 8px;
border-radius: 4px;
}
.contrib summary {
cursor: pointer;
list-style: none;
}
.contrib summary::-webkit-details-marker { display: none; }
.contrib summary:focus-visible {
outline: 2px solid var(--accent-2);
outline-offset: 4px;
border-radius: 4px;
}
.contrib summary .role-row { align-items: center; }
.contrib .chevron {
font-family: var(--font-mono);
color: var(--accent-2);
display: inline-block;
margin-left: 10px;
transition: transform 0.2s ease;
}
.contrib[open] .chevron { transform: rotate(90deg); }
.contrib .contrib-body {
margin-top: 14px;
padding-top: 14px;
border-top: 1px solid var(--border);
}
.contrib:not([open]):hover { border-left-color: var(--accent); }
.metrics-card img, .metrics-card picture { display: block; }
footer {
font-family: var(--font-mono);
font-size: 13px;
color: var(--muted);
padding-top: 28px;
border-top: 1px solid var(--border);
}
footer .prompt { color: var(--accent); margin-right: 8px; }
@media (max-width: 600px) {
.container { padding: 44px 18px 80px; }
.term-body { padding: 22px 18px 26px; font-size: 14px; }
.term-body .name { font-size: 22px; }
}
</style>
</head>
<body>
<div class="container">
<span class="tag">available for work</span>
<div class="terminal">
<div class="term-bar">
<span class="dot red"></span>
<span class="dot yellow"></span>
<span class="dot green"></span>
<span class="term-title">allocsys@allocsys: ~</span>
</div>
<div class="term-body">
<p class="line"><span class="prompt">$</span>whoami</p>
<p class="output name">allocsys</p>
<p class="line"><span class="prompt">$</span>cat role.txt</p>
<p class="output role">Backend Developer — APIs, infra & AI-agent tooling</p>
<p class="line"><span class="prompt">$</span>ls --contact</p>
<p class="flags">
<a class="flag" href="mailto:allocsys@gmail.com">--email</a>
<a class="flag" href="https://github.com/allocsys" target="_blank">--github</a>
<a class="flag" href="/resume.pdf" target="_blank">--resume</a>
</p>
<p class="line"><span class="prompt">$</span><span class="cursor">▌</span></p>
</div>
</div>
<section>
<h2><span class="cmt">//</span> About</h2>
<div class="card">
<p>Backend-focused developer who builds the infrastructure layer AI agents actually run on — auth, rate limiting, multi-service integrations — rather than just wiring prompts together. Comfortable owning a project end-to-end: designing the API surface, hardening it (timing-safe auth, IP allowlisting, proxy-aware rate limiting), and documenting the reasoning so someone else can maintain it. Recent focus: Model Context Protocol (MCP) servers and agentic workflow automation (n8n + LangChain), plus root-causing bugs in real-world open-source infrastructure.</p>
</div>
</section>
<section>
<h2><span class="cmt">//</span> Projects</h2>
<div class="card">
<div class="role-row">
<h3>madmcp</h3>
<span class="dates">2026</span>
</div>
<div class="company">MCP server — GitHub, Cloudflare, Notion, Mem0 & web-fetch tool access for AI agents</div>
<ul>
<li>Built and deployed a single MCP server (Node/Express) exposing ~50 tools across 5 backends (GitHub, Cloudflare D1/KV/R2/Workers, Notion, Mem0, generic fetch) to any MCP-compatible client.</li>
<li>Designed the auth layer myself: timing-safe shared-key comparison, IP allowlisting scoped to Claude's published connector range, and per-route rate limiting — applied in the correct order so a leaked key alone can't reach the server from an untrusted network.</li>
<li>Handled real deployment-platform edge cases: correct `X-Forwarded-For` trust depth per reverse-proxy hop, request body limits raised for large file pushes, and graceful per-connector token failure (one missing credential doesn't take down the whole server).</li>
<li>Shipped with one-click deploy configs for Render and Vercel, plus a documented manual path for any Node host.</li>
</ul>
<div class="tag-row">
<span class="tech-tag">Node.js</span>
<span class="tech-tag">Express</span>
<span class="tech-tag">MCP</span>
<span class="tech-tag">REST API design</span>
<span class="tech-tag">Auth & rate limiting</span>
</div>
<div class="tag-row" style="margin-top: 10px;">
<a href="https://github.com/allocsys/madmcp" target="_blank">View repo →</a>
</div>
</div>
<div class="card">
<div class="role-row">
<h3>Agentic Email Triage & Ops Automation</h3>
<span class="dates">2026</span>
</div>
<div class="company">n8n workflow — LLM agent with per-sender memory, RAG, and CRM/Sheets/LINE routing</div>
<ul>
<li>Designed an n8n workflow where an AI agent classifies inbound support email (category + priority), grounds factual answers in a RAG-searched knowledge base, and drafts replies only for non-urgent cases.</li>
<li>Built a deliberate safety boundary directly into the system prompt: escalation-worthy emails (angry customers, payment failures, security reports) are flagged for a human and never get an auto-generated reply — the boundary lives before generation, not as a filter after.</li>
<li>Forced structured JSON output from the agent so downstream nodes (Sheets logging, CRM ticket creation, LINE alerts) route deterministically instead of parsing free text.</li>
<li>Documented and tested against 6 representative scenarios, weighting test coverage toward the costliest failure mode (an urgent email misclassified as routine).</li>
</ul>
<div class="tag-row">
<span class="tech-tag">n8n</span>
<span class="tech-tag">LangChain</span>
<span class="tech-tag">RAG / Qdrant</span>
<span class="tech-tag">Prompt design</span>
<span class="tech-tag">Workflow automation</span>
</div>
<div class="tag-row" style="margin-top: 10px;">
<a href="https://github.com/allocsys/n8n-agentic-ops" target="_blank">View repo →</a>
</div>
</div>
<div class="card">
<div class="role-row">
<h3>cf-manager</h3>
<span class="dates">2026</span>
</div>
<div class="company">Bash + Cloudflare API v4 — mobile-first admin panel for Workers, KV, D1, R2 & Hyperdrive, entirely inside Termux</div>
<ul>
<li>Built a single self-contained bash script that gives Cloudflare a full menu-driven admin panel — Workers deploy/rollback, KV/D1/R2/Hyperdrive management — usable entirely from a phone terminal, no dashboard tab or laptop required.</li>
<li>Implemented OAuth2 + PKCE login (the same flow <code>wrangler login</code> uses) with multi-account storage and switching, so no API tokens need to be manually pasted or rotated by hand.</li>
<li>Added one-tap rollback by backing up every deploy locally before it goes out, plus a GitHub sync step that pushes a worker's source straight to a linked repo branch on deploy — deploy and version control in one action.</li>
<li>Worked around <code>workerd</code> having no native Android build by driving <code>wrangler tail</code> inside an auto-installed proot-distro Ubuntu container, so real-time log tailing still works from Termux.</li>
</ul>
<div class="tag-row">
<span class="tech-tag">Bash</span>
<span class="tech-tag">Cloudflare API v4</span>
<span class="tech-tag">OAuth2 + PKCE</span>
<span class="tech-tag">Termux</span>
<span class="tech-tag">CLI / TUI design</span>
</div>
<div class="tag-row" style="margin-top: 10px;">
<a href="https://github.com/allocsys/cfmanager" target="_blank">View repo →</a>
</div>
</div>
<div class="card">
<div class="role-row">
<h3>domap</h3>
<span class="dates">2026</span>
</div>
<div class="company">Node.js + Playwright — headless-Chromium DOM mapper and action-replay tool for Termux</div>
<ul>
<li>Built a tool that walks a live page's DOM after JS execution into a structured tree (bounding boxes, ARIA roles, stable-ish CSS selectors) and flags interactive elements for later reuse.</li>
<li>Captured full network traffic (requests, responses, failures, timing) alongside each DOM snapshot and rendered everything into a single tabbed HTML report (tree / interactive elements / network / actions).</li>
<li>Solved a real platform blocker: <code>playwright-core</code> refuses to load at all on Android by checking <code>process.platform</code> — added a narrowly-scoped platform spoof around just the <code>require()</code> call, safe because the tool never launches Android-specific binaries and instead always attaches to a remote Browserless.io session.</li>
<li>Supports replaying recorded actions (clicks, uploads, text input) against a page in a fresh session, including correct file-chooser interception for upload buttons that only open a native OS dialog on click.</li>
</ul>
<div class="tag-row">
<span class="tech-tag">Node.js</span>
<span class="tech-tag">Playwright</span>
<span class="tech-tag">Browserless.io</span>
<span class="tech-tag">DOM analysis</span>
</div>
<div class="tag-row" style="margin-top: 10px;">
<a href="https://github.com/allocsys/logger" target="_blank">View repo →</a>
</div>
</div>
</section>
<section>
<h2><span class="cmt">//</span> Open Source Contributions</h2>
<details class="card contrib">
<summary>
<div class="role-row">
<h3>modelcontextprotocol/typescript-sdk</h3>
<span class="dates">PR #2504 · open<span class="chevron">▸</span></span>
</div>
<div class="company">Fix falsy-zero requestId bugs in debounce guard and cancellation handling</div>
</summary>
<div class="contrib-body">
<ul>
<li>Root-caused two separate falsy-zero bugs where request id <code>0</code> was treated as absent because JS treats <code>0</code> as falsy.</li>
<li>Fixed the notification debounce guard so a notification tied to request <code>0</code> is never wrongly coalesced with unrelated notifications.</li>
<li>Fixed <code>notifications/cancelled</code> handling so a cancellation for request <code>0</code> no longer gets silently dropped, ensuring the correct abort controller fires.</li>
<li>Added regression tests covering both cases and referenced both upstream issues (#2117, #2283) in a single PR.</li>
</ul>
<div class="tag-row">
<span class="tech-tag">TypeScript</span>
<span class="tech-tag">MCP</span>
<span class="tech-tag">Vitest</span>
</div>
<div class="tag-row" style="margin-top: 10px;">
<a href="https://github.com/modelcontextprotocol/typescript-sdk/pull/2504" target="_blank">View PR →</a>
</div>
</div>
</details>
<details class="card contrib">
<summary>
<div class="role-row">
<h3>drizzle-team/drizzle-orm</h3>
<span class="dates">3 PRs · closed, not merged<span class="chevron">▸</span></span>
</div>
<div class="company">Connection-pool leak, type-inference bug, and multi-package schema validation gap</div>
</summary>
<div class="contrib-body">
<ul>
<li>Fixed a connection-pool leak in node-postgres transactions: a rejected <code>BEGIN</code> skipped both rollback and release, exhausting the pool under repeated connection drops. Verified against the original repro in both the broken and patched state. (<a href="https://github.com/drizzle-team/drizzle-orm/pull/6032" target="_blank">PR #6032</a> · closed, not merged — the underlying issue remains open, with an equivalent fix from another contributor pending in <a href="https://github.com/drizzle-team/drizzle-orm/pull/6030" target="_blank">PR #6030</a>)</li>
<li>Root-caused a TypeScript inference bug where <code>refine()</code> callbacks silently typed as <code>any</code> whenever <code>createSchemaFactory</code> omitted a <code>coerce</code> option — traced through nested conditional types to a missing generic default, and corrected the original issue report's scope in the process. (<a href="https://github.com/drizzle-team/drizzle-orm/pull/6031" target="_blank">PR #6031</a> · closed, not merged)</li>
<li>Added real schema validation for 6 Gel-only column types across all four schema-integration packages (zod/arktype/valibot/typebox), replacing a silent any-type fallback, with tests in each package. (<a href="https://github.com/drizzle-team/drizzle-orm/pull/6033" target="_blank">PR #6033</a> · closed, not merged)</li>
</ul>
<div class="tag-row">
<span class="tech-tag">TypeScript</span>
<span class="tech-tag">Type-level debugging</span>
<span class="tech-tag">PostgreSQL</span>
<span class="tech-tag">Zod</span>
</div>
</div>
</details>
<details class="card contrib" open>
<summary>
<div class="role-row">
<h3>cloudflare/workers-sdk</h3>
<span class="dates">4 PRs · 1 merged, 2 closed, 1 open<span class="chevron">▸</span></span>
</div>
<div class="company">Windows path-encoding crash, deploy-time validation bug, and local Images binding parity</div>
</summary>
<div class="contrib-body">
<ul>
<li>Root-caused a Windows-only startup crash on non-ASCII workspace paths to an HTTP header encoding violation (headers are Latin-1-only), then fixed 5 coordinated call sites across module-fallback and worker-socket handling. Verified with a Windows CI run against a real <code>開発</code>-path repro. (<a href="https://github.com/cloudflare/workers-sdk/pull/14713" target="_blank">PR #14713</a> · merged)</li>
<li>Fixed a false "infinite redirect loop" deploy warning in Wrangler that ignored the <code>assets.html_handling</code> config, without weakening real infinite-loop detection. (<a href="https://github.com/cloudflare/workers-sdk/pull/14709" target="_blank">PR #14709</a> · closed, not merged)</li>
<li>Fixed the local Miniflare Images binding to respect <code>fit</code>/<code>gravity</code>/<code>background</code> transform options, matching production behavior. Original PR closed after an accidental fork deletion mid-review; restored and continued in <a href="https://github.com/cloudflare/workers-sdk/pull/14810" target="_blank">PR #14810</a> (open, in review). (<a href="https://github.com/cloudflare/workers-sdk/pull/14714" target="_blank">PR #14714</a> · closed)</li>
</ul>
<div class="tag-row">
<span class="tech-tag">TypeScript</span>
<span class="tech-tag">Cloudflare Workers</span>
<span class="tech-tag">Root-cause debugging</span>
<span class="tech-tag">Cross-platform CI</span>
</div>
</div>
</details>
<details class="card contrib">
<summary>
<div class="role-row">
<h3>urllib3/urllib3</h3>
<span class="dates">PR #5121 · closed (superseded)<span class="chevron">▸</span></span>
</div>
<div class="company">Replace deprecated pyOpenSSL X.509 API in the TLS backend</div>
</summary>
<div class="contrib-body">
<ul>
<li>Traced a <code>DeprecationWarning</code> to the last remaining call of <code>OpenSSL.crypto.X509.get_subject()</code> in the <code>pyopenssl</code> TLS backend, ahead of its removal.</li>
<li>Rewrote it using <code>cryptography</code>'s X.509 API, matching the pattern already used elsewhere in the same file, with new tests covering both a present and missing commonName.</li>
<li>Closed in favor of a maintainer's concurrent fix for the same issue — independently arrived at an equivalent solution.</li>
</ul>
<div class="tag-row">
<span class="tech-tag">Python</span>
<span class="tech-tag">TLS / OpenSSL</span>
<span class="tech-tag">cryptography</span>
</div>
<div class="tag-row" style="margin-top: 10px;">
<a href="https://github.com/urllib3/urllib3/pull/5121" target="_blank">View PR →</a>
</div>
</div>
</details>
</section>
<section>
<h2><span class="cmt">//</span> Skills</h2>
<div class="skill-group">
<h4>Languages</h4>
<div class="skills-grid">
<span class="skill-pill">JavaScript / TypeScript</span>
<span class="skill-pill">Node.js</span>
<span class="skill-pill">Python</span>
<span class="skill-pill">SQL</span>
</div>
</div>
<div class="skill-group">
<h4>Backend & APIs</h4>
<div class="skills-grid">
<span class="skill-pill">Express</span>
<span class="skill-pill">REST API design</span>
<span class="skill-pill">OAuth2</span>
<span class="skill-pill">Rate limiting</span>
<span class="skill-pill">IP allowlisting</span>
<span class="skill-pill">Webhooks</span>
</div>
</div>
<div class="skill-group">
<h4>AI / Agent Tooling</h4>
<div class="skills-grid">
<span class="skill-pill">Model Context Protocol (MCP)</span>
<span class="skill-pill">LangChain</span>
<span class="skill-pill">RAG / Vector DBs (Qdrant)</span>
<span class="skill-pill">n8n</span>
<span class="skill-pill">Prompt design</span>
</div>
</div>
<div class="skill-group">
<h4>Infrastructure & Tools</h4>
<div class="skills-grid">
<span class="skill-pill">Git</span>
<span class="skill-pill">Cloudflare (D1, KV, R2, Workers)</span>
<span class="skill-pill">Render / Vercel</span>
<span class="skill-pill">CI (GitHub Actions)</span>
</div>
</div>
</section>
<section>
<h2><span class="cmt">//</span> Overall Activity</h2>
<div class="card metrics-card">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/allocsys/profile/main/github-metrics-dark.svg"/>
<img src="https://raw.githubusercontent.com/allocsys/profile/main/github-metrics.svg" alt="GitHub activity metrics" style="width: 100%; border-radius: 6px;" />
</picture>
<p style="color: var(--muted); font-size: 13px; margin-top: 10px;">Aggregate stats across public and private repositories.</p>
</div>
</section>
<footer>
<p><span class="prompt">$</span>echo "Built by allocsys" && exit 0 · <a href="https://github.com/allocsys/profile">source</a> · last updated July 23, 2026</p>
</footer>
</div>
</body>
</html>