Workflows
Save commands and multi-step processes — shell, agent, and render steps with inputs, secrets, schedules, and artifacts.
Workflows let you save commands, scripts, and multi-step processes and run them without rebuilding the same setup every time. Think of them as a task runner that lives next to your agents — with agent steps as a first-class citizen.
Opening the Workflows panel
Press Cmd+Shift+R (macOS) or Ctrl+Shift+R (Windows/Linux) to toggle the Workflows panel.
Where workflows come from
| Source | Location | Shared with team? |
|---|---|---|
| Shared | .hob/workflows/ in your repo | Yes |
| Private | Per-project personal config | No |
| Global | Available in every project | No |
| Discovered | package.json scripts, Makefile, justfile, Taskfile.yml | Read-only |
Discovered workflows appear automatically alongside your saved ones — click play to run any of them.
Creating a workflow
- Open the Workflows panel
- Click
+ - Fill in a name and command, choose a scope (shared, private, or global)
- Save
Each saved workflow is a single YAML file:
name: Build & Test
command: npm run build && npm test
category: CI/CDFor advanced workflows, open the YAML editor and edit the full definition directly. Workflow files reload automatically when they change on disk.
Multi-step workflows
Use steps instead of command. Steps run in sequence — shell commands, agent prompts, file renders, or calls to other workflows:
name: Release
inputs:
target:
description: Deploy target
type: choice
options: [staging, production]
default: staging
steps:
- name: Build
run: npm run build
- name: Review
agent:
prompt: Review the diff for release blockers
model: sonnet
- name: Deploy
run: ./scripts/deploy.sh ${{ inputs.target }}| Step type | What it does |
|---|---|
run | Shell command in a PTY with full color output |
detach | Launch a background process and move on |
agent | Send a prompt to an agent pane — pick backend, model, effort, permission mode |
render | Open a file in a render pane (reports, previews) |
workflow | Call another saved workflow as a child run |
Steps can pass data forward — ${{ steps.build.outputs.tag }}, ${{ steps.test.exit_code }} — and gate on conditions with if:. Failures stop the run unless a step sets on_error: continue or on_error: retry.
Inputs
Declare inputs and hob prompts for them before the run starts:
inputs:
tag:
description: Version tag
type: string
confirm:
description: Really deploy?
type: boolTypes are string, choice (pick from options), and bool. Mark an input secret: true for a password-style field that is scrubbed from logs and history.
Secrets
Secrets are encrypted at rest, scrubbed from workflow output and history, and never expanded in agent prompts. Manage them in the Workflows panel, then reference them:
steps:
- name: Push
run: ./deploy.sh
env:
TOKEN: "${{ secrets.DEPLOY_TOKEN }}"Resolution order is project secret first, then global. Keep secret-bearing actions in run steps and pass only scrubbed outputs back to agents.
Scheduling
Workflows can run on a schedule with human-readable interval rules:
name: health-check
on:
schedule:
- every: 1d
at: "09:00"
- every: 2w
weekday: tue
at: "09:00"
steps:
- name: Check
run: ./scripts/health-check.shHow scheduling behaves:
- Scheduled workflows fire only while the project is open in hob — there is no background daemon
- Missed runs are not replayed later; the schedule resumes at the next future occurrence
- If a fire would overlap a still-running copy of the same workflow, hob skips it
- With the same project open in multiple windows, exactly one window owns the scheduler — no duplicate runs
Scheduled workflows must be non-interactive: no inputs: and no pty-input: true.
Artifacts
Record files or directories alongside a run — build outputs, reports, coverage:
artifacts:
- path: dist/
name: build-outputShell steps can also declare them at run time with ::set-artifact path=dist/report.html::build report.
Run history
Every run is recorded. The Workflows panel shows recent runs; multi-step runs show per-step status, duration, outputs, and artifacts. Runs appear in Activity unless you mute a workflow there.