Kubeasy LogoKubeasy

Dev Commands Reference

Complete reference for the kubeasy dev commands used by challenge creators to scaffold, deploy, validate, and iterate on challenges locally.

Last updated: February 23, 2026GitHubView on GitHub

The kubeasy dev commands are designed for challenge creators. They let you work entirely locally — no API login, no OCI registry, no backend required.

A typical challenge development loop looks like this:

# 1. Scaffold a new challenge
kubeasy dev create

# 2. Edit challenge.yaml, manifests/, and policies/
#    (use your editor of choice)

# 3. Lint your challenge.yaml (no cluster needed)
kubeasy dev lint

# 4. Deploy to the Kind cluster and run validations
kubeasy dev test --clean

# 5. Iterate: watch mode re-runs validations on every change
kubeasy dev apply --watch    # in one terminal
kubeasy dev validate --watch # in another terminal

# 6. Check pod state and logs while debugging
kubeasy dev status
kubeasy dev logs --follow

# 7. Clean up when done
kubeasy dev clean

Command reference

kubeasy dev create

Scaffold a new challenge directory with a challenge.yaml template and the required folder structure (manifests/, policies/).

In interactive mode (TTY), prompts guide you through the setup. In non-interactive mode, use flags.

Flags:

FlagTypeDefaultDescription
--namestringChallenge name
--slugstringChallenge slug (auto-generated from name if omitted)
--typestringChallenge type (fix, build, migrate)
--themestringChallenge theme
--difficultystringDifficulty (easy, medium, hard)
--estimated-timeint30Estimated time in minutes
--with-manifestsboolfalseGenerate starter deployment and service manifests

Usage:

kubeasy dev create
kubeasy dev create --name "Pod Evicted" --type fix --theme resources-scaling --difficulty easy
kubeasy dev create --name "My Challenge" --with-manifests

Example (interactive):

$ kubeasy dev create
Challenge name: Pod Evicted
Slug [pod-evicted]:
Type (fix/build/migrate): fix
Theme: resources-scaling
Difficulty (easy/medium/hard): easy
Estimated time (minutes) [30]: 15

Created challenge directory: pod-evicted/
  pod-evicted/challenge.yaml
  pod-evicted/manifests/
  pod-evicted/policies/

kubeasy dev get

Display local challenge metadata by reading challenge.yaml from the local directory. No cluster or API required.

This is the dev equivalent of kubeasy challenge get.

Flags:

FlagTypeDefaultDescription
--dirstringPath to challenge directory (default: auto-detect)

Usage:

kubeasy dev get
kubeasy dev get --dir ./my-challenge

Example:

$ kubeasy dev get

Pod Evicted

Slug:        pod-evicted
Type:        fix
Theme:       resources-scaling
Difficulty:  easy
Est. time:   15 min
Objectives:  2

Description:
A data processing pod keeps crashing and getting evicted.
It was working fine yesterday.

Initial Situation:
A data processing application is deployed as a single pod.
The pod starts but gets killed after a few seconds.

Objective:
Make the pod run stably without being evicted.

Validation Objectives
  ORDER   KEY                TITLE          TYPE
  1       pod-running        Pod Ready      condition
  2       no-crash-events    Stable Op.     event

kubeasy dev lint

Validate the structure and content of a challenge.yaml file. Checks required fields, valid values, objective structure, and manifests directory. No cluster needed.

Flags:

FlagTypeDefaultDescription
--dirstringPath to challenge directory (default: auto-detect)

Usage:

kubeasy dev lint
kubeasy dev lint --dir ./my-challenge

Example (passing):

$ kubeasy dev lint
Linting challenge: pod-evicted

✓ All checks passed (0 errors, 0 warnings)

Example (with issues):

$ kubeasy dev lint
Linting challenge: pod-evicted

✗ ERROR: missing required field "objective"
⚠ WARNING: estimated_time is 0, consider setting a value

1 error, 1 warning

kubeasy dev apply

Deploy local challenge manifests to the Kind cluster. This is the dev equivalent of kubeasy challenge start but reads from the local filesystem instead of the OCI registry. No API login required.

If an image/ directory exists, the Docker image is built and loaded into the Kind cluster automatically.

Flags:

