Skip to main content
Wildo.ai Coming soon

Deployment manifests & release workflows

Deployment files that describe your application services, backing infrastructure and environment configuration.

Read the film instead

Each environment file produces its own folder of deployment files: local/wildo.infra.local.config.ts → .wildo-saas/deploy/local/; staging/wildo.infra.remote.config.ts → .wildo-saas/deploy/staging/; production/wildo.infra.remote.config.ts → .wildo-saas/deploy/production/. "Give your application a clear place to run." "One folder of deployment files per environment, generated from its description."

The production folder describes the application for a cluster: .wildo-saas/deploy/production/ holds traefik-values.yaml and k8s/, with wonder-todos-backend-api-deployment.yaml, wonder-todos-backend-api-service.yaml, wonder-todos-app-deployment.yaml, wonder-todos-ingress.yaml, cluster-issuer.yaml and tls-config.yaml. Replicas follow the declaration: backendApi 3, app 3, website 2. "Production, described for a cluster." "The application's own workloads, routes and certificates, ready to review."

The staging folder describes the application for a single host: .wildo-saas/deploy/staging/compose/ holds docker-compose.app.yml, one env file per service such as wonder-todos-backend-api.env, and .env.wildo-platform. Its public hosts are app.staging.wonder-todos.com, docs.staging.wonder-todos.com, api.staging.wonder-todos.com and staging.wonder-todos.com, served through Traefik with Let's Encrypt certificates. "Staging, described for a host." "The same services, arranged for Compose."

The output folder carries credentials, so it is ignored: its .gitignore holds a single *, because every file here carries credentials. In the release workflow, secrets come from the environment's GitHub secrets, as WILDO_SECRET_POSTGRESQL_ADMIN_PASSWORD and its siblings. There is no production secrets file in the repository. "The files stay out of git; the secrets stay in the store." "Generated where they are needed, never committed."

The release workflow builds one image per service, each from its own Dockerfile: wonder-todos-backend-api, -app, -website, -docs, -minion-marketing-scrapper, -worker-my-rust-worker, -worker-my-node-worker. Each is built for linux/amd64 and linux/arm64, with its environment's settings baked in, such as VITE_API_BASE_URL=https://api.wonder-todos.com, and pushed to rg.fr-par.scw.cloud/wonder-todos, tagged by commit. "One image per service." "Built for Intel and Arm, pushed to the registry the environment names."

deploy-production.yml, on branch main, runs: Sync configuration, Security policy, Images, Controllers, Apply the manifests. deploy-staging.yml, on branch staging, Builds and pushes, then leaves the host step to you. "Two workflows, two procedures." "Each one readable, each one yours to adopt and run."

A third workflow guards the configuration itself: wildo-config-validation.yml, on every pull request, runs wildo config validate --domain all. When it finds a problem, the Pull request: checks failed. "A broken configuration fails the pull request." "Mistakes are caught in review, not during a release."

When the configuration changes, regenerate: wildo config sync --domain cicd keeps workflows you edited: existing workflows kept unless --force. Then check: wildo config validate --env production --domain manifest --deployment-artifacts parses every file and contacts no cluster. Commit the workflows and the configuration; the output folder stays out of git. "Regenerate, review, commit." "The files are an output you inspect, not a deployment that happened."

The painting from this page: Application configuration leading to Compose and to Kubernetes, and to a step to Review and deploy. "One application model, deliberate deployment choices." Wildo.ai

> Environments with explicit choices> Deployment files you can inspect> A release workflow connected to your services

Infrastructure manifests describe how application services are arranged, reached and supplied with the resources they need.

Wildo generates deployment material from your application and environment configuration. You choose the destination, review the output and operate the deployed application.

Carry application decisions into deployment

Describe the environment

Choose the runtime, public addresses and backing services for each environment while retaining the same application service model.

Inspect the result

Review Compose or Kubernetes files for the services being deployed, their connections and their runtime configuration.

Connect the release

Generate workflow material around the application’s service images and deployment choices. Verify the running result as part of release acceptance.

Example: Prepare a staging environment

A team gives staging its own public domain and backing-service choices. The generated material reflects those choices, allowing the team to review the topology before putting that version into use.

For engineers

Keep authored intent separate from rendered material

