Teral

July 5, 2026

Automatic builds without Dockerfile, API Keys, Stop/start for apps with auto-sleep previews, MFA, and a batch of security fixes.

New features

Automatic builds, no Dockerfile required

Teral now builds your application without a Dockerfile. Push a GitHub repository and the build machine detects your language, package manager, and framework, installs dependencies, and produces a container image. Node.js, Python, Go, PHP, Java, Rust, Ruby, Elixir, Deno, .NET, Gleam, C++, static sites, and shell scripts are all supported out of the box.

Most projects need zero configuration. Tool versions come from your repository's standard files, for example lockfiles, engines in package.json, .nvmrc, .python-version, or go.mod. In a monorepo, point the root directory at the service you want to deploy.

Environment variables are available during the build automatically, with no --mount=type=secret plumbing. The build cache is invalidated when a value changes, and values are never written into image layers.

If you need full control over the image, point your app at a Dockerfile and Teral builds with it instead. The setting is per app and per environment, so existing apps with a configured Dockerfile are unaffected. See Builds.

API Keys

API Keys are now available as a setting in your workspace, with a dedicated page for managing them to access Teral's resources over the API. See API Keys.

Stop and start apps, and auto-sleep previews

Apps can now be stopped and started, and preview environments automatically scale to zero when idle so you don't pay for traffic that isn't there. See Deployments.

MFA is now avaiable

You can now enroll in multi-factor authentication when signing in to the dashboard, with a unified enrollment flow.

Project cards show the apps inside

The projects list now uses a redesigned card that summarizes the apps inside each project: an avatar-style stack of app-source icons (GitHub or terminal) with a hover card listing every app and its repo. New projects get a "No apps yet" empty state. See Projects.

Upgraded empty state for new workspaces

A workspace with no projects now sees a full-bleed empty state that explains what Teral deploys do, alongside a create-project CTA. The search-no-match result keeps its existing inline empty.

Composable page header and secondary nav

Settings pages now use new page composition primitives — PageHeader, PageShell, and SecondaryNav — that render behind the new navigation flag. Migrated pages include General, Team, Root keys, and Billing, with a full width variant available for dense data pages.

Status indicator in the help menu

The dashboard's help menu now shows live Teral status next to a link to the status page, so you can tell at a glance whether an issue is on your side or ours.

Updates

Build logs focus on the failing step

When a deployment fails, the build logs viewer now auto-scrolls to the step that errored so you don't have to hunt for it.

Environment variable name validation

Variable names are now validated as POSIX shell identifiers (letters, digits, and underscores, not starting with a digit) at variable creation, with a clear error. The same rule is asserted at build time so older variables that don't fit the rule fail the build with a readable message instead of an opaque error.

Registry retries during builds

Transient registry 5xx errors during build solves are now retried instead of failing the deployment terminally, for both automatic and Dockerfile builds.

Missing deployments and projects return 404

The dashboard now renders a 404 boundary when a deployment or project doesn't exist, instead of throwing a runtime error and rendering a 500.

Repo picker shows the source account

The "select a repository" step when creating an app now shows which GitHub account or organization each repo belongs to, so picking the right repo across multiple connected accounts is unambiguous.

Bug fixes

  • Patched two SSRF paths — one through HTTP redirects and one through the proxy to the API.
  • Blocked a cross-tenant deletion path on shared resources.
  • The app overview "requests this week" chart now spans the full labeled time window instead of contracting to ~24h, and its request rate is no longer inflated by an over-eager client-side downsample.
  • List search inputs are debounced and filter IDs are stable, so typing no longer thrashes the URL or re-runs queries on every keystroke.
  • Cleaned up several visual rough edges in the new sleep/stop UI components.
  • Improved Sentry error capture so dashboard exceptions carry more useful context.
  • Fork pull request approvals redirect to the correct deployment path.
  • The duplicate copy-workspace button in the sidebar is gone, along with the duplicate user buttons that appeared in some layouts.
  • Filter and breadcrumb popovers render at a consistent height and size, and the projects page no longer has a z-index issue that hid menus behind cards.
  • Worker permissions for forked pull requests are now scoped to the specific repository and guard against external forks.
  • Workers reject invalid port, CPU, and memory values up front instead of failing later in the deploy with an opaque error.
  • Deleting a project now redirects you to the projects list instead of leaving you on a dead URL.
  • Loading messages in the dashboard are centered correctly again.
  • Fixed a broken link in the dashboard navigation.
Edit on GitHub

On this page