Skip to content
sayak.webdesignerWeb · Software · Data · AI
Build · Since 2014 · 150+ services

Node.js

API and worker layer for most of the systems we ship — one language across the stack.

EDGE / CDN — 300+ PoPs, WAF, DDoS shieldKolkataMumbaiSingaporeFrankfurtVirginiaSydneyPRIVATE VPC — 10.0.0.0/16Load BalancerTLS 1.3 · HTTP/3App Clusterautoscale 2→24Worker Poolqueues · cronObject StoreS3 / GCSPrimary DBMulti-AZRead ReplicareportingRediscache · sessionsSecretsKMS / VaultOBSERVABILITY & RUNBOOKSGrafanaPrometheusLoki logsPagerDutyUptime 99.98%
Our position

Node.js is our default server runtime for new systems, chiefly because one language across the stack means shared validation, shared domain types and a hiring pool that covers both ends. For the workloads most of our clients run — API serving, integration, orchestration, background jobs — its performance profile is more than adequate and its ecosystem is unmatched.

We use Express for small services where the framework should stay out of the way, and NestJS where an application is large enough that convention and dependency injection earn their overhead. The choice is made on expected size and team, not on preference.

Where Node is the wrong answer we say so. CPU-bound numerical work belongs in Python or a compiled language. Long-running stateful process control does not belong in a request-response runtime. We have moved specific workloads out of Node for exactly these reasons.

Where it fits

REST and GraphQL APIs for web and mobile clients
Integration layers in front of legacy ERPs and third-party systems
Background workers for queues, scheduled jobs and webhooks
Real-time features over WebSockets
Server-side rendering for Next.js applications
Why we choose it

What Node.js genuinely gives us

01

One language, one set of types

Validation schemas and domain models are written once and used by the API, the web front end and the mobile app.

02

Excellent I/O concurrency

API gateways, integrations and orchestration — workloads dominated by waiting on other systems — are exactly what the runtime is good at.

03

Ecosystem depth

A well-maintained library exists for nearly every integration an Indian business needs, from GST APIs to payment gateways to Tally.

04

Operationally simple

Containerises cleanly, starts fast, and scales horizontally without ceremony.

Dependency and supply-chain discipline in Node

The npm ecosystem is Node’s greatest advantage and its most persistent liability. A modest application routinely resolves to several hundred transitive packages, any of which may be abandoned, may change ownership, or may ship a compromised release. This is not theoretical — supply-chain incidents in this ecosystem are regular events, and most Node applications in production have no process for responding to one.

The controls are unexciting and effective. A committed lock file so builds are reproducible and a dependency cannot change under you between deployments. Automated vulnerability scanning wired into CI so a known issue fails the build rather than appearing in a quarterly report. A deliberate policy on adding dependencies, because a package that saves twenty lines is rarely worth the maintenance surface it adds. Periodic pruning of packages that are no longer used, which almost every long-lived codebase accumulates.

We also separate build-time from run-time dependencies properly, so the production image does not ship the entire toolchain, and pin the Node runtime version rather than tracking whatever the base image happens to provide. These measures cost almost nothing to establish at the start and are awkward to retrofit under incident pressure.

Where Node.js services succeed, and where they quietly fail

Node is exceptionally good at what most business systems actually do: accept a request, talk to a database and two or three other services, assemble a response, and do that concurrently for many users. It is a poor choice for sustained CPU-bound work, and a great deal of the Node trouble we are asked to diagnose comes from someone putting image processing, large report generation or heavy parsing on the same event loop that serves user requests. The symptom is a service that is fast until it is suddenly and inexplicably not, and the fix is to move that work to a queue and a separate worker.

The second recurring failure is operational rather than architectural. Node services are easy to start and easy to run badly: no structured logging, so an incident is investigated by reading raw console output; no health or readiness endpoints, so orchestration restarts things at the wrong moment; unhandled promise rejections crashing a process at three in the morning; and connection pools sized by guesswork. None of this is difficult to get right, but it is almost never done by teams shipping their first production service.

