Supported Languages, Frameworks & Build Methods
Everything Temps can build and deploy, at a glance. Temps supports 20+ languages via Nixpacks, first-class presets for popular frameworks, Dockerfile builds, pre-built Docker images, Docker Compose stacks, and static file deployments.
Build methods
Temps offers four ways to get your application running:
- Name
Git push (auto-detected)- Type
- Default
- Description
Push code to a connected Git repository. Temps detects your language and framework, generates a Dockerfile, builds a container image, and deploys it. This is the most common flow and requires no configuration.
- Name
Dockerfile- Type
- Full control
- Description
Add a
Dockerfileto your repository root. Temps uses it directly instead of auto-detection. Supports multi-stage builds, BuildKit caching (--mount=type=cache), custom build arguments, and custom Dockerfile paths for monorepos.
- Name
Docker image- Type
- Pre-built
- Description
Deploy a pre-built image from Docker Hub, GitHub Container Registry, or any OCI registry. You can also upload an image directly via
docker save. No build step — Temps pulls the image and starts a container.
- Name
Static files- Type
- No runtime
- Description
Upload a
.tar.gzor.zipbundle of pre-built static files. Temps serves them directly from the proxy — no container runs at runtime. Zero memory and CPU usage after deployment.
For details on each method, see Docker Containers and the per-framework deployment guides.
Framework presets
Presets are framework-specific build configurations. When Temps detects a framework, it selects the appropriate preset to generate an optimized Dockerfile. You can also select a preset manually when creating a project.
Not every framework below has a dedicated, selectable preset slug. Rows marked "auto-detected (no preset slug)" have no registered preset provider — passing that framework's name as a preset value when creating or updating a project fails immediately. Those frameworks still deploy successfully today, but only through the generic Nixpacks/autopack auto-detect path, using that path's own port and build behavior rather than the framework-specific preset system.
JavaScript / TypeScript
| Framework | Preset | Type | Runtime / preset metadata | Detection |
|---|---|---|---|---|
| Next.js | nextjs | Server (SSR) | 3000 | next.config.js, .mjs, .ts |
| Vite | vite | Static | 80 / 5173 | vite.config.js, .ts |
| Create React App | react-app | Static | 3000 | react-scripts in package.json |
| Rsbuild | rsbuild | Static | 3000 | rsbuild.config.ts |
| Docusaurus | docusaurus | Static | 3000 | docusaurus.config.js, .ts |
| Astro | astro | Static / Server | 4321 | astro.config.mjs |
| Nuxt | auto-detected (no preset slug) | Server (SSR) | 3000 | nuxt.config.ts |
| Remix | auto-detected (no preset slug) | Server | 3000 | Remix config |
| SvelteKit | auto-detected (no preset slug) | Server | 5173 | SvelteKit config |
| SolidStart | auto-detected (no preset slug) | Server | 3000 | SolidStart config |
| Angular | auto-detected (no preset slug) | Static | 80 / 4200 | angular.json |
| Vue | auto-detected (no preset slug) | Static | 3000 / 8080 | vue.config.js |
| Node.js | auto-detected (no preset slug) | Server | 3000 | package.json (generic) |
Next.js, Vite, Create React App, Rsbuild, Docusaurus, and Astro have a registered preset provider with first-class Dockerfile generation, multi-stage builds, and security hardening. Nuxt, Remix, SvelteKit, SolidStart, Angular, Vue, and Node.js have no dedicated preset slug today — see the note above.
Where two ports are shown, the first is the generated container's runtime port and the second is the current backend preset metadata (Preset::exposed_port()). Vite and Angular are served by nginx on port 80 even though their metadata still reports 5173 and 4200.
Vue CLI projects use the generic Nixpacks deployment path and listen on port 3000, while the current preset metadata reports 8080. Set the project's exposed port to 3000 until that backend metadata is corrected. Vue projects built with Vite use the Vite preset above and are served by nginx on port 80.
Python
| Framework | Preset | Default Port | Detection |
|---|---|---|---|
| Python (generic) | python | 8000 | requirements.txt, pyproject.toml, setup.py, Pipfile |
| FastAPI | auto-detected (no preset slug) | 8000 | FastAPI in dependencies |
| Flask | auto-detected (no preset slug) | 8000 | Flask in dependencies |
| Django | auto-detected (no preset slug) | 8000 | manage.py |
Other languages
| Language | Preset | Default Port | Detection |
|---|---|---|---|
| Rust | rust | 8080 | Cargo.toml |
| Go | go | 8080 | go.mod |
| Java | java | 8080 | pom.xml, build.gradle, build.gradle.kts |
| Ruby on Rails | auto-detected (no preset slug) | 3000 | Gemfile with Rails |
| Laravel (PHP) | auto-detected (no preset slug) | 8000 | artisan, composer.json |
Special presets
| Preset | Slug | Description |
|---|---|---|
| Dockerfile | dockerfile | Uses the Dockerfile in your repository as-is |
| Nixpacks (auto-detect) | nixpacks | Delegates entirely to Nixpacks for language detection and build |
| Static Site | static | For pre-built static files (no build step) |
| Docker Compose | docker-compose | Deploys a docker-compose.yml / compose.yaml stack directly — see Docker Compose below |
Docker Compose
Temps deploys docker-compose.yml / compose.yaml stacks directly via the docker-compose preset — this is a first-class deployment method, not a workaround.
Select the Docker Compose preset when creating a project and point it at a repository containing a compose file (or paste one inline for a manual project). On deploy, Temps:
- Reads the compose file from your repo (or the inline content) and merges in your project's environment variables
- Builds any services with a
build:directive, then runsdocker compose upin an isolated project namespace per environment - Discovers the resulting containers and tracks all of them against the deployment — one project can now run multiple containers, not just one
- Exposes each service that publishes a port through the Temps proxy; internal-only services (e.g. a database with no published port) stay off the public network
- Supports a
docker-compose.temps-override.ymlfile for Temps-specific overrides without editing your original compose file
Compose deployments go through the same pipeline as every other preset — Git push deploys, environment variables, and deployment history all apply. Compose files are validated against a security policy before use (host bind mounts and paths are confined to the checkout).
For details, see Docker Containers.
Nixpacks languages
For languages without a first-class preset, Temps uses Nixpacks to detect, build, and package your application. Nixpacks supports 20+ languages:
- Node.js
- Python
- Rust
- Go
- Java
- PHP
- Ruby
- Deno
- Elixir
- C# / .NET
- F# / .NET
- Dart
- Swift
- Zig
- Scala
- Haskell
- Clojure
- Crystal
- COBOL
- Gleam
- Static files
You can select a specific Nixpacks provider (e.g. nixpacks-python, nixpacks-ruby) when creating a project, or let Nixpacks auto-detect.
Nixpacks reads optional nixpacks.toml or .nixpacks.toml configuration files from your repository root for custom build configuration.
Package managers
Temps detects your Node.js package manager from the lock file and uses the appropriate commands:
| Package Manager | Lock File | Base Image | Install Command |
|---|---|---|---|
| npm | package-lock.json | node:22-alpine | npm install |
| Yarn | yarn.lock | node:22-alpine | yarn install --frozen-lockfile |
| pnpm | pnpm-lock.yaml | node:22-alpine | pnpm install --frozen-lockfile |
| Bun | bun.lockb or bun.lock | oven/bun:1.2 | bun install |
Monorepo tools
Temps detects and supports these monorepo build tools:
| Tool | Detection | Behavior |
|---|---|---|
| Turborepo | turbo.json | Runs npx turbo build scoped to your project directory |
| Nx | nx.json | Runs npx nx build {package} for the target package |
| Lerna | lerna.json | Runs npx lerna run build --scope={package} |
All monorepo tools work with all four package managers (npm, Yarn, pnpm, Bun). Set the App Directory in project settings to the subdirectory containing each app — see Deploy a Project.
Preset detection priority
When auto-detecting from your project files, Temps checks in this order. The first match wins:
Dockerfileexists → Dockerfile presetdocusaurus.config.js/.ts→ Docusaurusnext.config.js/.mjs/.ts→ Next.jsvite.config.js/.ts→ Vitereact-scriptsinpackage.json→ Create React Apprsbuild.config.ts→ RsbuildCargo.toml→ Rustgo.mod→ Gorequirements.txt,pyproject.toml,setup.py,Pipfile→ Pythonpom.xml,build.gradle,build.gradle.kts→ Javanixpacks.toml→ Nixpacks (explicit)- No match → no preset selected (you must choose one manually)
If a Dockerfile exists in your repository root, it always takes priority — even if Temps would otherwise detect a framework like Next.js or Flask. Rename or remove the Dockerfile to use auto-detection.
Build configuration
Every preset supports these optional overrides, configurable from the project settings:
| Option | Description | Example |
|---|---|---|
| Dockerfile path | Custom Dockerfile location relative to the build context | docker/Dockerfile.production |
| Build context | Custom build context path relative to the repository root | ./apps/web |
| Install command | Override the default install command | pnpm install --no-frozen-lockfile |
| Build command | Override the default build command | npm run build:production |
| Output directory | Override the output directory for static builds | out |
Dockerfile features
When using a custom Dockerfile or the generated Dockerfile, Temps supports:
- Multi-stage builds — all generated Dockerfiles use separate build and production stages
- BuildKit — enabled by default; supports
--mount=type=cachefor dependency caching - Build arguments — environment variables are injected as
ARGdirectives and passed via--build-arg - Custom base images — any base image works in your custom Dockerfile
- Platform targeting —
linux/amd64andlinux/arm64
Container runtime
Every deployed container runs with these defaults:
| Setting | Default | Configurable |
|---|---|---|
| CPU | 1 core | Yes |
| Memory | 512 MB | Yes |
| Disk | 1024 MB | Yes |
| Restart policy | On failure | Yes |
| Log retention | 50 MB x 3 files (150 MB total) | No |
| Network binding | 127.0.0.1 (localhost only) | No |
| Init process | Enabled (--init) | No |
Security is enforced at the container level:
- All Linux capabilities are dropped
no-new-privilegesis set- PID limit of 512 processes
- Containers bind to localhost — external access goes through the Temps proxy with automatic TLS
What is not supported
Outside of the Docker Compose preset above, every other Temps project deploys as a single container (or static file bundle) per environment. The following are explicitly not supported:
- Name
Manual multi-container pods (non-Compose)- Type
- Not supported
- Description
Outside of the Docker Compose preset, there is no sidecar pattern or ad hoc pod grouping. A
dockerfile/ framework-preset / Nixpacks project runs exactly one container. Separate services (databases, Redis, etc.) are managed independently through Managed Services, or bundled together via the Docker Compose preset.
- Name
Kubernetes / Docker Swarm- Type
- Not supported
- Description
Temps uses Docker directly — there is no orchestrator layer. Deployments (including Compose stacks) run as Docker containers managed by the Temps deployer.
- Name
Lambda-style serverless- Type
- Not supported
- Description
There are no isolated per-request functions. Your framework's API routes (Next.js, Remix, SvelteKit, etc.) run inside the application container — no cold starts and no per-invocation billing.
- Name
Cloud Native Buildpacks- Type
- Not supported
- Description
Temps uses Nixpacks and Dockerfile builds. Paketo / Heroku buildpacks are not supported.
Managed Services vs. Docker Compose
Both let a project use a database, cache, or queue — pick based on how much control you need:
| Managed Service | Docker Compose preset | |
|---|---|---|
| Best for | PostgreSQL, MySQL, MongoDB, Redis, S3-compatible storage | Anything else, or a stack you already have as a compose file |
| Managed by | Temps (backups, upgrades, connection injection) | You (via the compose file) |
| Setup | Attach from project settings, no YAML | Point the docker-compose preset at your compose file |
See Deploy with a Database for the Managed Services path, or the Docker Compose section above to deploy a compose stack directly.