Obsidian / Data path of AI plug-in

Confirm with official materials and fixed sources

AI plugins for Obsidian
Capabilities and risks in 2026

This page was machine-translated from Japanese. Read the Japanese original

Which part of the notebook goes from which function to where? Read the fixed version of Copilot, Smart Connections, and Text Generator, and compare the unconfirmed parts of the actual communication with those that can be understood in the material.

Before choosing, look at the model, context, index, and additional functions

The word "local support" alone does not determine the destination of the entire plug-in. Excerpts of notes passed to the model, where to make an index, web search and document conversion services, and diagnosis and update confirmation are checked separately.

  1. Modelprovider・endpoint・agent
  2. Context to refer toSelections, excerpts, templates
  3. Index and searchLocal or another server
  4. Additional functionsWeb, document conversion, diagnosis, update

This diagram organizes the official documentation; it is not a record of actual network traffic. The comparison examines pinned documents and source code. It does not include operating settings screens, making actual requests, or auditing providers’ operations.

First of all, check the path of the function you use in the table below. The "source" in the table represents the constants and branches read from the code, and "source description" represents the description of the README and guide.

Compare the 3 fixed versions with the destination and settings

Official documents acquired on September 30, 2026. It is not a result table of actual communication.
Fixed versionThe route shown in the documentContext and indexCheck key settingsRemaining unconfirmed
Copilot
4.0.12
Explanation of the provider: hosted is Brevilabs and enterprise provider. Cloud BYOK is the specified provider/endpoint, and Local BYOK is the local endpoint. Opencode, Claude, and Codex also have their own routes. Q03The excerpt of the selected note is the model context. Miyo's index and search destination are local/remote in a separate setting. Check the additional route for web search, document conversion, and project context. Q03/Q05Source: getter to check the availability of SecretStorage. Initial constants such as enableMiyo=false and activeBackend=opencode. The actual storage and the current GUI have not been confirmed. Q07 / Q08 / Q09Compliance with actual payload, index target, terminal key storage and encryption, backend retention, non-learning policy. Self-selected diagnostic ZIP upload is usually distinguished from request.
Smart Connections
4.7.2
Explanation of the provider: Guide to the built-in local embedding model. It explains how to create an index that does not require the API key. Q10/Q11README explains that it creates an index of Vault after enable. Some of the settings and models are externally dependent. The data path of all configurations has not been read.Source: There is a GET to GitHub latest-release and URL that will be passed to the initial information. From the explanation of local embedding, it cannot be determined that there is no full communication. Q12/Q13Real index and model acquisition, entire dependency, actual communication and payload, alternative model, key storage, telemetry/retention.
Text Generator
0.8.7
Source initial value:OpenAI Chat (Langchain), https://api.openai.com/v1, key is empty. Ollama provider receives the set basePath. Q15 / Q23 / Q24A branch that can get a value with includeClipboard=true. The initial template is title・starredBlocks・tg_selection. The value included in the actual prompt needs to be checked separately. Q15/ Q17Source initial value:encrypt_keys=false. If it cannot be encrypted/is invalid, it is a branch that returns a fixed prefix + input key. Even if the plain key field is empty, it cannot be determined that it has been encrypted. Q15 / Q19 / Q20 / Q21 / Q22Actual payload, current GUI, terminal encryption results, full-function communication, billing and response quality, and overall telemetry/retention.

BYOK is a method that uses its own keys and endpoints. " "Use your own key" and "the processing will remain only in the terminal" are different conditions.

Copilot: Even if you choose a model, the route of additional functions remains separately

The fixed version of the guide is divided into hosted, Cloud BYOK, Local BYOK, opencode, Claude, and Codex processing destinations. For example, even if the Local BYOK model is explained as a local endpoint, another service may be involved depending on the skill and project context used. Q03

Separe note references and Miyo indexes

