This guide shows you how to build a structured, navigable course inside Obsidian using Breadcrumbs. The end result is a self-contained curriculum where the hierarchy is derived automatically from note names, lessons are linked in sequence with next/previous navigation, and learners can browse the full course outline from a single note — no manual frontmatter required.
There are a few ways to build this structure. This guide uses Dendron Notes (or Regex Notes as an alternative) to derive the Course → Module → Lesson hierarchy automatically from your note names. List Notes in each module then add an ordered next sequence between lessons. A codeblock tree in the top-level Course note renders the full curriculum, and the Previous-Next View gives learners a persistent navigation bar.
[!NOTE]
The next edges between lessons aren’t shown in full in the Mermaid graph above, as it would clutter the layout. The core idea is: up/down fields for the Course → Module → Lesson hierarchy, and next/prev fields for moving through lessons in order.
The hierarchy is encoded directly in the note name. Use a dot (.) as a delimiter — exactly like the Dendron system:
Python
Python.Basics
Python.Basics.Variables
Python.Basics.Loops
Python.Basics.Functions
Python.DataStructures
Python.DataStructures.Lists
Python.DataStructures.Dicts
No frontmatter is needed at all for the hierarchy. Breadcrumbs reads the note names and infers the edges.
[!TIP]
Keep each segment short and use consistent casing. Breadcrumbs can display a trimmed version of the name (e.g. Variables instead of Python.Basics.Variables) — enable Display Trimmed in the Dendron settings.
Go to Settings > Edge Sources > Dendron Notes and configure as follows:
Enable: on
Field: up-course
Delimiter: .
Display Trimmed: on (recommended)
Rebuild the graph and check the Matrix View from any lesson note — you should see it pointing up-course to its module, and the module pointing up-course to the course root.
If you prefer a different naming convention — for example, Python - Basics - Variables with a - separator — you can use Regex Notes instead of Dendron Notes. Create an index note (e.g. Python) and add:
---
BC-regex-note-field: "lessons"
BC-regex-note-regex: "^Courses/Python"
BC-regex-note-flags: "i"
---
This will match all notes under the Courses/Python folder and add lessons edges pointing down to them from the index note. You can create one Regex Note per module to narrow the scope further.
The Dendron edge builder gives you the hierarchy, but not the order of lessons within a module. For that, create a List Note inside each module.
Python.Basics.md (add to the body of the note):
---
BC-list-note-field: "lessons"
BC-list-note-neighbour-field: "next-lesson"
---
- [[Python.Basics.Variables]]
- [[Python.Basics.Loops]]
- [[Python.Basics.Functions]]
The BC-list-note-field adds lessons edges from the module down to each lesson. The BC-list-note-neighbour-field adds next-lesson edges between each consecutive lesson in the list — so Variables → Loops → Functions automatically.
[!NOTE]
The module note now serves double duty: it’s part of the Dendron hierarchy and it’s the List Note that defines lesson order. The two edge builders work independently and combine in the graph.
We added next-lesson explicitly (via the List Note), but not prev-lesson. Similarly, the lessons field goes downward from module to lesson, but we haven’t explicitly added the reverse up-course direction from lesson to module — Dendron Notes already handles that, but prev-lesson still needs to be inferred.
Open Settings > Implied Relations > Transitive and add:
The Previous-Next View adds a persistent navigation bar at the top of every note, showing the previous and next lesson.
Go to Settings > Views > Page > Previous/Next:
Enable: on
Left Field Group: set to a group that contains prev-lesson
Right Field Group: set to a group that contains next-lesson
[!TIP]
If you don’t have field groups set up yet, see Field Groups. Create a course-nexts group containing next-lesson and a course-prevs group containing prev-lesson, then assign these to the right and left sides of the view respectively.
Once enabled, every lesson note will display something like this at the top:
For a fully keyboard-driven experience, assign a hotkey to the Jump to First Neighbour command.
Open Obsidian settings and navigate to Hotkeys
Search for Breadcrumbs: Jump to First Neighbour in group:course-nexts
Assign a key combination, for example Alt+Right
Optionally, assign Alt+Left to Jump to First Neighbour in group:course-prevs
graph LR
1(Variables) -->|next-lesson| 2(Loops) -->|next-lesson| 3(Functions)
Now a learner can press Alt+Right at the end of any lesson to jump straight to the next one — no mouse required.
[!TIP]
Assign hotkeys to both directions so learners can move fluidly back and forth. The Layered Daily Notes guide uses the same pattern for navigating between daily notes.
If your vault contains several courses, prefix each course with a namespace: Python, JavaScript, DataScience. Each Dendron hierarchy is self-contained, so Breadcrumbs will build separate graphs for each course automatically.
You can then create a master index note with one codeblock per course, each using start-note to point at the correct course root:
To create a single next-lesson chain that spans across modules (so the last lesson of one module links to the first lesson of the next), simply include cross-module links in a top-level List Note on the Course note itself:
---
BC-list-note-neighbour-field: "next-lesson"
BC-list-note-exclude-index: true
---
- [[Python.Basics.Variables]]
- [[Python.Basics.Loops]]
- [[Python.Basics.Functions]]
- [[Python.DataStructures.Lists]]
- [[Python.DataStructures.Dicts]]
Setting BC-list-note-exclude-index: true prevents the course note itself from being added as a parent of every lesson. The result is one continuous next-lesson chain across the whole course.