typescript and javascript logo
author avatar

Grzegorz Dubiel

13-05-2026

The Terminal as My IDE for Node.js Development (neovim btw)

My story was simple. I came to Linux from another operating system (no matter which), and it was not really about the Linux distribution itself. I was equipped with an IDE (VS Code). The decision about the switch was dictated by some factors such as having the same dev environment close to the production server, even if the dev environment is not fully containerized, personal curiosity and craving of trying to use Linux on a daily basis as my main system, promise of seamless customization, and many more factors. It did not let me down, and even more, it enabled me to go deeper into this rabbit hole looking for tools compatible with this system, and as you can guess, I encountered the neovim + tmux, where encounter is the best word to describe this act of discovering this particular thing. It showed me that not only your computer as a machine or system can be more optimized and efficient, but there are tools out there that can help you be more productive as a creator and power user and have full control of them. I also nailed this environment a little bit to work well for me as a Node.js dev. The AI also fits well into this setup, there are plenty of agents working in terminal which play well with the rest of tools, giving me fast code generation, fast code traversing, quick tab switching. Let's dive deeper into the core tools I use in my workflow.

Text Editor

According to the State JS 2025, the usage of Neovim for JS devs was 3%. Vim had a slightly better result: 20%. Neovim is a fork of Vim utilising vim motions, the modal style of typing that is comprised of modes such as insert for typing, normal for managing editor, visual for managing highlights and text, and many more. When I was giving a try to Neovim, I did not know anything about its popularity, so for me, after some time of using it, it was so surprising that this thing is such a niche in our environment. The factor that brought me to Neovim was the idea of using only keyboard for programming without compromises, like: typing, managing windows, copying the code, fast jumping between files, references, having the same abilities like in VS Code IDE with fuzzy search, debugger, decent TypeScript support. This need was derived by my craving for improving my focus on work, getting rid of any distractions. Apart from typing there is also a neat interface, as neat as I want. Without tons of notifications, icons, windows, slow transition animations, everything that should make the editor appealing visually but ruining my personal developer experience and stealing my focus.

From the JavaScript/TypeScript perspective, I got a decent LSP that provides code hints in the code with speed and precision, allowing me to seamlessly jump from reference to reference. I use the pmizio/typescript-tools.nvim for LSP support, which is the full toolset for TypeScript that allows me to use Neovim even in huge projects without degradation in performance, but the most beautiful thing is that I can switch LSP integrations whenever I want or even write my new version for that.

The typing ergonomics and code jumping is a perfect thing that boosts not only productivity but focus. The separation of modes allows atomic actions on text. For JS devs, text-object style selection is a true booster. Using Flash, you can teleport everywhere you want in the file. Using keyboard-based scrolling is also awesome and feels especially good in Neovim. Another nice thing is that you can use vim motions in other editors, such as VS Code or WebStorm, with dedicated plugins.

For me, as a full-stack dev and also a Linux user, I sit in the terminal 80% of my development time. In such a situation when using Neovim, I can quickly open it and start browsing/editing. The most crucial thing is that Neovim lives in the terminal, unlike VS Code, which embeds a terminal, and that feels weird, problematic, and also much slower.

Adding up LSP support, vim motions, flexibility, freedom of customization, size, and speed, Neovim leaves popular IDE options far, far behind.

What do I not like in Neovim? There is only one such thing, which is the debugger. Generally, Neovim is fully functional and has debugger adapter support, but it can be hard to set up initially, and the experience is not as neat as in other fully fledged IDE-based editors. In VS Code, we have the ability to turn almost every part of the editor into a debugging machine, where we can inspect code directly in the file, not only in windows dedicated to debugging. The debugger is generally a thing for clicking rather than moving with only a keyboard. My debugging style strongly relies on the debugger, which makes this fact uncomfortable for me, but even so, this is a low price for me.

Window/Context Tab Management

In the previous section, I said that Neovim lives in the terminal. This makes it easy to open it in a particular location and, in any situation, read whatever you want, quickly open it to write something, and then close it. But in day-to-day work, we need to open a few more tabs or even have our editor open twice, and we often use more than two terminals, which, in the small boxes nested inside a desktop app, are just not manageable. It is very hard to click through them quickly and move fast between them, particularly these days when sometimes we want to have multiple agents open in the terminal. The solution for this is TMUX.

