Markdown structures for every kind of content.
Skeletal is an Obsidian community plugin that acts as a searchable Markdown pattern library. Browse template categories, customize structure with form controls, preview the generated Markdown, and insert it into your notes. It also includes managed progress bars that recalculate from task checkboxes without rewriting the rest of the note.
Add screenshots of the template browser, preview pane, and progress bars here when publishing the GitHub repository or community-plugin listing. Suggested captures:
main.js, manifest.json, and styles.css from the latest GitHub Release.Vault/.obsidian/plugins/skeletal/npm install
npm run build
Then copy main.js, manifest.json, and styles.css into Vault/.obsidian/plugins/skeletal/, or use local deploy (below).
Keyboard: search focuses when the modal opens; Enter selects the first search result; Escape closes the modal.
| Category | Examples |
|---|---|
| Lists | Bulleted, numbered, nested, ranked, pros/cons, definition lists |
| Tables | Basic, comparison, feature matrix, directory, status tracker |
| Documents | README, FAQ, changelog, installation guide, tutorial outline |
| Navigation | Table of contents, note index, link directory |
| Links | Reference lists, bookmark collections |
| Tasks | Checklists, plans, status boards, progress groups and dashboards |
| Media | Image with caption, linked image, gallery |
| Code | Code + explanation, command reference, file tree |
| GitHub | Badges, repository links, contributors |
| Obsidian | Callouts, embeds, internal-link index |
| Creative | Timeline, character sheet, reading list |
| Data | Glossary, inventory, key/value sheet |
Progress bars are functional, not static examples. Generated blocks look like:
<!-- markdown-template-progress:start {"scope":"heading","width":10,"filledChar":"█","emptyChar":"░","showPercentage":true,"showCount":true,"countNested":true,"cancelledMode":"ignore","label":"Progress"} -->
**Progress:** `██████░░░░` 60% — 3/5 tasks
<!-- markdown-template-progress:end -->
- [x] Define requirements
- [x] Create wireframes
- [x] Choose technology
- [ ] Build interface
- [ ] Test plugin
<!-- markdown-template-progress:start {json} --><!-- markdown-template-progress:end -->scope, width, characters, percentage/count flags, nested counting, cancelled-task mode, optional label / kind / phaseId / headingLevel).- [ ], - [x], - [X] (also * / + bullets).scope: "heading" counts tasks after the block until the next heading of the same or higher level.scope: "note" counts tasks after the block through the rest of the note.countNested.0% and 0/0 (no division by zero).Setting: Automatically update managed progress bars when tasks change (default off).
When enabled, the plugin listens for vault/editor changes, debounces updates, and only processes Markdown files that contain the managed start marker. Writes are guarded to avoid recursive update loops.
| Command | Action |
|---|---|
| Insert Markdown Template | Open the template browser |
| Insert Task Group with Progress | Open the progress task-group template |
| Insert Project Progress Dashboard | Open the project progress dashboard template |
| Update Progress Bars in Current Note | Recalculate all managed progress blocks in the active note |
| Update Progress Bar Under Current Heading | Recalculate the managed block for the current heading section |
Open Settings → Skeletal to configure:
Favorites, recent templates, and remembered control values are stored with plugin data via Obsidian’s loadData / saveData.
# headings.- [-]) support is configurable; default is to ignore them.npm install
npm run dev # watch build → main.js
npm run build # typecheck + production bundle
npm test # unit tests
npm run deploy:local # build + copy into your vault's plugins/skeletal folder
.env.local.example to .env.local.OBSIDIAN_VAULT_PATH to your vault root folder (not the .obsidian folder), for example:
OBSIDIAN_VAULT_PATH=C:\Users\YourName\Documents\MyVaultnpm run deploy:local.The script runs a production build, then copies main.js, manifest.json, and styles.css into:
{OBSIDIAN_VAULT_PATH}\.obsidian\plugins\skeletal\
It creates that directory if needed and overwrites existing plugin files. If the build fails, deploy stops and does not copy anything.
.env.local is gitignored so your vault path stays private. Use .env.local.example as the shared template.
After deploying, reload the plugin in Obsidian (Community plugins → turn Skeletal off/on, or restart Obsidian).
Skeletal reads and writes only within your local vault through Obsidian APIs. Template generation, progress parsing, and previews run on-device. No analytics or network calls are made by the plugin itself (external badge/image URLs in GitHub templates are Markdown links only).
MIT — see LICENSE.