Callouts are a simple way to visually separate information in your notes. I like callouts for a few reasons: They produce very human readable markdown, so even when unrendered the information is easy to ready, they are easy to color code for purpose, they don't require a plugin. Let me show you how to make your own, show you my custom ones, and share a cool plugin that will make it so easy to use callouts in your notes.
Things Mentioned
- Obsidian: https://obsidian.md
- Obsidian Callout Help: https://help.obsidian.md/Editing+and+formatting/Callouts
- Color Picker: https://rgbcolorpicker.com
- Lucide Icons: https://lucide.dev
- Callout Manager Plugin: https://github.com/eth-p/obsidian-callout-manager
What are Callouts?
Call outs are a great visual way to separate information in your Obsidian notes. There are already a ton of built in call outs found in the help files that you can take advantage of but you can also very easily create your own. Below is an example call out already in Obsidian in Markdown and then how it appears rendered in a note.
> [!tip] Callouts can have custom titles
> Like this one.
In the above example, the "tip" part is what lets Obsidian know which callout structure to use. Callouts can also be foldable so you can "open" or "close" them, revealing or hiding the information within the callout. This is done by adding either a minus sign (-) or a plus sign (+) right after the second square bracket. Those symbols will make the callout foldable and have it start when you open the note closed or open, respectively.
> [!faq]- Are callouts foldable?
> > Yes! In a foldable callout, the contents are hidden when the callout is collapsed.
Making Your Own Callouts
New callouts can be made available through plugins or through including them in css snippet files. This is the easiest and what we will use to make our own callouts. Open up notepad or some other text editor, copy the following into it, and save it in the folder VAULT > .obsidian > snippets
. Name it whatever you like and then change the extension from .txt to .css if needed.
.callout[data-callout="paw"] {
--callout-color: 92, 255, 229;
--callout-icon: lucide-paw-print;
}
Once saved, you will need to go into the settings for your Obsidian vault and look under Appearance.
My Custom Callouts
.callout[data-callout="note"] {
--callout-color: 249, 249, 14;
--callout-icon: lucide-align-left;
}
.callout[data-callout="anecdote"] {
--callout-color: 192, 132, 252;
--callout-icon: lucide-messages-square;
}
.callout[data-callout="insight"] {
--callout-color: 251, 191, 36;
--callout-icon: lucide-chart-network;
}
.callout[data-callout="advice"] {
--callout-color: 55, 238, 182;
--callout-icon: lucide-hand-heart;
}
.callout[data-callout="license-info"] {
--callout-color: 28, 178, 242;
--callout-icon: lucide-key-round;
}
.callout[data-callout="resource-links"] {
--callout-color: 28, 178, 242;
--callout-icon: lucide-qr-code;
}
.callout[data-callout="project-goals"] {
--callout-color: 253, 124, 206;
--callout-icon: lucide-target;
}
.callout[data-callout="project-links"] {
--callout-color: 253, 124, 206;
--callout-icon: lucide-link;
}
.callout[data-callout="references"] {
--callout-color: 247, 130, 130;
--callout-icon: lucide-newspaper;
}
These callouts were inspired by callouts used in the podcast app Snipd. I love them.
Retrieving Information in Callouts
Obsidian Search
Put this in a "query" code fence to embed a native search that retrieves lines in notes with the callout.
"> [!advice]"
DataviewJS
Put this in a "dataviewjs" code fence for a table of notes with specified callouts in them and the amount of times they are present in the note.
// Define the folder to restrict search (change to your folder name)
const folderPath = "Technical Notes"; // Adjust to your specific folder path
// Define callout types to count
const calloutTypes = ["anecdote", "insight", "advice"];
// Create a table header
const table = [];
table.push(["File Name", ...calloutTypes.map(type => `${type}`)]);
// Iterate over all files in the specified folder
for (const file of dv.pages(`"${folderPath}"`)) {
const fileContent = await dv.io.load(file.file.path); // Load file content
const counts = {};
// Initialize counts for each callout type
calloutTypes.forEach(type => (counts[type] = 0));
// Count occurrences of each callout type
fileContent.split("\n").forEach(line => {
calloutTypes.forEach(type => {
if (line.trim().startsWith(`> [!${type}]`)) {
counts[type]++;
}
});
});
// Add the data to the table
table.push([
file.file.link,
...calloutTypes.map(type => counts[type]),
]);
}
// Render the table
dv.table(table[0], table.slice(1));