Skip to content

The Studio ​

The Studio is your authoring workspace for building and testing scenarios. It provides a live environment where you can design, configure, and validate your labs.

Accessing the Studio ​

From Tracks & Scenarios, you can:

  • Click Open Studio to create a new scenario
  • Click Open in Studio on an existing scenario

Studio Overview ​

The Studio interface is organized in three areas:

  • Header: Scenario name (click to rename), Run/Stop buttons, user menu
  • Left sidebar: Navigation between views (Canvas, Interfaces, Instructions, Variables, Secrets, Post-Deploy, Start Order, Details). Available views depend on the selected skill level (Beginner, Intermediate, Advanced).
  • Main content area: Changes based on the selected view
  • Status bar (bottom): Total resource usage and component count

Header Controls ​

ElementDescription
Scenario NameClick to rename the scenario
RunStart the studio environment to test
StopStop the running environment
User MenuAccount settings, logout

Studio Views ​

Canvas ​

The visual designer for your scenario's infrastructure.

Features:

  • Drag and drop components
  • Draw connections between components
  • Select and configure components
  • Pan and zoom the canvas

Canvas Toolbar:

ButtonAction
+ AddOpen component catalog
FitFit all components in view
ResetReset zoom and position

Component Interactions:

  • Click: Select component
  • Double-click: Open configuration modal
  • Drag: Move component
  • Edge drag: Create connection

Interfaces ​

Access your running components' terminals and web UIs.

When the studio is running:

  • Tabs appear for each component's configured interfaces
  • Terminal tabs provide shell access
  • Web UI tabs show HTTP interfaces

Instructions ​

Write and manage step-by-step guidance for participants.

Features:

  • Add, edit, delete instructions
  • Drag to reorder
  • Markdown preview with syntax highlighting
  • Tab navigation link testing

See Writing Instructions for details.

Post-Deploy ​

Configure scripts that run after components deploy.

Use Cases:

  • Database initialization
  • Sample data loading
  • Configuration setup

Format:

bash
#!/bin/bash
# Wait for service
until pg_isready; do sleep 1; done

# Initialize
psql -f /scripts/init.sql

Variables ​

Define variables that can be used in instructions, environment variables, files, and Helm values.

Features:

  • Create named variables
  • Values resolved at runtime
  • Reference using {{variable_name}} syntax

Built-in Runtime Variables:

VariableDescription
{{$namespace}}Kubernetes namespace for this run
{{$runId}}Unique run identifier
{{$scenarioId}}Scenario identifier
{{$self}}Current component's service name
{{$self:fqdn}}Current component's internal FQDN
{{$self:public}}Current component's public hostname

Component References:

PatternDescriptionExample
{{kafka}}Internal service namekafka
{{kafka:fqdn}}Internal FQDNkafka.ns.svc.cluster.local
{{kafka:public}}Public hostname (ingress)kafka-abc12345.snapbench.io
{{kafka:public:9092}}Public hostname (validates port)kafka-abc12345.snapbench.io

Secret References:

Reference secret values stored in the Secrets view:

PatternDescription
{{secret:my-license:key}}Value of key key from secret my-license
{{secret:db-creds:password}}Value of key password from secret db-creds

Helm Service References:

For Helm components with multiple services:

PatternDescription
{{kafka:broker}}Service name from Helm metadata
{{kafka:broker:fqdn}}Service FQDN
{{kafka:broker:public}}Service public hostname

Use Cases:

VariableValueUse
db_host{{postgres}}Internal connection
public_url{{$self:public}}Kafka advertised listeners
LICENSE_KEY{{secret:license:key}}Inject license from secret

Start Order ​

Control the sequence in which components deploy.

Why Order Matters:

  • Databases should start before apps
  • Message brokers before producers
  • Dependencies before dependents

Interface:

  • Drag components to reorder
  • Components with same order start in parallel

Secrets ​

Manage sensitive data for your scenario. Secrets are stored encrypted and can be referenced in environment variables, Helm values, and files.

