<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ahsan Mahmood</title>
    <link>https://aoneahsan.com</link>
    <description><![CDATA[Subscribe to new writing and release notes over RSS, or read the latest entries here first. The feed is regenerated on every build of the site.]]></description>
    <language>en-us</language>
    <lastBuildDate>Fri, 21 Aug 2026 06:42:44 GMT</lastBuildDate>
    <atom:link href="https://aoneahsan.com/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title><![CDATA[What is actually changing in web development]]></title>
      <link>https://aoneahsan.com/blog/future-of-web-development-2026</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/future-of-web-development-2026</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Not predictions. Four shifts I have already had to design around: crawlers that do not run JavaScript, the platform absorbing dependencies, types as the…]]></description>
      <category>web</category>
      <category>architecture</category>
      <category>aeo</category>
      <category>platform</category>
      <category>opinion</category>
      <category>engineering</category>
    </item>
    <item>
      <title><![CDATA[Pricing and plans without a payment processor]]></title>
      <link>https://aoneahsan.com/blog/saas-pricing-stripe-custom-redirects</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/saas-pricing-stripe-custom-redirects</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Why my products take payment through a redirect and an admin grant instead of a checkout integration, what that costs, and the entitlement bugs that bite…]]></description>
      <category>pricing</category>
      <category>entitlements</category>
      <category>saas</category>
      <category>architecture</category>
      <category>engineering</category>
    </item>
    <item>
      <title><![CDATA[How this site is built, and what I rebuilt to fix]]></title>
      <link>https://aoneahsan.com/blog/portfolio-architecture-react-19-vite-7</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/portfolio-architecture-react-19-vite-7</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[React 19, Vite, TanStack Router, Supabase and a click dummy that is the visual specification. Including the outlet bug that made nine service pages render…]]></description>
      <category>architecture</category>
      <category>react</category>
      <category>vite</category>
      <category>supabase</category>
      <category>rebuild</category>
      <category>engineering</category>
    </item>
    <item>
      <title><![CDATA[The JavaScript features I actually reach for now]]></title>
      <link>https://aoneahsan.com/blog/modern-javascript-2026-updates</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/modern-javascript-2026-updates</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Intl for anything a person reads, structuredClone, at(), Object.groupBy, and the platform APIs that replaced dependencies. Plus the number formatting that…]]></description>
      <category>javascript</category>
      <category>intl</category>
      <category>platform</category>
      <category>dependencies</category>
      <category>engineering</category>
    </item>
    <item>
      <title><![CDATA[Micro-animation: the 100ms rule, and everything else is…]]></title>
      <link>https://aoneahsan.com/blog/micro-animations-framer-motion-tips</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/micro-animations-framer-motion-tips</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Motion that earns its place versus motion that is decoration. Why acknowledgement beats a toast, why the browser gives you two free properties, and the…]]></description>
      <category>motion</category>
      <category>ux</category>
      <category>css</category>
      <category>accessibility</category>
      <category>performance</category>
      <category>design</category>
    </item>
    <item>
      <title><![CDATA[From junior to senior: what actually changed]]></title>
      <link>https://aoneahsan.com/blog/junior-to-senior-developer-journey</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/junior-to-senior-developer-journey</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Eight years from a frontend job in Lahore to running twenty-three products alone. The three shifts that mattered, and the one I was slowest to make.]]></description>
      <category>career</category>
      <category>growth</category>
      <category>engineering</category>
      <category>reflection</category>
      <category>career</category>
    </item>
    <item>
      <title><![CDATA[A feature-request board on Firestore, and the rules that…]]></title>
      <link>https://aoneahsan.com/blog/feature-request-system-firestore</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/feature-request-system-firestore</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Vote counts that cannot be forged, a status workflow that means something, and the security-rule subtlety that makes a list query fail while the…]]></description>
      <category>firestore</category>
      <category>security-rules</category>
      <category>product</category>
      <category>community</category>
      <category>engineering</category>
    </item>
    <item>
      <title><![CDATA[Reflectify 3-3-1: a journaling app that deliberately has…]]></title>
      <link>https://aoneahsan.com/blog/reflectify-ai-journaling-project</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/reflectify-ai-journaling-project</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Three gratitudes, three wins, one focus. Why the entries never leave the phone, why there is no model reading them, and what a constraint does to a product…]]></description>
      <category>case-study</category>
      <category>android</category>
      <category>privacy</category>
      <category>product</category>
      <category>journaling</category>
      <category>case-study</category>
    </item>
    <item>
      <title><![CDATA[PregnancyPal: building health software when the data is…]]></title>
      <link>https://aoneahsan.com/blog/project-pregnancypal-health-tech</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/project-pregnancypal-health-tech</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Week-by-week tracking, vitals, fertility and a community — on a free tier, with no cloud functions. What health data changes about every architectural…]]></description>
      <category>case-study</category>
      <category>health</category>
      <category>privacy</category>
      <category>firebase</category>
      <category>capacitor</category>
      <category>case-study</category>
    </item>
    <item>
      <title><![CDATA[FilesHub: building the storage backend instead of paying…]]></title>
      <link>https://aoneahsan.com/blog/fileshub-storage-utility-case-study</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/fileshub-storage-utility-case-study</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[A self-hosted Laravel platform that replaced Firebase Storage and every transactional-email vendor across an entire portfolio. What it took, and the…]]></description>
      <category>case-study</category>
      <category>laravel</category>
      <category>storage</category>
      <category>api</category>
      <category>infrastructure</category>
      <category>case-study</category>
    </item>
    <item>
      <title><![CDATA[TrizLink: one React codebase as a web app, an Android…]]></title>
      <link>https://aoneahsan.com/blog/case-study-trizlink</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/case-study-trizlink</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[A link manager that ships to three surfaces from one repository. What actually got shared, what could not be, and the free-tier limits that shaped the data…]]></description>
      <category>case-study</category>
      <category>react</category>
      <category>capacitor</category>
      <category>wxt</category>
      <category>firebase</category>
      <category>case-study</category>
    </item>
    <item>
      <title><![CDATA[Refactoring a monolith you cannot stop shipping]]></title>
      <link>https://aoneahsan.com/blog/clean-code-refactoring-monoliths</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/clean-code-refactoring-monoliths</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[The rewrite that loses a third of your features, the seams worth finding first, and why "delete the dead code" is the highest-value refactor nobody…]]></description>
      <category>refactoring</category>
      <category>architecture</category>
      <category>legacy</category>
      <category>maintenance</category>
      <category>engineering</category>
    </item>
    <item>
      <title><![CDATA[Firebase Auth and social sign-in: the parts that are…]]></title>
      <link>https://aoneahsan.com/blog/firebase-auth-social-logins-security</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/firebase-auth-social-logins-security</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Social login is easy to add and easy to get subtly wrong. Custom claims that lie, rules that trust the client, and why an extension cannot use the Auth SDK…]]></description>
      <category>firebase</category>
      <category>auth</category>
      <category>security</category>
      <category>oauth</category>
      <category>engineering</category>
    </item>
    <item>
      <title><![CDATA[Accessible design systems: what React Aria gives you…]]></title>
      <link>https://aoneahsan.com/blog/accessible-design-systems-radix-ui</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/accessible-design-systems-radix-ui</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Moving from a styled component library to headless primitives plus Tailwind. What accessibility work is genuinely free, what is not, and the rich-text rule…]]></description>
      <category>accessibility</category>
      <category>react-aria</category>
      <category>design-system</category>
      <category>tailwind</category>
      <category>design</category>
    </item>
    <item>
      <title><![CDATA[Admin panels: four failures that ship looking complete]]></title>
      <link>https://aoneahsan.com/blog/designing-perfect-admin-dashboards</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/designing-perfect-admin-dashboards</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Every one of these was found in a live admin panel, and none is visible in a code review or a green build. Plus why the screen list should be derived from…]]></description>
      <category>admin</category>
      <category>ux</category>
      <category>security</category>
      <category>design</category>
      <category>design</category>
    </item>
    <item>
      <title><![CDATA[One codebase, web and Android: what Capacitor actually costs]]></title>
      <link>https://aoneahsan.com/blog/capacitor-8-web-to-native</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/capacitor-8-web-to-native</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Shipping the same React app to the browser and to Google Play. The parts that are genuinely free, the parts that are not, and the config bug that ships…]]></description>
      <category>capacitor</category>
      <category>android</category>
      <category>mobile</category>
      <category>react</category>
      <category>engineering</category>
    </item>
    <item>
      <title><![CDATA[TypeScript patterns I actually use, and one that cost me…]]></title>
      <link>https://aoneahsan.com/blog/advanced-typescript-patterns-2026</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/advanced-typescript-patterns-2026</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Typed translation keys, satisfies, discriminated state and branded ids — plus the conditional type that took my typecheck from 14 seconds to 170 and how I…]]></description>
      <category>typescript</category>
      <category>performance</category>
      <category>types</category>
      <category>tooling</category>
      <category>engineering</category>
    </item>
    <item>
      <title><![CDATA[SEO for a single-page app, without pretending to have a…]]></title>
      <link>https://aoneahsan.com/blog/seo-pwa-without-ssr-hacks</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/seo-pwa-without-ssr-hacks</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[AI crawlers do not run JavaScript. Neither, reliably, does anything else you care about. Here is how I get real content into static HTML without adopting…]]></description>
      <category>seo</category>
      <category>aeo</category>
      <category>prerender</category>
      <category>spa</category>
      <category>vite</category>
      <category>engineering</category>
    </item>
    <item>
      <title><![CDATA[Why I reach for TanStack Router]]></title>
      <link>https://aoneahsan.com/blog/why-tanstack-router-is-the-best</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/why-tanstack-router-is-the-best</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Typed routes turn a whole category of navigation bug into a build error. Here is the one that shipped to production in my own app before I moved, and what…]]></description>
      <category>react</category>
      <category>routing</category>
      <category>typescript</category>
      <category>tanstack</category>
      <category>engineering</category>
    </item>
    <item>
      <title><![CDATA[A zero-cost backend architecture that actually holds]]></title>
      <link>https://aoneahsan.com/blog/zero-cost-backend-architecture</link>
      <guid isPermaLink="true">https://aoneahsan.com/blog/zero-cost-backend-architecture</guid>
      <pubDate>Wed, 19 Aug 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[Twenty-three products, no servers, no monthly bill. Here is what the constraint removes, what it forces you to design properly, and the day a free tier…]]></description>
      <category>architecture</category>
      <category>firebase</category>
      <category>supabase</category>
      <category>free-tier</category>
      <category>cloudflare</category>
      <category>engineering</category>
    </item>
  </channel>
</rss>
