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
// 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
// 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