Skip to content

App Management

Talos provides full lifecycle management for applications through the web UI and REST API.

Application Model

Each application in Talos has the following properties:

FieldDescriptionExample
NameUnique identifier, used in container names and URLsmy-app
App Typemanaged, adopted_container, or external_servicemanaged
Build Modeexternal_ci or talos_buildexternal_ci
Project TypeBuild detection override: auto, static, node, go, or javaauto
SourceWhere the app comes fromgithub
Repository URLGit repository URLhttps://github.com/org/my-app
BranchDefault deployment branchmain
Internal PortPort the app listens on inside the container3000
Image RefCurrent container imageghcr.io/org/my-app:abc1234
DomainCustom domain for domain-mode routingapp.example.com
Fallback PortExternal port for IP-mode access8080
Access Modedomain or portport
Statusactive, inactive, or erroractive

Build Modes

ModeDescription
external_ciGitHub Actions builds and pushes the image. Talos deploys on webhook notification.
talos_buildTalos clones the repo and builds the image locally on push events.

Project Types

When using Talos Build mode and no Dockerfile exists in the repository, Talos auto-detects the project type by inspecting sentinel files (e.g. package.json, go.mod, pom.xml). The Project Type field lets you override this detection.

ValueDetection SentinelGenerated DockerfileDefault Port
auto (default)Auto-detected from repo filesDepends on detected typeDepends on detected type
staticindex.htmlnginx serving static files80
nodepackage.jsonNode.js or Bun runtime3000
gogo.modGo build + scratch runtime8080
javapom.xml or build.gradleMaven/Gradle build + JDK runtime8080

When to use a specific type:

  • Monorepos where detection picks the wrong provider (e.g. a Go repo with a root package.json for tooling)
  • Unusual layouts where sentinel files are in non-standard locations
  • Overriding default port behavior (the port is set by the provider, not the form field)

How it works:

  1. If a Dockerfile exists in the repo root, Talos uses it directly — Project Type is ignored.
  2. If no Dockerfile exists and Project Type is auto, Talos runs auto-detection.
  3. If no Dockerfile exists and Project Type is set to a specific value, Talos skips detection and uses that provider directly.
  4. If the chosen provider cannot generate a plan (e.g. go selected but no go.mod found), the deploy fails at build time with a descriptive error.

TIP

Project Type only affects Talos Build mode. In External CI mode, the build happens in GitHub Actions and Talos only deploys the resulting image.

CRUD Operations

Create an App

Web UI: Navigate to Apps > New App and fill in the form.

API:

bash
curl -X POST http://localhost:3000/api/apps \
  -H "Content-Type: application/json" \
  -H "Cookie: session=<your-session-cookie>" \
  -d '{
    "name": "my-app",
    "app_type": "managed",
    "build_mode": "external_ci",
    "repo_url": "https://github.com/org/my-app",
    "branch": "main",
    "internal_port": 3000,
    "access_mode": "port",
    "fallback_port": 8080
  }'

With Talos Build mode (auto-detect project type):

bash
curl -X POST http://localhost:3000/api/apps \
  -H "Content-Type: application/json" \
  -H "Cookie: session=<your-session-cookie>" \
  -d '{
    "name": "my-app",
    "app_type": "managed",
    "build_mode": "talos_build",
    "repo_url": "https://github.com/org/my-app",
    "branch": "main",
    "internal_port": 3000,
    "access_mode": "port",
    "fallback_port": 8080
  }'

With Talos Build mode and explicit project type:

bash
curl -X POST http://localhost:3000/api/apps \
  -H "Content-Type: application/json" \
  -H "Cookie: session=<your-session-cookie>" \
  -d '{
    "name": "my-go-app",
    "app_type": "managed",
    "build_mode": "talos_build",
    "project_type": "go",
    "repo_url": "https://github.com/org/my-go-app",
    "branch": "main",
    "internal_port": 8080,
    "access_mode": "port",
    "fallback_port": 8081
  }'

When project_type is omitted or set to "", Talos auto-detects from repo files. Set it to static, node, go, or java to skip detection.

List Apps

Web UI: The dashboard shows all applications with their current status.

API:

bash
curl http://localhost:3000/api/apps \
  -H "Cookie: session=<your-session-cookie>"

Get App Details

Web UI: Click on an app name to see its detail page.

API:

bash
curl http://localhost:3000/api/apps/{appID} \
  -H "Cookie: session=<your-session-cookie>"

Update an App

