<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Xynorash</title>
    <description>The latest articles on DEV Community by Xynorash (@xynorash).</description>
    <link>https://dev.to/xynorash</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2040740%2F72d2edc7-daaa-40ee-9bc4-6f28d9aef28e.png</url>
      <title>DEV Community: Xynorash</title>
      <link>https://dev.to/xynorash</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xynorash"/>
    <language>en</language>
    <item>
      <title>Your AI coding agent can read your SSH keys. I built a Neovim plugin that won't start it unprotected</title>
      <dc:creator>Xynorash</dc:creator>
      <pubDate>Fri, 30 Oct 2026 11:13:37 +0000</pubDate>
      <link>https://dev.to/xynorash/your-ai-coding-agent-can-read-your-ssh-keys-i-built-a-neovim-plugin-that-wont-start-it-unprotected-2gg2</link>
      <guid>https://dev.to/xynorash/your-ai-coding-agent-can-read-your-ssh-keys-i-built-a-neovim-plugin-that-wont-start-it-unprotected-2gg2</guid>
      <description>&lt;p&gt;If your editor can launch a coding agent, that agent runs with your privileges: your &lt;code&gt;~/.ssh&lt;/code&gt;, your cloud credentials, your git history. One day I caught myself asking what exactly stops it from touching all that. The answer was "nothing", which wakes you up faster than coffee. So I wrote a plugin that makes my editor refuse to start the agent unprotected.&lt;/p&gt;

&lt;p&gt;It is one of nine standalone plugins I extracted from &lt;a href="https://github.com/xynorash/xynovim" rel="noopener noreferrer"&gt;xynovim&lt;/a&gt;, my Neovim config for Rust. All are MIT, all need Neovim 0.12+, and you can install any of them without the rest of the config. Splitting them out taught me more than writing them did (my ego has not fully recovered).&lt;/p&gt;

&lt;h2&gt;
  
  
  xyno-sandbox.nvim: an agent that refuses to start unprotected
&lt;/h2&gt;

&lt;p&gt;The plugin runs a command-line agent inside bubblewrap: a read-only filesystem except the project and a scratch directory, credential folders such as &lt;code&gt;~/.ssh&lt;/code&gt; and &lt;code&gt;~/.aws&lt;/code&gt; replaced with empty ones, secret-looking environment variables removed, and git directories locked read-only.&lt;/p&gt;

&lt;p&gt;The design rule is that it fails closed. If no sandbox can be created, the agent does not start, and Windows and macOS are refused rather than silently run without one.&lt;/p&gt;

&lt;p&gt;It is also honest about its limits. It is a denylist on a read-only view, the network stays open, and the agent can still read its own token file. It is a seatbelt, not a security boundary against a determined attacker, and the README says so. Yes, I put that in my own README. Marketing departments hate this one trick.&lt;/p&gt;

&lt;h2&gt;
  
  
  xyno-guard.nvim: auto-save with a conscience
&lt;/h2&gt;

&lt;p&gt;Auto-save plugins are happy to write any buffer. In Rust that goes wrong in three ways: a save lands in &lt;code&gt;~/.cargo/registry&lt;/code&gt; or the standard library sources, a save overwrites a file that &lt;code&gt;git checkout&lt;/code&gt; or a formatter just changed on disk, or Neovim stops on a blocking W12 prompt.&lt;/p&gt;

&lt;p&gt;The guard records each file's mtime when it is read or written, and refuses to save if disk has moved on. Dependency and standard-library buffers are set to readonly, so auto-save never touches them (&lt;code&gt;:set modifiable&lt;/code&gt; still lets you edit one on purpose). It also re-checks at write time, because some auto-save plugins write up to a second after their condition check. It works with any auto-save plugin that takes a &lt;code&gt;condition&lt;/code&gt; function. This one was born from pure annoyance, the most renewable energy source in software.&lt;/p&gt;

&lt;h2&gt;
  
  
  xyno-history.nvim: Local History on plain git
&lt;/h2&gt;

