Obsidian Plugin Development
Comprehensive guidelines for Obsidian.md plugin development including ESLint rules, TypeScript best practices, and submission requirements.
Prerequisites
- •TypeScript knowledge
- •Familiarity with Obsidian.md
- •Node.js environment
Instructions
Core Principles
- •Memory Safety: Prevent leaks through proper resource management
- •Type Safety: Use proper type narrowing, avoid unsafe casts
- •API Best Practices: Follow Obsidian's recommended patterns
- •User Experience: Maintain UI/UX consistency
- •Accessibility: Keyboard and screen reader support (MANDATORY)
Top 10 Critical Rules
- •Plugin ID: No "obsidian", can't end with "plugin"
- •Use
registerEvent()for automatic cleanup - •Use
instanceofinstead of type casting - •Sentence case for all UI text
- •Use
requestUrl()instead offetch() - •Use Obsidian CSS variables for theming
- •Keyboard accessible - all interactive elements
- •No
innerHTML- security risk (XSS) - •No regex lookbehind - iOS < 16.4 incompatible
- •Remove all sample code - MyPlugin, SampleModal, etc.
Essential Do's
typescript
// Use registerEvent for cleanup
this.registerEvent(this.app.vault.on('create', callback));
// Use instanceof for type checking
if (file instanceof TFile) { ... }
// Use Editor API for active file
editor.replaceSelection(text);
// Use Obsidian helpers
containerEl.createDiv({ cls: 'my-class' });
Essential Don'ts
typescript
// Don't store view references this.myView = view; // Memory leak! // Don't use type casting const file = item as TFile; // Use instanceof // Don't use fetch fetch(url); // Use requestUrl() // Don't use innerHTML el.innerHTML = html; // XSS risk
Accessibility (MANDATORY)
- •All interactive elements must be keyboard accessible
- •Provide ARIA labels for icon buttons
- •Define focus indicators using
:focus-visible - •Minimum touch target: 44×44px
Guidelines
- •Use
registerEvent(),addCommand(),registerDomEvent() - •Use
this.appnot globalapp - •Use
Vault.process()for background file modifications - •Use
normalizePath()for user paths - •Test on mobile if not desktop-only
Notes
- •Based on
eslint-plugin-obsidianmd - •Boilerplate generator available:
/create-plugin - •Always test with keyboard navigation
Source: gapmiss/obsidian-plugin-skill