<?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"><channel><title><![CDATA[nikhilsaiankilla]]></title><description><![CDATA[nikhilsaiankilla]]></description><link>https://nikhilsaiankilla.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 12 Nov 2026 07:47:07 GMT</lastBuildDate><atom:link href="https://nikhilsaiankilla.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I Built a Startup Map for Hyderabad. Here's What It Does.]]></title><description><![CDATA[A few weeks ago I was trying to find out which startups are actually building in Hyderabad. I thought it would be easy. It wasn't. I ended up digging…]]></description><link>https://nikhilsaiankilla.hashnode.dev/i-built-a-startup-map-for-hyderabad-here-s-what-it-does</link><guid isPermaLink="true">https://nikhilsaiankilla.hashnode.dev/i-built-a-startup-map-for-hyderabad-here-s-what-it-does</guid><category><![CDATA[Startups]]></category><category><![CDATA[india]]></category><category><![CDATA[hyderabad]]></category><category><![CDATA[startup map]]></category><dc:creator><![CDATA[Nikhil Sai]]></dc:creator><pubDate>Mon, 12 Oct 2026 07:06:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/650e6e6181d5f4aee61316b8/0bef4555-6b4b-4e4b-beaf-14a87bb9aab0.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few weeks ago I was trying to find out which startups are actually building in Hyderabad.</p>
<p>I thought it would be easy. It wasn't. I ended up digging through tweets, event pages and old listicles, and I still couldn't tell who was building what or where their office was.</p>
<p>Then I saw that Bangalore already had a <a href="https://www.bangalorestartupmap.com">startup map</a>, with 880+ startups and 70+ VCs, and I thought, "Why doesn't Hyderabad have one?"</p>
<p>So I built it.</p>
<h2>What I used</h2>
<p>Nothing fancy.</p>
<ul>
<li><p><strong>Next.js</strong> for the app</p>
</li>
<li><p><strong>Tailwind CSS</strong> for the styling</p>
</li>
<li><p><strong>OpenStreetMap + Leaflet</strong> for the map</p>
</li>
</ul>
<h2>What it does</h2>
<p><a href="https://hyderabadstartupsmap.lol"><strong>hyderabadstartupsmap.lol</strong></a> puts Hyderabad and Telangana's startups on one map.</p>
<ul>
<li><p>You can see where each startup's office is.</p>
</li>
<li><p>You can check the founders, funding and sector (AI, SaaS, fintech, healthtech and more).</p>
</li>
<li><p>There's a "hiring only" toggle. Turn it on and the map shows only the startups with open roles, with a live count of how many companies are hiring.</p>
<img src="https://cdn.hashnode.com/uploads/covers/650e6e6181d5f4aee61316b8/779ff4b8-8ed6-414f-80d5-5373e4057447.png" alt="" style="display:block;margin:0 auto" />
</li>
<li><p>You can share the map with a friend, a co-founder or a recruiter.</p>
</li>
</ul>
<p>If you're job hunting, you can pick startups close to where you live. If you're a founder, you can find the teams building near you.</p>
<h2>Bro, if you have a startup in Hyd, submit it</h2>
<p>This is the important part.</p>
<p>The map is only as good as the startups on it. If you're building something in Hyderabad or Telangana:</p>
<ol>
<li><p>Go to <a href="https://hyderabadstartupsmap.lol">hyderabadstartupsmap.lol</a></p>
</li>
<li><p>Hit <strong>Submit</strong></p>
</li>
<li><p>Add your startup</p>
</li>
</ol>
<p>It takes a minute. Then tell one other founder you know to do the same.</p>
<h2>Your city next?</h2>
<p>If your city doesn't have a map yet, build one. That's what happened in Chennai. A builder saw the Bangalore and Hyderabad maps, couldn't find one for their own city, and made <a href="https://peerlist.io/ankitttbuilds/project/startup-in-chennai">Startup in Chennai</a>.</p>
<p>Got feedback or a feature idea? Tell me on X: <a href="https://x.com/itzznikhilsai">@itzznikhilsai</a></p>
]]></content:encoded></item><item><title><![CDATA[LLM Token Counting, Pricing, and Context Windows Explained]]></title><description><![CDATA[Tokens aren't words. Learn how tokenization drives GPT and Claude pricing, and how to estimate spend before "context length exceeded" hits production.]]></description><link>https://nikhilsaiankilla.hashnode.dev/llm-token-counting-pricing-and-context-windows-explained</link><guid isPermaLink="true">https://nikhilsaiankilla.hashnode.dev/llm-token-counting-pricing-and-context-windows-explained</guid><category><![CDATA[llm-tokens]]></category><category><![CDATA[Token Counter]]></category><category><![CDATA[GPT Pricing]]></category><category><![CDATA[Context Window, OpenAI Pricing]]></category><category><![CDATA[AI cost estimation]]></category><dc:creator><![CDATA[Nikhil Sai]]></dc:creator><pubDate>Sun, 09 Aug 2026 05:21:49 GMT</pubDate><content:encoded><![CDATA[<p>Tokens are the unit every LLM API bills and budgets on. A prompt that "looks short" in the editor can still burn thousands of tokens once the system message, tool schemas, and conversation history are included, and a context window isn't a soft suggestion; when you blow past it, the model truncates, fails, or silently drops the beginning of the conversation.</p>
<h2>What a token actually is</h2>
<p>A token is a subword chunk, not a word. English averages roughly <strong>4 characters per token</strong>, so "tokenization" is about 1 token, but "uncharacteristically" might be three. Code, JSON, and non-English text usually consume <em>more</em> tokens per character than plain English, which is why pasting a large config into a chat feels expensive fast.</p>
<p>You cannot reliably count tokens by counting words. The only accurate approach is to run the same tokenizer the model uses (or a close public equivalent) against the exact string you're about to send.</p>
<h2>Why token counts matter before cost does</h2>
<p>Cost is tokens × price. Context is tokens ≤ limit. Most production failures show up as context problems first:</p>
<ul>
<li><p>A RAG pipeline that appends every retrieved chunk until the request fails</p>
</li>
<li><p>A chat UI that never summarizes history and eventually hits the model's ceiling</p>
</li>
<li><p>A "simple" eval suite whose system prompt + few-shot examples already eat half the window</p>
</li>
</ul>
<p>An <a href="https://simpledevtools.org/tools/token-counter">LLM Token Counter</a> lets you paste a prompt (or a full message transcript) and see the count before you wire it into billing dashboards.</p>
<h2>Turning tokens into dollars</h2>
<p>Once you know input and output tokens for a model, pricing is arithmetic but the rates differ by model family and by whether you're reading vs writing tokens. Output is usually more expensive. Streaming doesn't change the bill; retries and tool-call loops do.</p>
<p>A practical workflow:</p>
<ol>
<li><p>Count tokens for a realistic prompt and a realistic completion length</p>
</li>
<li><p>Multiply by per-1K (or per-1M) rates for that model</p>
</li>
<li><p>Scale by expected daily requests</p>
</li>
</ol>
<p>An <a href="https://simpledevtools.org/tools/openai-pricing-calculator">OpenAI Pricing Calculator</a> is useful for step 2–3 when you're comparing models before locking an architecture.</p>
<h2>Context windows are not "unlimited chat"</h2>
<p>A 128K or 200K context window sounds huge until you account for:</p>
<ul>
<li><p>System instructions and tool/function definitions</p>
</li>
<li><p>Retrieved documents</p>
</li>
<li><p>Multi-turn history</p>
</li>
<li><p>The model's own output budget (some providers reserve room for completion)</p>
</li>
</ul>
<p>A <a href="https://simpledevtools.org/tools/context-window-calculator">Context Window Calculator</a> answers the question developers actually ask: "how much of this model's window am I already using?" not just "how many tokens is this string."</p>
<h2>Quick decision guide</h2>
<ul>
<li><p><strong>Estimating whether a prompt fits</strong> → count tokens, then check against the model window</p>
</li>
<li><p><strong>Estimating monthly spend</strong> → tokens × price × volume</p>
</li>
<li><p><strong>Debugging "context length exceeded"</strong> → measure the full assembled request, not just the user message</p>
</li>
<li><p><strong>Comparing models</strong> → same prompt, different tokenizers and rates; don't assume parity</p>
</li>
</ul>
<p>None of this needs a server round-trip for the measurement itself. Counting and estimating locally keeps proprietary prompts and customer data on your machine while you iterate.</p>
<h2>Related reading</h2>
<p>If you're also shipping APIs that return large JSON payloads into an LLM pipeline, <a href="https://simpledevtools.org/blog/5-json-tools-every-developer-should-bookmark">5 JSON tools every developer should bookmark</a> covers validating and minifying those payloads before they become expensive context.</p>
]]></content:encoded></item><item><title><![CDATA[PEM vs DER and How to Read an X.509 Certificate]]></title><description><![CDATA[A practical guide to PEM vs DER encoding and reading X.509 certificate fields (CN, SAN, validity) without memorizing OpenSSL commands.]]></description><link>https://nikhilsaiankilla.hashnode.dev/pem-vs-der-and-how-to-read-an-x-509-certificate</link><guid isPermaLink="true">https://nikhilsaiankilla.hashnode.dev/pem-vs-der-and-how-to-read-an-x-509-certificate</guid><category><![CDATA[pem]]></category><category><![CDATA[SSL Certificate]]></category><category><![CDATA[Certificate Decoder]]></category><category><![CDATA[openssl]]></category><category><![CDATA[mTLS]]></category><category><![CDATA[Web Security]]></category><category><![CDATA[DevOps tools]]></category><dc:creator><![CDATA[Nikhil Sai]]></dc:creator><pubDate>Sun, 09 Aug 2026 05:13:38 GMT</pubDate><content:encoded><![CDATA[<p>Certificates fail loudly in browsers and quietly in mutual-TLS services. The file on disk might be PEM, DER, or "a <code>.crt</code> that is secretly one or the other," and the error message is usually <code>unable to load certificate</code> which doesn't tell you whether the problem is encoding, chain order, or expiry. Knowing how to <em>look</em> at a cert beats memorizing OpenSSL flags for every incident.</p>
<h2>PEM vs DER in one paragraph</h2>
<p><strong>DER</strong> is the binary ASN.1 encoding of the certificate. <strong>PEM</strong> is that same DER, Base64-encoded, wrapped with <code>-----BEGIN CERTIFICATE-----</code> / <code>-----END CERTIFICATE-----</code> headers. PEM is what humans email and commit by accident; DER is what some Java keystores, Windows APIs, and older appliances insist on.</p>
<p>If a tool asks for DER and you only have a <code>.pem</code>, you need a conversion not a new certificate from the CA.</p>
<h2>When conversion is the whole fix</h2>
<p>Common situations:</p>
<ul>
<li><p>A load balancer expects PEM; your CA portal downloaded DER</p>
</li>
<li><p>A Java <code>keytool</code> import wants DER</p>
</li>
<li><p>A file named <code>.crt</code> is PEM text; another <code>.crt</code> is raw DER extensions lie</p>
</li>
</ul>
<p>A <a href="https://simpledevtools.org/tools/pem-to-der">PEM to DER Converter</a> (and the reverse) settles the encoding question in one paste so you can stop guessing.</p>
<h2>What "decoding" a certificate means</h2>
<p>An X.509 certificate is a structured document: subject, issuer, serial, validity window (<code>notBefore</code> / <code>notAfter</code>), public key info, and extensions (SAN, key usage, basic constraints). Decoding means parsing those fields into something readable — not validating trust against a root store.</p>
<p>That distinction matters. Decoding answers "what does this file claim?" Trust validation answers "should I believe it?" different jobs.</p>
<p>A <a href="https://simpledevtools.org/tools/certificate-decoder">Certificate Decoder</a> is for the first job: paste PEM, read subject/issuer/SANs/dates, confirm you installed the cert you think you installed.</p>
<h2>A debugging order that works</h2>
<ol>
<li><p>Confirm encoding (PEM vs DER) convert if the consumer is picky</p>
</li>
<li><p>Decode and verify <strong>CN/SAN</strong> match the hostname you serve</p>
</li>
<li><p>Check <strong>validity dates</strong> (and system clock skew)</p>
</li>
<li><p>Confirm it's the leaf you expected, not an intermediate pasted alone</p>
</li>
<li><p>Only then chase chain/trust store issues</p>
</li>
</ol>
<p>Expiry and hostname mismatches show up clearly once the fields are readable. Chain problems need the full bundle decoding one leaf won't invent the intermediates.</p>
<h2>Related security context</h2>
<p>Certificates often sit next to other "paste this secret into a website" temptations. The same client-side discipline from <a href="https://simpledevtools.org/blog/why-jwt-decoding-should-happen-in-your-browser">why JWT decoding should happen in your browser</a> applies: prefer tools that parse locally. If you're comparing hash algorithms for fingerprints or integrity checks alongside cert work, <a href="https://simpledevtools.org/blog/md5-vs-sha1-vs-sha256-vs-sha512">MD5 vs SHA-1 vs SHA-256 vs SHA-512</a> is the companion primer and remember SHA-1 in cert signatures is a historical landmine, not a modern choice.</p>
<h2>Quick checklist</h2>
<ul>
<li><p>PEM = Base64(DER) + headers; DER = binary</p>
</li>
<li><p>Decode to read SANs and dates before rotating blindly</p>
</li>
<li><p>Convert encoding when the consumer rejects an otherwise-valid cert</p>
</li>
<li><p>Never paste production private keys into a server-side "decoder"</p>
</li>
</ul>
]]></content:encoded></item></channel></rss>