A comprehensive agent skill for developing high-quality Obsidian plugins that follow best practices, pass code review, and adhere to official submission guidelines.
Repo: gapmiss/obsidian-plugin-skill
What's inside
A comprehensive agent skill for developing high-quality Obsidian plugins that follow best practices, pass code review, and adhere to official submission guidelines.
This skill provides your coding agent with deep knowledge of Obsidian plugin development standards, including:
eslint-plugin-obsidianmd v0.4.2getSettingDefinitions()), the Obsidian 1.13 settings APInpx skills add https://github.com/gapmiss/obsidian-plugin-skill --skill obsidian
Clone this repository:
git clone https://github.com/gapmiss/obsidian-plugin-skill.git
cd obsidian-plugin-skill
Run the installer:
./install-skill.sh
Select your provider(s):
.agents/skills/ and .claude/skills/.claude/skills/ with slash commands.agents/skills/.agents/skills/Choose installation target (current directory or custom path)
git clone https://github.com/gapmiss/obsidian-plugin-skill.git
cd obsidian-plugin-skill
# Copy skill
mkdir -p your-project/.claude/skills/obsidian
cp -r .agents/skills/obsidian/* your-project/.claude/skills/obsidian/
# Copy slash commands
mkdir -p your-project/.claude/commands
cp .claude/commands/obsidian.md your-project/.claude/commands/
cp .claude/commands/create-plugin.md your-project/.claude/commands/
git clone https://github.com/gapmiss/obsidian-plugin-skill.git
cd obsidian-plugin-skill
# Copy skill
mkdir -p your-project/.agents/skills/obsidian
cp -r .agents/skills/obsidian/* your-project/.agents/skills/obsidian/
Just open this directory with your coding agent — no installation needed!
The skill uses progressive disclosure for optimal performance:
.agents/skills/obsidian/
├── SKILL.md # Main overview (~325 lines)
└── reference/ # Detailed documentation
├── memory-management.md # Lifecycle & cleanup patterns
├── type-safety.md # Type narrowing & safety
├── ui-ux.md # UI standards & commands
├── file-operations.md # Vault & file API
├── css-styling.md # Theming & styling
├── accessibility.md # A11y requirements (MANDATORY)
├── code-quality.md # Best practices & security
├── submission.md # Publishing guidelines
├── community-scanner.md # Scanner behavior & Scorecard (version-stamped)
└── eslint-setup.md # Complete ESLint config guide
SKILL.md provides a concise overview with ESLint rules and Scorecard guidance, while reference files contain comprehensive details on specific topics.
The fastest way to start a new Obsidian plugin with all best practices built-in:
node /path/to/obsidian-plugin-skill/tools/create-plugin.js
Features:
src/ directory structure with main.ts and settings.tsgetSettingDefinitions()), so it's lint-clean and searchable on Obsidian 1.13+. To target older Obsidian, lower minAppVersion and add a display() fallback — see Path BWhat it creates:
your-plugin/
├── src/
│ ├── main.ts # Plugin class with settings integration
│ └── settings.ts # Settings interface, defaults, and declarative tab
├── manifest.json # Validated plugin metadata
├── styles.css # CSS with Obsidian variables
├── tsconfig.json # TypeScript configuration
├── package.json # Dependencies
├── esbuild.config.mjs # Build configuration
├── eslint.config.mjs # ESLint configuration
├── version-bump.mjs # Version management script
├── versions.json # Version tracking
├── .gitignore # Git ignore rules
└── LICENSE # MIT license
Interactive prompts:
1.13.0)Real-time validation catches common mistakes:
❌ Validation Errors:
• Plugin ID cannot contain "obsidian"
• Plugin name cannot end with "Plugin"
• Description must end with punctuation: . ? ! or )
| Provider | Load skill | Create plugin |
|---|---|---|
| Claude Code | /obsidian | /create-plugin |
| Codex (OpenAI) | $obsidian | — |
| Windsurf | @obsidian | — |
Skills are automatically discovered by your agent when present in the project directory. You can also invoke them explicitly using the commands above.
Just ask your agent naturally:
Help me implement a new command for my Obsidian plugin
Your agent will automatically use the Obsidian skill guidelines while helping you write code.
data-tooltip-positionThe main SKILL.md file highlights the most important rules organized by category:
Submission & Naming:
.?!) punctuationMemory & Lifecycle:
6. Use registerEvent() for automatic cleanup
7. Don't store view references in plugin
8. Don't call detachLeavesOfType() in onunload
Type Safety:
9. Use instanceof instead of type casting for TFile/TFolder
10. Use .instanceOf(T) for cross-window DOM checks
UI/UX:
11. Use sentence case for all UI text (ui/sentence-case, enabled as warn in v0.4.0)
12. Sentence case in locale JSON files
13. Sentence case in TS/JS locale modules
14. No "command" in command names/IDs
15. No plugin ID/name in command IDs/names
16. No default hotkeys
17. Use .setHeading() for settings headings
Declarative Settings (Obsidian 1.13+):
display() while minAppVersion < 1.13.0 (settings-tab/require-display)getSettingDefinitions() so settings appear in global search (settings-tab/prefer-setting-definitions)this.update(), not this.display() (settings-tab/prefer-update-over-display)display() once minAppVersion >= 1.13.0 and definitions exist (settings-tab/no-deprecated-display)API Best Practices:
18. Use Editor API for active file edits
19. Use Vault.process() for background file mods
20. Use FileManager.trashFile() for file deletion
21. Use Vault.getAbstractFileByPath() instead of iterating files
22. Use normalizePath() for user paths
23. Use Platform API for OS detection
24. Use requestUrl() instead of fetch()
25. No console.log in onload/onunload in production
26. Use built-in AbstractInputSuggest
27. Check minAppVersion for API compatibility
Popout Window Compatibility:
28. Use activeDocument/activeWindow instead of globals (prefer-active-doc, still off by default — enable manually)
29. Use activeWindow.setTimeout() for timers
Event Handling:
30. Check evt.defaultPrevented in editor-drop/paste handlers
Styling:
31. Use Obsidian CSS variables
32. Scope CSS to plugin containers
33. Don't create <link> or <style> elements
Accessibility (MANDATORY): 34. Make all interactive elements keyboard accessible 35. Provide ARIA labels for icon buttons 36. Define clear focus indicators
Security & Compatibility:
innerHTML/outerHTMLCode Quality:
Object.assignregisterEvent(), addCommand(), registerDomEvent(), registerInterval()instanceof instead of type castingany typeconst and let over varAccessibility (A11y) - MANDATORY
:focus-visible)FAQ
obsidian-plugin-skill is a Claude Code plugin with hand-picked skills for development work, indexed on Flowy. Install it with the command on its page. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Is this plugin yours?
Claim it with GitHubSubmit a pluginPromote it