New Plugin: Interlinear — reading-mode translations right next to your notes

Disclaimer

Is this project open source? Yes
Is this project completely free? Yes
Is this project vibe-coded beyond the author’s ability to comprehend how it works? Yes and it works.
Community Directory: community.obsidian.md/plugins/interlinear


Hey everyone :waving_hand:

I just got my plugin Interlinear into the community store and wanted to share it here.

The itch: I keep a lot of foreign-language stuff in my vault — articles, papers, highlights. Reading them always turned into the same dance: copy a paragraph, alt-tab to a translator, paste, read, tab back, lose my place, repeat. By the end my attention was completely shredded.

So I built Interlinear. Open a foreign-language note in reading view, hit one button, and it renders the translation right next to the original, paragraph by paragraph — bilingual, or translation-only.

The part I care about most (and figured this crowd would too):

  • It never modifies your notes. Translations are injected into the render layer only. Close the note, reopen it, and the file on disk is byte-for-byte identical — nothing gets written into your markdown.
  • It never auto-translates. Opening or switching notes does nothing. It only runs when you actually click the button (or run the command). No surprise API calls.
  • BYOK, zero telemetry. Your API key lives in the plugin’s local data.json and goes nowhere except the endpoint you point it at. The plugin doesn’t phone home.

A few other bits:

  • One click translates the whole note (with live progress like 7/20); click again to toggle back to the original.

  • Toggle bilingual ↔ translation-only instantly — no re-translating. In translation-only mode you can hover a line (or tap on mobile) to peek at the original. Handy if you’re actually using this to study the language.

  • A few display styles to match your theme — border, quote block, muted text, dashed underline, plus a “learning mask” geared toward language practice — all live-switchable.

  • It skips what shouldn’t be translated: code blocks, math, image-only blocks, bare URLs, and anything already in your target language.

  • Translations are cached (content-hash keyed), so reopening a note after a restart is free.

Backends: DeepSeek by default, but it’s an OpenAI-compatible interface under the hood — so OpenAI, SiliconFlow, a local Ollama model, or any custom endpoint all work. There’s a “Test connection” button in settings.

Honest limitations: reading-view only for now (no editing / Live Preview), and lists/tables get translated as a single block. It’s an early version — solid for my daily reading, but plenty of room to grow.

Install: it’s in the community plugin store now → Settings → Community plugins → Browse → search “Interlinear”. Source and details on GitHub: github.com/linyp/obsidian-interlinear

Would love feedback — feature ideas, weird edge cases, whatever you’ve got. Thanks for taking a look :folded_hands: