Run Obsidian's community-plugin review checks on your own machine, before you open a submission PR. It replicates the mechanical parts of the review so you can fix problems in seconds instead of waiting on a reviewer round-trip.
It does two things:
- Manifest & submission checks (in Node, no plugin execution): validates
manifest.jsonagainst the submission requirements (required/allowed keys, forbidden words, id/version/description format), confirmsversions.jsonhas an entry for the current version, and checks forREADME.mdandLICENSE. - ESLint with the official
eslint-plugin-obsidianmdrecommended ruleset (noinnerHTML, detach leaves on unload,Platformguards for Node APIs, sentence-case UI text, noconsole.log, restricted globals, and more).
A clean run, every check passed:
A failing run, with the specific problems to fix before submitting:
The fastest way, no install, run it straight from npm against any plugin folder:
npx obsidian-plugin-validator ~/dev/my-pluginOr from inside your plugin's folder (defaults to the current directory):
cd ~/dev/my-plugin
npx obsidian-plugin-validatorInstall it globally if you run it often:
npm install -g obsidian-plugin-validator
obsidian-plugin-validator ~/dev/my-plugingit clone https://github.com/philpalmieri/obsidian-plugin-validator.git
cd obsidian-plugin-validator
npm install
node bin/cli.mjs ~/dev/my-plugin| Flag | Description |
|---|---|
--src <dir> |
Source folder to lint (default: src) |
--no-lint |
Run manifest/file checks only, skip ESLint |
--fix |
Apply ESLint autofixes where possible |
--no-typed |
Disable type-aware linting (some obsidianmd rules get skipped) |
--tsconfig <p> |
tsconfig path for type-aware linting (default: ./tsconfig.json) |
-h, --help |
Show help |
The obsidianmd recommended set includes type-aware rules, so linting runs type-aware by default. It uses the plugin's own tsconfig.json; if the plugin doesn't have one, a temporary tsconfig is generated for the run and removed afterward.
0- all checks passed (warnings allowed)1- one or more errors; fix before submitting2- bad usage (unknown flag)
Wire it into CI or a pre-release script by relying on the exit code.
If you'd rather run ESLint yourself, reuse the same flat config from your plugin's eslint.config.mjs:
// eslint.config.mjs
import { obsidianConfig } from "obsidian-plugin-validator/lib/eslint-config.mjs";
export default obsidianConfig();
// or type-aware: obsidianConfig({ typed: true, tsconfig: "./tsconfig.json" })This covers the mechanical checks only. A human reviewer still looks at design, security, and whether your plugin does what it claims. Passing locally makes that review faster; it isn't a guarantee of acceptance. See the full plugin guidelines.
MIT

