Chajio Cloud
App Hosting

Node.js Hosting in Kenya

If your app starts with npm start on your computer, it starts here. Push to GitHub and Chajio Cloud installs, builds and runs two copies of your server, with free SSL and a managed database.

$ git push origin main
▸ Detected Node.js: package.json, package-lock.json
▸ Using Node.js 22, from package.json
▸ npm ci
▸ npm run build
▸ Starting the web process: npm start
✓ Live on 2 replicas: https://my-api.live.chajio.cloud

How it works

How we build and run your Node.js app

  1. Detect

    A package.json marks your repository as a Node.js app. Your lockfile (package-lock.json, yarn.lock or pnpm-lock.yaml) decides which package manager installs it.

  2. Install

    Dependencies install exactly as your lockfile pins them, development dependencies included, so TypeScript and your bundler are there for the build.

  3. Build

    If package.json has a build script, it runs next: tsc, a bundler, or whatever your project uses.

  4. Run

    Your start script starts the server. A new version only receives visitors once its health check passes, so a broken build never replaces a working one.

Get ready

Getting your Node.js app ready

server.js
const express = require("express");
const app = express();

app.get("/", (req, res) => res.json({ message: "Hello from Chajio Cloud" }));
app.get("/health", (req, res) => res.json({ ok: true }));

const port = process.env.PORT || 3000;
const server = app.listen(port, "0.0.0.0");

// Finish the requests in flight when a new version takes over.
process.on("SIGTERM", () => server.close(() => process.exit(0)));

Listen on the port in PORT, on 0.0.0.0 rather than localhost. It is the one change most apps need. Fastify and NestJS take the same two values.

package.json
{
  "engines": { "node": "22.x" },
  "scripts": {
    "build": "tsc",
    "start": "node dist/index.js"
  }
}

engines picks the Node.js version: set the one you develop on. An .nvmrc file is not read. With TypeScript, compile in build and run the output in start: it starts faster and uses less memory than ts-node.

Works with

What you can run

Express

The classic. Nothing to change beyond PORT.

NestJS

Build with nest build, start with node dist/main.

Fastify

Pass host: "0.0.0.0"; it listens on localhost by default.

Koa

Same setup as Express.

Hono

With the Node.js adapter.

Socket.IO

Real-time apps over WebSockets.

In production

Running your Node.js app in production

No .env file in production

Set variables on the Environment tab. They are already in process.env when your app starts, so keep .env out of Git and don’t load it in production.

Two copies, shared state

Each replica has its own memory. Keep sessions in your database (with express-session, a store such as connect-pg-simple) and uploads in object storage.

WebSockets

Socket.IO works. Connect with transports: ["websocket"], and add an adapter backed by your database to reach users connected to the other copy.

Migrations on start

With Prisma, run prisma migrate deploy before your server starts: "start": "prisma migrate deploy && node dist/index.js".

Every plan

Included on every plan

2 replicas of every app

Two copies behind a load balancer, so a restart or a failed machine never takes you offline.

A managed database

PostgreSQL, MariaDB or MongoDB, with its own standby replica on another machine.

Deploy on every push

Connect GitHub once; every push to your branch builds and goes live.

One-click rollbacks

Go back to any earlier successful deployment from the Deployments tab.

Free SSL, your domain

Certificates issued and renewed for you, plus a free .live.chajio.cloud address.

Build and runtime logs

Watch builds as they run, and see what your app prints as it serves visitors.

CPU, memory and network

Metrics for every app, from the last 15 minutes to the last 30 days.

Zero-downtime deploys

A new version takes visitors only once its health check passes.

Pricing

Node.js hosting plans

Free Plan

5GB DB Storage · 2GB RAM

Free 1st month

Then Ksh 350/mo

  • 2 vCPU
  • 2 Apps
  • 1 Database
  • 2 App Replicas (HA)
  • 2 Database Replicas (HA)
  • PostgreSQL, MariaDB or MongoDB
  • Deploy from GitHub
  • Auto-deploy on push
  • One-click rollbacks
  • Deployment history
  • Build & runtime logs
  • CPU, RAM, disk & network metrics
  • Disk usage tracking
  • Environment variables
  • Custom domain
  • Free SSL
Start Free

Growth Plan

10GB DB Storage · 2GB RAM

Ksh 899/mo
  • 3 vCPU
  • 4 Apps
  • 2 Databases
  • 2 App Replicas (HA)
  • 2 Database Replicas (HA)
  • PostgreSQL, MariaDB or MongoDB
  • Deploy from GitHub
  • Auto-deploy on push
  • One-click rollbacks
  • Deployment history
  • Build & runtime logs
  • CPU, RAM, disk & network metrics
  • Disk usage tracking
  • Environment variables
  • Custom domain
  • Free SSL
Choose Growth
Most Popular

Business Plan

20GB DB Storage · 4GB RAM

Ksh 1,899/mo
  • 4 vCPU
  • 6 Apps
  • 3 Databases
  • 2 App Replicas (HA)
  • 2 Database Replicas (HA)
  • PostgreSQL, MariaDB or MongoDB
  • Deploy from GitHub
  • Auto-deploy on push
  • One-click rollbacks
  • Deployment history
  • Build & runtime logs
  • CPU, RAM, disk & network metrics
  • Disk usage tracking
  • Environment variables
  • Custom domain
  • Free SSL
Choose Business

Pro Plan

30GB DB Storage · 8GB RAM

Ksh 3,798/mo
  • 8 vCPU
  • 10 Apps
  • 5 Databases
  • 2 App Replicas (HA)
  • 2 Database Replicas (HA)
  • PostgreSQL, MariaDB or MongoDB
  • Deploy from GitHub
  • Auto-deploy on push
  • One-click rollbacks
  • Deployment history
  • Build & runtime logs
  • CPU, RAM, disk & network metrics
  • Disk usage tracking
  • Environment variables
  • Custom domain
  • Free SSL
Go Pro

FAQ

Node.js hosting questions

The one you choose in the engines field of package.json, for example "node": "22.x". Without it, your app builds on the current long-term-support release of Node.js. An .nvmrc file is not read.

Yes. Commit the lockfile for the one you use (package-lock.json, yarn.lock or pnpm-lock.yaml) and every build installs exactly what it pins.

Yes. Compile it in your build script, for example with tsc, and run the compiled JavaScript in your start script. TypeScript stays in devDependencies; it is installed for the build.

Yes. Deploy each one as its own app: the React app as a static site and the API as a Node.js server. Point the frontend at the API’s address and allow the frontend’s domain in the API’s CORS settings.

Almost always because it listens on localhost or on a hard-coded port. Listen on the PORT variable, on 0.0.0.0, and make sure the health check path (/ by default) answers without a login.

You can start on the Free plan: free for your first month, then Ksh 350 a month, with 2 vCPU, 2GB RAM, 2 apps and a managed database. The Growth, Business and Pro plans add more CPU, memory, apps and databases as you grow.

Yes. We accept M-Pesa, Visa, Mastercard, PayPal, and bank transfers, and every plan is priced in Kenyan shillings. M-Pesa is the quickest option for Kenyan customers.

Deploy your Node.js app today

Your first month is on us, with a managed database and two replicas from day one.