lossless-group103 downloadsGenerate source-cited research content from Perplexity, Anthropic Claude, Perplexica, or local LM Studio — directly into your notes.

Perplexed is an Obsidian plugin that enables AI-powered content generation with source citations using Perplexity, Anthropic Claude, Google Gemini (with Google Search grounding), and Perplexica / Vane (self-hosted). This plugin brings research-grade AI capabilities directly into your Obsidian workspace, allowing you to generate well-cited content for your notes.

[1]: 2024, Dec 13. What is GRC (Governance, Risk and Compliance) - Metricstream. Published: 2024-05-01 | Updated: 2024-12-13
[2]: 2025, Jun 16. Governance, risk and compliance (GRC): Definitions and resources. Published: 2025-05-27 | Updated: 2025-06-16
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, and any text you have explicitly selected when invoking selection-based commands.
| 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) |
| Google Gemini | https://generativelanguage.googleapis.com/v1beta/models/{model}:streamGenerateContent |
Required (AI Studio) | Required (free tier available, no credit card) |
| Perplexica / Vane (install required) | http://localhost:3030/api/search (default; user-configurable) |
Not required | Not required (self-hosted, runs locally) |
| LM Studio | http://localhost:1234/v1/chat/completions (default; user-configurable) |
Not required | Not required (runs locally) |
When Gemini's google_search grounding is enabled, the plugin also issues
follow-up GET requests to vertexaisearch.cloud.google.com/grounding-api-redirect/…
URLs to resolve them to the real source page (so your ### Citations footer
contains durable source URLs rather than short-lived Google redirects). The
follow-up requests go through Obsidian's requestUrl (Node-side), not the
browser fetch — no cross-origin permissions involved, and the request is
strictly URL-resolution, no auth header.
The plugin does not collect telemetry, ship vault content anywhere else, or update itself — Obsidian handles plugin updates through the community plugin directory.
Download the Plugin:
Enable in Obsidian:
Perplexity is a commercial AI service that provides high-quality, source-cited responses.
Get API Key:
Configure in Plugin:
https://api.perplexity.ai/chat/completionsGoogle Gemini is Google's commercial AI service. The google_search grounding tool returns per-segment citation attribution — meaning each cited sentence is mapped back to the specific URL it came from, which becomes the verbatim quote in your ### Citations footer. AI Studio's free tier requires no credit card to get started.
Get API key:
AIza… stringConfigure in plugin:
gemini-flash-latest (always-current Flash, free-tier friendly) — gemini-pro-latest and pinned gemini-2.5-pro / gemini-2.5-flash also availablePerplexica / Vane is a free, open-source AI search engine that you run locally on your own machine. This plugin does not bundle the server or proxy to a hosted instance — you must install and run it yourself before the "Ask Perplexica / Vane" command will work.
Note on naming: The maintainer (
ItzCrazyKns) renamed the open-source self-hosted repo from Perplexica to Vane on 2026-03-09 (commitfeat(app): rename to 'vane'). The old GitHub URLItzCrazyKns/Perplexicaredirects toItzCrazyKns/Vane. A hosted service at perplexica.io remains live under the Perplexica name — that's a separate hosted product, not what you self-install for use with this plugin. The local API surface this plugin talks to (/api/search, focus modes, optimization modes) is unchanged across the rename.
Install Perplexica / Vane locally:
docker-compose setup, configuring SearXNG, and choosing
your local LLM provider (Ollama, LM Studio, OpenAI-compatible
endpoints, etc.).curl http://localhost:3030/api/searchConfigure in this plugin:
http://localhost:3030/api/search)For local AI processing without internet dependency:
Install LM Studio:
Configure in Plugin:
http://localhost:1234/v1/chat/completionsCtrl/Cmd + Shift + PQuestion: "What are the latest developments in quantum computing?"
Model: sonar-pro
Citations: Enabled
Recency: Past month
Question: "Analyze the impact of AI on healthcare in the last 5 years"
Model: sonar-deep-research
Citations: Enabled
Recency: Past 5 years
Note: Deep research mode conducts exhaustive analysis across hundreds of sources and may take 30-60 seconds.
Perplexity responses include:
Enhance selected text using Perplexity AI to improve clarity, add details, and make content more comprehensive.
Ctrl/Cmd + Shift + POriginal Text:
AI is changing how we work.
Enhanced Text:
Artificial Intelligence (AI) is fundamentally transforming how we work across various industries and sectors. From automating routine tasks to enabling more sophisticated decision-making processes, AI technologies are reshaping traditional workflows and creating new opportunities for productivity and innovation.
Ctrl/Cmd + Shift + Pgemini-flash-latest (recommended, free-tier friendly), gemini-pro-latest, or pinned 2.5 versionsgoogle_search tool; emits per-segment citationsgoogle.com/search (Markdown-native substitute for Google's required Search Suggestions chip)vertexaisearch.cloud.google.com grounding-redirect URLs to durable source URLs + real page titles before writing the citations footerGemini's groundingSupports[] carries per-segment attribution that survives the full response round-trip — meaning the ### Citations footer contains the verbatim quote per source, attached to the prose above it. Compare to Claude's web_search_20260209, where the dynamic-filter sandbox post-processes search results and per-claim attachment doesn't survive: text blocks come back with citations: null.
The plugin walks two layers of provenance:
| Layer | Field | What it gives you |
|---|---|---|
| Page-level | groundingChunks[] |
URL + title per page Gemini consulted |
| Segment-level | groundingSupports[] |
Text span (segment.text) → indices into groundingChunks[] |
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's hex-substitution pass works on Gemini output too.
Question: "Who won the 2024 Nobel Prize in Physics and what was the citation?"
Model: gemini-flash-latest
Grounding: Enabled
Resolve URLs: Enabled
Lands in the note with prose like:
The 2024 Nobel Prize in Physics was jointly awarded to John J. Hopfield and Geoffrey Hinton.
The Nobel Prize Committee cited them "for foundational discoveries and inventions that enable machine learning with artificial neural networks".
…followed by a ### Google Searches section listing the queries Gemini issued, and a ### Citations footer where each entry is [N]: [Real Page Title](https://nobelprize.org/…) with the verbatim segment as a blockquote.
Ctrl/Cmd + Shift + PQuestion: "What are the current theories about dark matter?"
Focus Mode: academicSearch
Optimization: quality
Question: "Help me write an introduction about climate change"
Focus Mode: writingAssistant
Optimization: balanced
Ctrl/Cmd + Shift + PQuestion: "Write a short story about a robot learning to paint"
Model: ibm/granite-3.2-8b
Temperature: 0.8
System Prompt: "You are a creative storyteller who writes engaging narratives."
Question: "Explain how neural networks work"
Model: microsoft/phi-4-reasoning-plus
Temperature: 0.3
System Prompt: "You are a technical expert who explains complex concepts clearly."
| Command | Description | Usage |
|---|---|---|
Ask Perplexity |
Query Perplexity AI with full configuration | Editor command with modal interface |
Enhance Selected Text with Perplexity |
Enhance selected text using Perplexity AI | Editor command with modal interface |
Update Perplexity URL |
Change Perplexity API endpoint | Settings command |
Show Perplexity Settings |
Display current Perplexity configuration | Debug command |
| Command | Description | Usage |
|---|---|---|
Ask Gemini |
Query Google Gemini with Google Search grounding | Editor command with modal interface |
Check Gemini service status |
Report whether the service initialized and the API key is configured | Debug command |
| Command | Description | Usage |
|---|---|---|
Ask Perplexica / Vane |
Query Perplexica / Vane with focus and optimization modes | Editor command with modal interface |
Update Perplexica / Vane URL |
Change Perplexica / Vane API endpoint | Settings command |
Show Perplexica / Vane Settings |
Display current Perplexica / Vane configuration | Debug command |
| Command | Description | Usage |
|---|---|---|
Ask LM Studio |
Query local LM Studio with custom parameters | Editor command with modal interface |
Update LM Studio URL |
Change LM Studio API endpoint | Settings command |
Show LM Studio Settings |
Display current LM Studio configuration | Debug command |
You can set custom keyboard shortcuts for any command:
Per-folder content generation — one template fills a whole category of files.
Originally specced as "prompt outlines"; the shipped paradigm is broader and is called directory templates throughout the code and command palette. Full reference: docs/directory-templates.md. Engineering changelog: changelog/2026-05-10_01.md.
A working Obsidian vault collects categories of files that share a shape — concepts, vocabulary terms, sources, tooling profiles. Filling them out one editor-callback at a time is untenable when you have hundreds or thousands. A directory template is a single markdown file that says "for any file under concepts/**, here is the structure to fill and the system prompt to use," and the runtime applies it to one file or a whole folder via Perplexity research with streaming writes.
Content-Dev/Templates/ with frontmatter (applies-to-paths glob), a fenced cft config block (provider, model, return flags, system prompt with interpolation tokens like {{basename}} and {{frontmatter.tags}}), and a heading skeleton that becomes the user prompt. Everything below the first *** divider is excluded from the request — it's your scratch space.Apply directory template to current file auto-matches via the glob; Apply directory template to folder runs a batch with a confirmation modal; Stop directory template batch halts a running batch.<think> blocks, swaps [IMAGE N: <description>] markers for real embeds (with a fallback # Images section when the model didn't emit markers but Perplexity returned images), strips unreplaced placeholders, appends a # Sources footer in the format cite-wide can convert to hex citations, and stamps cf_last_run + cf_last_run_model into the target's frontmatter.Two peer folders alongside templates/ keep editorial rules vault-visible and DRY:
Content-Dev/
├── templates/ (your four profile templates)
├── partials/ (reusable snippets: mermaid-discipline, etc.)
│ └── mermaid-discipline.md
└── preambles/ (auto-attached to every request as system / user messages)
├── inline-citation.md
├── image-placement.md
└── research-framing.md
{{include: name}} in a template body splices in partials/name.md recursively (depth-limited, cycle-detected). Missing files show as inline [[include: name — file not found]] markers so typos stay visible.inline-citation), User preambles (default: image-placement when return-images is on).cft fence: preambles: { system: [...], skip-user: [...], skip-all: true }.Fix the mermaid quoting rule once in partials/mermaid-discipline.md and every future template generation picks it up — no template editing required.
Four templates ship inlined into the plugin and seed into your vault on first plugin load:
| File | Targets | Use for |
|---|---|---|
concept-profile.md |
concepts/** |
Encyclopedia-style entries on ideas, patterns, mental models. Anti-incumbent editorial stance baked in (tech giants treated as adopters/popularizers, not innovators, unless documented heyday-era origination supports otherwise). |
vocabulary-profile.md |
Vocabulary/** |
Term definitions with disambiguation through an innovation-consulting lens. |
source-profile.md |
Sources/** |
Profiles of books, people, channels, publications, journals, reports, events — type-aware, with Google Books URL harvesting for books. |
toolkit-profile.md |
Tooling/** |
Profiles of tools, products, platforms, frameworks. |
All four use Perplexity's sonar-pro (deep-research is unreliable for image return).
On first plugin load, Perplexed writes the four templates plus a user-facing README.md to Content-Dev/Templates/ in your vault. The seeder uses a two-tier policy:
A Re-seed templates button in Settings → Directory templates writes any shipped file whose filename doesn't already exist — useful for pulling in a new template after a plugin update without overwriting your edits.
Copy any shipped template under a new filename, change the frontmatter (title, description, applies-to-paths glob), rewrite the cft block's system: prompt for your domain, and rewrite the heading skeleton with the structure you want. Save in Content-Dev/Templates/. The plugin picks it up on the next palette invocation — no reload needed.
For interpolation tokens, the full cft block grammar, the cleanup pipeline mechanics, the editorial stance rationale, frontmatter stamps, and known limits — see docs/directory-templates.md.
perplexed-plugin/
├── main.ts # Main plugin file with all functionality
├── manifest.json # Plugin metadata and requirements
├── package.json # Dependencies and build scripts
├── esbuild.config.mjs # Build configuration
├── tsconfig.json # TypeScript configuration
├── styles.css # Plugin styles (if any)
└── README.md # This file
Clone the Repository:
git clone https://github.com/lossless-group/perplexed-plugin.git
cd perplexed-plugin
Install Dependencies:
pnpm install
3. **Build the Plugin**:
```bash
pnpm build
pnpm dev
### Testing Your Plugin
1. **Create Symbolic Link** (macOS/Linux):
```bash
ln -s /path/to/your/plugin /path/to/obsidian/vault/.obsidian/plugins/perplexed
Windows (PowerShell):
New-Item -ItemType SymbolicLink -Path "C:\path\to\obsidian\vault\.obsidian\plugins\perplexed" -Target "C:\path\to\your\plugin"
Enable in Obsidian:
PerplexedPlugin Class (main.ts):
Settings Management:
PerplexedPluginSettings interface defines all configurable optionsPerplexedSettingTab provides the settings UICommand Registration:
registerPerplexityCommands(): Perplexity-specific commandsregisterPerplexicaCommands(): Perplexica-specific commandsregisterLMStudioCommands(): LM Studio-specific commandsAPI Integration:
queryPerplexity(): Handles Perplexity API callsqueryPerplexica(): Handles Perplexica API callsqueryLMStudio(): Handles LM Studio API calls// Example from queryPerplexity method
if (useStreaming) {
const reader = response.body?.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = new TextDecoder().decode(value);
// Process and display chunk in real-time
}
}
Each command uses Obsidian's Modal class to create user-friendly input forms:
const modal = new (class extends Modal {
private queryInput!: HTMLTextAreaElement;
onOpen() {
// Create form elements
}
async onSubmit() {
// Handle form submission
}
})(this.app, this, editor);
Comprehensive error handling for API failures, network issues, and invalid configurations:
try {
const response = await fetch(endpoint, options);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
} catch (error) {
new Notice(`Error: ${error.message}`);
console.error('API Error:', error);
}
The plugin supports extensive configuration through the settings interface:
interface PerplexedPluginSettings {
perplexityApiKey: string;
perplexityEndpoint: string;
perplexicaEndpoint: string;
lmStudioEndpoint: string;
defaultModel: string;
defaultOptimizationMode: string;
defaultFocusMode: string;
// ... additional settings
}
The project uses esbuild for fast compilation:
// esbuild.config.mjs
import esbuild from 'esbuild';
import process from 'process';
import builtins from 'builtin-modules';
const banner =
`/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
`;
const prod = (process.argv[2] === 'production');
esbuild.build({
banner: {
js: banner,
},
entryPoints: ['main.ts'],
bundle: true,
external: [
'obsidian',
'electron',
'@codemirror/autocomplete',
'@codemirror/collab',
'@codemirror/commands',
'@codemirror/language',
'@codemirror/lint',
'@codemirror/search',
'@codemirror/state',
'@codemirror/view',
'@lezer/common',
'@lezer/highlight',
'@lezer/lr',
...builtins],
format: 'cjs',
watch: !prod,
target: 'es2018',
logLevel: "info",
sourcemap: prod ? false : 'inline',
treeShaking: true,
outfile: 'main.js',
}).catch(() => process.exit(1));
Create Feature Branch:
git checkout -b feature/your-feature-name
Make Changes:
Test Your Changes:
pnpm build
# Test in Obsidian
Currently, testing is manual through Obsidian. To test:
pnpm buildAdd Settings:
interface PerplexedPluginSettings {
newProviderEndpoint: string;
newProviderApiKey: string;
// ... other settings
}
Add Query Method:
public async queryNewProvider(query: string, options: any): Promise<void> {
// Implementation
}
Register Commands:
private registerNewProviderCommands(): void {
this.addCommand({
id: 'ask-new-provider',
name: 'Ask New Provider',
editorCallback: (editor: Editor) => {
// Modal implementation
}
});
}
Update Settings UI:
Add configuration options to PerplexedSettingTab.display()
The plugin inserts responses directly into the editor. To modify the format:
// In query methods, modify the headerText
const headerText = `\n\n***\n## Custom Header\n**Question:** ${query}\n\n### **Response**:\n\n`;
API Key Not Working:
Network Errors:
Plugin Not Loading:
Enable debug logging by checking the browser console:
Ctrl/Cmd + Shift + I (Developer Tools)The Lossless Group is a loose collection of individuals and organizations interested in creating winning formulae for using AI and Collaborative Tooling. We consult, invest in startups, run Venture Capital Funds, host Hackathons, build products, write content, and contribute to open source projects.
We are committed to playing on the frontiers of technology and staying curious and engaged.
License: MIT
Author: The Lossless Group
Support: GitHub Issues