<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Backend Show]]></title><description><![CDATA[No-nonsense backend engineering insights that clearly explain the what, why, and when.]]></description><link>https://yesabhishek.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!KbYR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cdb2bd-b10b-4c2b-acdf-8a92c790f835_1280x1280.png</url><title>The Backend Show</title><link>https://yesabhishek.substack.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 13 Jul 2026 09:20:17 GMT</lastBuildDate><atom:link href="https://yesabhishek.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Abhishek]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[yesabhishek@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[yesabhishek@substack.com]]></itunes:email><itunes:name><![CDATA[Abhishek]]></itunes:name></itunes:owner><itunes:author><![CDATA[Abhishek]]></itunes:author><googleplay:owner><![CDATA[yesabhishek@substack.com]]></googleplay:owner><googleplay:email><![CDATA[yesabhishek@substack.com]]></googleplay:email><googleplay:author><![CDATA[Abhishek]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Real Architecture Behind Production AI Agents]]></title><description><![CDATA[Most agentic AI diagrams look simple on the surface.]]></description><link>https://yesabhishek.substack.com/p/the-real-architecture-behind-production</link><guid isPermaLink="false">https://yesabhishek.substack.com/p/the-real-architecture-behind-production</guid><dc:creator><![CDATA[Abhishek]]></dc:creator><pubDate>Tue, 05 May 2026 06:20:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!SXOj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>They usually follow a clean flow:</p><pre><code><code>Context &#8594; Rules &#8594; Agents &#8594; Action</code></code></pre><p>It looks elegant. It is easy to explain. It makes for a good pitch deck.</p><p>But once you start thinking like a backend engineer, the architecture becomes much more nuanced.</p><p>A production-grade multi-agent system is not just a few AI agents connected to Slack, Jira, GitHub, Outlook, or SharePoint. That is the easy version. The harder version is building the operating layer around those agents so that they can reliably understand context, respect permissions, coordinate work, take action, recover from failures, and remain observable end to end.</p><p>That is where the real engineering begins.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SXOj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SXOj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png 424w, https://substackcdn.com/image/fetch/$s_!SXOj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png 848w, https://substackcdn.com/image/fetch/$s_!SXOj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!SXOj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SXOj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png" width="1456" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3169573,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/196510451?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SXOj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png 424w, https://substackcdn.com/image/fetch/$s_!SXOj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png 848w, https://substackcdn.com/image/fetch/$s_!SXOj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!SXOj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf10406d-a6e9-4d8e-b5b8-21b6b8f44764_2064x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>From AI demo to production system</h2><p>A demo answers a question.</p><p>A production system completes work.</p><p>That difference matters.</p><p>When we talk about AI agents inside an enterprise, we are not just talking about a chatbot that can summarise a document or answer a question from a knowledge base. We are talking about systems that can interact with business tools, understand company-specific context, create tickets, update documents, review code, triage bugs, generate reports, escalate to humans, and make decisions within well-defined boundaries.</p><p>The moment an AI system starts taking action, the architecture has to mature.</p><p>You need to ask:</p><ul><li><p>Can the agent access only what the user is allowed to access?</p></li><li><p>Can it explain why it took a particular action?</p></li><li><p>Can it recover if a task fails midway?</p></li><li><p>Can two agents coordinate on the same workflow?</p></li><li><p>Can a human review or override important actions?</p></li><li><p>Can the system be audited later?</p></li><li><p>Can we measure quality, cost, latency, and business impact?</p></li></ul><p>These are not minor implementation details. These are the difference between a toy system and something that can be trusted in a real organisation.</p><div><hr></div><h2>The high-level architecture</h2><p>The way I think about a production-grade agentic system is through a few major layers:</p><pre><code><code>Connectors
Identity &amp; Access Control
Context &amp; Knowledge Layer
Orchestration Layer
Agent Execution Layer
Policy &amp; Guardrails
State &amp; Memory
Control Plane / Observability
Human-in-the-Loop</code></code></pre><p>Each layer solves a different problem. More importantly, each layer prevents the system from becoming a black-box automation engine with too much access and too little control.</p><div><hr></div><h2>1. Connectors</h2><p>The first layer is the connector layer.</p><p>This is where the system connects to tools like:</p><pre><code><code>Outlook
Teams
SharePoint
Slack
Jira
GitHub
Confluence
Box
OneDrive
Google Drive
Notion</code></code></pre><p>These connectors bring in the raw material that agents need to reason and act.</p><p>Emails, tickets, pull requests, meeting notes, product specs, incident reports, customer feedback, documents, roadmaps, analytics, and internal discussions all become part of the broader enterprise context.</p><p>But connectors are not just API integrations. That is an oversimplification.</p><p>A good connector layer needs to handle sync jobs, webhooks, rate limits, pagination, retries, incremental updates, deleted documents, permission changes, metadata, and source-specific quirks.</p><p>For example, syncing Slack messages is very different from syncing SharePoint documents. GitHub pull requests are different from Jira tickets. Outlook email threads are different from Confluence pages.</p><p>The connector layer has to normalise all of this without destroying the original meaning and structure of the data.</p><div><hr></div><h2>2. Identity and access control</h2><p>This is one of the most important parts of the architecture.</p><p>AI cannot operate safely in an enterprise if it uses one global service account for everything.</p><p>That model is risky because it can expose information to users who should not have access to it. If a user asks a support agent a question, the system should not retrieve confidential finance documents, HR documents, private engineering notes, or restricted customer data just because those documents exist in the index.</p><p>This is where identity and permission propagation become critical.</p><p>A serious architecture needs:</p><pre><code><code>OAuth / SSO
User-scoped tokens
Service accounts where appropriate
ACL sync
Document-level permissions
RBAC / ABAC
Audit scope</code></code></pre><p>The system needs to understand not only what information exists, but also who is allowed to see it and under what conditions.</p><p>This also affects <strong>RAG</strong>.</p><p>Permission-aware retrieval is not optional. If the vector database returns a chunk from a restricted document, the damage is already done. Access control has to be enforced during indexing, retrieval, and action execution.</p><p>In simple terms: The agent should not know what the user is not allowed to know.</p><div><hr></div><h2>3. Context and knowledge layer</h2><p>The context layer is where enterprise knowledge becomes usable.</p><p>A lot of people reduce RAG to embeddings and vector databases. That is only one part of the story.</p><p>In a real system, the context and knowledge layer includes:</p><pre><code><code>Parsing
Chunking
Deduplication
Metadata extraction
ACL indexing
Vector search
Keyword search
Hybrid search
Reranking
Knowledge graph
Context assembly</code></code></pre><p>This layer has to take messy enterprise data and convert it into something agents can reliably use.</p><p>The challenge is that enterprise knowledge is usually fragmented. A single answer may require data from a Slack thread, a Jira ticket, a GitHub pull request, a product spec, and a customer email.</p><p>So the context layer needs to do more than retrieve &#8220;similar chunks.&#8221; It needs to retrieve the right information, from the right sources, with the right permissions, in the right order, and with enough metadata for the agent to reason properly.</p><p>Good retrieval is not just about semantic similarity. It is about relevance, freshness, authority, permission, source quality, and task fit.</p><div><hr></div><h2>4. Orchestration layer</h2><p>This is the layer that is often missing from simple agent diagrams.</p><p>Agents do not magically coordinate with each other.</p><ul><li><p>If a Product Agent drafts a spec, how does the Engineering Agent know when to start implementation?</p></li><li><p>If the Engineering Agent creates a pull request, how does the QA Agent know when to test it?</p></li><li><p>If the QA Agent finds a bug, how does the workflow go back to Engineering?</p></li><li><p>If the task takes 20 minutes, where is the state stored?</p></li><li><p>If something fails, who retries it?</p></li></ul><p>This is why the orchestration layer is so important. It usually includes:</p><pre><code><code>Supervisor agent
Task router
Workflow graph
Event bus
Queue / scheduler
Retries and timeouts
Async execution
Webhooks and callbacks</code></code></pre><p>In many systems, this might look like a hierarchical agent setup where a supervisor agent decomposes tasks and delegates work. In others, it might look more like an event-driven backend with queues, workers, and state machines.</p><p>The exact implementation can vary. But the principle remains the same:</p><p><strong>Agents need orchestration, not just prompts.</strong></p><p>Without orchestration, agents become isolated blocks that can respond individually but cannot reliably complete multi-step work.</p><div><hr></div><h2>5. Agent execution layer</h2><p>The agent execution layer is where specialised agents perform work.</p><p>Examples:</p><pre><code><code>Engineering Agent
Product Agent
Support Agent
QA Agent
Ops Agent
Research Agent</code></code></pre><p>Each agent can have its own tools, prompts, memory, permissions, and evaluation criteria.</p><p>The Engineering Agent may work with GitHub, CI/CD logs, code search, and technical specs.</p><p>The Product Agent may work with customer feedback, roadmaps, product requirements, and analytics.</p><p>The Support Agent may work with tickets, help docs, customer history, and escalation policies.</p><p>The QA Agent may work with test cases, bug reports, staging environments, and release criteria.</p><p>But this is important: Agents should not act freely.</p><p>They need boundaries.</p><p>A production system should define which tools each agent can use, what actions require approval, what outputs need validation, and what data each agent can access.</p><p>The more powerful the agent, the stronger the governance needs to be.</p><div><hr></div><h2>6. Policy and guardrails</h2><p>A common architectural mistake is placing &#8220;Rules&#8221; directly between Context and Agents, as if every data flow must synchronously pass through one central rule engine.</p><p>That can quickly become a bottleneck. A better way to think about it is as a cross-cutting policy layer. Policy and guardrails should apply across the system:</p><pre><code><code>Input validation
Retrieval permissions
Prompt guardrails
Tool access control
Output validation
Approval policies
Compliance rules</code></code></pre><p>This layer should not necessarily be a single box blocking every request. It should be enforced at multiple points in the lifecycle.</p><p>Before retrieval. Before tool calls. Before external actions. Before final output. Before irreversible operations.</p><p>For example, reading a document, creating a Jira ticket, commenting on a GitHub PR, sending an email, and deleting a resource are not equal-risk actions. They should not have the same approval flow.</p><p>Good policy design is risk-aware.</p><div><hr></div><h2>7. State and memory: agents need continuity</h2><p>Another underrated part of agentic architecture is state.</p><p>Most useful work does not happen in a single request-response cycle.Real workflows are long-running.</p><p>An agent may need to:</p><pre><code><code>Investigate a bug
Read logs
Check recent deployments
Open related Jira tickets
Review a pull request
Ask for human approval
Wait for CI to finish
Update a customer-facing response
Close the loop with support</code></code></pre><p>That workflow may span minutes, hours, or even days. So the system needs state and memory.</p><p>This includes:</p><pre><code><code>Workflow state
Task history
Short-term memory
Long-term memory
Conversation memory
Checkpoints
Agent scratchpads</code></code></pre><p>State allows the system to pause, resume, retry, recover, and explain what happened. Without state, the system is just a stateless chatbot trying to behave like a worker That does not scale.</p><div><hr></div><h2>8. Async execution</h2><p>Many agent tasks are not instant. Running tests takes time.</p><ul><li><p>Building a branch takes time.</p></li><li><p>Waiting for a GitHub webhook takes time.</p></li><li><p>Syncing documents takes time.</p></li><li><p>Generating a report from multiple sources takes time.</p></li><li><p>Getting human approval takes time.</p></li></ul><p>This is why asynchronous execution is a core part of the system, not an implementation detail.</p><p>A serious backend needs:</p><pre><code><code>Job queues
Workers
Schedulers
Webhooks
Callbacks
Retries
Dead-letter queues
Timeout handling</code></code></pre><p>This allows the system to handle long-running workflows without blocking the main interaction.</p><p>It also makes the system more resilient. Failures can be retried. Jobs can be resumed. Dead tasks can be inspected. Humans can intervene where needed.</p><div><hr></div><h2>9. Control plane and observability</h2><p>Once agents start taking action, observability becomes non-negotiable.</p><p>You need to know what the system did, why it did it, which tools it used, what context it retrieved, how much it cost, how long it took, and whether the output was useful.</p><p>The control plane should include:</p><pre><code><code>Logs and traces
Metrics and KPIs
Audit trails
Evaluations
Cost monitoring
Configuration
Incident visibility
Human review flows</code></code></pre><p>For traditional software, observability tells you whether the system is up.</p><p>For AI systems, observability also needs to tell you whether the system is good. That means tracking quality, accuracy, hallucination rates, retrieval quality, tool-call success, task completion rate, escalation rate, approval rate, and business impact.</p><p>The system should be measurable not only at the infrastructure level, but also at the reasoning and workflow level.</p><div><hr></div><h2>10. Human-in-the-loop</h2><p>Human-in-the-loop should not be treated as a fallback after everything fails.</p><ul><li><p>It should be designed into the workflow.</p></li><li><p>Some actions should be fully automated.</p></li><li><p>Some should require review.</p></li><li><p>Some should require approval only above a risk threshold.</p></li><li><p>Some should always escalate.</p></li></ul><p>For example:</p><ul><li><p>Reading public documentation may not need approval.</p></li><li><p>Drafting a Jira ticket may not need approval.</p></li><li><p>Sending an external customer email may need approval.</p></li><li><p>Merging a pull request should probably need approval.</p></li><li><p>Changing production infrastructure should definitely need approval.</p></li></ul><p>The point is not to slow down automation. The point is to make automation trustworthy. Human control gives the system a safe path to operate in high-stakes environments.</p><div><hr></div><h2>The real difference</h2><p>The difference between a demo and a production-grade agentic system is not the model. It is the architecture around the model. A demo can answer a question.</p><p>A production-grade system needs to:</p><pre><code><code>Understand context
Respect permissions
Retrieve the right knowledge
Coordinate multiple agents
Handle long-running workflows
Take safe actions
Recover from failures
Escalate to humans
Remain observable
Improve over time</code></code></pre><p>That is why I find this space so interesting.</p><ul><li><p>The future is not just &#8220;AI agents.&#8221;</p></li><li><p>The more interesting layer is the AI work execution layer around them.</p></li><li><p>The infrastructure that connects agents to enterprise systems.</p></li><li><p>The orchestration that allows them to coordinate.</p></li><li><p>The permissions that keep them safe.</p></li><li><p>The memory that gives them continuity.</p></li><li><p>The observability that makes them measurable.</p></li><li><p>The human controls that make them trustworthy.</p></li></ul><p>That is where agentic systems start becoming real production systems, not just impressive demos.</p>]]></content:encoded></item><item><title><![CDATA[Building a GitHub Backed Pastebin CLI in Go]]></title><description><![CDATA[Why I ditched bloated note apps and built a local first, autosaving terminal editor for my daily snippets.]]></description><link>https://yesabhishek.substack.com/p/building-a-github-backed-pastebin</link><guid isPermaLink="false">https://yesabhishek.substack.com/p/building-a-github-backed-pastebin</guid><dc:creator><![CDATA[Abhishek]]></dc:creator><pubDate>Mon, 20 Apr 2026 19:04:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!44fe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There is a specific kind of frustration that happens when you are deep in the terminal and just need a place to drop a quick text snippet.</p><p>Working as a Senior Software Engineer at ValueLabs, my day usually involves juggling complex distributed systems, tracing logs, and debugging backend logic. When you are knee deep in Python and Django configurations, context switching is the absolute enemy. Opening a bloated web browser to paste a JSON payload or a stack trace into a random web pastebin breaks that flow. It is also a massive privacy risk for proprietary code.</p><p>I needed a solution that was fast, lived entirely in the terminal, and securely synced across my machines without requiring a heavy database.</p><p>So, I built <strong>pb</strong>, a personal Pastebin CLI.</p><p></p><h3>The Problem: The Note App Bloat</h3><p>The modern developer ecosystem is filled with note taking applications. However, they all suffer from the same fundamental flaws when applied to quick developer workflows. They require leaving the terminal environment, they consume massive amounts of system memory, and they lock your data into proprietary formats.</p><p>I wanted a system with strict requirements:</p><ul><li><p><strong>Local First:</strong> It must work offline and keep a local cache of files.</p></li><li><p><strong>Autosave:</strong> I should never lose a draft if I accidentally close the terminal window.</p></li><li><p><strong>Version Control:</strong> I need a durable history of my snippets to track changes over time.</p></li><li><p><strong>Secure Storage:</strong> It should use infrastructure I already trust and control.</p></li></ul><p></p><h3>The Solution: Enter Go and GitHub</h3><p>While my daily professional stack leans heavily into Python and Next.js, I wanted this CLI to be blazingly fast and compiled into a single executable binary. Go was the absolute perfect language for the job.</p><p>Instead of spinning up a dedicated AWS RDS instance or a complex database to store simple text files, I realized I already had the ultimate free, version controlled storage backend at my fingertips: GitHub.</p><p>The <code>pb</code> CLI leverages the official GitHub CLI tool for secure authentication. When you run the initialization command, it automatically spins up a dedicated private repository called <code>pastebin-cli-store</code> on your personal GitHub account. This repository acts as the secure, hidden backend for all your text snippets.</p><p></p><h3>Sync and Autosave</h3><p>Building a synced CLI tool is incredibly tricky. You have to handle offline edits, remote conflicts, and local state management seamlessly.</p><p>Here is how the architecture handles the flow of data.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!44fe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!44fe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!44fe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!44fe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!44fe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!44fe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png" width="1440" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:375545,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/194833140?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!44fe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!44fe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!44fe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!44fe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9196a17-5b13-41a7-9ca3-426ecca22367_1440x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The tool utilises an intelligent local data layout stored safely under the user configuration directory.</p><ul><li><p><strong>State Management:</strong> It tracks file metadata and pending operations locally using a journal system.</p></li><li><p><strong>Recovery:</strong> As you type in the built in terminal editor, <code>pb</code> runs a background autosave. These recovery snapshots protect your local drafts without spamming your GitHub commit history with unnecessary remote versions.</p></li><li><p><strong>Durable Versions:</strong> A remote, durable version is only created upon an explicit save or sync command.</p></li></ul><p>If you edit a file on your work laptop and then open it on your home machine, the explicit <code>sync</code> command reconciles the changes. Instead of blindly overwriting data and causing data loss, the CLI safely handles conflicts by creating conflict copies.</p><p></p><h3>Installation and Upgrades</h3><p>One of the biggest hurdles with internal tooling is distribution. I wanted this to be installable without requiring <code>sudo</code> or administrator rights.</p><p>I wrote shell installers for macOS and Linux, and a PowerShell script for Windows. These scripts pull the compiled Go binary directly from the GitHub releases and place it in a user owned bin directory.</p><p>To keep the tool updated, I baked in a self upgrading mechanism. The CLI checks GitHub for a newer release approximately once a day. You can set upgrade policies to auto, prompt, or manual, ensuring you are always running the latest version without being forcefully interrupted mid thought.</p><p></p><h3>Final Thoughts</h3><p>Building <code>pb</code> was an incredible exercise in local first architecture and CLI design. It solved a highly specific itch in my daily workflow. I no longer rely on clunky web apps to store my terminal outputs. I just type <code>pb new notes/today.txt</code>, drop my code, and hit save.</p><p>Sometimes, the best tools are not the massive enterprise platforms. They are the small, sharp, highly focused utilities we build for ourselves.</p><p>Till next time, happy coding :)</p>]]></content:encoded></item><item><title><![CDATA[Retrieval Augmented Generation (RAG 101)]]></title><description><![CDATA[The Developer&#8217;s Guide to Grounding AI]]></description><link>https://yesabhishek.substack.com/p/retrieval-augmented-generation</link><guid isPermaLink="false">https://yesabhishek.substack.com/p/retrieval-augmented-generation</guid><dc:creator><![CDATA[Abhishek]]></dc:creator><pubDate>Thu, 20 Feb 2025 12:54:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KfMe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s cut through the noise. Retrieval-Augmented Generation (RAG) isn&#8217;t just a buzzword; it&#8217;s the definitive architectural pattern for building modern, context-aware AI applications.</p><p>If you&#8217;ve spent any time working with Large Language Models (LLMs), you know they have a fatal flaw: they are confident liars. They hallucinate, they have strict training knowledge cutoffs, and they know absolutely nothing about your proprietary database, private codebases, or internal company wikis.</p><p>RAG bridges that gap. It takes your unstructured data&#8212;PDFs, Notion docs, Markdown files&#8212;and turns it into a searchable, semantic engine. It fetches exact, relevant context and feeds it directly into the LLM&#8217;s brain just in time to answer a user&#8217;s question.</p><p></p><h2>The Core Process: How RAG Actually Works</h2><p>Before we look at the implementation, let&#8217;s map the architecture. At its heart, RAG is a two-step dance: an indexing pipeline and a retrieval pipeline.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KfMe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KfMe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png 424w, https://substackcdn.com/image/fetch/$s_!KfMe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png 848w, https://substackcdn.com/image/fetch/$s_!KfMe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png 1272w, https://substackcdn.com/image/fetch/$s_!KfMe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KfMe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png" width="1456" height="1714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1714,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:155267,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/157542143?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KfMe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png 424w, https://substackcdn.com/image/fetch/$s_!KfMe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png 848w, https://substackcdn.com/image/fetch/$s_!KfMe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png 1272w, https://substackcdn.com/image/fetch/$s_!KfMe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F369fed15-fb96-41bc-a3d2-c5a26f13a9d2_1514x1782.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Architecture</figcaption></figure></div><h3>1. Ingestion and Indexing</h3><p>You don&#8217;t just dump a 100-page PDF into an LLM. You parse it and split it into manageable &#8220;chunks&#8221; (usually a few hundred tokens each) using something like a recursive character text splitter to ensure you don&#8217;t cut paragraphs in half.</p><p>Next, you pass these chunks through an <strong>Embedding Model</strong> (like OpenAI&#8217;s <code>text-embedding-3-small)</code>. This model converts human text into a dense vector&#8212;a massive array of floating-point numbers representing the semantic meaning of the text. We store these vectors in a Vector Database (like Pinecone, Qdrant, or a pgvector extension).</p><h3>2. Retrieval and Generation</h3><p>When a user asks, &#8220;What is our company&#8217;s refund policy?&#8221;, we embed that query into a vector too. The Vector DB performs a similarity search&#8212;calculating the mathematical distance between vectors using formulas like Cosine Similarity: </p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;$\\text{similarity} = \\frac{A \\cdot B}{||A|| \\times ||B||}$.&quot;,&quot;id&quot;:&quot;ZCIWKKFWIP&quot;}" data-component-name="LatexBlockToDOM"></div><p>It returns the top 5 most mathematically relevant text chunks. We then shove those chunks into the system prompt, look at the LLM, and say: <em>&#8220;Answer the user&#8217;s question using strictly the following context.&#8221;</em></p><p></p><h3>The Evolution of RAG Topologies</h3><p>The ecosystem has rapidly evolved beyond simple similarity search. Today, we categorise RAG into several advanced architectures:</p><ul><li><p><strong>Standard/Naive RAG:</strong> The foundational retrieval and generation pipeline.</p></li><li><p><strong>Corrective RAG (CRAG):</strong> Introduces a retrieval evaluator to assess the quality of fetched documents, triggering web searches if internal confidence is low.</p></li><li><p><strong>Speculative RAG:</strong> Predicts user intent and drafts multiple potential response pathways simultaneously to reduce latency.</p></li><li><p><strong>Fusion RAG (RAG-Fusion):</strong> Generates multiple variations of the user&#8217;s query, retrieves documents for all of them, and applies Reciprocal Rank Fusion to surface the absolute best context.</p></li><li><p><strong>Agentic RAG:</strong> Uses LLMs as reasoning agents to determine <em>if</em> they need to retrieve data, <em>where</em> to get it from, and iteratively query multiple tools until the user&#8217;s complex problem is solved.</p></li><li><p><strong>Graph RAG:</strong> Combines Vector DBs with Knowledge Graphs to understand complex entity relationships, solving the &#8220;scattered context&#8221; problem.</p></li></ul><p></p><h2>How to Build It: Choosing Your Stack</h2><p>When it comes to building a RAG pipeline in Python, you generally have three paths: going bare-metal with the raw SDKs, using an orchestration framework like LangChain or use a pre-packaged library like OpenRAG.</p><h3>Route 1: Close to the Metal (OpenAI &amp; Claude SDKs)</h3><p>Writing RAG entirely from scratch using the raw SDKs gives you absolute control over your token limits, error handling, and data flow. You aren&#8217;t fighting a framework; you&#8217;re just writing Python.</p><p>Typically, you use the <strong>OpenAI SDK</strong> to generate your embeddings. Once you handle the vector math and retrieve your chunks, you format the prompt yourself.</p><p>If you are using the <strong>Anthropic Claude SDK</strong> for the generation step, the code is beautifully explicit. You handle the message loop manually:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;7f51feb4-75aa-4712-8905-a426a8d031f1&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">import anthropic