&lt;p&gt;JetBrains has Local History, and I missed it. (Yes, I shamelessly borrowed the idea. JetBrains, if you are reading this, I still use your IDEs every day. Please be gentle.) Every throttled save becomes a commit on a private ref, &lt;code&gt;refs/lochist/&amp;lt;branch&amp;gt;&lt;/code&gt;, with the full worktree as its tree. Your index, stash and branches are never touched.&lt;/p&gt;

&lt;p&gt;Two details mattered most. Each Neovim process builds its snapshot with its own private index file and updates the ref with a compare-and-swap, so several instances saving at once do not overwrite each other. And because the snapshots are ordinary git objects, you can recover without the plugin: &lt;code&gt;git log refs/lochist/main&lt;/code&gt; and &lt;code&gt;git restore --source=refs/lochist/main&lt;/code&gt;. Saves are throttled to one snapshot per minute, and size caps (10 MB per file, 200 MB per snapshot by default) keep a stray binary from bloating the repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"xynorash/xyno-history.nvim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"VeryLazy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  xyno-clipboard.nvim: yanks that reach you
&lt;/h2&gt;

&lt;p&gt;Over SSH or inside tmux, a yank lands on the wrong machine. This provider copies with OSC 52 and, when &lt;code&gt;wl-copy&lt;/code&gt; is available, also syncs the local Wayland clipboard. It installs only when &lt;code&gt;$TMUX&lt;/code&gt;, &lt;code&gt;$SSH_TTY&lt;/code&gt;, &lt;code&gt;$SSH_CONNECTION&lt;/code&gt; or &lt;code&gt;$HERDR_PANE_ID&lt;/code&gt; is set, and falls back to scanning up to 16 parent processes for herdr, so a plain local session is left alone. Not the sexiest plugin of the nine, but my yanks finally arrive where they are going.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Rust toolkit
&lt;/h2&gt;

