<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>DineshStack</title>
    <link>https://dineshstack.com</link>
    <description>Laravel, Next.js, PHP 8.4 &amp; modern web development — by Dinesh Wijethunga</description>
    <language>en-us</language>
    <managingEditor>hello@dineshstack.com (Dinesh Wijethunga)</managingEditor>
    <webMaster>hello@dineshstack.com (Dinesh Wijethunga)</webMaster>
    <lastBuildDate>Sat, 13 Jun 2026 08:36:27 GMT</lastBuildDate>
    <atom:link href="https://dineshstack.com/feed.xml" rel="self" type="application/rss+xml"/>
    <image>
      <url>https://dineshstack.com/og-image.png</url>
      <title>DineshStack</title>
      <link>https://dineshstack.com</link>
    </image>
    
    <item>
      <title>Sending iOS Push Notifications with APNs HTTP/2 in Laravel (Part 3 of 4)</title>
      <link>https://dineshstack.com/blog/sending-ios-push-notifications-with-apns-http2-in-laravel-part-3-of-4</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/sending-ios-push-notifications-with-apns-http2-in-laravel-part-3-of-4</guid>
      <pubDate>Wed, 10 Jun 2026 12:15:03 GMT</pubDate>
      <description></description>
      
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Sending Android Push Notifications with FCM HTTP v1 in Laravel (Part 2 of 4)</title>
      <link>https://dineshstack.com/blog/sending-android-push-notifications-with-fcm-http-v1-in-laravel-part-2-of-4</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/sending-android-push-notifications-with-fcm-http-v1-in-laravel-part-2-of-4</guid>
      <pubDate>Sun, 07 Jun 2026 12:13:04 GMT</pubDate>
      <description></description>
      
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Push Notifications in Laravel: Storing Device Tokens for iOS and Android</title>
      <link>https://dineshstack.com/blog/push-notifications-in-laravel-storing-device-tokens-for-ios-and-android</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/push-notifications-in-laravel-storing-device-tokens-for-ios-and-android</guid>
      <pubDate>Thu, 04 Jun 2026 13:35:04 GMT</pubDate>
      <description>Before you can push a single notification to a phone, you need somewhere to store the token that identifies it. iOS and Android use completely different services — APNs and FCM — and each token has a lifecycle: it can expire, rotate, or become invalid. This post covers the database design, the registration endpoint, and the upsert strategy that keeps your token table clean.</description>
      
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>I Want to Build an App Like Uber — Where Do I Start as a Laravel Developer?</title>
      <link>https://dineshstack.com/blog/i-want-to-build-an-app-like-uber-where-do-i-start-as-a-laravel-developer-1</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/i-want-to-build-an-app-like-uber-where-do-i-start-as-a-laravel-developer-1</guid>
      <pubDate>Tue, 26 May 2026 14:30:03 GMT</pubDate>
      <description>Every developer eventually asks: &quot;could I build a ride-booking app?&quot; The honest answer is yes — but without the right structure, you&apos;ll spend 6 months just on setup before writing a single feature. This is the exact stack and architecture you need, explained simply.</description>
      <category>Laravel</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Surge Pricing in Laravel: Demand-Based Multipliers with Multi-Layer Caching and Kafka Events</title>
      <link>https://dineshstack.com/blog/surge-pricing-in-laravel-demand-based-multipliers-with-multi-layer-caching-and-kafka-events-1</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/surge-pricing-in-laravel-demand-based-multipliers-with-multi-layer-caching-and-kafka-events-1</guid>
      <pubDate>Sat, 23 May 2026 13:30:04 GMT</pubDate>
      <description>Surge pricing is a hot path — every fare estimate hits it. A 3-layer cache (request memory, Redis, DB) keeps the multiplier resolution under 1ms for repeated calls. Demand signals from Node.js microservices trigger automatic rules. Admins can override with manual surge events. Here&apos;s the full architecture.</description>
      
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>PostGIS Spatial Queries in Laravel: How We Resolve Booking Zones at Scale</title>
      <link>https://dineshstack.com/blog/postgis-spatial-queries-in-laravel-how-we-resolve-booking-zones-at-scale-1</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/postgis-spatial-queries-in-laravel-how-we-resolve-booking-zones-at-scale-1</guid>
      <pubDate>Wed, 20 May 2026 14:08:03 GMT</pubDate>
      <description>When a customer requests a ride, we need to know which service zone covers their pickup point — in under 50ms, for thousands of concurrent requests. PostGIS ST_Contains with a spatial index handles the geometry. A three-layer cache (request, Redis, DB) keeps it fast. Here&apos;s the complete implementation.</description>
      <category>Laravel</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Multi-Tenant RBAC in Laravel: Team-Scoped Permissions with Spatie and Teamwork</title>
      <link>https://dineshstack.com/blog/multi-tenant-rbac-in-laravel-team-scoped-permissions-with-spatie-and-teamwork-1</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/multi-tenant-rbac-in-laravel-team-scoped-permissions-with-spatie-and-teamwork-1</guid>
      <pubDate>Sun, 17 May 2026 04:20:04 GMT</pubDate>
      <description>A sys_admin should see everything. An agency subadmin should only see their agency&apos;s drivers. A fleet driver shouldn&apos;t manage vehicles at all. Implementing team-scoped RBAC with spatie/laravel-permission and mpociot/teamwork means permissions are checked against both role and team simultaneously — here&apos;s how it works.</description>
      
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Telr Payment Integration: Laravel Backend + Flutter Mobile App</title>
      <link>https://dineshstack.com/blog/telr-payment-integration-laravel-backend-flutter-mobile-app</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/telr-payment-integration-laravel-backend-flutter-mobile-app</guid>
      <pubDate>Sat, 16 May 2026 16:33:29 GMT</pubDate>
      <description>A Developer&apos;s Deep Dive into Card Tokenization, Hosted Checkout, and Wallet Top-ups</description>
      <category>Laravel</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Building a Laravel Modular Monolith: Why nwidart/laravel-modules Changed How I Ship Features</title>
      <link>https://dineshstack.com/blog/building-a-laravel-modular-monolith-why-nwidartlaravel-modules-changed-how-i-ship-features-1</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/building-a-laravel-modular-monolith-why-nwidartlaravel-modules-changed-how-i-ship-features-1</guid>
      <pubDate>Mon, 11 May 2026 08:53:23 GMT</pubDate>
      <description>A single routes/web.php that imports from 15 different feature domains is a maintenance nightmare. Here&apos;s how I restructured a ride-booking platform into self-contained modules — and why it made onboarding, testing, and deploys dramatically simpler.</description>
      <category>Laravel</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Why I Prefix Every API Route with Its Module Name in Laravel — and the Standards That Make It Work</title>
      <link>https://dineshstack.com/blog/why-i-prefix-every-api-route-with-its-module-name-in-laravel-and-the-standards-that-make-it-work</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/why-i-prefix-every-api-route-with-its-module-name-in-laravel-and-the-standards-that-make-it-work</guid>
      <pubDate>Sat, 02 May 2026 12:31:17 GMT</pubDate>
      <description>Most Laravel tutorials show api/admin/zones and call it a day. In a modular monolith, that&apos;s a trap. Here&apos;s why I moved to api/v1/admin/booking-config/zones, how I structured every module to own its routes, and the naming rules that keep the whole team aligned — including beginner developers.</description>
      
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Why We Built Dineshstack Ride hailing: Choosing a Modular Laravel + Node Microservice Architecture</title>
      <link>https://dineshstack.com/blog/why-we-built-dineshstack-ride-hailing-choosing-a-modular-laravel-node-microservice-architecture</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/why-we-built-dineshstack-ride-hailing-choosing-a-modular-laravel-node-microservice-architecture</guid>
      <pubDate>Fri, 01 May 2026 12:35:35 GMT</pubDate>
      <description>How we designed a ride-booking platform that handles transactional integrity, real-time communication, and geospatial dispatch — without drowning in complexity from day one.</description>
      <category>Laravel</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Integrating Better Stack Logging into a Dockerized Node.js Microservice Stack</title>
      <link>https://dineshstack.com/blog/integrating-better-stack-logging-into-a-dockerized-nodejs-microservice-stack</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/integrating-better-stack-logging-into-a-dockerized-nodejs-microservice-stack</guid>
      <pubDate>Fri, 01 May 2026 11:24:44 GMT</pubDate>
      <description>A real-world walkthrough of connecting Winston logs, Prometheus metrics, and three Node.js microservices to Better Stack — including every wall we hit and how we climbed over it.</description>
      <category>DevOps</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>PHP 8.4 Property Hooks: The Feature That Changes Everything</title>
      <link>https://dineshstack.com/blog/php-84-property-hooks-the-feature-that-changes-everything</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/php-84-property-hooks-the-feature-that-changes-everything</guid>
      <pubDate>Sun, 26 Apr 2026 21:37:13 GMT</pubDate>
      <description>PHP 8.4 ships property hooks — a language-level feature that lets you intercept property reads and writes without boilerplate. Here&apos;s why it matters and how to use it today.</description>
      <category>PHP</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Laravel 13: JSON:API Support, AI SDK &amp; PHP Attribute Syntax</title>
      <link>https://dineshstack.com/blog/laravel-13-jsonapi-support-ai-sdk-php-attribute-syntax</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/laravel-13-jsonapi-support-ai-sdk-php-attribute-syntax</guid>
      <pubDate>Thu, 23 Apr 2026 21:37:13 GMT</pubDate>
      <description>Laravel 13 landed on March 17, 2026 with zero breaking changes. Here&apos;s what&apos;s actually new: native JSON:API support, a stable AI SDK, and expanded PHP attribute support.</description>
      <category>Laravel</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Build a REST API with Laravel 13 and Sanctum in 30 Minutes</title>
      <link>https://dineshstack.com/blog/build-a-rest-api-with-laravel-13-and-sanctum-in-30-minutes</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/build-a-rest-api-with-laravel-13-and-sanctum-in-30-minutes</guid>
      <pubDate>Tue, 21 Apr 2026 21:37:13 GMT</pubDate>
      <description>From composer create-project to a fully authenticated REST API with token-based auth, resource transformers, and proper error handling.</description>
      <category>Laravel</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>TanStack Query v5: Why I Replaced SWR in All My Projects</title>
      <link>https://dineshstack.com/blog/tanstack-query-v5-why-i-replaced-swr-in-all-my-projects</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/tanstack-query-v5-why-i-replaced-swr-in-all-my-projects</guid>
      <pubDate>Sun, 19 Apr 2026 21:37:13 GMT</pubDate>
      <description>After using SWR for two years, I switched every project to TanStack Query v5. Here&apos;s the real-world differences that made the decision easy.</description>
      <category>React</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Tailwind CSS 4.2: Webpack Plugin, New Colors &amp; Logical Properties</title>
      <link>https://dineshstack.com/blog/tailwind-css-42-webpack-plugin-new-colors-logical-properties</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/tailwind-css-42-webpack-plugin-new-colors-logical-properties</guid>
      <pubDate>Thu, 16 Apr 2026 21:37:13 GMT</pubDate>
      <description>Tailwind 4.2 ships a Webpack plugin, four new palettes (mauve, olive, mist, taupe), logical property utilities, and 3.8× faster recompilation.</description>
      <category>Next.js</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Next.js 16 App Router: Server Components vs Client Components Explained</title>
      <link>https://dineshstack.com/blog/nextjs-16-app-router-server-components-vs-client-components-explained</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/nextjs-16-app-router-server-components-vs-client-components-explained</guid>
      <pubDate>Tue, 14 Apr 2026 21:37:13 GMT</pubDate>
      <description>The mental model most developers miss: when to use Server Components, when to reach for &quot;use client&quot;, and how to avoid the common pitfalls.</description>
      <category>Next.js</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>How I Built Orion360: Architecture, Tech Stack &amp; Lessons Learned</title>
      <link>https://dineshstack.com/blog/how-i-built-orion360-architecture-tech-stack-lessons-learned</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/how-i-built-orion360-architecture-tech-stack-lessons-learned</guid>
      <pubDate>Mon, 13 Apr 2026 21:37:13 GMT</pubDate>
      <description>A transparent look at how Orion360 was built — from the initial architecture decisions to the scaling challenges we hit at 1,000 subscribers.</description>
      <category>SaaS</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>MySQL Query Optimisation: The Techniques I Use Daily</title>
      <link>https://dineshstack.com/blog/mysql-query-optimisation-the-techniques-i-use-daily</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/mysql-query-optimisation-the-techniques-i-use-daily</guid>
      <pubDate>Fri, 10 Apr 2026 21:37:13 GMT</pubDate>
      <description>After years of debugging slow queries in production, these are the indexing strategies, query patterns, and EXPLAIN tricks I reach for every time.</description>
      <category>Database</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Laravel Queues Deep Dive: Jobs, Batches, Chains &amp; Failed Jobs</title>
      <link>https://dineshstack.com/blog/laravel-queues-deep-dive-jobs-batches-chains-failed-jobs</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/laravel-queues-deep-dive-jobs-batches-chains-failed-jobs</guid>
      <pubDate>Mon, 06 Apr 2026 21:37:13 GMT</pubDate>
      <description>Everything you need to know about Laravel queues: dispatching jobs, chaining, batching, handling failures, and monitoring with Horizon.</description>
      <category>Laravel</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>TypeScript Generics for Laravel Developers: A Practical Guide</title>
      <link>https://dineshstack.com/blog/typescript-generics-for-laravel-developers-a-practical-guide</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/typescript-generics-for-laravel-developers-a-practical-guide</guid>
      <pubDate>Tue, 31 Mar 2026 21:37:13 GMT</pubDate>
      <description>If PHP generics (via PHPDoc) make sense to you but TypeScript generics still feel foreign — this guide bridges the two.</description>
      <category>TypeScript</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Deploy Laravel to a VPS with Laravel Forge: Complete Walkthrough</title>
      <link>https://dineshstack.com/blog/deploy-laravel-to-a-vps-with-laravel-forge-complete-walkthrough</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/deploy-laravel-to-a-vps-with-laravel-forge-complete-walkthrough</guid>
      <pubDate>Tue, 24 Mar 2026 21:37:13 GMT</pubDate>
      <description>Step-by-step: provision a server, set up Nginx, configure SSL, connect your GitHub repo, and deploy with zero-downtime using Envoyer.</description>
      <category>DevOps</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
    <item>
      <title>Migrating a Legacy PHP App to Laravel 13: What We Found</title>
      <link>https://dineshstack.com/blog/migrating-a-legacy-php-app-to-laravel-13-what-we-found</link>
      <guid isPermaLink="true">https://dineshstack.com/blog/migrating-a-legacy-php-app-to-laravel-13-what-we-found</guid>
      <pubDate>Sat, 14 Mar 2026 21:37:13 GMT</pubDate>
      <description>We took a 7-year-old custom PHP application and migrated it to Laravel 13 over 6 weeks. Here&apos;s what broke, what surprised us, and the approach that worked.</description>
      <category>Laravel</category>
      <author>hello@dineshstack.com (Dinesh Wijethunga)</author>
    </item>
  </channel>
</rss>