Initialize or upgrade an Obsidian plugin project with modern 2025 tooling
Sets up an Obsidian plugin project with TypeScript, esbuild, and automated CI/CD workflows.
/plugin marketplace add cameronsjo/claude-marketplace/plugin install obsidian-dev@cameronsjo[plugin-name]/obsidian.init # Initialize in current directory
/obsidian.init my-cool-plugin # Create new plugin directory
Sets up a complete Obsidian plugin project with:
First, determine if this is a new project or upgrade:
manifest.json (Obsidian plugin marker)package.jsonsrc/main.ts or main.tsIf creating new plugin, ask for:
my-cool-plugin)My Cool Plugin)1.5.0{
"id": "{{plugin-id}}",
"name": "{{plugin-name}}",
"version": "1.0.0",
"minAppVersion": "1.5.0",
"description": "{{description}}",
"author": "{{author}}",
"authorUrl": "https://github.com/{{author}}",
"isDesktopOnly": false
}
{
"name": "{{plugin-id}}",
"version": "1.0.0",
"description": "{{description}}",
"main": "main.js",
"scripts": {
"dev": "node esbuild.config.mjs",
"build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production",
"test": "jest",
"lint": "eslint src --ext .ts",
"format": "prettier --write src/**/*.ts"
},
"keywords": ["obsidian-plugin"],
"author": "{{author}}",
"license": "MIT",
"devDependencies": {
"@types/node": "^20.0.0",
"@typescript-eslint/eslint-plugin": "^7.0.0",
"@typescript-eslint/parser": "^7.0.0",
"builtin-modules": "^3.3.0",
"esbuild": "^0.20.0",
"eslint": "^8.57.0",
"jest": "^29.0.0",
"obsidian": "latest",
"prettier": "^3.0.0",
"ts-jest": "^29.0.0",
"typescript": "^5.4.0"
}
}
{
"compilerOptions": {
"baseUrl": ".",
"inlineSourceMap": true,
"inlineSources": true,
"module": "ESNext",
"target": "ES6",
"allowJs": true,
"noImplicitAny": true,
"moduleResolution": "node",
"importHelpers": true,
"isolatedModules": true,
"strictNullChecks": true,
"strict": true,
"lib": ["DOM", "ES5", "ES6", "ES7"]
},
"include": ["src/**/*.ts"]
}
Use the standard Obsidian esbuild configuration with:
src/main.tsmain.js (CommonJS){
"1.0.0": "1.5.0"
}
node_modules/
main.js
*.js.map
.DS_Store
Create minimal plugin skeleton with:
onload() with settings loadingonunload() stubexport interface PluginSettings {
// Add settings here
}
export const DEFAULT_SETTINGS: PluginSettings = {
// Add defaults here
};
Basic SettingTab implementation.
name: CI
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "20.x"
cache: "npm"
- run: npm ci
- run: npm run lint
- run: npm run build
- run: npm test
Full Release Please configuration that:
BRAT beta channel workflow that:
[beta] keyword in commit{
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
"packages": {
".": {
"release-type": "node",
"bump-minor-pre-major": true,
"bump-patch-for-minor-pre-major": true,
"extra-files": ["manifest.json"]
}
},
"separate-pull-requests": false
}
{
".": "1.0.0"
}
npm install to install dependenciesnpm run dev for developmentIf existing Obsidian plugin detected:
After completion, display:
ā
Obsidian plugin initialized!
š Created files:
- manifest.json
- package.json
- tsconfig.json
- esbuild.config.mjs
- src/main.ts
- src/types.ts
- src/settings.ts
- .github/workflows/ci.yml
- .github/workflows/release-please.yml
- .github/workflows/beta-release.yml
š¦ Next steps:
1. npm install
2. npm run dev (start development)
3. Commit with conventional commits
4. Push to GitHub for CI/CD