How to Seamlessly Manage Programming Languages in Your Projects
In today’s fast-paced development world, managing multiple programming languages and tools across various projects can quickly become a headache. That’s where version managers that simplify the process of handling different versions of languages and dependencies. Whether you’re juggling Node.js, Ruby, Python, or any other language Version managers allow you to effortlessly switch between versions, ensuring your projects always run on the right setup.

Jordan Wu
4 min read·Posted

Table of Contents
Version Managers
A version manager is a tool that allows developers to manage and switch between different versions of programming languages, frameworks, and tools across multiple projects. It ensures that each project uses the appropriate version of a language or tool, preventing conflicts and compatibility issues. With a version manager, you can install, update, and manage specific versions globally or locally for each project, allowing for a consistent and controlled development environment.
asdf
asdf is a universal version manager that enables developers to manage multiple versions of programming languages and tools from a single interface. It supports a wide variety of languages and tools, including Node.js, Ruby, Python, Java, Go, and more, through plugins. With asdf, you can set global or project-specific versions, ensuring that each project uses the right tool version. It simplifies version management by allowing automatic switching based on the project's .tool-versions file, providing a consistent and hassle-free development environment across different languages. This makes asdf an essential tool for developers working with multiple technologies.
asdf
has been my go to tool when starting a new project. I always setup what version of programming languages I will be using, it's usually the latest stable version. Programming languages are continuously evolving, with frequent new versions being released. As a result, it's crucial to manage the versions you use and plan for incremental upgrades to enhance security and unlock other benefits of the newer versions.
mise
mise is a modern version manager designed to manage multiple versions of programming languages, tools, and dependencies across your projects. It simplifies the process of installing, updating, and switching between different versions of languages like Node.js, Python, Ruby, and more, all within a single interface. Similar to asdf
, mise
can be used as a drop-in replacement for asdf
while supporting environment variables and tasks.
Now mise
is my go to tool for managing all my programming languages for all my projects. I really like how it helps you manage your environment variables within mise.toml
file. It can handle secrets as well.
Both environment variables and secrets are used to store configuration values, but they have different purposes and security considerations.
- Environment Variables
- These are key-value pairs used to configure applications without hardcoding values into the codebase.
- Examples:
PORT=3000
(Defines which port the app runs on)NODE_ENV=production
(Specifies the environment: development, testing, or production)DATABASE_URL=postgres://user:pass@localhost:5432/mydb
(Database connection string)
- Key Traits:
- ✅ Typically safe for non-sensitive configurations
- ✅ Can be stored in
.env
files, cloud environment settings, or CI/CD pipelines - ✅ Helps make apps more portable across different environments
- Secrets
- Secrets are a subset of environment variables that contain sensitive information, such as API keys, passwords, and private tokens.
- Examples:
-
SECRET_KEY=supersecurekey123
-
AWS_ACCESS_KEY_ID=ACCESS_KEY...
-
DB_PASSWORD=mysecretpassword
-
- Key Traits:
- 🚨 Sensitive Information – Should never be exposed in logs, code, or version control
- 🚨 Stored Securely – Managed via secret management tools like:
- AWS Secrets Manager
- HashiCorp Vault
- Kubernetes Secrets
.env
files (with .gitignore to prevent committing them)
- 🚨 Restricted Access – Only authorized systems and users should have access
You can define tasks in mise.toml
files or as standalone shell scripts. These are useful for things like running linters, tests, builders, servers, and other tasks that are specific to a project. Now you will know where to find all the scripts and what is available when working in any project!
Once installed it's recommend to Activate mise. Once activated, mise
can automatically switch between different versions of tools based on the directory you're in. This means that if you have a project that requires Node.js 18 and another that requires Node.js 22, mise
will automatically switch between them as you move between the two projects. Check out what tools are available in the registry.
Lastly here's how to add zsh plugin for mise.
Summary
Selecting the right version manager is crucial for maintaining an efficient development workflow. In my projects, which often involve multiple programming languages, I rely on mise
as my preferred tool. It streamlines project management by handling language versions, environment variables, and tasks, ensuring a clean and organized setup. Version managers like mise
and asdf
are widely used in open-source communities and professional environments. Gaining a solid understanding of these tools is essential for a smooth development process and successful project execution.