← Corpus / perplexed / plan

Plan — Submission Blockers Punch List (from docs.obsidian.md re-read)

Path
plans/2026-05-02_Submission-Blockers-Punch-List.md
Authors
Michael Staton
Augmented with
Claude Code (Opus 4.7, 1M context)

Plan — Submission Blockers Punch List

Context

Companion to 20206-05-02_Assuring-Obsidian-Community-Plugin-Requirements.md (which covered type-safety + base metadata). This punch list was generated by re-reading the canonical Obsidian docs end-to-end and grepping current Perplexed source against every named requirement. The grep produced six items that will block (or near-certainly block) a community-plugin PR.

Three classes of issue showed up clean and need no work: HTML injection (innerHTML/outerHTML/insertAdjacentHTML), global app access (window.app / bare app), and sample-plugin remnants (MyPlugin, SampleSettingTab).

Scope of this plan: knock out the six docs-derived blockers (items 1-6 from the audit). Items 7-9 (settings <h3>setHeading(), sentence-case headings, console.log hygiene) are will-be-flagged-by-reviewer items but not strict blockers; they’re tracked as a separate phase below and held unless the user wants them in this pass.

The six blockers

1. Command IDs prefixed with the plugin ID

File: main.ts

Three commands include perplexed- in their id. Obsidian auto-prefixes every command with the plugin ID, so these will register as perplexed.perplexed-debug-commands and friends — a doubled ID pattern the docs explicitly call out.

LineCurrentFix
439id: 'perplexed-debug-commands'id: 'debug-commands'
448id: 'perplexed-reset-prompts'id: 'reset-prompts'
457id: 'perplexed-reinitialize-services'id: 'reinitialize-services'

Three single-token edits.

2. manifest.json description: anti-pattern start + missing provider

File: manifest.json (line 6)

Current:

"description": "A plugin for Obsidian that allows you to generate source-cited content using AI using Perplexity and Perplexica."

Two problems:

  • Starts with “A plugin for Obsidian” — the docs explicitly say “Avoid starting your description with ‘This is a plugin’, because it’ll be obvious to users in the context of the Community Plugins directory.”
  • Doesn’t mention Anthropic Claude or LM Studio, both of which now ship as first-class providers.

Replace with an action-verb-led description, ≤250 chars, ends with period, all four providers named:

"description": "Generate source-cited research content from Perplexity, Anthropic Claude, Perplexica, or local LM Studio — directly into your notes."

(Length: 132 chars.)

3. fundingUrl points at company website, not a donation service

File: manifest.json (line 9)

Current: "fundingUrl": "https://lossless.group"

Docs are explicit: “If you don’t accept donations, remove fundingUrl from your manifest.” lossless.group is the company site, not a donation endpoint (Buy Me a Coffee / GitHub Sponsors / Patreon / etc.).

Decision needed at execution time — default to remove the field unless the user wants a real donations link. Removing is the conservative choice and matches the doc’s stated default. If the user later wants to accept donations, adding fundingUrl back is a one-line manifest edit.

4. Settings tab top-level heading

File: main.ts (line 1026)

Current:

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

Docs: “Avoid adding a top-level heading in the settings tab, such as ‘General’, ‘Settings’, or the name of your plugin. If you have more than one section under settings, and one contains general settings, keep them at the top without adding a heading.”

This violates two rules at once: (a) it’s a top-level heading, (b) it has “Settings” in it. Delete the line entirely.

5. README placeholders and stale version

File: README.md

LineCurrentFix
318git clone <repository-url>git clone https://github.com/lossless-group/perplexed-plugin.git
607[Issues](https://github.com/your-repo/issues)[Issues](https://github.com/lossless-group/perplexed-plugin/issues)
622**Version**: 0.0.0.1Either delete (the manifest is the source of truth) or update to **Version**: 0.1.0. Recommend delete — stale version footers rot.
624**Support**: [GitHub Issues](https://github.com/your-repo/issues)**Support**: [GitHub Issues](https://github.com/lossless-group/perplexed-plugin/issues)

6. README missing required network / account disclosures

File: README.md (insert section)

Per Developer Policies, two disclosures apply and are required in the README:

  • “Network use. Clearly explain which remote services are used and why they’re needed.”
  • “An account is required for full access.” (Perplexity and Anthropic both require paid API keys.)

Currently the README walks through using each provider but never consolidates the network/account picture in one disclosed place, and never mentions Anthropic Claude at all — which got added after the README was last updated.

Add a ## Network use & accounts section near the top of the README (after the Key Features list, before Table of Contents). Suggested copy:

## Network use and accounts

Perplexed contacts these remote services on your behalf when you invoke
their respective commands. Nothing is sent automatically — only the
prompts you submit through a command modal.

| Provider | Endpoint | Account | API key |
|---|---|---|---|
| Perplexity | `https://api.perplexity.ai/chat/completions` | Required | Required (paid) |
| Anthropic Claude | `https://api.anthropic.com/v1/messages` | Required | Required (paid) |
| Perplexica | `http://localhost:3030/api/search` (default; user-configurable) | Not required | Not required (self-hosted) |
| LM Studio | `http://localhost:1234/v1/chat/completions` (default; user-configurable) | Not required | Not required (runs locally) |

The plugin sends only the contents of your query and any selected text
that you explicitly include. It does not collect telemetry, ship vault
content anywhere else, or update itself — Obsidian handles plugin
updates through the community-plugin directory.

Verification

After all six fixes:

  1. pnpm run build — must complete clean (eslint + tsc + esbuild).
  2. cat manifest.json — confirm description ≤250 chars, ends in ., no “A plugin for…”, no fundingUrl (or a real donation URL).
  3. grep -n "perplexed-" main.ts | grep "id:" — must return zero matches.
  4. grep -n "your-repo\|<repository-url>\|0.0.0.1" README.md — zero matches.
  5. grep -n "Network use" README.md — at least one match.
  6. Open Obsidian → Settings → Perplexed → confirm no top-level “Perplexed Plugin Settings” heading at the top of the panel.

Out of scope (next pass)

These are will-be-flagged-by-reviewer items, not strict blockers, and are held for a separate focused commit:

  • Item 7 — settings tab <h3>/<h4>setHeading() (11 sites in main.ts)
  • Item 8 — sentence case in settings headings (~9 strings)
  • Item 9 — 112 console.log calls — gate behind a debug flag or strip
  • Item 10 — vault.adapter.write in src/utils/logger.ts:64 — verify whether the log file is inside or outside the vault, decide Vault-API switch vs adopting an “accesses files outside vault” disclosure

Files Touched (when this plan executes)

perplexed/
├── manifest.json                         (description rewrite; remove fundingUrl)
├── main.ts                               (3 command id renames; delete settings top-level h2)
├── README.md                             (4 placeholder/stale fixes; insert Network use section)
└── context-v/
    └── plans/
        └── 2026-05-02_Submission-Blockers-Punch-List.md   (this file)