|
| 1 | +**Ask Gemini joins Perplexity, Claude, Perplexica, and LM Studio as Perplexed's fourth research provider — Google Search grounded, with the per-claim citation attribution Claude's `web_search` round-trip silently loses.** |
| 2 | + |
| 3 | +## Why care? |
| 4 | + |
| 5 | +If you fill research notes in Obsidian — concept profiles, source dossiers, vocabulary entries, anything where the citation matters as much as the body — Perplexed 0.2.0 changes two things that show up the moment you use it. |
| 6 | + |
| 7 | +**You have a fourth research provider, and it cites better than the three before it.** Ask Gemini joins the lineup with full Google Search grounding turned on by default. Where Claude's newer `web_search_20260209` drops per-claim citations on the round-trip through its dynamic-filtering sandbox (sources come back, attribution doesn't — text blocks return with `citations: null`), Gemini's `groundingSupports[]` carries the segment-to-source mapping intact. So the `### Citations` footer that lands in your note is actually attached to the prose above it, with the verbatim quote per source. |
| 8 | + |
| 9 | +**Your shared editorial rules stop being duplicated across templates.** Four directory templates (concept, vocabulary, source, toolkit) used to repeat the same mermaid-discipline / citation-enforcement / image-placement / research-framing guidance inside each one, with some of it hardcoded in TypeScript users couldn't touch. Now those rules live in vault-visible `partials/` and `preambles/` folders. Fix the mermaid rules once in `partials/mermaid-discipline.md` and every template picks the fix up on the next generation. |
| 10 | + |
| 11 | +The full provider lineup as of 0.2.0: |
| 12 | + |
| 13 | +| Provider | Endpoint | Cost | Best for | |
| 14 | +|---|---|---|---| |
| 15 | +| **Perplexity** | api.perplexity.ai | Paid | Source-cited research with consistent citation formatting | |
| 16 | +| **Anthropic Claude** | api.anthropic.com | Paid | Longer-form reasoning with `web_search` and adaptive thinking | |
| 17 | +| **Google Gemini** *(new)* | generativelanguage.googleapis.com | Free tier (no credit card) + paid | Google Search grounding with per-segment citation attribution | |
| 18 | +| **Perplexica / Vane** | localhost:3030 (self-hosted) | Free | Privacy-sensitive research; runs entirely on your machine | |
| 19 | +| **LM Studio** | localhost:1234 (local) | Free | Local-only inference, no network | |
| 20 | + |
| 21 | +Open Obsidian → **Settings → Community Plugins → Browse → "Perplexed" → Install → Enable**, then paste a Gemini API key from [aistudio.google.com](https://aistudio.google.com/apikey) (free tier, no credit card required) into Settings → Perplexed → Gemini (Google). |
| 22 | + |
| 23 | +## Ask Gemini — what's in the box |
| 24 | + |
| 25 | +A new **Ask Gemini** command opens a modal mirroring the Ask Claude shape: question textarea, model dropdown, behavior toggles, Cmd-Enter to submit. Default model is `gemini-flash-latest` (Google's always-current Flash alias, free-tier friendly) — `gemini-pro-latest` and pinned `gemini-2.5-pro` / `gemini-2.5-flash` are also selectable. |
| 26 | + |
| 27 | +When `google_search` grounding is enabled (default on), the plugin streams the answer into your note and parses two layers of provenance from the response: |
| 28 | + |
| 29 | +| Layer | Field | What it gives you | |
| 30 | +|---|---|---| |
| 31 | +| Page-level | `groundingChunks[]` | URL + title per page Gemini consulted | |
| 32 | +| Segment-level | `groundingSupports[]` | Text span (`segment.text`) → indices into `groundingChunks[]` | |
| 33 | + |
| 34 | +The plugin walks both layers and merges them by URL: page-level chunks become URL-and-title fallbacks; segment-level supports enrich them with the verbatim quote Gemini grounded against. Citation footer mirrors Claude's exactly (`[N]: [Title](url). > cited_text`) so [Cite Wide](https://community.obsidian.md/plugins/cite-wide)'s hex-substitution pass works on Gemini output too. |
| 35 | + |
| 36 | +### The two Gemini-specific quirks Perplexed handles for you |
| 37 | + |
| 38 | +Anyone who's wired the raw Gemini API will recognize these: |
| 39 | + |
| 40 | +1. **`chunk.web.uri` is a short-lived Google redirect.** The URL Google returns is a `vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIY…` redirect that expires roughly 30 days after the response. Naive "just write the URL we got" means every cited note rots on a clock. Perplexed resolves each redirect via Obsidian's `requestUrl` (Node-side, no CORS friction) and parses the destination page's `<link rel="canonical">` / `<meta property="og:url">` for the durable source URL — **and** parses `<meta property="og:title">` / `<title>` for the real page title. So a citation that would naively render as `[bloomberg.com](vertexaisearch.cloud.google.com/...)` instead lands as `[Bloomberg Beta — Bloomberg LP](https://www.bloomberg.com/company/bloomberg-beta/)`. |
| 41 | + |
| 42 | +2. **`searchEntryPoint.renderedContent` is 5KB of inline-styled HTML.** Google's grounding terms ask that this Search Suggestions chip be displayed when google_search is used; the chip itself is `<style>`-tag-prefixed HTML that Obsidian's Markdown renderer strips, leaving orphan `<div>` shells. Perplexed substitutes a Markdown-native `### Google Searches` section: a bullet list of the queries Gemini actually issued, each linked to `google.com/search?q=…` so you can re-run the suggested search. Same end-user behavior, rendered in a form Obsidian can actually display. |
| 43 | + |
| 44 | +## Partials + preambles — shared template guidance, vault-visible |
| 45 | + |
| 46 | +The four directory templates (`concept-profile`, `vocabulary-profile`, `source-profile`, `toolkit-profile`) historically duplicated their mermaid-discipline / citation-enforcement / image-placement / research-framing guidance inside each template, with some of it hardcoded in TypeScript constants users couldn't edit. 0.2.0 moves that guidance into two peer folders alongside `templates/`: |
| 47 | + |
| 48 | +``` |
| 49 | +Content-Dev/ |
| 50 | +├── templates/ (the four profile templates) |
| 51 | +├── partials/ (NEW — referenced from templates via {{include: name}}) |
| 52 | +│ └── mermaid-discipline.md |
| 53 | +└── preambles/ (NEW — auto-attached to every Perplexity request) |
| 54 | + ├── inline-citation.md (was a hardcoded TS constant) |
| 55 | + ├── image-placement.md (was a hardcoded TS constant) |
| 56 | + └── research-framing.md (was a TS function) |
| 57 | +``` |
| 58 | + |
| 59 | +`{{include: name}}` resolves recursively (depth-limited, cycle-detected). Preambles auto-attach to every request with bundled defaults as fallback, and per-template overrides live in the `cft` fence: `preambles: { system: [...], skip-user: [...], skip-all: true }`. |
| 60 | + |
| 61 | +## What else this release brings |
| 62 | + |
| 63 | +- **Eight previously-hidden settings sections render again.** A long-standing `addClass('perplexed-json-textarea is-tall')` bug at two DOM API call sites was throwing `InvalidCharacterError` (the method takes a single token, not a space-separated string), aborting `display()` mid-render and silently hiding every settings row after the Article Generator block. Same shape of fix as the May 19 batch that switched eight `activeDocument.createEl` calls to `containerEl.createEl`. |
| 64 | +- **System-prompt textareas widened to full-width 3-line rows.** The three system-prompt settings used `Setting.addTextArea` which crammed them into the 200px right edge of the row at 2 lines tall. Now each gets a name+description row on top and a full-width resizable textarea below. |
| 65 | +- **Template seeder idempotent.** Both "Folder already exists" and "File already exists" race conditions (Obsidian's in-memory file index lagging the adapter write) now get swallowed cleanly. No more red console lines on plugin load. |
| 66 | +- **`ERR_NETWORK_CHANGED` becomes a useful sentence.** WiFi roam, VPN reconnect, sleep/wake events mid-Perplexity-stream now write "Network changed mid-stream — re-run the query" into the note instead of a 30-line stack trace. |
| 67 | +- **Ask Gemini modal** with Google-flavored visual identity: gradient title text (blue → purple → red → yellow via `background-clip: text`), Google four-color hairline under the header, Gemini-blue focus ring on the prompt textarea, gradient-on-hover CTA. Theme tokens everywhere structural so light, dark, and community themes all carry through. |
| 68 | + |
| 69 | +## Verify the release assets |
| 70 | + |
| 71 | +Every release asset in 0.2.0 is signed via [GitHub's artifact attestation system](https://docs.github.com/en/actions/security-for-github-actions/using-artifact-attestations) at build time (the workflow introduced in 0.1.2). Before manual install, verify provenance: |
| 72 | + |
| 73 | +```bash |
| 74 | +gh attestation verify main.js --repo lossless-group/perplexed-plugin |
| 75 | +gh attestation verify manifest.json --repo lossless-group/perplexed-plugin |
| 76 | +gh attestation verify styles.css --repo lossless-group/perplexed-plugin |
| 77 | +``` |
| 78 | + |
| 79 | +Exit code 0 means the file came out of a legitimate build of the source repo. |
| 80 | + |
| 81 | +## The Lossless Group plugin family |
| 82 | + |
| 83 | +| Plugin | What it does | |
| 84 | +|---|---| |
| 85 | +| [**Cite Wide**](https://community.obsidian.md/plugins/cite-wide) | Stable hex-identifier citations + URL-based dedupe + LLM-paste research conversion | |
| 86 | +| [**Image Gin**](https://community.obsidian.md/plugins/image-gin) | Recraft + Ideogram image generation, Magnific stock search, ImageKit CDN, drag-gate | |
| 87 | +| **Perplexed** *(this release)* | Source-cited research from Perplexity, Claude, **Gemini**, Perplexica, or LM Studio + per-directory templates | |
| 88 | +| [**Metafetch**](https://community.obsidian.md/plugins/metafetch) | Pull OpenGraph metadata into note frontmatter via OpenGraph.io or Microlink | |
| 89 | + |
| 90 | +Together they form a research-to-publication pipeline: Perplexed generates source-cited prose, Cite Wide canonicalizes the citations to stable hex identifiers, Metafetch fills URL frontmatter with OG metadata, Image Gin generates matching imagery. |
| 91 | + |
| 92 | +If Perplexed saves you time, [buy us a coffee](https://buymeacoffee.com/losslessgroup). The plugins are free; the coffee keeps the next one coming. |
| 93 | + |
| 94 | +## Under the hood — full per-day changelog index |
| 95 | + |
| 96 | +Each substantive piece of work shipped in 0.2.0 has its own per-day changelog in the repo: |
| 97 | + |
| 98 | +- [`changelog/2026-05-19_01.md`](https://github.com/lossless-group/perplexed-plugin/blob/main/changelog/2026-05-19_01.md) — partials + preambles paradigm; the one-line fix that resurrected 11 hidden settings sections |
| 99 | +- [`changelog/2026-05-19_02.md`](https://github.com/lossless-group/perplexed-plugin/blob/main/changelog/2026-05-19_02.md) — Gemini provider lands; response shape dissected with curl |
| 100 | +- [`changelog/2026-05-20_01.md`](https://github.com/lossless-group/perplexed-plugin/blob/main/changelog/2026-05-20_01.md) — Obsidian-shipping pass: CORS-blocked `fetch` → `requestUrl` + canonical/og:url + `<title>` parsing; `?key=` → `X-goog-api-key` header; default model → `gemini-flash-latest`; Gemini modal CSS; safeCreateFile race fix; `ERR_NETWORK_CHANGED` UX; system-prompt textareas promoted; `addClass` token bug fixed at two more call sites |
| 101 | + |
| 102 | +Full marketing-grade release narrative with deeper context: [`changelog/releases/0.2.0.md`](https://github.com/lossless-group/perplexed-plugin/blob/main/changelog/releases/0.2.0.md). |
0 commit comments