Home/Technologies/TypeScript
Technology · Languages & frameworks

One language from browser to backend, typed end to end.

TypeScript and Node.js engineers who build typed services — API layers, event consumers and back-ends-for-front-end on the stack behind Odeontech’s own products.

TypeScriptWhat we build with it
01Typed REST and GraphQL APIs
02Back-ends-for-front-end
03Event consumers and workers
04Integration layers
05Shared monorepos
06Internal tooling and CLIs
Usually runs with
  1. TypeScript
  2. Node.js
  3. NestJS
  4. Fastify
  5. zod
  6. Prisma
Why we use it

TypeScript is the default language at Odeontech.

It runs the API layers and web front-ends of the platforms we operate ourselves, and it is the first thing we reach for when a client’s product needs a service, a worker or a UI that has to stay honest for years. The reason is not fashion. One language across the whole surface means one set of types, one test runner, one review culture — and a shared contract between the engineer who writes the endpoint and the one who calls it.

Node.js earns its place for I/O-bound work: HTTP APIs, gateways, event consumers, webhooks, real-time channels. Its event loop is built for many concurrent connections, and the ecosystem covers almost every integration an enterprise estate throws at you.

We are equally clear about where it stops. CPU-heavy batch work, long-running numeric jobs and strict-latency trading paths go to Java, Go or Python — and we say so in the architecture review rather than forcing a runtime to do what it was not built for.

What we build with it

Six things we ship in TypeScript.

The same patterns on our own products and on client work.

01

Typed REST and GraphQL APIs

NestJS or Fastify services with schemas declared once — in zod or OpenAPI — and enforced at the boundary, in the tests and in the generated client. The contract is the code, not a wiki page.

02

Back-ends-for-front-end

A thin BFF in front of legacy and third-party systems, shaping payloads for web and mobile, owning auth and caching, and hiding the estate’s rough edges from the product team.

03

Event consumers and workers

Kafka and RabbitMQ consumers with idempotent handlers, dead-letter queues and back-pressure. The parts that are easy to get wrong on the first attempt — retries, partial writes, ordering — reviewed before the first deploy.

04

Integration layers

Adapters for SAP, Salesforce, payment providers and carrier APIs, wrapped in typed clients with circuit breakers and structured error mapping, so downstream failures are visible and contained.

05

Shared monorepos

pnpm or Turborepo workspaces with front-end, API and shared packages in one place, so a type change in the domain model breaks the build — not production.

06

Internal tooling and CLIs

Admin consoles, migration scripts, data back-fills and operational tooling written in the same language as the product, reviewed to the same standard, and owned by the same team.

Fit

When to choose it.

Right fit

Choose TypeScript on Node.js when the work is dominated by I/O — APIs, integrations, orchestration, real-time features — and when the same team owns the front-end. It is a direct path from a product decision to a running service, and the ecosystem gives you a well-supported answer for authentication, queues, observability and testing without writing them yourself. It suits product teams that ship often and want one hiring profile across the stack.

Look elsewhere

Do not choose it for CPU-bound computation, heavy numeric pipelines or workloads that need fine control over memory and threads. If your organisation is standardised on the JVM or .NET with the operational tooling to match, a Node.js island adds cost without adding much. And if strict latency under sustained CPU load is the requirement, Go or Java will serve you better — we will tell you which.

In practice

A route whose contract lives in the code.

src/routes/redeem.tsts
const Redeem = z.object({
  memberId: z.string().uuid(),
  points: z.number().int().positive(),
  idempotencyKey: z.string().min(16),
});

app.post('/redeem', { schema: { body: Redeem } }, async (req, reply) => {
  // handler receives a typed body — no manual parsing, no any
  const result = await ledger.redeem(req.body, { traceId: req.id });
  return reply.code(result.duplicate ? 200 : 201).send(result);
});
Reference architecture

Where Node.js sits in an Odeontech estate.

Edge
Next.jsCDN / WAFAPI gateway
Application
NestJS / Fastify servicesBFFWorkers
Messaging
KafkaRabbitMQOutbox
Data
PostgreSQLRedisObject storage
Platform
KubernetesOpenTelemetryGitHub Actions
Our standards

What the TypeScript codebases we hand over look like.

  • Strict mode, no escape hatches. strict: true, no any outside a declared adapter boundary, and lint rules that fail the build rather than warn.
  • Schemas at the edge. Every inbound payload is validated with zod or JSON Schema; every outbound contract is generated from the same source and published to consumers.
  • Tests that mirror the risk. Unit tests for domain logic, contract tests for every integration, and Playwright or k6 where the failure would be visible to a customer.
  • Observability from the first commit. OpenTelemetry traces, structured JSON logs with request ids, and a dashboard with SLOs before the service takes traffic.
  • Idempotent by default. Handlers that touch money, points or stock accept an idempotency key and survive a retry without a duplicate write.
  • Dependency hygiene. Lockfiles committed, Renovate or Dependabot on, and SCA scanning in CI — the supply chain is part of the security review.
  • Performance measured, not assumed. Event-loop lag, heap and p95 latency are on the dashboard, and load tests run before a release that changes a hot path.
  • Twelve-factor deployment. Config from the environment, secrets from a vault, containers built once and promoted through environments unchanged.
Typical pairings

What usually ships alongside it.

  • A NestJS or Fastify service template with auth, validation, tracing and health checks already wired
  • OpenAPI or GraphQL schema, generated typed clients, and contract tests for every consumer
  • A monorepo layout with shared domain types between web, mobile and API
  • CI pipeline with type-check, lint, tests, SCA scan and container build as separate gates
  • Runbooks and dashboards for the service — the on-call engineer can read the trace before reading the code
Runs with
TypeScriptNode.jsNestJSFastifyzodPrismaPostgreSQLRedisKafkaKubernetesOpenTelemetryPlaywright
FAQ

Frequently asked questions

NestJS when the team is larger than a handful of engineers or is coming from Java or .NET; its module and dependency-injection conventions keep a growing codebase legible. Fastify when the service is small, latency-sensitive and owned by people who prefer less framework. We use both, and will say which fits your team rather than ours.
Yes, for I/O-bound work. A well-written Node.js service runs behind a load balancer and scales out from there. The usual failures are not the runtime’s: they are blocking calls on the event loop, unbounded concurrency and missing back-pressure — all things our standards address before go-live.
Strict compiler settings, schemas at the boundary, automated dependency updates and a monorepo where a type change surfaces every caller. Code that lies about its types is treated as a bug, not a style preference.
Yes. We start with an audit — types, tests, dependency health, observability — and give you a written assessment. Then we work inside your repositories, your CI and your review process, raising the bar as we go rather than proposing a rewrite.
We track both. For production services we stay on Node.js LTS, because the operational tooling, security patch cadence and hosting support are mature. That may change; we will tell you when it does.
Related

Neighbouring technologies and the services that use them.

Need TypeScript engineers for production systems?

Tell us the shape of the work — a new service, a BFF, an integration layer — and the seniority you need. We will propose a named team or place specialists into yours.

✓ No pitch deck✓ Reply from an AI-native engineer✓ Written follow-up