Obsidian Hello World Plugin

VerifiedSafe

Build a minimal working Obsidian plugin with commands, settings, and ribbon icons. Ideal for learning basic Obsidian plugin patterns.

Sby Skills Guide Bot
DevelopmentBeginner
7/25/2026
Claude Code
#obsidian#plugin-development#typescript#tutorial#scaffolding

Recommended for

Automated summary

Generates a minimal working Obsidian plugin demonstrating commands, settings, and ribbon icons.

Strengths

  • Provides complete, copy-ready TypeScript for the main plugin class, a settings tab, and a modal
  • Covers core patterns: callback and editorCallback commands, settings load/save, and addRibbonIcon
  • Includes build and in-Obsidian test steps to verify the result quickly

Limitations

  • Assumes install/auth setup and a working build pipeline already exist
  • Does not cover publishing, versioning, or automated testing of the plugin
When to use it

Use it when building your first Obsidian plugin or checking that your development vault and build setup work end to end.

When not to use it

Skip it if you need advanced plugin patterns (custom views, complex integrations, release/publishing) or your development vault is not yet configured.

Security analysis

Safe
Quality score90/100

The skill only provides TypeScript code and documentation for creating an Obsidian plugin. It does not instruct destructive actions, credential exfiltration, obfuscated execution, or safety-disabling behavior, and the declared allowed-tools are limited to Read, Write, and Edit.

No concerns found

How this analysis is made

Examples

First plugin scaffold
Create a minimal Obsidian plugin called My Plugin with a ribbon icon, a 'Show Greeting' command, and a settings tab for the greeting text.
Add a modal command
Extend my Obsidian hello world plugin with a command that opens a modal displaying the configured greeting.

name: obsidian-hello-world description: | Create a minimal working Obsidian plugin with commands and settings. Use when building your first plugin feature, testing your setup, or learning basic Obsidian plugin patterns. Trigger with phrases like "obsidian hello world", "first obsidian plugin", "obsidian quick start", "simple obsidian plugin". allowed-tools: Read, Write, Edit version: 1.0.0 license: MIT author: Jeremy Longshore jeremy@intentsolutions.io

Obsidian Hello World

Overview

Build a minimal working Obsidian plugin demonstrating core features: commands, settings, and ribbon icons.

Prerequisites

  • Completed obsidian-install-auth setup
  • Development vault configured
  • Build pipeline working

Instructions

Step 1: Create Main Plugin Class

// src/main.ts
import { App, Editor, MarkdownView, Modal, Notice, Plugin, PluginSettingTab, Setting } from 'obsidian';

interface MyPluginSettings {
  greeting: string;
}

const DEFAULT_SETTINGS: MyPluginSettings = {
  greeting: 'Hello, Obsidian!'
}

export default class MyPlugin extends Plugin {
  settings: MyPluginSettings;

  async onload() {
    await this.loadSettings();

    // Add ribbon icon
    this.addRibbonIcon('dice', 'Greet Me', (evt: MouseEvent) => {
      new Notice(this.settings.greeting);
    });

    // Add command to command palette
    this.addCommand({
      id: 'show-greeting',
      name: 'Show Greeting',
      callback: () => {
        new Notice(this.settings.greeting);
      }
    });

    // Add command with editor context
    this.addCommand({
      id: 'insert-greeting',
      name: 'Insert Greeting at Cursor',
      editorCallback: (editor: Editor, view: MarkdownView) => {
        editor.replaceSelection(this.settings.greeting);
      }
    });

    // Add settings tab
    this.addSettingTab(new MySettingTab(this.app, this));
  }

  onunload() {
    console.log('Goodbye from My Plugin!');
  }

  async loadSettings() {
    this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
  }

  async saveSettings() {
    await this.saveData(this.settings);
  }
}

Step 2: Create Settings Tab

// Add to src/main.ts
class MySettingTab extends PluginSettingTab {
  plugin: MyPlugin;

  constructor(app: App, plugin: MyPlugin) {
    super(app, plugin);
    this.plugin = plugin;
  }

