Skip to content

Node.js development

Most Node conversations arrive as one of three: an API to build, a realtime feature holding many open connections, or an inherited service that has become hard to change. Node is genuinely good at the first two. Heavy computation belongs in a compiled runtime or Python, and we settle that before anything gets written.

01Capabilities

Four server jobs where Node earns the slot

Node.js is a runtime, not an architecture. This page is about whether your server should run on it. If the real question is the language or the type system rather than the runtime, JavaScript and TypeScript are the pages for that. Four shapes of work account for most of what we build here.

  • APIs

    Product APIs and back ends

    REST and GraphQL services sitting behind a product interface, usually next to a React front end as part of a web build. Many short requests that are mostly waiting on a database or a third party is the ordinary shape of product traffic, and it is the shape Node handles well on modest hardware.

  • Realtime

    Realtime and event-driven features

    Live dashboards, chat, presence, notifications, and price or status updates pushed over WebSockets, the kind a fintech trading screen or an operations console needs. Holding thousands of mostly idle connections open is what an event loop is genuinely good at, and it is the case where Node wins on merit rather than convenience.

  • Integration

    Integration and gateway layers

    The layer between your product and everything it talks to: payment providers, messengers, ERPs, and the carrier and marketplace APIs behind logistics platforms. This is platform integration work, where the engineering is idempotency, retries, rate limits and reconciliation rather than the happy path.

  • Extraction

    Services split out of a larger system

    Pulling a function that needs to scale, deploy or fail on its own out of a bigger application and running it as its own service. Node's small footprint per process makes that cheap, and the rest of your stack does not have to be JavaScript for it to work. We build them under an ISO 27001:2022 certified information-security management system.

03Fit

Where the server work should actually live

Node.js is a good default for work that is mostly waiting and a bad default for work that is mostly computing, and that single distinction settles most of these conversations before anyone's language preference enters the room. Every row below names the move we recommend, from Node.js itself to Go, Python or the stack your team already runs.

Six situations, and what we would tell you in each
Your situationWhat we recommend
A product API with many short requests, mostly waiting on a database, a queue or a third party Use Node.jsThis is the case the event loop was built for, and it holds concurrency well without much hardware.
Realtime work: live updates, chat, presence, many connections open but idle Use Node.jsIts strongest technical case, and the one we would defend on the engineering rather than on convenience.
Heavy computation in the request path: media processing, large exports, cryptography, big numeric work Move that partOne long calculation blocks everything queued behind it. Put it in a worker, or start from Go (Golang) or .NET.
A throughput-critical network service you want to ship as one deployable binary Different pageUsually Go (Golang). Predictable memory, real threads and a single static binary beat Node here, and the operational story is simpler.
The real product is a data pipeline or a machine-learning feature Different pageOur Python page. The libraries, the tooling and the people all live there, and a Node reimplementation buys you nothing.
A small internal tool, one owner, and nobody who wants to be on call for it Your existing stackBuild it on whatever your team already runs. A new service, a new pipeline and a new rota cost more than the tool is worth.

Scope

What we own on a Node engagement is the runtime decision and what follows from it. Where the heavy work goes. What the service does under load. Whether your own team can still change it after we stop. unicrew has been building server software since 2012, with 100+ senior in-house engineers across six countries. The work runs under an ISO 27001:2022 certified information-security management system. Where a smaller job solves the problem, that is the job we recommend.

04Delivery

The order we put a new service through

Four things we do early, because all four are expensive to retrofit into a service that is already live.

  1. Find out where the time actually goesBefore the architecture conversation, we measure what the service is doing while a request is open. If the answer is computing rather than waiting, the runtime is the wrong argument, and we settle that in week one rather than in month five.
  2. Pin down the dependency surfacenpm is the largest supply-chain and upgrade liability in a Node project. We prefer boring, widely used packages, keep a written inventory of the ones that actually matter, and put audit and update checks in the pipeline instead of meeting the problem at the next advisory.
  3. Types and contracts at the boundariesTypeScript across the service, with one definition of the API shape shared with the front end rather than copied into it. On an inherited JavaScript codebase we add types at the edges first, which buys refactoring safety without a big-bang conversion.
  4. Make it operable under loadStructured logging, tracing, health checks, and explicit limits on concurrency and payload size. A Node service under pressure degrades quietly instead of crashing loudly, so without instrumentation the first person to notice is a user. Test automation goes in alongside, through the same QA practice as our own projects.

07Questions

What buyers ask before choosing a runtime

Answered the way we would answer them live. If yours is not here, it is a good first message.

Yes, and on a live product it is often the sensible shape. Our engineers own the runtime decision too, because Node gets picked for the wrong reason more often than most technologies. An architect outside the delivery team reviews the design, and the work goes through the same QA practice as our own projects. Team extension is managed teams; handing over the outcome is custom software development.

It comes down to what the service spends its time doing and who will maintain it. If the work is mostly waiting and your people already write JavaScript, Node keeps one language across the stack and one definition of the API. If it is throughput-critical, or you want a single binary with predictable memory, Go (Golang) is the better call, and we build that service in Go. Mixing both is normal.

For work that is mostly waiting, yes, and that covers most product APIs. The failure mode is not throughput. It is one heavy calculation blocking every request queued behind it. So we look for that work explicitly, move it to a worker thread or a separate service, and set concurrency limits from the start. Scaling out is straightforward once the process holds no state of its own.

Yes, and deliberately rather than reluctantly. The first pass is a dependency audit, because an abandoned package is the most common live risk in an inherited Node project. Then tests around the paths that carry money or data, and TypeScript at the boundaries. Where the runtime and framework versions are themselves the blocker, that is a modernization conversation rather than a feature one.

A scoping call with an engineer rather than a salesperson. If the service already exists we ask for read access to the repository and whatever monitoring you have, because an hour in the code is worth several in discussion. What comes back is written: the runtime decision, what we would build or change first, and what stays untouched. Most engagements start within two to four weeks.

Three shapes, and which one fits depends on how settled the scope is. Time and materials is billed hourly and quoted per project, which suits work still moving. Fixed price is outcome based, and we only offer it once the first read is done, because a fixed number on a system nobody has opened is a guess with a contract around it. Team extension is billed monthly per engineer.

Deciding which runtime the server belongs on?

Tell us what the service has to do, what it talks to, and what your team already writes. You will get an engineer's read on it, with the runtime matched to the work. Handing over the whole outcome is custom software development.

Book a scoping call

Thank you

Thanks for your message. We will get in touch with you shortly.