---
title: "Supported Runtimes: Python, Node.js, Go, Java, Rust, More"
description: "Which file each runtime starts, how it installs packages or builds the code, and which settings to change for Python, Node.js, Go, Java, Rust and more."
url: https://fps.ms/docs/containers/supported-runtimes
---
# Supported runtimes

A Container runs your code in one of 12 runtimes: Python, Node.js, Bun, .NET, Dart, Go, Java, Kotlin, Haskell, Lua, Odin and Rust. Each runtime starts a default file, for example `app.py` for Python or `index.js` for Node.js, and installs your packages or builds your code when the server starts. You change the file name and other settings on the **Startup** tab. This page lists what each runtime does and what you can change.

## How a runtime starts your code

- **Without GitHub deploys**, the server installs your packages and, for compiled languages, builds your code every time it starts. Then it runs your app.
- **With [GitHub deploys](https://fps.ms/docs/containers/deploy-from-github.md)**, the install and build run once per deploy, in the [deploy script](https://fps.ms/docs/containers/deploy-scripts-and-github-actions.md). For every runtime except Python and Node.js, starting the server then only runs the finished app, so restarts are faster. Python and Node.js still check their packages on every start.

To change a setting:

1. Click **Manage** on your server.
2. Click **Startup**. If you do not see it in the top bar, click **More** first.
3. Change the field. It saves by itself. Restart the server from the **Console**.

To change the version of the runtime, for example Python 3.11 to 3.13, pick another one under **Runtime Version** on the same tab.

## Quick reference

| Runtime | Starts by default | Settings on the Startup tab |
|-|-|-|
| [Python](#python) | `app.py` | App py file, Requirements file, Additional Python packages |
| [Node.js](#nodejs) | `index.js` | Main file, Additional Node packages, Additional Arguments |
| [Bun](#bun) | `index.ts` | Main File |
| [.NET](#net) | Your `.csproj`, built | Project File, DLL File |
| [Dart](#dart) | `bin/server.dart`, compiled | Main File |
| [Go](#go) | Your module, built | Go Package, Executable |
| [Java](#java) | Your Maven or Gradle project, built | JAR File |
| [Kotlin](#kotlin) | Your Gradle project, built | JAR File |
| [Haskell](#haskell) | Your Cabal or Stack project, built | Executable Name |
| [Lua](#lua) | `main.lua` | Main File, LuaRocks Packages |
| [Odin](#odin) | Your package, built | Package Folder, Build Flags |
| [Rust](#rust) | Your crate, built | Crate Path, Binary Name, Executable |

Kotlin and Haskell are on paid plans only. Every other runtime has a free plan.

## Python

The server installs the packages in **Additional Python packages**, then everything in `requirements.txt`, then runs `app.py`. Change the file to run in **App py file**. See [installing Python packages](https://fps.ms/docs/containers/installing-python-packages.md) for the details and common pip errors.

More: [Python hosting](https://fps.ms/python-hosting)

## Node.js

If there is a `package.json`, the server runs `npm install`, then starts the **Main file** (`index.js`) with `node`. It does not run `npm start`. A **Main file** that ends in `.ts`, like `index.ts`, runs with `ts-node`, so TypeScript works without a build step. **Additional Arguments** are passed to `node`.

More: [Node.js hosting](https://fps.ms/nodejs-hosting)

## Bun

If there is a `package.json`, the server runs `bun install`, then runs the **Main File** (`index.ts`) with `bun`. Bun runs TypeScript directly.

More: [Bun hosting](https://fps.ms/bun-hosting)

## .NET

The server runs `dotnet publish` on the `.csproj` in **Project File**, or on the first `.csproj` in the main folder when the field is empty, and runs the result. Without a project, it runs the published DLL in **DLL File** (`app.dll`).

## Dart

The server runs `dart pub get` when there is a `pubspec.yaml`, compiles the **Main File** (`bin/server.dart`) with `dart compile exe`, and runs it.

More: [Dart hosting](https://fps.ms/dart-hosting)

## Go

With a `go.mod`, the server builds the package in **Go Package** (`.`, or for example `./cmd/bot`) and runs it. Without a `go.mod`, it runs a binary you uploaded, named in **Executable** (`app`). Go's memory limit is set to 90% of your plan's memory, so the garbage collector works before the server runs out.

## Java

With a `pom.xml`, the server builds with Maven. With a Gradle build file, it builds with Gradle (your `gradlew` when there is one). Tests are skipped. It runs the JAR the build made, preferring a `-all.jar` (fat JAR). Without a project, it runs the JAR in **JAR File** (`app.jar`). Java may use 75% of your plan's memory.

## Kotlin

With a Gradle build file, the server builds with Gradle like Java does. Without one, it compiles the `.kt` files in the main folder with `kotlinc`. Without either, it runs the JAR in **JAR File**. Gradle needs about 1 GB of memory to build, so pick a plan with at least that much.

More: [Kotlin hosting](https://fps.ms/kotlin-hosting)

## Haskell

The server builds with Cabal when there is a `.cabal` file or `cabal.project`, otherwise with Stack. It runs the executable in **Executable Name**, or the first one in your `.cabal` file when the field is empty.

More: [Haskell hosting](https://fps.ms/haskell-hosting)

## Lua

The server installs the dependencies of your `.rockspec` and the rocks in **LuaRocks Packages** with LuaRocks, then runs the **Main File** (`main.lua`). Rocks that need OpenSSL to build, like `luasec`, cannot be installed.

More: [Lua hosting](https://fps.ms/lua-hosting)

## Odin

The server builds the package in **Package Folder** (`.`) with `odin build` and the **Build Flags** (`-o:speed`), then runs it.

More: [Odin hosting](https://fps.ms/odin-hosting)

## Rust

With a `Cargo.toml` in **Crate Path** (`.`), the server builds your crate with `cargo install` and runs its binary. If the crate has more than one binary, name the one to run in **Binary Name**. A `Cargo.lock` is respected. Without a `Cargo.toml`, it runs a binary you uploaded, named in **Executable** (`app`).

More: [Rust hosting](https://fps.ms/rust-hosting)

## Next steps

- [What is a Container?](https://fps.ms/docs/containers/what-is-a-container.md)
- [Environment variables and .env files](https://fps.ms/docs/containers/environment-variables.md)
- [Put a web app online with a Public URL](https://fps.ms/docs/containers/public-url.md)
- [Fix an app that will not start](https://fps.ms/docs/containers/troubleshooting.md)

---

[FPS.ms](https://fps.ms/index.html.md) · [All pages](https://fps.ms/llms.txt) · [Documentation](https://fps.ms/docs/llms.txt)
