Local Sidekick

by HPuntu
5
4
3
2
1
Score: 52/100

Description

Obsidian LLM agent interaction dashboard plugin

Reviews

No reviews yet.

Stats

10
stars
728
downloads
0
forks
99
days
28
days
28
days
1
total PRs
0
open PRs
0
closed PRs
1
merged PRs
0
total issues
0
open issues
0
closed issues
88
commits

Latest Version

a month ago

Changelog

Unreleased

1.2.0 - 2026-09-12

Agent Harness

  • Replace prompt-regex and chat-fence edit detection with explicit vault tools and a pre-execution approval round-trip to Obsidian.
  • Add Chat and Reviewed edits modes, exact-passage/versioned edits, append/create operations, and exact previous-answer saving.
  • Return applied, denied, conflict, failed, and cancelled results to the running agent; verify writes and cancel pending reviews on stop/restart.
  • Keep user extensions disabled in prompt runs; load only the embedded vault-tools extension via a private temporary file. User-config opt-in now affects discovery/model selection only.
  • Add unit, RPC transport, and real-Pi localhost integration tests, plus a separately identified local test package.

1.1.0 - 2026-09-12

Added

  • Model-aware thinking effort control in the composer, defaulting to Medium and exposing Extra high only when supported by Pi.
  • Reviewed append proposals that preserve existing note contents, including support for nested code fences.
  • Copy buttons for assistant messages and selectable output while replies stream.

Fixed

  • Share concurrent Pi model discovery requests and allow more time for cold starts when sending a new chat with Enter.
  • Verify that Ollama has unloaded the selected model and reset the Kill button after successful unloading.
  • Refresh missing model metadata before starting prompts or choosing thinking effort.
  • Repair Markdown tables immediately following prose without changing copied source text or fenced code.
  • Avoid unsolicited edit proposals on answer-only questions and remove repetitive no-file-changes status messages.

1.0.1 - 2026-08-14

  • Merge branch 'dev' (a0e2a82)
  • fix: give the Config and Chats dropdowns an explicit close button (d2b9250)

1.0.0 - 2026-08-13

First stable release. Local Sidekick reads your vault by default, writes only with per-edit approval, and one clearly-labelled setting hands control of Pi back to your own configuration.

Added

  • Queue a prompt while a reply is streaming. Send becomes Queue, the pending prompt is shown above the composer with a Cancel action, and it is sent when the current run finishes. Stopping a run discards anything queued for it.
  • Resend and Edit last, which stop the current run and either resubmit the previous prompt or return it to the composer. Pi keeps its own session history, so neither rewinds the model's context.
  • Pin notes to a session. Pinned files are attached to every prompt in that session, shown as removable chips, and persist with the session. A pinned file that is deleted or unreadable is reported and skipped rather than failing the run.
  • A Stop button in the composer, shown only while a reply is streaming.
  • Test suite (vitest, 161 tests) covering the security boundaries and pure logic: path containment, the Pi tool-mode decision, the safe-command allowlist and shell-metacharacter refusal, web-fetch host allowlisting and private/metadata IP blocking, @-mention resolution, vault path normalisation, edit-intent detection, and settings migration.
  • ESLint with typescript-eslint and eslint-plugin-obsidianmd, wired into npm run check and CI.

Security

  • Default Pi tools to Read-only (read, grep, find, ls) rather than Disabled. Pi can open and search vault files on its own initiative on a fresh install, which is the plugin's purpose. Writes, deletes, shell access, and network access remain restricted.
  • Keep Pi extensions, skills, prompt templates, and context files disabled by default. Pi's --tools/--no-tools filter built-in tools only; extension-registered tools bypass them (earendil-works/pi#2835), so passing --no-extensions is what makes the tool restriction mean anything. The two defaults are a pair: read-only is only meaningful while extensions are off.
  • Rename piExperimentalFeaturesEnabled to allowPiUserConfig, shown as Allow Pi extensions and user configuration. Existing values migrate automatically, so an explicit choice survives the upgrade.
  • Correct the approval note, which claimed "Execution disabled. Approval can be recorded for UX testing only." Approving a proposed edit really does write the file; the note predated that being implemented and understated what approval does.
  • Report a tool Pi ran outside the requested mode as Ran outside allowlist: ... rather than "Blocked", and stop queueing an approval for it. Tool events arrive after Pi has already executed the call, so the old wording implied a prevention the plugin cannot perform.
  • Decide whether a run may use tools from the tool mode itself rather than by re-parsing an assembled command string.
  • Correct the safety audit log, which recorded --experimental-pi-features — a flag never passed to Pi.
  • Reframe README and SECURITY.md around what the plugin does: it reads your vault by default. Both state plainly that Pi, not this plugin, enforces tool limits; that Pi is not confined to the vault by Local Sidekick; and that enabling Pi extensions allows unverified agent code to run outside every documented boundary.

