<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Blog — Riajul Islam</title><description>Notes on building things — AI-accelerated development, Next.js, Shopify, the MERN stack and React Native.</description><link>https://pavelriajul.com/</link><language>en</language><item><title>The Projects Worth Turning Down</title><link>https://pavelriajul.com/blog/declining-projects/</link><guid isPermaLink="true">https://pavelriajul.com/blog/declining-projects/</guid><description>Every bad project was visible in the first conversation. The signals, what they cost when ignored, and how to say no without burning anything.</description><pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate><category>Career</category><author>hello@riajulislam.dev</author></item><item><title>Everything I Have Learned About Estimating</title><link>https://pavelriajul.com/blog/estimation-lessons/</link><guid isPermaLink="true">https://pavelriajul.com/blog/estimation-lessons/</guid><description>You are not bad at estimating the work. You are bad at remembering everything that is not the work — and that is the recoverable part.</description><pubDate>Sun, 02 Aug 2026 00:00:00 GMT</pubDate><category>Career</category><author>hello@riajulislam.dev</author></item><item><title>Working Across Time Zones Without Losing Your Evenings</title><link>https://pavelriajul.com/blog/freelancing-remote-timezones/</link><guid isPermaLink="true">https://pavelriajul.com/blog/freelancing-remote-timezones/</guid><description>A large time difference is an advantage if the work is structured for it and a slow disaster if it is not. What actually has to change.</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><category>Career</category><author>hello@riajulislam.dev</author></item><item><title>Documentation That Survives You Leaving</title><link>https://pavelriajul.com/blog/handover-documentation/</link><guid isPermaLink="true">https://pavelriajul.com/blog/handover-documentation/</guid><description>Most project documentation describes what the code does, which the code already says. What is missing is why, and who has the passwords.</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><category>Career</category><author>hello@riajulislam.dev</author></item><item><title>The Objections You Get, and What They Actually Mean</title><link>https://pavelriajul.com/blog/client-objections/</link><guid isPermaLink="true">https://pavelriajul.com/blog/client-objections/</guid><description>&quot;It is too expensive&quot; is rarely about the price. The eight objections that recur, what is underneath each one, and how to answer honestly.</description><pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate><category>Career</category><author>hello@riajulislam.dev</author></item><item><title>Choose Your Stack Once, Then Stop</title><link>https://pavelriajul.com/blog/choosing-a-stack-once/</link><guid isPermaLink="true">https://pavelriajul.com/blog/choosing-a-stack-once/</guid><description>Every project that starts with a technology debate loses a week. Four templates decided in advance, and the narrow cases where you deviate.</description><pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate><category>Career</category><author>hello@riajulislam.dev</author></item><item><title>Positioning as AI-Accelerated, Not an AI Consultancy</title><link>https://pavelriajul.com/blog/ai-accelerated-positioning/</link><guid isPermaLink="true">https://pavelriajul.com/blog/ai-accelerated-positioning/</guid><description>One says you deliver faster. The other says you sell AI. They attract different clients, and only one of them survives the tooling changing again.</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><category>Career</category><author>hello@riajulislam.dev</author></item><item><title>Pricing Work When AI Makes You Faster</title><link>https://pavelriajul.com/blog/pricing-ai-accelerated-work/</link><guid isPermaLink="true">https://pavelriajul.com/blog/pricing-ai-accelerated-work/</guid><description>If you bill by the hour and the hours halve, you have given yourself a pay cut for getting better. What to charge for instead.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate><category>Career</category><author>hello@riajulislam.dev</author></item><item><title>A Development Process Without the Ceremony</title><link>https://pavelriajul.com/blog/development-process/</link><guid isPermaLink="true">https://pavelriajul.com/blog/development-process/</guid><description>Six steps from first message to production. What each one is actually for, and why most process overhead solves problems small teams do not have.</description><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><category>Career</category><author>hello@riajulislam.dev</author></item><item><title>How I Scope a Project Before Quoting It</title><link>https://pavelriajul.com/blog/project-scoping/</link><guid isPermaLink="true">https://pavelriajul.com/blog/project-scoping/</guid><description>Most projects that go wrong were mis-scoped, not mis-built. The questions that surface the real work, and what to do with the answers.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><category>Career</category><author>hello@riajulislam.dev</author></item><item><title>Deep Linking That Works From a Cold Start</title><link>https://pavelriajul.com/blog/react-native-deep-linking/</link><guid isPermaLink="true">https://pavelriajul.com/blog/react-native-deep-linking/</guid><description>A link that opens the right screen when the app is already running, and the home screen when it is not, is the standard half-finished implementation.</description><pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate><category>Mobile</category><author>hello@riajulislam.dev</author></item><item><title>Where Auth Tokens Belong on a Phone</title><link>https://pavelriajul.com/blog/mobile-token-storage/</link><guid isPermaLink="true">https://pavelriajul.com/blog/mobile-token-storage/</guid><description>AsyncStorage is a plain file on disk. Keychain and Keystore exist for exactly this, and the difference matters more than most teams assume.</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><category>Mobile</category><author>hello@riajulislam.dev</author></item><item><title>The App Store Rejections You Can Avoid</title><link>https://pavelriajul.com/blog/app-store-rejections/</link><guid isPermaLink="true">https://pavelriajul.com/blog/app-store-rejections/</guid><description>Most first submissions are rejected, and most rejections are for the same handful of things. Here they are, with what to do before you submit.</description><pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate><category>Mobile</category><author>hello@riajulislam.dev</author></item><item><title>Why Nobody Opens Your App a Second Time</title><link>https://pavelriajul.com/blog/mobile-app-retention/</link><guid isPermaLink="true">https://pavelriajul.com/blog/mobile-app-retention/</guid><description>Most apps lose the majority of users within a week, and most of that happens in the first session. What actually causes it, and what fixes it.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><category>Mobile</category><author>hello@riajulislam.dev</author></item><item><title>One API, Two Clients: Sharing Between Web and Mobile</title><link>https://pavelriajul.com/blog/shared-api-web-mobile/</link><guid isPermaLink="true">https://pavelriajul.com/blog/shared-api-web-mobile/</guid><description>Share the contract, the types and the validation. Share the interface layer and you get something slightly wrong on both platforms.</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><category>Mobile</category><author>hello@riajulislam.dev</author></item><item><title>Push Notifications Are Not Guaranteed Delivery</title><link>https://pavelriajul.com/blog/push-notifications-reliability/</link><guid isPermaLink="true">https://pavelriajul.com/blog/push-notifications-reliability/</guid><description>Every layer between your server and a phone can drop a notification silently. Design for that, and ask for the permission at the right moment.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><category>Mobile</category><author>hello@riajulislam.dev</author></item><item><title>Gestures at 60fps in React Native</title><link>https://pavelriajul.com/blog/react-native-gesture-performance/</link><guid isPermaLink="true">https://pavelriajul.com/blog/react-native-gesture-performance/</guid><description>A drag that lags by two frames feels broken in a way users cannot name. Keeping animation off the JavaScript thread is the whole technique.</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><category>Mobile</category><author>hello@riajulislam.dev</author></item><item><title>Expo in Production: What It Solves and What It Does Not</title><link>https://pavelriajul.com/blog/expo-in-production/</link><guid isPermaLink="true">https://pavelriajul.com/blog/expo-in-production/</guid><description>Expo is no longer the beginner option you outgrow. Here is what it actually removes from a React Native project, and where it still bites.</description><pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate><category>Mobile</category><author>hello@riajulislam.dev</author></item><item><title>Native App or PWA? The Decision in Practice</title><link>https://pavelriajul.com/blog/app-vs-pwa/</link><guid isPermaLink="true">https://pavelriajul.com/blog/app-vs-pwa/</guid><description>Most people asking for an app need a fast mobile site. Some genuinely need the store. The question that separates them is not technical.</description><pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate><category>Mobile</category><author>hello@riajulislam.dev</author></item><item><title>Building Offline-First in React Native</title><link>https://pavelriajul.com/blog/react-native-offline-first/</link><guid isPermaLink="true">https://pavelriajul.com/blog/react-native-offline-first/</guid><description>An app that needs a connection to show data the user already owns is broken on a train. Local-first storage, sync, and the conflicts nobody plans for.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><category>Mobile</category><author>hello@riajulislam.dev</author></item><item><title>Shopify Subscriptions: What Nobody Warns You About</title><link>https://pavelriajul.com/blog/shopify-subscriptions/</link><guid isPermaLink="true">https://pavelriajul.com/blog/shopify-subscriptions/</guid><description>Recurring revenue is the easiest thing to sell internally and the hardest to run. The failure modes are operational, not technical — here they are.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>Metafields Without Slowing the Store Down</title><link>https://pavelriajul.com/blog/shopify-metafields-performance/</link><guid isPermaLink="true">https://pavelriajul.com/blog/shopify-metafields-performance/</guid><description>Custom product data is how a Shopify store stops looking generic. It is also how a collection page ends up making four hundred lookups per render.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>Reading an Experiment Result Without Fooling Yourself</title><link>https://pavelriajul.com/blog/cro-experiment-results/</link><guid isPermaLink="true">https://pavelriajul.com/blog/cro-experiment-results/</guid><description>The test finished and the number is green. Here is what to check before you ship it, and the ways a result can be real and still not repeat.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>How Much of Shopify Checkout Can You Change?</title><link>https://pavelriajul.com/blog/shopify-checkout-customization/</link><guid isPermaLink="true">https://pavelriajul.com/blog/shopify-checkout-customization/</guid><description>Less than you want and more than you think. What is configurable, what needs Plus, what needs an extension, and what you should not touch at all.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>Figma to Shopify Without Losing the Design</title><link>https://pavelriajul.com/blog/figma-to-shopify/</link><guid isPermaLink="true">https://pavelriajul.com/blog/figma-to-shopify/</guid><description>A design that looks perfect in Figma and wrong in the theme editor failed at handoff, not at build. What the file needs before anyone writes Liquid.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>Product Schema on Shopify, Done Properly</title><link>https://pavelriajul.com/blog/shopify-product-schema/</link><guid isPermaLink="true">https://pavelriajul.com/blog/shopify-product-schema/</guid><description>Rich results need structured data that matches the page exactly. Most Shopify themes emit something close enough to look fine and wrong enough to fail.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>What Actually Belongs on a Product Page</title><link>https://pavelriajul.com/blog/product-page-elements/</link><guid isPermaLink="true">https://pavelriajul.com/blog/product-page-elements/</guid><description>The page that decides the sale, element by element — in the order a buyer needs them, and with the things that only add weight left out.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>A/B Testing a Shopify Store with PostHog</title><link>https://pavelriajul.com/blog/posthog-ab-testing-shopify/</link><guid isPermaLink="true">https://pavelriajul.com/blog/posthog-ab-testing-shopify/</guid><description>Feature flags, experiments and session recordings on a Liquid theme — without a dedicated testing tool, and without the flicker that ruins the result.</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>The CRO Loop: How Conversion Work Actually Runs</title><link>https://pavelriajul.com/blog/cro-process-loop/</link><guid isPermaLink="true">https://pavelriajul.com/blog/cro-process-loop/</guid><description>Measure, hypothesise, build, test, decide, repeat. The loop is simple and almost every team breaks it in the same three places.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>Custom Theme or Premium Theme? How I Decide</title><link>https://pavelriajul.com/blog/custom-vs-premium-shopify-theme/</link><guid isPermaLink="true">https://pavelriajul.com/blog/custom-vs-premium-shopify-theme/</guid><description>A £300 theme covers most stores completely. A custom build is right for a narrow set of them. The deciding factor is usually not what people think.</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>Making a Shopify Theme Fast Without Going Headless</title><link>https://pavelriajul.com/blog/shopify-performance-optimization/</link><guid isPermaLink="true">https://pavelriajul.com/blog/shopify-performance-optimization/</guid><description>Most slow Shopify stores are slow for four reasons, none of them Shopify. A day of the right work usually beats a quarter of rebuilding.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>Where Ecommerce Conversion Actually Leaks</title><link>https://pavelriajul.com/blog/ecommerce-conversion-leaks/</link><guid isPermaLink="true">https://pavelriajul.com/blog/ecommerce-conversion-leaks/</guid><description>Most stores lose more revenue between the product page and the cart than anywhere else — and fix the homepage instead. Where to look, in order.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>Is Headless Shopify Worth It? An Honest Answer</title><link>https://pavelriajul.com/blog/shopify-hydrogen-worth-it/</link><guid isPermaLink="true">https://pavelriajul.com/blog/shopify-hydrogen-worth-it/</guid><description>Going headless cut one store’s load time by 58% and lifted mobile conversion 24%. It also cost more to build and more to run. When that trade makes sense.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><category>E-commerce</category><author>hello@riajulislam.dev</author></item><item><title>Headless Chrome for Social Cards and Visual Checks</title><link>https://pavelriajul.com/blog/headless-chrome-screenshots/</link><guid isPermaLink="true">https://pavelriajul.com/blog/headless-chrome-screenshots/</guid><description>Generating per-route social cards from real HTML, plus the screenshot helper I use to verify layout work — and the colour bug that fools both.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><category>Performance</category><author>hello@riajulislam.dev</author></item><item><title>Prefetch on Hover: Navigation That Feels Instant</title><link>https://pavelriajul.com/blog/prefetch-on-hover/</link><guid isPermaLink="true">https://pavelriajul.com/blog/prefetch-on-hover/</guid><description>A pointer arrives at a link about 200ms before the click. That gap is enough to load the next page — if you spend it carefully and not on everything.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><category>Performance</category><author>hello@riajulislam.dev</author></item><item><title>Lazy-Loading the Heavy Libraries Nobody Uses</title><link>https://pavelriajul.com/blog/lazy-load-heavy-libraries/</link><guid isPermaLink="true">https://pavelriajul.com/blog/lazy-load-heavy-libraries/</guid><description>A PDF generator, a chart library and an editor in your main bundle serve a fraction of visits. How to move them behind the click that needs them.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><category>Performance</category><author>hello@riajulislam.dev</author></item><item><title>What Third-Party Scripts Actually Cost You</title><link>https://pavelriajul.com/blog/third-party-script-cost/</link><guid isPermaLink="true">https://pavelriajul.com/blog/third-party-script-cost/</guid><description>A tag manager, a chat widget and two analytics scripts can outweigh your entire application. How to measure the damage and what to do about each one.</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><category>Performance</category><author>hello@riajulislam.dev</author></item><item><title>Field Data vs Lab Data: Which Number Do You Trust?</title><link>https://pavelriajul.com/blog/field-vs-lab-data/</link><guid isPermaLink="true">https://pavelriajul.com/blog/field-vs-lab-data/</guid><description>Lighthouse says 98 and Search Console says the page is failing. Both are right. Here is what each measurement is for and which one decides.</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate><category>Performance</category><author>hello@riajulislam.dev</author></item><item><title>Images Are the Performance Problem</title><link>https://pavelriajul.com/blog/image-optimization-strategy/</link><guid isPermaLink="true">https://pavelriajul.com/blog/image-optimization-strategy/</guid><description>Format, dimensions, the sizes attribute nobody sets, and why build-time optimisation beats an on-demand service for most sites.</description><pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate><category>Performance</category><author>hello@riajulislam.dev</author></item><item><title>Bundle Splitting That Actually Changes the Number</title><link>https://pavelriajul.com/blog/bundle-splitting/</link><guid isPermaLink="true">https://pavelriajul.com/blog/bundle-splitting/</guid><description>Splitting moves bytes around; it does not remove them. What to split, what to delete instead, and why the shared chunk grows quietly.</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate><category>Performance</category><author>hello@riajulislam.dev</author></item><item><title>Cloudflare Pages or Vercel: Deciding by What You Deploy</title><link>https://pavelriajul.com/blog/cloudflare-pages-vs-vercel/</link><guid isPermaLink="true">https://pavelriajul.com/blog/cloudflare-pages-vs-vercel/</guid><description>Both serve static files fast. The decision is about runtime, framework fit and what happens when the bill scales — not about which edge is closer.</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><category>Performance</category><author>hello@riajulislam.dev</author></item><item><title>Getting CLS to Near Zero by Reserving Space</title><link>https://pavelriajul.com/blog/near-zero-cls/</link><guid isPermaLink="true">https://pavelriajul.com/blog/near-zero-cls/</guid><description>Every shift is something arriving into space nobody reserved. Aspect ratios, font metrics, and the banner that pushes the page down mid-read.</description><pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate><category>Performance</category><author>hello@riajulislam.dev</author></item><item><title>Core Web Vitals in Next.js: The Handful of Changes That Move the Number</title><link>https://pavelriajul.com/blog/core-web-vitals-nextjs/</link><guid isPermaLink="true">https://pavelriajul.com/blog/core-web-vitals-nextjs/</guid><description>LCP is usually one image, INP is usually one handler, and CLS is usually one element with no reserved space. Fixing those beats a rewrite.</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate><category>Performance</category><author>hello@riajulislam.dev</author></item><item><title>An Icon System a CMS Can Author</title><link>https://pavelriajul.com/blog/inline-icon-system/</link><guid isPermaLink="true">https://pavelriajul.com/blog/inline-icon-system/</guid><description>Inline SVG keyed on the class strings a CMS already stores, a missing icon that renders nothing, and the script that stops paths being pasted by hand.</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>Scroll-Stacking Cards That Do Not Reverse on Mobile</title><link>https://pavelriajul.com/blog/scroll-stacking-cards/</link><guid isPermaLink="true">https://pavelriajul.com/blog/scroll-stacking-cards/</guid><description>A sticky cascade needs more height than a phone has, so the last cards pin above their own resting position and the effect silently runs backwards.</description><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>The Table of Contents That Points at Nothing</title><link>https://pavelriajul.com/blog/toc-shared-heading-ids/</link><guid isPermaLink="true">https://pavelriajul.com/blog/toc-shared-heading-ids/</guid><description>Two slugifiers agree on most headings and disagree on the ones with punctuation. One function, used by both the renderer and the contents list.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>Structuring Tokens So Dark Mode Is Possible Later</title><link>https://pavelriajul.com/blog/dark-mode-tokens/</link><guid isPermaLink="true">https://pavelriajul.com/blog/dark-mode-tokens/</guid><description>Semantic tokens over literal ones, the two-layer split that makes a second theme a data change, and an honest case for not shipping dark mode at all.</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>Forms That Work Without a Framework</title><link>https://pavelriajul.com/blog/accessible-forms/</link><guid isPermaLink="true">https://pavelriajul.com/blog/accessible-forms/</guid><description>Labels, error announcement, autocomplete and the keyboard a phone shows — the plain HTML most form libraries reimplement badly.</description><pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>Stop Stacking Cards One Per Row on Mobile</title><link>https://pavelriajul.com/blog/mobile-card-density/</link><guid isPermaLink="true">https://pavelriajul.com/blog/mobile-card-density/</guid><description>Two-up grids on a 375px screen, the CSS that handles an odd card, and why a page 26 screens long is a design problem rather than a content one.</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>Writing Your Own Portable Text Renderer</title><link>https://pavelriajul.com/blog/portable-text-renderer/</link><guid isPermaLink="true">https://pavelriajul.com/blog/portable-text-renderer/</guid><description>Portable Text stores each list item as a sibling, so naive rendering gives one list per bullet. That and four other things the format does not tell you.</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>Why 100vh Puts Your CTA Underneath the Nav</title><link>https://pavelriajul.com/blog/mobile-hero-viewport/</link><guid isPermaLink="true">https://pavelriajul.com/blog/mobile-hero-viewport/</guid><description>svh, dvh and lvh explained by what breaks, plus the fixed bottom bar that no viewport unit knows about and the shorter lede a phone actually needs.</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>A Design System Small Enough That People Use It</title><link>https://pavelriajul.com/blog/reusable-design-system/</link><guid isPermaLink="true">https://pavelriajul.com/blog/reusable-design-system/</guid><description>Tokens, four primitives and a rule about inline styles. What to build, what to skip, and the signs a system has quietly stopped being used.</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>Killing Every Third-Party CSS Request</title><link>https://pavelriajul.com/blog/self-host-fonts-inline-icons/</link><guid isPermaLink="true">https://pavelriajul.com/blog/self-host-fonts-inline-icons/</guid><description>Two render-blocking hops to other people&apos;s servers, removed. Self-hosted fonts with the right preload, and icons as inline SVG instead of a webfont.</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>The Contrast Audit That Found 300 Failing Elements</title><link>https://pavelriajul.com/blog/wcag-contrast-audit/</link><guid isPermaLink="true">https://pavelriajul.com/blog/wcag-contrast-audit/</guid><description>One grey token failed AA across an entire site. How to find that, why the same grey passes on white and fails on a panel, and how to stop it recurring.</description><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>A Fluid Spacing Scale That Replaces Ten Breakpoints</title><link>https://pavelriajul.com/blog/fluid-spacing-scale/</link><guid isPermaLink="true">https://pavelriajul.com/blog/fluid-spacing-scale/</guid><description>One clamp per step instead of a media query per component — plus the self-referential custom property that silently flattens a whole stylesheet.</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>Respecting prefers-reduced-motion Properly</title><link>https://pavelriajul.com/blog/prefers-reduced-motion/</link><guid isPermaLink="true">https://pavelriajul.com/blog/prefers-reduced-motion/</guid><description>The global override that misses half your animations, why animation does not inherit, and how to check a whole site in ten minutes.</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>GSAP and Lenis Together, Without Breaking Scroll</title><link>https://pavelriajul.com/blog/gsap-lenis-smooth-scroll/</link><guid isPermaLink="true">https://pavelriajul.com/blog/gsap-lenis-smooth-scroll/</guid><description>Smooth scroll and scroll-triggered animation fight over the same number. Wiring them properly, and the accessibility work that is not optional.</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>Astro Islands: Shipping Interactivity Without Shipping a Framework</title><link>https://pavelriajul.com/blog/astro-islands/</link><guid isPermaLink="true">https://pavelriajul.com/blog/astro-islands/</guid><description>Which client directive to use and when, the state problem nobody mentions, and why most islands turn out not to need a framework at all.</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>Astro or Next.js: Picking by What the Page Has to Do</title><link>https://pavelriajul.com/blog/astro-vs-nextjs/</link><guid isPermaLink="true">https://pavelriajul.com/blog/astro-vs-nextjs/</guid><description>Not a benchmark. The question is whether your pages are documents or an application — and what it costs when you answer it wrong.</description><pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate><category>Frontend</category><author>hello@riajulislam.dev</author></item><item><title>When to Automate With n8n and When to Write the Code</title><link>https://pavelriajul.com/blog/n8n-workflow-automation/</link><guid isPermaLink="true">https://pavelriajul.com/blog/n8n-workflow-automation/</guid><description>Workflow tools are excellent glue and poor application logic. The line between the two, and how to keep automations from becoming untested production code.</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Rate Limiting at the Edge, Before It Reaches Your Server</title><link>https://pavelriajul.com/blog/edge-rate-limiting/</link><guid isPermaLink="true">https://pavelriajul.com/blog/edge-rate-limiting/</guid><description>Why the limit belongs in front of your origin, which algorithm to pick, and the identity question that decides whether it works at all.</description><pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Running Background Workers and Cron Jobs on Render</title><link>https://pavelriajul.com/blog/render-background-jobs/</link><guid isPermaLink="true">https://pavelriajul.com/blog/render-background-jobs/</guid><description>Background workers, cron jobs and the free-tier spin-down that quietly stops them — the practical setup for the always-on half of a serverless stack.</description><pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Background Jobs: Which Queue, and When You Need One</title><link>https://pavelriajul.com/blog/background-job-queues/</link><guid isPermaLink="true">https://pavelriajul.com/blog/background-job-queues/</guid><description>Postgres table, Redis queue or hosted service — and the four properties that decide which one, starting with whether you need a queue at all.</description><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Idempotency Keys: Making Retries Safe on Your Own API</title><link>https://pavelriajul.com/blog/idempotency-keys/</link><guid isPermaLink="true">https://pavelriajul.com/blog/idempotency-keys/</guid><description>A timeout tells the client nothing about whether the work happened. Idempotency keys are how a retry becomes safe instead of a second order.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Direct File Uploads With Signed URLs, Done Safely</title><link>https://pavelriajul.com/blog/signed-upload-urls/</link><guid isPermaLink="true">https://pavelriajul.com/blog/signed-upload-urls/</guid><description>The browser uploads straight to storage and your server never holds the bytes — plus the four checks that stop a signed URL being an open write endpoint.</description><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>MongoDB Schema and Index Decisions That Do Not Age Badly</title><link>https://pavelriajul.com/blog/mongodb-schema-indexes/</link><guid isPermaLink="true">https://pavelriajul.com/blog/mongodb-schema-indexes/</guid><description>Embed or reference, the compound index rule that decides whether a query is fast, and the unbounded array that eventually breaks a document.</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>REST API Design Decisions That Age Well</title><link>https://pavelriajul.com/blog/rest-api-design/</link><guid isPermaLink="true">https://pavelriajul.com/blog/rest-api-design/</guid><description>Pagination, errors, versioning and partial updates — the four choices that are trivial before launch and permanent afterwards.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Cloudflare R2 vs S3: Where the Bill Actually Comes From</title><link>https://pavelriajul.com/blog/r2-vs-s3/</link><guid isPermaLink="true">https://pavelriajul.com/blog/r2-vs-s3/</guid><description>Zero egress fees is the headline. The decision is really about egress volume, ecosystem depth and how much of your architecture assumes AWS is nearby.</description><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Schema Migrations That Do Not Take the Site Down</title><link>https://pavelriajul.com/blog/zero-downtime-migrations/</link><guid isPermaLink="true">https://pavelriajul.com/blog/zero-downtime-migrations/</guid><description>The expand-and-contract pattern, which ALTER statements take an exclusive lock, and why the dangerous part of a rename is the deploy rather than the SQL.</description><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Database Branching in Neon, and What It Actually Fixes</title><link>https://pavelriajul.com/blog/neon-database-branching/</link><guid isPermaLink="true">https://pavelriajul.com/blog/neon-database-branching/</guid><description>A branch per pull request with production-shaped data, why it makes migration review possible, and the two ways it quietly leaks customer records.</description><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Why Your Password Reset Email Lands in Spam</title><link>https://pavelriajul.com/blog/transactional-email-deliverability/</link><guid isPermaLink="true">https://pavelriajul.com/blog/transactional-email-deliverability/</guid><description>SPF, DKIM and DMARC in the order they actually have to be set up, plus the subdomain decision that keeps a marketing blast from killing your login emails.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Supabase Row Level Security Without the Foot-Guns</title><link>https://pavelriajul.com/blog/supabase-row-level-security/</link><guid isPermaLink="true">https://pavelriajul.com/blog/supabase-row-level-security/</guid><description>The policies that actually hold, the service role key that quietly bypasses all of them, and why an unindexed policy turns a fast query into a slow one.</description><pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Stripe Webhooks That Do Not Double-Charge</title><link>https://pavelriajul.com/blog/stripe-webhooks-idempotency/</link><guid isPermaLink="true">https://pavelriajul.com/blog/stripe-webhooks-idempotency/</guid><description>Stripe sends the same event twice, out of order, and to an endpoint that timed out. The handler shape that survives all three without granting twice.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Role-Based Access Control in Next.js and Express</title><link>https://pavelriajul.com/blog/role-based-auth-nextjs-express/</link><guid isPermaLink="true">https://pavelriajul.com/blog/role-based-auth-nextjs-express/</guid><description>Where the permission check belongs, why hiding a button is not access control, and the one file that stops roles becoming a nest of if statements.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><category>Backend</category><author>hello@riajulislam.dev</author></item><item><title>Feature Flags Without a Platform</title><link>https://pavelriajul.com/blog/feature-flags-simple/</link><guid isPermaLink="true">https://pavelriajul.com/blog/feature-flags-simple/</guid><description>Shipping unfinished work safely with a database table and twenty lines of code, before paying for a flag service.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>Spam Protection on Every Public Form</title><link>https://pavelriajul.com/blog/form-spam-protection/</link><guid isPermaLink="true">https://pavelriajul.com/blog/form-spam-protection/</guid><description>Stopping bot submissions without making a human prove they are one — honeypots, Turnstile, rate limits and server-side verification.</description><pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>Testing the Paths That Actually Break</title><link>https://pavelriajul.com/blog/testing-critical-paths/</link><guid isPermaLink="true">https://pavelriajul.com/blog/testing-critical-paths/</guid><description>Not 100% coverage. The handful of flows where a regression costs real money, and how to cover them cheaply.</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>Uptime Monitoring Versus Error Tracking</title><link>https://pavelriajul.com/blog/uptime-vs-error-tracking/</link><guid isPermaLink="true">https://pavelriajul.com/blog/uptime-vs-error-tracking/</guid><description>They catch different outages. Running only one is how a site stays down all weekend without anyone knowing.</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>What a Discovery Call Should Actually Cover</title><link>https://pavelriajul.com/blog/discovery-call-questions/</link><guid isPermaLink="true">https://pavelriajul.com/blog/discovery-call-questions/</guid><description>Thirty minutes, and the questions that decide whether a quote is realistic or fiction.</description><pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>Handing Over a Project So the Client Owns Everything</title><link>https://pavelriajul.com/blog/project-handover-checklist/</link><guid isPermaLink="true">https://pavelriajul.com/blog/project-handover-checklist/</guid><description>The accounts and access that belong in the client’s name from day one, and the handover document that stops the late-night support calls.</description><pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>Auth, Billing and Onboarding Out of the Box</title><link>https://pavelriajul.com/blog/auth-billing-onboarding-mvp/</link><guid isPermaLink="true">https://pavelriajul.com/blog/auth-billing-onboarding-mvp/</guid><description>The three systems every product needs and nobody wants to pay for twice — built once, reused on every project.</description><pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>Automated Backups With a Restore You Have Actually Tested</title><link>https://pavelriajul.com/blog/tested-database-backups/</link><guid isPermaLink="true">https://pavelriajul.com/blog/tested-database-backups/</guid><description>An untested backup is not a backup. The restore drill that takes an hour and the failure it prevents.</description><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>CI That Type-Checks and Tests on Every Push</title><link>https://pavelriajul.com/blog/ci-pipeline-typecheck-tests/</link><guid isPermaLink="true">https://pavelriajul.com/blog/ci-pipeline-typecheck-tests/</guid><description>A pipeline that catches the class of bug that reaches production most often, in under sixty lines of config.</description><pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>The Staging Environment Is Not Optional</title><link>https://pavelriajul.com/blog/staging-environment/</link><guid isPermaLink="true">https://pavelriajul.com/blog/staging-environment/</guid><description>What shipping straight to production actually costs, and the twenty minutes of setup that prevents it.</description><pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>Multi-Tenant Data Isolation in Prisma and Postgres</title><link>https://pavelriajul.com/blog/multi-tenant-prisma-postgres/</link><guid isPermaLink="true">https://pavelriajul.com/blog/multi-tenant-prisma-postgres/</guid><description>Shared schema, schema-per-tenant or database-per-tenant — and the middleware that stops a missing where clause leaking another customer’s data.</description><pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>Database Design That Survives Version Two</title><link>https://pavelriajul.com/blog/database-design-for-v2/</link><guid isPermaLink="true">https://pavelriajul.com/blog/database-design-for-v2/</guid><description>The schema decisions that are cheap now and expensive in six months, and how to tell them apart before you commit.</description><pubDate>Sun, 04 Jan 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>Sharing TypeScript Types From Database to UI</title><link>https://pavelriajul.com/blog/type-safe-mern/</link><guid isPermaLink="true">https://pavelriajul.com/blog/type-safe-mern/</guid><description>One source of truth for your data shapes, so the compiler catches a mismatch between API and UI before a user does.</description><pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>Supabase or Neon + Clerk? The Org Model Test</title><link>https://pavelriajul.com/blog/supabase-vs-neon-clerk/</link><guid isPermaLink="true">https://pavelriajul.com/blog/supabase-vs-neon-clerk/</guid><description>One vendor for database, auth and storage, or best-of-breed pieces. The single question about your organisation model that settles it.</description><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>How Much Does an MVP Cost in 2026?</title><link>https://pavelriajul.com/blog/mvp-development-cost/</link><guid isPermaLink="true">https://pavelriajul.com/blog/mvp-development-cost/</guid><description>What an MVP actually costs by scope, what drives the number up, and the features that get cut first without hurting the launch.</description><pubDate>Sun, 28 Dec 2025 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>The Four Setups I Start Every Project From</title><link>https://pavelriajul.com/blog/project-stack-templates/</link><guid isPermaLink="true">https://pavelriajul.com/blog/project-stack-templates/</guid><description>Landing, web app, B2B multi-tenant or AI app — the three questions that decide which a project gets, and why picking wrong is expensive.</description><pubDate>Thu, 25 Dec 2025 00:00:00 GMT</pubDate><category>Full-Stack</category><author>hello@riajulislam.dev</author></item><item><title>Prompt Versioning and Why Prompts Belong in Git</title><link>https://pavelriajul.com/blog/prompt-versioning/</link><guid isPermaLink="true">https://pavelriajul.com/blog/prompt-versioning/</guid><description>A prompt is code. Storing it in a dashboard means no review, no history, and no way to tell what changed when quality dropped.</description><pubDate>Tue, 23 Dec 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>Semantic Search That Understands What People Meant</title><link>https://pavelriajul.com/blog/semantic-search-guide/</link><guid isPermaLink="true">https://pavelriajul.com/blog/semantic-search-guide/</guid><description>Why keyword search fails on natural questions, what semantic search costs to add to an existing product, and when it is the wrong answer.</description><pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>Evaluating an AI Feature Before You Trust It</title><link>https://pavelriajul.com/blog/ai-evaluation-harness/</link><guid isPermaLink="true">https://pavelriajul.com/blog/ai-evaluation-harness/</guid><description>A test set, a scoring method and a regression check — so a prompt change cannot quietly make your answers worse without anyone noticing.</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>Rate Limiting an AI Feature So One User Cannot Drain the Budget</title><link>https://pavelriajul.com/blog/rate-limiting-ai-features/</link><guid isPermaLink="true">https://pavelriajul.com/blog/rate-limiting-ai-features/</guid><description>Per-user, per-org and global limits for AI endpoints — and why degrading gracefully beats returning an error the user cannot act on.</description><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>Document Extraction Pipelines That Survive Messy Input</title><link>https://pavelriajul.com/blog/document-extraction-pipeline/</link><guid isPermaLink="true">https://pavelriajul.com/blog/document-extraction-pipeline/</guid><description>Turning PDFs, scans and inconsistent forms into structured data — with validation, confidence scores and a human review path that makes it trustworthy.</description><pubDate>Sat, 13 Dec 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>Provider-Agnostic AI: Swapping Models Without a Rewrite</title><link>https://pavelriajul.com/blog/provider-agnostic-ai-sdk/</link><guid isPermaLink="true">https://pavelriajul.com/blog/provider-agnostic-ai-sdk/</guid><description>The adapter layer that let a production app move between Claude, GPT and Groq by changing one file — and the four things it has to normalise.</description><pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>Semantic Search With pgvector Before You Buy a Vector Database</title><link>https://pavelriajul.com/blog/pgvector-semantic-search/</link><guid isPermaLink="true">https://pavelriajul.com/blog/pgvector-semantic-search/</guid><description>Postgres handles semantic search for most products. When pgvector is enough, how to index it, and where a dedicated vector database earns its cost.</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>Streaming AI Responses Without Thrashing Your UI</title><link>https://pavelriajul.com/blog/streaming-ai-ui/</link><guid isPermaLink="true">https://pavelriajul.com/blog/streaming-ai-ui/</guid><description>Token streaming that stays smooth: batching updates, avoiding layout shift, and handling a dropped connection mid-answer.</description><pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>Per-User AI Cost Logging: Finding the Account Burning Your Budget</title><link>https://pavelriajul.com/blog/ai-cost-logging/</link><guid isPermaLink="true">https://pavelriajul.com/blog/ai-cost-logging/</guid><description>What to log on every model call, and the query that finds the one user costing more than their whole plan is worth.</description><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>AI Booking Systems for Clinics, Salons and Trades</title><link>https://pavelriajul.com/blog/ai-booking-system-guide/</link><guid isPermaLink="true">https://pavelriajul.com/blog/ai-booking-system-guide/</guid><description>A booking assistant that checks real availability and books the slot — and the architecture rule that stops it double-booking your calendar.</description><pubDate>Sun, 30 Nov 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>Validating Every LLM Tool Call With Zod</title><link>https://pavelriajul.com/blog/validating-llm-tool-calls-zod/</link><guid isPermaLink="true">https://pavelriajul.com/blog/validating-llm-tool-calls-zod/</guid><description>The model will eventually return a malformed tool call. The Zod schema layer that turns that from a corrupted database into a logged retry.</description><pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>Why AI Is a Module on a Real App, Never a Stack of Its Own</title><link>https://pavelriajul.com/blog/ai-is-a-module-not-a-stack/</link><guid isPermaLink="true">https://pavelriajul.com/blog/ai-is-a-module-not-a-stack/</guid><description>AI-first architectures fall over the moment you need auth, billing or an audit trail. The case for bolting AI onto a boring, well-built application.</description><pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>How Much Does It Cost to Build an AI Feature in 2026?</title><link>https://pavelriajul.com/blog/ai-feature-development-cost/</link><guid isPermaLink="true">https://pavelriajul.com/blog/ai-feature-development-cost/</guid><description>What an AI chat, search or extraction feature actually costs to build and to run — build fees, token spend, and the infrastructure most quotes leave out.</description><pubDate>Sun, 23 Nov 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>Shipping an MVP in 19 Days Without Shipping Garbage</title><link>https://pavelriajul.com/blog/mvp-in-19-days/</link><guid isPermaLink="true">https://pavelriajul.com/blog/mvp-in-19-days/</guid><description>A real 19-day build of an AI research assistant: what got scoped out, what got generated, and the four things that never get cut no matter the deadline.</description><pubDate>Thu, 20 Nov 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>How I Actually Build With AI — and Where I Still Do the Work</title><link>https://pavelriajul.com/blog/building-with-ai-workflow/</link><guid isPermaLink="true">https://pavelriajul.com/blog/building-with-ai-workflow/</guid><description>The honest version of an AI-accelerated workflow: what gets generated, what gets rewritten, and the review discipline that keeps fast from meaning fragile.</description><pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item><item><title>RAG That Actually Answers: Chunking, Reranking and Citations</title><link>https://pavelriajul.com/blog/rag-that-answers/</link><guid isPermaLink="true">https://pavelriajul.com/blog/rag-that-answers/</guid><description>Most bad AI answers are bad retrieval, not a bad model. The chunking, reranking and citation changes that moved accuracy most on a production assistant.</description><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate><category>AI</category><author>hello@riajulislam.dev</author></item></channel></rss>