<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Surendra Kumar</title>
    <description>The latest articles on DEV Community by Surendra Kumar (@surendra_kumar_f2f7e31559).</description>
    <link>https://dev.to/surendra_kumar_f2f7e31559</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3851581%2F7a418d1b-66b4-4ec1-a12a-4d17d8033b92.jpg</url>
      <title>DEV Community: Surendra Kumar</title>
      <link>https://dev.to/surendra_kumar_f2f7e31559</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/surendra_kumar_f2f7e31559"/>
    <language>en</language>
    <item>
      <title>Building a Zomato-Like Multi-City Food Delivery App with Flutter &amp; Firebase</title>
      <dc:creator>Surendra Kumar</dc:creator>
      <pubDate>Tue, 28 Apr 2026 05:37:47 +0000</pubDate>
      <link>https://dev.to/surendra_kumar_f2f7e31559/building-a-zomato-like-multi-city-food-delivery-app-with-flutter-firebase-52bd</link>
      <guid>https://dev.to/surendra_kumar_f2f7e31559/building-a-zomato-like-multi-city-food-delivery-app-with-flutter-firebase-52bd</guid>
      <description>&lt;p&gt;Hey everyone, Surendra Kumar here —Flutter/Firebase developer from Banda, India. I've been building production apps under Gfood Delivery Private Limited, and today I want to share the architecture behind my most ambitious project yet: Zesto, a multi-city food delivery platform built entirely with Flutter and Firebase.&lt;br&gt;
Zesto isn't a tutorial project. It's a real, working platform — 4 Flutter apps, a complete Firebase backend, and architecture decisions modeled after how production platforms like Zomato actually work.&lt;br&gt;
Want to try it before reading? Download the customer app APK and test it yourself:&lt;br&gt;
Download Zesto Customer App &lt;a href="https://github.com/ssurekumar01111-hue/zesto-demo/releases/download/v1.0-beta/app-release.apk" rel="noopener noreferrer"&gt;https://github.com/ssurekumar01111-hue/zesto-demo/releases/download/v1.0-beta/app-release.apk&lt;/a&gt;&lt;br&gt;
I'd love your feedback and improvement ideas after reading.&lt;/p&gt;

&lt;p&gt;The 4-App Ecosystem&lt;br&gt;
Zesto consists of four interconnected Flutter applications:&lt;/p&gt;

&lt;p&gt;Customer App — Multi-city restaurant discovery, cart, Razorpay + wallet payments, live GPS tracking, reviews&lt;br&gt;
Restaurant Partner App — Order management, menu CRUD, earnings dashboard, FCM order alerts&lt;br&gt;
Driver App — Order accept/reject, live delivery tracking, earnings, payout requests&lt;br&gt;
Flutter Web Admin Panel — 14 screens covering cities, zones, restaurants, drivers, orders, analytics, reviews, ads, config, and audit logs&lt;/p&gt;

&lt;p&gt;The Core Architecture Decision: City + Zone Scoping&lt;br&gt;
This is the most important architectural decision in Zesto — and the one that separates it from basic food delivery tutorials.&lt;br&gt;
Every single Firestore document has two fields:&lt;br&gt;
dart{&lt;br&gt;
"city_id": "banda_up",&lt;br&gt;
"zone_id": "banda_zone_1",&lt;br&gt;
// ... rest of document&lt;br&gt;
}&lt;br&gt;
Every query filters by city_id first:&lt;br&gt;
dartFirebaseFirestore.instance&lt;br&gt;
.collection('restaurants')&lt;br&gt;
.where('city_id', isEqualTo: currentCityId)&lt;br&gt;
.where('is_active', isEqualTo: true)&lt;br&gt;
.snapshots();&lt;br&gt;
Why does this matter? Without city scoping, as you add cities your queries return restaurants from everywhere. Firestore has no built-in geographic filtering — you have to design it in from day one. Retrofitting this later would require rewriting every query and migrating every document.&lt;br&gt;
Zones sit inside cities and control driver assignment. When an order is placed, the Cloud Function assigns it to available drivers in the same zone first, then expands to the full city if no zone drivers are available.&lt;/p&gt;

