Architecting the Core: Choosing the Right Tech Stack for a QMS
By Manny V | July 12, 2025 | #TechStack #QMSDevelopment
Building a robust Queue Management System (QMS) isn't just about understanding the problem; it's about choosing the right tools to craft the solution. The tech stack forms the very foundation of our application, influencing everything from performance and scalability to the speed of development and future maintainability. As I embark on creating a web app, with plans for a companion mobile app down the line, the initial decisions about which technologies to use have been a journey of exploration and, at times, frustration.
This post will walk you through my thought process, the frameworks I considered, the challenges I encountered, and ultimately, the stack I've settled on for this proof of concept (PoC) stage of our QMS development journey.
The Quest for "Write Once, Run Anywhere"
Given the ambition to build both a web app and a mobile app, the allure of cross-platform development was strong. The idea of writing code once and deploying it across multiple platforms is incredibly appealing, promising efficiency and reduced development time. My first deep dive was into the React Native ecosystem.
Exploring Expo (React Native)
For those unfamiliar, Expo is an open-source framework and platform for making universal native apps with React Native. It aims to simplify the development process by handling many of the complex native configurations, allowing developers to focus on writing JavaScript/TypeScript code. It's fantastic for getting a mobile app up and running quickly, and it even offers web support, making it a strong contender for "write once, run anywhere."
However, as I started exploring UI frameworks within the React Native ecosystem for a more polished and consistent look across platforms – tools like Nativewind (for Tailwind CSS in React Native), Tamagui, and Unistyles – the dream started to fall apart. While these libraries offer powerful styling and component solutions, the setup process often felt incredibly clunky. There were constant "gotchas" – unexpected configuration issues, build errors, or subtle inconsistencies that required significant debugging and learning. It quickly became clear that the time saved by "write once" was being eaten up by the complexities of getting these UI frameworks to play nicely. What's the point of using a tool if it just makes your life harder than coding natively?
A Look at Flutter
Next on the list was Flutter. Developed by Google, Flutter is a UI toolkit for building natively compiled applications for mobile, web, and desktop from a single codebase. I've actually used Flutter for a proof of concept before, specifically for mobile development, and found it to be a very pleasant experience with its expressive UI and hot reload capabilities.
However, my recent attempt to use Flutter for the web app portion of the QMS revealed that it's simply not mature enough yet for the web. While it can compile to web, several disadvantages became apparent:
- Large Bundle Size: Flutter web apps tend to have a larger initial download size compared to traditional web applications, leading to slower initial load times.
- SEO Challenges: Since Flutter renders everything on a canvas element, traditional search engine crawlers often struggle to index the content effectively, posing significant SEO hurdles for a blog-heavy site like QMS Chronicles.
- Accessibility Issues: The canvas-based rendering can also complicate accessibility for users relying on screen readers or other assistive technologies.
- Limited Web-Specific Features: Integration with browser-specific APIs and features, or even embedding standard HTML elements, can be cumbersome or limited compared to native web frameworks.
- Performance on Older Browsers: While generally performant, older browsers might struggle more with Flutter's rendering approach.
Ultimately, while Flutter is a powerful tool for mobile, its current state for web development didn't align with the goals of building a robust and accessible web-based QMS.
Back to Basics: My Chosen Stack for the QMS PoC
After these explorations, I made a pragmatic decision: to leverage what I'm most familiar and productive with. For this proof of concept, and to ensure rapid development of core QMS functionalities, I'm going with a tried-and-true JavaScript stack.
Backend: Node.js with Express.js
For the backend, I'm using Node.js with Express.js. Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. It allows us to run JavaScript code on the server side, enabling a full-stack JavaScript development experience. Its non-blocking, event-driven architecture makes it highly efficient for handling concurrent connections, which is crucial for a queue management system that needs to manage many users simultaneously. Express.js is a fast, unopinionated, minimalist web framework for Node.js. It provides a robust set of features for web and mobile applications, making it ideal for building our QMS API, handling requests, and managing server-side logic.
Frontend: React with Webpack
For the web app's frontend, I'll be integrating React using Webpack. React is a declarative, efficient, and flexible JavaScript library for building user interfaces. Its component-based architecture is perfect for creating modular and reusable UI elements, which will be essential for our queue display, online check-in, and agent dashboards. Webpack is a static module bundler for modern JavaScript applications. It takes all our React components, styles, and assets, and bundles them into optimized files for the browser. This setup provides excellent control over the build process and ensures our QMS web interface is performant.
Database: MongoDB
For the database, I've chosen MongoDB. It's a NoSQL database that stores data in flexible, JSON-like documents. This schema-less nature offers great flexibility, allowing us to evolve our data model easily as the QMS grows and adapts. Its scalability and ability to handle large volumes of data make it a strong candidate for storing customer data, queue entries, and queue analytics.
Real-time Communication: Socket.IO
A Queue Management System inherently requires real-time updates. Customers need to see the "Now Serving" number change instantly, and agents need immediate notifications. This calls for WebSockets. I considered a few options: ws, µWebSockets.js, and Socket.IO.
- ws is a simple, fast, and lightweight WebSocket client and server for Node.js. It's a great choice if you need raw WebSocket functionality with minimal overhead.
- µWebSockets.js is an even more performant and memory-efficient WebSocket library, written in C++ and exposed to Node.js. It's ideal for high-performance scenarios.
- Socket.IO is a library that enables real-time, bidirectional, event-based communication. While it builds on WebSockets, it adds a layer of abstraction that handles various complexities like fallback mechanisms (if WebSockets aren't available), automatic reconnection, and multiplexing.
Thinking about reliability, performance, ease of use, and the maturity of the library for production use, I ultimately opted for Socket.IO for now, especially at this proof of concept stage. Its robust feature set and widespread adoption mean less time spent debugging connection issues and more time focusing on core QMS logic. While ws or µWebSockets.js might offer marginal performance gains, Socket.IO's ease of use and built-in reliability features make it a more practical choice for getting a functional PoC off the ground quickly.
The Unsung Wisdom: Leverage What You Know
I'm genuinely happy with this setup for now because it's working, and crucially, it allows me to focus on the implementation of the actual product instead of getting bogged down debugging why a component isn't rendering correctly, or spending weeks learning how to code in a completely new paradigm. One profound lesson from this initial phase of QMS development is to leverage and use the tools that you already know well, and create the product, rather than procrastinating and just spending a lot of time learning a new shiny tool.
It's kind of like the journey of the Minecraft creator, Notch, who famously used Java for game development. Sure, Java might not be considered the "sharpest tool in the shed" for game development by some, but it got the job done, at least initially. And look what it built! The goal at this stage isn't theoretical perfection or bleeding-edge tech; it's tangible progress and a working QMS proof of concept.
Looking Ahead: Building the Core Logic
With our tech stack firmly in place, the next steps involve diving into the core logic of our queue management system. We'll start building out the API endpoints, designing the database schema for efficient customer flow and "Now Serving" updates, and laying the groundwork for real-time communication.
Stay tuned for more updates as we transform the concept of seamless service into a functional reality.