The document explains that the agent reads the notes and puts the necessary parts into the prompt of the selection model. " The behavior of "uploading the entire Vault just by opening Agent Chat" is not explained. Miyo has a local connection and a remote server connection, and the index and search destination are selected separately. The excerpt found in the search also fits into the context of the model. Just by using the local index, it cannot be said that the excerpt does not pass to the model provider. Q03/Q05

Document processing is not uniform. According to the document, Agent Chat's Miyo processing is done by local CLI, Quick Chat uses the connection destination Miyo service, and if it is remote, it is processed by that server. Saved project context that uses Web, YouTube, and binary files may use hosted project service, and it is a different route from Miyo's selection. Q03

Self-Host Mode is not guaranteed to block communication

guide specifies that cloud does not disable even in Self-Host Mode. The route sent to the selected Claude, Codex, cloud model, search provider, etc. will remain. This is a setting for each function to check whether the function you want to use and the acceptable processing destination match. Q04

The key getter, initial constant, and diagnostic policy are read on their own basis

The scope of KeychainService confirmed is a getter that checks the presence or absence of app.secretStorage, and if not, it causes an error. It is not a result of actually saving the key or a record of verifying the encryption of the OS. enableMiyo=false, enableMiyoSearchSkill=false, activeBackend=opencode, debugFullFrames=true are the initial values in the source and do not show the value of the migrated settings or the reader GUI. Q07/Q08/Q09

README describes the random UUID of the hosted request and the diagnostic ZIP that the reader chooses to upload. ZIP's 60 days later deletion, temporary processing, non-retention, and non-learning of hosted requests are the policy explained by provider. We did not audit the operation of the backend here. It is also impossible to determine that the diagnostic ZIP will be sent automatically from debugFullFrames=true alone. Q02

Smart Connections: Explanation of local embedding and the presence or absence of all communication

The README states that the built-in local model indexes your Vault without an API key. This describes how it can find related notes, but we did not run the model or observe actual indexing or network communication in this comparison. We also treat the README’s claims about privacy, offline operation, and mobile support as statements from the provider. Q10 / Q11

The project’s own src/main.js contains code that schedules a GET request to GitHub latest-release during the update check after initialization. smartconnections.app’s URL is passed to StoryModal for first-time users. This confirms a code path related to network communication. StoryModal is implemented in a dependency; whether URL was actually loaded and what payload was passed remain unverified. Q12 / Q13

Some model, settings, and HTTP code refers to external Smart Environment/jsbrains packages. This scope alone cannot establish that all features remain on the device, that telemetry is absent, or that notes are always transmitted. Distinguishing the local-index description, update-check code, and unexamined dependencies and network behavior shows what still needs investigation. Q14

Text Generator: Check context candidates and key storage branches

The settings that can get the clipboard and the actual prompt are different

The initial setting of the fixed version has includeClipboard=true, and the context builder has a branch that can get the clipboard if the value is true. On the other hand, the title, starredBlocks, and tg_selection in the initial template quoted are not clipboard placeholders. Q15/Q17

The value to be resolved changes depending on the template, frontmatter, context options, and selection range. Do not treat the list of available values as the values in the actual request as the same. This code confirmation does not result that "clipboard is always sent" or "all Vault is always sent". Q17/Q18

Empty characters in the plain key field are not evidence of encryption

The initial value is encrypt_keys=false. There is a process of emptying the plain key column when saving, and a process of preparing another secret-related field. When encryption is unavailable or encrypt_keys is disabled, getEncryptedKey returns a value that connects the fixed prefix and the input key. Even if the field name contains encrypted/hashed, it cannot be determined that it is encrypted bytes by itself. Q15 / Q19 / Q20 / Q21 / Q22

key has not been entered, so the contents of the actual storage and the safeStorage operation of this terminal have not been confirmed. Before sharing configuration files and diagnostic records containing keys, you need to look not only at the plain column but also to other values that are saved.