  display(): void {
    const { containerEl } = this;
    containerEl.empty();

    containerEl.createEl('h2', { text: 'My Plugin Settings' });

    new Setting(containerEl)
      .setName('Greeting')
      .setDesc('The message to display when greeting')
      .addText(text => text
        .setPlaceholder('Enter your greeting')
        .setValue(this.plugin.settings.greeting)
        .onChange(async (value) => {
          this.plugin.settings.greeting = value;
          await this.plugin.saveSettings();
        }));
  }
}

Step 3: Create a Modal

// Add to src/main.ts
class GreetingModal extends Modal {
  greeting: string;

  constructor(app: App, greeting: string) {
    super(app);
    this.greeting = greeting;
  }

  onOpen() {
    const { contentEl } = this;
    contentEl.createEl('h1', { text: this.greeting });
    contentEl.createEl('p', { text: 'Click outside or press Escape to close.' });
  }

  onClose() {
    const { contentEl } = this;
    contentEl.empty();
  }
}

// Add to onload():
this.addCommand({
  id: 'show-greeting-modal',
  name: 'Show Greeting Modal',
  callback: () => {
    new GreetingModal(this.app, this.settings.greeting).open();
  }
});

Step 4: Build and Test

# Build the plugin
npm run build

# In Obsidian:
# 1. Open Settings > Community plugins
# 2. Enable "My Plugin"
# 3. Click the dice icon in ribbon
# 4. Open command palette (Ctrl/Cmd+P) and search "Show Greeting"

Output

  • Working plugin with:
    • Ribbon icon that shows a notice
    • Commands in command palette
    • Editor command to insert text
    • Settings tab to configure greeting
    • Modal for displaying content

Error Handling

| Error | Cause | Solution | |-------|-------|----------| | Plugin not loading | Build errors | Check console for TypeScript errors | | Settings not saving | Missing loadData/saveData | Verify async/await usage | | Command not showing | Plugin not enabled | Enable in Community Plugins | | Ribbon icon missing | Wrong icon name | Use valid Lucide icon name |

Examples

Available Icon Names

Obsidian uses Lucide icons. Common examples:

  • file-text, folder, search, settings
  • star, heart, bookmark, tag
  • edit, trash, copy, clipboard
  • link, external-link, globe
  • dice, bot, sparkles, wand

Status Bar Item

// Add to onload():
const statusBarItem = this.addStatusBarItem();
statusBarItem.setText('Plugin Active');

Register Event Listeners

// Listen to file open
this.registerEvent(
  this.app.workspace.on('file-open', (file) => {
    if (file) {
      console.log('Opened:', file.path);
    }
  })
);

Resources

Next Steps

Proceed to obsidian-local-dev-loop for hot-reload development workflow.

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/obsidian-hello-world-plugin-mrzxuqjq/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/obsidian-hello-world-plugin-mrzxuqjq' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/obsidian-hello-world-plugin-mrzxuqjq/download' --output '.skill-downloads/obsidian-hello-world-plugin-mrzxuqjq/SKILL.md.part' && mv '.skill-downloads/obsidian-hello-world-plugin-mrzxuqjq/SKILL.md.part' '.skill-downloads/obsidian-hello-world-plugin-mrzxuqjq/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

Tools declared by the author (check availability in your agent): Read, Write, Edit

Original excerpt: Prerequisites
  • Completed obsidian-install-auth setup
  • Development vault configured
  • Build pipeline working

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.

Claude Code
test -f '.skill-downloads/obsidian-hello-world-plugin-mrzxuqjq/SKILL.md' && test -s '.skill-downloads/obsidian-hello-world-plugin-mrzxuqjq/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/obsidian-hello-world' && cp -R '.skill-downloads/obsidian-hello-world-plugin-mrzxuqjq' '.claude/skills/obsidian-hello-world'

OpenSkills

OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.

Official OpenSkills installation
openskills install './.skill-downloads/obsidian-hello-world-plugin-mrzxuqjq'

openskills read 'obsidian-hello-world-plugin-mrzxuqjq'

Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.

For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.

openskills sync

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/obsidian-hello-world-plugin-mrzxuqjq/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills