skillZs
★ LIVE SKILL TAGS ★
>>> LIVE SKILLS INDEX <<<
* OPEN SOURCE *
NO LOGIN, NO TRACKING
※ REAL INSTALL DATA ※
← back to all skills
akillness/jeo-skills221 installs

obsidian-plugin

ALIAS — merged into the unified `obsidian` skill (v2.0). Use the `obsidian` skill instead. Build, validate, and publish Obsidian plugins. Redirects to obsidian skill for plugin development, ESLint rules, boilerplate generation, accessibility, and submission validation.

How do I install this agent skill?

npx skills add https://github.com/akillness/jeo-skills --skill obsidian-plugin
view source ↗

Is this agent skill safe to install?

  • Gen Agent Trust Hubpass

    This skill provides a comprehensive toolkit for developing Obsidian plugins, including a boilerplate generator, setup scripts, and extensive documentation on best practices like accessibility, memory management, and security. The tool chain and dependencies are standard for the developer use-case, and the code includes sanitization for project metadata.

  • Socketwarn

    1 alert: gptSecurity

  • Snykpass

    Risk: LOW · No issues

What does this agent skill do?

obsidian-plugin — Obsidian Plugin Development Skill

Keyword: obsidian plugin · create obsidian plugin · obsidian eslint · obsidian submission

Build high-quality Obsidian plugins that pass community review on first attempt. Covers all 27 rules from eslint-plugin-obsidianmd v0.1.9, boilerplate generation, vault API patterns, accessibility requirements, and submission validation.

When to use this skill

  • Generate a new Obsidian plugin project with clean boilerplate (no sample code bloat)
  • Review and fix ESLint violations from eslint-plugin-obsidianmd
  • Prepare a plugin for Obsidian community directory submission
  • Apply memory-safe lifecycle patterns (registerEvent, no view reference storage)
  • Implement proper type safety (no unsafe as TFile casts, no any)
  • Enforce accessibility requirements (keyboard navigation, ARIA labels, focus management)
  • Apply Obsidian CSS variables for theme-compatible styling
  • Validate plugin metadata (manifest.json, plugin ID/name/description rules)

Instructions

Step 1: Generate a new plugin project

# Interactive boilerplate generator — validates metadata against submission rules
node scripts/create-plugin.js

# Or use npx directly from the source repo
npx github:gapmiss/obsidian-plugin-skill create-plugin

The generator produces:

  • src/main.ts — Plugin class with settings integration
  • src/settings.ts — Settings interface and PluginSettingTab
  • manifest.json — Validated plugin metadata
  • styles.css — CSS scaffold with Obsidian variables comment
  • tsconfig.json, package.json, esbuild.config.mjs — Build toolchain
  • version-bump.mjs, versions.json — Version management
  • LICENSE — MIT with auto-populated year/author

Step 2: Install ESLint validation

npm install --save-dev eslint eslint-plugin-obsidianmd
// eslint.config.mjs
import pluginObsidianmd from "eslint-plugin-obsidianmd";
export default [
  pluginObsidianmd.configs.recommended,
  // For locale string checking:
  // pluginObsidianmd.configs.recommendedWithLocalesEn,
];

Run validation:

npx eslint src/
npx eslint src/ --fix   # auto-fix where possible

Step 3: Follow the submission validation workflow

  1. Run bash scripts/install.sh to set up the development environment
  2. Validate plugin ID and name against naming rules (see below)
  3. Run ESLint — all 27 rules must pass
  4. Complete the Code Review Checklist (see References)
  5. Submit PR to obsidianmd/obsidian-releases

Plugin Naming Rules

FieldRule
Plugin IDLowercase, alphanumeric + dashes/underscores; no "obsidian"; no "plugin" suffix
Plugin NameNo "Obsidian" word; no "Plugin" suffix; no "Obsi" prefix or "dian" suffix
DescriptionNo "Obsidian" word; no "This plugin"; must end with ., ?, !, or )
# Validate your manifest.json
node scripts/create-plugin.js --validate-only