&lt;p&gt;Firebase Custom Claims for RBAC&lt;br&gt;
Zesto has 5 user roles: customer, restaurant_owner, driver, admin, super_admin. Managing this with Firestore documents alone creates security holes — a user could theoretically write to their own document and escalate their role.&lt;br&gt;
The solution is Firebase custom claims set via Cloud Functions:&lt;br&gt;
javascript// functions/src/admin/setUserRole.js&lt;br&gt;
exports.setUserRole = functions.https.onCall(async (data, context) =&amp;gt; {&lt;br&gt;
if (!context.auth.token.super_admin) {&lt;/p&gt;

&lt;p&gt;throw new functions.https.HttpsError('permission-denied', 'Not authorized');&lt;br&gt;
}&lt;br&gt;
await admin.auth().setCustomUserClaims(data.uid, {&lt;/p&gt;

&lt;p&gt;role: data.role,&lt;br&gt;
city_id: data.cityId,&lt;br&gt;
});&lt;br&gt;
});&lt;br&gt;
On the Flutter side, the role is read from the ID token directly:&lt;br&gt;
dartfinal token = await FirebaseAuth.instance.currentUser?.getIdTokenResult();&lt;br&gt;
final role = token?.claims?['role'] as String?;&lt;br&gt;
This means even if someone modifies their Firestore document, the custom claim on the token is what gates access. Firestore rules enforce this:&lt;br&gt;
javascript// firestore.rules&lt;br&gt;
match /orders/{orderId} {&lt;br&gt;
allow read: if request.auth.token.role == 'admin'&lt;/p&gt;

&lt;p&gt;|| request.auth.token.role == 'restaurant_owner'&lt;br&gt;
|| request.auth.uid == resource.data.customer_id;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;MobX for State Management&lt;br&gt;
Zesto uses MobX across all 4 apps. Here's why I chose it over Riverpod or GetX for this project:&lt;br&gt;
MobX's reactive observables map perfectly to Firestore streams. When a Firestore stream emits a new value, MobX automatically rebuilds only the widgets that consume that observable — no manual setState, no context.watch boilerplate.&lt;br&gt;
dart// core/stores/order_store.dart&lt;br&gt;
class OrderStore = OrderStore with $OrderStore;&lt;/p&gt;

&lt;p&gt;abstract class _OrderStore with Store {&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/observable"&gt;@observable&lt;/a&gt;&lt;br&gt;
ObservableList activeOrders = ObservableList();&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/observable"&gt;@observable&lt;/a&gt;&lt;br&gt;
OrderStatus currentStatus = OrderStatus.placed;&lt;/p&gt;

&lt;p&gt;@action&lt;br&gt;
void updateOrderStatus(String orderId, OrderStatus status) {&lt;/p&gt;

&lt;p&gt;final idx = activeOrders.indexWhere((o) =&amp;gt; o.id == orderId);&lt;br&gt;
if (idx != -1) {&lt;br&gt;
  activeOrders[idx] = activeOrders[idx].copyWith(status: status);&lt;br&gt;
}&lt;br&gt;
currentStatus = status;&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
The store subscribes to a Firestore stream once and updates observables. Every widget that reads activeOrders rebuilds automatically. Clean, testable, no rebuild storms.&lt;/p&gt;

&lt;p&gt;Dual Payment Path: Razorpay + In-App Wallet&lt;br&gt;
Zesto supports two payment methods and they interact with each other in interesting ways.&lt;br&gt;
Razorpay handles card/UPI payments. The flow is standard — create an order via Cloud Functions, open Razorpay checkout, handle the webhook callback.&lt;br&gt;
The wallet is more interesting. Each customer has a wallet_balance field on their user document. When they pay via wallet:&lt;br&gt;
javascript// functions/src/payments/walletPayment.js&lt;br&gt;
exports.processWalletPayment = functions.https.onCall(async (data, context) =&amp;gt; {&lt;br&gt;
const uid = context.auth.uid;&lt;/p&gt;

&lt;p&gt;return admin.firestore().runTransaction(async (transaction) =&amp;gt; {&lt;/p&gt;

&lt;p&gt;const userRef = admin.firestore().collection('users').doc(uid);&lt;br&gt;
const userDoc = await transaction.get(userRef);&lt;/p&gt;

&lt;p&gt;const currentBalance = userDoc.data().wallet_balance;&lt;br&gt;
if (currentBalance &amp;lt; data.amount) {&lt;br&gt;
  throw new functions.https.HttpsError('failed-precondition', 'Insufficient balance');&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;transaction.update(userRef, {&lt;br&gt;
  wallet_balance: admin.firestore.FieldValue.increment(-data.amount)&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;transaction.set(admin.firestore().collection('wallet_txns').doc(), {&lt;br&gt;
  uid,&lt;br&gt;
  amount: -data.amount,&lt;br&gt;
  type: 'debit',&lt;br&gt;
  order_id: data.orderId,&lt;br&gt;
  created_at: admin.firestore.FieldValue.serverTimestamp(),&lt;br&gt;
});&lt;br&gt;
});&lt;br&gt;
});&lt;br&gt;
The Firestore transaction ensures the balance check and deduction happen atomically — no race condition where two simultaneous orders drain the wallet below zero.&lt;/p&gt;

&lt;p&gt;Cloud Functions: Domain-Split Architecture&lt;br&gt;
Instead of one massive index.js, Zesto's Cloud Functions are split by domain:&lt;br&gt;
functions/src/&lt;br&gt;
├── orders/&lt;br&gt;
│ ├── placeOrder.js # Create order, notify restaurant&lt;br&gt;
│ ├── assignDriver.js # Zone-based driver assignment&lt;br&gt;
│ └── onOrderDelivered.js # Earnings calculation, wallet credit&lt;br&gt;
├── payments/&lt;br&gt;
│ ├── razorpayWebhook.js # Payment confirmation&lt;br&gt;
│ └── walletPayment.js # Wallet debit/credit&lt;br&gt;
└── admin/&lt;/p&gt;

&lt;p&gt;├── approveRestaurant.js&lt;br&gt;
└── setUserRole.js&lt;br&gt;
Each function is independently deployable. When I fix a bug in assignDriver.js, I deploy only that function — not the entire backend.&lt;/p&gt;

&lt;p&gt;The Driver Assignment Problem&lt;br&gt;
When an order is placed, the platform needs to assign a driver. Here's the simplified logic:&lt;br&gt;
javascriptexports.assignDriver = functions.firestore&lt;br&gt;
.document('orders/{orderId}')&lt;br&gt;
.onCreate(async (snap, context) =&amp;gt; {&lt;/p&gt;

&lt;p&gt;const order = snap.data();&lt;/p&gt;

&lt;p&gt;// 1. Find online drivers in the same zone&lt;br&gt;
const driversSnap = await admin.firestore()&lt;br&gt;
  .collection('drivers')&lt;br&gt;
  .where('city_id', isEqualTo: order.city_id)&lt;br&gt;
  .where('zone_id', isEqualTo: order.zone_id)&lt;br&gt;
  .where('is_online', isEqualTo: true)&lt;br&gt;
  .where('current_order_id', isEqualTo: null)&lt;br&gt;
  .limit(5)&lt;br&gt;
  .get();&lt;/p&gt;

&lt;p&gt;if (driversSnap.empty) {&lt;br&gt;
  // Expand to full city&lt;br&gt;
  // ... same query without zone_id filter&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// 2. Send FCM notification to available drivers&lt;br&gt;
// First driver to accept wins (handled by transaction in Driver app)&lt;br&gt;
const tokens = driversSnap.docs.map(d =&amp;gt; d.data().fcm_token);&lt;br&gt;
await admin.messaging().sendMulticast({&lt;br&gt;
  tokens,&lt;br&gt;
  data: { type: 'NEW_ORDER', order_id: context.params.orderId }&lt;br&gt;
});&lt;br&gt;
});&lt;br&gt;
On the driver side, accepting an order uses a Firestore transaction with three guards to prevent race conditions — only one driver can claim the order even if multiple tap Accept simultaneously.&lt;/p&gt;

&lt;p&gt;What's Coming&lt;br&gt;
Zesto is launching soon on Gumroad and Codester as commercial source code — complete, ready-to-customize. It includes all 4 Flutter apps, the complete Cloud Functions backend, Firestore security rules, and developer documentation.&lt;br&gt;
Try the customer app right now:&lt;br&gt;
&lt;a href="https://github.com/ssurekumar01111-hue/zesto-demo/releases/download/v1.0-beta/app-release.apk" rel="noopener noreferrer"&gt;https://github.com/ssurekumar01111-hue/zesto-demo/releases/download/v1.0-beta/app-release.apk&lt;/a&gt;&lt;br&gt;
I'd genuinely love your feedback — what works well, what feels off, what you'd build differently. Drop a comment or reach me at Emails are not allowed.&lt;/p&gt;

&lt;p&gt;Surendra Kumar — Flutter/Firebase developer, Banda, India&lt;br&gt;
Portfolio: portfolio.gfood.in | GitHub: ssurekumar01111-hue&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>firebase</category>
      <category>dart</category>
      <category>mobile</category>
    </item>
    <item>
      <title>How I Built a Complete On-Demand Home Services App (ServeNow) with Flutter &amp; Firebase</title>
      <dc:creator>Surendra Kumar</dc:creator>
      <pubDate>Fri, 24 Apr 2026 07:20:03 +0000</pubDate>
      <link>https://dev.to/surendra_kumar_f2f7e31559/how-i-built-a-complete-on-demand-home-services-app-servenow-with-flutter-firebase-dj</link>
      <guid>https://dev.to/surendra_kumar_f2f7e31559/how-i-built-a-complete-on-demand-home-services-app-servenow-with-flutter-firebase-dj</guid>
      <description>&lt;p&gt;Hey everyone, Surendra Kumar here, a self-taught Flutter developer from Banda, India. I've spent a good chunk of my time building and shipping production apps, like those I worked on for Gfood Delivery Private Limited. Today, I want to share the story behind one of my most ambitious projects: ServeNow.&lt;/p&gt;

&lt;p&gt;As an indie developer, I've always been driven to build &lt;em&gt;real&lt;/em&gt; solutions—apps that don't just look pretty in a tutorial but actually work robustly in the wild. That's exactly the philosophy I brought to ServeNow.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is ServeNow? Crafting a Full-Fledged Marketplace
&lt;/h3&gt;

&lt;p&gt;ServeNow isn't just another demo app. It's a complete, production-ready on-demand home services marketplace built from the ground up with Flutter and Firebase. My goal was to create a comprehensive system that could handle everything from booking a beautician to fixing a leaky faucet, all while providing a smooth experience for customers, service providers, and administrators.&lt;/p&gt;

&lt;p&gt;To achieve this, I engineered ServeNow as a suite of four interconnected applications, each designed for a specific user role:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Customer App&lt;/strong&gt;: This is where users come to life. They can browse various services (beauty, cleaning, plumbing, electrical, etc.), book appointments, track their service provider in real-time, chat with them, make secure payments via Razorpay, and leave reviews.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Provider App&lt;/strong&gt;: For the businesses offering services. They can accept new bookings, manage their schedule and service offerings, track their real-time earnings, and request payouts.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Handyman App&lt;/strong&gt;: This is for the actual service professionals. It's a multi-service pro app featuring a broadcast job matching system, allowing handymen to pick up nearby jobs. It also includes an onboarding and approval flow for new pros.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Flutter Web Admin Panel&lt;/strong&gt;: The control center. This robust web panel gives administrators full control over users, bookings, categories, service providers, payout requests, and provides crucial analytics to keep the marketplace running efficiently.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why Flutter &amp;amp; Firebase? My Tech Stack Decisions
&lt;/h3&gt;

&lt;p&gt;When embarking on ServeNow, the choice of technology was critical. I needed a stack that offered rapid development, scalability, real-time capabilities, and robust performance without requiring a massive infrastructure investment.&lt;/p&gt;

&lt;h4&gt;
  
  
  Flutter (Dart) for the Frontend
&lt;/h4&gt;

&lt;p&gt;Flutter was a no-brainer for the mobile applications and the web admin panel.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Single Codebase&lt;/strong&gt;: Building four distinct applications (Customer, Provider, Handyman, and Admin Panel) from a single Flutter codebase drastically cut down development time and ensured UI/UX consistency across platforms.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance&lt;/strong&gt;: Flutter's native compilation and widget-based architecture deliver smooth, high-performance applications that feel truly native.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Developer Experience&lt;/strong&gt;: Hot Reload and a rich widget catalog accelerated my development cycles, allowing for quick iterations and bug fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Firebase for the Backend (My Go-To for Indie Development)
&lt;/h4&gt;

&lt;p&gt;Firebase has been my backend of choice for many projects, and ServeNow was no exception. It offered the complete suite of tools I needed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Firestore&lt;/strong&gt;: This is the heart of ServeNow's data. I chose Firestore for its real-time capabilities, strong querying, and scalability.

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Architecture Decision&lt;/strong&gt;: I structured collections like &lt;code&gt;users&lt;/code&gt;, &lt;code&gt;services&lt;/code&gt;, &lt;code&gt;providers&lt;/code&gt;, &lt;code&gt;handymen&lt;/code&gt;, &lt;code&gt;bookings&lt;/code&gt;, and &lt;code&gt;chats&lt;/code&gt;. For bookings, I leaned into &lt;strong&gt;denormalization&lt;/strong&gt; by embedding critical but static details (like customer name, service price) directly within the &lt;code&gt;bookings&lt;/code&gt; document. This minimizes expensive cross-collection reads for common operations and ensures faster data retrieval, especially for lists of bookings. Subcollections were used for highly related, nested data, like &lt;code&gt;messages&lt;/code&gt; within a &lt;code&gt;chat&lt;/code&gt; document.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Firebase Authentication&lt;/strong&gt;: For secure and easy user management across all apps, supporting email/password and potentially Google Sign-In for future expansion.&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Cloud Functions (JavaScript)&lt;/strong&gt;: This was indispensable for server-side logic without managing actual servers.

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Architecture Decision&lt;/strong&gt;: Cloud Functions handle critical backend tasks:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Razorpay Webhooks&lt;/strong&gt;: Securely processing payment callbacks and updating booking statuses post-payment.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;FCM Triggers&lt;/strong&gt;: Sending real-time push notifications for booking updates, new job broadcasts (to handymen), and chat messages.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Data Aggregation&lt;/strong&gt;: Calculating real-time earnings for providers and handymen, and managing payout requests.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Background Tasks&lt;/strong&gt;: Handling approval flows for new handymen and providers.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Firebase Storage&lt;/strong&gt;: For storing user profile pictures, service images, and any other media files securely.&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Firebase Cloud Messaging (FCM)&lt;/strong&gt;: Essential for real-time communication between the apps – from notifying handymen about new jobs in their area to letting customers know their service provider is on the way.&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  Other Key Technologies:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Razorpay&lt;/strong&gt;: Integrated as the primary payment gateway, crucial for handling transactions securely within the Indian market. Cloud Functions were vital here for handling payment success/failure callbacks.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;rxdart&lt;/strong&gt;: I leveraged rxdart for reactive programming, especially for managing complex streams of data and state within the apps, ensuring a smooth and responsive user experience.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Google Maps&lt;/strong&gt;: Integrated for live tracking of handymen, defining service areas, and visualizing job locations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architectural Decisions &amp;amp; Overcoming Challenges
&lt;/h3&gt;

&lt;p&gt;Building ServeNow meant tackling typical marketplace complexities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Real-time Synchronization&lt;/strong&gt;: A core requirement. Firestore's real-time listeners were used extensively. For example, when a handyman accepts a job, the customer's app updates instantly, and the provider's app reflects the booking status change. This required careful management of data updates and notification triggers via Cloud Functions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Scalability&lt;/strong&gt;: Thinking beyond just a few users. Firestore's inherent scalability and Cloud Functions' serverless architecture meant the platform could grow without significant re-engineering of the backend.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Job Broadcasting &amp;amp; Matching&lt;/strong&gt;: This was an interesting challenge for the Handyman app. When a new service request comes in, I use Firestore queries based on service type and location, combined with FCM, to broadcast the job to eligible handymen. The first to accept gets the job, with race conditions handled by Firestore transactions in Cloud Functions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Secure Payouts&lt;/strong&gt;: The provider and handyman apps needed a robust payout request system. This involves tracking earnings in Firestore, initiating payout requests, and then an admin manually (or via a future integration) processing these, all managed through the Admin Panel and Cloud Functions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Developer Documentation&lt;/strong&gt;: Knowing that this was a complex system, I invested significant time in creating a comprehensive 16-page developer documentation (v2.0). It covers everything from project setup to API details, making it easy for anyone to get started.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Indie Developer Ethos: Production-Grade from Day One
&lt;/h3&gt;

&lt;p&gt;What makes ServeNow different is that it's built with a "production-grade" mindset. This isn't a collection of loosely connected tutorials; it's a fully integrated, tested system designed to be deployed and used in a real business environment. Every feature, every line of code, was written with stability, scalability, and maintainability in mind. It comes complete with signed APKs and a thorough setup guide, so you can literally launch it.&lt;/p&gt;

&lt;p&gt;Building ServeNow was a journey of applying everything I've learned about Flutter, Firebase, and shipping real products. It's proof that with dedication and the right tools, indie developers can build incredibly powerful, complete solutions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ready to Launch Your Own Home Services Marketplace?
&lt;/h3&gt;

&lt;p&gt;If you're looking for a robust, ready-to-launch foundation for an on-demand home services marketplace, ServeNow is designed to be exactly that. It handles the complexities, so you can focus on your business.&lt;/p&gt;

&lt;p&gt;You can learn more about my work and projects like ServeNow by checking out my GitHub profile or reaching out via email.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;My GitHub Profile&lt;/strong&gt;: &lt;a href="https://github.com/ssurekumar01111-hue" rel="noopener noreferrer"&gt;ssurekumar01111-hue&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Email&lt;/strong&gt;: &lt;a href="mailto:ssure.kumar01111@gmail.com"&gt;ssure.kumar01111@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://morningstar47jb.gumroad.com/l/viqos" rel="noopener noreferrer"&gt;https://morningstar47jb.gumroad.com/l/viqos&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading! I hope this deep dive into ServeNow gives you some insights into building complex applications as an indie developer.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>firebase</category>
      <category>dart</category>
      <category>mobiledev</category>
    </item>
  </channel>
</rss>
