How Cubli builds your code

Railpack detects your stack without a Dockerfile; what is uploaded, the port, and when a version goes live.

You don’t need to write a Dockerfile or a build script. Cubli builds your code with Railpack: it looks at your files, detects the language and framework you use (such as Node, a static site or PHP) and builds an image from it. That applies to code from the CLI, from your AI tool and from GitHub.

What is uploaded

With cubli up (or your AI’s deploy tool), the CLI packs your folder:

  • Your .gitignore files count, in every folder, just as in git. A .dockerignore at the top counts too.
  • These never go along, whatever your ignore files say: .git, node_modules, .env and .env.*, .cubli.json, .cubli-data, .DS_Store, and SSH keys such as id_rsa and id_ed25519.
  • Packed, it may be at most 200 MB.

So secrets don’t go in your code but in variables.

Building

Building happens on a separate build server and takes at most 15 minutes. Cubli keeps a build cache per service, never shared with others, so a second build is usually faster.

  • Dockerfile: if there is one in your code, Cubli does not use it. Railpack builds your app.
  • Node version: from package.json (engines), otherwise the current LTS. You can pin it on your app under Settings, Runtime, Node version (20, 22 or 24).
  • Variables at build time: your variables are available while building, but are not stored in the image. Variables that end up in the browser, such as VITE_* or NEXT_PUBLIC_*, are built in. So set those before deploying, and deploy again when you change them.

Want to know beforehand what Cubli sees in your folder? Run npx @cubli/cli check. It reads your folder without uploading anything and tells you which framework it is, what your app uses and which variables you still need to set.

Starting: the port

Your app must listen on the port in the PORT variable. Cubli sets it; the default is 8080. You see and change the port on your app under Settings, Starting.

A static site, such as an Astro site, has nothing to do: Cubli serves the files.

When a version goes live

A new version only gets visitors once it answers. Cubli checks every few seconds whether your app responds on its port. If you set a path under Health check, such as /health, that path has to answer.

  • Until the new version is ready, the previous one keeps running.
  • If the new version does not start, the previous one stays online and the deploy shows the reason.
  • Every version is kept, so going back is always possible, without rebuilding.

What Cubli gives your app

  • PORT: the port your app listens on.
  • CUBLI_URL: your site’s primary address, such as https://bakkerijjansen.nl.
  • Connected databases bring their own variables, such as DATABASE_URL. See Add and connect databases.
Was this helpful?

Stuck? Mail support@cubli.io, or ask from your dashboard: Help