Obsidian / Data path of AI plug-in
Confirm with official materials and fixed sourcesAI 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.
- Modelprovider・endpoint・agent
- Context to refer toSelections, excerpts, templates
- Index and searchLocal or another server
- 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
| Fixed version | The route shown in the document | Context and index | Check key settings | Remaining 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. Q03 | The 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/Q05 | Source: 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 / Q09 | Compliance 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/Q11 | README 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/Q13 | Real 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 / Q24 | A 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/ Q17 | Source 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 / Q22 | Actual 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 do | Target to be confirmed | What you can't understand from this comparison alone |
|---|---|---|
| Handling notes in a cloud model | model/provider/endpoint, selection, excerpt, template, agent/skill to use | Operation, billing, and response quality of actual payload, provider |
| I want to make an index locally | Embedding/index processing destination, remote server configuration, later model, model acquisition and additional functions | Communication stoppage of all functions, all dependent routes, actual index on the terminal |
| I want to know the range of saving and sharing keys | Fields to be saved, branches that cannot be encrypted, and where to share logs/diagnostics/settings | Compliance 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?
Does Smart Connections send notes to the outside?
Does includeClipboard=true in Text Generator mean that the clipboard must be sent?
If the api_key of the saved data is empty, is the key encrypted?
Does this article compare the quality of AI responses, fees, and iPhone operation?
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.
- Copilot 4.0.12 · minimum Obsidian 1.11.4 · release · commit 8c56781c43
- Smart Connections 4.7.2 · minimum Obsidian 1.8.7 · release · commit 92e8d56c66
- Text Generator 0.8.7 · minimum Obsidian 1.6.0 · release · commit 4b9ddf8767
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.