Sn0w uses YAML (YAML Ain’t Markup Language) for all configuration files. YAML is a human-readable data serialization format that uses indentation to represent structure.
File Locations
Config Directory
<Minecraft Directory>/Sn0w/
File Types
| Directory | Purpose | When Created |
|---|
Sn0w/features/ | Auto-saved individual modules | On first launch |
Sn0w/configs/ | User-saved config presets | On first .config save |
YAML Configuration
Parser Settings
Sn0w uses SnakeYAML with the following settings:
DumperOptions options = new DumperOptions();
options.setIndent(4); // 4-space indentation
options.setPrettyFlow(true); // Pretty printing enabled
options.setDefaultFlowStyle(BLOCK); // Block style (not inline)
Basic Structure
ModuleName:
settingName: value
nestedSetting:
key: value
- 4-space indentation (not tabs)
- Colon separator between keys and values
- Case-sensitive keys
- No quotes needed for most strings
Each module in a config file follows this structure:
ModuleName:
enabled: boolean
bind: integer or MOUSE_X
chatNotify: boolean
visible: boolean
name: "Display Name"
# Module-specific settings below
setting1: value
setting2: value
Base Module Settings
Every module includes these standard fields:
ExampleModule:
enabled: false # Module on/off state
bind: -1 # Keybind (-1 = unbound)
chatNotify: true # Show toggle notifications
visible: true # Show in module list
name: ExampleModule # Display name
Value Types
Boolean Values
enabled: true
disable: false
visible: true
Numeric Values
Integers
bind: 78
delay: 100
range: 5
Floating Point
speed: 0.5
maxDamage: 7.125
minDamage: 4.875
factor: 1.9
String Values
name: AutoCrystal
mode: Strict
text: "Text with spaces"
Strings with spaces, special characters, or colons should be quoted.
Keybind Values
Keyboard Key
bind: 78 # N key (GLFW code)
bind: MOUSE_4 # Side button
Unbound
Color Values
Colors are stored as nested RGBA objects:
colorName:
red: 255 # 0-255
green: 67 # 0-255
blue: 127 # 0-255
alpha: 255 # 0-255 (transparency)
sync: true # Sync with HudColors module
Color Examples
fillColor:
red: 255
green: 67
blue: 127
alpha: 38
sync: true
outlineColor:
red: 255
green: 0
blue: 0
alpha: 255
sync: false
Enum/Mode Values
mode: Strict # String matching enum value
timing: Soft
rotationsType: NCP
autoSwitch: Normal
Example Configuration
From basicconfig.yml:
AutoTrap:
rotate: true
visible: true
chatNotify: true
blocks: 1.0
eChest: false
range: 5.0
targetRange: 5.0
enabled: false
mode: City
delay: 52.083333333333336
bind: 78
disable: false
name: AutoTrap
strict: false
Scaffold:
rotate: true
chatNotify: true
thickness: 1.1
downwards: true
line:
red: 255
green: 67
blue: 127
alpha: 255
sync: true
ExpandMode: 'Off'
barColor: Custom
enabled: false
mode: Silent
bind: 82
blockCounter: Bar
visualize: true
limit: true
rightColor:
red: 0
green: 255
blue: 0
alpha: 255
sync: false
leftColor:
red: 255
green: 0
blue: 255
alpha: 255
sync: false
event: Post
safeWalk: None
render: true
placeDelay: 63.0
towerMode: Normal
visible: true
fadeTime: 200
fill:
red: 255
green: 67
blue: 127
alpha: 25
sync: true
swing: true
barText: false
name: Scaffold
grim: false
Serialization Process
Save Process
When saving, the Feature.save() method is called:
@Override
public Map<String, Object> save() {
Map<String, Object> toSave = new HashMap<>();
toSave.put("enabled", enabled);
for (Value<?> value : getValues()) {
if (value.getValue() instanceof Sn0wColor) {
// Serialize color as nested map
Value<Sn0wColor> val = (Value<Sn0wColor>) value;
Map<String, Object> color = new HashMap<>();
color.put("red", val.getValue().getColor().getRed());
color.put("green", val.getValue().getColor().getGreen());
color.put("blue", val.getValue().getColor().getBlue());
color.put("alpha", val.getValue().getColor().getAlpha());
color.put("sync", val.getValue().isSyncing());
toSave.put(value.getTag(), color);
} else {
// Serialize primitive/string value
toSave.put(value.getTag(), value.getValue());
}
}
return toSave;
}
Load Process
When loading, the Feature.load() method is called:
@Override
public void load(Map<String, Object> objects) {
if (objects == null) return;
Object e = objects.get("enabled");
if (e != null) {
setEnabled((boolean) e);
}
for (Value value : getValues()) {
Object o = objects.get(value.getTag());
if (o != null) {
try {
if (value.getValue() instanceof Sn0wColor) {
// Deserialize color from nested map
Map<String, Object> map = (Map<String, Object>) o;
Sn0wColor sn0wColor = new Sn0wColor(
new Color(
(int) map.get("red"),
(int) map.get("green"),
(int) map.get("blue"),
(int) map.get("alpha")
),
(boolean) map.get("sync")
);
value.setValue(sn0wColor);
} else {
// Load primitive/string value
value.setValue(o);
}
} catch (Exception ignored) {}
}
}
}
File Operations
Creating a Config File
public void saveModuleConfig(String name) throws IOException {
File dir = new File(MAIN_FOLDER.getAbsolutePath() + File.separator + "configs");
if (!dir.exists()) dir.mkdirs();
File file = new File(dir, name + ".yml");
if (!file.exists()) file.createNewFile();
Map<String, Object> yamlData = new HashMap<>();
for (Feature feature : FeatureManager.INSTANCE.getFeatures()) {
Map<String, Object> featureMap = new HashMap<>();
featureMap.putAll(feature.save());
yamlData.put(feature.getName(), featureMap);
}
yaml.dump(yamlData, new FileWriter(file));
}
Loading a Config File
public void loadModuleConfig(String name) throws Exception {
File file = new File(MAIN_FOLDER + "/configs/" + name + ".yml");
if (!file.exists())
throw new Exception("Could not find config " + name + ".yml!");
InputStream inputStream = new FileInputStream(file);
Map<String, Object> map = yaml.load(inputStream);
for (Feature feature : FeatureManager.INSTANCE.getFeatures()) {
try {
Map<String, Object> featureMap =
(Map<String, Object>) map.get(feature.getName());
feature.loadModule(featureMap);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Soft Loading
Soft loading excludes certain categories and settings:
public void softLoadConfig(String name) throws Exception {
// ... file loading code ...
for (Feature feature : FeatureManager.INSTANCE.getFeatures()) {
// Skip Render and HUD modules
if (feature.getCategory().equals(Feature.Category.Render)
|| feature.getCategory().equals(Feature.Category.Hud))
continue;
// Skip Client modules except AntiCheat
if (feature.getCategory().equals(Feature.Category.Client)
&& feature != AntiCheat.INSTANCE)
continue;
// Load with softLoadModule (excludes binds and colors)
feature.softLoadModule(featureMap);
}
}
Soft Load Module
public void softLoadModule(Map<String, Object> objects) {
setEnabledA(objects.get("enabled") != null
? (boolean) objects.get("enabled")
: isEnabled());
for (Value value : getValues()) {
Object o = objects.get(value.getTag());
// Skip binds
if (Objects.equals(value.getTag(), "bind")) continue;
if (o != null) {
try {
// Skip colors
if (!(value.getValue() instanceof Sn0wColor)) {
value.setValue(o);
}
} catch (Exception ignored) {}
}
}
}
Manual Editing
Editing Config Files
- Close Minecraft (important!)
- Navigate to
Minecraft/Sn0w/configs/
- Open
.yml file in text editor
- Make changes following YAML syntax
- Save file
- Launch Minecraft
- Run
.config load <name>
Common Edits
Change Keybind
# Before
bind: 78
# After (keyboard)
bind: 82
# After (mouse)
bind: MOUSE_4
Enable/Disable Module
# Before
enabled: false
# After
enabled: true
Adjust Settings
# Before
range: 5.0
delay: 100
# After
range: 6.5
delay: 50
Change Colors
# Before
fillColor:
red: 255
green: 67
blue: 127
alpha: 38
sync: true
# After (red to blue)
fillColor:
red: 67
green: 127
blue: 255
alpha: 38
sync: true
YAML Syntax Rules
Indentation
- Use 4 spaces (not tabs)
- Consistent indentation required
- Nested values must be indented
Incorrect indentation will cause parsing errors. Always use spaces, never tabs.
Quoting
- Most strings don’t need quotes
- Use quotes for:
- Strings with spaces
- Strings with colons
- Strings starting with special characters
name: MyModule # OK
name: "My Module" # OK (has space)
mode: Fast # OK
text: "Value: 100" # Required (has colon)
# This is a comment
enabled: true # Inline comment
Lists (Rare in Sn0w)
listName:
- item1
- item2
- item3
Troubleshooting
Parsing Errors
Error: “Failed to load config”
Common causes:
- Mixed tabs and spaces
- Incorrect indentation
- Missing colons
- Unquoted strings with special characters
Solution: Validate YAML syntax using an online YAML validator
Value Type Mismatch
Error: Config loads but settings are wrong
Causes:
- String where number expected:
delay: "100" → delay: 100
- Number where boolean expected:
enabled: 1 → enabled: true
Missing Settings
If a setting is missing from the config:
- The module will use its default value
- No error is thrown
- Setting will be added on next save
Corrupted Config
If a config becomes corrupted:
# Delete the problematic config
.config delete broken_config
# Create a fresh config
.config save new_config
Best Practices
Before Editing
- Backup: Copy config before editing
- Close client: Always edit with Minecraft closed
- Text editor: Use a proper text editor (not Notepad on Windows)
While Editing
- Indentation: Use 4 spaces consistently
- Case sensitive: Match exact key names
- Type matching: Keep value types correct (number vs string vs boolean)
After Editing
- Validate: Check YAML syntax before loading
- Test: Load in a test environment if possible
- Save backup: Keep working config backed up
See Also