Skip to content

Commit 160abeb

Browse files
mpstatonclaude
andcommitted
docs(release-notes): 0.2.0 — release-page body for the auto-release workflow
Workflow .github/workflows/release.yml looks for release-notes/<tag>.md at the tagged commit; without this file it falls back to --generate-notes, which produces a flat commit list instead of the marketing-shape body. Mirrors the convention introduced in release-notes/0.1.2.md. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e04c6ca commit 160abeb

1 file changed

Lines changed: 102 additions & 0 deletions

File tree

release-notes/0.2.0.md

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
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

Comments
 (0)