Hygiene and scaffolding:
- Add CONTRIBUTING.md
- Add release workflow with build provenance attestation
- Rename plugin from "SEO" to "SEO Checker" in manifest.json
(id stays "seo" so existing installs are unaffected)
- Remove broken preinstall script reference
Dependency hygiene:
- Add pnpm.overrides for vulnerable transitive dev dependencies
(minimatch, picomatch, brace-expansion, ajv, flatted, fast-uri,
yaml)
- Update eslint-plugin-obsidianmd to 0.3.0 and typescript-eslint
to 8.50.1+ to pull in patched transitives
- Update obsidian-dev-skills to 1.2.0
ESLint config:
- Scope obsidianmd recommended rules to TypeScript files only
- Configure obsidianmd/ui/sentence-case with project-specific
acronyms (SEO, MDX, H1-H6, URL, CSV) and ignoreRegex for
quoted button names
Code fixes:
- Remove all 32 eslint-disable-next-line obsidianmd/ui/sentence-case
comments (the rule is not allowed to be disabled). Rewrite the
underlying strings to satisfy sentence case directly, or rely on
the new acronym/ignoreRegex config
- Replace createEl('div'/'span'/'a') with createDiv()/createSpan()/
createEl('a', {...}) across UI components
- Use activeWindow/activeDocument for popout window compatibility
- Prefix unused parameters with underscore, drop unused catch
bindings
- Mark fire-and-forget promises with void
- Fix Markdown capitalization in user-facing strings
- Rephrase A-to-Z sort labels to a-to-z to satisfy sentence case
- Fix Promise/queue contravariance and Timer type assignments
that surfaced after the activeWindow conversions
2.2 KiB
Contributing
Thanks for your interest in contributing. This document describes how to report issues, propose changes, and get a local development environment running.
Reporting issues
- Search existing issues before opening a new one.
- For bugs, include: Obsidian version, plugin version, operating system, reproduction steps, and what you expected vs. what happened. Screenshots or a short screen recording help.
- For feature requests, describe the use case and the problem the feature would solve, not just the proposed solution.
Development setup
Requirements:
- Node.js (LTS recommended)
- pnpm. This repo pins a specific version via
packageManagerinpackage.json.
pnpm install
pnpm dev # watch mode build
pnpm build # production build
pnpm lint # check code style
pnpm lint:fix # auto-fix where possible
Build artifacts (main.js, manifest.json, styles.css) are produced at the repo root.
To test against a real vault, point the build output at <vault>/.obsidian/plugins/<plugin-id>/ (symlink the three files, or use a tool like hot-reload).
Pull requests
- Open an issue first for anything non-trivial so we can agree on direction before you spend time on it.
- Keep PRs focused. One concern per PR is easier to review.
- Run
pnpm lintandpnpm buildbefore submitting; CI will run these too. - Follow the existing code style. Use "properties" (not "frontmatter") when referring to YAML metadata. "Markdown" is always capitalized.
- Update the README if you change user-facing behavior.
Code style
- TypeScript strict mode, no
anyunless unavoidable. - Prefer Obsidian's API (
Vault,MetadataCache,Workspace) over Nodefsfor vault access. - No network requests from the plugin runtime.
Releases
Maintainers cut releases by bumping the version in manifest.json, package.json, and versions.json, committing, then tagging and pushing the tag. The release workflow builds and attaches main.js, manifest.json, and styles.css with build provenance attestation.
License
By contributing, you agree that your contributions will be licensed under the MIT License.