Docs
Get Started

Both Kuberns and Railway deploy from a repository without asking you to write a Dockerfile, and both provision databases beside the application, so the two solve the same problem in a similar spirit. Kuberns is a compelling alternative to Railway for teams who want that convenience with explicit configuration they can read, and with the platform attempting recovery when a container fails.

Summary

When to choose Kuberns

  • Deployment from a repository alone: connect the repo and an AI agent works out the framework, runtime, web port, build commands, and the resources the application needs. Nothing to write first.
  • Nothing provisioned before you approve it: what the agent detected arrives as an editable screen, so a wrong port is a field you correct rather than a failed build you debug.
  • Configuration you can read: environment variables hold real values, not references the platform resolves at deploy time.
  • Automatic recovery: three layers of container self-healing that classify a failure and act on it, with every attempt recorded.
  • Runtime billing you can pre-purchase: one credit is one dollar, with one-, three-, and twelve-month bundles priced from your own burn rate.

When to choose Railway

  • Volumes: persistent storage attached to a service, which Kuberns does not document an equivalent for.
  • Private networking: services reach each other on internal addresses, which Kuberns does not document.
  • Environments as project copies: a Railway environment is an arbitrary copy of a project rather than a branch, which is more flexible than a per-branch model.
  • Deploy from a container image: Railway runs a prebuilt image directly, not only a repository.
  • Cron schedules on a service: scheduled work is platform configuration rather than a scheduler inside your code.

Using both

These are the same kind of product, so most teams settle on one. During a migration, running both is the right answer: deploy to Kuberns alongside the live Railway service, validate, and move DNS when you are satisfied. The migration guide walks that sequence and spends most of its length on variables, which is where this particular migration goes wrong.

How the same application is described

Build detection

Railway uses Nixpacks, which inspects the repository and works out how to build and run it. This is genuinely the closest thing to the Kuberns agent on any platform in this comparison, and it is worth saying so plainly: both solve the same problem, and on a conventional application they usually reach the same conclusion.

The difference is what you see. Nixpacks reports its decisions through build output, and when you disagree you override with a setting or a config file. The Kuberns AI agent reports the framework, root directory, dependency file, runtime, base image, web port, build commands, Procfile commands, detected variable names, and resource categories as an editable screen you approve before provisioning.

Connection values

This is the sharpest difference between the two platforms, and the reason a Railway migration takes longer than it looks.

Railway resolves references at deploy time:

DATABASE_URL=${{Postgres.DATABASE_URL}}
REDIS_URL=${{Redis.REDIS_URL}}
API_HOST=api.railway.internal

Kuberns has no reference syntax and no internal addressing. The variable holds the value your application will actually read, taken from the resource's datastore overview page:

DATABASE_URL = postgres://<user>:<password>@<kuberns-hostname>/<database>
REDIS_URL    = redis://<kuberns-hostname>:6379/0

Both approaches work. Railway's is less typing and survives a database being recreated. Kuberns's is inspectable: what you see in the variable is what the application connects to, and there is no resolution step that can silently produce something different.

The migration consequence is direct. Copying ${{Postgres.DATABASE_URL}} across as text deploys an application that cannot reach its database, and the error appears at runtime rather than at deploy.

Services and resources

Railway represents everything as a service: your application, your worker, your Postgres, your Redis. Kuberns splits that in two.

Project          your product
└── Service      one deployable application
    └── Environment   one branch
        ├── server resource
        ├── background worker resource
        └── database, cache, and queue resources

A separate application becomes its own Kuberns service. A worker running the same code becomes a background worker resource on the same service. A database becomes a managed resource, not a service.

One structural difference matters when you plan: a Kuberns environment is tied to a repository branch, while a Railway environment is a copy of a project. If your Railway staging and production both deploy the same branch, decide which branch each Kuberns environment should track.

Where Kuberns shines

Detection you can review before it runs

Both platforms detect. Kuberns shows you the result first, on a screen where every field is editable, and provisions nothing until you accept it. When detection is wrong — a monorepo root directory, an unusual port, a framework it has not seen — you correct a field rather than push a commit to steer a builder.

