Shell on a declared container or VM. Native PowerShell on Windows VMs — no Guacamole needed.
Gotcha: without cmd:, the shell opens as root. Use cmd: su - <user> to drop into a non-root account, or cmd: screen -xRR to auto-attach to a multi-pane session.
HTTP server on a declared host port. Routes through Instruqt’s proxy.
Gotcha: client-side fetch() calls must use relative paths only. The browser cannot resolve internal Docker hostnames. For iframe-blocking apps: use custom_response_headers: to strip X-Frame-Options and Content-Security-Policy.
File or directory editor on a declared host. Path can be a single file or a folder tree.
Pattern: pair an editable starter file with a second code tab pointing at a completed reference as a built-in hint. path: as a directory renders a folder-tree explorer.
Cloud console browser tied to a virtualbrowsers block.
Gotcha: requires a matching virtualbrowsers entry in config.yml. Use this for provisioned cloud consoles, not arbitrary URLs.
Embedded URL frame — an external site rendered inside the lab UI.
Use when: the destination is a vendor’s own web app the platform shouldn’t proxy or authenticate to.
External URL tab. Supports ${_SANDBOX_ID} interpolation in the URL.
Gotcha: URL must be HTTPS. An http:// URL causes instruqt track push to fail validation. Pair with new_window: true to pop a non-iframable site into its own window.
new_window: true to any tab to open it in a separate browser window instead of the lab’s tab strip — useful for cramped service tabs the learner wants to expand.tabs: is the display order. Index references in assignment markdown (button) are zero-based. Reserved tab IDs “assignment” and “feedback” are built-in; reference them in custom_layout without declaring.workdir: on terminal and code tabs sets the open directory per-tab — cleaner than per-challenge set-workdir when different challenges need different directories.code-server) are unaffected.service versus website: prefer service for in-sandbox apps when you want CSP-header stripping; use website for sandbox-public URLs, external SaaS forms, and anything needing new_window: true.