client = anthropic.Anthropic(api_key="your_api_key")
# You write the logic to hit your Vector DB and return strings
retrieved_context = get_vector_search_results(user_query) 

system_prompt = f"You are a helpful assistant. Answer based ONLY on this context: {retrieved_context}"

response = client.messages.create(
    model="claude-3-5-sonnet-latest",
    max_tokens=1024,
    system=system_prompt,
    messages=[
        {"role": "user", "content": user_query}
    ]
)
print(response.content[0].text)
</code></pre></div><p>By using the raw Claude SDK, you can manually implement <strong>Prompt Caching</strong>. If you are constantly passing the same massive 50-page company handbook into the context window, you can flag that block of text to be cached natively via the API. Claude stores it, and your API costs drop by up to 90% for subsequent queries. Frameworks often obscure these low-level, money-saving features.</p><p></p><h3>Route 2: The Orchestrator (LangChain)</h3><p>If you don&#8217;t want to write the repetitive glue code for parsing PDFs, chunking text, and formatting prompts, <strong>LangChain</strong> is the heavy hitter in the space.</p><p>LangChain abstracts the entire RAG pipeline into composable blocks. You don&#8217;t have to write custom vector search logic; you just declare a retriever and pipe it together using LCEL (LangChain Expression Language).</p><p>Here is what a dense, modern LangChain pipeline looks like using OpenAI for both embeddings and generation:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;7f4b93d5-d8fb-4ec3-bf9f-63e9c2ed2662&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough

# 1. Set up the LLM and Embeddings via OpenAI
llm = ChatOpenAI(model="gpt-4o")
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 2. Assume we loaded and chunked documents earlier
vectorstore = FAISS.from_documents(chunks, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

# 3. Create the prompt template
template = """Answer the question based only on the following context:
{context}

Question: {question}"""
prompt = ChatPromptTemplate.from_template(template)

# 4. Chain it all together using LCEL
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
)

# Run it
response = rag_chain.invoke("What is the refund policy?")
print(response.content)
</code></pre></div><p>LangChain handles the heavy lifting. It runs the user query through the embedding model, queries FAISS (your local vector store), grabs the top 5 chunks, formats the string, calls OpenAI, and returns the parsed output&#8212;all cleanly executed in that <code>rag_chain</code> pipe.</p><p><strong>The Trade-off:</strong> LangChain is highly opinionated. When things go wrong, debugging a massive abstract chain of runnables can be incredibly frustrating. If you need tight, granular control over your architecture, the abstraction can feel like a straitjacket. But for rapid prototyping and standardised workflows, it is unbeatable.</p><p></p><h3>Route 3: OpenRAG (<strong>Pre-Packaged Stack)</strong></h3><p>You can take over your business problem immediately and implement a production-ready RAG architecture without the headache using OpenRAG</p><h3>The Trade-off</h3><p>You might worry that adopting a pre-packaged stack limits your flexibility. But if you truly understand the intricacies of vector search and generative orchestration, you know that building a <em>basic</em> RAG app takes a weekend, while building a <em>production-grade</em> RAG app takes months of finessing.</p><p>OpenRAG is an opinionated, open-source stack that does the heavy lifting for you. It packages everything you need into a single platform, giving you the fast time-to-market of a managed service with the zero vendor lock-in of an open-source project.</p><h2>Under the Hood</h2><p>What makes a pipeline like this different? It&#8217;s the time the community spent optimising the unglamorous parts of the data pipeline. It&#8217;s like sinking 100+ hours into GTA&#8212;you stop looking at the map because you know the exact layout of every back alley.</p><p>Here is a look at the architecture OpenRAG employs:</p><ul><li><p><strong>Docling for Intelligent Ingestion:</strong> It doesn&#8217;t just use blind, fixed-character chunking. It leverages Docling to handle messy, real-world data with intelligent semantic parsing, retaining document structure and tabular data integrity.</p></li><li><p><strong>OpenSearch for Retrieval:</strong> Instead of a basic vector store, it utilizes OpenSearch for production-grade performance, allowing you to combine dense vector search (for semantic meaning) with traditional search at a massive scale.</p></li><li><p><strong>Langflow for Orchestration:</strong> The real magic is the drag-and-drop workflow builder. You get a visual interface powered by Langflow for rapid iteration, agentic multi-tool coordination, and dynamic re-ranking to filter out noise and combat context-window dilution.</p></li><li><p><strong>Ready to Run:</strong> It ships with a React frontend (Next.js) and a FastAPI backend hooked up out of the box.</p></li></ul><p></p><h2>What&#8217;s Next for RAG?</h2><p>Global adoption across multiple modalities. Right now, RAG is heavily mistreated and under utilised as just a backend for &#8220;Chatbots.&#8221; It holds vastly more capability than that.</p><p>The industry is continuously working to make these architectures faster while providing an unparalleled UX. Moving forward, the focus isn&#8217;t just on PDFs&#8212;it&#8217;s on live, dynamic integrations. We are looking at pipelines that securely ingest and ground models using structured SQL Databases, Salesforce CRMs, Slack, Microsoft Teams, and other synchronous communication platforms. The future of RAG is ubiquitous enterprise intelligence.</p><p><em><a href="https://www.youtube.com/watch?v=4TxOBhDRRCM">Phil Nash breaks down the OpenRAG stack</a></em></p><p>This presentation provides an excellent technical overview of how OpenRAG combines Docling, OpenSearch, and Langflow to create a robust, production-ready retrieval architecture.</p><p></p><h2>Final Thoughts</h2><p>It&#8217;s an incredible time to be building software. The tools whether you choose the granular control of the Claude and OpenAI SDKs or the rapid orchestration of LangChain are right there for the taking.</p><p>Happy Coding :)</p>]]></content:encoded></item><item><title><![CDATA[Why We Built (and Killed) Describe AI]]></title><description><![CDATA[Lessons from 500 organic installs, prompt engineering nightmares, and the era of highly confident hallucinations.]]></description><link>https://yesabhishek.substack.com/p/vscode-extenstion-and-rise-of-ai</link><guid isPermaLink="false">https://yesabhishek.substack.com/p/vscode-extenstion-and-rise-of-ai</guid><dc:creator><![CDATA[Abhishek]]></dc:creator><pubDate>Thu, 20 Feb 2025 12:19:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KbYR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cdb2bd-b10b-4c2b-acdf-8a92c790f835_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>At the tail end of 2022, the tectonic plates of the technology industry shifted. OpenAI released a product that permanently altered our trajectory, effectively democratising machine learning and deep learning. Practically overnight, technology that had been locked behind the closed doors of massive corporate R&amp;D labs was suddenly accessible to the public. It was a paradigm shift that invited developers to think outside the box, leverage state-of-the-art models, and build products that were previously impossible for a small team to conceptualise.</p><p>I was one of those developers. When I got my hands on OpenAI&#8217;s API, the feeling was intoxicating. Suddenly, a single engineer had the computational reasoning power to architect, perform, and implement software solutions at the scale of a big-tech corporation.</p><p>The immediate question wasn&#8217;t <em>if</em> I should build something, but <em>what</em> to build.</p><p></p><h3>Finding the Friction: The Birth of Describe AI</h3><p>When brainstorming a use case, I wanted to solve a tangible problem that hindered developers on a daily basis. I gravitated toward a universal pain point in software engineering: code comprehension, documentation, and the steep learning curve of onboarding onto legacy codebases.</p><p>If we could use an LLM to explain dense logic in plain English, we could save developers countless hours of reverse-engineering undocumented functions. That was the genesis of <strong>Describe AI</strong>.</p><p>We built it as a frictionless, free plugin published directly on the VS Code Extension Marketplace. The UX was dead simple: highlight a cryptic block of code, right-click, and select <em>&#8220;Explain with Describe AI.&#8221;</em></p><p>Our launch strategy was virtually non-existent. We released the MVP incredibly fast, without a monetization strategy, revenue model, or marketing campaign. It was initially designed to be an internal sandbox tool&#8212;a way for us to poke at the edges of OpenAI&#8217;s capabilities.</p><p>The market response, however, caught us off guard. Within a single week, Describe AI amassed over 500 installs purely through organic discovery. We had tapped into a desperate, unmet need in the developer community. But with sudden traction comes the stark realisation of technical debt and architectural limits.</p><p></p><h3>Addressing the Elephant: The Limits of Early LLMs</h3><p>We quickly realised that we were running a marathon in a pair of flip-flops. While the extension worked like magic for isolated functions, it buckled under the weight of larger, enterprise-scale projects.</p><p>The reality of building on early-2023 LLM infrastructure was fraught with friction:</p><ul><li><p><strong>Context Window Starvation:</strong> The models at the time simply lacked the memory to ingest, parse, and accurately explain long, interconnected chunks of code or multi-file dependencies.</p></li><li><p><strong>API Instability:</strong> The APIs were highly unreliable and lacked the fine-grained parameters needed to tweak the output deterministically to our exact standards.</p></li><li><p><strong>The Fragility of Prompts:</strong> &#8220;Prompt engineering&#8221; often felt more like casting spells than writing software. Tweaking a prompt to fix one edge case almost invariably broke three others, leading to a frustrating cycle of regression.</p></li></ul><p>After running the service for a couple of months, we had to take a hard, objective look at the scaling trajectory. The scale was entirely out of our hands, bottlenecked by third-party compute limits.</p><p></p><h3>Sunsetting the Project: The Decision to EOL</h3><p>We made the difficult but obvious decision to mark Describe AI as <strong>End Of Life (EOL)</strong>.</p><p>The rationale was simple: we needed to wait for the technology to catch up to our ambition. We tabled the project with the explicit understanding that we might revive it when two conditions are met:</p><ol><li><p>The unit economics of running large models normalize.</p></li><li><p>LLMs evolve to handle vast, complex codebases without generating garbage output or confidently explaining &#8220;unicorn concepts&#8221; to junior engineers who wouldn&#8217;t know any better.</p></li></ol><p></p><h3>Final Thoughts: The Danger of Confident Lies</h3><p>Building Describe AI was an incredibly fun, chaotic, and educational experience. When it worked, it felt like peering into the future of software development. But when it failed, it did so with terrifying conviction.</p><p>The greatest lesson we learned was the danger of <strong>hallucinations</strong>. The model would routinely spin up entirely fictional explanations for code logic, presenting its answers out of thin air with a level of absolute confidence that even the most seasoned senior developers would hesitate to project. And much of it was a complete lie.</p><p>We gathered invaluable feedback from this localized experiment and learned exactly where the boundaries of modern AI lie. Describe AI is dormant for now, but the lessons it taught us about building AI-native products will be foundational for whatever we build next.</p><p>Till next time, Happy Coding.</p>]]></content:encoded></item><item><title><![CDATA[How We Turned Dumb CCTV Footage into a Smart API]]></title><description><![CDATA[Solving real-world estate management problems with Computer Vision, FastAPI, and AWS.]]></description><link>https://yesabhishek.substack.com/p/computer-vision-and-incident-tracking</link><guid isPermaLink="false">https://yesabhishek.substack.com/p/computer-vision-and-incident-tracking</guid><dc:creator><![CDATA[Abhishek]]></dc:creator><pubDate>Thu, 20 Feb 2025 12:03:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bCfa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There is a specific thrill that comes with working in software engineering&#8212;the moment you are handed a unique, tangible problem and told to build a bridge between the physical world and a digital system. Recently, we received an inquiry for a custom integration: a client needed an automated way to track, flag, and report physical rule violations using their existing surveillance infrastructure.</p><p>Here is a deep dive into how we architected the solution.</p><p></p><h3>The Problem Statement: Catching Bad Neighbours</h3><ul><li><p><strong>The Client:</strong> A housing society management company. </p></li><li><p><strong>The System:</strong> They already had a fully functional CRM to manage residents, but they were dealing with a highly manual, tedious problem. </p></li><li><p><strong>The Issue:</strong> Residents were violating society rules&#8212;specifically, throwing garbage out of their windows.</p></li></ul><div class="callout-block" data-callout="true"><p>The client wanted to integrate their CRM with a new API endpoint. The goal was simple but technically demanding: upload estate CCTV footage and automatically receive the exact timestamps and the specific Flat Numbers of the offending residents. They needed actionable data to issue warnings and fines, without having security guards manually watch hours of empty video.</p></div><p></p><h3>The Solution: Our Swiss Army Knife Approach</h3><p>When you have a strong foundation in backend development and distributed systems, a problem like this immediately starts looking like a data pipeline. The core idea was to break down the video into images, analyze those images, and return a structured report.</p><p></p><h4><strong>The Tech Stack</strong></h4><ul><li><p><strong>Web Framework:</strong> Django (Later migrated to FastAPI for better asynchronous performance and speed).</p></li><li><p><strong>Video Processing:</strong> OpenCV.</p></li><li><p><strong>Machine Learning/Vision:</strong> Google Vision API.</p></li><li><p><strong>Infrastructure:</strong> AWS API Gateway &amp; AWS Lambda.</p></li><li><p><strong>Message Broker:</strong> RabbitMQ.</p></li></ul><p></p><h4><strong>The Rationale &amp; Architecture</strong></h4><p>To make this easy to understand, think of a video not as a continuous movie, but as a flipbook of thousands of individual pictures (frames). Processing a whole video is heavy and slow. Processing specific, compressed pictures is fast and scalable.</p><p>Here is the step-by-step logic of our pipeline:</p><ol><li><p><strong>Ingestion:</strong> The CRM sends the video to our AWS API Gateway.</p></li><li><p><strong>Deconstruction:</strong> We use OpenCV to compress the video and extract key frames (images) at specific intervals.</p></li><li><p><strong>Analysis:</strong> These frames are sent to the Vision Model.</p></li><li><p><strong>Mapping:</strong> The model draws a &#8220;bounding box&#8221; around the detected object (e.g., falling garbage). We then cross-reference that box&#8217;s location with our static map of the building to identify the CCTV ID and the specific window/Flat Number.</p></li><li><p><strong>Reporting:</strong> We aggregate these events and send a clean JSON report back to the CRM.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bCfa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bCfa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!bCfa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!bCfa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!bCfa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bCfa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png" width="728" height="409.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:829091,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/157539795?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bCfa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!bCfa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!bCfa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!bCfa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F282b0881-b705-45f9-8e9d-61b2d27bc1a0_1920x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p></p><h3>Hard Work and Edge Cases</h3><p>The theory is always cleaner than the execution. Passing frames to a vision model to create bounding boxes is a neat trick, but making it reliable requires rigorous data engineering.</p><p>A massive shoutout to Sai, our Data Scientist, who helped turn this concept into reality. By packaging his computer vision logic into an API hosted on AWS API Gateway and decoupling the heavy lifting with RabbitMQ, we ensured the system could handle massive spikes in video uploads without crashing.</p><p>However, the AI is only as good as its context. Our team spent long weekends manually labeling and marking each CCTV viewpoint. We had to map out the exact pixel coordinates for every Flat Number on every camera feed to create our baseline database.</p><p>We also had to engineer our way around complex edge cases. What happens if multiple incidents occur in a single video source simultaneously? To solve this, we had to coordinate with the onsite client team to update the expected response schema. We shifted the API payload from returning simple <code>Strings</code> to <code>Lists of Strings</code>, allowing the CRM to ingest multiple timestamps and Flat IDs from a single video upload.</p><p></p><h3>Future Scope: Evolving the Eye</h3><p>The solution is currently in its testing phase, but the client is already seeing the potential of automated surveillance. They have requested an expansion of the system&#8217;s capabilities, including:</p><ul><li><p><strong>Acoustic Analysis:</strong> Detecting loud noises or disturbances.</p></li><li><p><strong>ANPR/ALPR:</strong> Identifying parked cars and automatically raising fines using registration number recognition.</p></li><li><p><strong>Biometrics:</strong> Shift attendance and roster management using facial recognition for estate staff.</p></li></ul><p></p><h3>Growing with the Cloud</h3><p>If there is one takeaway from this project, it is that data is constantly evolving, and our engineering skills must scale alongside it.</p><p>Designing a pipeline that can ingest, process, and return video data seamlessly required a deep reliance on cloud infrastructure. This project coincided with me officially clearing my AWS Certified Cloud Practitioner exam. Understanding the intricacies of how the cloud shapes distributed systems&#8212;and how to architect those systems efficiently&#8212;was the exact knowledge needed to make this API a success.</p><p>Till next time, Happy Coding :)</p>]]></content:encoded></item><item><title><![CDATA[Migrating a Legacy Insurance Engine to a Modern Stack]]></title><description><![CDATA[How we used MapReduce concepts to rescue an entire business trapped inside a Microsoft Excel file.]]></description><link>https://yesabhishek.substack.com/p/spreadsheet-parsing-and-automation</link><guid isPermaLink="false">https://yesabhishek.substack.com/p/spreadsheet-parsing-and-automation</guid><dc:creator><![CDATA[Abhishek]]></dc:creator><pubDate>Thu, 20 Feb 2025 11:24:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!w0qB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In 2021, shortly after I joined Blue Hex Software, we landed our very first client: an insurance provider based out of Miami, Florida. They came to us with a classic, high-stakes problem statement that many growing businesses eventually face.</p><p>Their core business revolved around selling customised insurance plans. To calculate the exact premiums and craft the right price for the end customer, they had built a highly complex, proprietary in-house pricing engine.</p><p>The catch? That &#8220;engine&#8221; was a monstrous Microsoft Excel spreadsheet.</p><p>They had hit the absolute limit of what a desktop application could handle. They needed a way to migrate their intricate business logic and calculations out of Excel and into a modern, scalable web application. The goal was to ensure seamless customer onboarding, retain the accuracy of their pricing algorithms, and layer a robust Management Information System (MIS) on top to monitor business growth.</p><p></p><h3>The Solution: A Resilient 3-Tier Architecture</h3><p>To replace a monolithic spreadsheet, we couldn&#8217;t just build a simple CRUD app. We proposed a robust 3-tier architecture designed for scalability, easy maintenance, and future growth. Drawing on heavy backend and distributed systems experience, we finalised a highly capable stack:</p><ul><li><p><strong>Frontend:</strong> Next.js (For a fast, SEO-friendly, and reactive user interface)</p></li><li><p><strong>Backend:</strong> Python with Django (To handle the complex business logic and API routing)</p></li><li><p><strong>Database:</strong> PostgreSQL, hosted on AWS RDS (For robust relational data integrity)</p></li><li><p><strong>Containerization:</strong> Docker (Ensuring environment parity across staging and production)</p></li><li><p><strong>Message Broker:</strong> RabbitMQ (For handling asynchronous background tasks)</p></li><li><p><strong>Caching Layer:</strong> Redis (To speed up repeated pricing calculations)</p></li><li><p><strong>Storage:</strong> AWS S3 (For static files and document management)</p></li><li><p><strong>CI/CD:</strong> GitHub Actions deploying to AWS (ECS/EC2)</p></li></ul><p></p><h3>Structuring the Chaos: The Data Model</h3><p>The first step was untangling the spreadsheet&#8217;s chaotic data into a clean relational database schema. We designed a straightforward entity-relationship model.</p><p>While I can&#8217;t expose the proprietary fields or the meta-data handling the core business logic, the high-level schema consisted of distinct models for: </p><p><code>Users, Customers, Plans, Insurance Companies, Pricing Rules, Family Demographics, Invoices, and Payments.</code></p><p></p><h3>The Migration Nightmare</h3><p>When we scoped the migration, we fell into a classic engineering trap: <em>How bad could a spreadsheet really be?</em> We severely underestimated the beast.</p><p>It wasn&#8217;t a flat table of data. The spreadsheet was a horrific labyrinth of hundreds of interconnected worksheets, hidden columns, nested conditional statements, and localised macros. Standard data extraction libraries like <code>pandas</code> or <code>openpyxl</code> simply choked on the complexity. We couldn&#8217;t just read the file; we had to <em>parse</em> its logic. This required serious R&amp;D.</p><p></p><h3>The Custom Parsing Engine &amp; MapReduce</h3><p>To solve this, we looked outside standard data-entry scripts and borrowed a concept from big data processing: <strong>MapReduce</strong>.</p><p>MapReduce is a programming model used for processing and generating large datasets via a parallel, distributed algorithm. In a traditional sense, it involves a &#8220;Map&#8221; step (filtering and sorting data into key-value pairs) and a &#8220;Reduce&#8221; step (aggregating those results).</p><p>Here is a simplified Python example of the concept:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;c527c626-0afe-4e1e-ba77-6303f3bb2645&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">from collections import defaultdict
from multiprocessing import Pool