The agent is a provisioning step, not a runtime. Its infrastructure is cleaned up when it finishes.

Recovery when a container fails

Both platforms restart a container that dies. Kuberns also tries to work out why.

Three recovery layers run in the backend: orchestrator restart, an intelligent healing layer that classifies the failure and selects a recovery action, and a real-time listener fed by health-agent events. Classifications include out-of-memory, memory pressure, database unreachable, port conflict, disk full, CPU throttling, missing variables, startup loop, and expiring SSL. Recovery can force-update a Swarm service, recreate a single-node application, or recalculate memory limits after an out-of-memory kill. Every attempt is recorded as a healing event with a readable state.

Defaults cap this at five restart attempts an hour, triggered by three failed probes. It is best-effort recovery, not a guarantee.

Kuberns Fixes separately analyzes build and runtime diagnostics and splits them by ownership. Platform-side items can be applied from the dashboard, which triggers a new deployment. User-side items — a missing package, a wrong root directory, an application error — are reported as yours to fix.

Managed data services

Kuberns offers PostgreSQL, MySQL, and MongoDB as managed datastores with their own credentials, metrics, and backup pages, plus Redis, Kafka, and NATS as queue and cache resources. Worker subtypes cover Celery and Node Worker.

Backups are dumps you download and load yourself with psql, mysql, or mongorestore. Kuberns does not restore one into a running datastore for you, so test that path before you depend on it.

Topology and scaling

Every Kuberns resource runs under one of two topologies: single node, a Docker Compose deployment, or master node, a Docker Swarm service that supports replicas. Horizontal scaling is most relevant to the master-node path, and conversion between the two is a supported infrastructure operation.

Vertical scaling changes the plan, or the CPU and memory, for a resource. Scaling consumes runtime credits and is restricted during the free trial.

Billing you can pre-purchase

Railway meters usage and bills what you consumed. Kuberns bills runtime credits: one credit is one dollar, charged while resources run.

The mechanic without a Railway equivalent is the bundle. A one-, three-, or twelve-month bundle is your current burn rate multiplied by that duration, so no two accounts see the same figure and yours moves when you add or scale a resource. Longer bundles carry a better rate, and the dashboard shows both the credits added and the amount charged before you pay.

Data transfer is metered separately: each backend service environment includes 5 GB a month, with more available manually or through auto-recharge. See Data transfer and storage.

The trial runs seven days with ten credits and no card, and limits GitHub push events to two a day.

Security and access

Kuberns runs on AWS-backed infrastructure and integrates IAM, EC2, ECR, SSM, Secrets Manager, CodeBuild, CodeDeploy, CodePipeline, CloudWatch, and SES. Controls verified in source include OAuth authentication, role-based service permissions, GitHub webhook HMAC signature verification, IAM-based AWS orchestration, encrypted storage for payment autopay tokens, and cleanup of temporary agent infrastructure.

None of that is a certification. Security and policy sets out the shared-responsibility split.

Where Railway still fits better

Volumes

Railway attaches persistent storage to a service. Kuberns does not document a volume or persistent-disk resource, so anything that must survive a deploy belongs in object storage. For some applications that is a code change, not a configuration change, and it is the first thing to check.

Private networking

Railway services reach each other on .railway.internal addresses that never leave its network. Kuberns does not document an internal addressing scheme. Confirm how your services will reach each other before you depend on it.

Environments that are not branches

A Railway environment is a copy of a project, which lets you run staging and production from the same branch with different variables. Kuberns environments are branch-bound. That is simpler to reason about and less flexible, and which of those matters depends on how your team releases.

Deploying an image

Railway runs a prebuilt container image directly. Kuberns is source-driven: the agent analyzes a repository. If your release process publishes an image and deploys that, the shape of your pipeline changes.

Scheduled work

Railway holds a cron schedule as service configuration. On Kuberns, scheduled work becomes an in-application scheduler inside a worker, which moves the schedule into your code where it is harder to see whether a job actually ran.

Get started

If your Railway project is an application service, a worker, a Postgres, and a Redis, it maps cleanly, and the Railway migration guide is the next thing to read.

Before you start, open your variables and search for ${{. The number of results is a fair estimate of how much of this migration is real work.