Web UI: Use the app settings page to modify configuration.

API:

bash
curl -X PUT http://localhost:3000/api/apps/{appID} \
  -H "Content-Type: application/json" \
  -H "Cookie: session=<your-session-cookie>" \
  -d '{
    "branch": "develop",
    "internal_port": 8080
  }'

Delete an App

Web UI: Click Delete on the app detail page.

API:

bash
curl -X DELETE http://localhost:3000/api/apps/{appID} \
  -H "Cookie: session=<your-session-cookie>"

WARNING

Deleting an app removes its deploy history, environment variables, and service links. The running container is stopped and removed. This action cannot be undone.

Deploy Status

Each app tracks its current deployment state:

StatusDescription
activeApp has a running container
inactiveApp exists but has no running container
errorLast deploy failed

The app detail page shows:

  • Current image reference
  • Live container name
  • Current deploy ID
  • Access URL
  • Full deploy history

Deploy History

Every deployment is recorded with:

  • Image reference and commit SHA
  • Trigger source (webhook, manual, rollback)
  • Status (pending, running, success, failed, auto_rollback)
  • Start and completion timestamps
  • Environment variable snapshot
  • Structured events for each pipeline step

Trigger a Deploy

Web UI: Click Deploy on the app detail page.

API:

bash
curl -X POST http://localhost:3000/api/apps/{appID}/deploys \
  -H "Content-Type: application/json" \
  -H "Cookie: session=<your-session-cookie>" \
  -d '{
    "image_ref": "ghcr.io/org/my-app:abc1234"
  }'

View Deploy Events

Each deploy emits structured events at every step:

bash
curl http://localhost:3000/api/deploys/{deployID}/events \
  -H "Cookie: session=<your-session-cookie>"

Response:

json
[
  {
    "id": 1,
    "deploy_id": 42,
    "timestamp": "2025-01-01T12:00:00Z",
    "level": "info",
    "step": "start",
    "message": "deploy started for my-app with image ghcr.io/org/my-app:abc1234"
  },
  {
    "id": 2,
    "deploy_id": 42,
    "timestamp": "2025-01-01T12:00:01Z",
    "level": "info",
    "step": "pull",
    "message": "pulling image ghcr.io/org/my-app:abc1234"
  }
]

Rollback

Rollback redeploys the image from the last successful deploy:

Web UI: Click Rollback on the app detail page.

API:

bash
curl -X POST http://localhost:3000/api/apps/{appID}/deploys/rollback \
  -H "Cookie: session=<your-session-cookie>"

The rollback follows the same blue/green process as a regular deploy -- the previous image is health-checked before traffic switches over.

Environment Variables

Manage per-app environment variables through the app settings page or API.

Set an Environment Variable

bash
curl -X POST http://localhost:3000/api/apps/{appID}/env \
  -H "Content-Type: application/json" \
  -H "Cookie: session=<your-session-cookie>" \
  -d '{
    "key": "DATABASE_URL",
    "value": "postgres://user:pass@host/db",
    "is_secret": true,
    "required": true
  }'

List Environment Variables

bash
curl http://localhost:3000/api/apps/{appID}/env \
  -H "Cookie: session=<your-session-cookie>"

View Change History

bash
curl http://localhost:3000/api/apps/{appID}/env/DATABASE_URL/history \
  -H "Cookie: session=<your-session-cookie>"

Reveal a Secret Value

bash
curl http://localhost:3000/api/apps/{appID}/env/DATABASE_URL/reveal \
  -H "Cookie: session=<your-session-cookie>"

Service Linking

Link managed services to apps to inject connection credentials automatically:

bash
# Link a service
curl -X POST http://localhost:3000/api/apps/{appID}/services \
  -H "Content-Type: application/json" \
  -H "Cookie: session=<your-session-cookie>" \
  -d '{
    "service_id": 1,
    "alias": "DB"
  }'

# List linked services
curl http://localhost:3000/api/apps/{appID}/services \
  -H "Cookie: session=<your-session-cookie>"

# Unlink a service
curl -X DELETE http://localhost:3000/api/apps/{appID}/services/{serviceID} \
  -H "Cookie: session=<your-session-cookie>"

Live Logs

Stream container logs in real time:

bash
curl http://localhost:3000/api/apps/{appID}/logs/stream \
  -H "Cookie: session=<your-session-cookie>"

The web UI provides a log viewer on the app detail page.

Next Steps

Released under the Apache License 2.0.