Starting a new topic is slow: you spend hours designing folders, maps of content, note headers, and cross-links before you can actually learn.
Obsidian Vault Generator (OVG) takes a one-paragraph brief and produces a consistent, cross-linked vault you can use immediately.
Folder tree with index.md
in each folder (acts as a MOC).
Note stubs with front matter : title
, tags
, aliases, and breadcrumbs fields.
Backlinks & cross-links between sibling/parent topics.
A Template set (Jinja2) for pages like Concepts, How-To, Reference, Lab.
Optional Reading plan and Checklist notes to drive practice.
Export in plain Markdown — Obsidian-ready, Git-friendly.
Brief (topic.yaml)
↓
Outline builder (LLM or rule-based) → Taxonomy (areas, subareas, depth)
↓
Renderer (Jinja2 templates + YAML defaults)
↓
Linker (backlinks, MOCs, breadcrumbs) → Post-processor (slugs, tags)
↓
Filesystem writer (safe, idempotent)
LLM optional : you can use a local model or skip it and pass a custom outline.
Determinism : seedable prompts + rule-based post-processing keep results stable.
Re-runs : idempotent writes (won’t clobber edited files unless --force
).
ovg init "Computer Vision for Robotics" \
--depth 3 \
--tags "cv, robotics" \
--provider local # or openai/any api provider
--out ./vaults/cv-robotics
Minimal brief (topic.yaml):
topic: Computer Vision for Robotics
goals:
- Build intuition + runnable labs
- Focus on perception stacks for UGV/UAV
facets:
- Linear algebra & geometry
- Cameras & calibration
- Feature detection & SLAM
- Segmentation & tracking
- Deployment on Jetson
depth: 3
A concept note template (Jinja2), compatible with Obsidian and Breadcrumbs:
---
title: "{{ note.title }}"
aliases: ["{{ note.alias }}"]
tags: {{ note.tags | tojson }}
bc-parent: "{{ note.parent }}" # Breadcrumbs plugin field
bc-children: {{ note.children | tojson }}
summary: "{{ note.summary }}"
---
# {{ note.title }}
## TL;DR
{{ note.tldr }}
## Core ideas
- {{ note.core[0] }}
- {{ note.core[1] }}
- {{ note.core[2] }}
## Links
- ↑ [[{{ note.parent }}]]
{% for child in note.children -%}
- ↓ [[{{ child }}]]
{% endfor %}
Generated structure (example)
cv-robotics/
├─ 00_Index/
│ └─ index.md # global MOC
├─ 01_Fundamentals/
│ ├─ index.md
│ ├─ Linear_Algebra.md
│ └─ Projective_Geometry.md
├─ 02_Sensing/
│ ├─ index.md
│ ├─ Cameras_and_Optics.md
│ └─ Calibration.md
├─ 03_Perception/
│ ├─ index.md
│ ├─ Features_and_SLAM.md
│ ├─ Segmentation.md
│ └─ Tracking.md
├─ 04_Labs/
│ ├─ index.md
│ ├─ Calibrate_Camera.md
│ └─ HSV_Mask_Tuner.md # hooks to your HSV Color Selector
└─ 99_References/
├─ index.md
└─ Papers_To_Read.md
Builds up/down links (bc-parent
, bc-children
) for Breadcrumbs compatibility.
Adds inline sibling links where relevant (shared tags).
Generates MOCs that auto-collect children via wikilinks.
Provider is configured via YAML (provider: local|api
, model name, max tokens).
Outline prompt is topic-first with constraints (depth, #notes per level, style).
Token budget guard + chunking keep costs predictable.
Learning workflow it enables
Each folder’s index.md
holds a short syllabus + checkboxes.
“Labs” include runnable tasks and datasets links.
“Reading plan” schedules papers/chapters across weeks.
Example: programmatic use
from ovg import Generator, Brief, Writer
brief = Brief.from_yaml("topic.yaml")
gen = Generator(provider="local", seed=42)
outline = gen.build_outline(brief)
notes = gen.render(outline, template_dir="./templates")
Writer("./vaults/cv-robotics").write(notes)
Add your own Jinja2 templates (e.g., “Incident”, “API Spec”, “Design Doc”).
Plug a custom taxonomy (your company’s domains, team practices).
Post-hooks: run formatters, add front-matter fields, push to Git.
CLI + Python package, Jinja2 template system, YAML schemas.
Outline builder with deterministic seed + provider abstraction.
Linker for MOCs, breadcrumbs, and backlinks.
Safety features: dry-run, diff viewer, idempotent writes.
Skills demonstrated: Python packaging, prompt-to-structure generation, templating, filesystem automation, knowledge architecture, and Obsidian/Breadcrumbs workflows.