Appending Under a Specified Heading Using the Obsidian 1.15 CLI

Appending Under a Specified Heading Using the Obsidian 1.15 CLI

Obsidian 1.15 adds a heading option to CLI and URI appends. I tested where text is added, heading name matching, URI spacing, and behavior when a heading isn't found in a test vault, comparing with 1.14.5.
2026.11.03

This page has been translated by machine translation. View original

Hello! I'm Yuji Nishimura from the Ops team!

You can now specify where to append in Obsidian's today's daily note by using a heading such as "Log". This is handy when you want to leave a one-line result in the daily note at the end of a work script. Adding heading=Log to daily:append of the Obsidian CLI, which you operate from the terminal, appends to the end of that section.

The conventional daily:append, and append of the Obsidian URI, which you operate through dedicated obsidian://... links, appended to the end of the file. To specify a heading with these operations, you had to use a community plugin such as Advanced URI.

Obsidian 1.15, released publicly on November 2, 2026, added heading for specifying a heading to appends in the URI and CLI. In this article, I'll verify in a test Vault where the content is appended, how to specify the heading, spacing for controlling blank lines in the URI, and the behavior when the heading isn't found. I'll also compare it with 1.14.5.

Parameters added in 1.15

  • Target version / date: Obsidian 1.15.0 desktop (released ahead of time as an early access (Catalyst) version on 2026-10-22, and publicly on 2026-11-02)
  • Key changes: The changelog states that you can now append / prepend to a heading with the URI and CLI, and that you can control the line breaks before and after the appended content
  • Official documentation: In PR #1137 of the official help repository, the parameters were added to the Obsidian URI and Obsidian CLI pages
Route Target Parameters available in 1.15
URI new / daily actions heading (specified together with append or prepend), spacing=auto (default) / newline / inline
CLI append / prepend / daily:append / daily:prepend heading=<name>. Whether a line break is added is switched with the existing inline flag

How to write the CLI and URI for appending under a heading

To append to a heading in the daily note with the CLI, write it as follows. Enable the CLI and prepare ## Log and ## Tasks in today's daily note before running it. If today's note doesn't exist yet, set the headings in the template described below. For the third example, which specifies a regular note, Sample.md needs ## Log.

# Append to the end of the Log heading's section
obsidian daily:append heading=Log content="- 10:30 レビュー依頼に返信"

# Prepend to the beginning of the Tasks heading's section
obsidian daily:prepend heading=Tasks content="- [ ] 見積もりを送る"

# When specifying a note other than the daily note
obsidian append path=Sample.md heading=Log content="- 10:30 追記"

To use the obsidian command, enable the CLI in Obsidian's settings (Settings → General → Command line interface, as written in the official help) and register it in your PATH following the instructions. On macOS, /usr/local/bin/obsidian is created as a symbolic link to obsidian-cli inside the app. According to the official help, the CLI requires installer version 1.12.7 or later, and the Obsidian app must be running (if it isn't running, the first command launches it). If you have multiple Vaults, put vault= as the first parameter, like obsidian vault=<name> daily:append ....

For the URI, combine append=true (or prepend=true) with heading. For appending to an existing note, too, the URI uses the new action with append=true. For the daily note, use the daily action. If you add bullet points one line at a time, adding spacing=newline keeps blank lines from being inserted.

open "obsidian://daily?vault=HeadingTest&append=true&heading=Log&spacing=newline&silent=true&content=-%2011%3A00%20%E9%9B%BB%E8%A9%B1"

Replace vault with your own Vault name (this example uses the name of the test Vault). Values such as content need to be URL-encoded, and the example above appends - 11:00 電話. With silent=true, the appended note isn't opened.

Environment tested

  • macOS 26.7.2 (Apple silicon)
  • Obsidian 1.15.0 (installer version 1.12.7), and 1.14.5 for comparison
  • Test Vault "HeadingTest"
  • Core plugin Daily notes: folder Daily, format YYYY-MM-DD, template Templates/Daily

I didn't register it in the PATH and ran the in-app obsidian-cli (/Applications/Obsidian.app/Contents/MacOS/obsidian-cli) directly. With the normal CLI registration, a symbolic link to this file is created, so the command examples are written with obsidian. Most URIs were opened by passing them to obsidian-cli, like obsidian-cli "obsidian://new?...". I also opened one new example and one daily example with the open command, and confirmed that they append to the same position.