Environment configuration identifies where and how the application runs. Application service declarations identify the frontend, backend and supporting processes. The deployment generator combines them into runtime-specific output.

InputProduced material
Environment runtimeCompose or Kubernetes deployment files
Application service inventoryPer-service workload configuration and image references
Public domain and service hostsPublic routing for the selected services
Backing-service choicesSelf-hosted service composition or externally supplied connection configuration
Deployment branch and service DockerfilesEnvironment-specific release workflow

Rendered deployment directories can contain secrets and are generated with an ignore-all .gitignore. Review authored configuration and secret-bearing output as different kinds of material.

Generate, then validate the persisted output

These CLI commands generate the selected environment configuration and validate the emitted application deployment artifacts. They are shown for the reader; no deployment is performed by this website example.

wildo config sync --env production --domain config
wildo config validate --env production --domain manifest --deployment-artifacts

The deployment-artifact check reads persisted Kubernetes YAML and checks resource identities and basic structure. It does not contact a cluster or establish that the application is ready to serve traffic.

Keep operational acceptance explicit

Review image references, secret delivery, public routing and backing-service connectivity. Then verify rollout and application behavior on the target runtime. A generated manifest is useful deployment material; its existence is not evidence that infrastructure has been provisioned or a release has become healthy.

Describe each environment deliberately

Give local development, staging and production their own hosting and service choices without describing a different application each time.

Public addresses, deployment runtime and backing services become explicit inputs to the files Wildo produces.

An application has separate local, staging and production environment choices.

Make the differences visible

Choose the runtime

Select the deployment form appropriate to the environment. Compose and Kubernetes have distinct output and operating requirements.

Name the public surfaces

Assign application, documentation and website hosts under the environment’s public domain.

Place the backing services

Choose self-hosted or managed dependencies where supported. Keep connection and provisioning responsibilities clear.

Example: Mirror the public layout in staging

The application uses an app subdomain, documentation uses a docs subdomain and the website uses the domain itself. Staging retains that layout under a separate public domain.

For engineers

Connect hosts, deployment and backing services

This selected Wonder Todos staging configuration retains its actual public helpers and values. Additional provider, backing-service, logging and CSP settings are omitted.

import {
  defineInfraEnvConfig,
  WildoEnvironment,
  WildoDeploymentRuntime,
  WildoLocationType,
  BackingServiceSource,
} from '@wildo-ai/platform-config-lib';
import { RuntimeEnvironment } from '@wildo-ai/saas-models';

export default defineInfraEnvConfig({
  environment: WildoEnvironment.STAGING,
  locationType: WildoLocationType.REMOTE,
  runtime: WildoDeploymentRuntime.DOCKER_COMPOSE,
  runtimeEnvironment: RuntimeEnvironment.STAGING,
  publicDomain: 'staging.wonder-todos.com',
  serviceHosts: {
    app: 'app', docs: 'docs', website: '',
  },
  deployment: {
    branch: 'staging',
    runtime: WildoDeploymentRuntime.DOCKER_COMPOSE,
  },
  backingServices: {
    mongodb: { source: BackingServiceSource.MANAGED, provider: 'atlas' },
    redis: { source: BackingServiceSource.SELF },
  },
});

website: '' selects the domain apex. The application and documentation receive their own host labels. These choices must agree with browser origins, reverse-proxy routing and deployment configuration.

Distinguish selection from provisioning

A managed backing-service entry chooses an external dependency. It is not proof that an account or database has been created. A self-hosted selection informs service composition; it still needs appropriate storage, credentials and operations.

The platform database and the application’s database are separate configuration choices. Changing a database selection does not migrate or transfer existing data.

Verify the environment as a connected whole

Inspect public URLs, internal service endpoints and the target runtime together. Check that each service reaches the intended environment’s dependencies and that its public links do not lead into another environment.

Inspect what will run together

See the application services, their network connections and the runtime settings they need in concrete deployment files.

The output follows the declared service types, giving frontends, backends and supporting processes their appropriate place.

Application services connect frontend, backend and storage.

Make the topology reviewable

Identify the workloads

Generated workloads distinguish public frontends, backend services, workers and scheduled supporting processes.

Connect the routes

Service and ingress definitions carry traffic toward the intended workload and public host.

Separate sensitive material

Runtime secret resources accompany deployment output. Keep their handling separate from ordinary source configuration.

