Migrating production infrastructure? Get up to ₹10,000 in migration credits. Apply now
voroa
Services

Background Workers. Hosted in India.

A background worker runs continuously with no web port and no public URL - queue consumers, job processors and bots.

Free size included · Paid sizes from ₹298/mo

  • Deploys from GitHub
  • Your start command
  • Runs around the clock
  • 2,000+Developers
  • 24,100+Deploys
  • MumbaiWhere your app runs

What every background worker comes with

  • Builds straight from your GitHub repository
  • A new release on every push to your branch
  • Runs around the clock - never idle-stopped
  • A restart-loop warning on the service, and an email when we catch it - about one a day
  • Build and runtime logs you can read
  • Environment variables and shared env groups
  • Scheduled tasks that run inside it
  • One bill, in rupees, with a GST invoice
  • Runs in Mumbai (IN)

What people run as a background worker

If it has to keep running and nothing needs to reach it over HTTP, it belongs here.

Queue consumers

BullMQ, Celery, Sidekiq, RQ, Resque or your own loop over a queue. The worker sits waiting for jobs and picks them up as your web service pushes them in. Most spend their time idle and are comfortable on the free size.

Stream and event processors

A Kafka or Redis Streams consumer, a change-data reader, a webhook drainer. The process holds its position and keeps reading, and Voroa starts it again if the machine underneath it restarts.

Pollers and schedulers

Code that wakes on its own timer - syncing an external API, refreshing a cache, checking something every few minutes. If it should instead run and finish on a schedule, a cron job is the better fit - see worker or cron job.

Bots and long-lived connections

A Telegram, WhatsApp, Discord or Slack bot, a WebSocket client, an MQTT subscriber. These need to stay connected rather than answer requests, which is exactly what a worker is for.

How a worker differs from a web service

A web service listens on a port and has a URL. A worker does not - it answers no HTTP requests, so there is no address to give out and nothing to point a domain at.

Two consequences worth knowing before you choose:

  • A worker needs a start command. There is no web server for Voroa to detect, so you tell it what to run: node worker.js, python worker.py, npm run worker, or whatever launches your process.
  • A worker is never idle-stopped. Its memory is held for you all day by design, because a queue consumer that gets stopped for being quiet is a queue consumer that stops consuming.
From your repository

Deploy straight from GitHub

Connect a repository, pick a branch, and Voroa builds and runs your app. Most projects need zero configuration. When you do need control, set your own build and start commands, root directory and Node version - and change them any time.

View documentation
Auto-deploy

Ship on every push

Turn on auto-deploy and every push to your branch triggers a fresh build and rolls the change out. Your live service always matches your latest commit, and every deploy is recorded with the commit that caused it.

View documentation
Configuration

Secrets go in, and never come back out

Store the configuration your app needs as environment variables, applied to both your builds and your running service. Values are encrypted at rest and are never displayed again - not to you, not to anyone. You can replace a value; nobody can read it back.

View documentation
Logs

Watch the build, then read the runtime

Your build streams line by line as it runs, and your running service keeps its own runtime logs - so when something misbehaves in production you read what happened instead of guessing. Every deploy keeps its status and its commit.

View documentation

Sizing, and what it costs

A background worker costs exactly the same as a web service of the same size - the same size list, rung for rung, same memory and same CPU at the same price. You never have to work out which of the two is cheaper for the work you are running.

There is a free size, and it is the same free size a web service gets. Most workers are comfortable on it: a consumer that spends its time waiting usually holds well under 100 MB. Start there, watch the Metrics tab, and move up only when that number tells you to.

A free-plan account runs one background worker. Cron jobs share that count, so it is one or the other, and the count is per account rather than per workspace. Growth raises it to five and Scale to twenty-five - see the workspace plans.

Background workers

portless, always-on

Start free, move up a size when the service needs it. Every size is billed per service, per month.

  • No HTTP port, nothing exposed at the edge
  • Restarts automatically
  • Same build pipeline as a web service
Background workers sizes
PlanCPU / RAM / Storage PriceAction
Nanoworker_free 0.1 CPU · 512 MB RAM ₹0/month+18% GST Get started
Starterworker_starter 1 CPU · 1 GB RAM ₹298/month+18% GST Get started
Standardworker_standard 1 CPU · 2 GB RAM ₹498/month+18% GST Get started
Standard Plusworker_standard_plus 2 CPU · 2 GB RAM ₹598/month+18% GST Get started
Proworker_pro 2 CPU · 4 GB RAM ₹998/month+18% GST Get started
Pro Plusworker_pro_plus 4 CPU · 4 GB RAM ₹1,198/month+18% GST Get started
Pro Maxworker_pro_max 4 CPU · 8 GB RAM ₹1,998/month+18% GST Get started
Pro Ultraworker_pro_ultra 8 CPU · 8 GB RAM ₹2,398/month+18% GST Get started
Scaleworker_scale 8 CPU · 16 GB RAM CustomPriced to your workload Talk to us
Scale Maxworker_scale_max 8 CPU · 24 GB RAM CustomPriced to your workload Talk to us