TMUX is just a terminal multiplexer that allows you to split the terminal horizontally and vertically, as well as create a pane for each new terminal instance and manage it using keyboard shortcuts, all within the same terminal session in a single terminal emulator. Every action is invoked by using a unique combination of keys called a prefix, which in my case is Ctrl + A. For instance, when I want to create a new tab, I quickly press Ctrl + A and then C, and a new tab is created. When I want to jump to another one, I press Ctrl + A and the number of the tab, for example 2.

TMUX paired with Neovim is a killer combo. Neovim also has splits, so you can use them inside TMUX tabs. Imagine you're working on multiple services, e.g. a server, a client, and some worker, and you need to jump between all three while they are running at the same time. In practice, you want to open Neovim in three places and have three terminals to run them in. You can spin this up very quickly, keeping one editor per service in separate tabs and jumping between them instantly without even touching the mouse. In the Node.js world, this scenario is very common, and when you add tests to it, you need even more terminals. With TMUX, you can manage it hellishly fast: everything happens inside a single terminal emulator, without the problematic need to switch between emulator instances or, even worse, click through IDE instances and those small boxes where terminals are embedded.

One more thing, seemingly small but sometimes crucial for saving my work, is that a TMUX session can be easily restored. This means that when you close the terminal emulator, your work is not wiped out. You can reopen it, type tmux a, and everything will come back running. All tabs and processes will be back because the TMUX server keeps working in the background.

Version Control Management

I use git as my version control system. As you know, the default way of managing git is through the terminal. Often, GUI options are faster, and there is no point in typing git commands for everything, but since my workflow sits entirely in the terminal, there is no place for a GUI. But... there is something like a TUI, a terminal user interface. So for most git-related tasks, such as commit, merge, pull/push, inspecting diffs, traversing commits, or managing worktrees, I use a TUI app called lazygit. There is also a plugin for Neovim (gitsigns) that covers staging directly from code, showing diffs, git blame, and so on.

When it comes to lazygit, one more thing that feels comfortable to me is that navigation in it follows the Vim way, meaning that I can move up, down, right, and left using hjkl. This set of keys is a replacement for the arrow keys, not my own customized setup, but a convention that has persisted mostly to keep your hands in the central keyboard area used for typing.

File Management

You might say: who wants to manage files, bulk copy, delete, rename, sort, search, and filter, using only terminal commands? And you're right, probably no one. But there is a tool out there that is great for this while still allowing you to stay fully inside the terminal. This TUI application has a funny name: yazi. yazi is a TUI app that follows vim motions and Vim-like navigation, which allows me to smoothly jump from the terminal to file management without changing the mental map of shortcuts in my head or touching a mouse. It also looks neat, just a nice-looking list of files that lets you move level by level, sort, filter, and more.

But What About AI?

I tested out a bunch of different AI solutions, from early autocompletion tools such as Tabnine to modern AI-powered IDEs such as VS Code, Cursor, and Windsurf, as well as terminal CLI-based agents like Claude Code, GitHub Copilot CLI, and OpenCode. Fortunately for me, terminal-based solutions seem to be the best. So even in this case, I don't need to leave my terminal and can still organize everything just in TMUX.

For now, my personal choice for an agent solution in the terminal is OpenCode. It stands out because of its TUI clarity and UX, as well as the possibility of using almost any model provider I want, giving me free choice among a vast majority of models and pricing options.

OpenCode has everything needed for a modern AI agent flow, such as subagents, agents, skills, MCP support, and so on. It also has Neovim integration via the opencode.nvim plugin.

When it comes to code autocompletion, I currently do not use any of those tools, just my Neovim. Most of the time, I spend reading and correcting code, and when I need to write code manually, vim motions are enough.

Wrap Up

Simplicity, customizability, and freedom work for me. I do not waste resources on bells and whistles, and my development system is free from telemetry. I feel that I use tools that play well together, sharing the same keyboard-focused navigation and keeping me in the same context no matter whether I am writing CLI commands, coding, prompting, or managing files. I also have full control over my entire setup. Sure, there are tradeoffs. When you have this much room for customization and control, you need to spend some time configuring your setup, and there are plenty of occasions to screw something up. But you can use git to track your configs, which helps you develop and reconfigure your personal IDE with confidence.

My journey and fascination with vim motions and this entire rabbit hole are a perfect example of how sometimes going back to the roots can be the best move, although, to be frank, I was not around professionally during Vim’s peak popularity.

If you have ever wondered whether open source software such as Neovim and the rest of the tools around it can beat fully fledged, out-of-the-box, AI-powered IDEs, I can assure you that it can.

What about your setup?

typescript and javascript logogreg@aboutjs.dev

©Grzegorz Dubiel | 2026