Skeletal

approvedunreviewed

by Ashly Lorenzana

Markdown structures for every kind of content.

★ 2 stars↓ 344 downloadsUpdated 2mo agoMIT

Skeletal

Skeletal banner

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.

Features

  • 47 configurable templates across 12 categories
  • Searchable template browser with category filters, Favorites, and Recent
  • Data-driven templates — add new ones without building a new UI
  • Raw Markdown and Rendered previews
  • Insert at Cursor (replaces the current selection when present), Copy Markdown, and Create New Note
  • Managed task progress bars with manual and optional automatic updates
  • Settings for Markdown flavor, placeholders, progress defaults, and remembered template values

Screenshots

Add screenshots of the template browser, preview pane, and progress bars here when publishing the GitHub repository or community-plugin listing. Suggested captures:

  1. Template browser with category filters and search
  2. Customization controls with Raw / Rendered preview
  3. A note containing a managed progress bar and checklist

Installation

Manual install (from a release)

  1. Download main.js, manifest.json, and styles.css from the latest GitHub Release.
  2. Create this folder in your vault: Vault/.obsidian/plugins/skeletal/
  3. Copy the three files into that folder.
  4. Enable Skeletal in Obsidian Settings → Community plugins.

From source

npm install
npm run build

Then copy main.js, manifest.json, and styles.css into Vault/.obsidian/plugins/skeletal/, or use local deploy (below).

Usage

  1. Run the command Insert Markdown Template (or use the ribbon icon).
  2. Filter by category, Favorites, or Recent; type to search.
  3. Select a template and adjust controls (counts, heading level, links, placeholder style, Markdown flavor, and more).
  4. Switch between Raw Markdown and Rendered preview.
  5. Choose Insert at Cursor, Copy Markdown, or Create New Note.

Keyboard: search focuses when the modal opens; Enter selects the first search result; Escape closes the modal.

Template categories

CategoryExamples
ListsBulleted, numbered, nested, ranked, pros/cons, definition lists
TablesBasic, comparison, feature matrix, directory, status tracker
DocumentsREADME, FAQ, changelog, installation guide, tutorial outline
NavigationTable of contents, note index, link directory
LinksReference lists, bookmark collections
TasksChecklists, plans, status boards, progress groups and dashboards
MediaImage with caption, linked image, gallery
CodeCode + explanation, command reference, file tree
GitHubBadges, repository links, contributors
ObsidianCallouts, embeds, internal-link index
CreativeTimeline, character sheet, reading list
DataGlossary, inventory, key/value sheet

Managed progress bars

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

Marker format

  • Start: <!-- markdown-template-progress:start {json} -->
  • End: <!-- markdown-template-progress:end -->
  • Metadata stores enough configuration to reproduce formatting on update (scope, width, characters, percentage/count flags, nested counting, cancelled-task mode, optional label / kind / phaseId / headingLevel).
  • Invalid JSON or a missing end marker is skipped safely; that block is not modified.

Calculation rules

  • Counts - [ ], - [x], - [X] (also * / + bullets).
  • Ignores task-looking lines inside fenced code blocks.
  • 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.
  • Nested tasks follow countNested.
  • Zero tasks → 0% and 0/0 (no division by zero).
  • Only the managed marker region is rewritten; other content is preserved.
  • Multiple independent blocks in one note are supported.

Automatic updates

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.

Commands

CommandAction
Insert Markdown TemplateOpen the template browser
Insert Task Group with ProgressOpen the progress task-group template
Insert Project Progress DashboardOpen the project progress dashboard template
Update Progress Bars in Current NoteRecalculate all managed progress blocks in the active note
Update Progress Bar Under Current HeadingRecalculate the managed block for the current heading section

Settings

Open Settings → Skeletal to configure:

  • Default Markdown mode (Obsidian vs Standard / GitHub)
  • Default heading level
  • Placeholder style (blank, generic, or descriptive)
  • Default progress-bar width, filled/empty characters
  • Show percentage / completed-total by default
  • Count nested tasks by default
  • Automatic progress updates and debounce delay
  • Remember values used for each template

Favorites, recent templates, and remembered control values are stored with plugin data via Obsidian’s loadData / saveData.

Known limitations

  • Progress auto-update is per-file when markers are present; there is no vault-wide bulk update in v1.
  • Unmanaged progress bars (plain text without markers) are never modified.
  • Heading scope relies on ATX # headings.
  • Cancelled tasks (- [-]) support is configurable; default is to ignore them.
  • Rendered preview depends on Obsidian’s Markdown renderer and may differ slightly from Reading view plugins/themes.
  • Screenshots for the community listing should be added to this README or the release notes when available.

Development

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

Local deploy (Windows-friendly)

  1. Copy .env.local.example to .env.local.
  2. Set OBSIDIAN_VAULT_PATH to your vault root folder (not the .obsidian folder), for example: OBSIDIAN_VAULT_PATH=C:\Users\YourName\Documents\MyVault
  3. Run npm 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).

Adding a template

See docs/adding-templates.md.

Privacy

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).

License

MIT — see LICENSE.

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.