Lossless Changelog
product

Perplexed

lossless-group/perplexed-pluginmain

2026-07-24 · 1 entry2026-07-06 · 1 entry2026-05-27 · 1 entry2026-05-26 · 2 entries2026-05-20 · 1 entry2026-05-19 · 2 entries2026-05-12 · 1 entry2026-05-10 · 1 entry2026-05-02 · 1 entry2026-05-01 · 1 entry2026-04-30 · 1 entry2025-07-19 · 1 entry2026-05-09 · 26 commits · 2,929 code
Jan 20252026Sept 2026
  • colour = whenJan 2025 → Sept 2026

167 commits · +34,126 lines

Code
26k75%
Context
4k13%
Changelog
4k12%

CORS block fixed — Perplexity streaming now routes through Node.js and never touches Chromium's CORS enforcement

Perplexity streaming stopped working when Perplexity's API began enforcing CORS headers that block requests originating from app://obsidian.md. Both streaming call sites — the modal query flow and the directory-template batch runner — were using activeWindow.fetch, which runs in Electron's Chromium renderer and is fully CORS-constrained. Both are now replaced with Node.js https.request, which routes through the OS network stack and is never subject to CORS enforcement.

Michael Staton

Two analyst-grade templates land — spec profiles and market-category profiles — plus two quiet bugs the testing pass caught

Perplexed now ships templates for profiling open specs (with five-way authority typing and three-tier adoption) and named market categories (with explicit financial-stage tiers for incumbents, challengers, and innovators). The third shipped thing was a max_tokens override we built after diagnosing why the first real spec profile stopped halfway through with no warning at all. The fourth was a rendering-discipline upgrade — strengthened mermaid rules plus new LaTeX rules — after diagnosing that the vault's concept-profile template had drifted from the bundled source and was generating diagrams with no rendering rules in scope at all.

Michael Staton
  • Directory-Templates
  • Standards-and-Specs
  • Market-Categories
  • Three-Tier-Framing
  • Deep-Research
  • cft-Block
  • +7

From buildable to actually-works-in-vault — the Gemini provider's first day in Obsidian

The Gemini provider shipped yesterday as TypeScript that compiled. Today it became TypeScript that runs cleanly inside Obsidian: CORS-blocked fetch swapped for Obsidian's requestUrl (with bonus page-title + canonical-URL parsing), API-key auth moved from query string to header, default model switched to `gemini-flash-latest` so the free tier doesn't wall the first request, the modal got real CSS, the template seeder stopped crashing on its own previously-written files, network drops mid-stream now surface as plain-English notices instead of stack traces, three system-prompt textareas grew from 200px-wide cramped slots to full-width 3-line rows, and a long-standing `addClass` token bug that was silently breaking eight settings sections finally got cleared.

  • Gemini
  • requestUrl
  • CORS
  • Canonical-URLs
  • Modal-Styling
  • Seeder-Idempotency
  • +3

Partials and preambles for directory templates — and the one-line fix that resurrected eleven hidden settings sections

Shared guidance for the four Obsidian profile templates (mermaid discipline, citation enforcement, image-placement, research-framing) used to be duplicated across templates or hardcoded in TypeScript; today it moved into vault-visible `partials/` and `preambles/` folders that templates pull in by `{{include: name}}` and that the runtime auto-attaches to every Perplexity request. While checking the UI shipped, we discovered the Perplexed settings tab only ever rendered its first section — Perplexity — because a stray `activeDocument.createEl('textarea')` was throwing in this Obsidian version and aborting `display()` before Claude, Perplexica/Vane, LM Studio, and eight other sections could mount. One-line fix: switch eight call sites to `containerEl.createEl`.

  • Directory-Templates
  • Partials
  • Preambles
  • Template-Engine
  • Mermaid
  • Settings-UI
  • +2

Gemini joins the provider lineup — and brings the per-claim citation that Claude's dynamic-filter lost

Perplexed now ships a fourth AI provider: Gemini, with Google Search grounding. Gemini's `groundingSupports[]` carries per-segment attribution (text span → source URL) that survives intact, where Claude's `web_search_20260209` dynamic-filter sandbox drops it on the floor. Same modal UX as Ask Claude, same Citations footer shape so cite-wide hex substitution stays provider-agnostic. Two Gemini-specific quirks surfaced when we dissected a real response with curl: chunk URLs are short-lived `vertexaisearch.cloud.google.com` redirects that rot in ~30 days (the plugin resolves them to durable source URLs before writing), and the spec's `searchEntryPoint.renderedContent` is 5KB of inline-styled HTML that Obsidian's Markdown renderer can't display (replaced with a Markdown list of the queries, each linked to google.com/search).

  • Gemini
  • Google-Search-Grounding
  • Provider-Lineup
  • Citations
  • GroundingSupports
  • Grounding-Redirect-URLs
  • +1

Marketplace compliance — sentence-case UI, no-restricted-globals fix, async hygiene

Brings the plugin to clean against ObsidianReviewBot's recommended eslint config: applies all 73 sentence-case rewrites the bot demanded (brand names lowercased mid-string — to be restored after marketplace acceptance), refactors four streaming fetch() call sites to activeWindow.fetch so the no-restricted-globals rule is satisfied without a disable directive, drops async on a callback and on listTemplates that had no await expression, and drops six unused catch bindings to clear the optional warnings. Both the local eslint config and the bot-mirror recommended config now exit 0; tsc passes; production esbuild passes.

  • Marketplace-Compliance
  • ObsidianReviewBot
  • Sentence-Case
  • eslint
  • no-restricted-globals
  • activeWindow
  • +1

Directory templates — per-folder content generation paradigm with auto-seeding

Ships the cf/cft codefence DSL, four directory templates (concept, vocabulary, source, toolkit), streaming + cleanup pipeline with image marker placement and fallback, anti-incumbent editorial stance, cite-wide-compatible sources footer, frontmatter run-stamps, Google Books URL harvesting for book sources, and a first-run seeder that drops shipped templates plus a README into the user's vault on plugin load.

Michael Staton
  • Directory-Templates
  • Content-Generation
  • Codefence-DSL
  • Perplexity-Streaming
  • SSE
  • Image-Embedding
  • +4

UX pass: modal redesign + wide-modal CSS unlock

The three 'Ask <provider>' modals — Ask Perplexity, Ask Claude, and Ask Perplexica — all have beautiful, wide, and consistent Modal UIs now.

Michael Staton
  • UX-Pass
  • Modal-Redesign
  • Ask-Perplexity
  • Ask-Claude
  • Ask-Perplexica
  • Obsidian-Modal-CSS
  • +2

Claude provider integration: Anthropic SDK + Ask Claude modal + two-pass citation extraction

Claude is now a first-class research provider in Perplexed — wired via the Anthropic SDK with server-side web_search, adaptive thinking, streaming, an Ask Claude command, and a citations pipeline that handles both per-claim text-block citations and bare web_search_tool_result fallbacks.

Michael Staton
  • Provider-Integration
  • Claude
  • Anthropic-SDK
  • Web-Search
  • Citations
  • Adaptive-Thinking
  • +2

Streaming Perplexity through a modal — Perplexed comes online

Perplexed's identity moment landed July 19, 2025: the first time an API call to Perplexity ran through the plugin's modal and streamed responses back into the note. Not perfect, but real. Logged retrospectively from 2026 — the convention came after the fact.

Michael Staton