← 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.
| Line | Current | Fix |
|---|---|---|
| 439 | id: 'perplexed-debug-commands' | id: 'debug-commands' |
| 448 | id: 'perplexed-reset-prompts' | id: 'reset-prompts' |
| 457 | id: '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
| Line | Current | Fix |
|---|---|---|
| 318 | git 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.1 | Either 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:
pnpm run build— must complete clean (eslint + tsc + esbuild).cat manifest.json— confirm description ≤250 chars, ends in., no “A plugin for…”, nofundingUrl(or a real donation URL).grep -n "perplexed-" main.ts | grep "id:"— must return zero matches.grep -n "your-repo\|<repository-url>\|0.0.0.1" README.md— zero matches.grep -n "Network use" README.md— at least one match.- 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 inmain.ts) - Item 8 — sentence case in settings headings (~9 strings)
- Item 9 — 112
console.logcalls — gate behind a debug flag or strip - Item 10 —
vault.adapter.writeinsrc/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)