Changed

  • Remove the loopback HTTP bridge. It served only /health and nothing consumed it. The plugin now opens no listening sockets. This removes the Start bridge automatically setting and the Restart Sidekick bridge and Stop Sidekick bridge commands.
  • Rework the top bar: Config, Chats, the model and profile picker, then Start/Kill. Chats opens a scrollable list of every chat, newest first; the home page shows only the five most recent with a link to the rest.
  • Rename the top-bar Stop to Kill, green while it reads Start and red once it reads Kill. Kill now unloads the model from Ollama, which is what actually frees memory.
  • Base Start/Kill on whether Pi discovery has succeeded, which is what a prompt actually needs. The partial state now reads "Ollama only" — Ollama answering while Pi has no model list — which is the half-configured state users land in.
  • Stream replies by repainting only the message being written rather than rebuilding the sidebar on every token. Long chats no longer slow down as they grow.
  • Replace per-phase run chatter with a single "Thinking..." line that clears when the reply arrives. Retries, extension errors, and failures are still shown.
  • Group consecutive tool events into one collapsed row summarising the steps, instead of a card per call.
  • Enter sends; Shift+Enter inserts a newline. When the @-mention list is open, Enter still accepts the highlighted suggestion.
  • Replace the composer's text buttons with colour-coded icons and hover tooltips. If an icon name is missing from your Obsidian build the button falls back to its text label.
  • Rework the sidebar's surfaces so it blends with the workspace, using only Obsidian's semantic variables so themes and light/dark follow automatically.
  • Mark models Ollama has pulled but Pi has not been configured with as not in Pi. Clicking one copies the models.json entry to paste into your Pi config, rather than failing at set_model.
  • Show only agent profiles compatible with the selected model in the picker's submenu, and say so when a profile overrides your model choice.
  • Cut the prompt scaffolding back to the minimum. The plugin decides in code whether the edit format is needed; the prose only describes mechanics, so the model behaves normally and simply knows the vault is there.
  • Apply Obsidian's sentence-case guidance to UI text, capitalising "Sidekick" as the product name.
  • Remove test scaffolding and dead settings: the Create sample approval request command, the fabricated approvals the safety self-check added to the real queue, the permissionMode setting that was never read, and the statusPanelHeight setting for a panel that no longer exists.
  • Split main.ts into focused modules, and move prompt-context assembly into prompt/buildContext behind an explicit dependency object built once per run.
  • Signal run completion through an explicit onComplete callback rather than inferring it from status text.

Fixed

  • Give the Config and Chats dropdowns an explicit close button. Both could only be dismissed by re-clicking their top-bar toggle, which is undiscoverable when the chat list was opened from the home page's "more in Chats" link rather than from the Chats button itself.
  • Keep the transcript where you scrolled it. Repaints during a run were re-pinning to the bottom, which made it impossible to scroll back and read anything mid-reply.
  • Keep the composer editable while a reply streams, preserving the draft, focus, and caret position across repaints. Sending is still gated on the run finishing.
  • Let the transcript shrink when a dropdown opens, so the composer is no longer pushed off the bottom of the panel.
  • Match @-mentions for filenames containing spaces.
  • Restore blue inline links for @-mentioned files in rendered messages.
  • Activate Pi models by the provider and id Pi reported at discovery, rather than re-deriving them from the display label.
  • Stop rewriting the entire plugin data file while a reply is streaming; the final text is flushed when the run ends.
  • Move markdown rendering onto a Component owned by the view, and per-view UI state off module scope, so nothing leaks across plugin reloads or bleeds between leaves.
  • Build inline file links with the text node's own document rather than the global one.

0.2.4 - 2026-07-02

  • Merge remote-tracking branch 'origin/main' (0ec4d78)
  • fixed tool action blocked notifications showing even when not blocked (29f8b63)

0.2.3 - 2026-07-02

  • Merge remote-tracking branch 'origin/main' (92e25aa)
  • some dropdown model election box fixes (a321aa6)

0.2.2 - 2026-07-01

  • Merge remote-tracking branch 'origin/main' (f8f6998)
  • chore: remove stray manifest.jsony (9a8c130)
  • fix: address second Obsidian review (settings heading + lint warnings) (b6a769b)

0.2.1 - 2026-06-30

