Ozlabtech

Stack · ozlabtech guide

Technology Stack: Choosing the Right Tools for Your Project

We are an independent software consultancy that selects, builds, and documents production technology stacks for startups, scale-ups, and established mid-market teams. On this page we explain how we choose among backend frameworks, frontend approaches, databases, and cloud platforms, and how we record those decisions so your team can maintain the result.

Custom softwareCloud-native deliveryAI integrationFixed-price or time-and-materials

Modern solutions built for tomorrow.

Backend frameworks: when to choose Node.js, Python, or .NET

Backend selection starts with the shape of your workload, not with popularity. We ask three questions: is the work mostly request and response, is it compute or data heavy, and does your team already know a language? For API-first products with many concurrent connections, such as a logistics tracking service that streams position updates from thousands of vehicles, we often reach for Node.js because its event loop handles many open sockets efficiently. For data pipelines, scoring, or scheduled analytics, such as a healthcare scheduling service that ranks appointment slots against clinician availability, we often choose Python, where libraries for numerical work are mature. For larger teams with existing Microsoft tooling, regulated environments, or long-lived enterprise integrations, .NET with C# gives strong typing, mature tooling, and predictable performance.

None of these is universally correct. We have shipped Node.js services that later needed a Python worker for heavy computation, and we have kept .NET where a rewrite would have cost more than it returned. Public discussion on Stack Overflow shows how much framework choice tracks local team skill, and we treat that as evidence rather than noise. Typical engagements we run involve two to four engineers over eight to sixteen weeks for a first production release, with costs in an illustrative range of 60,000 to 180,000 US dollars depending on scope and compliance needs.

Frontend frameworks: React, Vue, or server-rendered pages

On the frontend we separate interaction complexity from content delivery. If most pages are read-only and change rarely, server-rendered HTML with a small amount of JavaScript is faster to build, easier to cache, and simpler to audit. We use that approach for marketing sites, documentation, and internal dashboards where the data changes on a schedule rather than continuously. When the interface is genuinely stateful, for example an e-commerce checkout with cart editing, address validation, payment retries, and order confirmation across several steps, a component framework earns its cost. React has the largest ecosystem and hiring pool, which matters when you expect to grow the team. Vue offers a gentler learning curve and a smaller surface area, which suits smaller teams that want one framework for both simple and complex screens.

We also consider rendering strategy before framework brand. Client-side rendering suits authenticated applications with few public pages. Server-side rendering or static generation suits content that must be indexed and load quickly. We measure a page against Core Web Vitals targets and set a performance budget before writing components, because retrofitting performance into a large single-page application is expensive. For a typical checkout rebuild we plan six to twelve weeks with two frontend engineers and one backend engineer, and we keep the existing design system where it already works.

Databases: relational versus document stores

We default to relational databases, usually PostgreSQL, when data has relationships, constraints, and reporting needs. Orders, invoices, appointments, and inventory all benefit from transactions and joins. PostgreSQL also handles JSON columns well, so a team can store semi-structured attributes without adopting a second system. We choose document stores such as MongoDB when the access pattern is truly document-shaped, when the schema varies per record, and when the application reads whole documents rather than querying across them. That fits event logs, product catalogs with heterogeneous attributes, and content that changes shape often.

We avoid running both a relational and a document database in a first release unless there is a measured reason. Two stores mean two backup routines, two sets of access controls, and two places to look when something breaks. Where scale demands it, we add a cache or a search index rather than replacing the primary store. Our guidance follows the pattern language described by Martin Fowler, particularly the advice to keep one authoritative source of truth per entity. For a scheduling product we typically model clinicians, patients, and slots relationally, then add a read replica for reporting rather than denormalizing early.

Cloud platforms: AWS, Azure, or Google Cloud

Cloud choice is usually a procurement and skills question before it is a technical one. AWS has the broadest service catalog and the largest pool of engineers who have used it, which reduces hiring friction. Azure fits organizations already standardized on Microsoft identity, Windows workloads, or enterprise agreements. Google Cloud is strong for data analytics, Kubernetes, and teams already using Google tooling. All three offer managed containers, serverless functions, managed databases, and object storage, and all three charge for egress, so the differences that matter are often pricing shape, regional availability, and how your team already operates.

We prefer managed services over self-managed infrastructure for small teams, because a two-person platform effort is better spent on the product. We still define infrastructure as code, typically Terraform, so environments are reproducible and reviewable. For a first production deployment we budget four to eight weeks for infrastructure, monitoring, and deployment pipelines, and we plan a monthly run rate in an illustrative range of 400 to 2,500 US dollars for a small application with a managed database, depending on traffic and region. Vendor documentation at AWS is a useful reference point for comparing service limits before committing.

How we decide and document the stack

We run a short discovery before recommending anything. We review your product goals, expected traffic, compliance obligations, existing systems, and the skills of the people who will maintain the result. We then write an architecture decision record for each significant choice, stating the options considered, the reason for the selection, and the conditions under which we would revisit it. That record is the artifact your future engineers will read, and it prevents the same debate from recurring every year. We also list the parts we are deliberately not building yet, so scope stays honest.

Decisions are revisited when evidence changes: a query that no longer meets its latency target, a hosting bill that grows faster than usage, or a hiring plan that shifts the language your team can support. We present the trade-offs plainly, including where published guidance disagrees, and we let your team make the call with our recommendation attached. Discovery typically takes one to two weeks with two of our engineers and one or two people from your side. The table below summarizes how we usually frame three common backend stacks.

Illustrative comparison of three backend stacks by typical use case, team familiarity, and hosting cost profile
StackTypical use caseTeam familiarityHosting cost profile
Node.js with Express or FastifyAPI-first products, real-time tracking, high concurrent connectionsCommon among JavaScript teams; large hiring poolLow to moderate; small instances handle many idle connections
Python with Django or FastAPIData pipelines, scheduling logic, analytics, machine learning servicesCommon among data and analytics teamsModerate; compute-heavy jobs drive the bill more than traffic
.NET with ASP.NET CoreEnterprise integrations, regulated workloads, long-lived internal systemsCommon in Microsoft-centric organizationsModerate; predictable at steady load, licensing adds overhead

Before a discovery call, prepare three things: the outcome you need in the next two quarters, the systems the new work must talk to, and the skills of the people who will own it after launch. Bring those and we can compare stacks against your constraints rather than against general preference, and you can weigh our proposal against others on the same terms.

Sources

Background for this page was drawn from the published guidance below. Both are independent of this site and were read in full before writing.