&lt;p&gt;The other five get a list instead of a section each (I know, I'm so lazy!). They share one base, &lt;code&gt;xyno-rust.nvim&lt;/code&gt;, and install in this order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;xyno-rust.nvim&lt;/code&gt;: a per-project Cargo context shared with rust-analyzer and bacon-ls, a targets picker, an HTTP route picker&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xyno-new.nvim&lt;/code&gt;: new binaries, libraries, workspaces and egui apps&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xyno-imports.nvim&lt;/code&gt;: auto-import with ranked candidates and a per-project memory&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xyno-crates.nvim&lt;/code&gt;: crates.io search, &lt;code&gt;cargo add&lt;/code&gt;, feature toggling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xyno-macros.nvim&lt;/code&gt;: completion inside derive and helper attributes, &lt;code&gt;macro_rules!&lt;/code&gt; signature help, &lt;code&gt;:MacroExpand&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;lazy.nvim installs the dependencies for you. The &lt;a href="https://xynorash.github.io/xynovim/plugins/" rel="noopener noreferrer"&gt;plugins page&lt;/a&gt; has a complete spec.&lt;/p&gt;
&lt;h2&gt;
  
  
  What splitting taught me
&lt;/h2&gt;

&lt;p&gt;The parts that looked independent were not. Extracting a plugin forces you to write down what it depends on, and a few things I thought were self-contained quietly needed something else. Writing a README for each also showed me which behaviours I could not explain in a sentence, and those were usually the ones that needed another look. (I started this config as a "quick" project. Narrator: it was not quick.)&lt;/p&gt;
&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Every plugin needs &lt;strong&gt;Neovim 0.12+&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;They are developed and tested on &lt;strong&gt;Linux&lt;/strong&gt;. Windows and macOS are unverified for most of them, and &lt;code&gt;xyno-sandbox&lt;/code&gt; and &lt;code&gt;xyno-clipboard&lt;/code&gt; are Linux only.&lt;/li&gt;
&lt;li&gt;Test counts vary: &lt;code&gt;xyno-history&lt;/code&gt; has 65 specs and &lt;code&gt;xyno-guard&lt;/code&gt; has 39, run with &lt;code&gt;nvim -l tests/run.lua&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;All are at &lt;code&gt;v0.1.0&lt;/code&gt; (&lt;code&gt;xyno-sandbox&lt;/code&gt; at &lt;code&gt;v0.1.1&lt;/code&gt;), so expect rough edges.&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/xynorash" rel="noopener noreferrer"&gt;
        xynorash
      &lt;/a&gt; / &lt;a href="https://github.com/xynorash/xynovim" rel="noopener noreferrer"&gt;
        xynovim
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      xynovim: a personal Neovim 0.12 configuration for Rust on LazyVim: instant rust-analyzer and clippy diagnostics, nvim-dap debugger, test UI with coverage, git safety net. Inspired by JetBrains tools. Developed on Linux; Windows passes the portable parts in CI, macOS is not reliably green.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;xynovim&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;A personal Neovim configuration for Rust, built on LazyVim and inspired by JetBrains' tools. Instant diagnostics, a debugger and test UI, a git safety net, and a test suite you can run yourself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/xynorash/xynovim/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/xynorash/xynovim/actions/workflows/ci.yml/badge.svg" alt="ci"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/63d6b7f5a5902caf51a6a891b2f0165726d8fde7f992a50dcced0e030f712107/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e656f76696d2d302e31322d3537613134333f6c6f676f3d6e656f76696d266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/63d6b7f5a5902caf51a6a891b2f0165726d8fde7f992a50dcced0e030f712107/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e656f76696d2d302e31322d3537613134333f6c6f676f3d6e656f76696d266c6f676f436f6c6f723d7768697465" alt="neovim 0.12"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/35b94db23d3ed026343335f74d52ce31e74b77ad7dab4e4b89f49f2026e0937f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4170616368652d2d322e302d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/35b94db23d3ed026343335f74d52ce31e74b77ad7dab4e4b89f49f2026e0937f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4170616368652d2d322e302d626c7565" alt="license"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/563f51280a0b6326c8794fd2cab725ad309db92fcb4a84d119211d055ac8af4b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d39303625323070617373696e672d627269676874677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/563f51280a0b6326c8794fd2cab725ad309db92fcb4a84d119211d055ac8af4b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d39303625323070617373696e672d627269676874677265656e" alt="tests"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Website: &lt;a href="https://xynorash.github.io/xynovim/" rel="nofollow noopener noreferrer"&gt;https://xynorash.github.io/xynovim/&lt;/a&gt; (with &lt;a href="https://xynorash.github.io/xynovim/#guides" rel="nofollow noopener noreferrer"&gt;guides&lt;/a&gt; to the workflows below)&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/xynorash/xynovim/docs/media/01-hero.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxynorash%2Fxynovim%2FHEAD%2Fdocs%2Fmedia%2F01-hero.png" alt="xynovim editing the netwatch demo crate: Island Dark theme, inlay hints, sticky scope from treesitter-context, statusline with git branch, server state and clippy state"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;xynovim is a Neovim 0.12 configuration for Rust development. It adds instant diagnostics (rust-analyzer while you type, clippy through bacon-ls half a second later), a debugger (nvim-dap with codelldb), a test UI with cargo-nextest and coverage in the gutter, Cargo workspace, feature and crate helpers, and a git safety net (Local History, lazygit, diffview) to a &lt;a href="https://github.com/LazyVim/LazyVim" rel="noopener noreferrer"&gt;LazyVim&lt;/a&gt; base.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/xynorash/xynovim &lt;span class="pl-k"&gt;~&lt;/span&gt;/.config/nvim
&lt;span class="pl-k"&gt;~&lt;/span&gt;/.config/nvim/scripts/bootstrap.sh&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then start &lt;code&gt;nvim&lt;/code&gt; in a Cargo project (or in &lt;a href="https://github.com/xynorash/xynovim/demo/netwatch" rel="noopener noreferrer"&gt;&lt;code&gt;demo/netwatch&lt;/code&gt;&lt;/a&gt;) and run &lt;code&gt;:checkhealth xynovim&lt;/code&gt;. This replaces your current Neovim configuration, so move &lt;code&gt;~/.config/nvim&lt;/code&gt; aside first if you have one. Prerequisites and the Windows and macOS status are under &lt;a href="https://github.com/xynorash/xynovim#install" rel="noopener noreferrer"&gt;Install&lt;/a&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/xynorash/xynovim" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;If you try one, I would like to hear what breaks. I read every comment. Tell me what breaks, I have thick skin and a very good test suite. Do you run your coding agent in a sandbox, or trust it with your home directory?&lt;/p&gt;

</description>
      <category>neovim</category>
      <category>rust</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>A Neovim config for Rust that I test like software</title>
      <dc:creator>Xynorash</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:17:37 +0000</pubDate>
      <link>https://dev.to/xynorash/a-neovim-config-for-rust-that-i-test-like-software-5221</link>
      <guid>https://dev.to/xynorash/a-neovim-config-for-rust-that-i-test-like-software-5221</guid>
      <description>&lt;p&gt;I write Rust in RustRover at work, and I still use JetBrains tools every day. They are the reason I wanted a certain kind of editing experience in my own terminal: errors on screen while I type, a debugger that shows real values, a test tree, an undo history that survives my own mistakes.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;xynovim&lt;/strong&gt;, a Neovim config for Rust on top of LazyVim. It is a personal, independent project, not affiliated with JetBrains, and this post is the short tour.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc0mqy0rbgdzggcbeojh8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc0mqy0rbgdzggcbeojh8.png" alt="xynovim editing the netwatch demo crate: Island Dark theme, inlay hints, sticky scope and a statusline with git branch, server state and clippy state" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The real config on a small demo crate. Everything in this post was recorded from it, nothing is mocked up.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Two tiers of diagnostics
&lt;/h2&gt;

&lt;p&gt;rust-analyzer answers while you type, with type errors in about 0.01 to 0.15 seconds. Clippy follows about half a second later (0.56 s median): &lt;code&gt;bacon-ls&lt;/code&gt; runs it against a hardlinked shadow of your workspace on every buffer change, so lints show up before you save.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs3si4lyg98l8wlew66rh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs3si4lyg98l8wlew66rh.png" alt="A type error shown inline the moment it is typed" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;rust-analyzer, while typing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funzlfefncszutlulodx3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funzlfefncszutlulodx3.png" alt="Diagnostic float with the full clippy message and its help text" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Each message shows its first line inline. The full text, with the suggestion, is one keypress away.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  A debugger with real values
&lt;/h2&gt;

&lt;p&gt;nvim-dap with codelldb, a layout that suits Rust, and lldb's Rust formatters loaded automatically, so a &lt;code&gt;String&lt;/code&gt; or a &lt;code&gt;Vec&lt;/code&gt; shows its contents instead of &lt;code&gt;{...}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkro9xs2c5oy2i518j9ap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkro9xs2c5oy2i518j9ap.png" alt="dap-ui stopped at a breakpoint: locals, stack, console and inline values" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Stopped at a breakpoint: locals, call stack, console and inline values.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  One feature set for both tiers
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;:RustContext&lt;/code&gt; lets you pick Cargo features and a build target once, and applies them to both rust-analyzer and bacon-ls, saved per workspace. No more one tool seeing code the other does not.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu18tl2vo1d86e77kohy1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu18tl2vo1d86e77kohy1.png" alt="The csr side greyed out as inactive; the statusline is back to clippy ok" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The inactive side is greyed out and the statusline is back to "clippy ok".&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  A safety net
&lt;/h2&gt;

&lt;p&gt;Every save is snapshotted as a commit under a private git ref (&lt;code&gt;refs/lochist/&lt;/code&gt;). A bad refactor, a bad rename or a bad evening is one picker away from being undone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzsupljt5ik7fvpa5dop5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzsupljt5ik7fvpa5dop5.png" alt="Local history picker listing the snapshots of src/lib.rs" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Local History, backed by plain git.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Macros and dependencies
&lt;/h2&gt;

&lt;p&gt;Type a path into a crate that is not a dependency yet and xynovim hints at it, offers a code action, searches crates.io, lets you pick features and writes the dependency into &lt;code&gt;Cargo.toml&lt;/code&gt;. It also ranks ambiguous imports, remembers your pick, and shows macro expansions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffetj86uv2oxswjqa0uni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffetj86uv2oxswjqa0uni.png" alt="The unknown crate uuid in a path, with the error" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The hint on an unknown crate.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5rk9o770knwk0sk48dxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5rk9o770knwk0sk48dxw.png" alt="Macro expansion of derive(Parser) in a read-only split" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Macro expansion in a read-only split.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The AI agent, on a leash
&lt;/h2&gt;

&lt;p&gt;I am not a vibe-coder. I want an AI tool inside a setup I understand, so the 99 agent (Claude Code as the provider) runs inside bubblewrap with a restricted filesystem and hidden credentials, and a Local History snapshot is taken before every request. It fails closed: no working sandbox, no request.&lt;/p&gt;

&lt;p&gt;It is a seatbelt, not a jail. The network stays open, and no real agent request is driven in the test suite. I would rather tell you that than let you assume otherwise.&lt;/p&gt;
&lt;h2&gt;
  
  
  Nine standalone plugins
&lt;/h2&gt;

&lt;p&gt;The original parts of the config are now standalone MIT plugins, so you can take only what you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;xyno-history.nvim&lt;/code&gt;: Local History on private git refs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xyno-sandbox.nvim&lt;/code&gt;: runs an agent in bubblewrap, refuses without it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xyno-clipboard.nvim&lt;/code&gt;: OSC 52 clipboard provider for tmux and SSH&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xyno-guard.nvim&lt;/code&gt;: keeps auto-save off dependency sources and changed files&lt;/li&gt;
&lt;li&gt;a Rust toolkit of five that share one base: &lt;code&gt;xyno-rust.nvim&lt;/code&gt;, &lt;code&gt;xyno-new.nvim&lt;/code&gt;, &lt;code&gt;xyno-imports.nvim&lt;/code&gt;, &lt;code&gt;xyno-crates.nvim&lt;/code&gt;, &lt;code&gt;xyno-macros.nvim&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All nine install with lazy.nvim and need Neovim 0.12+. The &lt;a href="https://xynorash.github.io/xynovim/plugins/" rel="noopener noreferrer"&gt;plugins page&lt;/a&gt; has a complete spec for the Rust toolkit and the install order.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tested, and I mean it
&lt;/h2&gt;

&lt;p&gt;"It feels fast" is an opinion, so the config ships with a suite you can run yourself: 906 passing checks across 32 spec files, one per feature area, in about six minutes on my machine. Each spec runs in its own headless Neovim with a hard timeout and an isolated state directory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0px56m7gc6xhjvi0tqen.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0px56m7gc6xhjvi0tqen.png" alt="The test runner finishing four spec files: 129 passed, 0 failed" width="800" height="468"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The runner on four of the spec files: 129 passed, 0 failed.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What it is not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It needs &lt;strong&gt;Neovim 0.12&lt;/strong&gt;, and it is &lt;strong&gt;developed on Linux&lt;/strong&gt; (Arch). Windows is exercised in CI, and macOS is not reliably green yet.&lt;/li&gt;
&lt;li&gt;The agent sandbox is a seatbelt, not a jail.&lt;/li&gt;
&lt;li&gt;The macros and dependencies work is tested headless, not driven by hand in a real terminal. The unknown-crate hint is deliberately conservative: a miss is better than a false hint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full list, with what I decided and why, is in &lt;code&gt;docs/KNOWN_ISSUES.md&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/xynorash/xynovim ~/.config/nvim
~/.config/nvim/scripts/bootstrap.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The bootstrap script checks the prerequisites and installs the plugins at their locked versions. Then open the demo crate in &lt;code&gt;demo/netwatch&lt;/code&gt; and poke around.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site, with every recording and six guides: &lt;a href="https://xynorash.github.io/xynovim" rel="noopener noreferrer"&gt;https://xynorash.github.io/xynovim&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/xynorash" rel="noopener noreferrer"&gt;
        xynorash
      &lt;/a&gt; / &lt;a href="https://github.com/xynorash/xynovim" rel="noopener noreferrer"&gt;
        xynovim
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      xynovim: a personal Neovim 0.12 configuration for Rust on LazyVim: instant rust-analyzer and clippy diagnostics, nvim-dap debugger, test UI with coverage, git safety net. Inspired by JetBrains tools. Developed on Linux; Windows passes the portable parts in CI, macOS is not reliably green.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;xynovim&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A personal Neovim configuration for Rust, built on LazyVim and inspired by JetBrains' tools. Instant diagnostics, a debugger and test UI, a git safety net, and a test suite you can run yourself.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/xynorash/xynovim/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/xynorash/xynovim/actions/workflows/ci.yml/badge.svg" alt="ci"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/63d6b7f5a5902caf51a6a891b2f0165726d8fde7f992a50dcced0e030f712107/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e656f76696d2d302e31322d3537613134333f6c6f676f3d6e656f76696d266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/63d6b7f5a5902caf51a6a891b2f0165726d8fde7f992a50dcced0e030f712107/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e656f76696d2d302e31322d3537613134333f6c6f676f3d6e656f76696d266c6f676f436f6c6f723d7768697465" alt="neovim 0.12"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/35b94db23d3ed026343335f74d52ce31e74b77ad7dab4e4b89f49f2026e0937f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4170616368652d2d322e302d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/35b94db23d3ed026343335f74d52ce31e74b77ad7dab4e4b89f49f2026e0937f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4170616368652d2d322e302d626c7565" alt="license"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/563f51280a0b6326c8794fd2cab725ad309db92fcb4a84d119211d055ac8af4b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d39303625323070617373696e672d627269676874677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/563f51280a0b6326c8794fd2cab725ad309db92fcb4a84d119211d055ac8af4b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d39303625323070617373696e672d627269676874677265656e" alt="tests"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Website: &lt;a href="https://xynorash.github.io/xynovim/" rel="nofollow noopener noreferrer"&gt;https://xynorash.github.io/xynovim/&lt;/a&gt; (with &lt;a href="https://xynorash.github.io/xynovim/#guides" rel="nofollow noopener noreferrer"&gt;guides&lt;/a&gt; to the workflows below)&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/xynorash/xynovim/docs/media/01-hero.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxynorash%2Fxynovim%2FHEAD%2Fdocs%2Fmedia%2F01-hero.png" alt="xynovim editing the netwatch demo crate: Island Dark theme, inlay hints, sticky scope from treesitter-context, statusline with git branch, server state and clippy state"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;xynovim is a Neovim 0.12 configuration for Rust development. It adds instant diagnostics (rust-analyzer while you type, clippy through bacon-ls half a second later), a debugger (nvim-dap with codelldb), a test UI with cargo-nextest and coverage in the gutter, Cargo workspace, feature and crate helpers, and a git safety net (Local History, lazygit, diffview) to a &lt;a href="https://github.com/LazyVim/LazyVim" rel="noopener noreferrer"&gt;LazyVim&lt;/a&gt; base.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/xynorash/xynovim &lt;span class="pl-k"&gt;~&lt;/span&gt;/.config/nvim
&lt;span class="pl-k"&gt;~&lt;/span&gt;/.config/nvim/scripts/bootstrap.sh&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then start &lt;code&gt;nvim&lt;/code&gt; in a Cargo project (or in &lt;a href="https://github.com/xynorash/xynovim/demo/netwatch" rel="noopener noreferrer"&gt;&lt;code&gt;demo/netwatch&lt;/code&gt;&lt;/a&gt;) and run &lt;code&gt;:checkhealth xynovim&lt;/code&gt;. This replaces your current Neovim configuration, so move &lt;code&gt;~/.config/nvim&lt;/code&gt; aside first if you have one. Prerequisites and the Windows and macOS status are under &lt;a href="https://github.com/xynorash/xynovim#install" rel="noopener noreferrer"&gt;Install&lt;/a&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/xynorash/xynovim" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;If you try it, I would like to hear what breaks, what you would change, and which parts are worth extracting next.&lt;/p&gt;

</description>
      <category>neovim</category>
      <category>rust</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