ESLint Rules Summary (27 rules)

Submission & Naming

RuleAuto-fixDescription
no-obsidian-in-idNoPlugin ID must not contain "obsidian"
no-plugin-suffix-in-idNoPlugin ID must not end with "-plugin"
no-obsidian-in-nameNoPlugin name must not contain "Obsidian"
no-plugin-suffix-in-nameNoPlugin name must not end with "Plugin"
valid-descriptionNoDescription format validation

Memory & Lifecycle

RuleAuto-fixDescription
prefer-register-eventNoUse this.registerEvent() for automatic cleanup
no-view-referenceNoNever store direct view references (causes memory leaks)

Type Safety

RuleAuto-fixDescription
no-tfile-castNoAvoid as TFile / as TFolder (use instanceof)

UI/UX (sentence-case rules — mostly auto-fixable)

RuleAuto-fixDescription
sentence-caseYesAll UI text in sentence case
no-plugin-name-in-commandNoCommands must not repeat plugin name
no-command-in-commandNoCommands must not include the word "command"
no-default-hotkeyNoDo not define default hotkeys
no-manual-headingsNoSettings UI: use setHeading(), not manual HTML

API Best Practices

RuleAuto-fixDescription
no-global-appNoUse this.app, not global app
prefer-request-urlNoUse requestUrl(), not fetch()
no-console-logNoRemove console.log before submission
prefer-abstract-input-suggestNoUse AbstractInputSuggest for suggestions

Styling

RuleAuto-fixDescription
no-inline-stylesNoUse CSS classes; no inline style attributes
prefer-css-variablesNoUse Obsidian CSS variables, not hardcoded colors
scope-plugin-stylesNoScope all CSS to plugin ID selector

Accessibility (MANDATORY)

RuleAuto-fixDescription
require-aria-labelNoIcon buttons must have aria-label
require-keyboard-navNoAll interactions must be keyboard accessible
require-focus-visibleNoUse :focus-visible CSS for focus indicators

Key Code Patterns

Memory-safe event registration

// ✅ Correct — auto-cleaned on plugin unload
this.registerEvent(
  this.app.vault.on('create', (file) => this.handleCreate(file))
);

// ❌ Wrong — leaks memory
this.app.vault.on('create', (file) => this.handleCreate(file));

Type-safe file access

// ✅ Correct — instanceof narrowing
const file = this.app.workspace.getActiveFile();
if (file instanceof TFile) {
  await this.app.vault.read(file);
}

// ❌ Wrong — unsafe cast
const file = this.app.workspace.getActiveFile() as TFile;

Accessibility — ARIA on icon buttons

// ✅ Correct
const btn = containerEl.createEl('button', { cls: 'clickable-icon' });
btn.setAttribute('aria-label', 'Delete note');
setIcon(btn, 'trash');

// ❌ Wrong — no aria-label
const btn = containerEl.createEl('button', { cls: 'clickable-icon' });
setIcon(btn, 'trash');

CSS with Obsidian variables

/* ✅ Correct — theme-compatible */
.my-plugin-button {
  background-color: var(--interactive-accent);
  color: var(--text-on-accent);
  border-radius: var(--radius-m);
}

/* ❌ Wrong — hardcoded colors */
.my-plugin-button {
  background-color: #7c3aed;
  color: white;
}

Quick Reference

TaskCommand
Generate boilerplatenode scripts/create-plugin.js
Install ESLintnpm install --save-dev eslint eslint-plugin-obsidianmd
Run ESLintnpx eslint src/
Auto-fix ESLintnpx eslint src/ --fix
Build pluginnpm run build
Dev watch modenpm run dev
Bump versionnpm run version

References

Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.

<a href="https://skillzs.dev/skills/akillness/jeo-skills/obsidian-plugin">View obsidian-plugin on skillZs</a>