We build Node services the boring way: typed throughout, layered so business logic is testable without a running server, instrumented from the first commit, and deployed with the operational endpoints and dashboards that make an incident a ten-minute investigation instead of a two-hour one.

API design in Express, Fastify or NestJS with validation at the boundary and typed contracts.
Queue and worker architecture so slow work never shares an event loop with user requests.
Structured logging, tracing, health and readiness endpoints wired in from the start.
Connection pool, timeout and retry configuration sized from measurement rather than defaults.
Diagnosis of existing services: event loop lag, memory growth, and blocking-call hunts.

Queues for anything that can be slow

Any operation that depends on a third party — sending a message, calling a payment gateway, pushing to an ERP, generating a document — goes onto a queue rather than running inside the request. The user gets an immediate response, the work happens with retries and backoff, and a failure produces a dead-lettered job with its payload rather than a lost transaction.

This one pattern accounts for a large share of the difference between a system that degrades gracefully under load and one that times out and loses data.

BullMQ on Redis for job queues with retry, backoff and dead-letter handling.
Idempotency keys on every externally triggered operation.
Scheduled jobs as queue producers rather than in-process timers.
Worker processes scaled independently of the API tier.

Observability from the first deployment

Structured JSON logging with a request identifier that flows through every downstream call, traces on route handlers and database queries, and error reporting with enough context to reproduce. Health and readiness endpoints that reflect actual dependency state rather than returning 200 unconditionally.

Without these, diagnosing a production issue in a distributed Node system is guesswork. With them it is usually a five-minute query.

Honest warnings

How Node.js projects usually go wrong

These are the failure modes we look for first when we are called in to rescue somebody else's implementation.

Blocking the event loopSynchronous file reads, large JSON parsing or heavy computation in a request handler stalls every concurrent request. Profile, then offload.
Unbounded concurrency on outbound callsFiring a thousand parallel requests at a supplier API gets you rate-limited or blocked. Bound it explicitly.
Connection pools left at defaultsThe most common cause of database exhaustion under load in Node services we inherit.
Secrets in environment files committed to GitStill the most frequent security finding in handovers we take over.
Straight answers

Node.js questions we get asked

Including where we would recommend something other than Node.js. Call +91 70033 91355 and you will get the same answer from an engineer.

Depends far more on your team than on the technology. If you have PHP developers maintaining a Laravel or CodeIgniter estate, adding a Node service creates a second discipline to hire for and support — we will usually build in PHP and make it excellent. If you are starting fresh or already have JavaScript skills, Node gives you one language across the stack. Both are entirely capable of running serious business systems.

For I/O-bound workloads, comfortably — we run services handling thousands of requests per second on modest infrastructure. Where it is the wrong tool is sustained CPU-bound computation: heavy numerical processing, image transformation at volume, or large data transformations. Those we move to Python, a worker pool, or the data platform, and we identify them during architecture rather than after a load test fails.

Next step

Tell us what is slowing your business down.

A 30-minute call with a senior engineer — not a salesperson. You leave with an architecture sketch and an honest cost range, whether or not you hire us.

Direct line

+91 70033 91355

Mon–Sat · 9:30 AM – 7:30 PM IST · Sealdah, Kolkata

Reply within one working hour NDA signed before any brief Fixed-price option on every scope
Verify us independently

Don’t take our word for it — ask an AI

Every page on this site is written to be read and quoted by AI answer engines, and we publish llms.txt and llms-full.txt so they can read us properly. One click opens the assistant with the question already typed.

The question we will ask for you

What is Sayak Web Designer (sayakwebdesigner.in), an IT company in Kolkata, India's experience with Nodejs, and when do they recommend using it?

Opens in a new tab. We do not see your conversation.

Call now WhatsApp Get quote