Select the initial provider and local correspondence separately

The default provider in the source is OpenAI Chat (Langchain), with https://api.openai.com/v1 as its endpoint. The Ollama provider has an implementation that accepts a configured basePath. The existence of a local provider alone does not establish where other features process data or prove that no network communication occurs. Q15 / Q23 / Q24

Attached request, automatic suggestions, slash suggestions, and JavaScript execution are OFF in the quoted initial value. These are also not the actual measurements of the current GUI. Please check the template you want to use and the saved settings in your environment. Q15 / Q16

Decide on the settings to check according to your usage

What I want to doTarget to be confirmedWhat you can't understand from this comparison alone
Handling notes in a cloud modelmodel/provider/endpoint, selection, excerpt, template, agent/skill to useOperation, billing, and response quality of actual payload, provider
I want to make an index locallyEmbedding/index processing destination, remote server configuration, later model, model acquisition and additional functionsCommunication stoppage of all functions, all dependent routes, actual index on the terminal
I want to know the range of saving and sharing keysFields to be saved, branches that cannot be encrypted, and where to share logs/diagnostics/settingsCompliance with the actual storage bytes and backend retention and deletion of the terminal

This table does not report measurements taken after changing settings. Before using your own notes, use it to decide which features to enable and which data you are willing to send to each destination.

Frequently Asked Questions

If I select a local model, won't the plug-in communicate at all?
Model processing, indexing, web search, document conversion, and update checks use separate routes. Copilot’s documentation distinguishes routes for additional features; Smart Connections’ own code includes a GitHub update-check GET request. This document review did not establish that every feature avoids network communication or verify what is actually transmitted.
Does Smart Connections send notes to the outside?
The pinned README states that a built-in local model creates embeddings and an index. This is the provider’s description. The project’s own source includes URL for update checks and initial guidance, while some model and settings code relies on external dependencies. This comparison did not measure whether notes were actually transmitted or whether any other network communication occurred.
Does includeClipboard=true in Text Generator mean that the clipboard must be sent?
source, there is a branch that the context builder can retrieve the clipboard when the setting is true. On the other hand, the initial template posted uses title, starredBlocks, and tg_selection, and does not specify the clipboard. The available value is different from the content of the request that is actually assembled. The actual payload is unmeasured.
If the api_key of the saved data is empty, is the key encrypted?
You can't judge from an empty key field alone. In Text Generator 0.8.7, there is a save process that emptys the plain key field and another save field, and if encryption is not available or if encrypt_keys is disabled, there is a branch that returns a fixed prefix and input key. I haven't tried the actual key storage or platform encryption behavior.
Does this article compare the quality of AI responses, fees, and iPhone operation?
The comparison target is the data path and settings indicated in the official materials and code of the fixed 3 version. We have not confirmed the installation of plug-ins, the actual operation of the setting screen, model generation, billing, actual communication, the operation of terminals including iPhone, and compliance with the provider's storage and non-learning policies.

Confirmed version and the original text of the basis

These are the official releases and pinned commits recorded on 2026-9-30 at 14:25 UTC. They were the versions checked at that time and are not guaranteed to remain the latest. Minimum Obsidian comes from the manifest. We do not infer actual device behavior from the mobile-support flag.

The official registry has also been fixed to commit 2db5da29e67e7600176c8c9450fd1c36c3a6831b. For the 24 quote, 14 file, and 579 line, we have confirmed that it matches the bytes/SHA256, line range, and quotation of the original file. It is a check to confirm the reproducibility of the fixed version of the material, and it is not a runtime privacy authentication.

Read the fixed quotations and confirmation range of 24 with JSON

Main explanation and code quote

The original English text and code are within the scope of the fixed commit. You can proceed to the original text of GitHub from the Q number on the table.

Copilot · docs/copilot-plus-and-self-host.md · Q03

Open the original text of the fixed commit

