CodeCanvas
The ultimate platform for managing cloud development environments
Configuration Drift: The Pitfall of Local Machines
You’ve seen it before. Someone says, “It works on my machine,” and suddenly you’re deep in a rabbit hole trying to understand why a project that works perfectly on one machine fails to build or test on another.
That’s configuration drift – when a developer’s actual environment starts to deviate from the project’s intended configuration. It’s subtle, builds up over time, and can create serious issues.
Why it happens
Rarely intentional, configuration drift occurs when your development environment, including its associated packages, versions, system tools, and environment variables, slowly strays from the standard setup everyone is supposed to use.
Some collaborators update their version of Node.js or Python, others don’t. Someone installs a CLI tool globally. Someone else tweaks a config file and forgets to share it. Files like .env.local or ignored setup scripts go out of sync. None of this is malicious – it’s just difficult to keep track of every little change you make to your setup over time. However, when it happens across a team, the differences pile up fast.
Why configuration drift is a real problem
On small projects, config drift is annoying. On larger ones, it can quickly cause major headaches. Some of the main issues that configuration drift can lead to include:
Configuration discrepancies
This is where the classic “But it works on my machine” comment typically arises. You get a bug report from a teammate, but you can’t reproduce it because your environment isn’t quite the same as theirs. Now the team is stuck hunting for invisible differences in local setups.
Inconsistent test results
One dev runs the test suite, and everything passes. Another runs it, and half the tests fail. It turns out they had slightly different dependency versions or a missing env var. Nobody wins.
Broken CI/CD pipelines
The code works fine locally but breaks during deployment. CI environments generally enforce stricter and more consistent configurations than local machines. If you forget to commit a config or miss a setup step, the CI server will quickly expose the issue.
Wasted time debugging the setup
Much of the onboarding process for new developers involves tracking down weird setup issues. Every little obstacle – whether a misconfigured shell, a missing Python version, or a random global package – chips away at productivity.
No matter the symptom, the result is the same: hours lost on non-coding work, slower teams, frustrated devs, and harder-to-maintain projects. And none of this work involves the actual product. It’s about addressing environment-related issues.
So, how do people usually deal with it?
Most teams try to keep developer environments consistent. Some methods help a lot, while others just mask the problem. Let’s look at the most common approaches and where they fall short.
Pinning tool versions and environment variables
This is where most projects start. You pin your Node.js or Python version using tools like nvm, pyenv
, or asdf
. You commit a .tool-versions
or .nvmrc
file so that everyone runs the same runtime.
Next comes the .env
file. You insert your API URLs, tokens, and maybe a couple of feature flags and call it a day.
This works until someone forgets to source the .env
file, uses a newer tool version locally, or runs into a weird bug because their shell config or OS version is slightly different.
The bottom line is this tactic sets expectations but doesn’t enforce anything.
Automating setup with scripts
Whatever your team uses, whether Makefiles, Bash scripts, just
, or Ansible, the idea is the same: one command sets up your whole development environment.
As this approach gives you reproducible setup instructions and helps new teammates onboard faster, it’s more effective. But it’s not a silver bullet. These scripts aren’t idempotent. They assume a clean state. If a developer tweaks something manually later, the script won’t fix it. And it can’t stop configuration drift once it starts.
Using dev containers or declarative environments
Dockerfiles and devcontainer.json
definitions let you standardize development at the system level. Add Nix, Guix, or Devbox to the mix, and now you can describe everything (dependencies, system packages, and tooling) in a single config file.
As this approach allows you to rebuild the same environment every time, it’s a big step forward with no surprises.
However, working inside Docker can feel clunky. Performance isn’t always great, debugging can be painful, and advanced tools like Nix, while powerful, are notoriously hard to learn. One wrong expression and you’re staring at a wall of cryptic errors.
So yes, these approaches reduce drift, but they also add friction. And you’re still ultimately running things on different machines with different host systems, hardware, and edge cases.
A better solution: Cloud dev environments
Imagine if your dev environment didn’t live on your laptop, but it felt like it did. With today’s cloud development environments (CDEs), your workspace runs remotely, but the UI is streamed using optimized protocols designed specifically for coding and development tasks – no clunky VDI. The result? A native-like IDE experience that’s fast, responsive, and consistent, no matter where you are – no hidden state or outdated dependencies! It’s like getting a fresh, clean laptop every time you open your IDE.
But running CDEs at scale requires a way to define, manage, and connect those environments to the tools your team already uses. That’s where orchestration solutions like GitHub Codespaces, Gitpod, and Coder come in, providing a control layer over CDEs.
At JetBrains, we’ve built our own CDE orchestrator: CodeCanvas. It gives you everything you’d expect from a CDE orchestration platform, including centralized templates, setup scripts, and security policies, but with one huge advantage – first-class support for JetBrains IDEs. And if you’re more into VS Code or Cursor, CodeCanvas supports those tools, too.
JetBrains CodeCanvas
If you’re ready to give CDEs a try, install CodeCanvas in your AWS account. It takes only a few steps:
- Launch the installation (an AWS account is required)
- Follow the installation instructions
Planning a more complex setup or looking to discuss how CodeCanvas can work in your infrastructure? Contact us – we’ll be happy to help!
Want to learn more about the benefits of CDEs and whether your company should consider adopting them? Here are some of our recent blog posts:
- Solving Remote Development Challenges With CodeCanvas
- Should Your Company Adopt Remote Development?
- From VDI to CDEs
- 10 Remote Development Best Practices