Appending to a daily note created from a template

If you run daily:append on a day when today's daily note doesn't exist yet, the daily note is created and then the content is appended. If no template is set, an empty note is created and you get a "heading not found" error (described later). So put the target headings in the template.

Templates/Daily.md
# {{date}}

## Tasks

## Log

## Memo

With no daily note for today, I ran the CLI three times.

obsidian daily:append heading=Log content="- 10:00 定例ミーティング"
obsidian daily:append heading=Log content="- 10:30 レビュー依頼に返信"
obsidian daily:prepend heading=Tasks content="- [ ] 見積もりを送る"
Added to: Daily/2026-11-03.md
Added to: Daily/2026-11-03.md
Added to: Daily/2026-11-03.md

The first run created the daily note from the template, and the content went straight under ## Log. The content of the second run followed on the line after the first.

Daily/2026-11-03.md
# 2026-11-03

## Tasks

- [ ] 見積もりを送る
## Log

- 10:00 定例ミーティング
- 10:30 レビュー依頼に返信
## Memo

In a section like the template's, where there is only a blank line under the heading, the content went in after that blank line. In the source, the line right after the appended line is ## Memo.

The next image shows the note opened in Obsidian after the appends. Tasks has a checkbox, and Log has two bullet lines.

The test Vault's daily note Daily/2026-11-03 opened in Obsidian 1.15.0. Under the Tasks heading is a checkbox for "見積もりを送る", under the Log heading are two bullet lines, "10:00 定例ミーティング" and "10:30 レビュー依頼に返信", and below them is the Memo heading

Where in the section the content goes

The range from a heading up to just before the next heading of the same or a higher level is treated as one section. Content added with append goes at the end of the section, and with prepend it goes right under the heading (if the line right after the heading is blank, after that blank line).

The next figure is a conceptual diagram I made myself, not an official architecture diagram. Whether you specify it from the CLI or the URI, the range to append to is the same. The ## Log section runs up to just before ## Notes, and includes the child heading ### 午後.

A self-made conceptual diagram of the append position when heading is specified. The CLI's append heading=Log and the URI's new action with append=true&heading=Log both enter the process in Obsidian 1.15 that looks for the heading Log. In Sample.md, the Log section runs from ## Log to just before ## Notes, and includes the child heading ### 午後. prepend goes right under ## Log, and append goes after the last line of ### 午後

To see the case with child headings and existing lines, I prepared a separate note, Sample.md.

Sample.md
---
tags: daily
---
# 2026-11-03

## Tasks
- [ ] 既存タスク

## Log
- 09:00 朝会

### 午後
- 13:00 レビュー

## Notes
メモ

I ran the following command.

obsidian append path=Sample.md heading=Log content="- 10:30 追記"

It went not right after ## Log, but after the last line of the child heading ### 午後.

Sample.md
 ### 午後
 - 13:00 レビュー
+- 10:30 追記
 
 ## Notes

With prepend heading=Tasks, it went right under the heading, and the existing task shifted back by one line.

Sample.md
 ## Tasks
+- [ ] 先頭に入るタスク
 - [ ] 既存タスク

Other conditions I checked and their results are as follows.

Condition Result
Nothing under the heading (the next heading comes right after) Both append and prepend go right under the heading
Section at the end of the file (no trailing newline) Goes after the last line, and no trailing newline is added
Including \n in content with the CLI Treated as a line break, and multiple lines go in
Adding inline with the CLI No line break; it is written continuing the last line of the section (メモ → メモ(inline で追記))

Conditions under which the name written in heading matches

I also checked what you can write in heading to get a match.

Specification Result
heading=Log Goes into the ## Log section
heading=log Case-insensitive; goes into the ## Log section
heading="## Log" Goes into the ## Log section even with the #
heading=午後 Goes into the child heading ### 午後 section, and stops before ## Notes
heading="Log#午後" Results in Error: Heading “Log#午後” not found in file., and the file doesn't change
heading=Log in a note with two ## Log headings of the same name Goes into the first ## Log section

Child headings can be specified by name alone, and the notation of tracing from the parent heading, like Log#午後, didn't match in 1.15.0. When there are two ## Log headings of the same name, the content went into the first section.

