Lina

by Anselmo Pinheiro
5
4
3
2
1
Score: 53/100

Description

AI-powered Obsidian plugin for semantic search, smart note organisation and knowledge workflows.

Reviews

No reviews yet.

Stats

0
stars
208
downloads
0
forks
14
days
1
days
2
days
0
total PRs
0
open PRs
0
closed PRs
0
merged PRs
0
total issues
0
open issues
0
closed issues
372
commits

Latest Version

2 days ago

Changelog

Lina 0.1.19 — Documentation Alignment and Quality Workflow Improvements

Summary

This release focuses on project stabilization, documentation alignment, and strengthening our automated quality assurance pipelines. Rather than introducing new user-facing features, version 0.1.18 consolidates the foundation of the project to ensure greater reliability, transparency, and a smoother onboarding experience for both new users and contributors.

The documentation across the repository has been thoroughly revised. It now clearly highlights that Lina provides instant, zero-configuration local text search out of the box without requiring any AI provider or API keys. Advanced semantic search and contextual slash commands (/ask, /tags, /yaml) remain fully supported as optional, privacy-first enhancements powered by local (Ollama) or remote (Mistral, OpenRouter) providers.

On the engineering side, development workflows and continuous integration (CI) have been reinforced with strict automated validation gates, ensuring code quality, type safety, and plugin integrity before releases are published.

What's Changed

Improved

  • Transparent AI Boundaries: Clarified the separation between core local text search (zero network requests, no setup required) and optional AI-assisted features across all user-facing interfaces.
  • Provider Consistency: Ensured consistent documentation and UI configuration across officially supported providers: Ollama (local), Mistral (remote API), and OpenRouter (remote API).

Documentation

  • Onboarding Clarity: Streamlined README.md to help new users quickly understand Lina's core value proposition, local search capabilities, and optional AI setup.
  • User Manual Alignment: Updated docs/manual.md to accurately reflect active public workflows and commands, removing outdated or speculative references.
  • Roadmap Precision: Reconciled docs/roadmap.md to clearly distinguish completed milestones—runtime exclusions, atomic note rename/move integrity, and synchronized index recognition—from upcoming development series.
  • Commands Reference: Refined docs/commands.md with precise context handling and explicit confirmation rules for all active slash commands (/ask, /tags, /yaml).

Developer Experience & Quality Assurance

  • Integrated Release Validation: Formalized the local npm run release:validate workflow, executing lint checks, type checks, automated test suites (720+ tests), and production artifact verification in sequence.
  • Strict Quality Gates: Reinforced CI and local linting policies to ensure zero blocking errors and maintain high TypeScript type precision without permissive workarounds.

README file from

Github

Lina (ALPHA)

Version Obsidian License Platform

AI-powered note assistant and hybrid search engine for Obsidian. Features local indexing, semantic search, contextual slash commands, and privacy-first AI analysis.

User Manual | Commands Guide | Changelog | Roadmap


Overview & Key Features

Lina helps you find, connect, and enrich Markdown notes in Obsidian without taking control away from you.

Start locally: Lina works immediately with local text search. No AI provider or API key is required to get started. AI providers are optional and enable semantic search and AI-assisted features.

  • 🔍 Hybrid Search: Combines fast local text indexing with semantic vector embeddings into a single ranked list.
  • Contextual Slash Commands: Execute /ask (AI note query), /tags (smart tag suggestions), and /yaml (frontmatter generation) directly from the sidebar input.
  • 🔒 Privacy First: All indexing data is stored locally in .lina/index/. Zero network requests by default. Remote AI providers are contacted only when explicitly configured and triggered.
  • 🛡️ Explicit Confirmation: AI responses, tag additions, and YAML fields are applied to active notes only after your explicit confirmation.
  • 📱 Mobile & Sync Friendly: Memory-aware safeguards for mobile devices (validated on Android) with opt-in binary shadow sets and Syncthing support.

Quickstart & Installation

