A portable, containerized terminal-first development environment built on Rhel Family.
Start coding immediately without configuring a new machine.
| Tool | Description | Install |
|---|---|---|
| just | Command runner | brew install just / cargo install just / scoop install just |
| podman (or docker) | Container runtime | Install podman |
cd /path/to/your-projects-workspace
# Download sample files
curl -fsSL https://raw.githubusercontent.com/thomaschampagne/nvil/main/.nvil.yaml -o .nvil.yaml
curl -fsSL https://raw.githubusercontent.com/thomaschampagne/nvil/main/justfile -o justfile
curl -fsSL https://raw.githubusercontent.com/thomaschampagne/nvil/main/.env.sample -o .env
# Edit .env with your info and preferences
vi .env
# Launch
just connectYou're in a fully configured dev environment. See Usage for details.
- Terminal-first workspace - ZSH, Zellij multiplexer, Helix/Neovim, Yazi file manager, and keyboard-driven tools out of the box
- Pre-built images - No waiting for container builds; pull
ghcr.io/thomaschampagne/nvil-coreornvil-fulland go - Cross-project workspace - Mount your entire projects directory, not just one repo at a time
- Extensible via "feats" - Add languages, runtimes, and tools via
dnf, mise, or Homebrew - Editor agnostic - Works with any modal editor; connect your IDE via SSH to the container
- 95+ pre-configured tools - Git, ripgrep, fzf, kubectl, trivy, lazygit, btop, and more
| Dev Containers | NVIL | |
|---|---|---|
| Scope | Per-project (.devcontainer.json) |
Per-project and cross-project, and personal environment |
| Editor | VS Code / JetBrains only | Any modal editor, or connect your IDE via SSH |
| Base image | Built from scratch each time | Pre-built, layered on Fedora |
| Workflow | Attach to container per project | Access all projects from your mounted workspace |
┌─────────────────────────────────────────────────┐
│ Your Host │
│ ┌─────────────┐ ┌──────────────────────┐ │
│ │ Projects │ │ .nvil.yaml + │ │
│ │ Directory │ --> │ .nvil.env │ │
│ └─────────────┘ └──────────────────────┘ │
│ ▲ │ │
│ | ▼ │
│ ┌──────────────────────────────────────────┐ │
│ │ Container (Docker / Podman) │ │
│ │ ┌────────────────────────────────────┐ │ │
│ │ │ Fedora Base (nvil-core) │ │ │
│ │ │ ZSH · Zellij · Git · Core Tools │ │ │
│ │ └────────────────────────────────────┘ │ │
│ │ ┌────────────────────────────────────┐ │ │
│ │ │ Flavor Layer (nvil-full) │ │ │
│ │ │ Go · Node · Bun · k9s · Trivy ... │ │ │
│ │ └────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
| Component | Description |
|---|---|
core/ |
Base Fedora image with shell, git, editors |
feats/ |
Installable tool modules (languages, runtimes, tools, ...) |
flavors/ |
Dockerfiles that layer feats onto core |
nvil.img.make.sh |
Build script for custom images |
Copy and edit the sample:
cp .env.sample .env| Variable | Default | Description |
|---|---|---|
NVIL_CONTAINER_NAME |
nvil |
Container name and hostname |
NVIL_IMAGE |
ghcr.io/thomaschampagne/nvil-full:latest |
Image to use |
NVIL_WORKSPACE_HOST_PATH |
. |
Host path mounted as /home/${NVIL_USER}/workspace |
NVIL_GIT_USER_NAME |
Smith Black |
Git user name |
NVIL_GIT_USER_EMAIL |
smith.black@dev.local |
Git user email |
NVIL_DEFAULT_EDITOR |
hx |
Default editor (hx, nvim, etc.) |
TZ |
Europe/Paris |
Timezone |
Create .nvil.yaml in your workspace directory (e.g., /home/user/Projects/.nvil.yaml):
# Start and connect (auto-starts podman machine if needed)
just connect
# Stop (preserves container state)
just stop
# Destroy container
just deleteUse flavors/full.Dockerfile as a blueprint. Pick the feats you want, then build:
sh nvil.img.make.sh \
--docker-file=./flavors/my-flavor.Dockerfile \
--image=nvil-my-flavor:latest \
--gh-token=$GITHUB_TOKENAdd feats by copying install scripts into feats/<category>/<name>/ and referencing them in your Dockerfile:
COPY --parents --chown=${NVIL_USER}:${NVIL_USER} ./feats/tools/my-tool /nvil/.tmp/Run sh nvil.img.make.sh --help for all options.
NVIL ships with many tools across core and pickable categories. View the full list inside a running container:
nvil --list| Scope | Category | Name | Version | Description | Licence | Manager |
|---|---|---|---|---|---|---|
| core | development | gcc | 16.1.1 | GNU compiler collection | GPL-3.0 | dnf |
| core | development | git | 2.55.0 | Distributed version control system | GPL-2.0 | dnf |
| core | development | helix | 25.07.1 | Post-modern modal text editor | MPL-2.0 | mise |
| core | development | lazygit | 0.62.2 | Simple terminal UI for git commands | MIT | mise |
| core | development | nano | 8.7.1 | Text editor. An enhanced pico clone | GPL-3.0 | dnf |
| core | development | neovim | 0.12.3 | Ambitious Vim-fork focused on extensibility and agility | Apache-2.0 | mise |
| core | development | vim-enhanced | 9.2.725 | Vi IMproved, a programmer's text editor with enhanced features | VIM | dnf |
| core | filesystem | yazi | 26.5.6 | Blazing fast terminal file manager written in Rust | MIT | mise |
| core | font | jetbrains-mono-fonts | 2.304 | Monospaced font designed for developers by JetBrains | OFL-1.1 | dnf |
| core | formatter | dprint | 0.55.1 | Pluggable and configurable code formatting platform written in Rust | MIT | mise |
| core | formatter | shfmt | 3.13.1 | Shell parser, formatter, and interpreter | BSD-3-Clause | mise |
| core | formatter | taplo | 0.10.0 | TOML toolkit written in Rust | MIT | mise |
| core | language-server | bash-language-server | 5.6.0 | Bash language server using tree-sitter for parsing | MIT | npm |
| core | language-server | emmet-ls | 0.4.2 | Emmet support for LSP-compatible editors | MIT | npm |
| core | language-server | marksman | 2026-02-08 | Language Server Protocol for Markdown | MIT | mise |
| core | language-server | vscode-langservers-extracted | 4.10.0 | Extracted language servers from VSCode for HTML, CSS, and JSON | MIT | npm |
| core | language-server | vscode-xml | 0.29.3 | XML language server from VSCode | EPL-2.0 | mise |
| core | language-server | yaml-language-server | 1.23.0 | YAML language server with validation and completion | MIT | npm |
| core | monitoring | btop | 1.4.7 | Resource monitor that shows CPU, memory, disks, network, and processes | Apache-2.0 | dnf |
| core | monitoring | fastfetch | 2.63.1 | Display information about your operating system, software, and hardware | MIT | dnf |
| core | monitoring | strace | 7.1 | Trace system calls and signals | LGPL-2.1 | dnf |
| core | network | netcat | 1.238 | Utility for managing network connections | GPL-2.0 | dnf |
| core | network | tcpdump | 4.99.6 | Dump traffic on a network | BSD-3-Clause | dnf |
| core | network | traceroute | 2.1.6 | Trace the route IP packets take to a host | GPL-2.0 | dnf |
| core | network | wget2-wget | 2.2.1 | Non-interactive network downloader (wget2 variant) | GPL-3.0 | dnf |
| core | package-manager | npm | 11.18.0 | JavaScript and Node.js package manager | Artistic-2.0 | npm |
| core | runtimes | node | 24.18.0 | Open-source, cross-platform JavaScript runtime environment | MIT | mise |
| core | security | nmap | 7.92 | Network exploration tool and security/port scanner | Nmap | dnf |
| core | security | openssl | 3.5.7 | OpenSSL cryptographic toolkit | Apache-2.0 | dnf |
| core | shell | zellij | 0.44.3 | Pluggable terminal workspace, with terminal multiplexer as the base feature | MIT | mise |
| core | shell | zsh | 5.9 | Z SHell, a Bash-compatible command-line interpreter | MIT | dnf |
| core | system | dos2unix | 7.5.5 | Convert text between DOS, UNIX, and Mac formats | BSD-2-Clause | dnf |
| core | system | gzip | 1.14 | GNU compression utility | GPL-3.0 | dnf |
| core | system | jq | 1.8.1 | Lightweight and flexible command-line JSON processor | MIT | dnf |
| core | system | rsync | 3.4.1 | Fast incremental file transfer utility | GPL-3.0 | dnf |
| core | system | tree | 2.2.1 | Display directories as trees | GPL-2.0 | dnf |
| core | system | unzip | 6.0 | Extract, test, and list ZIP files | Info-ZIP | dnf |
| core | system | wl-clipboard | 2.2.1^git20251124.e808203 | Command-line copy/paste utilities for Wayland | GPL-3.0 | dnf |
| core | system | xclip | 0.13 | Command line interface to X selections (clipboard) | GPL-2.0 | dnf |
| core | system | xsel | 1.2.1 | Access X clipboard from the command line | GPL-2.0 | dnf |
| core | system | yq | 4.47.1 | Lightweight and portable command-line YAML processor | MIT | dnf |
| pick | ai | opencode | 1.17.12 | AI coding assistant for the terminal | MIT | mise |
| pick | backups | restic | 0.19.0 | Fast, secure, efficient backup program | BSD-2-Clause | mise |
| pick | development | delta | 0.19.2 | A syntax-highlighting pager for git, diff, grep, and blame output | MIT | mise |
| pick | development | hyperfine | 1.20.0 | A command-line benchmarking tool | Apache-2.0 | mise |
| pick | development | just | 1.55.1 | Just a command runner | CC0-1.0 | mise |
| pick | development | miniserve | 0.35.0 | For when you really just want to serve some files over HTTP right now | MIT | mise |
| pick | development | serpl | 0.3.6 | A simple terminal UI for search and replace, ala VS Code | MIT | mise |
| pick | development | tokei | 14.0.0 | A program that displays statistics about your code | Apache-2.0 | brew |
| pick | development | tuicr | 0.18.0 | Terminal UI for code review with vim keybindings and GitHub PR integration | MIT | mise |
| pick | devops | helm | 4.2.2 | The package manager for Kubernetes | Apache-2.0 | mise |
| pick | devops | k9s | 0.51.0 | Kubernetes CLI to manage your clusters | Apache-2.0 | mise |
| pick | devops | kubectl | 1.36.2 | Kubernetes command-line tool | Apache-2.0 | mise |
| pick | filesystem | 7zip | 26.02 | File archiver with a high compression ratio | LGPL-2.1 | mise |
| pick | filesystem | bat | 0.26.1 | A cat clone with syntax highlighting and Git integration | Apache-2.0 | mise |
| pick | filesystem | dua | 2.37.1 | A tool to conveniently learn about the disk usage of directories, fast | MIT | mise |
| pick | filesystem | duf | 0.9.1 | Disk Usage/Free Utility - a better df alternative | MIT | mise |
| pick | filesystem | eza | 0.23.4 | A modern replacement for ls | EUPL-1.2 | mise |
| pick | filesystem | jdupes | 1.31.1 | A powerful duplicate file finder and an enhanced fork of fdupes | MIT | brew |
| pick | filesystem | rip2 | 0.9.6 | A safer, ergonomic alternative to rm | GPL-3.0 | mise |
| pick | filesystem | tre | 0.4.0 | A modern alternative to the tree command | MIT | mise |
| pick | formatter | prettier | 3.9.4 | Opinionated code formatter for JavaScript, CSS, JSON, GraphQL, Markdown, YAML | MIT | npm |
| pick | language | go | 1.26.4 | Open source programming language to build simple/reliable/efficient software | BSD-3-Clause | mise |
| pick | language | typescript | 6.0.3 | Typed superset of JavaScript that compiles to plain JavaScript | Apache-2.0 | npm |
| pick | language-server | dockerfile-language-server-nodejs | 0.15.0 | Dockerfile language server for syntax highlighting and validation | MIT | npm |
| pick | language-server | typescript-language-server | 5.3.0 | TypeScript/JavaScript language server using tsserver | MIT | npm |
| pick | monitoring | bandwhich | 0.23.1 | Terminal bandwidth utilization tool | MIT | mise |
| pick | monitoring | procs | 0.14.12 | A modern replacement for ps written in Rust | MIT | mise |
| pick | network | doggo | 1.2.0 | Modern DNS client for humans | GPL-3.0 | mise |
| pick | network | gping | gping-v1.20.4 | Ping, but with a graph | MIT | mise |
| pick | network | xh | 0.26.1 | Friendly and fast tool for sending HTTP requests | MIT | mise |
| pick | productivity | tlrc | 1.13.1 | Official tldr client written in Rust | MIT | mise |
| pick | productivity | xan | 0.59.0 | Terminal multiplexer with batteries included | Unlicense | mise |
| pick | runtimes | bun | 1.3.14 | Fast all-in-one JavaScript runtime and toolkit | MIT | mise |
| pick | search | fd | 10.4.2 | A simple, fast and user-friendly alternative to find | Apache-2.0 | mise |
| pick | search | fzf | 0.73.1 | A command-line fuzzy finder | MIT | mise |
| pick | search | navi | 2.24.0 | An interactive cheatsheet tool for the command-line | Apache-2.0 | mise |
| pick | search | ripgrep | 15.1.0 | Recursively searches directories for a regex pattern while respecting your gitignore | Unlicense | mise |
| pick | search | sd | 1.1.0 | Intuitive find and replace CLI (sed alternative) | MIT | mise |
| pick | security | age | 1.3.1 | Simple, modern, and secure encryption tool | BSD-3-Clause | mise |
| pick | security | grype | 0.115.0 | Vulnerability scanner for container images and filesystems | Apache-2.0 | mise |
| pick | security | sops | 3.13.2 | Simple and flexible tool for managing secrets | MPL-2.0 | mise |
| pick | security | syft | 1.46.0 | Generate Software Bill of Materials (SBOM) from container images and filesystems | Apache-2.0 | mise |
| pick | security | trivy | 0.72.0 | Find and fix container misconfigurations, IaC issues, and vulnerabilities | Apache-2.0 | mise |
| pick | security | trufflehog | 3.95.7 | Find and verify credentials in your codebase | AGPL-3.0 | mise |
| pick | shell | agg | 1.9.0 | Asciicast to GIF converter | GPL-3.0 | mise |
| pick | shell | asciinema | 3.2.1 | Terminal session recorder, streamer and player | GPL-3.0 | mise |
| pick | shell | chezmoi | 2.70.5 | Manage your dotfiles across multiple diverse machines, securely | MIT | mise |
| pick | shell | glow | 2.1.2 | Render markdown on the CLI, with pizzazz | MIT | mise |
| pick | shell | grex | 1.4.6 | A command-line tool for generating regular expressions from test cases | Apache-2.0 | mise |
| pick | shell | lnav | 0.14.0 | Log file navigator with format detection and color-coded output | BSD-2-Clause | mise |
| pick | shell | oh-my-posh | 29.19.1 | The most customisable and low-latency cross platform/shell prompt renderer | MIT | mise |
| pick | shell | watchexec | 2.5.1 | Execute commands when files change | Apache-2.0 | mise |
| pick | shell | zoxide | 0.9.9 | A smarter cd command. Supports all major shells | MIT | mise |
| pick | system | hexyl | 0.17.0 | A command-line hex viewer | Apache-2.0 | mise |
| productivity | productivity | pomo | 1.2.1 | Terminal Pomodoro timer with TUI, ASCII art, notifications, statistics | MIT | mise |
Total: 98 packages
├── core/ # Base image: bootstrap, entrypoint, core tools
├── feats/ # Installable feature modules
│ ├── tools/ # CLI utilities
│ ├── languages/ # Language support (LSP, formatters)
│ ├── runtimes/ # Runtimes (Node, Bun, etc.)
│ └── frameworks/ # Framework-specific tooling
├── flavors/ # Dockerfiles that compose core + feats
├── .github/workflows/ # CI for building and publishing images
├── justfile # Task runner for lifecycle commands
├── nvil.img.make.sh # Image build script
├── .env.sample # Environment template
├── .nvil.yaml # Compose template (create in your workspace)
└── .dev/ # Local dev compose files
Contributions are welcome. To add a new tool:
- Create an install script under
feats/<category>/<tool-name>/ - Add a
metadata.jsonwith tool info - Reference it in a flavor Dockerfile
- Test by building the image
See BACKLOG.md for planned work.
MIT. See LICENSE for details.