plans
Plan — Migrate the Lossless Plugin Family to Obsidian 1.13
Obsidian 1.13 changed how settings render and get searched, and pnpm 11 changed where its settings live. One playbook, nine plugins, each still standing on its own.
Plan — Migrate the Lossless Plugin Family to Obsidian 1.13
Why Care?
Image Gin found the problems first. On Obsidian 1.14, half its settings tab silently disappeared, none of its settings showed up in Obsidian's new settings search, and pnpm 12 refused to build plugins whose settings still lived in package.json. Then Cite Wide's commands stopped loading. Every plugin in this family was built the same way, so every one is exposed the same way.
This plan applies the fix Image Gin shipped as 0.3.0 to the rest of the family, one plugin at a time.
The non-negotiable: every plugin stands alone
content-farm is a pseudomonorepo. Each plugin is its own repo and its own marketplace release, installed by people who have none of this tree. So:
Each plugin has its own
pnpm-workspace.yamllisting only itself (packages: ['.']). Without one, pnpm walks up tocontent-farm/pnpm-workspace.yamland treats the parent as the workspace root. Five plugins were missing theirs.Tooling is copied, never shared. The test harness, ESLint config, and scripts are copied into each repo. Nothing imports from, scripts against, or symlinks to a sibling or the parent.
Vault-side libraries only override. Anything read from a vault folder such as
zz-cf-lib/falls back to defaults bundled in the plugin.
The playbook (per plugin)
Reference implementation: plugin-modules/image-gin, commits f828afd … 48fd035. Its plan is image-gin/context-v/plans/2026-10-06_Migrate-Settings-Tab-to-Obsidian-1-13-Declarative-API.md.
pnpm settings file. Create or extend
pnpm-workspace.yamlwithpackages: ['.']. Move any"pnpm"block out ofpackage.json, since pnpm 11+ ignores it. KeeponlyBuiltDependenciesfor CI's pnpm 10 and addallowBuildsfor pnpm 11+.Toolchain.
obsidian1.13.1 (pinned), ESLint ^10.12, typescript-eslint 8.71.1, eslint-plugin-obsidianmd ^0.4.2 (the review-bot rules, added where missing), esbuild 0.28.2. Two packages are held on purpose:TypeScript stays at 6.0.3. typescript-eslint supports only
<6.1.0.@types/nodestays on 22. In-app Obsidian updates don't replace Electron, so a 1.13 user can still be on Node 22.
Tests. Copy the zero-dependency harness (esbuild + Node's built-in
node:test). Then write, red first:a settings-definitions spec
an
onload()test asserting every command registers
Settings tab. Move to
getSettingDefinitions()with nodisplay()override and every row carried over. RaiseminAppVersionto 1.13.0 and bump the version a minor, kept identical acrossmanifest.json,package.json, andversions.json. The lint rejects 1.13 APIs until the manifest says 1.13.Docs. README minimum version and anything stale, a changelog entry, and
changelog/releases/<version>.md.Gates, which must all pass before each code commit:
pnpm testtscESLint at 0 errors and 0 warnings
the production bundle
CI=true pnpm@10 install --frozen-lockfile
The family
Current status and the per-plugin checklist live in [[2026-10-07_Upgrading-Plugins-to-Obsidian-1-13-and-the-Current-Stack]] (handoffs/).
| Plugin | Repo | Version | Listed in directory | Settings tab | Own pnpm file | Order |
| image-gin | lossless-group/image-gin | 0.3.0, shipped | yes | ✅ declarative | ✅ | done |
| cite-wide | lossless-group/cite-wide | 0.3.0, shipped | yes | ✅ declarative | ✅ | done |
| perplexed | lossless-group/perplexed-plugin | 0.4.0, shipped | yes | ✅ declarative | ✅ | done |
| metafetch | lossless-group/metafetch | 0.1.7 | submitted | settings-tab.ts | ✅ | 3 |
| stenographer | lossless-group/stenographer | 0.1.0 | — | settings-tab.ts | ✅ | 4 |
| plunk-it | lossless-group/plunk-it | 1.0.0 | — | SettingsTab.ts | ❌ | 5 |
| lmstud-yo | lossless-group/lmstud-yo | 0.1.0 | — | LMStudioSettings.ts | ❌ | 6 |
| file-transporter | lossless-group/google-docs-api-plugin | 0.0.1 | — | GoogleDocsSettings.ts | ❌ | 7 |
| filestarter | lossless-group/obsidian-plugin-starter | 0.0.8 | — | (check) | ❌ | 8 |
| image-wrangler | lossless-group/ai-image-wrangler-obsidian-plugin | 0.0.1 | — | (none found) | ❌ | 9 |
Out of scope:
grab-reference and obsidian-task-manager have no plugin manifest. grab-reference is a multi-package app repo.
Third-party submodules are only synced:
obsidian-textgenerator-pluginis already at upstream 0.8.11-beta.The
obsidian-gitfork merged 47 upstream commits to 2.41.1 (c68e277). Upstream made the sameminAppVersion1.13.0 move.
Releases
Pushing development is part of each plugin's work. Tagging a release is gated on the operator. Directory-listed plugins (cite-wide, perplexed) follow image-gin's release procedure:
Fast-forward
development→main→master.Tag with no
vprefix.The attested release workflow runs.
Verify the release.
The parent's submodule pointers are bumped once, at wrap-up.
Related
[[Dependency-Upgrades-Across-Plugin-Family]]: the July toolchain campaign this continues
context-v/reminders/Obsidian-Marketplace-Compliance.md: portal rules beyond lint