Your bill is one workspace plan plus a compute size for each service you run; the pricing page lists the workspace plans. All prices in INR and exclude 18% GST; a GST tax invoice is issued on every payment. No foreign currency payments, no forex markup.

How it works

From a repository to a running worker

  1. 01

    Create your Voroa account. Email and a password, or sign in with GitHub.

  2. 02

    Choose New, then Background Worker, and pick your repository and branch.

  3. 03

    Set the root directory if your worker lives in a subfolder. It is case-sensitive.

  4. 04

    Enter the start command that launches your process.

  5. 05

    Pick a size. The free one costs nothing and needs no card.

  6. 06

    Create. Voroa builds your code and starts the worker, and every later push is a new release.

Honest status

How Voroa knows your worker is actually running

There is no port to knock on, so Voroa reads the process itself. After the build, the worker shows Starting, and only becomes Live once the process has stayed up for a full minute.

That wait is deliberate. A worker that dies after ten seconds looks exactly like a healthy one for the first few seconds. Waiting long enough for the difference to show means a worker that cannot start is reported as Failed to start rather than as a success you find out about later.

Voroa keeps watching after the deploy is over, too. A worker that is stopping and restarting says so on the service itself, and in most cases we also email whoever the service belongs to - about one a day while it lasts, not one per restart.

If it still cannot stay up a day later, we stop it rather than let it burn a size for nothing. Nothing is deleted and you can start it again yourself once the cause is fixed.

View documentation
Billing

One rupee bill, itemised, with GST

Your workers and every service and database beside them land on a single monthly invoice, paid over UPI-Autopay or an Indian card. Each line names what it is for, and the tax is split out the way your accountant needs it for input tax credit.

View documentation
FAQ

Common questions

Not covered here? Read the docs or talk to us.

What is a background worker?

A long-running process with no web port. It does not serve HTTP and has no URL - it just keeps running, usually waiting on a queue, reading a stream, or holding a connection open. Work arrives from somewhere else, such as your web service adding a job to a queue.

Do I have to give a start command?

Yes. A web service has a server Voroa can detect; a worker has nothing to detect, so the command that starts your process is required. With the Docker runtime it is optional - your image's CMD runs unless you override it.

Does my worker get a URL?

No, and that is the point. Nothing reaches a worker over HTTP, so there is no address and no domain to attach. If you need one, you want a web service instead.

Does a background worker sleep when it is idle?

No. A worker runs around the clock and is never idle-stopped, because being quiet is a normal state for a queue consumer rather than a sign that nobody needs it.

What does a background worker cost?

The same as a web service of the same size, rung for rung. There is a free size that needs no card. Paid sizes bill monthly in rupees, prices exclude GST, and your first charge is prorated and shown to you before you pay.

Background worker or cron job - which do I need?

The difference is whether your code is expected to stop. A worker should still be running tomorrow. A cron job runs, finishes, and waits for its next scheduled time. Finishing is normal for a cron job and a fault for a worker - the full comparison walks through both.

Why does my worker keep restarting from the beginning?

Almost always because the program finishes instead of staying running. Voroa restarts a worker that stops, so a script that does its work and ends gets started again immediately. That code wants to be a cron job. The other two causes are a start command that cannot run, and something the code needs being installed at start-up instead of during the build.

Can I use my own Dockerfile?

Yes. Choose the Docker runtime and Voroa builds from the Dockerfile in your repository, so any system tooling your job needs - a database client, a cloud CLI, image libraries - is there when it runs. Set the Dockerfile path if it is not at the repository root.

Can I run something on a schedule inside a worker?

Yes. Add a scheduled task to the worker and it runs inside the worker's own running container on the schedule you set.

Where does it run, and how am I billed?

In Mumbai (IN). Billing is in rupees, and every charge comes with a GST invoice you can hand to your accountant.

Put your worker somewhere it will stay up

Connect a repository, give it a start command, and pick the free size. Move up a size when the queue gets long enough to need it.

Free size, no card needed.