I build the connective tissue between AI, automation, and the messy reality of enterprise IT.
By day I'm a System Engineer on the Software Solution Team at Smart Printing Solutions, shipping custom applications and Managed Print Services for enterprise clients. I'm also the designated backup L2 IT / Desktop Support (DSS) for Reckitt Bangladesh, covering their sites whenever the primary engineer is out or an incident needs hands on the ground.
By night it means shipping AI-powered tools that compress months of grunt work into weeks.
My favourite kind of project is one where a 90% time reduction is on the table, usually because the original process was three legacy systems, two spreadsheets, and a person clicking buttons.
| 📍 Based in Dhaka, Bangladesh | 🎯 Focused on MCP · AI agents · RAG · Python automation |
| 🛠️ Currently System Engineer @ Smart Printing Solutions | 🛡️ Also hands-on VM · Windows · M365 · XDR/EDR · network |
| 🔁 Also L2 Backup DSS @ Reckitt Bangladesh | ✍️ Writing about LLM debugging, context engineering, ITSM |
| 🚗 On the ground client site visits + remote support | 📬 Reach me info@aniksarkerakash.com |
| 🎓 Foundation B.Sc. Computer Science & Engineering | 💬 Ask me about shipping AI code you can actually defend |
Note
Most of the last 12 months is private enterprise work. The CRM, the report engine and the approval system all ship inside client infrastructure, so public repositories show the visible slice, not the job. The self-hosted cards above count the private activity my profile publishes, and the generator keeps a verified baseline in assets/stats.json, so if that visibility ever changes the number degrades loudly instead of silently reading zero.
📜 Certificate details · and how I apply them
| Certificate | Where it shows up in my work |
|---|---|
| Project Management | Scoping AI builds so a 6-month estimate becomes a 2-month delivery |
| IT Automation with Python | The automation layer under every report generator and approval flow |
| UX Design | Why the internal tools people actually use look the way they do |
| Data Analytics | SLA dashboards, ticket-ageing signals, operational reporting |
| IT Support | The L2/L3 discipline behind 86% SLA compliance on cover |
96% |
86% |
90% |
66% |
15+ |
|---|---|---|---|---|
| success rate, remote and on-site support |
SLA compliance on Reckitt cover |
fastest single time reduction |
faster project delivery, average |
colleagues mentored on AI tooling |
The speed doesn't come from letting a model write the code and shipping it. It comes from compressing the parts that were always mechanical, then spending the saved time on review.
The gate is the whole point. I don't merge code I can't explain line by line. Generated output is a first draft with a confident tone, not a decision. Every branch gets read, every assumption gets named, and anything I can't defend in review goes back.
🤖 Model Context Protocol · how I wire LLMs into real systems
MCP is an open standard for connecting LLM applications to external data and tools. In practice it's what turns a chatbot into something that knows your ticket queue, your asset register, and your SOPs, without pasting any of it into a prompt.
What I build on top of it
- 🕹️ Autonomous agents that run multi-step tasks with a human only at the decision points
- 🐝 Multi-agent systems where specialists split a problem and reconcile their answers
- 🔗 RAG pipelines grounded in organisational knowledge, with citations back to the source
- ⚖️ Workflow automation where the LLM makes the judgement call and the audit log makes it reviewable
⚖️ Responsible AI · the non-negotiables
| Principle | What it means on a Tuesday |
|---|---|
| Understand every line | If I can't explain why it's there, it doesn't merge, regardless of what generated it |
| Review, don't accept | Generated code is a first draft with a confident tone, not an answer |
| Context over templates | Solutions fitted to this org's constraints, not a generic scaffold with the names swapped |
| Explainability | Decisions an auditor can trace, not a black box with a good demo |
| Bias & fairness | Checked where the output touches people: routing, prioritisation, approvals |
| Privacy first | Sensitive data stays inside the boundary; retrieval is scoped and logged |
| Security by default | Least privilege on every tool an agent can reach |
Building the applications is one side. The other is keeping enterprise estates running: remote support daily, on client sites when the fault needs hands on the hardware. Most weeks contain both.
Across that queue I close 96% of what comes in, whether it starts as a remote session or a drive to site. The 4% that does not is the genuinely escalated tail: vendor firmware, a hardware RMA, a change that needs an owner who is not me.
|
Defender XDR / EDR alert triage, isolation, exclusions Antivirus policy, exceptions, false-positive analysis Windows admin GPO, imaging, patching, device compliance Microsoft 365 Entra ID, Exchange Online, Teams, SharePoint Licensing assignment, tenant hygiene, access reviews |
Virtualisation VMware ESXi, Hyper-V, snapshots, resource contention Windows Server AD, DNS, DHCP, file services, backup and restore Network faults VLAN, firewall rules, VPN, routing, latency Diagnosis packet capture, log correlation, root-cause writeups Remote support fast triage before anyone drives anywhere |
The fault behind this one: a datastore disk pulled out of a dead ESXi host, sitting in a USB enclosure, on a Windows machine with no driver for the filesystem. Disk Management offers to format it. This is the way back instead. The enclosure is handed to WSL2 with usbipd, vmfs6-fuse mounts the VMFS6 volume, and each virtual machine is copied out with the right tool per file.
- 🧲
ddrescuefor the flat disk images, so bad sectors are retried and an interrupted run resumes from its mapfile - 📄
rsyncfor the descriptors and the small files, with progress reported per folder - 🔒 Reads the source and nothing else, and the copy registers on a fresh ESXi 8 host with
vim-cmd solo/registervm - 🧯 Every failure mode in the runbook is one that actually happened during the recovery
PowerShell Bash WSL2 VMFS6 ddrescue ESXi 8
On-site is a diagnostic tool, not a fallback. Plenty of faults only reveal themselves in front of the rack: a link that renegotiates when the room warms up, a finisher that jams on one paper weight. I go when the evidence is physical, and solve it remotely when it isn't.
Print deployments fail when a product's defaults get imposed on an organisation that works differently. So the sequence is audit, design, pilot, rollout, measure, and the custom application work exists because the last mile is almost never in the box.
|
Platforms |
Bespoke reports the breakdown finance asked for, not the built-in one System bridges pushing usage into ERP, billing and approval flows Workflow glue approval rules the platform can't express natively Provisioning scripted onboarding across a mixed device fleet Dashboards fleet health and consumables, ahead of the callout |
Every one of those custom pieces started as the same sentence in a requirements meeting: "can it also do…". The honest answer is usually not out of the box, and that gap is exactly where a small, well-scoped application earns its keep.
|
MCP integration · AI agents · RAG Rapid development · Prompt/context engineering |
Web · Mobile · Backend Clean architecture · Defensible code |
ServiceNow · ITIL · Defender XDR / EDR DNS · DHCP · VLAN · VPN · firewalls |
|
Operational dashboards SLA & cycle-time reporting |
Fleet design & deployment Secure release · Cost recovery |
Stakeholder scoping L2/L3 incident response |
Models are useful to me in three places: reading things faster than I can, writing the first draft of code I then review, and turning a solved problem into a rule that never needs a model again. That last one matters most. If a model has to fire on every run of a known input, something upstream failed.
Note
Mostly private codebases. Architecture, safeguards, and outcomes are shown here. Linkora, SCRAPLY and the backup pipeline ship inside private infrastructure, so there is no repository to open. The MyQ rule is the exception: it is published in full, runbook included.
|
Self-hosted PWA that turns saved links into something you can actually ask questions of. Grounded answers over hybrid retrieval, dense vectors and BM25 fused with reciprocal rank fusion, with citations that deep-link back to the sentence they came from.
|
Extraction platform where every domain earns a recipe: the tier that worked, the fingerprint, the selectors, the escalation ladder. When a site redesigns, the recipe repairs itself, and a brand new site inherits from its nearest neighbour in pgvector space.
|
|
Seven-step backup pipeline that runs at 9AM and 7PM under Task Scheduler and needs nobody watching it. A PHP linked-server engine streams attendance tables off a remote SQL instance, then SQL backups, drive mirrors, SFTP pulls and disk cleanup run in order.
|
A customer needed one colour device reserved for colour work. Too many users to touch a single PC, so the whole thing had to happen server side. A PHP parser script on the release queue inspects the job and moves mono work to a queue whose printer list simply does not include that device.
|
Internal systems built for enterprise clients, plus two builds whose source is public. The client systems run inside client infrastructure, so there is no repository to open, and the numbers on them are the ones the business signed off on.
The site at aniksarkerakash.com ships from one private repository with four Vite entries. They share design tokens and almost nothing else: a scroll-driven portfolio, the engine that renders the writing, the CMS that publishes it, and a lab for the things that fit nowhere else. Each one is its own build, its own chunk, and its own set of rules about what it is allowed to load.
|
Six sticky sections. A hand-built SVG stage pins to the right half of the viewport while the narrative scrolls past on the left, and every timeline is scrubbed, so the animation position is the scroll position rather than a duration playing out on its own clock.
|
|
|
|
A rack of tuned tubes hanging in wind you control. The clapper and the tubes are deliberately different pendulums, a light clapper on a long arm that lags and heavy tubes on short arms that follow, so strikes fall out of the phase difference between them rather than off a timer. Gentle wind reaches only the middle tubes. A gust reaches the whole rack.
|
🧪 Lab systems · prompts and hidden behavior
The lab is where I turn claims about models into interfaces you can inspect, move, and falsify. The two newest experiments are deliberately different: one makes prompt construction explicit before a model is involved; the other shows why visible language is not enough to infer the decision underneath it.
This is not a bigger prompt textarea. It is a compiler for the semantic document behind a prompt: intent, authorization, audience, evidence, assumptions, entities, constraints, scope, trust boundaries, output contracts, schemas, quality gates, and provenance.
- 🧬 Typed intermediate representation. Form fields become
prompt-ir/1.0, with stable evidence IDs, entity aliases, explicit authorization (advise,diagnose,review, orimplement), and versioned provenance. The prompt is compiled from meaning, not assembled from fragile string fragments. - 🛡️ Safety is part of the artifact. False-premise handling, permission boundaries, allowed targets and resources, invariants, citation rules, output schemas, and reporting obligations compile into the final prompt instead of living in a separate checklist somebody can forget.
- 💻 The complete version works locally. No account or provider key is required. The browser deterministically produces an inspectable Markdown artifact, fingerprints it with SHA-256, and lets the user copy or download exactly what was compiled.
- 🔐 Refinement is optional and isolated. Provider keys stay server-side. The PHP boundary enforces same-origin requests, rotating request tokens, body/runtime limits, per-client and global quotas, allowlisted provider endpoints, strict IR validation, retries, and response-hash verification.
- 🧾 Audit without prompt leakage. Operational audit records use keyed document references and provider/request metadata; raw prompt content is deliberately excluded. If refinement is unavailable or fails, the local artifact remains usable and unchanged.
- 🧪 The behavior is probed, not assumed. Desktop and mobile checks verify 20+ structured controls, stable evidence IDs, authorization and false-premise clauses, artifact hashes, reset behavior, zero horizontal overflow, and no runtime errors.
→ Open the Prompt Compiler · → Read the prompt-engineering analysis
The console separates what an agent says from what it decides. Drag a vector through a valence/arousal field: the visible reply remains byte-identical, while the probability underneath it crosses a seeded threshold and can flip the action.
- 📐 Calibrated where the evidence exists. The field anchors the published readings at calm
+0.05 → 0%, unsteered→ 22%, and desperate+0.05 → 72%, then interpolates along the calm-to-desperate axis. - 🚧 The illustration labels its limits. Positions beyond the measured anchors are visibly marked as extrapolation. The scenarios and replies are hand-written, and the interface states plainly that no model is being queried.
- 🎲 A rate becomes a reproducible decision. Each URL seed selects a scenario and a stable flip threshold between 12% and 82%, so a shared
?s=link reproduces the same case and decision boundary instead of jittering on every pointer move. - 🧭 The control is a real instrument. Pointer capture keeps dragging coherent, the puck is clamped to the circular field, named emotion anchors are clickable, and arrow keys plus
Homemake the continuous control usable without a mouse. - 🔬 The central claim has a regression test. The probe moves to the two measured poles, confirms the 0% and 72% readings, and compares the visible response character for character to prove that the prose did not move when the decision did.
→ Use the Steering Console · → Read what the calibration represents
🔎 What the build does before any of it ships
npm run build takes about nine seconds, and most of that is not Vite. The SEO work is a build step rather than a plugin, because every piece of it needed a decision that a default would have made badly.
| Step | What it does, and why it exists |
|---|---|
prerender-posts.mjs |
Writes a static HTML file per post with a real <title>, canonical, Open Graph and Twitter cards and BlogPosting JSON-LD. .htaccess serves those to bots and the SPA to humans, so LinkedIn, X, Slack and Google unfurl each post without running any JS |
og-posts.mjs |
Per-post preview cards, rendered by whichever Chrome or Edge is already installed via --headless --screenshot rather than pulling in puppeteer and its ~300 MB browser. Content-hashed, skipped when unchanged, and it soft-fails rather than break a build over a preview image |
relatedness.mjs |
Related posts by IDF-weighted tag overlap. A raw shared-tag count would call almost everything a neighbour, because one tag covers most of the archive. Rare tags score high, common ones count for nearly nothing, hand-written body links outweigh the tag maths, and a second pass repairs orphans without creating new ones |
| Topic clusters | /blog/topics/<slug> groups posts by tag sets instead of one page per tag, which would have produced a bloated duplicate of the index plus a dozen single-item stubs. Each hub leads with prose, because a page that is only a list of links ranks for nothing |
csp.mjs |
Locks the Content-Security-Policy script-src to the exact hashes of the inline boot scripts, after the hashes are known |
rss.mjs |
feed.xml, sitemap.xml, llms.txt, and the seed the PHP API initialises from on first deploy |
The rule that shapes every entry. A reader pays for the page they opened, not the one next door. The blog never downloads GSAP, anime.js or Lenis. The admin panel sits behind a lazy chunk no reader touches. Chimes ships its shader and audio graph only on the route that rings; Prompt Compiler and Steering Console each have their own HTML/Vite entry, fallback route, metadata, and test probe. Separate entries are the cheap way to keep that honest.
I write about AI-assisted development, debugging LLM output, and troubleshooting methodology at aniksarkerakash.com/blog, rendered and published by the two builds above.
- The AI race split in four: what changed by August 14, 2026
- The dial nobody can see: what Anthropic actually found inside Claude
- The bottleneck was never the model: what Anthropic's 21% to 95% actually measured
- Did they nerf it? What actually happens when a model gets worse
- The receipts: auditing the Claude Opus 5 optimization ecosystem




