goberomsu618 downloadsChat with your notes & see links to related content with Local or Remote models.
Your notes, semantically connected. A powerful Obsidian plugin that discovers related notes and enables semantic search across your entire vault—powered by local embeddings or your favorite AI provider.
Open Connections bridges the gap between simple keyword search and intelligent semantic discovery. As you write in Obsidian, it automatically surfaces notes that are semantically related to your current file—not just keyword matches, but conceptually connected ideas. It works entirely on your machine with local embeddings, or seamlessly integrates with OpenAI, Gemini, Ollama, and other providers.
main.js, manifest.json, and styles.css from the latest release.obsidian/plugins/open-connections/ in your vaultgit clone https://github.com/GoBeromsu/Open-smart-connections.git
cd open-connections
pnpm install
pnpm run build
Copy dist/ contents to your vault's .obsidian/plugins/open-connections/ directory.
Open Connections ships MCP support from this same repository/package in two ways:
Open Connections: Start local serverOpen Connections: Stop local serverpnpm install
pnpm exec open-connections-mcp /path/to/your/vault
HTTP mode is also available:
pnpm exec open-connections-mcp /path/to/your/vault --http --port 27124
The standalone process reads the vault plugin data from .obsidian/plugins/open-connections/, so the plugin must already be installed and run at least once for the target vault.
Embeddings are the core of semantic search. They convert text into mathematical vectors that capture meaning. Open Connections uses these vectors to find notes that are semantically similar.
┌─────────────────┐
│ Your Notes │
└────────┬────────┘
│
┌────▼─────┐
│ Embedding │ (Local Transformers.js or API provider)
│ Model │
└────┬─────┘
│
┌────▼──────────────┐
│ SQLite Cache │ (Fast, persistent storage)
└────┬──────────────┘
│
┌────▼────────────────────┐
│ Semantic Search Engine │
│ • Connections View │
│ • Lookup View │
└─────────────────────────┘
Connections View — Shows notes semantically related to the file you're currently viewing. Updates automatically as you navigate.
Lookup View — Semantic search across your entire vault. Type a query and find notes by meaning, not just keywords.
Open Connections supports multiple embedding providers. Choose what works best for your workflow:
| Provider | Type | Quality | Speed | Cost | API Key Required | Notes |
|---|---|---|---|---|---|---|
| Transformers | Local (in-browser) | High | Fast | Free | No | Default. WebGPU accelerated. No setup. |
| OpenAI | API | Very High | Fast | $ | Yes | Most accurate. Supports dimension reduction. |
| Gemini | API | High | Fast | Free tier | Yes | Google's embedding model. Generous free tier. |
| Ollama | Local (server) | Variable | Variable | Free | No | Run any HuggingFace model locally. Requires Ollama running. |
| LM Studio | Local (server) | Variable | Variable | Free | No | Desktop app for local model hosting. |
| Upstage | API | High | Fast | $ | Yes | Korean AI startup. Excellent multilingual support. |
| OpenRouter | API | High | Fast | $ | Yes | Access multiple models through one API. |
Best for privacy (local, zero setup):
Provider: Transformers
Model: Xenova/bge-micro-v2 (default, fast, good quality)
Best for quality (API):
Provider: OpenAI
Model: text-embedding-3-small or text-embedding-3-large
Best for multilingual vaults (local):
Provider: Transformers
Model: Xenova/bge-m3 (multilingual, high quality)
Best for multilingual vaults (API, free tier):
Provider: Gemini
Model: gemini-embedding-001
Best for self-hosted (local server):
Provider: Ollama
Model: nomic-embed-text or bge-m3 (after pulling)
Tip: Pin the Connections View in your sidebar for always-on semantic discovery as you work.
Tip: Lookup finds notes by meaning, not exact keywords. Describe what you're looking for conceptually.
Access these from the Command Palette (Cmd/Ctrl + P):
Embedding Provider — Choose where embeddings come from (local or API).
Model Selection — The plugin auto-discovers available models from your chosen provider. For API providers, ensure your API key is set first.
Connection Count — How many related notes to show in the Connections View (default: 5).
API Keys — Store credentials for OpenAI, Gemini, Upstage, OpenRouter, etc. Keys are stored in Obsidian's encrypted settings.
Advanced — Model fingerprinting, cache management, re-embedding triggers.
For development or advanced configuration, set these in a .env file:
OPENAI_API_KEY=your-key-here
GEMINI_API_KEY=your-key-here
OLLAMA_HOST=http://localhost:11434
| Layer | Technology |
|---|---|
| Platform | Obsidian Plugin API |
| Language | TypeScript 5, JavaScript |
| Bundler | esbuild |
| Embeddings | Transformers.js (WebGPU + WASM), OpenAI, Gemini, Ollama, LM Studio, Upstage, OpenRouter |
| Storage | SQLite (node:sqlite) |
| Parallelism | Web Workers (embedding in background) |
| Testing | Vitest |
open-connections/
├── src/
│ ├── main.ts # Plugin entry point
│ ├── domain/ # Business logic (NO obsidian imports)
│ │ ├── config.ts # Settings, notice catalog
│ │ ├── embed-model.ts # Embedding adapter registry
│ │ ├── embedding-pipeline.ts # Batch embedding pipeline
│ │ ├── entities/ # Data model (Source, Block, Collection)
│ │ └── embedding/kernel/ # Redux-style state machine
│ ├── ui/ # Obsidian-dependent UI
│ │ ├── ConnectionsView.ts # Related notes panel
│ │ ├── LookupView.ts # Semantic search panel
│ │ ├── embed-adapters/ # 7 provider adapters
│ │ ├── settings.ts # Settings UI
│ │ ├── status-bar.ts # Progress bar
│ │ └── commands.ts # Command palette commands
│ ├── types/ # Pure type definitions
│ └── utils/ # Pure utility functions
├── worker/
│ └── embed-worker.ts # Web Worker for Transformers.js
├── test/ # Vitest unit tests
├── dist/ # Build output
└── manifest.json # Plugin manifest
git clone https://github.com/GoBeromsu/Open-smart-connections.git
cd open-connections
pnpm install
pnpm dev # Vault selection + esbuild watch + hot reload
pnpm build # Production build to dist/
pnpm test # Run unit tests (Vitest)
pnpm test:watch # Run tests in watch mode
pnpm lint # ESLint check
pnpm lint:fix # Auto-fix linting issues
pnpm typecheck # TypeScript type checking
pnpm run ci # Full CI pipeline (build + lint + test)
pnpm dev uses Obsidian's hot reload feature. After making changes:
For provider triage work, keep a dedicated Test vault with the target provider already configured in .obsidian/plugins/open-connections/data.json, then run:
pnpm run verify:test-vault # generic plugin reload + error smoke check
bash scripts/check-provider-runtime.sh upstage embedding-passage 4096
bash scripts/check-upstage.sh # longer Upstage embedding run
check-provider-runtime.sh is the fast provider smoke probe: it rebuilds the plugin, reloads it in Obsidian, and verifies the active adapter/model/dimensions, embed_ready, and dev-error surfaces before you move on to broader issue triage or smoke-matrix work.
We welcome contributions! Please follow these steps:
git checkout -b feature/your-feature-namepnpm run ci to verify your changesNote: This plugin maintains a shared architecture with other Obsidian plugins in the ecosystem. Large changes should be discussed in an issue first.
.obsidian/plugins/open-connections/ and re-enabling from Community PluginsXenova/bge-micro-v2 instead of bge-m3bge-micro-v2 to bge-m3)GNU General Public License v3.0 (GPL-3.0)
See LICENSE for details.
This project is a fork of Smart Connections by Brian Petro. It has been rebuilt from the ground up for stability, extensibility, and integration with the broader Obsidian plugin ecosystem.
Per GPL-3.0 Section 5, this modified version is clearly marked as different from the original.
Built with TypeScript · Powered by Transformers.js · Encrypted by Obsidian
Before submitting to obsidian-releases, run pnpm lint to catch all ObsidianReviewBot violations:
| Rule | What to verify |
|---|---|
| Command names | No plugin name prefix — Obsidian adds it automatically |
| Sentence case | All setName(), setDesc(), placeholders use sentence case |
| Settings headings | new Setting(el).setName('...').setHeading() not createEl('h2', ...) |
| No inline styles | addClass() / setCssProps() instead of el.style.X = value |
vault.configDir |
No hardcoded .obsidian strings |
| No async without await | Remove async from methods with no await inside |