75: 
76: | Model source                | How access works                                               | Who processes the prompt                                        |
77: | --------------------------- | -------------------------------------------------------------- | --------------------------------------------------------------- |
78: | **Copilot-hosted**          | Lite, Plus, or included Supporter access                       | Brevilabs and the enterprise model provider used for that model |
79: | **Cloud BYOK**              | Your API key under BYOK                                        | The provider and endpoint you configured                        |
80: | **Local BYOK**              | Ollama, LM Studio, or another local OpenAI-compatible endpoint | Your local endpoint                                             |
81: | **opencode-reported model** | Authentication managed by opencode                             | The provider behind that opencode model                         |
82: | **Claude**                  | Claude Code login or environment                               | Anthropic under your Claude account                             |
83: | **Codex**                   | Codex CLI login through `codex-acp`                            | OpenAI under your Codex or ChatGPT account                      |
84: 
85: A Claude or ChatGPT subscription is not an API key. Use the Claude or Codex Agent Chat setup for those subscriptions. Use BYOK only when you have API access or an OpenAI-compatible endpoint.
86: 
87: ## Understand service data routes
88: 
89: The selected model is only one possible route. A feature may call another service for the part of the task you asked it to perform:
90: 
91: - A **Copilot-hosted Skill** sends the search query, URL, or document needed by that Skill to Brevilabs.
92: - **Plus document processing** sends the supported document to Copilot's hosted processor.
93: - In **Agent Chat**, **Miyo document processing** runs through the local Miyo CLI, so PDF and EPUB parsing stays on this computer even when search uses a remote Miyo server.
94: - In **Quick Chat**, **Miyo document processing** uses the connected Miyo service. A configured remote Miyo server processes the document there rather than on this computer.
95: - Saved **project context** that needs web, YouTube, or binary-file conversion can use Copilot's hosted project service. The Miyo Document Processor choice does not change that project route.
96: - An agent can read a local note and include relevant text in the prompt sent to the selected model. Opening Agent Chat alone does not upload the whole vault.
97: 
98: For a workflow that does not send task content to Brevilabs, use direct Markdown context, local tools or local Miyo, and a local model. Disable Copilot's cloud-backed Skills for every agent you use. Do not add web pages, YouTube links, or binary files as saved project context when their hosted conversion is outside your intended boundary.
99: 
100: The [privacy policy](https://www.obsidiancopilot.com/en/privacy) describes how Copilot's hosted requests are processed. Your model provider and Miyo server have their own boundaries and terms.
Copilot · docs/copilot-plus-and-self-host.md · Q04

Open the original text of the fixed commit

103: 
104: Supporter and eligible legacy licenses can open **Settings → Copilot → Self-Host** and enable **Self-Host Mode**.
105: 
106: When it is on, Copilot:
107: 
108: - Lets you supply Firecrawl, Perplexity, Parallel, or Exa credentials for web search.
109: - With OpenCode selected, routes Agent Chat web searches through that selected provider while keeping its API key inside Obsidian. This does not require Obsidian's command line interface.
110: - Disables OpenCode's native web-search and web-fetch tools so they cannot bypass the selected route. Full-page fetching through OpenCode is unavailable until the self-host providers share a supported fetch interface.
111: - Lets you supply a Supadata key for YouTube transcripts.
112: - Directs you to BYOK for local or self-hosted model endpoints.
113: - Flags and sorts cloud agents and models below local or self-hosted choices.
114: 
115: It does not disable the cloud. Claude, Codex, Copilot-hosted models, cloud BYOK providers, Firecrawl, Perplexity, Parallel, Exa, and Supadata can still send data to their services when you select them. The warnings make those routes visible so you can decide.
116: 
117: You do not need Self-Host Mode to use a local BYOK model or local Miyo. Those are available independently.
Copilot · src/services/keychainService.ts · Q09

Open the original text of the fixed commit

239:   /** Whether the OS keychain is available in this Obsidian version. */
240:   // DESIGN NOTE — intentionally only checks for the `secretStorage` object,
241:   // not individual methods (`getSecret`/`setSecret`/`listSecrets`). Obsidian
242:   // ships SecretStorage as a single API surface (1.11.4); there is no
243:   // released version where the object exists but methods are missing.
244:   // Capability-probing each method would add branching for a partial-API
245:   // world that does not exist. If a future review flags this again, point
246:   // them at this note.
247:   isAvailable(): boolean {
248:     return !!this.app.secretStorage;
249:   }
250: 
251:   /** Get the current vault namespace ID. */
252:   getVaultId(): string {
253:     return this.vaultId;
254:   }
255: 
256:   /**
257:    * Set the vault namespace ID from persisted settings.
258:    * Reason: called during load to replace the path-derived fallback with the
259:    * stable persisted ID, so vault renames don't orphan keychain entries.
260:    */
261:   setVaultId(id: string): void {
262:     this.vaultId = id;
263:   }
264: 
265:   /**
266:    * Access SecretStorage with a runtime guard.
267:    * Reason: replaces scattered non-null assertions with a single guard
268:    * that produces a clear error when keychain is unavailable.
269:    */
270:   private get storage(): SecretStorage {
271:     if (!this.app.secretStorage) {
272:       throw new Error("OS keychain (SecretStorage) is not available.");
273:     }
274:     return this.app.secretStorage;
Smart Connections · src/main.js · Q13

Open the original text of the fixed commit

144:   async check_for_updates() {
145:     if (await this.is_new_plugin_version(this.manifest.version)) {
146:       // console.log("opening release notes modal");
147:       try {
148:         this.ReleaseNotesView.open(this.app.workspace, this.manifest.version);
149:       } catch (error) {
150:         console.error('Failed to open ReleaseNotesView', error);
151:       }
152:       await this.set_last_known_version(this.manifest.version);
153:     }
154:     window.setTimeout(this.check_for_update.bind(this), 3000);
155:   }
156: 
157:   async check_for_update() {
158:     try {
159:       const { json: response } = await requestUrl({
160:         url: "https://api.github.com/repos/brianpetro/obsidian-smart-connections/releases/latest",
161:         method: "GET",
162:         headers: {
163:           "Content-Type": "application/json",
164:         },
165:         contentType: "application/json",
166:       });
167:       const latest_release = response.tag_name;
168:       if (latest_release !== this.manifest.version) {
169:         if (!this.update_available || this.latest_release_version !== latest_release) {
Text Generator · src/default-settings.ts · Q15

Open the original text of the fixed commit

4: const DEFAULT_SETTINGS: TextGeneratorSettings = {
5:   version: pkg.version as any,
6:   endpoint: "https://api.openai.com/v1",
7:   models: [],
8:   api_key: "",
9:   encrypt_keys: false,
10:   selectedProvider: "OpenAI Chat (Langchain)",
11:   max_tokens: 5000,
12:   temperature: 0.7,
13:   frequency_penalty: 0.5,
14:   showStatusBar: true,
15:   outputToBlockQuote: false,
16:   freeCursorOnStreaming: false,
17:   allowJavascriptRun: false,
18:   experiment: false,
19:   promptsPath: "textgenerator/templates",
20:   textGenPath: "textgenerator/",
21:   prefix: "\n\n",
22:   tgSelectionLimiter: "^\\*\\*\\*",
23:   stream: true,
24:   context: {
25:     customInstructEnabled: true,
26:     includeClipboard: true,
27:     customInstruct: `Title: {{title}}
28:   
29: Starred Blocks: {{starredBlocks}}
30: 	  
31: {{tg_selection}}`,
32: 
33:     contextTemplate: `Title: {{title}}
34: 	
35: Starred Blocks: {{starredBlocks}}
36: 	  
37: {{tg_selection}}`,
38:   },
39:   requestTimeout: 300000,
40:   options: {
Text Generator · src/scope/context-manager.ts · Q17

Open the original text of the fixed commit

355:       {},
356:       this.getFrontmatter(this.getMetaData(templatePath)),
357:       contextObj.frontmatter
358:     );
359: 
360:     if (contextOptions.includeClipboard)
361:       try {
362:         blocks["clipboard"] = await this.getClipboard();
363:       } catch {
364:         // empty
365:       }
366: 
367:     const options = {
368:       selection,
369:       selections,
370:       ...blocks["frontmatter"],
371:       ...blocks["headings"],
372:       content: ctnt,
373:       context,
374:       ...blocks,
Text Generator · src/main.ts · Q20

Open the original text of the fixed commit

664:   encryptAllKeys() {
665:     // check if user have LLMProviderOptionsKeysHashed object (upgrading from older version)
666:     this.settings.LLMProviderOptionsKeysHashed ??= {};
667: 
668:     const keyList: string[] = [];
669: 
670:     this.settings.api_key_encrypted = this.getEncryptedKey(
671:       this.settings.api_key
672:     );
673: 
674:     // get all secret keys
675:     Object.entries(this.settings?.LLMProviderOptions).forEach(([key1, l1]) => {
676:       if (typeof l1 != "object") return;
677:       Object.entries(l1).forEach(([key2, l2]) => {
678:         if (key2.toLowerCase().includes("key") && typeof l2 == "string") {
679:           keyList.push(`${key1}.${key2}`);
680:         }
681:       });
682:     });
683: 
684:     keyList.forEach((pth) => {
685:       const keyval =
686:         (get(this.settings?.LLMProviderOptions, pth) as never as string) || "";
687: 
688:       const encrypted = this.getEncryptedKey(keyval);
689:       this.settings.LLMProviderOptionsKeysHashed[pth] = encrypted;
690:     });
691:   }
692: 
693:   removeApikeys(settings: typeof this.settings): typeof this.settings {
694:     const LLMProviderOptions = JSON.parse(
695:       JSON.stringify(settings?.LLMProviderOptions)
696:     ) as typeof this.settings.LLMProviderOptions;
697: 
698:     // get all secret keys
699:     Object.entries(LLMProviderOptions).forEach(([key1, l1]) => {
700:       if (typeof l1 != "object") return;
701:       Object.entries(l1).forEach(([key2, l2]) => {
702:         if (key2.toLowerCase().includes("key") && typeof l2 == "string") {
703:           set(LLMProviderOptions, `${key1}.${key2}`, "");
704:         }
705:       });
706:     });
707: 
708:     return {
709:       ...settings,
710:       api_key: "",
711:       LLMProviderOptions,
712:     };
Text Generator · src/main.ts · Q21

Open the original text of the fixed commit

742:   getEncryptedKey(apiKey: string) {
743:     if (!safeStorage?.isEncryptionAvailable() || !this.settings.encrypt_keys) {
744:       return `${DecryptKeyPrefix}${apiKey}`;
745:     }
746: 
747:     return safeStorage.encryptString(apiKey) as Buffer;
748:   }
749: 
Text Generator · src/constants.ts · Q22

Open the original text of the fixed commit

35:   custom_header: true,
36: };
37: 
38: export const DecryptKeyPrefix = "__@#key_prefix#@__";
39: 

What not confirmed in this comparison

We did not verify plugin installation or activation, the settings GUI, generation, calls to a model/API, real keys, transmitted packets, a network audit of all dependencies, or compliance with provider-backend retention, training, and deletion policies. SimpleMemo input, delivery, AI tags, synchronization, device-specific behavior, speed, productivity, traffic, and AI-citation effects are also outside the scope.

Written by SimpleMemo Developer. This comparison of source materials appears on a site operated by YURIKA, K.K.. It is not an official Obsidian endorsement or a privacy certification of the plugins.