With the URI, choose how blank lines are inserted with spacing

If you omit spacing in the URI, it becomes auto, which puts one blank line between the content and the existing content. The result differs from the CLI default (a line break only).

open "obsidian://new?vault=HeadingTest&file=Sample&append=true&heading=Log&content=-%2010%3A30%20%E8%BF%BD%E8%A8%98"
Sample.md
 ### 午後
 - 13:00 レビュー
 
+- 10:30 追記
+
 ## Notes

A blank line goes between - 13:00 レビュー and - 10:30 追記. When I checked in Obsidian's reading view, the two items were still in the same list, but they were displayed as a "loose list" in which each item is wrapped in a paragraph (<p>). With spacing=newline, as with the CLI, it goes on the line right after the previous line, and the items didn't become paragraphs.

Sample.md
 ### 午後
 - 13:00 レビュー
+- 10:30 追記
 
 ## Notes

With spacing=inline, no line break is inserted, and just like the CLI's inline, it is written continuing the last line of the section.

When prepend=true is used with spacing omitted, the content goes right under the heading, with one blank line between it and the existing content.

Sample.md
 ## Tasks
+- [ ] 先頭
+
 - [ ] 既存タスク

Because auto inserts a blank line, it suits adding paragraphs. If you add bullet points or logs one line at a time, use newline.

When the heading isn't found

When the heading isn't found, neither the CLI nor the URI appends anything, and the file isn't changed. However, how the error is conveyed differs.

The CLI displays the error on standard output. In 1.15.0, the exit code was 0 in this case too.

obsidian append path=Sample.md heading=Nothing content="- 存在しない見出し"
echo "exit=$?"
Error: Heading “Nothing” not found in file.
exit=0

When calling it from a shell script, a failure can't be detected from the exit code in 1.15.0, so check whether the standard output starts with Error:. The handling of exit codes may change in a future update.

With the URI, a notification appears on the Obsidian screen. The next image shows the screen when I opened a URI specifying the nonexistent heading Logs. Error: Heading “Logs” not found in file. is displayed at the top right, and the note is unchanged.

A notification "Error: Heading “Logs” not found in file." is displayed at the top right of the Obsidian 1.15.0 screen, and the contents of Tasks, Log, and Memo in the open daily note are unchanged

When heading is specified in the URI without append / prepend, the note also stayed unchanged, and a notification The “heading” URI parameter requires “append” or “prepend.” appeared.

If the target note doesn't exist yet, an empty note is created and then the error occurs.

For the daily note, if you put the headings in the template as in the first example, writing goes under the heading from the first append of the day. I haven't tried appending with the URI's daily action from a state where today's note doesn't exist.

In 1.14.5, heading is ignored

For comparison, I ran the same CLI commands in 1.14.5 and opened the same URIs. The CLI displayed Appended to: Sample.md without any error, and in both cases heading was ignored and the content was appended to the end of the file. Both the CLI and the URI produced the following diff.

Sample.md
 ## Notes
 メモ
+
+- 10:30 追記
\ No newline at end of file

1.14.5's obsidian help append has no heading line. If you use Obsidian on multiple machines, run obsidian version on each machine before building it into a script, and check that it is 1.15 or later.

obsidian version
1.15.0 (installer 1.12.7)

Summary

  • Obsidian 1.15 added heading, which lets you specify a heading's section to append to. It applies to the CLI's append / prepend / daily:append / daily:prepend and the URI's new / daily actions
  • Content added with append goes at the end of the section, including child headings, and with prepend it goes right under the heading. Heading names are case-insensitive, and child headings are specified by name alone. If there are multiple headings of the same name, it goes into the first one
  • The URI inserts a blank line if you omit spacing. If you add bullet points one line at a time, adding spacing=newline gives the same result as the CLI
  • If the heading isn't found, nothing is appended. The CLI in 1.15.0 displays the error on standard output with exit code still 0, and the URI shows a notification
  • To append to a daily note that hasn't been created yet, prepare the headings in the template
  • In 1.14.5, heading is ignored and the content goes at the end of the file. Before using it, check with obsidian version that you are on 1.15 or later

I hope this helps someone.

References

Share this article