Creating Secrets:

  1. Go to the Secrets view
  2. Click Add Secret
  3. Choose secret type:
    • Opaque: Key-value pairs for generic secrets
    • Docker Registry: Credentials for private container registries
    • TLS: Certificate and private key
    • Basic Auth: Username and password

Referencing Secrets in Templates:

Use the {{secret:name:key}} syntax to inject secret values:

yaml
# In environment variables
env:
  LICENSE_KEY: "{{secret:my-license:key}}"
  DB_PASSWORD: "{{secret:db-creds:password}}"

# In Helm values
auth:
  password: "{{secret:postgres-auth:password}}"

Examples:

Secret NameKeyTemplateUse Case
my-licensekey{{secret:my-license:key}}Software license
db-credspassword{{secret:db-creds:password}}Database password
api-keysstripe{{secret:api-keys:stripe}}API key

TIP

Secret values are resolved at runtime when the component starts. The actual values are never exposed in the UI or logs.

Details ​

Edit scenario metadata:

FieldDescription
NameScenario display name
DescriptionWhat this scenario teaches
Default TTLHow long runs last

Adding Components ​

From the Catalog ​

  1. Click + Add in the Canvas toolbar
  2. Browse or search components
  3. Click to add to canvas
  4. Position on canvas

Component Configuration ​

Double-click a component to configure:

General Tab:

  • Label (identifier for tab links)
  • Description

Resources Tab:

  • CPU (millicores)
  • Memory (MiB)

Environment Tab:

  • Environment variables
  • Format: KEY=value

Secrets Tab:

  • Sensitive values
  • Stored encrypted

Tabs Tab:

  • Configure terminal access
  • Configure web UI access

Helm Values Tab: (Helm components)

  • Override default values.yaml

Compose Tab: (Compose components)

  • Edit docker-compose.yaml

Creating Connections ​

Connections visualize relationships between components.

To Create:

  1. Hover over a component edge
  2. Drag to another component
  3. Release to create connection

To Delete:

  1. Click on the connection line
  2. Press Delete or use context menu

INFO

Connections are purely visual -they don't affect deployment or networking.

Testing Your Scenario ​

Starting the Environment ​

  1. Click Run in the header
  2. Wait for components to provision
  3. Status bar shows progress

Using Interfaces ​

Once running:

  1. Switch to Interfaces view
  2. Click component tabs to access
  3. Test your instructions step-by-step

Verifying Instructions ​

  1. Go to Instructions view
  2. Click tab navigation links
  3. Verify they switch to correct tabs
  4. Copy code blocks and test commands

Stopping the Environment ​

Click Stop when finished. Resources are cleaned up automatically.

Auto-Save ​

The Studio auto-saves your work:

  • Changes saved automatically
  • No manual save required
  • Status shown in header

Keyboard Shortcuts ​

ShortcutAction
DeleteDelete selected component
EscapeDeselect / Close modal
Ctrl/Cmd + ZUndo (canvas changes)

Workflow Tips ​

Build Incrementally ​

  1. Add one component
  2. Configure and test
  3. Add next component
  4. Repeat

Test Early, Test Often ​

Don't wait until everything is built to test. Run the environment frequently to catch issues early.

Use Labels Consistently ​

Component labels appear in:

  • Tab links in instructions
  • Interface tabs
  • Logs and debugging

Good labels: kafka, postgres, api Bad labels: component1, my-thing

Troubleshooting ​

Component Won't Start ​

SymptomCauseSolution
Pending foreverNot enough resourcesReduce CPU/memory
ImagePullBackOffImage not foundCheck image name
CrashLoopBackOffApp crashCheck logs in terminal

Terminal Won't Connect ​

IssueCheck
"Pod not found"Pod selector matches actual labels
"Container not found"Container name is correct
Connection timeoutPod is in Running state

Web UI Shows Error ​

IssueCheck
Blank pageService is ready
Connection refusedPort number is correct
404 errorPath is correct

Instructions Don't Render ​

IssueCheck
Raw markdown shownSyntax is correct
Tab link not workingComponent label matches
Code not highlightedLanguage specified

Next Steps ​

Released under the MIT License.