<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>IshKanOrbit Blog</title>
    <link>https://www.ishkanorbit.com/blog/</link>
    <description>Engineering notes and articles from the IshKanOrbit team.</description>
    <language>en-us</language>
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="https://www.ishkanorbit.com/blog/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Why We Default to Server Components in Next.js 15</title>
      <link>https://www.ishkanorbit.com/blog/server-components-by-default/</link>
      <guid isPermaLink="true">https://www.ishkanorbit.com/blog/server-components-by-default/</guid>
      <pubDate>Tue, 02 Jun 2026 09:00:00 GMT</pubDate>
      <description>Every new Next.js 15 route we build starts as a Server Component, and we only reach for &quot;use client&quot; once something genuinely needs the browser: state, effects,…</description>
      <content:encoded><![CDATA[
      <p>Every new Next.js 15 route we build starts as a Server Component, and we only reach for <code>"use client"</code> once something genuinely needs the browser: state, effects, or an event handler.</p>
      <h2 id="why-this-default-pays-off">Why this default pays off</h2>
      <p>Server Components ship zero JavaScript to the browser for the parts of a page that don't need it. On a marketing page, that's often most of the page — headings, copy, and images render as plain HTML.</p>
      <h3 id="a-concrete-example">A concrete example</h3>
      <p>A pricing table's copy and layout can stay server-rendered; only the currency toggle, if one exists, needs to be a small client island around it.</p>
      <pre class="shiki shiki-themes github-light-high-contrast github-dark-high-contrast" style="background-color:#ffffff;--shiki-dark-bg:#0a0c10;color:#0e1116;--shiki-dark:#f0f3f6" tabindex="0"><code><span class="line"><span style="color:#66707B;--shiki-dark:#BDC4CC">// Server Component — no "use client" needed</span></span>
<span class="line"><span style="color:#A0111F;--shiki-dark:#FF9492">export</span><span style="color:#A0111F;--shiki-dark:#FF9492"> function</span><span style="color:#622CBC;--shiki-dark:#DBB7FF"> PricingCard</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">({ </span><span style="color:#702C00;--shiki-dark:#FFB757">tier</span><span style="color:#0E1116;--shiki-dark:#F0F3F6"> }</span><span style="color:#A0111F;--shiki-dark:#FF9492">:</span><span style="color:#0E1116;--shiki-dark:#F0F3F6"> { </span><span style="color:#702C00;--shiki-dark:#FFB757">tier</span><span style="color:#A0111F;--shiki-dark:#FF9492">:</span><span style="color:#702C00;--shiki-dark:#FFB757"> Tier</span><span style="color:#0E1116;--shiki-dark:#F0F3F6"> }) {</span></span>
<span class="line"><span style="color:#A0111F;--shiki-dark:#FF9492">  return</span><span style="color:#0E1116;--shiki-dark:#F0F3F6"> (</span></span>
<span class="line"><span style="color:#0E1116;--shiki-dark:#F0F3F6">    &lt;</span><span style="color:#024C1A;--shiki-dark:#72F088">div</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">&gt;</span></span>
<span class="line"><span style="color:#0E1116;--shiki-dark:#F0F3F6">      &lt;</span><span style="color:#024C1A;--shiki-dark:#72F088">h3</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">&gt;</span><span style="color:#A0111F;--shiki-dark:#FF9492">{</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">tier.name</span><span style="color:#A0111F;--shiki-dark:#FF9492">}</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">&lt;/</span><span style="color:#024C1A;--shiki-dark:#72F088">h3</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">&gt;</span></span>
<span class="line"><span style="color:#0E1116;--shiki-dark:#F0F3F6">      &lt;</span><span style="color:#024C1A;--shiki-dark:#72F088">p</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">&gt;</span><span style="color:#A0111F;--shiki-dark:#FF9492">{</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">tier.price</span><span style="color:#A0111F;--shiki-dark:#FF9492">}</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">&lt;/</span><span style="color:#024C1A;--shiki-dark:#72F088">p</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">&gt;</span></span>
<span class="line"><span style="color:#0E1116;--shiki-dark:#F0F3F6">    &lt;/</span><span style="color:#024C1A;--shiki-dark:#72F088">div</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">&gt;</span></span>
<span class="line"><span style="color:#0E1116;--shiki-dark:#F0F3F6">  );</span></span>
<span class="line"><span style="color:#0E1116;--shiki-dark:#F0F3F6">}</span></span></code></pre>
      <h2 id="where-we-still-reach-for-client-components">Where we still reach for client components</h2>
      <p>Anything with autoplay, drag interactions, form state, or scroll-based animation. The goal isn't "zero client components" — it's not paying the client-JS cost for content that never needed it.</p>
    ]]></content:encoded>
    </item>
    <item>
      <title>A Practical Guide to Integrating AI Into Existing Products</title>
      <link>https://www.ishkanorbit.com/blog/ai-integration-without-black-boxes/</link>
      <guid isPermaLink="true">https://www.ishkanorbit.com/blog/ai-integration-without-black-boxes/</guid>
      <pubDate>Mon, 18 May 2026 09:00:00 GMT</pubDate>
      <description>The products that get the most value from AI aren&apos;t the ones that bolt on a chatbot — they&apos;re the ones that use a model for one specific, well-scoped task insid…</description>
      <content:encoded><![CDATA[
      <p>The products that get the most value from AI aren't the ones that bolt on a chatbot — they're the ones that use a model for one specific, well-scoped task inside an existing workflow.</p>
      <h2 id="start-with-the-workflow-not-the-model">Start with the workflow, not the model</h2>
      <p>Before choosing an API or a prompt strategy, write down the exact decision a person currently makes by hand. That's the task worth automating first.</p>
      <h2 id="keep-a-human-in-the-loop-where-it-matters">Keep a human in the loop where it matters</h2>
      <p>For anything customer-facing or irreversible, route low-confidence outputs to a person instead of guessing. This is usually a small amount of extra engineering that saves a lot of trust.</p>
      <h3 id="what-low-confidence-looks-like-in-practice">What "low confidence" looks like in practice</h3>
      <p>Often it's as simple as a threshold on a classification score, or asking the model to flag its own uncertainty as part of its output schema.</p>
    ]]></content:encoded>
    </item>
    <item>
      <title>Choosing Between an MVP and a Full Product Build</title>
      <link>https://www.ishkanorbit.com/blog/mvp-vs-full-build/</link>
      <guid isPermaLink="true">https://www.ishkanorbit.com/blog/mvp-vs-full-build/</guid>
      <pubDate>Thu, 30 Apr 2026 09:00:00 GMT</pubDate>
      <description>The right scope depends on what you still need to learn, not on how much budget is available. Signs an MVP is the right call You&apos;re not yet sure real users want…</description>
      <content:encoded><![CDATA[
      <p>The right scope depends on what you still need to learn, not on how much budget is available.</p>
      <h2 id="signs-an-mvp-is-the-right-call">Signs an MVP is the right call</h2>
      <p>You're not yet sure real users want this, pricing is unvalidated, or the core workflow itself might change based on early feedback.</p>
      <h2 id="signs-a-fuller-build-is-worth-it-up-front">Signs a fuller build is worth it up front</h2>
      <p>You already have paying customers waiting, or the integration/compliance requirements are substantial enough that a thin version wouldn't be usable at all.</p>
    ]]></content:encoded>
    </item>
    <item>
      <title>Building Dashboards That Don&apos;t Overwhelm Users</title>
      <link>https://www.ishkanorbit.com/blog/dashboards-that-dont-overwhelm/</link>
      <guid isPermaLink="true">https://www.ishkanorbit.com/blog/dashboards-that-dont-overwhelm/</guid>
      <pubDate>Fri, 10 Apr 2026 09:00:00 GMT</pubDate>
      <description>Most dashboard requests start as &quot;show everything.&quot; The useful version usually shows far less. Design around one question at a time Ask what decision this scree…</description>
      <content:encoded><![CDATA[
      <p>Most dashboard requests start as "show everything." The useful version usually shows far less.</p>
      <h2 id="design-around-one-question-at-a-time">Design around one question at a time</h2>
      <p>Ask what decision this screen needs to support, then cut every metric that doesn't inform that decision.</p>
      <h2 id="default-to-summaries-let-detail-be-optional">Default to summaries, let detail be optional</h2>
      <p>A drill-down interaction is cheap to add and keeps the default view calm.</p>
    ]]></content:encoded>
    </item>
    <item>
      <title>Performance Budgets for Marketing Sites</title>
      <link>https://www.ishkanorbit.com/blog/performance-budgets-for-marketing-sites/</link>
      <guid isPermaLink="true">https://www.ishkanorbit.com/blog/performance-budgets-for-marketing-sites/</guid>
      <pubDate>Sun, 22 Mar 2026 09:00:00 GMT</pubDate>
      <description>A performance budget is just a number you agree not to exceed — total JS shipped, or a Lighthouse score threshold — checked in CI, not just eyeballed occasional…</description>
      <content:encoded><![CDATA[
      <p>A performance budget is just a number you agree not to exceed — total JS shipped, or a Lighthouse score threshold — checked in CI, not just eyeballed occasionally.</p>
      <h2 id="pick-metrics-tied-to-what-users-feel">Pick metrics tied to what users feel</h2>
      <p>Largest Contentful Paint and Interaction to Next Paint track much closer to "does this feel fast" than a raw Lighthouse score does.</p>
      <h2 id="automate-the-check-don-t-rely-on-memory">Automate the check, don't rely on memory</h2>
      <p>A budget that isn't enforced in CI quietly erodes the first time someone's in a hurry.</p>
    ]]></content:encoded>
    </item>
  </channel>
</rss>