JD Numbering
unlistedby Nelson
Focused Johnny Decimal helpers: assign the next ID, lint numbering, refresh a JDex index, and refile notes to match their jd-id.
JD Numbering
A small, focused Johnny Decimal helper for Obsidian. It does four things and nothing else:
| Command | What it does |
|---|---|
| JD: Assign next number | Finds the next free ID for a category (index-first, no collisions) and renames the active note to <jd-id> <title>.md, refiling it into the right folder. Shows a before → after confirmation first. |
| JD: Refile active note to match its ID | Renames + moves the active note so its filename and folder match the ID in its filename. Can leave a system/redirect stub at the old path. |
| JD: Lint vault | Read-only scan → a report note. Flags duplicate IDs, malformed filename IDs, folder-placement mismatches, and naming-hygiene issues. |
| JD: Refresh index | Regenerates a master JDex index note (area → category → ID). |
Conventions it assumes
- Filenames are
<jd-id> <title>.md(e.g.06.11 Tailscale.md). - Folders are
XX-YY Area/XX Category. - The ID is the filename's leading token (
06.11), derived per note-kind (area/category folder notes use theirA0-A9/AC.00form). It is not stored in frontmatter. - Standard zeros
.00–.09are reserved; content IDs start at.10. - The filename is canonical (the source of truth), not a frontmatter property.
Expansion-aware
Valid ID shapes include more than XX.YY:
- Expanded areas — a whole band using 5-digit IDs (e.g.
90-99→92021). - Expanded categories — a single category using 5-digit flat IDs (e.g.
27→27001). - Fractal IDs inside an expanded area (e.g.
92021.10).
These are configured in settings (defaults: expanded area 90-99, expanded category 27) and are not flagged as errors by the linter. Malformed shapes like 26 2.18 are.
Automatic linting
Optionally surface JD issues for the active note as you work — in the spirit of Obsidian Linter's Lint on save / Lint on file change, but read-only: it never moves or renames files.
- Lint on save — check the active note when it's saved/modified.
- Lint on file change — check a note when you open or switch to it.
- Show status-bar indicator — show the active note's status in the status bar (on by default). Turn it off to run notice-only.
- Show notice on issues — also pop a notice listing the note's issues (otherwise it's status-bar only).
A status-bar item shows the active note's state — JD ✓ when clean, JD ⚠ N (details on hover) when not. Click it to run a full Lint vault. Automatic linting runs the note-local checks only; duplicate-id needs the whole vault, so it stays with the manual Lint vault command.
Settings
- Expanded areas / Expanded categories — comma-separated.
- Index note path — where Refresh index writes (default
JD index.md). - Write lint report — whether Lint vault writes/opens a report note (on by default); off = counts notice only.
- Lint report path — where Lint vault writes (default
JD lint report.md). - Leave redirect stub on refile — off by default.
- Lint on save / Lint on file change — automatic linting triggers, off by default.
- Show status-bar indicator (on by default) / Show notice on issues (off by default).
Safety
Destructive commands (Assign, Refile) act on the active note only and always show a confirmation modal with the exact before → after path. Lint and Refresh index are read-mostly (index writes a single generated note).
Install (BRAT)
- Install the BRAT community plugin.
- BRAT → Add beta plugin →
nelsonlove/obsidian-jd-numbering. - Enable JD Numbering in Community plugins.
Develop
npm install
npm run dev # watch build
npm run build # type-check + production bundle
npm test # headless test suite
Releases are cut by pushing a bare X.Y.Z tag matching manifest.json; CI
builds the plugin and publishes a GitHub Release with the built files attached,
which is what BRAT installs. See RELEASING.md.
License
MIT
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.