eslint-plugin-obsidianmd
May 12, 2026 Β· View on GitHub
Installation
You'll first need to install ESLint:
npm i eslint --save-dev
Next, install eslint-plugin-obsidianmd:
npm install eslint-plugin-obsidianmd --save-dev
Usage
With the release of ESLint v9, the default configuration file is now eslint.config.js.
Flat Config (eslint.config.js) - Recommended for ESLint v9+
To use the recommended configuration, add it to your eslint.config.js file. This will enable all the recommended rules.
// eslint.config.mjs
import tsparser from "@typescript-eslint/parser";
import { defineConfig } from "eslint/config";
import obsidianmd from "eslint-plugin-obsidianmd";
export default defineConfig([
...obsidianmd.configs.recommended,
{
files: ["**/*.ts"],
languageOptions: {
parser: tsparser,
parserOptions: { project: "./tsconfig.json" },
},
// You can add your own configuration to override or add rules
rules: {
// example: turn off a rule from the recommended set
"obsidianmd/sample-names": "off",
// example: add a rule not in the recommended set and set its severity
"obsidianmd/prefer-file-manager-trash": "error",
},
},
]);
Legacy Config (.eslintrc)
Click here for ESLint v8 and older
To use the recommended configuration, extend it in your .eslintrc file:
{
"extends": ["plugin:obsidianmd/recommended"]
}
You can also override or add rules:
{
"extends": ["plugin:obsidianmd/recommended"],
"rules": {
"obsidianmd/sample-names": "off",
"obsidianmd/prefer-file-manager-trash": "error"
}
}
Configurations
| Name | |
|---|---|
| β | recommended |
| π¬π§ | recommendedWithLocalesEn |
Rules
πΌ Configurations enabled in.
β οΈ Configurations set to warn in.
β
Set in the recommended configuration.
π¬π§ Set in the recommendedWithLocalesEn configuration.
π§ Automatically fixable by the --fix CLI option.
| NameΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β | Description | πΌ | β οΈ | π§ |
|---|---|---|---|---|
| commands/no-command-in-command-id | Disallow using the word 'command' in a command ID. | β π¬π§ | ||
| commands/no-command-in-command-name | Disallow using the word 'command' in a command name. | β π¬π§ | ||
| commands/no-default-hotkeys | Discourage providing default hotkeys for commands. | β π¬π§ | ||
| commands/no-plugin-id-in-command-id | Disallow including the plugin ID in a command ID. | β π¬π§ | ||
| commands/no-plugin-name-in-command-name | Disallow including the plugin name in a command name. | β π¬π§ | ||
| detach-leaves | Don't detach leaves in onunload. | β π¬π§ | π§ | |
| editor-drop-paste | Require checking evt.defaultPrevented and calling evt.preventDefault() in editor-drop/editor-paste handlers. | β π¬π§ | ||
| hardcoded-config-path | test | β π¬π§ | ||
| no-forbidden-elements | Disallow attachment of forbidden elements to the DOM in Obsidian plugins. | β π¬π§ | ||
| no-global-this | Disallow global and globalThis. Use window or activeWindow for popout window compatibility. | β π¬π§ | π§ | |
| no-nodejs-modules | Disallow importing Node.js built-in modules unless guarded by Platform.isDesktop | β π¬π§ | ||
| no-plugin-as-component | Disallow anti-patterns when passing a component to MarkdownRenderer.render to prevent memory leaks. | β π¬π§ | ||
| no-sample-code | Disallow sample code snippets from the Obsidian plugin template. | β π¬π§ | π§ | |
| no-static-styles-assignment | Disallow setting styles directly on DOM elements, favoring CSS classes instead. | β π¬π§ | ||
| no-tfile-tfolder-cast | Disallow type casting to TFile or TFolder, suggesting instanceof checks instead. | β π¬π§ | ||
| no-unsupported-api | Disallow usage of Obsidian APIs not available in the plugin's minimum app version | β π¬π§ | ||
| no-view-references-in-plugin | Disallow storing references to custom views directly in the plugin, which can cause memory leaks. | β π¬π§ | ||
| object-assign | Discourage using Object.assign with two arguments | β π¬π§ | ||
| platform | Disallow use of navigator API for OS detection | β π¬π§ | ||
| prefer-abstract-input-suggest | Disallow Liam's frequently copied TextInputSuggest implementation in favor of the built-in AbstractInputSuggest. | β π¬π§ | ||
| prefer-active-doc | Prefer activeDocument over document for popout window compatibility. | β π¬π§ | ||
| prefer-file-manager-trash-file | Prefer FileManager.trashFile() over Vault.trash() or Vault.delete() to respect user settings. | β π¬π§ | ||
| prefer-get-language | Prefer Obsidian's getLanguage() over localStorage.getItem('language') and i18next-browser-languagedetector for detecting the user's language. | β π¬π§ | ||
| prefer-instanceof | Prefer .instanceOf(T) over instanceof T for cross-window safe type checks on DOM Nodes and UIEvents. | β π¬π§ | π§ | |
| prefer-window-timers | Prefer window.setTimeout() and related timer functions over bare global calls for popout window compatibility. | β π¬π§ | π§ | |
| regex-lookbehind | Using lookbehinds in Regex is not supported in some iOS versions | β π¬π§ | ||
| rule-custom-message | Allows redefining error messages from other ESLint rules that don't provide this functionality natively. | β π¬π§ | ||
| sample-names | Rename sample plugin class names | β π¬π§ | ||
| settings-tab/no-manual-html-headings | Disallow using HTML heading elements for settings headings. | β π¬π§ | π§ | |
| settings-tab/no-problematic-settings-headings | Discourage anti-patterns in settings headings. | β π¬π§ | π§ | |
| ui/sentence-case | Enforce sentence case for UI strings | β π¬π§ | π§ | |
| ui/sentence-case-json | Enforce sentence case for English JSON locale strings | π¬π§ | π§ | |
| ui/sentence-case-locale-module | Enforce sentence case for English TS/JS locale module strings | π¬π§ | π§ | |
| validate-license | Validate the structure of copyright notices in LICENSE files for Obsidian plugins. | β π¬π§ | ||
| validate-manifest | Validate the structure of manifest.json for Obsidian plugins. | β π¬π§ | ||
| vault/iterate | Avoid iterating all files to find a file by its path | β π¬π§ | π§ |
UI sentence case
Checks UI strings for sentence case. The rule reports warnings but doesn't change text unless you run ESLint with --fix and enable allowAutoFix.
- Included at warn level in
recommendedconfig - Extended locale checks available via
recommendedWithLocalesEn - By default allows CamelCase words like
AutoReveal - Set
enforceCamelCaseLower: trueto flag CamelCase as incorrect
Usage (flat config)
// eslint.config.mjs
import tsparser from "@typescript-eslint/parser";
import { defineConfig } from "eslint/config";
import obsidianmd from "eslint-plugin-obsidianmd";
export default defineConfig([
...obsidianmd.configs.recommended,
// Or include English locale files (JSON and TS/JS modules)
// ...obsidianmd.configs.recommendedWithLocalesEn,
{
files: ["**/*.ts"],
languageOptions: {
parser: tsparser,
parserOptions: { project: "./tsconfig.json" },
},
// Optional project overrides
rules: {
"obsidianmd/ui/sentence-case": [
"warn",
{
brands: ["YourBrand"],
acronyms: ["OK"],
enforceCamelCaseLower: true,
},
],
},
},
]);
Notes
- Hyphenated words:
Auto-Revealbecomesauto-reveal - Locale file patterns in
recommendedWithLocalesEn:en*.json,en*.ts,en*.js,en/**/*
Known limitations
Sentence detection may incorrectly split on abbreviations (Dr., Inc., etc.). Use single sentences or adjust rule options when needed.