Example: Review a public frontend and its backend

The frontend serves the browser application while API traffic reaches the backend. The team checks both routing and runtime configuration before accepting the deployment.

For engineers

Recognize the output for each runtime

The generator writes under .wildo-saas/deploy/<environment>/k8s/ or compose/. Kubernetes output includes workload and service definitions, per-host routing and target-specific secret resources. Workers receive their service interface; minions are supporting process workloads.

Self-hosted backing-service population follows configuration. A managed selection does not require a duplicate self-hosted container solely to occupy the same category.

Inspect a concrete workload contract

The following selected Kubernetes frontend template excerpt preserves the source’s security, port and resource settings. Template image variables are intentionally shown: this is source input to rendering, not an already rendered manifest. Writable mounts and probes are omitted here.

- name: frontend
  image: {{imageRegistry}}/{{serviceName}}:{{imageTag}}
  imagePullPolicy: {{default imagePullPolicy 'Always'}}
  securityContext:
    allowPrivilegeEscalation: false
    readOnlyRootFilesystem: true
    capabilities:
      drop:
        - ALL
  ports:
    - name: http
      containerPort: 80
      protocol: TCP
  resources:
    requests:
      cpu: "50m"
      memory: "64Mi"
    limits:
      cpu: "250m"
      memory: "128Mi"

The static frontend has its own resource profile and HTTP probes in the full template. These settings are a workload contract, not a description of every backend or worker container.

Review secrets without turning them into source assets

The generator separates secret resources and adds an ignore-all file to its output directory. Kubernetes base64 encoding is not encryption. Limit access to rendered output and use the intended secret-delivery process for the target environment.

Check that the image actually used, the service port, writable mounts and probes agree. A syntactically valid workload can still reference an unavailable image or an incorrect endpoint.

Carry the release into deployment

Connect the application’s service images and environment choices to a repeatable release workflow.

Generated workflow files provide a concrete starting point. The operating team supplies the destination access and verifies the deployed result.

Generation leads to review of environment choices and deployment.

Make the release path explicit

Produce the service images

Use the service Dockerfiles and selected environment to define the images a release needs.

Follow the runtime’s workflow

Kubernetes and Compose have different deployment steps. Review the generated workflow for the runtime being used.

Check the application after delivery

Confirm that workloads are ready and the important application journeys work on the intended public addresses.

Example: Release a new application version

The workflow produces frontend and backend images. The team confirms that deployment references the intended versions, then checks readiness and a representative user journey.

For engineers

Inspect the generated workflow

The workflow generator writes .github/workflows/deploy-<environment>.yml from deployment configuration and the application’s service Dockerfiles.

RuntimeGenerated workflow behaviorOperator responsibility
KubernetesGenerate artifacts, build and push service images for linux/amd64 and linux/arm64, install ingress/TLS controllers and apply manifestsTarget access, prerequisites, image alignment and rollout acceptance
Docker ComposeGenerate artifacts, then build and push service images for linux/amd64 and linux/arm64 to the registry the Compose file pulls fromComplete the commented remote deployment step (an SSH example is provided) for the intended host

There is no general wildo deploy command behind this description. Inspect the actual generated workflow rather than assuming both runtime paths perform the same remote operation.

Keep the image being built and the image being deployed aligned

The CI workflow and manifest renderer have distinct image-tag inputs. The current config-sync call does not supply the renderer’s optional imageTag, so do not assume that generated manifests are pinned to the CI commit merely because the workflow builds a commit-tagged image.

Review emitted image references against the images pushed for that release. Treat a successful image build and a correct deployed image as separate checks.

Separate offline validation from runtime acceptance

wildo config validate --env production --domain manifest --deployment-artifacts

This validates persisted application YAML without deploying. Cluster admission, rollout readiness, application health and recovery remain target-runtime checks. Include the intended backing-service access and a representative authenticated operation in release acceptance.

Read Docker or Kubernetes for the runtime mechanisms and managed backing services for the dependencies around the application.

One application model, deliberate deployment choices.

The service structure travels with the application. Wildo turns environment decisions into concrete deployment material, while the operating team retains control of where it runs and how each release is accepted.

Building a B2B product or an internal tool?

Wildo is not self-service yet. Tell us what you have in mind and we will say plainly whether it fits, and what happens next.