A bill you can see coming
Top up $20 and watch the runway. We warn at 20% and at zero, hold for 3 days, then pause. Nothing is deleted and no invoice arrives.

Comparison · updated September 2026
Skiffly keeps what makes Railway pleasant: connect a repo, get a service with a domain, wire databases with ${{Postgres.DATABASE_URL}}. It changes the parts that hurt small teams: you pay from a prepaid balance, with the payment method you have, on EU-only nodes we own.
Top up $20 and watch the runway. We warn at 20% and at zero, hold for 3 days, then pause. Nothing is deleted and no invoice arrives.
Not everyone has a card that works with US billing. PayPal and stablecoins top up the same balance at the exchange rate at confirmation, with no fee from us.
Our own nodes in Finland. No hyperscaler in the path, no transfer outside the EU, backups in EU object storage.
The GraphQL fields, CLI commands and MCP tools mirror Railway where the feature exists. ${{Postgres.DATABASE_URL}} references, PR environments, templates: same shapes.
Three commands for the app, one dump and restore for the database. The guide walks through variables, domains and the things to check before cutting over.

Variables with one command, a dump of each database. Drop the platform-specific entries: Skiffly provides the SKIFFLY_* equivalents.

skiffly init && skiffly up builds the same repository with Railpack, every service in its own sandbox. Set the variables, deploy the Postgres template, restore the dump.

Test on the generated *.skiffly.cloud domain, add the custom one, switch the CNAME once the certificate is issued. Keep Railway running until DNS has propagated.

Variables with one command, a dump of each database. Drop the platform-specific entries: Skiffly provides the SKIFFLY_* equivalents.

skiffly init && skiffly up builds the same repository with Railpack, every service in its own sandbox. Set the variables, deploy the Postgres template, restore the dump.

Test on the generated *.skiffly.cloud domain, add the custom one, switch the CNAME once the certificate is issued. Keep Railway running until DNS has propagated.
$ railway variables --kv > vars.env # export from Railway
$ skiffly init && skiffly up # build the repo on Skiffly
$ skiffly variables set --skip-deploys $(grep -v '^RAILWAY_' vars.env | xargs)More regions, a larger template catalog, log drains and a longer track record. Skiffly is a younger product with one EU region and no SLA yet: right for side projects, startups and agencies that value predictable cost over global reach.
Full migration guideWhat we know about ourselves is exact; what we say about others is deliberately general. Check their pricing page for current numbers.
Statements about Railway describe the product in general terms as of September 2026 and may be out of date; see their pricing and documentation for specifics. Skiffly figures come from our pricing page.
projects, deployments(input:), variables, serviceInstanceUpdate, serviceInstanceDeployV2, customDomainCreate and templateDeployV2 run unchanged against https://api.skiffly.dev/graphql; change the endpoint and the token. The MCP server uses the same tool names where the feature exists.update-service, or .skiffly/skiffly.ts). A railway.ts from railway/iac ports with defineRailway → defineSkiffly.http://api:8080) over IPv4. RAILWAY_PRIVATE_DOMAIN becomes SKIFFLY_PRIVATE_DOMAIN; there is no IPv6 private network.
No card. One app and one database, a domain with TLS, and the same commands you would use in production.