# Sample data: List of lines from a document
data = [
    "This is a sample document",
    "This document is a sample"
]

def map_function(line):
    words = line.split()
    # Emits a key-value pair for each word
    return [(word, 1) for word in words]

def reduce_function(mapped_data):
    word_count = defaultdict(int)
    for word, count in mapped_data:
        word_count[word] += count
    return word_count

# Map step: Apply the map function in parallel
with Pool() as pool:
    mapped_data = pool.map(map_function, data)
    
# Flatten the nested list of lists
mapped_data = [item for sublist in mapped_data for item in sublist]

# Reduce step: Combine the mapped results
reduced_data = reduce_function(mapped_data)

print(reduced_data) 
# Output: {'This': 2, 'is': 2, 'a': 2, 'sample': 2, 'document': 2}
</code></pre></div><p>We built a custom algorithm based on this exact architecture.</p><p>Instead of reading the entire Excel file linearly (which kept crashing out of memory), we built workers to map specific artifacts&#8212;extracting rules, hidden column values, and pricing modifiers from individual sheets simultaneously. The reduce function then grouped these fragmented pieces of logic into coherent Python dictionaries that matched our Django models. Finally, a database loader script took these aggregated dictionaries and mapped them to the correct PostgreSQL tables.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w0qB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w0qB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!w0qB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!w0qB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!w0qB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w0qB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:329849,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/157538727?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!w0qB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!w0qB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!w0qB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!w0qB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F045a9887-d45f-48f1-953d-478b1571a161_1920x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>Bridging the Gap</h3><p>The parser wasn&#8217;t 100% flawless, but it did exactly what we needed it to do. We completed the migration well within the strict client deadline with less than a 5% data loss rate.</p><p>Because the final 5% consisted of deeply corrupted or circular logic within the original sheets that our scripts couldn&#8217;t access, we resolved it via manual data entry. To ensure the client was never locked in, we also generated robust seeder scripts. If they ever decide to migrate away from AWS RDS or Postgres in the future, they have a clean, automated way to populate their new databases.</p><p></p><h3>Final Thoughts</h3><p>Not all solutions can be found in a neat GitHub repository or at the bottom of a Stack Overflow thread. Sometimes, you have to look at an architectural paradigm designed for massive Hadoop clusters and apply it to a terrifying spreadsheet from Miami.</p><p>Engineering is about thinking outside the box, building custom tools when the standard ones break, and constantly optimising the result.</p><p>Till next time, happy coding :)</p>]]></content:encoded></item><item><title><![CDATA[Building a Claims & Financing Engine from the Ground Up]]></title><description><![CDATA[Lessons from the startup trenches on engineering for scale, automating the un-automatable, and parsing 40-page insurance policies in under 5 minutes.]]></description><link>https://yesabhishek.substack.com/p/insurance-claim-management</link><guid isPermaLink="false">https://yesabhishek.substack.com/p/insurance-claim-management</guid><dc:creator><![CDATA[Abhishek]]></dc:creator><pubDate>Thu, 20 Feb 2025 10:01:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3Fm9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In 2021, I wanted to experience the raw, chaotic energy of an early-stage startup. I wanted to understand the ecosystem, the culture, and the sheer grit it takes to build a product completely from the ground up. That drive led me to Bima Garage, an insurtech startup based in Mumbai, India.</p><p>While the company had multiple verticals, I was embedded in the B2B engineering team. Our mission was to build a robust platform that bridged a massive gap: connecting agents stationed physically inside hospitals with back-office operators managing the labyrinth of insurance claims.</p><p>Here is a deep dive into the engineering challenges we faced, the tech we deployed, and how we solved real-world healthcare financing problems.</p><div><hr></div><h3>The Problem: A Broken Healthcare Financing System</h3><p>Insurance penetration in India is notoriously low. To make matters worse, a large segment of the insured population has low credit scores. When a medical emergency strikes, people are often forced to take on predatory loans just to get admitted.</p><p>Even if you have good insurance, the companies are notorious for their claim processes. Claims are frequently delayed, aggressively negotiated down, or outright rejected exactly when the patient is most vulnerable.</p><h3>The Solution: The Bima Garage Ecosystem</h3><p>The business model was designed to absorb this headache. For a one-time processing fee (or a yearly subscription), Bima Garage takes over the entire claim process.</p><p>To understand the engineering requirements, you have to look at the two primary user journeys on the hospital floor:</p><ul><li><p><strong>Scenario A (The Insured Patient):</strong> You have an accident and rush to the hospital. You are in no condition to navigate paperwork. Our partnered agents, stationed right at the hospital, use our platform to onboard you. From that moment, the back-office team takes over the entire headache of battling the insurance company for your claim.</p></li><li><p><strong>Scenario B (The Uninsured Patient):</strong> You rush to the hospital but have no insurance (or your claim is denied). The hospital agent onboards you into our system. Bima Garage (acting as an NBFC - Non-Banking Financial Company) steps in to finance the hospital bill directly. You then pay back the amount in simple EMIs at a nominal interest rate.</p></li></ul><div><hr></div><h3>The Architecture &amp; Tech Stack</h3><p>To support this, we needed an architecture built for high availability and low maintenance.</p><ul><li><p><strong>Core Backend:</strong> Python &amp; Django</p></li><li><p><strong>Frontend:</strong> React (Web) &amp; React Native (HobNob App for Android/iOS)</p></li><li><p><strong>Database:</strong> PostgreSQL</p></li><li><p><strong>Infrastructure:</strong> Docker &amp; Kubernetes (K8s)</p></li></ul><p>The system featured multiple endpoints connecting our mobile app (HobNob) used by hospital agents, and our web portal (Desk) used by the back-office. When a customer was onboarded, the system required only minimal data points and a unique identifier (like a Mobile Number or National ID) to track the entire lifecycle of the case.</p><p>During my tenure, we built several critical features to make this engine run. Here are the highlights.</p><div><hr></div><h3>1. The Credit Scoring &amp; Financing Engine</h3><p>When an uninsured patient (Scenario B) needed immediate financing, time was critical.</p><p>Once onboarded, our platform automatically reached out to secure third-party vendors to fetch the patient&#8217;s CIBIL (credit) score. Using this data alongside the estimated medical costs, our internal scoring algorithm evaluated the risk. It then generated a recommendation for our banking partners on whether to approve the loan and at what interest rate.</p><p>Because patients and their families are highly anxious during this time, communication had to be instant. We built an event-driven notification system.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3Fm9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3Fm9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!3Fm9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!3Fm9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!3Fm9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3Fm9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png" width="1440" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:297223,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/157535488?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3Fm9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!3Fm9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!3Fm9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!3Fm9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b96df34-a63e-46e8-b1b2-f4fb3fb198ea_1440x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Every time a database row updated its status, a <strong>Django Signal</strong> fired. This handed the task off to a <strong>Celery</strong> background worker, which communicated with <strong>AWS SNS</strong> to blast out WhatsApp and Email updates.</p><div><hr></div><h3>2. Automating Repayment with eNACH</h3><p>Financing a medical bill is only half the battle; collecting the EMIs reliably is the other half.</p><p>We initially evaluated standard payment gateways like Paytm and Razorpay. However, for recurring B2B invoicing and B2C loan repayments, we needed something that required absolutely zero human intervention month-over-month. We chose to integrate <strong>eNACH</strong> (Electronic National Automated Clearing House).</p><p>By having the user register a one-time eNACH mandate, our system was authorised to automatically pull the EMI amount directly from their bank account on a specific date. It also allowed us to pause or cancel the mandate dynamically via code if their repayment plan changed.</p><p><strong>High-Level Design (HLD) for eNACH Flow:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rdv6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6205525-78de-4dc9-a537-825b4cc2fa38_1440x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rdv6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6205525-78de-4dc9-a537-825b4cc2fa38_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!rdv6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6205525-78de-4dc9-a537-825b4cc2fa38_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!rdv6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6205525-78de-4dc9-a537-825b4cc2fa38_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!rdv6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6205525-78de-4dc9-a537-825b4cc2fa38_1440x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rdv6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6205525-78de-4dc9-a537-825b4cc2fa38_1440x1080.png" width="1440" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e6205525-78de-4dc9-a537-825b4cc2fa38_1440x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:276971,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/157535488?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6205525-78de-4dc9-a537-825b4cc2fa38_1440x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rdv6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6205525-78de-4dc9-a537-825b4cc2fa38_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!rdv6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6205525-78de-4dc9-a537-825b4cc2fa38_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!rdv6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6205525-78de-4dc9-a537-825b4cc2fa38_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!rdv6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6205525-78de-4dc9-a537-825b4cc2fa38_1440x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h3>3. Hacking Turnaround Time (TAT) with Email Automation</h3><p>For a long time, our biggest operational bottleneck was manual claim tracking. Back-office employees had to constantly refresh portals and check inboxes for status updates from the Insurance Companies. This resulted in massive Turnaround Times (TAT).</p><p>Guided by a senior Solution Architect, we built a clever workaround: <strong>The Email Polling Engine.</strong></p><p>We set up scheduled cron jobs in our task queues that constantly polled our dedicated claims inboxes. Using Python&#8217;s scraping libraries and email parsing techniques, we created scripts that could &#8220;read&#8221; the automated emails sent by various insurance companies. The script would extract the claim ID, identify the status (e.g., &#8220;Query Raised&#8221;, &#8220;Approved&#8221;, &#8220;Rejected&#8221;), and automatically update our PostgreSQL database.</p><p>What used to take hours of manual data entry was reduced to seconds, triggering an immediate chain reaction of notifications to the hospital desk.</p><div><hr></div><h3>4. Condensing Chaos: OCR and KYP (Know Your Policy)</h3><p>I was handed this feature on incredibly short notice. The concept was brilliant: Insurance policy documents are generally 20 to 40 pages of dense, unreadable legal jargon. We wanted to build a feature that condensed this into a simple, 1-page <strong>KYP (Know Your Policy)</strong> summary.</p><p>To extract text from massive PDFs, we tested everything: Python&#8217;s native Tesseract, AWS Textract, and Google Cloud Vision. Ultimately, <strong>Azure Form Recognizer</strong> ticked all the boxes for speed and accuracy on unstructured Indian financial documents.</p><p>However, processing a 40-page PDF is computationally heavy. If five users uploaded policies simultaneously, it could lock up our main Django threads and crash the API.</p><p><strong>The RabbitMQ Solution:</strong> To protect our infrastructure, we decoupled the processing. When a user uploaded a policy, the file went straight to an AWS S3 bucket, and a message was dropped into a <strong>RabbitMQ</strong> queue. The user immediately got a &#8220;Processing...&#8221; screen.</p><p>In the background, dedicated worker nodes consumed the RabbitMQ messages one by one, sent the PDFs to Azure, parsed the returned JSON, generated the 1-page summary, and alerted the user when it was done. We consistently delivered the KYP document in under 5 minutes without ever overwhelming our core servers.</p><h3>Final Thoughts</h3><p>Engineering at a startup teaches you that code isn&#8217;t just about syntax; it&#8217;s about solving actual, painful problems. There will always be brilliant ideas floating around, but the idea itself is cheap. It is the execution how you design the database, how you handle the queues, and how you manage the edge cases that actually matters.</p><p>Till next time, happy coding.</p>]]></content:encoded></item><item><title><![CDATA[My First Engineering Job and the Magic of ETL]]></title><description><![CDATA[From placement season struggles to migrating petabytes of data for a retail giant.]]></description><link>https://yesabhishek.substack.com/p/data-engineering-101</link><guid isPermaLink="false">https://yesabhishek.substack.com/p/data-engineering-101</guid><dc:creator><![CDATA[Abhishek]]></dc:creator><pubDate>Thu, 20 Feb 2025 09:04:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xXEY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Winter was coming. It was October 2019, and the air on campus was thick with the anxiety of placement season. &#8220;Day 0&#8221; and &#8220;Day 1&#8221; tech companies were flooding the college, and everyone was in full swing.</p><p>I&#8217;ll be honest, I was nervous. I was never the fastest at tricky aptitude tests or competitive programming puzzles. While many of my peers spent their days grinding on LeetCode and Codeforces, I had spent my time building and reading. I loved getting my hands dirty with real-world projects and digesting foundational software engineering books. I knew how to build, but I wasn&#8217;t sure if that would translate in a traditional 45-minute whiteboard gauntlet.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xXEY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xXEY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!xXEY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!xXEY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!xXEY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xXEY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2218066,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/157533758?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xXEY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!xXEY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!xXEY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!xXEY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5916f2ea-96d6-408e-928c-fca266e988ce_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>The Day Finally Arrives</h3><p>After jumping through multiple screening hoops, I landed an interview with a company that needed no introduction <strong>Sears</strong>. </p><p>They were the absolute OG of the American retail market. While the dot-com boom and the rise of modern e-commerce had brought them some rough patches, none of that mattered to me. This was a massive enterprise with decades of history. I just wanted to contribute, write code that impacted a real business, and learn from the veteran developers on their team.</p><p>The interview was scheduled for 9:00 AM. For 45 minutes, I didn&#8217;t get asked abstract brain teasers. Instead, the interviewer dug into real engineering. I wrote complex SQL queries (nested queries, various JOINs), architected a High-Level Design (HLD) on the whiteboard, and explained the architecture of the projects I had built. My practical experience paid off. There were a few small array and string manipulation questions, but they were grounded in reality.</p><p>I spent the rest of the day pacing. Finally, at 7:00 PM, the call came and <strong>I was selected.</strong></p><p>I was interviewed on October 7th, and my call letter told me to report to the office on October 21st, 2019. I was on cloud nine.</p><p></p><h3>The Data Engineering Team</h3><p>When I walked into the Sears India office, I realised I was the junior guy in a room full of titans. The data engineering team was packed with industry veterans&#8212;brilliant minds with 20+ years of experience from product development giants like Adobe, IBM, and HCL. I was thrilled.</p><p>The first two weeks were a whirlwind of Knowledge Transfer (KT) sessions, reading endless documentation, and getting access to Google Cloud Platform (GCP). Every week, we had assessments to ensure we were absorbing the architecture.</p><p>Once the training wheels came off, I was introduced to the monster problem the team was tackling.</p><p></p><h3>Moving a Mountain of Data</h3><p>Sears owned a staggering amount of legacy infrastructure. We are talking about petabytes of consumer and transactional data sitting on aging IBM Power Systems, Hadoop clusters, and Teradata.</p><p>The business goal was modernisation: this massive ocean of data needed to be migrated to Google Cloud specifically into <strong>BigQuery</strong> and <strong>Spanner</strong>&#8212;so the business could run modern data analytics.</p><p>Every week, the onsite team in the US would provide us with the DDL (Data Definition Language) and DML (Data Manipulation Language) for the incoming downstream data. Our job in India was to write the pipelines to catch that data, transform it, and load it into the new cloud tables.</p><p><strong>Our Tech Stack:</strong> Python, Shell Scripting, PySpark, Apache Airflow, Control-M, and massive amounts of BigQuery/Spanner SQL scripting.</p><p></p><h3>What exactly is ETL?</h3><p>If you are new to data engineering, you might hear the term <strong>ETL</strong> thrown around a lot. It stands for <strong>Extract, Transform, and Load</strong>. It is the backbone of almost every big tech company that relies on data.</p><p>Imagine you are running a retail giant that has been in business for decades. You process millions of transactions a day across thousands of stores. To survive, you need an analytics engine that tells you: <em>What is our warehouse stock looking like? Which city is growing the fastest? Which winter jacket is failing in the market?</em></p><p>To answer these questions, you need all your data in one place, perfectly formatted.</p><ul><li><p><strong>Extract:</strong> We pull the raw data out of the old legacy systems (like the IBM Power Systems).</p></li><li><p><strong>Transform:</strong> The raw data is often messy. We clean it, fix data type mismatches, remove redundancies, and shape it to match the new system&#8217;s rules.</p></li><li><p><strong>Load:</strong> We push this clean, organised data into a modern database where it can be analyzed.</p></li></ul><p>Here is a visual breakdown of how this pipeline works</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aF-3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34160227-6bc1-45e6-a810-64eb05625373_1440x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aF-3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34160227-6bc1-45e6-a810-64eb05625373_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!aF-3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34160227-6bc1-45e6-a810-64eb05625373_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!aF-3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34160227-6bc1-45e6-a810-64eb05625373_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!aF-3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34160227-6bc1-45e6-a810-64eb05625373_1440x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aF-3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34160227-6bc1-45e6-a810-64eb05625373_1440x1080.png" width="1440" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34160227-6bc1-45e6-a810-64eb05625373_1440x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:612265,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/157533758?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34160227-6bc1-45e6-a810-64eb05625373_1440x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aF-3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34160227-6bc1-45e6-a810-64eb05625373_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!aF-3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34160227-6bc1-45e6-a810-64eb05625373_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!aF-3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34160227-6bc1-45e6-a810-64eb05625373_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!aF-3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34160227-6bc1-45e6-a810-64eb05625373_1440x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>The Database Dilemma: OLTP vs. OLAP</h3><p>The reason Sears needed to migrate the data was fundamental to how databases work. The legacy IBM Power Systems were incredibly secure and fantastic at <em>writing</em> data as transactions happened. But they were terrible at <em>reading</em> massive chunks of data for analytics.</p><p>This introduces the two main categories of database processing:</p><h4><strong>1. OLTP (Online Transaction Processing)</strong></h4><p>Think of OLTP as the cashier at a supermarket. It needs to be incredibly fast at handling thousands of small, short requests at the same time (inserting a new sale, updating inventory, deleting a canceled order).</p><ul><li><p><strong>Focus:</strong> Fast, real-time transaction processing.</p></li><li><p><strong>Structure:</strong> Highly normalised (organised to avoid duplicate data).</p></li><li><p><strong>Users:</strong> Thousands of point-of-sale systems or end-users.</p></li><li><p><strong>Examples:</strong> Banking apps, Amazon checkout, airline ticket bookings.</p></li></ul><h4><strong>2. OLAP (Online Analytical Processing)</strong></h4><p>Think of OLAP as the CEO sitting in a boardroom analyzing a 10-year trend report. It doesn&#8217;t handle real-time sales; it looks at historical data from different perspectives.</p><ul><li><p><strong>Focus:</strong> Analysing massive volumes of data with complex queries.</p></li><li><p><strong>Structure:</strong> Denormalised (data is grouped together to make reading much faster, even if it takes up more space).</p></li><li><p><strong>Users:</strong> A small number of data scientists or business analysts.</p></li><li><p><strong>Examples:</strong> Tableau, Data Warehouses, customer trend analysis.</p></li></ul><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dC4S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fad3390-7a22-4f35-a168-d437984e4ec8_1440x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dC4S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fad3390-7a22-4f35-a168-d437984e4ec8_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!dC4S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fad3390-7a22-4f35-a168-d437984e4ec8_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!dC4S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fad3390-7a22-4f35-a168-d437984e4ec8_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!dC4S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fad3390-7a22-4f35-a168-d437984e4ec8_1440x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dC4S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fad3390-7a22-4f35-a168-d437984e4ec8_1440x1080.png" width="1440" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fad3390-7a22-4f35-a168-d437984e4ec8_1440x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:546994,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/157533758?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fad3390-7a22-4f35-a168-d437984e4ec8_1440x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dC4S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fad3390-7a22-4f35-a168-d437984e4ec8_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!dC4S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fad3390-7a22-4f35-a168-d437984e4ec8_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!dC4S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fad3390-7a22-4f35-a168-d437984e4ec8_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!dC4S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fad3390-7a22-4f35-a168-d437984e4ec8_1440x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>Choosing the Right Cloud Tool: BigQuery vs. Spanner</h3><p>When loading data into Google Cloud, we didn&#8217;t just throw it all into one bucket. We had to route it based on what the business needed to do with it. This is where the difference between BigQuery and Spanner becomes crucial.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j1Lp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66b17aa9-dbe8-4157-8c14-69e70ddcb92f_1500x970.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j1Lp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66b17aa9-dbe8-4157-8c14-69e70ddcb92f_1500x970.png 424w, https://substackcdn.com/image/fetch/$s_!j1Lp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66b17aa9-dbe8-4157-8c14-69e70ddcb92f_1500x970.png 848w, https://substackcdn.com/image/fetch/$s_!j1Lp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66b17aa9-dbe8-4157-8c14-69e70ddcb92f_1500x970.png 1272w, https://substackcdn.com/image/fetch/$s_!j1Lp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66b17aa9-dbe8-4157-8c14-69e70ddcb92f_1500x970.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j1Lp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66b17aa9-dbe8-4157-8c14-69e70ddcb92f_1500x970.png" width="1456" height="942" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/66b17aa9-dbe8-4157-8c14-69e70ddcb92f_1500x970.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:942,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:227067,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/157533758?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66b17aa9-dbe8-4157-8c14-69e70ddcb92f_1500x970.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!j1Lp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66b17aa9-dbe8-4157-8c14-69e70ddcb92f_1500x970.png 424w, https://substackcdn.com/image/fetch/$s_!j1Lp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66b17aa9-dbe8-4157-8c14-69e70ddcb92f_1500x970.png 848w, https://substackcdn.com/image/fetch/$s_!j1Lp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66b17aa9-dbe8-4157-8c14-69e70ddcb92f_1500x970.png 1272w, https://substackcdn.com/image/fetch/$s_!j1Lp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66b17aa9-dbe8-4157-8c14-69e70ddcb92f_1500x970.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>Final Thoughts</h3><p>The world of software and data engineering is endlessly fascinating. If there is one thing I learned during those early days at Sears, it is that there is no &#8220;one size fits all&#8221; silver bullet in technology.</p><p>You can never understand or solve all problems with a single tool. Every database, language, and framework has its own specific magic. Our job as engineers isn&#8217;t to blindly use the newest tech; our job is to understand the problem deeply enough to figure out exactly which tool to use, and exactly when to use it.</p><p>And if the right tool doesn&#8217;t exist? Well, then we get to build a new one.</p>]]></content:encoded></item><item><title><![CDATA[How We Built and Sold a Campus Platform]]></title><description><![CDATA[A look back at 2018, building an MVP in college, hitting 13,000 users, and navigating our very first business exit.]]></description><link>https://yesabhishek.substack.com/p/wordpress-and-first-ever-sale</link><guid isPermaLink="false">https://yesabhishek.substack.com/p/wordpress-and-first-ever-sale</guid><dc:creator><![CDATA[Abhishek]]></dc:creator><pubDate>Thu, 20 Feb 2025 08:14:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KbYR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cdb2bd-b10b-4c2b-acdf-8a92c790f835_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The year was 2018. I had just wrapped up my very first internship. I was soaking up new technologies every single day, driven by a burning desire to come up with an app idea that could solve a real world problem.</p><p>I was completely captivated by the startup ecosystem. Reading about the meteoric rise of companies like Flipkart, Snapdeal, and Amazon left me highly motivated. I loved the romantic idea of a founder and a tight group of friends building something from nothing and turning it into a real, breathing business.</p><p></p><h3>The Catalyst: Our Fifth Semester Project</h3><p>Then came the fifth semester of my Computer Science and Information Technology degree at SOA University. Right in the middle of the semester, we were assigned a major assessment. The requirement was simple but daunting: build a real world application.</p><p>This was exactly the excuse I had been waiting for.</p><p>We quickly formed a team of four. It included me, my best friend from college, and two other close friends. We chose our team based on complementary skills. The things I was rough around the edges on, they excelled at.</p><ul><li><p><strong>Anurag</strong> was the talker and an absolute natural at sales.</p></li><li><p><strong>Prasanna</strong> was a solid coder who could bring technical ideas to the table.</p></li><li><p><strong>Jyoti</strong> was the ultimate hard worker, making him the perfect person to meticulously document our journey and compile our massive 150 page project report.</p></li><li><p><strong>My role</strong> was to coordinate everyone, brainstorm the core ideas, and keep the project moving forward.</p></li></ul><p></p><h3>The Tech Epiphany: Discovering Web Builders</h3><p>Back in 2018, Android development was the absolute hottest trend. Everyone on campus wanted to build a native mobile app. However, during our research and development phase, my path took a different turn. I discovered a tool that allowed you to build fully functional websites using a visual interface.</p><p>That tool was WordPress.</p><p>I was ecstatic to learn that I could build a working website in a single day and host it for under 100 rupees. I built a few test sites and showed them to the class the next day. They were an instant hit. The entire team agreed we should pivot and build our major assessment around this web technology.</p><p></p><h3>Product #1: Identifying the Problem</h3><p>We brainstormed for a few days and finally landed on a solid concept.</p><p><strong>The Problem Statement:</strong> SOA University attracts students from all over the world. However, there was no centralized, official forum where these students could connect. They had no place to share their thoughts or figure out which nearby local spots were safe, cool, and worth visiting.</p><p><strong>The Solution:</strong> To solve this, we created <strong>ITER Community</strong> (named after our specific college, the Institute of Technical Education and Research).</p><p>We got to work immediately. Anurag hit the streets to catalog local businesses. He gathered pictures, contact information, and negotiated exclusive offers for students. We did not offer these businesses any money. Instead, we promised to drive foot traffic and increase their sales if students liked their ambiance.</p><p>But how would we populate the platform with initial reviews? Fortunately, we knew enough basic coding to read API documentation. We wrote web scraping scripts in Python to gather publicly available Google reviews and populate our initial database.</p><p></p><h3>Hosting and Architecture on a Budget</h3><p>Since we were broke college students, our hosting strategy was entirely bootstrapped. We relied on free DNS providers (which resulted in a very weird domain name), standard cPanel hosting, and initial testing on a local XAMPP server.</p><p>We needed three main features: a search function, a database to fetch business information, and an easy way for users to log in. We explicitly wanted to avoid touching any official University ID data to dodge privacy and security issues. So, we integrated OAuth2 via Google Sign In.</p><p>For the forum and review section, which was the trickiest part to build from scratch, we plugged in Disqus to handle comment threads. We wrapped the entire thing in a free, kick ass theme, and we were live.</p><p></p><h3>Going Kind Of <em>Viral</em> on Campus</h3><p>The platform exploded. We started receiving so much traffic that our server routinely hit 95% CPU utilization.</p><p>We did not know anything about advanced analytics or Daily Active Users at that time. However, our database told the real story. We gained over 13,000 unique users via Google Sign In and accumulated a staggering 40,000 comments across the platform. We knew we had a massive hit on our hands.</p><p>We presented the project for our major assessment and received top grades and stellar feedback. But with great traction comes great scrutiny. University officials eventually noticed the platform. Because we were using the ITER name, they wanted to take control of the code and add a layer of official governance.</p><p>My friends and I realized this could become a liability. On top of that, the heavy placement season was rapidly approaching.</p><p></p><h3>And Then We Hit Sales</h3><p>We spent two months trying to figure out a moderation system, but ultimately decided it was time to shut the servers down and focus on our careers. But before we could pull the plug, we got an unexpected message.</p><p>A local entrepreneur was opening a new restaurant in the area and had heard about our platform&#8217;s reach. He understood technology and saw the value in our system. He approached us with an offer to buy the codebase so he could customize it into an app for his own customers to read reviews and book tables.</p><p>We discussed the offer as a team, negotiated a final price, and closed the deal. We spent our final week on the project helping the new owner take control of the servers. It was a perfect, real world lesson in supply and demand.</p><p></p><h3>Final Thoughts</h3><p>That project taught me that you do not need millions of dollars in funding to build something valuable. You just need a good team, a clear problem, and the willingness to figure things out as you go.</p><p>Hit the subscribe button to motivate me and help me understand the demand for this kind of content. I promise to keep sharing my journey through software development without ever spamming your inbox!</p>]]></content:encoded></item><item><title><![CDATA[Lessons in Architecture and User Experience]]></title><description><![CDATA[A look back at a 2017 internship, learning C# on the fly, and discovering that users do not care about your complex UI.]]></description><link>https://yesabhishek.substack.com/p/crm-101</link><guid isPermaLink="false">https://yesabhishek.substack.com/p/crm-101</guid><dc:creator><![CDATA[Abhishek]]></dc:creator><pubDate>Thu, 20 Feb 2025 07:23:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VV_W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What exactly is a CRM? In simple terms, any application or platform responsible for managing and handling interactions with customers falls under the umbrella of Customer Relationship Management.</p><p>CRMs are everywhere. If you are looking for popular examples in the market today, you will find:</p><ul><li><p><strong>Frappe</strong> (An open source option built using Django)</p></li><li><p><strong>Odoo</strong></p></li><li><p><strong>Salesforce CRM</strong></p></li><li><p><strong>Microsoft Dynamics</strong></p></li><li><p><strong>HubSpot CRM</strong></p></li><li><p><strong>Freshworks CRM</strong></p></li></ul><p>They are the digital backbone of modern commerce. Businesses are run by humans (at least until AI takes over completely), and every growing business handles massive volumes of customer data. A CRM is the management software that sits in the middle. It helps the business manage bookkeeping, invoicing, and all sorts of daily transactions. Think of it as a highly advanced Library Management System, but instead of tracking library books, you are tracking people, assets, and money.</p><p></p><h3>My First Internship</h3><p>This brings me back to where my software journey really started. The year was 2017. I had just landed my very first internship as an IT Developer at the Tinplate Company of India in Jamshedpur.</p><p>I was handed a massive responsibility for an intern. The organisation tasked me with building an internal CRM solution. They needed a centralised platform to manage their employees and track their hardware assets.</p><p><strong>The Problem Statement:</strong> The company wanted an internal web portal. Employees needed to log into the system, view their assigned IT assets (like computers and electrical devices), and create service tickets if they encountered any hardware issues.</p><p>The constraints were strict. The tech stack had to match the organisation&#8217;s existing infrastructure. We had to use C#, .NET, Bootstrap, and MySQL. Furthermore, the entire development and testing lifecycle had to be completed within 45 days using Agile methodologies.</p><p></p><h3>The Execution and The Reality Check</h3><p>We had a team of five interns. We quickly divided the workload and assigned ownership based on our strengths:</p><ul><li><p><strong>Dev A:</strong> Data Modeling and Architecture</p></li><li><p><strong>Dev B:</strong> UI and UX</p></li><li><p><strong>Dev C:</strong> Database Integration</p></li><li><p><strong>Dev D:</strong> Testing</p></li><li><p><strong>Dev E:</strong> Core Logic and Coding</p></li></ul><p>After a couple of days of deep research and heavily relying on Stack Overflow, we mapped out our Entity Relationship models and Data Flow Diagrams on a whiteboard. Once we understood how the data would move through the system, we built our first prototype and went in for our first review.</p><p>The review was a brutal but necessary learning experience. We received a lot of feedback on the UI. The core issue was that we had completely over engineered the design.</p><p>The biggest takeaway from that meeting was a fundamental rule of UX. Factory employees are not always tech savvy. They will not spend more than five minutes trying to understand how to log in or navigate a complex menu just to report a broken mouse.</p><p>We went back to the whiteboard with a completely different perspective. We redesigned the interface to put &#8220;Actions&#8221; front and center. When a user logs in, the first thing they see should be the exact buttons they need to create a ticket or view an asset. By making their intentions clear immediately, users spend time actually doing things rather than trying to figure out how the application works.</p><p></p><h3>Keeping it Simple</h3><p>For the backend, we opted for a monolithic approach to keep infrastructure costs and complexity low.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VV_W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VV_W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!VV_W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!VV_W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!VV_W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VV_W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png" width="1440" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:513358,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/157529776?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VV_W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!VV_W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!VV_W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!VV_W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94cf265d-728d-4937-84fb-ded1bcb4bf87_1440x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>We hosted the static files directly on the local Windows server. The IT department provided us with credentials to an internal MySQL instance.</p><p>Coming from a Python background, learning C# on the job was fascinating. The architecture followed the MVC (Model View Controller) pattern. We utilised parent templates and child templates to keep the frontend code clean. Writing the backend logic helped us practically understand core Object Oriented concepts like abstraction, encapsulation, and inheritance.</p><p>We completed the V1 build well within the 45 days. The senior developers were happy, and the application was pushed to their staging environments the very next week.</p><p></p><h3>Phase 2: The Scope Creep</h3><p>Our initial development was successful enough that the management team extended our internship by three more weeks. Naturally, with extra time came extra requirements.</p><p>We were tasked with adding three major features:</p><ol><li><p><strong>Barcode and QR Code Support</strong></p></li><li><p><strong>Email Notifications</strong></p></li><li><p><strong>Proper Ticketing Chain Management</strong></p></li></ol><p>When we released V1, the ticketing module was essentially a baby. It was purely unidirectional. If an employee created a service ticket, the system sent a simple SMS to the IT team and attached a basic status flag in the database. When the issue was fixed, the ticket was marked closed.</p><p>But what happens if the ticket is reopened? The old system had no history log.</p><p>Furthermore, manually typing in IT asset serial numbers was time consuming and prone to human error. We needed to implement Barcode and QR code scanning. We also had to upgrade our notification channels from basic SMS text messages to detailed emails.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WsSP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3304dd54-9727-498e-8051-c442d916a30d_1440x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WsSP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3304dd54-9727-498e-8051-c442d916a30d_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!WsSP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3304dd54-9727-498e-8051-c442d916a30d_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!WsSP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3304dd54-9727-498e-8051-c442d916a30d_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!WsSP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3304dd54-9727-498e-8051-c442d916a30d_1440x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WsSP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3304dd54-9727-498e-8051-c442d916a30d_1440x1080.png" width="1440" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3304dd54-9727-498e-8051-c442d916a30d_1440x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:358963,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://yesabhishek.substack.com/i/157529776?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3304dd54-9727-498e-8051-c442d916a30d_1440x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WsSP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3304dd54-9727-498e-8051-c442d916a30d_1440x1080.png 424w, https://substackcdn.com/image/fetch/$s_!WsSP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3304dd54-9727-498e-8051-c442d916a30d_1440x1080.png 848w, https://substackcdn.com/image/fetch/$s_!WsSP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3304dd54-9727-498e-8051-c442d916a30d_1440x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!WsSP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3304dd54-9727-498e-8051-c442d916a30d_1440x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>We received massive data dumps containing over 300 rows of existing hardware assets that needed to be migrated into our new system. Our data models went through significant transformations to accommodate these new fields without breaking the existing V1 data.</p><p>We were incredibly lucky to have senior developers step in and write code alongside us during this phase. This was a heavy lift for five interns.</p><p></p><h3>Final Thoughts</h3><p>We completed the extended project in 31 days. We overshot our three week extension by about 10 days due to some unforeseen bugs with the barcode scanning logic, but the final delivery was a massive success.</p><p>That summer in 2017 taught me exactly what a CRM is and how modern software fundamentally reduces execution time for large organisations.</p>]]></content:encoded></item></channel></rss>