Bob Navigation Hotkeys registers the read-only `obsidian://bob-open-notes` handler for a batch of notes. It queues whole URLs and starts each URL only after the previous URL finishes. Within one URL, entries open in parameter order; the first successful entry becomes primary. The handler never writes the vault.

An already open note is reused in any window, including a background tab Obsidian has not loaded yet. Main-area tabs take precedence over sidebar tabs. If the first entry is not open and the active leaf is empty, it opens there. Otherwise, the handler appends a new tab at the far right of the active tab group. The first successfully opened entry is primary; other notes open in the background, and the primary tab ends active. A supplied line receives a caret at column 0 and a brief accent highlight. The handler waits up to two seconds for Bob's writes to appear in Obsidian.

## URI v1

```
obsidian://bob-open-notes?count=<1..8>&path1=<absolute>[&line1=<n>][&ref1=<LINE:digest>][&block1=<id>]…[&total=<n>]
```

| Parameter | Rule |
| --- | --- |
| `count` | Required integer from 1 through 8. |
| `pathK` | Required for every entry; absolute filesystem path. |
| `lineK` | Optional positive, 1-based line. |
| `refK` | Optional only with `lineK`; match `^[1-9][0-9]*:[0-9a-f]{8}$`. |
| `blockK` | Optional; match `^[A-Za-z0-9-]+$`. |
| `total` | Optional original note count, at least `count`; used when the client truncates to eight entries. |
| Other parameters | Ignored. |

Indexed keys avoid relying on how Obsidian handles repeated query keys. Values use RFC 3986 encoding: unreserved characters and `/` stay literal; encode other bytes, including `+`, `&`, `=`, `#`, `%`, `:`, and spaces.

## Re-finding lines and failures

For each entry, the handler maps the absolute path into the vault and waits for the file to resolve. When `ref` is present, it reads the open editor buffer or Obsidian's cached text, then re-finds the line by planned position, optional block ID, and unique line digest. If the digest is not visible by the shared two-second deadline, it opens near the clamped planned line and shows a changed-capture notice.

A missing path or a path outside the vault fails independently; the other entries continue.

| Notice | When |
| --- | --- |
| `Bob Open: invalid link` | A required or optional URI parameter is malformed. |
| `Bob Open: <path> is outside this vault` | The absolute path does not map inside the vault. |
| `Bob Open: <vault path> not found` | The path did not resolve to a file by the deadline. |
| `Bob Open: could not open <name>` | Obsidian could not open a resolved file. |
| `Bob Open: opened N of M notes` | `total` was supplied because the client truncated a longer list. |
| `Task changed since capture — landed near line N` | A line digest was not visible by the deadline. |

URI activation is a manual GUI check. For synthetic notes on a Mac:

```
open 'obsidian://bob-open-notes?count=2&path1=%2Fvault%2Fprojects%2Fsample.md&line1=42&ref1=42%3A35a733bd&path2=%2Fvault%2Fdaily%2Fsample.md&line2=18'
```

## Related

- [Go to task URI](<https://bobs-org.github.io/reference/plugins/goto-task-uri/index.md>) — open one note and land on a line.
- [Bob Navigation Hotkeys](<https://bobs-org.github.io/reference/plugins/bob-navigation-hotkeys/index.md>) — the URI handler's plugin.
