Elevate Your Writing Process: Using Callouts in Obsidian

Obsidian is a markdown editor. For an overview of how I use Obsidian when writing a novel, please read Organize and Write Your Next Novel with Obsidian.

I decided to try out the use of Obsidian Callouts to mark notes/information/tasks as I drafted my November book. I love the “Clue” callout from the “Fancy a Story” theme and thought it would be fun to use it to keep track of clues in my mysteries to make sure they are all resolved one way or another by the end of the story.

There are many different types of Callouts available in the default Obsidian setup or that can be added through alternate themes and CSS snippets. I didn’t want to go crazy with them, but to stick to a limited number of useful formats. If I am to be productive, I have to not spend all of my time testing out all of the different possibilities and tweaking code. I therefore limited myself to:

Callout TypeFound inHow I Used It
ClueFancy a Story themeto mark my clues in a fun way
QuestionBuilt in default setupthings I’m not sure if I will pursue, questions I need to hammer out
NoteBuilt in default setupnotes needed for reference in the story and/or to be transferred to my series wiki after the book is drafted
TodoBuilt in default setupan task or list of tasks that I need to follow up on within the manuscript
DoneBuilt in default setuptasks that had been completed
PolaroidFancy a Story thememake photos look like Polaroids — because they are fun
TimelineFancy a Story themevisual timelines for backstory or the main story

There are some other great Callout types available in the default Obsidian setup, Fancy a StorySanctumITS, and other themes and CSS snippets. Check them out! Fancy a Story includes a number of image gallery display modes I haven’t used, as well as email, letter, and text conversation callouts, and more. I may use their Comic callout for storyboarding at some point, but that isn’t something that I usually do. Both Timeline and Comic are possible alternatives for visual outlining if you don’t want to use Outline, Kanban, or Canvas. In Obsidian, you have many options!

Tracking things that needed to be followed up on

A [[!Todo]] callout (expanded) with a checkbox inside it for a scene note that needs to be made earlier in the story; and

A [[!Done]] callout (collapsed) for a scene note that needed to be done in a later scene and has now been completed.

A [[!Todo]] callout (expanded) with a series of scene follow-up checkboxes inside it, completed and incomplete.

When I finished all of the tasks within a Callout, I changed the Callout type from Todo to Done. It is very easy to just double-click the word “Todo” and type “Done”

Notes to be referred back to later or transferred to the series wiki

A [[!Note]] Callout (collapsed) for a piece of information that I needed to remember later, and

A [[!Clue]] Callout (collapsed) for a clue that will need to be referred back to later in the story/solution.

Clues to remember and follow up on

A [[!Clue]] callout (collapsed) for a one of the clues the detective will need to solve the mystery. It needs to be followed up on so that it isn’t orphaned or conflicted later on.

The same [[!Clue]] callout expanded to show details of why this detail is important.

Timeline

I used the Timeline Callout for the first time on my most recent book. Very handy for keeping a visual timeline of the backstory or main story. There are plenty of options for numbering and CSS options for styling. This one is very basic. It autonumbers and depending on how wide your frame is, the entries either alternate side or are all displayed on one side.

Just for fun

I nearly forgot about the Polaroid Callout from Fancy a Story Theme. This one is just because it looks cool. There are a lot of other nifty Callouts in Fancy a Story, I haven’t tried them all out, but the Comic callout might be fun for storyboarding, if you like to do that. And the Pinned and Paper fold Callouts are cool replacements for Note.

Keeping track of/making practical use of callouts

In order for Callouts to be a practical tool in a manuscript, you need to be able to find them all to make sure they have been dealt with. Here is a query for all Callouts in this draft, sorted by chapter, and the result.

```query  
"[!" path:"KK 13 Deaths Charm/Drafts/Draft 1"

Here are some other queries I tried out for Callouts. Replace the path with your manuscript draft.

Todo callouts:

```query  
"[!Todo]" path:"KK 13 Deaths Charm/Drafts/Draft 1"     

Done callouts:

```query  
"[!Done]" path:"KK 13 Deaths Charm/Drafts/Draft 1"     

You get the idea!

Afterthoughts

I have tested out callouts in this way for five books now. I am ambivalent on using the Note callout. I have previously used a Note property in the yaml section of the chapter (each listed in a bulleted series). That seems to be a better place for my use (short bits of information I need to keep track of in the future). But if I need to make a longer note or am really in the groove and don’t want to go back to insert it into the yaml header, or if it needs to be positioned in relation to certain content, I insert it and then (if appropriate) cut and paste the info to my yaml header when I review/process the chapter.

Longform Plugin

If you would like to remove callouts from your manuscript when compiling it in Longform, you can use this custom step.

module.exports = {
  description: {
    name: "Remove Callouts",
    description: "Removes all Obsidian callout blocks and one blank line after each.",
    availableKinds: ["Scene"],
    options: [],
  },

  compile(input, context) {
    return input.map(scene => {
      const lines = scene.contents.split("\n");
      const resultLines = [];
      let inCallout = false;
      let skipNextBlank = false;

      for (let i = 0; i < lines.length; i++) {
        const line = lines[i];

        // Start of a callout block
        if (/^>\s*\[!\w+.*?\]/.test(line)) {
          inCallout = true;
          continue; // skip this line
        }

        if (inCallout) {
          if (/^>/.test(line)) {
            continue; // still in callout, skip line
          } else {
            // Exiting callout block
            inCallout = false;
            // If this line is blank, skip it and continue to next
            if (/^\s*$/.test(line)) {
              continue; // skip this one blank line
            }
          }
        }

        // Not in callout, add line to result
        resultLines.push(line);
      }

      return {
        ...scene,
        contents: resultLines.join("\n"),
      };
    });
  },
};

To add this custom step to your vault:

  1. create a /steps folder inside your vault.
  2. copy the above text into a text file and save it as remove-callouts.js
  3. go into the settings for the longform plugin and select /steps as the location for User script step folder

And if you need one to remove checkboxes, here is the step script to do that:

module.exports = {
  description: {
    name: "Remove Markdown Tasks",
    description: "Removes Markdown task list items and one blank line after each.",
    availableKinds: ["Scene"],
    options: [],
  },

  compile(input, context) {
    return input.map(scene => {
      const lines = scene.contents.split("\n");
      const resultLines = [];

      for (let i = 0; i < lines.length; i++) {
        const line = lines[i];

        // Check for a Markdown task item
        if (/^\s*[-*]\s+\[[ xX]\]/.test(line)) {
          // Skip this task line
          // Also check if the next line exists and is blank — skip that too
          const nextLine = lines[i + 1];
          if (nextLine !== undefined && /^\s*$/.test(nextLine)) {
            i++; // skip the blank line too
          }
          continue;
        }

        resultLines.push(line);
      }

      return {
        ...scene,
        contents: resultLines.join("\n"),
      };
    });
  },
};

Tell me what you think!

Scroll to Top
pdworkman.com
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.