Fixed

  • Address the Obsidian plugin review: require Obsidian 1.7.2+ for modern vault and workspace APIs, use Setting headings in the settings tab, render Markdown through a managed component instead of the plugin instance, move tool-card styling into CSS, await leaf reveal, and stop detaching the view leaf on unload.

0.2.0 - 2026-06-30

Added

0.1.11 - 2026-06-29

Fixed

  • One-click Start/Stop pipeline: checks Ollama, probes Pi, discovers RPC models, starts the bridge, and activates the selected model.

Changed

  • Redesign the sidebar into a single clean view — top bar with a status menu, a combined model/agent-profile picker (profiles cascade from each model), and a Start/Stop button; recent chats stacked above a pinned chat input.
  • Slim recent-chat rows to a single line showing only the title and date.

0.1.10 - 2026-05-29

  • readme update (18d7063)

0.1.9 - 2026-05-29

  • readme update (185e175)

0.1.8 - 2026-05-29

Added

  • Add vault-native Sidekick .agent.md profiles with selectable model lists, disabled/read-only tool preferences, included memory files, /agent prompt selection, and starter research/writing/code/linking/glossary agents.
  • Add generated Sidekick/Prompts/*.prompt.md prompt library starter files.
  • Add Sidekick/Memory/project-index.md generation from Markdown filenames and top headings.
  • Add explicit .pi/ resource export for Sidekick prompt templates and vault-linker/glossary-curator skills.
  • Add persistent sidebar controls for Sidekick agent profiles alongside the model rail.

Changed

  • Prepare Pi session folders through the Obsidian vault adapter instead of runtime Node fs access.
  • Clarify shell execution, Pi launch, safe command allowlist, and vault enumeration boundaries in public docs.

Fixed

  • Collapse tool-use events by default behind expandable Tool used: <tool> cards in the chat stream.
  • Fix tool-use cards so expanded content can show message, input, output, or raw event details.

0.1.7 - 2026-05-27

  • Revise README for clarity on Local Sidekick features (e1f0533)

0.1.6 - 2026-05-27

  • Reduce runtime filesystem access warning (d7b28b4)

0.1.5 - 2026-05-27

  • Merge remote-tracking branch 'origin/dev' (69325b6)
  • Fix release version selection (c56d31d)
  • Merge pull request #1 from HPuntu/dev (acab437)
  • Merge branch 'main' into dev (59c8dbb)
  • Fix community plugin review issues (667057f)

0.1.4 - 2026-05-27

  • Merge remote-tracking branch 'origin/main' (cc643c1)
  • up (f102b0d)

0.1.3 - 2026-05-27

  • Merge remote-tracking branch 'origin/main' (7ca2ff7)
  • readme update (d2fd1a5)

0.1.2 - 2026-05-27

  • Merge remote-tracking branch 'origin/main' (8dc076f)
  • several updates to ui (dab3a4a)

0.1.1 - 2026-05-27

  • increased overall safety for web fetch and pdf accession among otheres ( see changelog) (8204eb6)
  • versioning and package build release v0.10 implemented (3462dcf)
  • readme update (fbb1639)
  • release commit v0.1.0 (da82f01)
  • up (69ad520)
  • tool usage implemented (fa33b5e)
  • light changes to some stdout readout (706c306)
  • up (f468a92)
  • made the status view panel smaller (2bc507f)
  • added full session history, agent selection and Pi agent RCPa (c6eae36)
  • initial commit (38b3bd8)

0.1.0

Initial alpha release candidate.

Added

  • Right-sidebar Local Sidekick view for Obsidian desktop.
  • Local Pi and Ollama status checks.
  • Pi RPC discovery and model selection.
  • Persistent chat sessions with history view.
  • Streaming chat display with Markdown and math rendering through Obsidian.
  • Vault @ file mentions for Markdown, text-like files, attachments, and PDFs.
  • Best-effort PDF text extraction for text-based PDFs.
  • Prompt context helpers for vault search, related-note search, vault index, safe commands, web fetch, and internal link suggestions.
  • Reviewed Markdown edit proposals with diff rendering and approval queue.
  • Chat export to Markdown in a vault Chats/ folder.
  • Conservative default safety mode with Pi tools disabled.
  • Optional read-only Pi tools for read, grep, find, and ls.
  • Settings for Pi executable, Pi timeout, Ollama host, safe commands, web fetch, allowed external read roots, and sidebar status panel height.
  • Draggable vertical divider between Status and Agent panels, with persisted height, keyboard resizing, and double-click reset.
  • Main-push release promotion workflow and dev-branch CI health workflow.
  • Release packaging for main.js, manifest.json, styles.css, and the versioned release zip.

Changed

  • Replaced the large sidebar text title with the same bot icon used by the Obsidian ribbon action.
  • Made the Status panel compact, scrollable, and user-resizable so the Agent view can take more vertical space.
  • Moved model selection into a compact persistent model rail.
  • Narrowed the default safe command allowlist to low-risk read-only commands: git status and git diff --stat.
  • Pi prompt, discovery, and model-switch runs disable Pi extensions, skills, prompt templates, and context files by default unless the experimental setting is enabled.
  • Updated public release documentation, release checklist, privacy notes, and security notes.

Fixed

  • Fixed recent chat history rows rendering as overlapping button boxes by resetting Obsidian button layout styles for session cards.
  • Fixed @ mention handling from the fresh session landing page.
  • Fixed file mention path resolution for vault paths, wiki-style paths, and extensionless Markdown/PDF references.
  • Improved model/tool error messaging when a selected Ollama model does not support Pi tools.
  • Improved chat event rendering so status messages stream inline with model output instead of boxed cards.

Security

  • Web fetch now requires HTTPS and an explicit allowed-host list.
  • Web fetch resolves DNS before request, blocks localhost/private/link-local/reserved/multicast/metadata-style addresses, and pins the HTTPS request to the checked DNS result.
  • PDF text extraction now enforces stricter compressed stream, per-stream decoded, and total decoded byte limits.
  • Non-default Pi executable paths require once-per-Obsidian-session confirmation before use.
  • Experimental Pi extensions, skills, prompt templates, and context files require once-per-session confirmation before launch when enabled by vault settings.
  • Documented that .obsidian/plugins/local-sidekick/data.json may contain prompts, replies, note excerpts, proposed edits, and settings, and may sync with vault configuration.

Known Limitations

  • Alpha release intended for private or trusted beta testing.
  • Not all Ollama models support tools.
  • Local models may hallucinate without explicit context.
  • PDF extraction is best-effort and does not include OCR.
  • Web fetch is disabled by default and intentionally limited.
  • Reviewed edits currently target Markdown files.
  • Automated end-to-end tests are not yet included.

README file from

Github

Local Sidekick

A light Obsidian plugin I got Codex to build for me so I could use local LLM agents through a simple interactive chat sidebar in Obsidian via Ollama and the Pi agent harness.

DISCLAIMER: I am not a javascript/node developer. This is a vibe-coded project with human oversight prioritising safe, conservative agent capabilities and simplicity. If anyone has relevant experience or suggestions for improvements, I'd be happy to hear from you. I know that one or two similar agent plugins exist, but I wanted one specifically designed for local agents as a lightweight sidebar chat rather than a full dashboard or ACP generalist.

About

Local Sidekick is a local-first LLM sidebar for Obsidian, for Pi and Ollama users who want vault-aware chat without anything leaving their machine.

What It Does To Your Vault

Read this before installing.

Local Sidekick reads your vault. That is the point of it. By default it launches Pi with its read-only tools enabled — read, grep, find, and ls — rooted at your vault. The agent can open and search your notes on its own, without asking each time. The plugin also assembles context itself from @-mentions, the current note or selection, vault search, and pinned notes.

What it will not do by default:

  • Write. Every change arrives as a proposal. You see a diff and approve each one individually, and only Markdown files inside the vault can be written.
  • Delete. Not implemented at all.
  • Run shell commands. Only exact entries in a allowlist you maintain, only when you type @cmd(...) yourself, and never through a shell.
  • Reach the network. Web fetch is off. Enabled, it is HTTPS-only to hosts you list explicitly.
  • Phone home. No telemetry, and no local server. Prompts go to your local Ollama and nowhere else.

Agent prompt runs load only Sidekick's bundled vault-tools extension. User extensions, skills, templates and context files are disabled for those runs. Pi user configuration for discovery is a separate opt-in for discovery and model selection; those processes can execute user extension code and must be trusted. Local Sidekick does not provide an OS sandbox for Pi.

light_mode Local Sidekick seamlessly uses your Obsidian theme for its UI, supporting dark and light mode. It can be launched from the command palette or from the small AI agent icon on the left toolbar. Doing so will open the interactive dashboard as a tab in the right hand sidebar. An agent status panel at the top of the sidebar gives real time information on the local models being used alongside interactive buttons to find local models. Below a new chat can be started from an interactive prompt box with model selection or a recent chat from session history continued.

Features

  • Local model workflow through Pi and Ollama.
  • Vault-native Sidekick agent profiles, prompt library files, and memory files under Sidekick/.
  • Persistent chat sessions with a history landing page.
  • Compact model rail with discovered Pi/Ollama models and capability badges.
  • Markdown and math rendering through Obsidian's renderer.
  • Vault file mentions with @, including Markdown, text-like files, attachments, and best-effort PDF text extraction.
  • Prompt context helpers:
    • @search(query) for local vault search.
    • @semantic(query) for lightweight related-note search.
    • @vault-index for filenames and top headings.
    • @links or @links(query) for conservative internal link suggestions.
    • @cmd(command) for exact allowlisted local commands.
    • @url(url) for optional HTTPS web fetch context from explicitly allowlisted hosts.
  • Reviewed Markdown edit proposals with visible diffs and approval before write.
  • Chat export to Markdown, defaulting to a Chats/ folder in the vault.
  • Starter research tutor, writing editor, code reviewer, vault linker, and glossary curator profiles.
  • Explicit export of Sidekick profiles into Pi prompt templates and skills under .pi/.
  • Obsidian command palette actions for opening the sidebar, exporting chats, checking Pi/Ollama, refreshing Sidekick memory files, and suggesting internal links.

dark_mode Chat session agent reply streams are rendered in markdown with your Obsidian theme, handling math and standard formatting. For a full Obsidian IDE experience use the terminal plugin alongside this so you never have to leave Obsidian!

Sidekick also includes a plugin-native internal link suggester, available from the command palette or with @links, that proposes connections between notes without requiring Pi tool support. It builds conservative candidates from Markdown filenames and top-level headings, ranks them with local related-note search, and shows reviewed diffs before any note is changed.

New Agentic Productivity Features Introduced in v0.1.8

To better exploit the local-first nature of Sidekick, v0.1.8 introduces a set of features for turning your vault into a persistent source of agent instructions, memory, and workflow configuration.

  • Sidekick can now create a Sidekick/ folder in the root of your vault, including template .agent.md profiles for different use cases.
  • .agent.md profiles can specify preferred local models, tool usage preferences, included memory files, and system-style instructions written directly in Markdown.
  • Agent profiles can be selected from the UI, with model choices narrowed to the models that make sense for that profile.
  • Custom prompts, vault memory, project summaries, glossaries, and other reusable context can now live as ordinary Markdown files inside the vault and be referenced with @.
  • Users can ask the agent to help generate or update profile files and memory files, making it easier to maintain things like a vault glossary or project index over time.
  • Sidekick can export selected profiles, prompts, and skills in a Pi-compatible format for use outside the plugin.

Requirements

  • Obsidian desktop 1.5.0 or newer.
  • Node.js and npm for building from source.
  • Ollama running locally.
  • Pi installed and available as pi, or configured with an absolute executable path in plugin settings.
  • At least one Ollama model configured in Pi.

Tool use depends on the selected model. Some Ollama models can chat but do not support tools. When a model does not support tools, set Pi tools to Disabled and use explicit @ context, @search, @semantic, and @vault-index instead.

Installation

Install from inside Obsidian: open Settings → Community plugins, browse, search for "Local Sidekick", install, and enable it. You can also build from source (below).

From Source

  1. Clone this repository.
  2. Install dependencies:
npm install
  1. Build the plugin:
npm run build
  1. Create this folder in your vault:
.obsidian/plugins/local-sidekick/
  1. Copy these files into that folder:
main.js
manifest.json
styles.css
  1. Reload Obsidian and enable Local Sidekick in Settings -> Community plugins.

For alpha testing, use a copied vault or a small test vault first.

Pi And Ollama Setup

The expandable thinking scale at the bottom-right of the composer sets effort for the next prompt. Medium is the default, including for older saved Default preferences. Selected levels override the saved session level when a prompt starts. The selection is saved in Sidekick. Unsupported selections fall back to Medium or another supported level when switching models. Extra high appears when the model explicitly maps thinkingLevelMap.xhigh to a provider value. Ollama models expose low, medium, and high, subject to thinkingLevelMap exclusions. Off requires an explicit thinkingLevelMap.off provider value (such as none) and is unavailable for GPT-OSS. Levels depend on the model and Ollama version; they do not specify a duration. The prompt timeout remains a separate deadline.

  1. Start Ollama.
  2. Pull the local models you want to use.
  3. Tell Pi about those models. This step is required and is not automatic — Pi does not read Ollama's inventory. List each model in ~/.pi/agent/models.json:
{
  "providers": {
    "ollama": {
      "api": "openai-completions",
      "apiKey": "ollama",
      "baseUrl": "http://127.0.0.1:11434/v1",
      "models": [
        { "id": "gemma4:31b" },
        { "id": "qwen3-coder:30b" }
      ]
    }
  }
}

apiKey must be present even though Ollama ignores it. A model you have pulled but not listed here appears in the model picker marked not in Pi; click it to copy the entry to paste into this file. 4. In Obsidian, open Settings -> Local Sidekick. 5. Confirm:

  • Ollama host points to your local Ollama server, usually http://127.0.0.1:11434.
  • Pi executable is either pi or the absolute path to your Pi binary.
  • Pi tools is Read-only (the default) or Disabled if you want Pi fully tool-free.
  • Pi user configuration for discovery is off, unless you trust every extension your Pi setup loads.
  1. Open the sidebar and click Ollama, Pi, and RPC to confirm discovery.

The sidebar can still be useful without Pi tools. File mentions and local context directives are often safer and more reliable than asking a model to inspect the vault on its own.

Usage

Open the command palette and run Open Sidekick. Local Sidekick opens as a right sidebar so your main note stays visible.

Start a new chat from the session landing page, or select a previous session. Use the agent profile selector to choose a local .agent.md profile, then use the model rail at the top to switch among that profile's model choices. Use @ in the composer to attach vault files as context.

Useful prompt patterns:

Summarize @Projects/Example/MAIN.md and list only facts supported by that file.
Use @vault-index and @semantic(EGNO interpolation) to suggest related notes.
Use @links for this note and propose only high-confidence Obsidian links.
Use @cmd(git status) and tell me whether the vault plugin repo is clean.
/agent research-tutor
Explain @Projects/Example/MAIN.md and quiz me on the key definitions.

When the agent proposes edits, it must use reviewed edit blocks. The plugin renders a diff and requires approval before applying changes.

Sidekick Agent Profiles And Memory

Nothing is written to your vault on install. The starter profiles are created only when you ask for them, from Settings -> Local Sidekick -> Create starters, the sidebar Create button, or the Create Sidekick starter files command. Until then no Sidekick/ folder exists and the profile picker is empty, which is expected.

When you do, Local Sidekick creates a vault-root Sidekick/ folder for portable agent profiles and durable local memory files:

Sidekick/
  Agents/
    research-tutor.agent.md
    writing-editor.agent.md
    code-reviewer.agent.md
    vault-linker.agent.md
    glossary-curator.agent.md
  Prompts/
    summarize-note.prompt.md
    research-questions.prompt.md
    glossary-update.prompt.md
  Memory/
    vault-summary.md
    user-preferences.md
    project-index.md
    glossary.md

Create these starter files from Settings, the sidebar Create button, or the Create Sidekick starter files command. Sidekick/Prompts/*.prompt.md files are ordinary Markdown prompt snippets: mention them with @, copy from them, or include them from an .agent.md profile. Refresh Sidekick/Memory/project-index.md with the Refresh Sidekick project index command; it is generated from local Markdown filenames and top headings.

A .agent.md file uses simple YAML frontmatter plus Markdown instructions:

---
name: research-tutor
description: Socratic research helper for careful note-grounded explanations.
models:
  - ollama/qwen3-coder:30b
  - ollama/deepseek-r1:32b
tools: disabled
include:
  - Sidekick/Memory/vault-summary.md
  - Sidekick/Memory/user-preferences.md
  - Sidekick/Memory/glossary.md
---

You are a careful research tutor working inside an Obsidian vault.
Use only supplied vault context as evidence for claims about the user's notes.

The Markdown body is added to the prompt as system-style guidance. include files are read through the Obsidian vault API and added as explicit context. models filters the model rail to the profile's preferred choices while still letting the user pick among those local models. tools currently supports only disabled and read-only; broader Pi tools are still not exposed by Local Sidekick.

You can also select a profile inline by making /agent profile-name the first line of a prompt. Use /agent clear as the first line to clear the current profile.

The vault-linker and glossary-curator starters formalize the existing internal-link and glossary workflows: they use the generated project index, related-note search, and reviewed edit proposals so link/glossary changes stay conservative and inspectable.

Use Export Sidekick Pi resources when you want matching Pi resources outside the Local Sidekick prompt path. This creates or updates .pi/prompts/*.md, .pi/skills/sidekick-vault-linker/SKILL.md, .pi/skills/sidekick-glossary-curator/SKILL.md, and merges prompts/skills entries into .pi/settings.json. This is explicit because .pi/settings.json can affect Pi runs started directly from the vault root.

Safety

Local Sidekick reads your vault by default and writes to it only with your approval. The list below is what that means precisely.

Reading — on by default

  • Pi runs with its read-only tools: read, grep, find, and ls, rooted at your vault. The agent decides when to use them; it does not ask per file.
  • The plugin separately reads notes you attach with @, Note/Selection/Vault context, pinned notes, and Sidekick profile and memory files.
  • .agent.md profiles and memory files are ordinary vault files that steer prompt instructions, model choice, and tool mode. Inspect them before using profiles from a vault you did not create.
  • External workspace roots are opt-in and read-only.

Writing — requires your approval every time

  • Changes arrive as reviewed Markdown edit proposals. You see a diff and approve each one.
  • Markdown only, inside the vault only. Writes outside the vault are blocked.
  • Deletes are not implemented.
  • Export Sidekick Pi resources writes .pi/ resources only when you invoke it. Inspect the generated .pi/settings.json if you also run Pi directly in the vault.

Executing — narrow and explicit

  • Pi bash, edit, and write tools are not requested by the plugin.
  • The plugin launches the local pi executable to run the agent. That is inherent to local agent workflows, and is why automated scanners report process execution.
  • Pi and safe commands are launched without a shell, so pipes, redirects, and chaining are unavailable through these paths.
  • @cmd(...) runs only exact entries from your safe command allowlist, and only when you type it. The default list is git status and git diff --stat. Commands run from the vault root — avoid adding package-manager scripts unless you trust the repo.
  • Non-default Pi executable paths require per-session confirmation, because vault settings can come from elsewhere.

Network — off by default

  • Web fetch is disabled. Enabled, @url(...) requires HTTPS and an explicit host allowlist, and blocks localhost, private, link-local, reserved, and metadata IP ranges after DNS resolution.
  • No telemetry. Prompts go to your local Ollama and nowhere else.

User configuration during discovery

Pi user configuration for discovery permits user extensions during model discovery and selection only. It is off by default. These extensions are trusted local code, not sandboxed plugins. Prompt runs ignore this setting and use the bundled vault tools exclusively.

None of this makes local agent workflows risk-free. Local models hallucinate, misread paths, and propose wrong edits. Read the diffs before approving them.

Local Data And Sync

Local Sidekick stores settings, chat history, proposed edits, approvals, and session metadata in the plugin's Obsidian data file inside the vault configuration. That data is local to your vault, but it may be copied by Obsidian Sync, iCloud, Dropbox, Git, or any other sync/backup tool that includes your .obsidian folder.

Treat .obsidian/plugins/local-sidekick/data.json as private vault data. It may contain prompts, model replies, note excerpts, proposed file contents, and local settings. Do not publish or share it accidentally.

Persistent Pi session files are stored under the plugin folder in your vault configuration. Local Sidekick prepares that folder through Obsidian's vault adapter before launching Pi.

Because vault plugin data can be imported from someone else, Local Sidekick asks for per-session confirmation before using a non-default Pi executable path. Keep Pi executable set to pi unless you intentionally trust the configured behavior.

What Enforces Tool Limits

Local Sidekick passes an explicit Pi tool allowlist: the built-in read,grep,find,ls, plus the bundled vault tools allowed by the composer mode. Disabled passes --no-tools and loads no extension. Pi enforces availability of its native tools. An unexpected native tool event is still an after-the-fact report, not proof it was prevented.

The bundled vault tools are different: they request operations over Pi's existing stdin/stdout RPC channel. Obsidian validates the request and performs the write only after approval. The extension never writes notes itself, and the plugin opens no listening sockets. The extension source is embedded in main.js, materialized in a private temporary directory per run, and removed on completion or cancellation.

Pi's read-only tools run with the working directory set to your vault, but the plugin does not confine Pi to the vault.

Pi Extensions And User Configuration

Prompt runs always disable auto-discovered Pi extensions, skills, prompt templates, and context files. Sidekick explicitly loads only its bundled extension alongside --no-extensions. Pi 0.75.4 is integration-tested; runs fail before sending the prompt if the extension cannot initialize its tools.

Pi tool-filter semantics have changed across versions. The plugin does not depend on tool flags alone to exclude arbitrary user extensions.

The user-configuration opt-in now applies only to discovery and model selection. It does not add third-party tools to agent prompt runs.

Pi tools are a separate setting. Read-only enables native read tools and Sidekick's managed vault tools. Native bash, edit, and write stay off. Disabled removes all tools, including the managed vault tools.

Tool-Based Vault Editing

  • Chat exposes read_note but no mutation tools. Reviewed edits also exposes create_note, append_note, and edit_note. Choose the mode in the composer; it stays fixed during a run.
  • No prompt regex decides edit intent, and chat Markdown is never parsed into new edit proposals. The model chooses whether to call a tool based on your request. Approval remains mandatory for every write.
  • Each edit pauses at a visible diff. Approve and apply writes that exact change and returns the result to Pi; Deny returns a denial without writing. There is no separate Apply step for live agent tools.
  • edit_note requires a prior read_note in the same run, its version, and one exact text match. Appends preserve existing contents. Create refuses to overwrite an existing note.
  • Create and append can use the stored previous answer ID instead of regenerating its text.
  • Tool targets must be vault-relative Markdown paths, outside hidden folders and Obsidian configuration. Symlink paths are rejected. New notes require an existing parent folder.
  • Existing-note updates use Obsidian's atomic vault.process callback to reject changes made since review. The result is read back for verification and returned to the model as applied, denied, conflict, cancelled, or failed.
  • Approval waiting does not consume the model execution timeout. Stop cancels pending reviews; completed writes are not rolled back. Pending tool edits restored after a restart cannot be applied.
  • This is not an OS filesystem sandbox. Native Pi reads are not confined by these vault-tool path checks, and concurrent external filesystem/symlink changes remain a limitation.

Local Harness Testing

npm run check runs unit and transport tests. npm run test:pi additionally runs the installed Pi against a scripted localhost provider and temporary vault, covering approval, denial, Chat mode, and abort. It uses neither your Ollama models nor your real vault or Pi configuration.

npm run package:harness creates dist/local-sidekick-harness-test/ and a zip with a separate plugin ID. Install that folder under your vault's plugin directory to test without replacing local-sidekick or local-sidekick-thinking. It starts with separate settings and chat history. Disable the other Sidekick instances while testing.

Untrusted Vaults And Notes

Anything in a vault can end up in a prompt, and a note can contain text written to steer the model. Local Sidekick contains the outcome — every edit is a proposal you approve individually after seeing its diff, limited to Markdown files inside the vault — but it cannot tell a malicious instruction from a legitimate one. Reviewing what you open is your responsibility, particularly for vaults you did not create.

PDF Support

PDF mention support is best-effort. The plugin tries to extract text from common text-based PDFs inside the vault and adds that text as prompt context.

Limitations:

  • No OCR.
  • Scanned PDFs may produce no text.
  • Encrypted or unusual PDFs may fail extraction.
  • Very large PDFs are skipped.
  • Compressed and decompressed PDF streams have stricter per-stream and total limits to reduce UI freezes from malicious or unusual PDFs.
  • Extracted text is capped before it is sent to the model.

When PDF extraction fails, the plugin should tell the model that content was unavailable rather than letting it infer details from the filename.

Sidekick includes a plugin-native internal link suggester, available from the command palette or with @links, that proposes connections between notes without requiring Pi tool support. It builds conservative candidates from Markdown filenames and top-level headings, ranks them with local related-note search, and shows reviewed diffs before any note is changed.

Troubleshooting

"Offline error" when starting Pi or RPC

Pi runs a version check against the network at startup, and the result is cached for a few days. On an offline machine that cache eventually expires, and the next launch fails with an offline error even though your models are local. Local Sidekick launches Pi with PI_SKIP_VERSION_CHECK=1 so this check never runs and the plugin stays fully local. If you still see network errors on launch, confirm you are on a build from v0.1.11 or later.

For fully offline use, keep an ollama/ model selected in the model rail. A cloud-provider model such as anthropic/... still needs network access for inference; only ollama/ models run entirely against your local Ollama host.

Known Limitations

  • This is alpha software.
  • Local models may hallucinate unless given exact context.
  • Some Ollama models do not support tools.
  • Pi behavior depends on the installed Pi version and local configuration.
  • PDF extraction is not a full PDF parser and does not perform OCR.
  • Web fetch is intentionally limited, disabled by default, HTTPS-only, and requires an explicit host allowlist.
  • The reviewed edit path currently targets Markdown files.
  • There is no automated end-to-end test suite yet.

Commands

The plugin registers these Obsidian commands:

  • Open Sidekick
  • Insert Sidekick block
  • Refresh Sidekick agent profiles
  • Create Sidekick starter files
  • Refresh Sidekick project index
  • Export Sidekick Pi resources
  • Check Ollama status
  • Check Pi executable
  • Discover Pi RPC
  • Stop agent run
  • Clear agent events
  • Start new persistent agent session
  • Export active agent chat to Markdown
  • Suggest internal links for current note
  • Run agent safety self-check