Skip to content

Your first Bob day

In about 15 minutes, you will capture two tasks in a synthetic gardening vault, choose one for today's work, finish it, and inspect the review queue. Use one Bash terminal so the variables below remain available. This path exercises the Bob CLI; reviewing a task is a separate desktop continuation.

Before you start

Install Bob from a checkout of the public bob-cli repository. The commands below start from that checkout's root. They always copy the bundled demo into a new temporary directory and select that copy explicitly, even when BOB_DIR already points somewhere else.

1. Copy and select a fresh demo vault

set -euo pipefail
BOB_TUTORIAL_SOURCE="$PWD/examples/demo-vault"
BOB_TUTORIAL_TMP="$(mktemp -d "${TMPDIR:-/tmp}/bob-first-day.XXXXXX")"
BOB_TUTORIAL_VAULT="$BOB_TUTORIAL_TMP/vault"
mkdir -p "$BOB_TUTORIAL_VAULT"
cp -R "$BOB_TUTORIAL_SOURCE/." "$BOB_TUTORIAL_VAULT/"
export BOB_DIR="$BOB_TUTORIAL_VAULT"
printf 'Using demo vault: %s\n' "$BOB_DIR"
Output
Using demo vault: /temporary/path/bob-first-day.xxxxxx/vault

The output path is new for this run. Bob will use that copy rather than your default vault. The fixture includes two areas, a project, and a synthetic reference; your captures will add two tasks.

2. Capture an inbox task

bob capture 'Sort the seed packets @mac_inbox^seed-packet'
Output
✓ captured  mac_inbox.md
  - [ ] #task Sort the seed packets [created::2026-10-20] ^seed-packet

The ^seed-packet block ID gives this task a stable link target. Bob does not stamp a new task as reviewed, so it enters the freshness review queue.

3. Route another task to the garden

bob capture 'Water the seedlings @garden^seedlings'
Output
✓ captured  garden.md
  - [ ] #task Water the seedlings [created::2026-10-20] ^seedlings

The route writes to garden.md; the ID makes the task easy to link from the daily ledger. New unstamped tasks enter review even when they live in an area.

4. Inspect the plan

bob plan

The plan reads the selected vault and today's ledger. The fixture does not include a dated daily note yet, so Bob reports an empty Today list. Bob does not create daily files for you.

5. Create today's daily-note skeleton

Create the ledger before starting a session. This step requires Bash: it uses Bash-specific [[ ... =~ ... ]] and BASH_REMATCH, and the tutorial runner executes fences in a persistent Bash session. The command honors Bob's fixed BOB_NOW clock when one is set and otherwise uses your local date.

if [[ "${BOB_NOW:-}" =~ ^([0-9]{4}-[0-9]{2}-[0-9]{2}) ]]; then
  BOB_TUTORIAL_DAY="${BASH_REMATCH[1]}"
else
  BOB_TUTORIAL_DAY="$(date +%F)"
fi
BOB_TUTORIAL_YEAR="${BOB_TUTORIAL_DAY%%-*}"
BOB_TUTORIAL_COMPACT="${BOB_TUTORIAL_DAY//-/}"
BOB_TUTORIAL_DAILY="$BOB_DIR/$BOB_TUTORIAL_YEAR/$BOB_TUTORIAL_COMPACT.md"
mkdir -p "$(dirname "$BOB_TUTORIAL_DAILY")"
cat > "$BOB_TUTORIAL_DAILY" <<EOF
# Sprout Shed — $BOB_TUTORIAL_DAY

## Pomodoros
EOF
export BOB_DAY_FILE="$BOB_TUTORIAL_DAILY"
printf 'Created daily note: %s\n' "$BOB_TUTORIAL_DAILY"

The ledger starts with an empty ## Pomodoros section. Bob needs this file and section before it can add today's work.

6. Start a named Pomodoro

bob capture '=#focus'

The named FOCUS session is now open. Starting it alone does not change a task to Pending or mark a task as Today; Today comes from a Task Link in an open Pomodoro.

bob capture '@garden:seedlings'
bob plan -f json

The task stays in garden.md and becomes Next. Its dedicated Task Link is a direct child of the open FOCUS Pomodoro, so bob plan now includes it in Today. Lane status and Today are separate facts: the task line records Next, while the open ledger link records today's work.

8. Finish the linked task

bob capture 'x!'

x! closes the open Pomodoro and completes its one linked task. The zero-minute outcome belongs to the automated fixed-clock replay (BOB_NOW); a human following these instructions normally uses their local clock and records real elapsed minutes. No time is invented. The completed task leaves Today while the inbox task remains open for review.

9. Inspect the review queue

bob freshness list -f json

This read-only list includes the unfinished inbox task because it has not been confirmed. The freshness command inspects the queue; answering it is a desktop continuation with Bob's Obsidian plugins.

Continue

The terminal path ends here. Continue on the desktop with the same demo copy:

Then read the contracts this tutorial exercised:

Tested rolling snapshot bob-cli 41afa14 bob-mac-capture 556bb67 bob-plugins af1e691 Built 2026-10-24T22:34:13Z (zensical) build.json