Most developers use settings in VS Code daily, but very few actually understand how they work internally. In this blog, we will go beyond just toggling options in the UI and explore how the settings system is designed, where they are stored, how they are loaded, and what becomes the source of truth when multiple configurations exist.
1. User Settings vs Workspace Settings
VS Code provides two primary levels of configuration:
User Settings
These apply globally to your editor. Any project you open will use these settings unless overridden.
Examples:
Theme
Font size
Default formatter
Tab spacing
These are ideal for personal preferences.
Workspace Settings
These apply only to a specific project (workspace). They override user settings.
Examples:
Different formatter for a project
Project-specific linting rules
Language-specific overrides
Workspace settings help maintain consistency across teams, because they can be committed to version control.
2. Is There Any Global Setting Beyond User Settings?
This is a common confusion.
There is no separate “global” setting layer beyond User settings. User settings are the global settings.
However, internally VS Code also has:
Default settings (built into the editor)
User settings
Workspace settings
Folder-level settings (in multi-root workspaces)
So, the full hierarchy is deeper than what most developers realize.
3. Where Are These Settings Stored?
All settings are stored in JSON format.
Windows
User settings:
C:\Users\<username>\AppData\Roaming\Code\User\settings.jsonWorkspace settings:
<project>/.vscode/settings.jsonmacOS
User settings:
~/Library/Application Support/Code/User/settings.jsonWorkspace settings:
<project>/.vscode/settings.jsonThese files are simple JSON and can be edited directly.
4. Where Does VS Code Look for Settings?
When VS Code starts, it loads settings in this order:
Default settings (built-in)
User settings
Workspace settings
Folder settings (if multi-root)
Each level overrides the previous one.
This means:
The editor builds a merged configuration
Higher priority layers override lower ones
This merged result is what you see as the effective setting.
5. Effective Settings and Override Behavior
Let’s say:
User settings:
{
"editor.fontSize": 14
}Workspace settings:
{
"editor.fontSize": 16
}The effective value becomes 16 for that project.
But when you open another project, it returns to 14.
So:
Workspace overrides User
User overrides Default
This makes VS Code both flexible and predictable.
6. Is There a Single Source of Truth?
Not exactly.
There is no single file that acts as the ultimate source.
Instead:
The effective configuration (merged result) becomes the runtime source of truth.
Internally, VS Code maintains a computed configuration model.
This design allows:
Extensions to contribute new settings
Dynamic updates without restarting
Language-specific overrides
So, the source of truth is the merged configuration in memory, not a single JSON file.
7. Do JSON Files Contain All Possible Settings?
No.
The JSON files only store customized values.
They do not contain:
Default values
Extension defaults
Language defaults
These come from:
VS Code core
Installed extensions
Built-in language support
This is why your settings file stays small even though the editor supports thousands of options.
8. What Happens When a New Version Introduces New Settings?
This is where the design becomes powerful.
When a new release adds a setting:
It gets a default value internally.
Your JSON file remains unchanged.
Only when you modify it does it appear in your settings.json.
So:
No breaking changes
No need to update your file
Backward compatibility is maintained
This is similar to how modern configuration systems work in distributed systems.
9. Why This Design Matters
This layered configuration model provides:
Flexibility for individual developers
Consistency for teams
Stability across versions
Extensibility for the ecosystem
It also makes VS Code highly scalable as a platform.
Conclusion
Understanding how settings work in VS Code helps you:
Debug configuration issues faster
Set up projects correctly
Collaborate better with teams
Use extensions more effectively
Customize your workflow confidently
Most developers only scratch the surface of settings. But once you understand the internal layering and override model, the editor becomes much more predictable and powerful.