FlagTypeDefaultDescription
--dirstringPath to challenge directory (default: auto-detect)
--cleanboolfalseDelete existing resources before applying
--watch, -wboolfalseWatch for file changes and auto-redeploy

Usage:

kubeasy dev apply
kubeasy dev apply --clean
kubeasy dev apply --watch

Example:

$ kubeasy dev apply --clean
Applying challenge: pod-evicted

Cleaning existing resources
Creating namespace pod-evicted
Applying manifests
Kubectl context configured

Challenge deployed!
Namespace: pod-evicted

kubeasy dev validate

Run challenge validations against the Kind cluster and display results. Does not send results to the API. No login required.

Flags:

FlagTypeDefaultDescription
--dirstringPath to challenge directory (default: auto-detect)
--watch, -wboolfalseRe-run validations every 5 seconds
--fail-fastboolfalseStop at the first validation failure
--jsonboolfalseOutput results as JSON

Usage:

kubeasy dev validate
kubeasy dev validate --watch
kubeasy dev validate --fail-fast --json

Example:

$ kubeasy dev validate
Validating challenge: pod-evicted

Condition Validation
  pod-running: PASSED - All condition checks passed

Event Validation
  no-crash-events: PASSED - No forbidden events found

All validations passed! (2/2)

JSON output (for CI):

$ kubeasy dev validate --json
{
  "passed": true,
  "results": [
    {"key": "pod-running", "passed": true, "message": "All condition checks passed"},
    {"key": "no-crash-events", "passed": true, "message": "No forbidden events found"}
  ]
}

kubeasy dev test

Apply manifests and run validations in one step. Equivalent to running kubeasy dev apply followed by kubeasy dev validate.

Flags:

FlagTypeDefaultDescription
--dirstringPath to challenge directory (default: auto-detect)
--cleanboolfalseDelete existing resources before applying
--watch, -wboolfalseRe-run validations every 5 seconds after apply
--fail-fastboolfalseStop at the first validation failure
--jsonboolfalseOutput results as JSON

Usage:

kubeasy dev test
kubeasy dev test --clean
kubeasy dev test --clean --watch

Example:

$ kubeasy dev test --clean
Applying challenge: pod-evicted

Cleaning existing resources
Creating namespace pod-evicted
Applying manifests

Validating challenge: pod-evicted

Condition Validation
  pod-running: PASSED - All condition checks passed

Event Validation
  no-crash-events: PASSED - No forbidden events found

All validations passed! (2/2)

kubeasy dev status

Show pods, recent events, and objective count for a deployed challenge. Requires the challenge to be deployed in the Kind cluster.

Flags:

FlagTypeDefaultDescription
--dirstringPath to challenge directory (default: auto-detect)

Usage:

kubeasy dev status

Example:

$ kubeasy dev status

Pods
  NAME                      STATUS    READY   RESTARTS   AGE
  data-processor-abc12      Running   1/1     0          2m

Events (last 5m)
  AGE   TYPE     REASON    MESSAGE
  2m    Normal   Pulled    Successfully pulled image "myapp:latest"
  2m    Normal   Started   Started container app

Objectives: 3

kubeasy dev logs

Stream logs from pods in the challenge namespace. Attempts to find relevant pods from challenge.yaml label selectors, falling back to all pods.

Flags:

FlagTypeDefaultDescription
--dirstringPath to challenge directory (default: auto-detect)
--follow, -fboolfalseFollow log output (stream continuously)
--container, -cstringTarget a specific container
--tailint50Number of recent log lines to show

Usage:

kubeasy dev logs
kubeasy dev logs --follow
kubeasy dev logs --tail 100 --container app

Example:

$ kubeasy dev logs --follow
[data-processor-abc12] 2024-01-15T10:30:00Z Starting data processor...
[data-processor-abc12] 2024-01-15T10:30:01Z Connected to database
[data-processor-abc12] 2024-01-15T10:30:02Z Processing batch 1/10...

kubeasy dev clean

Remove all Kubernetes resources for a dev challenge (deletes the namespace). No API login required.

This is the dev equivalent of kubeasy challenge clean.

Usage:

kubeasy dev clean

Example:

$ kubeasy dev clean
Cleaning challenge: pod-evicted

Deleting namespace pod-evicted

Challenge 'pod-evicted' cleaned successfully!

On this page