Option 1: Manual Installation

  1. Download manifest.json, main.js, and styles.css from the latest release.
  2. Create the directory <Vault>/<configDir>/plugins/lina/ (where <configDir> is your vault's Obsidian config directory, default .obsidian).
  3. Copy the downloaded files into that folder.
  4. Enable Lina under Obsidian Settings > Community Plugins.

Option 2: Community Plugins

Search for Lina in Obsidian Community Plugins once officially listed.

First-Time Indexing Note:
When installed for the first time, Lina does not auto-build the full index. Open the Lina side panel and click Rebuild Index (or run the rebuild index command). Once a valid index exists, Lina keeps it updated automatically in the background.


Features & Side Panel

The Lina panel lives in Obsidian's right sidebar. It serves as your search interface and AI assistant hub.

Search Modes

  • Hybrid (Recommended): Combines text (default weight 0.7) and semantic similarity (default weight 0.3).
  • Text: Fast local search by note title, path, or content. Supports exact, prefix, and substring matching.
  • Semantic: Meaning-based search powered by vector embeddings. Requires generated embeddings.

Contextual Slash Commands (/ask, /tags, /yaml)

Type a slash command in the sidebar input to interact with your notes using AI:

  • /ask <prompt>: Queries the configured AI provider about the active note context. Insert responses below selection, replace selection, or append to note after confirmation.
  • /tags: Asks AI to suggest tags for the context. Displays checkboxes to apply non-duplicate tags with confirmation.
  • /yaml: Asks AI to suggest frontmatter fields. Displays checkboxes to safely apply new fields without overwriting existing data.

Context Selection Order:

  1. Selected text in active Markdown editor.
  2. Preserved selection captured from the active note (if focus shifted to panel).
  3. Active note content.

[!NOTE] All slash commands recheck context against configured path and term exclusions before contacting an AI provider.


AI Providers & Model Configuration

Lina allows separate provider and model configurations for Analysis AI (Chat/LLM) and Embeddings.

Provider Type Embeddings Chat / Analysis Recommended / Default Models
Ollama Local Embeddings: nomic-embed-text-v2-moeChat: gemma4:e2b
Mistral Remote (API) Embeddings: mistral-embedChat: mistral-small-latest
OpenRouter Remote (API) Chat: Configurable model

Configuration Details

  • Base URLs: Automatically populated for Ollama (http://localhost:11434), Mistral (https://api.mistral.ai/v1), and OpenRouter (https://openrouter.ai/api/v1), customizable.
  • Model Selection: For Ollama and Mistral, select a catalog model from the dropdown or select Manual/custom model... to reveal a text field for custom model identifiers. OpenRouter uses a permanent free-text input field.
  • API Keys: Per-device structure. Keys start empty and require explicit save or clear actions.
  • Batch Size: Configurable (1–50) for native batching with Mistral and modern Ollama (/api/embed). Legacy Ollama endpoint fallback processes 1 item per request.

Mobile & Multi-Device (Syncthing)

Desktop Producer & Mobile Companion Architecture

  • isDesktopOnly: false. Manually validated on Desktop (Windows) and Android (Samsung Galaxy S23 Ultra, One UI 8.5, 8 GB RAM).
  • DeviceCapabilities Enforcement: Desktop acts as the Producer (watching vault changes, maintaining the text index, diffing/generating embeddings, and compiling binary copies). Mobile acts as the Companion (reading synchronized artifacts for fast local text, semantic, and hybrid search without local write watchers or compilation loops).
  • Memory safeguards prevent dangerous allocations on mobile (16MB vector limit / 64MB peak memory). If embeddings exceed budgets, Lina reports no-safe-source and falls back cleanly to text search.
  1. Desktop Producer: Generate the text index and canonical embeddings.jsonl on desktop. Optionally maintain the binary shadow copy (embeddings.vectors.f32).
  2. Sync Vault: Sync the .lina/index/ directory to your mobile device via Syncthing.
  3. Mobile Companion: Mobile syncs the pre-built index and validates publication integrity, enabling instant local search and AI features without battery-draining indexing overhead.

For full .stignore rules and step-by-step instructions, see the Syncthing Guide in the User Manual.


Experimental Binary Embedding Storage

An opt-in derived shadow copy (embeddings.binary.manifest.json, embeddings.meta.jsonl, embeddings.vectors.f32) is available for advanced users:

  • Canonical Source: .lina/index/embeddings.jsonl remains the source of truth.
  • Preference: maintainBinaryEmbeddingCopy (default off) and embeddingStorageReadPreference (prefer-binary).
  • Safety: Binary is accepted only when all three files are valid and match the canonical publicationId. Falls back safely to JSONL or text search.

Privacy & Local Data Storage

  • Data Path: Local index operational data is stored strictly in .lina/index/.
  • No Web Storage: Lina does not use localStorage or sessionStorage. Settings use Obsidian's loadData/saveData APIs.
  • Network Boundaries: Zero network traffic by default. External APIs are called only when you explicitly configure a remote provider and run an action.

Support and feedback

If you experience difficulties, find a bug, or have a suggestion, you can contact us through:

Contact details are only used to respond to the matter submitted and are not shared with third parties.


Development

Contributions are welcome. Lina uses automated validation to keep changes reliable.

# Install dependencies
npm ci

# Run the development build
npm run dev

# Validate a change
npm run lint
npm test
npm run build

Before preparing a release, run:

npm run release:validate

The same checks run in CI before release publishing.


License

MIT License